@stacksjs/database 0.70.84 → 0.70.86

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.
Files changed (2) hide show
  1. package/dist/index.js +258 -366
  2. package/package.json +11 -10
package/dist/index.js CHANGED
@@ -1,34 +1,14 @@
1
1
  // @bun
2
- var f6=Object.defineProperty;var b6=(Z)=>Z;function p6(Z,Y){this[Z]=b6.bind(null,Y)}var C6=(Z,Y)=>{for(var $ in Y)f6(Z,$,{get:Y[$],enumerable:!0,configurable:!0,set:p6.bind(Y,$)})};var rZ=(Z,Y)=>()=>(Z&&(Y=Z(Z=0)),Y);var b=import.meta.require;function t(Z,Y){let $=Y??{};switch(Z){case"sqlite":return{database:$.DB_DATABASE_PATH||UZ.sqlitePath,prefix:""};case"mysql":return{database:$.DB_DATABASE||UZ.default,host:$.DB_HOST||"127.0.0.1",port:$.DB_PORT||iZ.mysql,username:$.DB_USERNAME||aZ.mysql,password:$.DB_PASSWORD||"",prefix:""};case"postgres":return{database:$.DB_DATABASE||UZ.default,host:$.DB_HOST||"127.0.0.1",port:$.DB_PORT||iZ.postgres,username:$.DB_USERNAME||aZ.postgres,password:$.DB_PASSWORD||"",prefix:""};default:return{database:":memory:"}}}var h0="127.0.0.1",iZ,UZ,aZ,v0,f0;var iY=rZ(()=>{iZ={mysql:3306,postgres:5432,sqlite:0},UZ={default:"stacks",sqlitePath:"database/stacks.sqlite",sqliteTestingPath:"database/stacks_testing.sqlite"},aZ={mysql:"root",postgres:"postgres",sqlite:""},v0={host:"localhost",port:6379},f0={region:"us-east-1"}});var u={};C6(u,{setConfig:()=>eZ,initializeDbConfig:()=>J4,ensureDatabaseConfigLoaded:()=>AZ,db:()=>A,applySqlitePragmas:()=>H7,acquireDbConfigLock:()=>Y7,SQLITE_BOOTSTRAP_PRAGMAS:()=>BZ});import{AsyncLocalStorage as o6}from"async_hooks";import{createQueryBuilder as t6,setConfig as eZ}from"@stacksjs/query-builder";import{env as TY}from"@stacksjs/env";import{applySqlitePragmas as H7,SQLITE_BOOTSTRAP_PRAGMAS as BZ}from"@stacksjs/query-builder";function Y7(){let Z=()=>{},Y=new Promise((J)=>{Z=J}),$=QZ.then(()=>Z);return QZ=QZ.then(()=>Y),$}function J4(Z){if(Z?.app?.env)Y4=Z.app.env;if(Z?.database?.default)Z4=Z.database.default;if(Z?.database)$4=Z.database;OZ(),_Y=null}function X4(){return Y4}function W4(){return Z4}function Z7(){return $4}function H4(){let Z=W4();if(Z==="sqlite")return"sqlite";if(Z==="mysql")return"mysql";if(Z==="singlestore")return"singlestore";if(Z==="postgres")return"postgres";return"sqlite"}function $7(){let Z=W4(),Y=Z7(),$=X4();if(Z==="sqlite"){let J=$!=="testing"?"database/stacks.sqlite":"database/stacks_testing.sqlite";return{database:Y.connections?.sqlite?.database??J}}if(Z==="mysql")return{database:Y.connections?.mysql?.name||"stacks",host:Y.connections?.mysql?.host??"127.0.0.1",username:Y.connections?.mysql?.username??"root",password:Y.connections?.mysql?.password??"",port:Y.connections?.mysql?.port??3306};if(Z==="singlestore")return{database:Y.connections?.singlestore?.name||"stacks",host:Y.connections?.singlestore?.host??"127.0.0.1",username:Y.connections?.singlestore?.username??"root",password:Y.connections?.singlestore?.password??"",port:Y.connections?.singlestore?.port??3306};if(Z==="postgres"){let J=Y.connections?.postgres?.name??"stacks";return{database:$==="testing"?`${J}_testing`:J,host:Y.connections?.postgres?.host??"127.0.0.1",username:Y.connections?.postgres?.username??"",password:Y.connections?.postgres?.password??"",port:Y.connections?.postgres?.port??5432}}return{database:":memory:"}}function OZ(){let Z=H4(),Y=$7();eZ({dialect:Z,database:Y,verbose:X4()!=="production",timestamps:{createdAt:"created_at",updatedAt:"updated_at",defaultOrderColumn:"created_at"},softDeletes:{enabled:!0,column:"deleted_at",defaultFilter:!0}})}function G4(){if(!_Z)_Z=(async()=>{try{let{config:Z,overridesReady:Y}=await import("@stacksjs/config");if(await Y,Z)J4(Z),_Y=null}catch{}})();return _Z}async function AZ(){await G4()}function J7(Z){if(oZ.getStore())return Z();let Y=tZ.then(()=>oZ.run(!0,Z));return tZ=Y.then(()=>{return},()=>{return}),Y}function X7(Z){let Y=Z.transaction.bind(Z);Z.transaction=(...$)=>J7(()=>Y(...$))}function W7(){if(!_Y){if(OZ(),_Y=t6(),H4()==="sqlite")X7(_Y)}return _Y}var e6,d,qY,Y4,Z4,$4,QZ,_Y=null,_Z=null,oZ,tZ,A;var F=rZ(()=>{iY();e6=t("sqlite",TY),d=t("mysql",TY),qY=t("postgres",TY),Y4=TY.APP_ENV||"local",Z4=TY.DB_CONNECTION||"sqlite",$4={connections:{sqlite:{database:e6.database,prefix:""},mysql:{name:d.database,host:d.host,username:d.username,password:d.password,port:d.port,prefix:""},singlestore:{name:d.database,host:d.host,username:d.username,password:d.password,port:d.port,prefix:""},postgres:{name:qY.database,host:qY.host,username:qY.username,password:qY.password,port:qY.port,prefix:""}}},QZ=Promise.resolve();OZ();oZ=new o6,tZ=Promise.resolve();G4();A=new Proxy({},{get(Z,Y){let $=W7(),J=$[Y];if(typeof J==="function")return J.bind($);return J}})});import{createQueryBuilder as c6,setConfig as u6}from"@stacksjs/query-builder";import{env as p}from"@stacksjs/env";class o{_queryBuilder=null;_options;_initialized=!1;constructor(Z){this._options={verbose:!1,timestamps:{createdAt:"created_at",updatedAt:"updated_at",defaultOrderColumn:"created_at"},softDeletes:{enabled:!1,column:"deleted_at",defaultFilter:!0},...Z}}get driver(){return this._options.driver}get connection(){return this._options.connection}get isInitialized(){return this._initialized}get query(){if(!this._queryBuilder)this.initialize();return this._queryBuilder}initialize(){if(this._initialized)return;u6({dialect:this._options.driver,database:this._options.connection,verbose:this._options.verbose,timestamps:this._options.timestamps,softDeletes:this._options.softDeletes,hooks:this._options.hooks}),this._queryBuilder=c6(),this._initialized=!0}switchDriver(Z,Y){this.close(),this._options.driver=Z,this._options.connection=Y,this._initialized=!1,this.initialize()}async close(){if(this._queryBuilder&&typeof this._queryBuilder.close==="function")await this._queryBuilder.close();this._queryBuilder=null,this._initialized=!1}static fromConfig(Z,Y){let $=Z.default,J;switch($){case"sqlite":{J={database:Y==="testing"?Z.connections.sqlite?.database?.replace(".sqlite","_testing.sqlite")||"database/stacks_testing.sqlite":Z.connections.sqlite?.database||"database/stacks.sqlite"};break}case"mysql":{let X=Z.connections.mysql;J={database:X?.name||"stacks",host:X?.host||"127.0.0.1",port:X?.port||3306,username:X?.username||"root",password:X?.password||""};break}case"singlestore":{let X=Z.connections.singlestore;J={database:X?.name||"stacks",host:X?.host||"127.0.0.1",port:X?.port||3306,username:X?.username||"root",password:X?.password||""};break}case"postgres":{let X=Z.connections.postgres,W=X?.name||"stacks";J={database:Y==="testing"?`${W}_testing`:W,host:X?.host||"127.0.0.1",port:X?.port||5432,username:X?.username||"",password:X?.password||""};break}case"dynamodb":throw Error("[database] DB_CONNECTION=dynamodb is not a SQL driver. Use the entity-style `dynamo.entity(...)` API for DynamoDB access, or set DB_CONNECTION to sqlite/mysql/postgres for SQL workloads.");default:throw Error(`[database] Unknown DB_CONNECTION "${String($)}". Allowed values: sqlite, mysql, postgres.`)}return new o({driver:$,connection:J,verbose:Y!=="production"})}static fromEnv(){let Z=p.DB_CONNECTION||"sqlite",Y;switch(Z){case"sqlite":Y={database:p.DB_DATABASE||"database/stacks.sqlite"};break;case"mysql":case"singlestore":Y={database:p.DB_DATABASE||"stacks",host:p.DB_HOST||"127.0.0.1",port:p.DB_PORT||3306,username:p.DB_USERNAME||"root",password:p.DB_PASSWORD||""};break;case"postgres":Y={database:p.DB_DATABASE||"stacks",host:p.DB_HOST||"127.0.0.1",port:p.DB_PORT||5432,username:p.DB_USERNAME||"",password:p.DB_PASSWORD||""};break;default:Y={database:":memory:"}}return new o({driver:Z,connection:Y,verbose:p.APP_ENV!=="prod"})}}function g6(Z){return new o(Z)}function d6(Z,Y){return new o({driver:"sqlite",connection:{database:Z},...Y})}function m6(Z,Y){return new o({driver:"postgres",connection:Z,...Y})}function s6(Z,Y){return new o({driver:"mysql",connection:Z,...Y})}import{env as S}from"@stacksjs/env";var nZ={sqlite:{database:"database/stacks.sqlite",prefix:""},mysql:{name:"stacks",host:"127.0.0.1",port:3306,username:"root",password:"",prefix:"",charset:"utf8mb4",collation:"utf8mb4_unicode_ci"},singlestore:{name:"stacks",host:"127.0.0.1",port:3306,username:"root",password:"",prefix:"",charset:"utf8mb4",ssl:!1},postgres:{name:"stacks",host:"127.0.0.1",port:5432,username:"postgres",password:"",prefix:"",schema:"public"},browser:{}};function l6(Z,Y){switch(Z){case"sqlite":{let $=Y;if($.database===":memory:")return":memory:";return`sqlite://${$.database}`}case"mysql":{let $=Y,{name:J,host:X="127.0.0.1",port:W=3306,username:H="root",password:G=""}=$;return`mysql://${H}:${G}@${X}:${W}/${J}`}case"singlestore":{let $=Y,{name:J,host:X="127.0.0.1",port:W=3306,username:H="root",password:G=""}=$;return`mysql://${H}:${G}@${X}:${W}/${J}`}case"postgres":{let $=Y,{name:J,host:X="127.0.0.1",port:W=5432,username:H="postgres",password:G=""}=$;return`postgres://${H}:${G}@${X}:${W}/${J}`}default:throw Error(`Unsupported driver: ${Z}`)}}function r6(Z,Y){let $=[];switch(Z){case"sqlite":{if(!Y.database)$.push("SQLite requires a database path");break}case"mysql":{if(!Y.name)$.push("MySQL requires a database name");break}case"singlestore":{if(!Y.name)$.push("SingleStore requires a database name");break}case"postgres":{if(!Y.name)$.push("PostgreSQL requires a database name");break}default:$.push(`Unsupported driver: ${Z}`)}return{valid:$.length===0,errors:$}}function n6(Z,Y){return{...nZ[Z],...Y}}function i6(Z){switch(Z){case"sqlite":return{database:S.DB_DATABASE||"database/stacks.sqlite",prefix:S.DB_PREFIX||""};case"mysql":return{name:S.DB_DATABASE||"stacks",host:S.DB_HOST||"127.0.0.1",port:S.DB_PORT??3306,username:S.DB_USERNAME||"root",password:S.DB_PASSWORD||"",prefix:S.DB_PREFIX||""};case"singlestore":return{name:S.DB_DATABASE||"stacks",host:S.DB_HOST||"127.0.0.1",port:S.DB_PORT??3306,username:S.DB_USERNAME||"root",password:S.DB_PASSWORD||"",prefix:S.DB_PREFIX||"",ssl:S.DB_SSL==="true"||S.DB_SSL==="1"};case"postgres":return{name:S.DB_DATABASE||"stacks",host:S.DB_HOST||"127.0.0.1",port:S.DB_PORT??5432,username:S.DB_USERNAME||"postgres",password:S.DB_PASSWORD||"",prefix:S.DB_PREFIX||"",schema:S.DB_SCHEMA||"public"};default:throw Error(`Unsupported driver: ${Z}`)}}function a6(){if(S.DB_CONNECTION)return S.DB_CONNECTION;if(S.DATABASE_URL?.startsWith("postgres"))return"postgres";if(S.DATABASE_URL?.startsWith("mysql"))return"mysql";return"sqlite"}F();function PY(Z,...Y){let $=[],J=[];for(let X=0;X<Z.length;X++)if($.push(Z[X]),X<Y.length)if(Y[X]&&typeof Y[X]==="object"&&"raw"in Y[X])$.push(Y[X].raw);else $.push("?"),J.push(Y[X]);return{sql:$.join(""),parameters:J}}PY.raw=function(Y){return{raw:Y}};PY.ref=function(Y){return{raw:Y}};F();import{existsSync as KZ,mkdirSync as D7,readdirSync as oY,readFileSync as O4,unlinkSync as x7,writeFileSync as A4}from"fs";import{dirname as q7,join as e}from"path";import{log as m}from"@stacksjs/logging";import{err as tY,handleError as eY,ok as OY}from"@stacksjs/error-handling";import{path as hY}from"@stacksjs/path";import{createQueryBuilder as B4,executeMigration as T7,generateMigration as jZ,resetConnection as aY,resetDatabase as P7,setConfig as V4}from"@stacksjs/query-builder";import{Buffer as G7}from"buffer";import{createHash as z7}from"crypto";import{closeSync as U7,openSync as Q7,statSync as _7,unlinkSync as z4,writeFileSync as O7}from"fs";import A7 from"process";import{userDatabasePath as B7}from"@stacksjs/path";var V7=30000,LZ=100,EZ=2000,L7=60000,VZ="stacks_migrations";async function U4(Z,Y,$={}){let J=$.timeoutMs??V7;if(Z!=="sqlite"&&Z!=="postgres"&&Z!=="mysql")throw Error(`[migration-lock] unknown dialect: ${String(Z)}`);if(Z==="sqlite")return R7($.sqliteLockPath,J);if(!Y)throw Error(`[migration-lock] ${Z} requires a database connection to acquire the lock`);if(Z==="postgres")return I7(Y,J);return K7(Y,J)}function E7(){let Z=z7("sha256").update(VZ).digest(),Y=Z.readInt32BE(0),$=Z.readInt32BE(4);return{key1:Y,key2:$}}async function I7(Z,Y){let{key1:$,key2:J}=E7(),X=Date.now(),W=LZ;while(!0){let H=await Z.unsafe(`SELECT pg_try_advisory_lock(${$}, ${J}) AS acquired`);if(M7(H,"acquired"))return{release:async()=>{try{await Z.unsafe(`SELECT pg_advisory_unlock(${$}, ${J})`)}catch{}}};if(Date.now()-X>=Y)throw Error("[migration-lock] another migration is in progress \u2014 could not acquire postgres advisory lock within timeout");await IZ(W),W=Math.min(W*2,EZ)}}async function K7(Z,Y){let $=Date.now(),J=LZ;while(!0){let X=await Z.unsafe(`SELECT GET_LOCK('${VZ}', 0) AS acquired`);if(F7(X,"acquired")===1)return{release:async()=>{try{await Z.unsafe(`SELECT RELEASE_LOCK('${VZ}')`)}catch{}}};if(Date.now()-$>=Y)throw Error("[migration-lock] another migration is in progress \u2014 could not acquire MySQL named lock within timeout");await IZ(J),J=Math.min(J*2,EZ)}}function j7(){return B7(".migration.lock")}async function R7(Z,Y){let $=Z??j7(),J=Date.now(),X=LZ;while(!0){if(w7($)){let W=!1;return{release:async()=>{if(W)return;W=!0;try{z4($)}catch{}}}}if(S7($),Date.now()-J>=Y)throw Error(`[migration-lock] another migration is in progress \u2014 lock file ${$} held within timeout`);await IZ(X),X=Math.min(X*2,EZ)}}function w7(Z){try{let Y=Q7(Z,"wx");try{let $=JSON.stringify({pid:A7.pid,startedAt:new Date().toISOString()});O7(Y,G7.from($,"utf8"))}finally{U7(Y)}return!0}catch(Y){if(Y.code==="EEXIST")return!1;throw Y}}function S7(Z){try{let Y=_7(Z);if(Date.now()-Y.mtimeMs>L7)try{z4(Z)}catch{}}catch{}}function IZ(Z){let Y=Z*(1+Math.random()*0.25);return new Promise(($)=>setTimeout($,Y))}function M7(Z,Y){let $=Q4(Z);if(!$)return!1;let J=$[Y];return J===!0||J===1||J==="1"||J==="t"}function F7(Z,Y){let $=Q4(Z);if(!$)return null;let J=$[Y];if(typeof J==="number")return J;if(typeof J==="string"&&/^-?\d+$/.test(J))return Number.parseInt(J,10);return null}function Q4(Z){if(!Z)return null;if(Array.isArray(Z))return Z[0];if(typeof Z==="object"&&"rows"in Z&&Array.isArray(Z.rows))return Z.rows[0];return null}iY();import{env as YZ}from"@stacksjs/env";var K={info:(...Z)=>typeof m?.info==="function"?m.info(...Z):console.log(...Z),success:(Z)=>typeof m?.success==="function"?m.success(Z):console.log(Z),warn:(Z)=>typeof m?.warn==="function"?m.warn(Z):console.warn(Z),error:(...Z)=>typeof m?.error==="function"?m.error(...Z):console.error(...Z),debug:(...Z)=>typeof m?.debug==="function"?m.debug(...Z):console.debug(...Z)},k7=YZ.DB_CONNECTION||"sqlite",N7=t("sqlite",YZ),kY=t("mysql",YZ),NY=t("postgres",YZ),yY={default:k7,connections:{sqlite:{database:N7.database,prefix:""},mysql:{name:kY.database,host:kY.host,username:kY.username,password:kY.password,port:kY.port,prefix:""},postgres:{name:NY.database,host:NY.host,username:NY.username,password:NY.password,port:NY.port,prefix:""}}};function L4(){return yY.default||"sqlite"}function YY(){let Z=L4();if(Z==="sqlite"||Z==="mysql"||Z==="postgres")return Z;if(Z==="singlestore")return"mysql";if(Z==="dynamodb")throw Error("[database] DB_CONNECTION=dynamodb is not compatible with the SQL migration runner. "+"DynamoDB has no schema-migration concept \u2014 use the entity-style `dynamo.entity(...)` "+"API from @stacksjs/database directly. To run SQL migrations, set DB_CONNECTION to one of: sqlite, mysql, postgres.");throw Error(`[database] Unknown DB_CONNECTION "${Z}". Allowed values: sqlite, mysql, postgres, dynamodb.`)}function RZ(){return L4()==="singlestore"?"singlestore":YY()}function vY(){let Z=YY(),Y=yY.connections[Z];V4({dialect:Z,verbose:!1,database:{database:Y?.name||Y?.database||"stacks",host:Y?.host||"localhost",port:Y?.port||(Z==="postgres"?5432:Z==="mysql"?3306:0),username:Y?.username||"",password:Y?.password||""}}),aY()}function wZ(){let Z=hY.userModelsPath();return{modelsDir:Z,skip:!KZ(Z)}}function y7(){let Z=e(process.cwd(),"database","migrations"),Y;try{Y=oY(Z).filter((L)=>L.endsWith(".sql"))}catch{return}let $=[],J=(L,B)=>{K.info(`Skipping migration on SQLite (${B}): ${L}`),$.push(L)},X=(L,B,E)=>{K.info(`Dropping no-op migration (${E}): ${L}`);try{x7(B)}catch{}$.push(L)},W=[],H=/^\s*ALTER\s+TABLE\s+.+\s+ADD\s+CONSTRAINT\s+/i,G=/^\s*CREATE\s+TYPE\s+/i,z=/^\s*CREATE\s+UNIQUE\s+INDEX\s+(?:IF\s+NOT\s+EXISTS\s+)?["'`]?(\w+)["'`]?/i,Q=/^\s*ALTER\s+TABLE\s+["']?(\w+)["']?\s+DROP\s+COLUMN\s+["']?(\w+)["']?\s*$/i,_=/^\s*CREATE\s+TABLE\s+(?:IF\s+NOT\s+EXISTS\s+)?["']?(\w+)["']?/i,U=new Map;for(let L of Y){let B=L.match(/^\d+-create-(\w+)-table\.sql$/);if(!B||!B[1])continue;let E=B[1],V=U.get(E);if(!V||L<V)U.set(E,L)}let I=e(process.cwd(),yY.connections.sqlite.database||"stacks.db"),O=null;if(KZ(I))try{let{Database:L}=b("bun:sqlite");O=new L(I,{readonly:!0})}catch{}for(let L of Y){K.debug(`[migration] Running: ${L}`);let B=e(Z,L),V=O4(B,"utf-8").split(";").map((w)=>w.trim()).filter((w)=>w.length>0&&!w.startsWith("--"));if(V.length===0)continue;let j=V[0],R=j?j.match(_):null;if(R&&R[1]){let w=R[1],g=U.get(w);if(g&&g!==L){X(L,B,`duplicate create-table for "${w}" (kept ${g})`);continue}}if(V.every((w)=>H.test(w))){J(L,"SQLite does not support ALTER TABLE ADD CONSTRAINT");continue}if(V.every((w)=>G.test(w))){J(L,"SQLite does not support CREATE TYPE (enum types)");continue}let D=V.map((w)=>w.match(z)?.[1]).filter((w)=>Boolean(w));if(O&&D.length===V.length){let w=O.prepare("SELECT name FROM sqlite_master WHERE type = 'index' AND name = ?");if(D.filter((zY)=>!w.get(zY)).length>0)K.info(`Re-queueing unique-index migration (index missing from database): ${L}`),W.push(L);continue}if(V.some((w)=>Q.test(w))){let w=!1,g=[];for(let zY of V){let DY=zY.match(Q);if(DY&&DY[1]&&DY[2]){let nY=DY[1],xY=DY[2];if(!O){K.info(`Skipping DROP COLUMN "${xY}" \u2014 no database exists yet: ${L}`),w=!0;continue}try{let h6=nY.replace(/[^a-zA-Z0-9_]/g,""),lZ=O.prepare(`PRAGMA table_info("${h6}")`).all();if(lZ.length===0){K.info(`Skipping DROP COLUMN "${xY}" \u2014 table "${nY}" does not exist yet: ${L}`),w=!0;continue}if(!lZ.some((v6)=>v6.name===xY)){K.info(`Skipping DROP COLUMN "${xY}" from "${nY}" \u2014 column does not exist: ${L}`),w=!0;continue}}catch{K.info(`Skipping DROP COLUMN "${xY}" \u2014 table "${nY}" not found: ${L}`),w=!0;continue}}g.push(zY)}if(w){if(g.length===0)X(L,B,"columns already absent from table");else A4(B,`${g.join(`;
2
+ var h0=Object.defineProperty;var p0=(Z)=>Z;function u0(Z,Y){this[Z]=p0.bind(null,Y)}var c0=(Z,Y)=>{for(var $ in Y)h0(Z,$,{get:Y[$],enumerable:!0,configurable:!0,set:u0.bind(Y,$)})};var AZ=(Z,Y)=>()=>(Z&&(Y=Z(Z=0)),Y);var d=import.meta.require;function m(Z,Y){let $=Y??{};switch(Z){case"sqlite":return{database:$.DB_DATABASE_PATH||dY.sqlitePath,prefix:""};case"mysql":return{database:$.DB_DATABASE||dY.default,host:$.DB_HOST||"127.0.0.1",port:$.DB_PORT||RZ.mysql,username:$.DB_USERNAME||OZ.mysql,password:$.DB_PASSWORD||"",prefix:""};case"postgres":return{database:$.DB_DATABASE||dY.default,host:$.DB_HOST||"127.0.0.1",port:$.DB_PORT||RZ.postgres,username:$.DB_USERNAME||OZ.postgres,password:$.DB_PASSWORD||"",prefix:""};default:return{database:":memory:"}}}var z5="127.0.0.1",RZ,dY,OZ,G5,H5;var MY=AZ(()=>{RZ={mysql:3306,postgres:5432,sqlite:0},dY={default:"stacks",sqlitePath:"database/stacks.sqlite",sqliteTestingPath:"database/stacks_testing.sqlite"},OZ={mysql:"root",postgres:"postgres",sqlite:""},G5={host:"localhost",port:6379},H5={region:"us-east-1"}});var e={};c0(e,{setConfig:()=>wZ,initializeDbConfig:()=>kZ,ensureDatabaseConfigLoaded:()=>lY,db:()=>K,applySqlitePragmas:()=>n0,acquireDbConfigLock:()=>g0,SQLITE_BOOTSTRAP_PRAGMAS:()=>rY});import{AsyncLocalStorage as b0}from"async_hooks";import{createQueryBuilder as C0,setConfig as wZ}from"@stacksjs/query-builder";import{env as AY}from"@stacksjs/env";import{applySqlitePragmas as n0,SQLITE_BOOTSTRAP_PRAGMAS as rY}from"@stacksjs/query-builder";function g0(){let Z=()=>{},Y=new Promise((X)=>{Z=X}),$=gY.then(()=>Z);return gY=gY.then(()=>Y),$}function kZ(Z){if(Z?.app?.env)SZ=Z.app.env;if(Z?.database?.default)xZ=Z.database.default;if(Z?.database)qZ=Z.database;mY(),ZY=null}function DZ(){return SZ}function MZ(){return xZ}function s0(){return qZ}function yZ(){let Z=MZ();if(Z==="sqlite")return"sqlite";if(Z==="mysql")return"mysql";if(Z==="singlestore")return"singlestore";if(Z==="postgres")return"postgres";return"sqlite"}function m0(){let Z=MZ(),Y=s0(),$=DZ();if(Z==="sqlite"){let X=$!=="testing"?"database/stacks.sqlite":"database/stacks_testing.sqlite";return{database:Y.connections?.sqlite?.database??X}}if(Z==="mysql")return{database:Y.connections?.mysql?.name||"stacks",host:Y.connections?.mysql?.host??"127.0.0.1",username:Y.connections?.mysql?.username??"root",password:Y.connections?.mysql?.password??"",port:Y.connections?.mysql?.port??3306};if(Z==="singlestore")return{database:Y.connections?.singlestore?.name||"stacks",host:Y.connections?.singlestore?.host??"127.0.0.1",username:Y.connections?.singlestore?.username??"root",password:Y.connections?.singlestore?.password??"",port:Y.connections?.singlestore?.port??3306};if(Z==="postgres"){let X=Y.connections?.postgres?.name??"stacks";return{database:$==="testing"?`${X}_testing`:X,host:Y.connections?.postgres?.host??"127.0.0.1",username:Y.connections?.postgres?.username??"",password:Y.connections?.postgres?.password??"",port:Y.connections?.postgres?.port??5432}}return{database:":memory:"}}function mY(){let Z=yZ(),Y=m0();wZ({dialect:Z,database:Y,verbose:DZ()!=="production",timestamps:{createdAt:"created_at",updatedAt:"updated_at",defaultOrderColumn:"created_at"},softDeletes:{enabled:!0,column:"deleted_at",defaultFilter:!0}})}function FZ(){if(!sY)sY=(async()=>{try{let{config:Z,overridesReady:Y}=await import("@stacksjs/config");if(await Y,Z)kZ(Z),ZY=null}catch{}})();return sY}async function lY(){await FZ()}function l0(Z){if(BZ.getStore())return Z();let Y=jZ.then(()=>BZ.run(!0,Z));return jZ=Y.then(()=>{return},()=>{return}),Y}function r0(Z){let Y=Z.transaction.bind(Z);Z.transaction=(...$)=>l0(()=>Y(...$))}function a0(){if(!ZY){if(mY(),ZY=C0(),yZ()==="sqlite")r0(ZY)}return ZY}var d0,p,EY,SZ,xZ,qZ,gY,ZY=null,sY=null,BZ,jZ,K;var D=AZ(()=>{MY();d0=m("sqlite",AY),p=m("mysql",AY),EY=m("postgres",AY),SZ=AY.APP_ENV||"local",xZ=AY.DB_CONNECTION||"sqlite",qZ={connections:{sqlite:{database:d0.database,prefix:""},mysql:{name:p.database,host:p.host,username:p.username,password:p.password,port:p.port,prefix:""},singlestore:{name:p.database,host:p.host,username:p.username,password:p.password,port:p.port,prefix:""},postgres:{name:EY.database,host:EY.host,username:EY.username,password:EY.password,port:EY.port,prefix:""}}},gY=Promise.resolve();mY();BZ=new b0,jZ=Promise.resolve();FZ();K=new Proxy({},{get(Z,Y){let $=a0(),X=$[Y];if(typeof X==="function")return X.bind($);return X}})});D();function TZ(Z,...Y){let $=[],X=[];for(let J=0;J<Z.length;J++)if($.push(Z[J]),J<Y.length)if(Y[J]&&typeof Y[J]==="object"&&"raw"in Y[J])$.push(Y[J].raw);else $.push("?"),X.push(Y[J]);return{sql:$.join(""),parameters:X}}TZ.raw=function(Y){return{raw:Y}};TZ.ref=function(Y){return{raw:Y}};D();import{existsSync as eY,mkdirSync as L1,readdirSync as FY,readFileSync as hZ,unlinkSync as E1,writeFileSync as pZ}from"fs";import{dirname as A1,join as l}from"path";import{log as u}from"@stacksjs/logging";import{err as TY,handleError as PY,ok as $Y}from"@stacksjs/error-handling";import{path as jY}from"@stacksjs/path";import{createQueryBuilder as uZ,executeMigration as R1,generateMigration as tY,resetConnection as yY,resetDatabase as O1,setConfig as cZ}from"@stacksjs/query-builder";import{Buffer as o0}from"buffer";import{createHash as i0}from"crypto";import{closeSync as e0,openSync as t0,statSync as Y1,unlinkSync as PZ,writeFileSync as Z1}from"fs";import $1 from"process";import{userDatabasePath as X1}from"@stacksjs/path";var J1=30000,nY=100,oY=2000,W1=60000,aY="stacks_migrations";async function NZ(Z,Y,$={}){let X=$.timeoutMs??J1;if(Z!=="sqlite"&&Z!=="postgres"&&Z!=="mysql")throw Error(`[migration-lock] unknown dialect: ${String(Z)}`);if(Z==="sqlite")return Q1($.sqliteLockPath,X);if(!Y)throw Error(`[migration-lock] ${Z} requires a database connection to acquire the lock`);if(Z==="postgres")return G1(Y,X);return H1(Y,X)}function z1(){let Z=i0("sha256").update(aY).digest(),Y=Z.readInt32BE(0),$=Z.readInt32BE(4);return{key1:Y,key2:$}}async function G1(Z,Y){let{key1:$,key2:X}=z1(),J=Date.now(),W=nY;while(!0){let z=await Z.unsafe(`SELECT pg_try_advisory_lock(${$}, ${X}) AS acquired`);if(V1(z,"acquired"))return{release:async()=>{try{await Z.unsafe(`SELECT pg_advisory_unlock(${$}, ${X})`)}catch{}}};if(Date.now()-J>=Y)throw Error("[migration-lock] another migration is in progress \u2014 could not acquire postgres advisory lock within timeout");await iY(W),W=Math.min(W*2,oY)}}async function H1(Z,Y){let $=Date.now(),X=nY;while(!0){let J=await Z.unsafe(`SELECT GET_LOCK('${aY}', 0) AS acquired`);if(_1(J,"acquired")===1)return{release:async()=>{try{await Z.unsafe(`SELECT RELEASE_LOCK('${aY}')`)}catch{}}};if(Date.now()-$>=Y)throw Error("[migration-lock] another migration is in progress \u2014 could not acquire MySQL named lock within timeout");await iY(X),X=Math.min(X*2,oY)}}function U1(){return X1(".migration.lock")}async function Q1(Z,Y){let $=Z??U1(),X=Date.now(),J=nY;while(!0){if(I1($)){let W=!1;return{release:async()=>{if(W)return;W=!0;try{PZ($)}catch{}}}}if(K1($),Date.now()-X>=Y)throw Error(`[migration-lock] another migration is in progress \u2014 lock file ${$} held within timeout`);await iY(J),J=Math.min(J*2,oY)}}function I1(Z){try{let Y=t0(Z,"wx");try{let $=JSON.stringify({pid:$1.pid,startedAt:new Date().toISOString()});Z1(Y,o0.from($,"utf8"))}finally{e0(Y)}return!0}catch(Y){if(Y.code==="EEXIST")return!1;throw Y}}function K1(Z){try{let Y=Y1(Z);if(Date.now()-Y.mtimeMs>W1)try{PZ(Z)}catch{}}catch{}}function iY(Z){let Y=Z*(1+Math.random()*0.25);return new Promise(($)=>setTimeout($,Y))}function V1(Z,Y){let $=vZ(Z);if(!$)return!1;let X=$[Y];return X===!0||X===1||X==="1"||X==="t"}function _1(Z,Y){let $=vZ(Z);if(!$)return null;let X=$[Y];if(typeof X==="number")return X;if(typeof X==="string"&&/^-?\d+$/.test(X))return Number.parseInt(X,10);return null}function vZ(Z){if(!Z)return null;if(Array.isArray(Z))return Z[0];if(typeof Z==="object"&&"rows"in Z&&Array.isArray(Z.rows))return Z.rows[0];return null}MY();import{env as NY}from"@stacksjs/env";var R={info:(...Z)=>typeof u?.info==="function"?u.info(...Z):console.log(...Z),success:(Z)=>typeof u?.success==="function"?u.success(Z):console.log(Z),warn:(Z)=>typeof u?.warn==="function"?u.warn(Z):console.warn(Z),error:(...Z)=>typeof u?.error==="function"?u.error(...Z):console.error(...Z),debug:(...Z)=>typeof u?.debug==="function"?u.debug(...Z):console.debug(...Z)},B1=NY.DB_CONNECTION||"sqlite",j1=m("sqlite",NY),RY=m("mysql",NY),OY=m("postgres",NY),BY={default:B1,connections:{sqlite:{database:j1.database,prefix:""},mysql:{name:RY.database,host:RY.host,username:RY.username,password:RY.password,port:RY.port,prefix:""},postgres:{name:OY.database,host:OY.host,username:OY.username,password:OY.password,port:OY.port,prefix:""}}};function bZ(){return BY.default||"sqlite"}function r(){let Z=bZ();if(Z==="sqlite"||Z==="mysql"||Z==="postgres")return Z;if(Z==="singlestore")return"mysql";if(Z==="dynamodb")throw Error("[database] DB_CONNECTION=dynamodb is not compatible with the SQL migration runner. "+"DynamoDB has no schema-migration concept \u2014 use the entity-style `dynamo.entity(...)` "+"API from @stacksjs/database directly. To run SQL migrations, set DB_CONNECTION to one of: sqlite, mysql, postgres.");throw Error(`[database] Unknown DB_CONNECTION "${Z}". Allowed values: sqlite, mysql, postgres, dynamodb.`)}function YZ(){return bZ()==="singlestore"?"singlestore":r()}function wY(){let Z=r(),Y=BY.connections[Z];cZ({dialect:Z,verbose:!1,database:{database:Y?.name||Y?.database||"stacks",host:Y?.host||"localhost",port:Y?.port||(Z==="postgres"?5432:Z==="mysql"?3306:0),username:Y?.username||"",password:Y?.password||""}}),yY()}function ZZ(){let Z=jY.userModelsPath();return{modelsDir:Z,skip:!eY(Z)}}function w1(){let Z=l(process.cwd(),"database","migrations"),Y;try{Y=FY(Z).filter((A)=>A.endsWith(".sql"))}catch{return}let $=[],X=(A,V)=>{R.info(`Skipping migration on SQLite (${V}): ${A}`),$.push(A)},J=(A,V,L)=>{R.info(`Dropping no-op migration (${L}): ${A}`);try{E1(V)}catch{}$.push(A)},W=[],z=/^\s*ALTER\s+TABLE\s+.+\s+ADD\s+CONSTRAINT\s+/i,H=/^\s*CREATE\s+TYPE\s+/i,I=/^\s*CREATE\s+UNIQUE\s+INDEX\s+(?:IF\s+NOT\s+EXISTS\s+)?["'`]?(\w+)["'`]?/i,Q=/^\s*ALTER\s+TABLE\s+["']?(\w+)["']?\s+DROP\s+COLUMN\s+["']?(\w+)["']?\s*$/i,E=/^\s*CREATE\s+TABLE\s+(?:IF\s+NOT\s+EXISTS\s+)?["']?(\w+)["']?/i,G=new Map;for(let A of Y){let V=A.match(/^\d+-create-(\w+)-table\.sql$/);if(!V||!V[1])continue;let L=V[1],_=G.get(L);if(!_||A<_)G.set(L,A)}let S=l(process.cwd(),BY.connections.sqlite.database||"stacks.db"),U=null;if(eY(S))try{let{Database:A}=d("bun:sqlite");U=new A(S,{readonly:!0})}catch{}for(let A of Y){R.debug(`[migration] Running: ${A}`);let V=l(Z,A),_=hZ(V,"utf-8").split(";").map((O)=>O.trim()).filter((O)=>O.length>0&&!O.startsWith("--"));if(_.length===0)continue;let x=_[0],B=x?x.match(E):null;if(B&&B[1]){let O=B[1],h=G.get(O);if(h&&h!==A){J(A,V,`duplicate create-table for "${O}" (kept ${h})`);continue}}if(_.every((O)=>z.test(O))){X(A,"SQLite does not support ALTER TABLE ADD CONSTRAINT");continue}if(_.every((O)=>H.test(O))){X(A,"SQLite does not support CREATE TYPE (enum types)");continue}let w=_.map((O)=>O.match(I)?.[1]).filter((O)=>Boolean(O));if(U&&w.length===_.length){let O=U.prepare("SELECT name FROM sqlite_master WHERE type = 'index' AND name = ?");if(w.filter((i)=>!O.get(i)).length>0)R.info(`Re-queueing unique-index migration (index missing from database): ${A}`),W.push(A);continue}if(_.some((O)=>Q.test(O))){let O=!1,h=[];for(let i of _){let _Y=i.match(Q);if(_Y&&_Y[1]&&_Y[2]){let DY=_Y[1],LY=_Y[2];if(!U){R.info(`Skipping DROP COLUMN "${LY}" \u2014 no database exists yet: ${A}`),O=!0;continue}try{let v0=DY.replace(/[^a-zA-Z0-9_]/g,""),EZ=U.prepare(`PRAGMA table_info("${v0}")`).all();if(EZ.length===0){R.info(`Skipping DROP COLUMN "${LY}" \u2014 table "${DY}" does not exist yet: ${A}`),O=!0;continue}if(!EZ.some((f0)=>f0.name===LY)){R.info(`Skipping DROP COLUMN "${LY}" from "${DY}" \u2014 column does not exist: ${A}`),O=!0;continue}}catch{R.info(`Skipping DROP COLUMN "${LY}" \u2014 table "${DY}" not found: ${A}`),O=!0;continue}}h.push(i)}if(O){if(h.length===0)J(A,V,"columns already absent from table");else pZ(V,`${h.join(`;
3
3
  `)};
4
- `);continue}}}if(O)try{O.close()}catch{}if($.length>0||W.length>0)try{let L=e(process.cwd(),yY.connections.sqlite.database||"stacks.db");D7(q7(L),{recursive:!0});let{Database:B}=b("bun:sqlite"),E=new B(L);try{E.exec(`CREATE TABLE IF NOT EXISTS migrations (
4
+ `);continue}}}if(U)try{U.close()}catch{}if($.length>0||W.length>0)try{let A=l(process.cwd(),BY.connections.sqlite.database||"stacks.db");L1(A1(A),{recursive:!0});let{Database:V}=d("bun:sqlite"),L=new V(A);try{L.exec(`CREATE TABLE IF NOT EXISTS migrations (
5
5
  id INTEGER PRIMARY KEY AUTOINCREMENT,
6
6
  migration TEXT NOT NULL UNIQUE,
7
7
  executed_at DATETIME DEFAULT CURRENT_TIMESTAMP
8
- )`);let V=E.prepare("INSERT OR IGNORE INTO migrations (migration) VALUES (?)");for(let R of $)V.run(R);let j=E.prepare("DELETE FROM migrations WHERE migration = ?");for(let R of W)j.run(R)}finally{E.close()}}catch(L){K.debug(`[migration] Could not record dropped migrations as executed: ${L}`)}}async function h7(){let Z=YY();if(Z==="sqlite")return;let Y=yY.connections[Z],$=(Y?.name||"stacks").replace(/['"]/g,""),J=Y?.host||"localhost",X=Y?.port||(Z==="postgres"?5432:3306),W=Y?.username||(Z==="postgres"?process.env.USER||"postgres":"root"),H=Y?.password||"",G=Z==="postgres"?"postgres":"mysql";try{V4({dialect:Z,database:{database:G,host:J,port:X,username:W,password:H}}),aY();let z=B4();if(Z==="postgres")try{await z.unsafe(`CREATE DATABASE "${$}"`),K.info(`Created database "${$}"`)}catch(Q){if(Q?.message?.includes("already exists")||Q?.errno==="42P04")K.info(`Database "${$}" already exists`);else throw Q}else if(Z==="mysql")try{await z.unsafe(`CREATE DATABASE IF NOT EXISTS \`${$}\``),K.info(`Ensured database "${$}" exists`)}catch(Q){if(Q?.message?.includes("database exists"))K.info(`Database "${$}" already exists`);else throw Q}aY()}catch(z){K.warn(`Could not auto-create database "${$}": ${z?.message||z}`),K.info("If the database already exists, this warning can be ignored."),aY()}}async function v7(){let Z=[];try{let{FEATURE_NAMES:Y,migrationFeature:$}=await import("@stacksjs/buddy"),{feature:J}=await import("@stacksjs/config"),X=await import("fs/promises"),W=hY.projectPath("database/migrations");if(!KZ(W))return Z;let H=new Set(Y.filter((z)=>!J(z)));if(H.size===0)return Z;let G=oY(W).filter((z)=>z.endsWith(".sql"));for(let z of G){let Q=$(z);if(!Q||!H.has(Q))continue;let _=e(W,z),U=`${_}.disabled`;await X.rename(_,U),Z.push({original:_,hidden:U,feature:Q})}if(Z.length>0){let z=Object.entries(Z.reduce((Q,_)=>{return Q[_.feature]=(Q[_.feature]??0)+1,Q},{})).map(([Q,_])=>`${Q}: ${_}`).join(", ");K.info(`[migration] Skipping ${Z.length} migration(s) for disabled features (${z}). Run \`./buddy <feature>:install\` to enable.`)}}catch{}return Z}async function f7(Z){let Y=await import("fs/promises");for(let{original:$,hidden:J}of Z)try{await Y.rename(J,$)}catch{}}async function _4(){try{let Z=await A.selectFrom("migrations").select(($)=>$.fn.count("id").as("n")).executeTakeFirst();if(!Z)return 0;let Y=Number(Z.n??Z.N??0);return Number.isFinite(Y)?Y:0}catch{return 0}}async function b7(Z){try{let Y=await import("fs/promises"),$=hY.projectPath(".stacks");await Y.mkdir($,{recursive:!0});let J=`${$}/last-migrate-result.json`,X=JSON.stringify({appliedCount:Z,completedAt:new Date().toISOString()});await Y.writeFile(J,X,"utf8")}catch{}}async function G5(){let Z=Date.now(),Y=await v7(),$=null;try{K.debug("Migrating database..."),await h7(),vY();let J=YY(),X=J==="sqlite"?null:B4();if($=await U4(J,X),J==="sqlite")y7();let W=hY.userModelsPath(),H=await _4();K.debug(`[migration] Running migrations from: ${W}`),await T7(W);let G=await _4(),z=Math.max(0,G-H);return await b7(z),K.debug(`Database migration completed in ${Date.now()-Z}ms (applied ${z}).`),OY(z===0?"Nothing to migrate.":`Applied ${z} migration${z===1?"":"s"}.`)}catch(J){let X=J instanceof Error?J.message:String(J);return K.error(`[migration] Failed after ${Date.now()-Z}ms: ${X}`),K.info("[migration] Run `./buddy migrate:fresh` to drop and recreate the schema if state is partial."),tY(eY("Migration failed",J))}finally{if($)try{await $.release()}catch{}await f7(Y)}}var p7=["oauth_refresh_tokens","oauth_access_tokens","oauth_clients","passkeys","failed_jobs","jobs","notifications","password_reset_tokens"];async function z5(){try{vY();let Z=hY.userModelsPath(),Y=YY();return await C7(Y),await P7(Z,{dialect:Y}),OY("All tables dropped successfully!")}catch(Z){return tY(eY("Database reset failed",Z))}}async function C7(Z){if(Z==="mysql")try{await A.unsafe("SET FOREIGN_KEY_CHECKS = 0").execute()}catch(Y){K.warn(`Could not disable foreign key checks: ${Y instanceof Error?Y.message:String(Y)}`)}if(Z==="sqlite")try{await A.unsafe("PRAGMA foreign_keys = OFF").execute()}catch(Y){K.warn(`Could not disable foreign key checks: ${Y instanceof Error?Y.message:String(Y)}`)}for(let Y of p7)try{let $;if(Z==="postgres")$=`DROP TABLE IF EXISTS "${Y}" CASCADE`;else if(Z==="mysql")$=`DROP TABLE IF EXISTS \`${Y}\``;else $=`DROP TABLE IF EXISTS "${Y}"`;K.info(`Dropping framework table: ${Y}`),await A.unsafe($).execute(),K.info(`Dropped framework table: ${Y}`)}catch($){K.warn(`Could not drop table ${Y}: ${$ instanceof Error?$.message:String($)}`)}if(Z==="mysql")try{await A.unsafe("SET FOREIGN_KEY_CHECKS = 1").execute()}catch(Y){K.warn(`Could not re-enable foreign key checks: ${Y instanceof Error?Y.message:String(Y)}`)}if(Z==="sqlite")try{await A.unsafe("PRAGMA foreign_keys = ON").execute()}catch(Y){K.warn(`Could not re-enable foreign key checks: ${Y instanceof Error?Y.message:String(Y)}`)}}function E4(Z){let Y=Z.applyRenames??(process.env.STACKS_MIGRATE_NO_RENAME==="1"?!1:void 0),$=Z.fromDb??(process.env.STACKS_MIGRATE_FROM_DB==="1"?!0:void 0);return{applyRenames:Y,fromDb:$}}async function U5(Z={}){try{vY();let Y=YY(),{modelsDir:$,skip:J}=wZ();if(J)return[];let{applyRenames:X,fromDb:W}=E4(Z);return(await jZ($,{dialect:RZ(),dryRun:!0,applyRenames:X,fromDb:W})).operations??[]}catch(Y){return K.debug(`[migration] preview failed: ${Y instanceof Error?Y.message:String(Y)}`),[]}}async function Q5(Z={}){try{K.debug("Generating migrations..."),vY();let Y=YY(),{modelsDir:$,skip:J}=wZ();if(J)return K.debug("No app/Models directory found; using committed framework migrations"),OY("Migrations generated");let{applyRenames:X,fromDb:W}=E4(Z);K.debug(`[migration] Generating migrations for dialect: ${Y}, models: ${$}`);let H=await jZ($,{dialect:RZ(),dryRun:!0,applyRenames:X,fromDb:W});if(H.hasChanges){let G=c7(H.sqlStatements??[]);if(G>0)K.success(`Generated ${G} migration file${G===1?"":"s"}`);else K.debug("Migration generation produced no new files (already up to date)")}else K.debug("No changes detected");return OY("Migrations generated")}catch(Y){return tY(eY("Migration generation failed",Y))}}function c7(Z){if(!Z?.length)return 0;let Y=e(process.cwd(),"database","migrations");try{b("fs").mkdirSync(Y,{recursive:!0})}catch{}let $="";try{for(let z of oY(Y).filter((Q)=>Q.endsWith(".sql")))$+=`
9
- ${O4(e(Y,z),"utf8")}`}catch{}let J=(z)=>z.replace(/\s+/g," ").trim(),X=J($),W=u7(Z),H=0,G=g7(Y);for(let z of W){let Q=z.statements.filter((O)=>!X.includes(J(O)));if(Q.length===0)continue;let _=`${String(G).padStart(10,"0")}-${z.label}.sql`,U=e(Y,_),I=`${Q.map((O)=>O.trim().replace(/;\s*$/,"")).join(`;
8
+ )`);let _=L.prepare("INSERT OR IGNORE INTO migrations (migration) VALUES (?)");for(let B of $)_.run(B);let x=L.prepare("DELETE FROM migrations WHERE migration = ?");for(let B of W)x.run(B)}finally{L.close()}}catch(A){R.debug(`[migration] Could not record dropped migrations as executed: ${A}`)}}async function S1(){let Z=r();if(Z==="sqlite")return;let Y=BY.connections[Z],$=(Y?.name||"stacks").replace(/['"]/g,""),X=Y?.host||"localhost",J=Y?.port||(Z==="postgres"?5432:3306),W=Y?.username||(Z==="postgres"?process.env.USER||"postgres":"root"),z=Y?.password||"",H=Z==="postgres"?"postgres":"mysql";try{cZ({dialect:Z,database:{database:H,host:X,port:J,username:W,password:z}}),yY();let I=uZ();if(Z==="postgres")try{await I.unsafe(`CREATE DATABASE "${$}"`),R.info(`Created database "${$}"`)}catch(Q){if(Q?.message?.includes("already exists")||Q?.errno==="42P04")R.info(`Database "${$}" already exists`);else throw Q}else if(Z==="mysql")try{await I.unsafe(`CREATE DATABASE IF NOT EXISTS \`${$}\``),R.info(`Ensured database "${$}" exists`)}catch(Q){if(Q?.message?.includes("database exists"))R.info(`Database "${$}" already exists`);else throw Q}yY()}catch(I){R.warn(`Could not auto-create database "${$}": ${I?.message||I}`),R.info("If the database already exists, this warning can be ignored."),yY()}}async function x1(){let Z=[];try{let{FEATURE_NAMES:Y,migrationFeature:$}=await import("@stacksjs/buddy"),{feature:X}=await import("@stacksjs/config"),J=await import("fs/promises"),W=jY.projectPath("database/migrations");if(!eY(W))return Z;let z=new Set(Y.filter((I)=>!X(I)));if(z.size===0)return Z;let H=FY(W).filter((I)=>I.endsWith(".sql"));for(let I of H){let Q=$(I);if(!Q||!z.has(Q))continue;let E=l(W,I),G=`${E}.disabled`;await J.rename(E,G),Z.push({original:E,hidden:G,feature:Q})}if(Z.length>0){let I=Object.entries(Z.reduce((Q,E)=>{return Q[E.feature]=(Q[E.feature]??0)+1,Q},{})).map(([Q,E])=>`${Q}: ${E}`).join(", ");R.info(`[migration] Skipping ${Z.length} migration(s) for disabled features (${I}). Run \`./buddy <feature>:install\` to enable.`)}}catch{}return Z}async function q1(Z){let Y=await import("fs/promises");for(let{original:$,hidden:X}of Z)try{await Y.rename(X,$)}catch{}}async function fZ(){try{let Z=await K.selectFrom("migrations").select(($)=>$.fn.count("id").as("n")).executeTakeFirst();if(!Z)return 0;let Y=Number(Z.n??Z.N??0);return Number.isFinite(Y)?Y:0}catch{return 0}}async function k1(Z){try{let Y=await import("fs/promises"),$=jY.projectPath(".stacks");await Y.mkdir($,{recursive:!0});let X=`${$}/last-migrate-result.json`,J=JSON.stringify({appliedCount:Z,completedAt:new Date().toISOString()});await Y.writeFile(X,J,"utf8")}catch{}}async function N5(){let Z=Date.now(),Y=await x1(),$=null;try{R.debug("Migrating database..."),await S1(),wY();let X=r(),J=X==="sqlite"?null:uZ();if($=await NZ(X,J),X==="sqlite")w1();let W=jY.userModelsPath(),z=await fZ();R.debug(`[migration] Running migrations from: ${W}`),await R1(W);let H=await fZ(),I=Math.max(0,H-z);return await k1(I),R.debug(`Database migration completed in ${Date.now()-Z}ms (applied ${I}).`),$Y(I===0?"Nothing to migrate.":`Applied ${I} migration${I===1?"":"s"}.`)}catch(X){let J=X instanceof Error?X.message:String(X);return R.error(`[migration] Failed after ${Date.now()-Z}ms: ${J}`),R.info("[migration] Run `./buddy migrate:fresh` to drop and recreate the schema if state is partial."),TY(PY("Migration failed",X))}finally{if($)try{await $.release()}catch{}await q1(Y)}}var D1=["oauth_refresh_tokens","oauth_access_tokens","oauth_clients","passkeys","failed_jobs","jobs","notifications","password_reset_tokens"];async function v5(){try{wY();let Z=jY.userModelsPath(),Y=r();return await M1(Y),await O1(Z,{dialect:Y}),$Y("All tables dropped successfully!")}catch(Z){return TY(PY("Database reset failed",Z))}}async function M1(Z){if(Z==="mysql")try{await K.unsafe("SET FOREIGN_KEY_CHECKS = 0").execute()}catch(Y){R.warn(`Could not disable foreign key checks: ${Y instanceof Error?Y.message:String(Y)}`)}if(Z==="sqlite")try{await K.unsafe("PRAGMA foreign_keys = OFF").execute()}catch(Y){R.warn(`Could not disable foreign key checks: ${Y instanceof Error?Y.message:String(Y)}`)}for(let Y of D1)try{let $;if(Z==="postgres")$=`DROP TABLE IF EXISTS "${Y}" CASCADE`;else if(Z==="mysql")$=`DROP TABLE IF EXISTS \`${Y}\``;else $=`DROP TABLE IF EXISTS "${Y}"`;R.info(`Dropping framework table: ${Y}`),await K.unsafe($).execute(),R.info(`Dropped framework table: ${Y}`)}catch($){R.warn(`Could not drop table ${Y}: ${$ instanceof Error?$.message:String($)}`)}if(Z==="mysql")try{await K.unsafe("SET FOREIGN_KEY_CHECKS = 1").execute()}catch(Y){R.warn(`Could not re-enable foreign key checks: ${Y instanceof Error?Y.message:String(Y)}`)}if(Z==="sqlite")try{await K.unsafe("PRAGMA foreign_keys = ON").execute()}catch(Y){R.warn(`Could not re-enable foreign key checks: ${Y instanceof Error?Y.message:String(Y)}`)}}function CZ(Z){let Y=Z.applyRenames??(process.env.STACKS_MIGRATE_NO_RENAME==="1"?!1:void 0),$=Z.fromDb??(process.env.STACKS_MIGRATE_FROM_DB==="1"?!0:void 0);return{applyRenames:Y,fromDb:$}}async function f5(Z={}){try{wY();let Y=r(),{modelsDir:$,skip:X}=ZZ();if(X)return[];let{applyRenames:J,fromDb:W}=CZ(Z);return(await tY($,{dialect:YZ(),dryRun:!0,applyRenames:J,fromDb:W})).operations??[]}catch(Y){return R.debug(`[migration] preview failed: ${Y instanceof Error?Y.message:String(Y)}`),[]}}async function h5(Z={}){try{R.debug("Generating migrations..."),wY();let Y=r(),{modelsDir:$,skip:X}=ZZ();if(X)return R.debug("No app/Models directory found; using committed framework migrations"),$Y("Migrations generated");let{applyRenames:J,fromDb:W}=CZ(Z);R.debug(`[migration] Generating migrations for dialect: ${Y}, models: ${$}`);let z=await tY($,{dialect:YZ(),dryRun:!0,applyRenames:J,fromDb:W});if(z.hasChanges){let H=y1(z.sqlStatements??[]);if(H>0)R.success(`Generated ${H} migration file${H===1?"":"s"}`);else R.debug("Migration generation produced no new files (already up to date)")}else R.debug("No changes detected");return $Y("Migrations generated")}catch(Y){return TY(PY("Migration generation failed",Y))}}function y1(Z){if(!Z?.length)return 0;let Y=l(process.cwd(),"database","migrations");try{d("fs").mkdirSync(Y,{recursive:!0})}catch{}let $="";try{for(let I of FY(Y).filter((Q)=>Q.endsWith(".sql")))$+=`
9
+ ${hZ(l(Y,I),"utf8")}`}catch{}let X=(I)=>I.replace(/\s+/g," ").trim(),J=X($),W=F1(Z),z=0,H=T1(Y);for(let I of W){let Q=I.statements.filter((U)=>!J.includes(X(U)));if(Q.length===0)continue;let E=`${String(H).padStart(10,"0")}-${I.label}.sql`,G=l(Y,E),S=`${Q.map((U)=>U.trim().replace(/;\s*$/,"")).join(`;
10
10
  `)};
11
- `;A4(U,I),K.debug(`[migration] Wrote ${_} (${Q.length} stmt${Q.length===1?"":"s"})`),H+=1,G+=1}return H}function u7(Z){let Y=new Map,$=(J,X)=>{let W=Y.get(J)??[];W.push(X),Y.set(J,W)};for(let J of Z){let X=J.trim();if(!X)continue;let W=X.match(/^\s*CREATE\s+TABLE\s+(?:IF\s+NOT\s+EXISTS\s+)?["`]?(\w+)["`]?/i);if(W){$(`create-${W[1]}-table`,X);continue}let H=X.match(/^\s*ALTER\s+TABLE\s+["`]?(\w+)["`]?\s+(?:ADD\s+COLUMN\s+["`]?(\w+)["`]?|DROP\s+COLUMN\s+["`]?(\w+)["`]?|ADD\s+CONSTRAINT)/i);if(H){$(`alter-${H[1]}-${H[2]||H[3]||"constraint"}`,X);continue}let G=X.match(/^\s*CREATE\s+(?:UNIQUE\s+)?INDEX\s+(?:IF\s+NOT\s+EXISTS\s+)?["`]?(\w+)["`]?\s+ON\s+["`]?(\w+)["`]?/i);if(G){$(`create-${G[1]}-index-in-${G[2]}`,X);continue}let z=X.match(/^\s*DROP\s+TABLE\s+(?:IF\s+EXISTS\s+)?["`]?(\w+)["`]?/i);if(z){$(`drop-${z[1]}-table`,X);continue}$("auto-misc",X)}return[...Y.entries()].map(([J,X])=>({label:J,statements:X}))}function g7(Z){let Y=0;try{for(let $ of oY(Z)){let J=$.match(/^(\d+)-/);if(J?.[1])Y=Math.max(Y,Number.parseInt(J[1],10))}}catch{}return Y+1}async function _5(){try{K.info("Generating fresh migrations..."),vY();let Z=YY(),{modelsDir:Y,skip:$}=wZ();if($)return K.info("No app/Models directory found; using committed framework migrations"),OY("Migrations generated");return await jZ(Y,{dialect:RZ(),full:!0,dryRun:!0}),K.success("Migrations generated"),OY("Migrations generated")}catch(Z){return tY(eY("Fresh migration generation failed",Z))}}import{memoryUsage as s7}from"process";import{config as ZY}from"@stacksjs/config";import{log as pY}from"@stacksjs/logging";function SZ(Z){let Y={normalized:"",type:"OTHER",tables:[]};if(!Z)return Y;try{let $=Z.trim().toUpperCase();if($.startsWith("SELECT"))Y.type="SELECT";else if($.startsWith("INSERT"))Y.type="INSERT";else if($.startsWith("UPDATE"))Y.type="UPDATE";else if($.startsWith("DELETE"))Y.type="DELETE";return Y.tables=d7(Z,Y.type),Y.normalized=m7(Z),Y}catch{return{normalized:Z,type:"OTHER",tables:[]}}}function fY(Z,Y="i"){return new RegExp(`${Z}\\s+(?:"([^"]+)"|\`([^\`]+)\`|\\[([^\\]]+)\\]|([\\w.]+))`,Y)}function bY(Z){if(!Z)return null;let Y=Z[1]??Z[2]??Z[3]??Z[4];if(!Y)return null;return Y.split(".").pop()??null}function d7(Z,Y){let $=[];try{switch(Y){case"SELECT":{let J=Z.match(fY("from")),X=bY(J);if(X)$.push(X);let W=fY("join","gi");for(let H of Z.matchAll(W)){let G=bY(H);if(G)$.push(G)}break}case"INSERT":{let J=Z.match(fY("into")),X=bY(J);if(X)$.push(X);break}case"UPDATE":{let J=Z.match(fY("update")),X=bY(J);if(X)$.push(X);break}case"DELETE":{let J=Z.match(fY("from")),X=bY(J);if(X)$.push(X);break}}}catch{}return[...new Set($)].filter(Boolean)}function m7(Z){try{let Y=Z;return Y=Y.replace(/(?<![a-zA-Z_])\b\d+\b(?![a-zA-Z_])/g,"?"),Y=Y.replace(/'([^']|'')*'/g,"?"),Y=Y.replace(/"([^"]|"")*"/g,"?"),Y=Y.replace(/\btrue\b/gi,"?"),Y=Y.replace(/\bfalse\b/gi,"?"),Y=Y.replace(/\bnull\b/gi,"?"),Y=Y.replace(/\s+/g," ").trim(),Y}catch{return Z}}F();var I4=()=>{};function l7(Z){I4=Z}var MZ=!1;async function r7(Z){if(MZ)return;try{let{query:Y,durationMs:$,error:J,bindings:X}=n7(Z);try{I4(Y,$,ZY.database?.default||"unknown")}catch{}if(!ZY.database?.queryLogging?.enabled)return;let W=i7($,J),H=await a7(Y,$,W,J,X);if(ZY.database?.queryLogging?.analysis?.enabled&&(W==="slow"||ZY.database.queryLogging.analysis.analyzeAll))await Y8(H);MZ=!0;try{await X8(H)}finally{MZ=!1}if(W!=="completed")pY[W==="failed"?"error":"warn"](`Query ${W}:`,{query:H.query,duration:H.duration,connection:H.connection,...J&&{error:J}})}catch(Y){pY.error("Failed to log query:",Y)}}function n7(Z){let Y=Z.query?.sql||"",$=Z.queryDurationMillis||0,J=Z.error,X;if(Z.query?.parameters)try{X=JSON.stringify(Z.query.parameters)}catch{X="[]"}return{query:Y,durationMs:$,error:J,bindings:X}}function i7(Z,Y){let $=ZY.database?.queryLogging?.slowThreshold||100;if(Y)return"failed";if(Z>$)return"slow";return"completed"}async function a7(Z,Y,$,J,X){let W=ZY.database.default||"unknown",H=SZ(Z).normalized||Z,{trace:G,caller:z}=e7();return{query:Z,normalized_query:H,duration:Y,connection:W,status:$,error:J?String(J):void 0,executed_at:new Date().toISOString(),bindings:X,trace:G,...z,memory_usage:s7().heapUsed/1024/1024}}var o7=[/\b(?:sk|pk|rk|api|secret|token|bearer|password|pwd|key)[_-]?[A-Za-z0-9]{12,}/gi,/\bsk_(?:live|test)_[A-Za-z0-9]{20,}/g,/\bAKIA[0-9A-Z]{16}/g,/\b[A-Za-z0-9_-]{40,}\b(?=\s|$|['"])/g];function t7(Z){let Y=Z;for(let $ of o7)Y=Y.replace($,"<redacted>");return Y}function e7(){try{let Z=Error("Stack trace capture").stack||"",$=Z.split(`
12
- `).slice(1).find((X)=>!X.includes("query-logger.ts")),J={};if($){let X=$.match(/at (.+?) \(/),W=$.match(/\((.+?):(\d+):(\d+)\)/);if(X&&X[1]){let H=X[1].split(".");J={model:H.length>1?H[0]:void 0,method:H.length>1?H[1]:H[0]}}if(W&&W[1]&&W[2])J={...J,file:W[1],line:Number.parseInt(W[2],10)}}return{trace:t7(Z),caller:J}}catch{return{trace:"",caller:{}}}}async function Y8(Z){try{let{tables:Y,type:$}=SZ(Z.query);if(Z.affected_tables=JSON.stringify(Y||[]),$==="SELECT"&&ZY.database?.queryLogging?.analysis?.explainPlan){let X=await $8(Z.query);if(X){if(Z.explain_plan=X.plan,Z.indexes_used=JSON.stringify(X.indexesUsed||[]),Z.missing_indexes=JSON.stringify(X.missingIndexes||[]),ZY.database?.queryLogging?.analysis?.suggestions)Z.optimization_suggestions=JSON.stringify(J8(X,Z))}}let J=[$];if(Y&&Y.length>0)J.push(...Y.map((X)=>`table:${X}`));Z.tags=JSON.stringify(J)}catch(Y){pY.debug("Error during query analysis:",Y)}}var Z8=new Set(["sqlite","mysql","postgres"]);async function $8(Z){try{let Y=(await import("@stacksjs/config")).config?.database?.default,$=typeof Y==="string"?Y:"sqlite";if(!Z8.has($))return null;let J;if($==="mysql")J=`EXPLAIN FORMAT=JSON ${Z}`;else if($==="postgres")J=`EXPLAIN (FORMAT JSON) ${Z}`;else J=`EXPLAIN QUERY PLAN ${Z}`;let X=await A.unsafe?.(J);if(!X)return null;let W=Array.isArray(X)?X:X.rows??[],H=JSON.stringify(W),G=[],z=[];if($==="sqlite")for(let Q of W){let _=Q?.detail||"",U=_.match(/USING (?:COVERING )?INDEX (\w+)/i);if(U&&U[1])G.push(U[1]);else{let I=_.match(/^SCAN\s+(\w+)/i);if(I&&I[1])z.push(I[1])}}else if($==="mysql"){let Q=H;for(let _ of Q.matchAll(/"key"\s*:\s*"([^"]+)"/g))if(_[1])G.push(_[1]);for(let _ of Q.matchAll(/"table_name"\s*:\s*"([^"]+)"[^}]*"access_type"\s*:\s*"ALL"/g))if(_[1])z.push(_[1])}else if($==="postgres"){let Q=H;for(let _ of Q.matchAll(/"Index Name"\s*:\s*"([^"]+)"/g))if(_[1])G.push(_[1]);for(let _ of Q.matchAll(/"Node Type"\s*:\s*"Seq Scan"[^}]*"Relation Name"\s*:\s*"([^"]+)"/g))if(_[1])z.push(_[1])}return{plan:H.length>4000?`${H.slice(0,4000)}\u2026`:H,indexesUsed:Array.from(new Set(G)),missingIndexes:Array.from(new Set(z))}}catch(Y){return pY.debug("[query-logger] EXPLAIN failed (non-fatal):",Y),null}}function J8(Z,Y){let $=[];if(Z.missingIndexes&&Z.missingIndexes.length>0)$.push(`Consider adding index on ${Z.missingIndexes.join(", ")}`);if(Y.status==="slow"){if($.push("Consider optimizing this query to reduce execution time"),Y.query.toLowerCase().includes("select *"))$.push("Specify only needed columns instead of using SELECT *");if(!Y.query.toLowerCase().includes("limit"))$.push("Consider adding LIMIT clause to reduce result set size")}return $}async function X8(Z){try{await A.insertInto("query_logs").values(Z).execute()}catch(Y){pY.error("Failed to store query log:",Y)}}import{log as $Y}from"@stacksjs/logging";import{path as W8}from"@stacksjs/path";import{fs as K4}from"@stacksjs/storage";class j4{dependencies;async call(Z){await new Z().run()}}function H8(Z){let Y=new Set(Z.map((G)=>G.name)),$=new Map;for(let G of Z){let z=new Set;for(let Q of G.dependencies??[]){if(Q===G.name)continue;if(!Y.has(Q)){$Y.warn(`[seeder] ${G.name} depends on '${Q}' but no seeder by that name was discovered \u2014 ignoring`);continue}z.add(Q)}$.set(G.name,z)}let J=new Map,X=new Map;for(let G of Z)J.set(G.name,$.get(G.name).size),X.set(G.name,new Set);for(let G of Z)for(let z of $.get(G.name))X.get(z).add(G.name);let W=Z.filter((G)=>J.get(G.name)===0).map((G)=>G.name).sort(),H=[];while(W.length>0){let G=W.shift();H.push(G);let z=[];for(let Q of X.get(G)){let _=(J.get(Q)??0)-1;if(J.set(Q,_),_===0)z.push(Q)}if(z.length>0)W.push(...z),W.sort()}if(H.length!==Z.length){let G=Z.map((z)=>z.name).filter((z)=>!H.includes(z));throw Error(`[seeder] Cycle in seeder \`dependencies\` among: ${G.join(", ")}`)}return H}async function G8(Z={}){try{let{injectGlobalAutoImports:Q}=await import("@stacksjs/server");await Q()}catch{}let Y=Z.dir??W8.projectPath("database/seeders"),$=[],J=[];if(!K4.existsSync(Y))return $Y.info(`[seeder] No class seeders directory at ${Y}`),{ran:$,skipped:J};let X=K4.readdirSync(Y).filter((Q)=>Q.endsWith(".ts")&&!Q.startsWith("_")).sort(),W=[];for(let Q of X){let _=Q.replace(/\.ts$/,"");try{let U=await import(`${Y}/${Q}`),I=U.default??U[_];if(!I){$Y.warn(`[seeder] ${Q} has no default export`),J.push(_);continue}let O=new I;if(typeof O.run!=="function"){$Y.warn(`[seeder] ${_} does not implement run()`),J.push(_);continue}W.push({className:_,inst:O})}catch(U){$Y.error(`[seeder] ${_} failed to load:`,U),J.push(_)}}let H=W.some((Q)=>(Q.inst.dependencies?.length??0)>0),G;if(H)try{G=H8(W.map((Q)=>({name:Q.className,dependencies:Q.inst.dependencies})))}catch(Q){return $Y.error(Q instanceof Error?Q.message:String(Q)),{ran:$,skipped:[...J,...W.map((_)=>_.className)]}}else G=W.map((Q)=>Q.className);let z=new Map(W.map((Q)=>[Q.className,Q.inst]));for(let Q of G){if(Z.class&&Q!==Z.class){J.push(Q);continue}let _=z.get(Q);try{$Y.info(`[seeder] Running ${Q}\u2026`),await _.run(),$.push(Q)}catch(U){$Y.error(`[seeder] ${Q} failed:`,U),J.push(Q)}}return{ran:$,skipped:J}}async function z8(Z,Y,$,J){let{type:X,defaultValue:W,notNull:H=!1,batchSize:G=1000}=J,z=Z,Q=W===void 0?"":` DEFAULT ${S4(W)}`;if(await AY(z,`ALTER TABLE ${T(Y)} ADD COLUMN ${T($)} ${X}${Q}`),W!==void 0)await w4(Z,Y,$,W,G);if(H)await AY(z,`ALTER TABLE ${T(Y)} ALTER COLUMN ${T($)} SET NOT NULL`)}async function AY(Z,Y){if(typeof Z.unsafe==="function")return await Z.unsafe(Y)??{};return await PY`${PY.raw(Y)}`.execute(Z),{}}async function w4(Z,Y,$,J,X=1000){let W=Z,H=0,G=0;do{let z=`
13
- UPDATE ${T(Y)} SET ${T($)} = ${S4(J)}
14
- WHERE ${T($)} IS NULL
15
- AND ${R4(W)} IN (
16
- SELECT ${R4(W)} FROM ${T(Y)}
17
- WHERE ${T($)} IS NULL
18
- LIMIT ${X}
19
- )
20
- `,Q=await AY(W,z);H=Q.numAffectedRows!=null?Number(Q.numAffectedRows):0,G+=H}while(H>0)}async function U8(Z,Y,$,J,X){let W=Z;if(X.atomic){await AY(W,`ALTER TABLE ${T(Y)} RENAME COLUMN ${T($)} TO ${T(J)}`);return}await AY(W,`ALTER TABLE ${T(Y)} ADD COLUMN ${T(J)} ${X.type}`),await AY(W,`UPDATE ${T(Y)} SET ${T(J)} = ${T($)}`)}function T(Z){if(!/^[a-z_][a-z0-9_]*$/i.test(Z))throw Error(`Refusing to quote unsafe identifier: ${JSON.stringify(Z)}`);return`"${Z}"`}function S4(Z){if(Z===null)return"NULL";if(typeof Z==="number")return String(Z);if(typeof Z==="boolean")return Z?"TRUE":"FALSE";return`'${String(Z).replace(/'/g,"''")}'`}function R4(Z){return"id"}F();import{log as M}from"@stacksjs/logging";import{faker as FZ}from"@stacksjs/faker";import{path as cY}from"@stacksjs/path";import{hashMake as Q8}from"@stacksjs/security";import{fs as M4}from"@stacksjs/storage";function DZ(Z){return cY.frameworkPath(`defaults/app/Models/${Z||""}`)}var _8=Object.freeze(["OauthClient","OauthAccessToken","OauthRefreshToken","PersonalAccessToken"]);function O8(Z){return _8.includes(Z)}function xZ(Z){return Z.replace(/([A-Z]+)([A-Z][a-z])/g,"$1_$2").replace(/([a-z\d])([A-Z])/g,"$1_$2").replace(/(\d)([A-Za-z])/g,"$1_$2").toLowerCase()}async function CY(Z,Y=!1){let $=[];if(!M4.existsSync(Z))return $;let J=M4.readdirSync(Z,{withFileTypes:!0});for(let X of J){let W=cY.join(Z,X.name);if(X.isDirectory()&&Y){let H=await CY(W,!0);$.push(...H);continue}if(!X.name.endsWith(".ts")||X.name.startsWith("index")||X.name.startsWith("_"))continue;try{let H=await import(W),G=H.default||H;if(!G)continue;let z=G.traits?.useSeeder??G.traits?.seedable;if(!z)continue;let Q=10,_=[];if(typeof z==="object"&&"count"in z){let O=z;Q=O.count,_=O.fixtures??[]}let U=G.name||X.name.replace(".ts",""),I=G.table||xZ(U)+"s";$.push({name:U,table:I,count:Math.max(Q,_.length),fixtures:_,attributes:G.attributes||{},model:G,filePath:W})}catch(H){M.error(`Failed to load model ${X.name}:`,H)}}return $}async function F4(Z,Y=!1,$=!1){let J=DZ(),X=await CY(Z,!1);if(X.length>0&&!$)return X;let W=await CY(J,!0),H=new Map;for(let G of W)H.set(G.name,G);for(let G of X){if(H.has(G.name)&&Y)M.info(` User model "${G.name}" overrides default`);H.set(G.name,G)}return Array.from(H.values())}function A8(Z,Y){let $=Z.toLowerCase();if($==="password"||$.endsWith("_password")||$.endsWith("password"))return!0;if(Y.hidden===!0&&$.includes("pass"))return!0;return!1}async function B8(Z,Y,$=!1){let J={};for(let[X,W]of Object.entries(Z)){let H=xZ(X),G;if(W.factory&&typeof W.factory==="function")try{G=W.factory(FZ)}catch(z){let Q=z instanceof Error?z.message:String(z);if($)M.warn(` Factory failed for ${Y}.${X}: ${Q}`);if(W.default!==void 0)G=W.default;else G=V8(X)}else if(W.default!==void 0)G=W.default;else continue;if(A8(X,W)&&typeof G==="string")try{G=await Q8(G,{algorithm:"bcrypt"})}catch(z){let Q=z instanceof Error?z.message:String(z);if($)M.warn(` Failed to hash password for ${Y}.${X}: ${Q}`)}J[H]=G}return J}function V8(Z){let Y=Z.toLowerCase();if(Y.startsWith("is")||Y.startsWith("has")||Y.endsWith("able"))return!1;if(Y.includes("count")||Y.includes("amount")||Y.includes("quantity"))return 0;if(Y.includes("url")||Y.includes("link"))return"https://example.com";if(Y.includes("email"))return FZ.internet.email();if(Y.includes("name"))return FZ.person.fullName();return null}function L8(Z){let Y={};for(let[$,J]of Object.entries(Z))Y[xZ($)]=J;return Y}async function E8(Z,Y=!1){let $=[];for(let J=0;J<Z.count;J++){let X=await B8(Z.attributes,Z.name,Y&&J===0),W=Z.fixtures[J];$.push(W?{...X,...L8(W)}:X)}return $}function D4(Z,Y){return qZ(Z,Y)}async function qZ(Z,Y){let $=Date.now();try{try{await A.selectFrom(Z.table).limit(0).execute()}catch(H){let G=H?.message||"";if(G.includes("does not exist")||G.includes("no such table")||G.includes("doesn't exist"))return M.info(` Skipping ${Z.name}: table "${Z.table}" does not exist`),{model:Z.name,table:Z.table,count:0,success:!0,duration:Date.now()-$};throw H}if(!Y.fresh){if(await A.selectFrom(Z.table).selectAll().limit(1).executeTakeFirst()){if(Y.verbose)M.info(` ${Z.name}: table already has rows \u2014 skipping (use --fresh to replace)`);return{model:Z.name,table:Z.table,count:0,success:!0,duration:Date.now()-$}}}let J=await E8(Z,Y.verbose);if(J.length===0)return{model:Z.name,table:Z.table,count:0,success:!0,duration:Date.now()-$};if(Y.fresh)try{if(await A.deleteFrom(Z.table).execute(),Y.verbose)M.info(` Truncated table: ${Z.table}`)}catch{}let X=100,W=0;for(let H=0;H<J.length;H+=X){let G=J.slice(H,H+X);await A.insertInto(Z.table).values(G).execute(),W+=G.length}if(Y.verbose)M.success(` Seeded ${Z.name}: ${W} records`);return{model:Z.name,table:Z.table,count:W,success:!0,duration:Date.now()-$}}catch(J){let X=J instanceof Error?J.message:String(J);if(Y.verbose)M.error(` Failed to seed ${Z.name}: ${X}`);return{model:Z.name,table:Z.table,count:0,success:!1,error:X,duration:Date.now()-$}}}function I8(Z){let Y={User:0,Team:1,Project:2};return Z.sort(($,J)=>{let X=Y[$.name]??10,W=Y[J.name]??10;return X-W})}async function K8(Z={}){let Y=Date.now();await AZ();let $=Z.modelsDir||cY.userModelsPath(),J=Z.verbose??!0;if(J)M.info("Seeding database using model factories..."),M.info(`User models directory: ${$}`),M.info(`Default models directory: ${DZ()}`);let X=await F4($,J,Z.includeDefaults??!1);if(X.length===0)return M.warn("No seedable models found in defaults or user directories"),{total:0,successful:0,failed:0,results:[],duration:Date.now()-Y};if(M.warn(`[seed] The \`useSeeder\` trait + auto-walker is deprecated (stacksjs/stacks#1919, #1929). Run \`./buddy seed:scaffold\` to generate a class seeder per \`useSeeder\` model AND strip the trait from the model in one pass. The walker + trait are scheduled for removal in the next major. Affected: ${X.map((Q)=>Q.name).join(", ")}`),Z.only&&Z.only.length>0)X=X.filter((Q)=>Z.only.includes(Q.name));if(Z.except&&Z.except.length>0)X=X.filter((Q)=>!Z.except.includes(Q.name));if(!Z.fresh&&!Z.allowProtected){let Q=[];if(X=X.filter((_)=>{if(O8(_.name))return Q.push(_),!1;return!0}),Q.length>0)M.info(`Skipped ${Q.length} protected auth model(s) to avoid invalidating live sessions: ${Q.map((_)=>_.name).join(", ")}`),M.info(" Re-run with --fresh (truncates tables first) or --allow-protected to include them.")}if(X=I8(X),J)M.info(`Found ${X.length} seedable model(s)`);let W=[];for(let Q of X){if(J)M.info(`Seeding ${Q.name} (${Q.count} records)...`);try{let _=await qZ(Q,Z);W.push(_)}catch(_){let U=_ instanceof Error?_.message:String(_);if(J)M.error(` Unexpected error seeding ${Q.name}: ${U}`);W.push({model:Q.name,table:Q.table,count:0,success:!1,error:U,duration:0})}}let H=W.filter((Q)=>Q.success).length,G=W.filter((Q)=>!Q.success).length,z=W.reduce((Q,_)=>Q+_.count,0);if(J)if(M.info(""),G===0)M.success("Database seeded successfully!"),M.info(` Total records: ${z}`),M.info(` Models seeded: ${H}`);else M.warn(`Seeding completed with ${G} failure(s)`),M.info(` Successful: ${H}`),M.info(` Failed: ${G}`);return{total:W.length,successful:H,failed:G,results:W,duration:Date.now()-Y}}async function N5(Z,Y={}){let $=cY.userModelsPath(),X=(await F4($,Y.verbose)).find((W)=>W.name===Z);if(!X)throw Error(`Model not found: ${Z}`);if(Y.count)X.count=Y.count;return qZ(X,{fresh:Y.fresh,verbose:Y.verbose??!0})}async function y5(Z={}){return K8({...Z,fresh:!0})}async function h5(){let Z=cY.userModelsPath(),Y=DZ(),$=await CY(Y,!0),J=await CY(Z,!1),X=[],W=new Set;for(let H of J)X.push({name:H.name,table:H.table,count:H.count,source:"user"}),W.add(H.name);for(let H of $)if(!W.has(H.name))X.push({name:H.name,table:H.table,count:H.count,source:"default"});return X}import{log as j8}from"@stacksjs/logging";function R8(Z){if(Z&&typeof Z==="object"){let Y=Z;if(Y._definition&&typeof Y._definition==="object"&&"name"in Y._definition)return Y._definition;if("name"in Y&&(("attributes"in Y)||("table"in Y)||("traits"in Y)))return Y}throw Error("factory.generate: expected a Stacks model (the default export of app/Models/*.ts, or a defineModel() return value). Got something without a `.name` field.")}function q4(Z){return Z.replace(/([A-Z]+)([A-Z][a-z])/g,"$1_$2").replace(/([a-z\d])([A-Z])/g,"$1_$2").replace(/(\d)([A-Za-z])/g,"$1_$2").toLowerCase()}function x4(Z){let Y={};for(let[$,J]of Object.entries(Z))Y[q4($)]=J;return Y}function w8(Z,Y={}){let $=R8(Z),J=$.name,X=$.attributes??{},W=$.traits?.useSeeder,H=W&&typeof W==="object"?W:void 0,G=Y.count??H?.count??10,z=Y.with?x4(Y.with):void 0,Q=Y.rows??H?.fixtures??[],_=Math.max(G,Q.length),U=[];for(let O=0;O<_;O++){let L=Q[O];if(!z&&!L)continue;U[O]={...z??{},...L?x4(L):{}}}let I=$.table??`${q4(J)}s`;return{name:J,table:I,count:_,fixtures:U,attributes:X,model:$}}async function T4(Z,Y={}){let $=w8(Z,Y);try{return await D4({...$,filePath:""},{fresh:Y.fresh,verbose:Y.verbose??!1})}catch(J){let X=J instanceof Error?J.message:String(J);throw j8.error(`[factory] generate(${$.name}) failed: ${X}`),J}}var S8={generate:T4};import{log as TZ}from"@stacksjs/logging";import{path as uY}from"@stacksjs/path";import{fs as n}from"@stacksjs/storage";function M8(Z){let Y=Z,$=!1,J=!1;for(let X of["useSeeder","seedable"]){let H=new RegExp(`\\b${X}\\s*:`).exec(Y);if(!H)continue;let G=H.index,z=G+H[0].length;while(z<Y.length&&/\s/.test(Y[z]))z++;if(Y[z]==="{"){let I=0,O=null;for(;z<Y.length;z++){let L=Y[z];if(O){if(L==="\\"){z++;continue}if(L===O)O=null;continue}if(L==='"'||L==="'"||L==="`"){O=L;continue}if(L==="{")I++;else if(L==="}"){if(I--,I===0){z++;break}}}}else if(Y.startsWith("true",z)||Y.startsWith("false",z))z+=Y.startsWith("true",z)?4:5;else{J=!0;continue}let _=z;while(_<Y.length&&(Y[_]===" "||Y[_]==="\t"))_++;if(Y[_]===",")_++;while(_<Y.length&&(Y[_]===" "||Y[_]==="\t"))_++;if(Y[_]==="/"&&Y[_+1]==="/")while(_<Y.length&&Y[_]!==`
21
- `)_++;let U=G;while(U>0&&(Y[U-1]===" "||Y[U-1]==="\t"))U--;if(U>0&&Y[U-1]===`
22
- `&&Y[_]===`
23
- `)_++;Y=Y.slice(0,U)+Y.slice(_),$=!0}return{source:Y,changed:$,skipped:J&&!$}}var P4=(Z,Y,$)=>`import { factory, Seeder } from '@stacksjs/database'
24
- import ${Z} from '${Y}'
25
-
26
- export default class ${Z}Seeder extends Seeder {
27
- async run(): Promise<void> {
28
- await factory.generate(${Z}, { count: ${$} })
29
- }
30
- }
31
- `;function F8(Z,Y){let J=uY.relative(Z,Y).replace(/\\/g,"/").replace(/\.ts$/,"");return J.startsWith(".")?J:`./${J}`}async function D8(Z={}){let Y=Z.modelsDir??uY.userModelsPath(),$=Z.seedersDir??uY.projectPath("database/seeders"),J={generated:[],skipped:[],errors:[],strippedTrait:[],traitStripSkipped:[]};if(!n.existsSync(Y))return TZ.warn(`[seed:scaffold] No models directory at ${Y}`),J;if(!Z.dryRun&&!n.existsSync($))n.mkdirSync($,{recursive:!0});let X=n.readdirSync(Y,{withFileTypes:!0});for(let W of X){if(!W.isFile()||!W.name.endsWith(".ts"))continue;if(W.name.startsWith("_")||W.name.startsWith("index"))continue;let H=uY.join(Y,W.name),G;try{let O=await import(H);G=O.default||O}catch(O){J.errors.push({model:W.name,error:O.message});continue}if(!G||!G.name){J.errors.push({model:W.name,error:"missing default export with `name` field"});continue}let z=G.traits?.useSeeder??G.traits?.seedable;if(!z){J.skipped.push({model:G.name,file:"",reason:"no-useseeder"});continue}let Q=typeof z==="object"&&"count"in z?z.count:10,_=`${G.name}Seeder.ts`,U=uY.join($,_);if(n.existsSync(U)&&!Z.force)J.skipped.push({model:G.name,file:U,reason:"already-exists"});else{let O=F8($,H),L=P4(G.name,O,Q);if(Z.dryRun)TZ.info(`[seed:scaffold] would write ${U}`);else n.writeFileSync(U,L,"utf-8");J.generated.push({model:G.name,file:U})}try{let O=n.readFileSync(H,"utf-8"),{source:L,changed:B,skipped:E}=M8(O);if(B){if(Z.dryRun)TZ.info(`[seed:scaffold] would strip useSeeder trait from ${H}`);else n.writeFileSync(H,L,"utf-8");J.strippedTrait.push({model:G.name,file:H})}else if(E)J.traitStripSkipped.push({model:G.name,file:H})}catch(O){J.errors.push({model:G.name,error:`trait strip failed: ${O.message}`})}}return J}function x8(Z,Y,$){return P4(Z,Y,$)}F();import{log as c4}from"@stacksjs/logging";import{getTableName as q8}from"@stacksjs/orm";import{path as i}from"@stacksjs/path";import{fs as BY,globSync as u4}from"@stacksjs/storage";import{plural as T8,snakeCase as P8}from"@stacksjs/strings";function k4(Z){return Z.name==="string"}function N4(Z){return Z.name==="number"}function y4(Z){return Z.name==="enum"}function h4(Z){return Z.name==="boolean"}function v4(Z){return Z.name==="date"}function f4(Z){return Z.name==="unix"}function b4(Z){return Z.name==="float"}function p4(Z){return Z.name==="datetime"}function C4(Z){return Z.name==="timestamp"}async function VY(){let Z=await BY.promises.readdir(i.userMigrationsPath());if(Z.length){for(let Y of Z)if(Y.endsWith(".ts")){let $=i.userMigrationsPath(`${Y}`);if(BY.existsSync($))await Bun.$`rm ${$}`}}}async function LY(){let Z=i.frameworkPath("cache/models");if(!BY.existsSync(Z))return;let Y=await BY.promises.readdir(Z);if(Y.length){for(let $ of Y)if($.endsWith(".ts")){let J=i.frameworkPath(`cache/models/${$}`);if(BY.existsSync(J))await Bun.$`rm ${J}`}}}async function s(Z){let $=(await import(i.frameworkPath(`cache/models/${Z}`))).default,J={};if(typeof $.attributes==="object")J=$.attributes;else try{J=JSON.parse($.attributes||"{}")}catch{J={}}return J}async function o5(Z){if(typeof Z==="string")Z=(await import(Z)).default;return Z.table??P8(T8(Z?.name||""))}async function JY(Z){return c4.debug(`hasTableBeenMigrated for table: ${Z}`),(await k8()).some(($)=>$.name.includes(Z))}async function x(Z){return c4.debug(`hasTableBeenMigrated for table: ${Z}`),u4([i.userMigrationsPath("*.ts")],{absolute:!0}).some(($)=>$.includes(`create-${Z}`))}async function k8(){try{return await A.selectFrom("migrations").select("name").execute()}catch(Z){if(Z?.message.includes("no such table: migrations"))return console.warn("Migrations table does not exist, returning empty list."),[];return[]}}function PZ(Z){if("getRules"in Z){let Y=Z.getRules().find(($)=>$.name==="max");return Y?.params?.length||Y?.params?.max||255}return 255}function N8(Z,Y="mysql"){if(Y==="sqlite")return"'text'";return`'varchar(${PZ(Z)})'`}function t5(Z,Y="mysql"){if(Y==="sqlite")return"'text'";let $=Z.name;if($==="unix")return"'bigint'";return $||"date"}function e5(Z,Y){return Z.min===Y.min&&Z.max===Y.max}async function EY(Z){return(await BY.promises.readdir(i.userMigrationsPath())).some(($)=>{let J=Z.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return new RegExp(`(-${J}-)`).test($)})}function IY(Z,Y){let $=Z.filter((X)=>!Y.includes(X)),J=Y.filter((X)=>!Z.includes(X));if($.length===0&&J.length===0)return null;return{added:J,removed:$}}function XY(Z){if(!Z)return[];let Y=Object.entries(Z);return Y.sort(([$,J],[X,W])=>{let H=J.order??Number.POSITIVE_INFINITY,G=W.order??Number.POSITIVE_INFINITY;return H-G}),Y}function KY(Z,Y){if(!Z||!Y)return!1;if(Z.length!==Y.length)return!1;for(let $=0;$<Z.length;$++)if(Z[$]!==Y[$])return!1;return!0}function jY(Z,Y){let $=[];for(let J in Z)if(Object.prototype.hasOwnProperty.call(Z,J)&&Object.prototype.hasOwnProperty.call(Y,J)){let X=PZ(Z[J].validation.rule),W=PZ(Y[J].validation.rule);if(X!==void 0&&W!==void 0){if(X!==W)$.push({key:J,max:W,min:W})}}return $}async function ZZ(){let Z=u4([i.userModelsPath("*.ts"),i.storagePath("framework/defaults/app/Models/**/*.ts")],{absolute:!0}),Y=[];for(let $ of Z){let J=(await import($)).default,X=q8(J,$),W=UY(J,X);if(W)Y.push(W);Y.push(X)}return Y}function UY(Z,Y){let $=`${Y}_likes`,J=Z.traits;if(!J?.likeable)return;return typeof J.likeable==="object"?J.likeable.table||$:$}function RY(Z,Y){let $=Z.traits?.likeable;if($&&typeof $==="object"&&!Array.isArray($)&&$.foreignKey)return $.foreignKey;return`${Y.replace(/s$/,"")}_id`}function y8(Z,Y="mysql"){if(Y==="sqlite")return"'integer'";if("getRules"in Z){let $=Z.getRules().find((H)=>H.name==="min"),J=Z.getRules().find((H)=>H.name==="max"),X=$?.params?.min??-2147483648,W=J?.params?.max??2147483647;return X>=-2147483648&&W<=2147483647?"'integer'":"'bigint'"}return"'integer'"}function h8(Z,Y="mysql"){let $=Z.getAllowedValues();if(!$)throw Error("Enum rule found but no allowedValues defined");let J=$.map((X)=>`'${X}'`).join(", ");if(Y==="postgres")return"'varchar(255)'";if(Y==="sqlite")return"'text'";return`sql\`enum(${J})\``}function WY(Z,Y="mysql"){if(y4(Z))return h8(Z,Y);if(k4(Z))return N8(Z,Y);if(N4(Z))return y8(Z,Y);if(h4(Z))return"'boolean'";if(v4(Z))return"'date'";if(p4(Z))return Y==="postgres"?"'timestamp'":"'datetime'";if(f4(Z))return"'bigint'";if(C4(Z))return"'timestamp'";if(b4(Z))return"'float4'";if(["array","object"].includes(Z.name))return Y==="sqlite"?"'text'":"'json'";if(Y==="sqlite")return"'text'";return Y==="mysql"?"'varchar(255)'":"'text'"}function Y1(Z){return Z.includes(".required()")}F();import{log as l}from"@stacksjs/logging";import{log as g4}from"@stacksjs/logging";import{path as m4}from"@stacksjs/path";function d4(Z){return`\x1B[3m${Z}\x1B[23m`}async function $Z(){if(await x("password_resets"))return;let Y=`import type { Database } from '@stacksjs/database'
11
+ `;pZ(G,S),R.debug(`[migration] Wrote ${E} (${Q.length} stmt${Q.length===1?"":"s"})`),z+=1,H+=1}return z}function F1(Z){let Y=new Map,$=(X,J)=>{let W=Y.get(X)??[];W.push(J),Y.set(X,W)};for(let X of Z){let J=X.trim();if(!J)continue;let W=J.match(/^\s*CREATE\s+TABLE\s+(?:IF\s+NOT\s+EXISTS\s+)?["`]?(\w+)["`]?/i);if(W){$(`create-${W[1]}-table`,J);continue}let z=J.match(/^\s*ALTER\s+TABLE\s+["`]?(\w+)["`]?\s+(?:ADD\s+COLUMN\s+["`]?(\w+)["`]?|DROP\s+COLUMN\s+["`]?(\w+)["`]?|ADD\s+CONSTRAINT)/i);if(z){$(`alter-${z[1]}-${z[2]||z[3]||"constraint"}`,J);continue}let H=J.match(/^\s*CREATE\s+(?:UNIQUE\s+)?INDEX\s+(?:IF\s+NOT\s+EXISTS\s+)?["`]?(\w+)["`]?\s+ON\s+["`]?(\w+)["`]?/i);if(H){$(`create-${H[1]}-index-in-${H[2]}`,J);continue}let I=J.match(/^\s*DROP\s+TABLE\s+(?:IF\s+EXISTS\s+)?["`]?(\w+)["`]?/i);if(I){$(`drop-${I[1]}-table`,J);continue}$("auto-misc",J)}return[...Y.entries()].map(([X,J])=>({label:X,statements:J}))}function T1(Z){let Y=0;try{for(let $ of FY(Z)){let X=$.match(/^(\d+)-/);if(X?.[1])Y=Math.max(Y,Number.parseInt(X[1],10))}}catch{}return Y+1}async function p5(){try{R.info("Generating fresh migrations..."),wY();let Z=r(),{modelsDir:Y,skip:$}=ZZ();if($)return R.info("No app/Models directory found; using committed framework migrations"),$Y("Migrations generated");return await tY(Y,{dialect:YZ(),full:!0,dryRun:!0}),R.success("Migrations generated"),$Y("Migrations generated")}catch(Z){return TY(PY("Fresh migration generation failed",Z))}}D();import{log as j}from"@stacksjs/logging";import{faker as $Z}from"@stacksjs/faker";import{path as xY}from"@stacksjs/path";import{hashMake as P1}from"@stacksjs/security";import{fs as dZ}from"@stacksjs/storage";function XZ(Z){return xY.frameworkPath(`defaults/app/Models/${Z||""}`)}var N1=Object.freeze(["OauthClient","OauthAccessToken","OauthRefreshToken","PersonalAccessToken"]);function v1(Z){return N1.includes(Z)}function JZ(Z){return Z.replace(/([A-Z]+)([A-Z][a-z])/g,"$1_$2").replace(/([a-z\d])([A-Z])/g,"$1_$2").replace(/(\d)([A-Za-z])/g,"$1_$2").toLowerCase()}async function SY(Z,Y=!1){let $=[];if(!dZ.existsSync(Z))return $;let X=dZ.readdirSync(Z,{withFileTypes:!0});for(let J of X){let W=xY.join(Z,J.name);if(J.isDirectory()&&Y){let z=await SY(W,!0);$.push(...z);continue}if(!J.name.endsWith(".ts")||J.name.startsWith("index")||J.name.startsWith("_"))continue;try{let z=await import(W),H=z.default||z;if(!H)continue;let I=H.traits?.useSeeder??H.traits?.seedable;if(!I)continue;let Q=10,E=[];if(typeof I==="object"&&"count"in I){let U=I;Q=U.count,E=U.fixtures??[]}let G=H.name||J.name.replace(".ts",""),S=H.table||JZ(G)+"s";$.push({name:G,table:S,count:Math.max(Q,E.length),fixtures:E,attributes:H.attributes||{},model:H,filePath:W})}catch(z){j.error(`Failed to load model ${J.name}:`,z)}}return $}async function gZ(Z,Y=!1,$=!1){let X=XZ(),J=await SY(Z,!1);if(J.length>0&&!$)return J;let W=await SY(X,!0),z=new Map;for(let H of W)z.set(H.name,H);for(let H of J){if(z.has(H.name)&&Y)j.info(` User model "${H.name}" overrides default`);z.set(H.name,H)}return Array.from(z.values())}function f1(Z,Y){let $=Z.toLowerCase();if($==="password"||$.endsWith("_password")||$.endsWith("password"))return!0;if(Y.hidden===!0&&$.includes("pass"))return!0;return!1}async function h1(Z,Y,$=!1){let X={};for(let[J,W]of Object.entries(Z)){let z=JZ(J),H;if(W.factory&&typeof W.factory==="function")try{H=W.factory($Z)}catch(I){let Q=I instanceof Error?I.message:String(I);if($)j.warn(` Factory failed for ${Y}.${J}: ${Q}`);if(W.default!==void 0)H=W.default;else H=p1(J)}else if(W.default!==void 0)H=W.default;else continue;if(f1(J,W)&&typeof H==="string")try{H=await P1(H,{algorithm:"bcrypt"})}catch(I){let Q=I instanceof Error?I.message:String(I);if($)j.warn(` Failed to hash password for ${Y}.${J}: ${Q}`)}X[z]=H}return X}function p1(Z){let Y=Z.toLowerCase();if(Y.startsWith("is")||Y.startsWith("has")||Y.endsWith("able"))return!1;if(Y.includes("count")||Y.includes("amount")||Y.includes("quantity"))return 0;if(Y.includes("url")||Y.includes("link"))return"https://example.com";if(Y.includes("email"))return $Z.internet.email();if(Y.includes("name"))return $Z.person.fullName();return null}function u1(Z){let Y={};for(let[$,X]of Object.entries(Z))Y[JZ($)]=X;return Y}async function c1(Z,Y=!1){let $=[];for(let X=0;X<Z.count;X++){let J=await h1(Z.attributes,Z.name,Y&&X===0),W=Z.fixtures[X];$.push(W?{...J,...u1(W)}:J)}return $}function m5(Z,Y){return WZ(Z,Y)}async function WZ(Z,Y){let $=Date.now();try{try{await K.selectFrom(Z.table).limit(0).execute()}catch(z){let H=z?.message||"";if(H.includes("does not exist")||H.includes("no such table")||H.includes("doesn't exist"))return j.info(` Skipping ${Z.name}: table "${Z.table}" does not exist`),{model:Z.name,table:Z.table,count:0,success:!0,duration:Date.now()-$};throw z}if(!Y.fresh){if(await K.selectFrom(Z.table).selectAll().limit(1).executeTakeFirst()){if(Y.verbose)j.info(` ${Z.name}: table already has rows \u2014 skipping (use --fresh to replace)`);return{model:Z.name,table:Z.table,count:0,success:!0,duration:Date.now()-$}}}let X=await c1(Z,Y.verbose);if(X.length===0)return{model:Z.name,table:Z.table,count:0,success:!0,duration:Date.now()-$};if(Y.fresh)try{if(await K.deleteFrom(Z.table).execute(),Y.verbose)j.info(` Truncated table: ${Z.table}`)}catch{}let J=100,W=0;for(let z=0;z<X.length;z+=J){let H=X.slice(z,z+J);await K.insertInto(Z.table).values(H).execute(),W+=H.length}if(Y.verbose)j.success(` Seeded ${Z.name}: ${W} records`);return{model:Z.name,table:Z.table,count:W,success:!0,duration:Date.now()-$}}catch(X){let J=X instanceof Error?X.message:String(X);if(Y.verbose)j.error(` Failed to seed ${Z.name}: ${J}`);return{model:Z.name,table:Z.table,count:0,success:!1,error:J,duration:Date.now()-$}}}function b1(Z){let Y={User:0,Team:1,Project:2};return Z.sort(($,X)=>{let J=Y[$.name]??10,W=Y[X.name]??10;return J-W})}async function C1(Z={}){let Y=Date.now();await lY();let $=Z.modelsDir||xY.userModelsPath(),X=Z.verbose??!0;if(X)j.info("Seeding database using model factories..."),j.info(`User models directory: ${$}`),j.info(`Default models directory: ${XZ()}`);let J=await gZ($,X,Z.includeDefaults??!1);if(J.length===0)return j.warn("No seedable models found in defaults or user directories"),{total:0,successful:0,failed:0,results:[],duration:Date.now()-Y};if(j.warn(`[seed] The \`useSeeder\` trait + auto-walker is deprecated (stacksjs/stacks#1919, #1929). Run \`./buddy seed:scaffold\` to generate a class seeder per \`useSeeder\` model AND strip the trait from the model in one pass. The walker + trait are scheduled for removal in the next major. Affected: ${J.map((Q)=>Q.name).join(", ")}`),Z.only&&Z.only.length>0)J=J.filter((Q)=>Z.only.includes(Q.name));if(Z.except&&Z.except.length>0)J=J.filter((Q)=>!Z.except.includes(Q.name));if(!Z.fresh&&!Z.allowProtected){let Q=[];if(J=J.filter((E)=>{if(v1(E.name))return Q.push(E),!1;return!0}),Q.length>0)j.info(`Skipped ${Q.length} protected auth model(s) to avoid invalidating live sessions: ${Q.map((E)=>E.name).join(", ")}`),j.info(" Re-run with --fresh (truncates tables first) or --allow-protected to include them.")}if(J=b1(J),X)j.info(`Found ${J.length} seedable model(s)`);let W=[];for(let Q of J){if(X)j.info(`Seeding ${Q.name} (${Q.count} records)...`);try{let E=await WZ(Q,Z);W.push(E)}catch(E){let G=E instanceof Error?E.message:String(E);if(X)j.error(` Unexpected error seeding ${Q.name}: ${G}`);W.push({model:Q.name,table:Q.table,count:0,success:!1,error:G,duration:0})}}let z=W.filter((Q)=>Q.success).length,H=W.filter((Q)=>!Q.success).length,I=W.reduce((Q,E)=>Q+E.count,0);if(X)if(j.info(""),H===0)j.success("Database seeded successfully!"),j.info(` Total records: ${I}`),j.info(` Models seeded: ${z}`);else j.warn(`Seeding completed with ${H} failure(s)`),j.info(` Successful: ${z}`),j.info(` Failed: ${H}`);return{total:W.length,successful:z,failed:H,results:W,duration:Date.now()-Y}}async function l5(Z,Y={}){let $=xY.userModelsPath(),J=(await gZ($,Y.verbose)).find((W)=>W.name===Z);if(!J)throw Error(`Model not found: ${Z}`);if(Y.count)J.count=Y.count;return WZ(J,{fresh:Y.fresh,verbose:Y.verbose??!0})}async function r5(Z={}){return C1({...Z,fresh:!0})}async function a5(){let Z=xY.userModelsPath(),Y=XZ(),$=await SY(Y,!0),X=await SY(Z,!1),J=[],W=new Set;for(let z of X)J.push({name:z.name,table:z.table,count:z.count,source:"user"}),W.add(z.name);for(let z of $)if(!W.has(z.name))J.push({name:z.name,table:z.table,count:z.count,source:"default"});return J}D();import{log as tZ}from"@stacksjs/logging";import{getTableName as d1}from"@stacksjs/orm";import{path as g}from"@stacksjs/path";import{fs as XY,globSync as Y0}from"@stacksjs/storage";import{plural as g1,snakeCase as s1}from"@stacksjs/strings";function sZ(Z){return Z.name==="string"}function mZ(Z){return Z.name==="number"}function lZ(Z){return Z.name==="enum"}function rZ(Z){return Z.name==="boolean"}function aZ(Z){return Z.name==="date"}function nZ(Z){return Z.name==="unix"}function oZ(Z){return Z.name==="float"}function iZ(Z){return Z.name==="datetime"}function eZ(Z){return Z.name==="timestamp"}async function JY(){let Z=await XY.promises.readdir(g.userMigrationsPath());if(Z.length){for(let Y of Z)if(Y.endsWith(".ts")){let $=g.userMigrationsPath(`${Y}`);if(XY.existsSync($))await Bun.$`rm ${$}`}}}async function WY(){let Z=g.frameworkPath("cache/models");if(!XY.existsSync(Z))return;let Y=await XY.promises.readdir(Z);if(Y.length){for(let $ of Y)if($.endsWith(".ts")){let X=g.frameworkPath(`cache/models/${$}`);if(XY.existsSync(X))await Bun.$`rm ${X}`}}}async function c(Z){let $=(await import(g.frameworkPath(`cache/models/${Z}`))).default,X={};if(typeof $.attributes==="object")X=$.attributes;else try{X=JSON.parse($.attributes||"{}")}catch{X={}}return X}async function J6(Z){if(typeof Z==="string")Z=(await import(Z)).default;return Z.table??s1(g1(Z?.name||""))}async function a(Z){return tZ.debug(`hasTableBeenMigrated for table: ${Z}`),(await m1()).some(($)=>$.name.includes(Z))}async function q(Z){return tZ.debug(`hasTableBeenMigrated for table: ${Z}`),Y0([g.userMigrationsPath("*.ts")],{absolute:!0}).some(($)=>$.includes(`create-${Z}`))}async function m1(){try{return await K.selectFrom("migrations").select("name").execute()}catch(Z){if(Z?.message.includes("no such table: migrations"))return console.warn("Migrations table does not exist, returning empty list."),[];return[]}}function zZ(Z){if("getRules"in Z){let Y=Z.getRules().find(($)=>$.name==="max");return Y?.params?.length||Y?.params?.max||255}return 255}function l1(Z,Y="mysql"){if(Y==="sqlite")return"'text'";return`'varchar(${zZ(Z)})'`}function W6(Z,Y="mysql"){if(Y==="sqlite")return"'text'";let $=Z.name;if($==="unix")return"'bigint'";return $||"date"}function z6(Z,Y){return Z.min===Y.min&&Z.max===Y.max}async function zY(Z){return(await XY.promises.readdir(g.userMigrationsPath())).some(($)=>{let X=Z.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return new RegExp(`(-${X}-)`).test($)})}function GY(Z,Y){let $=Z.filter((J)=>!Y.includes(J)),X=Y.filter((J)=>!Z.includes(J));if($.length===0&&X.length===0)return null;return{added:X,removed:$}}function n(Z){if(!Z)return[];let Y=Object.entries(Z);return Y.sort(([$,X],[J,W])=>{let z=X.order??Number.POSITIVE_INFINITY,H=W.order??Number.POSITIVE_INFINITY;return z-H}),Y}function HY(Z,Y){if(!Z||!Y)return!1;if(Z.length!==Y.length)return!1;for(let $=0;$<Z.length;$++)if(Z[$]!==Y[$])return!1;return!0}function UY(Z,Y){let $=[];for(let X in Z)if(Object.prototype.hasOwnProperty.call(Z,X)&&Object.prototype.hasOwnProperty.call(Y,X)){let J=zZ(Z[X].validation.rule),W=zZ(Y[X].validation.rule);if(J!==void 0&&W!==void 0){if(J!==W)$.push({key:X,max:W,min:W})}}return $}async function vY(){let Z=Y0([g.userModelsPath("*.ts"),g.storagePath("framework/defaults/app/Models/**/*.ts")],{absolute:!0}),Y=[];for(let $ of Z){let X=(await import($)).default,J=d1(X,$),W=t(X,J);if(W)Y.push(W);Y.push(J)}return Y}function t(Z,Y){let $=`${Y}_likes`,X=Z.traits;if(!X?.likeable)return;return typeof X.likeable==="object"?X.likeable.table||$:$}function QY(Z,Y){let $=Z.traits?.likeable;if($&&typeof $==="object"&&!Array.isArray($)&&$.foreignKey)return $.foreignKey;return`${Y.replace(/s$/,"")}_id`}function r1(Z,Y="mysql"){if(Y==="sqlite")return"'integer'";if("getRules"in Z){let $=Z.getRules().find((z)=>z.name==="min"),X=Z.getRules().find((z)=>z.name==="max"),J=$?.params?.min??-2147483648,W=X?.params?.max??2147483647;return J>=-2147483648&&W<=2147483647?"'integer'":"'bigint'"}return"'integer'"}function a1(Z,Y="mysql"){let $=Z.getAllowedValues();if(!$)throw Error("Enum rule found but no allowedValues defined");let X=$.map((J)=>`'${J}'`).join(", ");if(Y==="postgres")return"'varchar(255)'";if(Y==="sqlite")return"'text'";return`sql\`enum(${X})\``}function o(Z,Y="mysql"){if(lZ(Z))return a1(Z,Y);if(sZ(Z))return l1(Z,Y);if(mZ(Z))return r1(Z,Y);if(rZ(Z))return"'boolean'";if(aZ(Z))return"'date'";if(iZ(Z))return Y==="postgres"?"'timestamp'":"'datetime'";if(nZ(Z))return"'bigint'";if(eZ(Z))return"'timestamp'";if(oZ(Z))return"'float4'";if(["array","object"].includes(Z.name))return Y==="sqlite"?"'text'":"'json'";if(Y==="sqlite")return"'text'";return Y==="mysql"?"'varchar(255)'":"'text'"}function G6(Z){return Z.includes(".required()")}D();import{log as b}from"@stacksjs/logging";import{log as Z0}from"@stacksjs/logging";import{path as X0}from"@stacksjs/path";function $0(Z){return`\x1B[3m${Z}\x1B[23m`}async function fY(){if(await q("password_resets"))return;let Y=`import type { Database } from '@stacksjs/database'
32
12
  `;Y+=`import { sql } from '@stacksjs/database'
33
13
 
34
14
  `,Y+=`export async function up(db: Database<any>) {
@@ -51,7 +31,7 @@ export default class ${Z}Seeder extends Seeder {
51
31
  `,Y+=` .column('token')
52
32
  `,Y+=` .execute()
53
33
  `,Y+=`}
54
- `;let J=`${new Date().getTime().toString()}-create-password-resets-table.ts`,X=m4.userMigrationsPath(J);await Bun.write(X,Y),g4.success(`Created migration: ${d4(J)}`)}async function W1(){if(await x("password_resets"))return;let Y=`import type { Database } from '@stacksjs/database'
34
+ `;let X=`${new Date().getTime().toString()}-create-password-resets-table.ts`,J=X0.userMigrationsPath(X);await Bun.write(J,Y),Z0.success(`Created migration: ${$0(X)}`)}async function K6(){if(await q("password_resets"))return;let Y=`import type { Database } from '@stacksjs/database'
55
35
  `;Y+=`import { sql } from '@stacksjs/database'
56
36
 
57
37
  `,Y+=`export async function up(db: Database<any>) {
@@ -74,7 +54,7 @@ export default class ${Z}Seeder extends Seeder {
74
54
  `,Y+=` .column('token')
75
55
  `,Y+=` .execute()
76
56
  `,Y+=`}
77
- `;let J=`${new Date().getTime().toString()}-create-password-resets-table.ts`,X=m4.userMigrationsPath(J);await Bun.write(X,Y),g4.success(`Created migration: ${d4(J)}`)}import{ok as v8}from"@stacksjs/error-handling";import{getModelName as f8,getPivotTables as H6,getTableName as yZ}from"@stacksjs/orm";import{path as a}from"@stacksjs/path";import{fs as b8,globSync as p8}from"@stacksjs/storage";import{snakeCase as wY}from"@stacksjs/strings";F();import{log as P}from"@stacksjs/logging";import{path as N}from"@stacksjs/path";function k(Z){return`\x1B[3m${Z}\x1B[23m`}function _1(){return["tags","taggables","categorizables","comments","commentables","commentable_upvotes","passkeys","password_resets","query_logs","migrations"]}async function s4(){if(await x("users"))return;let Y=`import type { Database } from '@stacksjs/database'
57
+ `;let X=`${new Date().getTime().toString()}-create-password-resets-table.ts`,J=X0.userMigrationsPath(X);await Bun.write(J,Y),Z0.success(`Created migration: ${$0(X)}`)}import{ok as n1}from"@stacksjs/error-handling";import{getModelName as o1,getPivotTables as O0,getTableName as UZ}from"@stacksjs/orm";import{path as s}from"@stacksjs/path";import{fs as i1,globSync as e1}from"@stacksjs/storage";import{snakeCase as IY}from"@stacksjs/strings";D();import{log as M}from"@stacksjs/logging";import{path as F}from"@stacksjs/path";function y(Z){return`\x1B[3m${Z}\x1B[23m`}function R6(){return["tags","taggables","categorizables","comments","commentables","commentable_upvotes","passkeys","password_resets","query_logs","migrations"]}async function J0(){if(await q("users"))return;let Y=`import type { Database } from '@stacksjs/database'
78
58
  import { sql } from '@stacksjs/database'
79
59
 
80
60
  `;Y+=`export async function up(db: Database<any>) {
@@ -93,7 +73,7 @@ export default class ${Z}Seeder extends Seeder {
93
73
  `,Y+=` .addColumn('created_at', 'timestamp', col => col.notNull().defaultTo(sql.raw('CURRENT_TIMESTAMP')))
94
74
  `,Y+=` .execute()
95
75
  `,Y+=` }
96
- `;let J=`${new Date().getTime().toString()}-create-passkeys-table.ts`,X=N.userMigrationsPath(J);await Bun.write(X,Y),P.success(`Created migration: ${k(J)}`)}async function l4(){if(await x("users"))return;let Y=`import type { Database } from '@stacksjs/database'
76
+ `;let X=`${new Date().getTime().toString()}-create-passkeys-table.ts`,J=F.userMigrationsPath(X);await Bun.write(J,Y),M.success(`Created migration: ${y(X)}`)}async function W0(){if(await q("users"))return;let Y=`import type { Database } from '@stacksjs/database'
97
77
  import { sql } from '@stacksjs/database'
98
78
 
99
79
  `;Y+=`export async function up(db: Database<any>) {
@@ -113,7 +93,7 @@ export default class ${Z}Seeder extends Seeder {
113
93
  `,Y+=` .execute()
114
94
 
115
95
  `,Y+=`}
116
- `;let J=`${new Date().getTime().toString()}-create-passkeys-table.ts`,X=N.userMigrationsPath(J);await Bun.write(X,Y),P.success(`Created migration: ${k(J)}`)}async function r4(){if(await x("tags"))return;let Y=`import type { Database } from '@stacksjs/database'
96
+ `;let X=`${new Date().getTime().toString()}-create-passkeys-table.ts`,J=F.userMigrationsPath(X);await Bun.write(J,Y),M.success(`Created migration: ${y(X)}`)}async function z0(){if(await q("tags"))return;let Y=`import type { Database } from '@stacksjs/database'
117
97
  `;Y+=`import { sql } from '@stacksjs/database'
118
98
 
119
99
  `,Y+=`export async function up(db: Database<any>) {
@@ -149,7 +129,7 @@ export default class ${Z}Seeder extends Seeder {
149
129
  `,Y+=` .execute()
150
130
 
151
131
  `,Y+=`}
152
- `;let J=`${new Date().getTime().toString()}-create-tags-table.ts`,X=N.userMigrationsPath(J);await Bun.write(X,Y),P.success(`Created migration: ${k(J)}`),await new Promise((W)=>setTimeout(W,2)),await kZ()}async function n4(){if(await x("tags"))return;let Y=`import type { Database } from '@stacksjs/database'
132
+ `;let X=`${new Date().getTime().toString()}-create-tags-table.ts`,J=F.userMigrationsPath(X);await Bun.write(J,Y),M.success(`Created migration: ${y(X)}`),await new Promise((W)=>setTimeout(W,2)),await GZ()}async function G0(){if(await q("tags"))return;let Y=`import type { Database } from '@stacksjs/database'
153
133
  `;Y+=`import { sql } from '@stacksjs/database'
154
134
 
155
135
  `,Y+=`export async function up(db: Database<any>) {
@@ -185,7 +165,7 @@ export default class ${Z}Seeder extends Seeder {
185
165
  `,Y+=` .execute()
186
166
 
187
167
  `,Y+=`}
188
- `;let J=`${new Date().getTime().toString()}-create-tags-table.ts`,X=N.userMigrationsPath(J);await Bun.write(X,Y),P.success(`Created migration: ${k(J)}`),await new Promise((W)=>setTimeout(W,2)),await NZ()}async function i4(){if(await x("categorizable"))return;let Y=`import type { Database } from '@stacksjs/database'
168
+ `;let X=`${new Date().getTime().toString()}-create-tags-table.ts`,J=F.userMigrationsPath(X);await Bun.write(J,Y),M.success(`Created migration: ${y(X)}`),await new Promise((W)=>setTimeout(W,2)),await HZ()}async function H0(){if(await q("categorizable"))return;let Y=`import type { Database } from '@stacksjs/database'
189
169
  `;Y+=`import { sql } from '@stacksjs/database'
190
170
 
191
171
  `,Y+=`export async function up(db: Database<any>) {
@@ -225,7 +205,7 @@ export default class ${Z}Seeder extends Seeder {
225
205
  `,Y+=` .column('is_active')
226
206
  `,Y+=` .execute()
227
207
  `,Y+=`}
228
- `;let J=`${new Date().getTime().toString()}-create-categorizables-table.ts`,X=N.userMigrationsPath(J);await Bun.write(X,Y),P.success(`Created migration: ${k(J)}`)}async function a4(){if(await x("categorizable"))return;let Y=`import type { Database } from '@stacksjs/database'
208
+ `;let X=`${new Date().getTime().toString()}-create-categorizables-table.ts`,J=F.userMigrationsPath(X);await Bun.write(J,Y),M.success(`Created migration: ${y(X)}`)}async function U0(){if(await q("categorizable"))return;let Y=`import type { Database } from '@stacksjs/database'
229
209
  `;Y+=`import { sql } from '@stacksjs/database'
230
210
 
231
211
  `,Y+=`export async function up(db: Database<any>) {
@@ -266,7 +246,7 @@ export default class ${Z}Seeder extends Seeder {
266
246
  `,Y+=` .column('is_active')
267
247
  `,Y+=` .execute()
268
248
  `,Y+=`}
269
- `;let J=`${new Date().getTime().toString()}-create-categorizables-table.ts`,X=N.userMigrationsPath(J);await Bun.write(X,Y),P.success(`Created migration: ${k(J)}`)}async function o4(Z={}){if(await x("comments"))return;let $=`import type { Database } from '@stacksjs/database'
249
+ `;let X=`${new Date().getTime().toString()}-create-categorizables-table.ts`,J=F.userMigrationsPath(X);await Bun.write(J,Y),M.success(`Created migration: ${y(X)}`)}async function Q0(Z={}){if(await q("comments"))return;let $=`import type { Database } from '@stacksjs/database'
270
250
  `;if($+=`import { sql } from '@stacksjs/database'
271
251
 
272
252
  `,$+=`export async function up(db: Database<any>) {
@@ -297,7 +277,7 @@ export default class ${Z}Seeder extends Seeder {
297
277
  `,$+=` await db.schema.createIndex('idx_comments_status').on('comments').column('status').execute()
298
278
  `,$+=` await db.schema.createIndex('idx_comments_created_at').on('comments').column('created_at').execute()
299
279
  `,$+=`}
300
- `;let X=`${new Date().getTime().toString()}-create-comments-table.ts`,W=N.userMigrationsPath(X);await Bun.write(W,$),P.success(`Created migration: ${k(X)}`)}async function t4(){if(await x("comments"))return;let Y=`import type { Database } from '@stacksjs/database'
280
+ `;let J=`${new Date().getTime().toString()}-create-comments-table.ts`,W=F.userMigrationsPath(J);await Bun.write(W,$),M.success(`Created migration: ${y(J)}`)}async function I0(){if(await q("comments"))return;let Y=`import type { Database } from '@stacksjs/database'
301
281
  `;Y+=`import { sql } from '@stacksjs/database'
302
282
 
303
283
  `,Y+=`export async function up(db: Database<any>) {
@@ -325,7 +305,7 @@ export default class ${Z}Seeder extends Seeder {
325
305
  `,Y+=` await db.schema.createIndex('idx_comments_status').on('comments').column('status').execute()
326
306
  `,Y+=` await db.schema.createIndex('idx_comments_created_at').on('comments').column('created_at').execute()
327
307
  `,Y+=`}
328
- `;let J=`${new Date().getTime().toString()}-create-comments-table.ts`,X=N.userMigrationsPath(J);await Bun.write(X,Y),P.success(`Created migration: ${k(J)}`)}async function JZ(){await A.unsafe("DROP TABLE IF EXISTS passkeys").execute(),await A.unsafe("DROP TABLE IF EXISTS password_resets").execute(),await A.unsafe("DROP TABLE IF EXISTS query_logs").execute(),await A.unsafe("DROP TABLE IF EXISTS categorizables").execute(),await A.unsafe("DROP TABLE IF EXISTS commentable_upvotes").execute(),await A.unsafe("DROP TABLE IF EXISTS tags").execute(),await A.unsafe("DROP TABLE IF EXISTS taggables").execute(),await A.unsafe("DROP TABLE IF EXISTS categorizable_models").execute(),await A.unsafe("DROP TABLE IF EXISTS commentables").execute(),await A.unsafe("DROP TABLE IF EXISTS comments").execute(),await A.unsafe("DROP TABLE IF EXISTS categories_models").execute(),await A.unsafe("DROP TABLE IF EXISTS activities").execute()}async function O1(){await A.unsafe("DELETE FROM migrations").execute(),await A.unsafe("DELETE FROM migration_locks").execute()}async function e4(){await A.unsafe("DROP TABLE IF EXISTS migrations").execute(),await A.unsafe("DROP TABLE IF EXISTS migration_locks").execute()}async function Y6(){if(await x("commentable_upvotes"))return;let Y=`import type { Database } from '@stacksjs/database'
308
+ `;let X=`${new Date().getTime().toString()}-create-comments-table.ts`,J=F.userMigrationsPath(X);await Bun.write(J,Y),M.success(`Created migration: ${y(X)}`)}async function hY(){await K.unsafe("DROP TABLE IF EXISTS passkeys").execute(),await K.unsafe("DROP TABLE IF EXISTS password_resets").execute(),await K.unsafe("DROP TABLE IF EXISTS query_logs").execute(),await K.unsafe("DROP TABLE IF EXISTS categorizables").execute(),await K.unsafe("DROP TABLE IF EXISTS commentable_upvotes").execute(),await K.unsafe("DROP TABLE IF EXISTS tags").execute(),await K.unsafe("DROP TABLE IF EXISTS taggables").execute(),await K.unsafe("DROP TABLE IF EXISTS categorizable_models").execute(),await K.unsafe("DROP TABLE IF EXISTS commentables").execute(),await K.unsafe("DROP TABLE IF EXISTS comments").execute(),await K.unsafe("DROP TABLE IF EXISTS categories_models").execute(),await K.unsafe("DROP TABLE IF EXISTS activities").execute()}async function O6(){await K.unsafe("DELETE FROM migrations").execute(),await K.unsafe("DELETE FROM migration_locks").execute()}async function K0(){await K.unsafe("DROP TABLE IF EXISTS migrations").execute(),await K.unsafe("DROP TABLE IF EXISTS migration_locks").execute()}async function V0(){if(await q("commentable_upvotes"))return;let Y=`import type { Database } from '@stacksjs/database'
329
309
  import { sql } from '@stacksjs/database'
330
310
 
331
311
  `;Y+=`export async function up(db: Database<any>) {
@@ -339,7 +319,7 @@ export default class ${Z}Seeder extends Seeder {
339
319
 
340
320
  `,Y+=` await db.schema.createIndex('idx_commentable_upvotes_upvoteable').on('commentable_upvotes').columns(['upvoteable_id', 'upvoteable_type']).execute()
341
321
  `,Y+=`}
342
- `;let J=`${new Date().getTime().toString()}-create-commentable_upvotes-table.ts`,X=N.userMigrationsPath(J);await Bun.write(X,Y),P.success(`Created migration: ${k(J)}`)}async function Z6(){if(await x("commentable_upvotes"))return;let Y=`import type { Database } from '@stacksjs/database'
322
+ `;let X=`${new Date().getTime().toString()}-create-commentable_upvotes-table.ts`,J=F.userMigrationsPath(X);await Bun.write(J,Y),M.success(`Created migration: ${y(X)}`)}async function _0(){if(await q("commentable_upvotes"))return;let Y=`import type { Database } from '@stacksjs/database'
343
323
  import { sql } from '@stacksjs/database'
344
324
 
345
325
  `;Y+=`export async function up(db: Database<any>) {
@@ -353,7 +333,7 @@ export default class ${Z}Seeder extends Seeder {
353
333
 
354
334
  `,Y+=` await db.schema.createIndex('idx_commentable_upvotes_upvoteable').on('commentable_upvotes').columns(['upvoteable_id', 'upvoteable_type']).execute()
355
335
  `,Y+=`}
356
- `;let J=`${new Date().getTime().toString()}-create-commentable_upvotes-table.ts`,X=N.userMigrationsPath(J);await Bun.write(X,Y),P.success(`Created migration: ${k(J)}`)}async function A1(){if(await x("commentables"))return;let Y=`import type { Database } from '@stacksjs/database'
336
+ `;let X=`${new Date().getTime().toString()}-create-commentable_upvotes-table.ts`,J=F.userMigrationsPath(X);await Bun.write(J,Y),M.success(`Created migration: ${y(X)}`)}async function B6(){if(await q("commentables"))return;let Y=`import type { Database } from '@stacksjs/database'
357
337
  `;Y+=`import { sql } from '@stacksjs/database'
358
338
 
359
339
  `,Y+=`export async function up(db: Database<any>) {
@@ -387,7 +367,7 @@ export default class ${Z}Seeder extends Seeder {
387
367
  `,Y+=` .execute()
388
368
 
389
369
  `,Y+=`}
390
- `;let J=`${new Date().getTime().toString()}-create-commentables-pivot-table.ts`,X=N.userMigrationsPath(J);await Bun.write(X,Y),P.success(`Created migration: ${k(J)}`)}async function $6(){if(await x("commentables_pivot"))return;let Y=`import type { Database } from '@stacksjs/database'
370
+ `;let X=`${new Date().getTime().toString()}-create-commentables-pivot-table.ts`,J=F.userMigrationsPath(X);await Bun.write(J,Y),M.success(`Created migration: ${y(X)}`)}async function L0(){if(await q("commentables_pivot"))return;let Y=`import type { Database } from '@stacksjs/database'
391
371
  `;Y+=`import { sql } from '@stacksjs/database'
392
372
 
393
373
  `,Y+=`export async function up(db: Database<any>) {
@@ -426,7 +406,7 @@ export default class ${Z}Seeder extends Seeder {
426
406
  `,Y+=` .execute()
427
407
 
428
408
  `,Y+=`}
429
- `;let J=`${new Date().getTime().toString()}-create-commentables-pivot-table.ts`,X=N.userMigrationsPath(J);await Bun.write(X,Y),P.success(`Created migration: ${k(J)}`)}async function kZ(){if(await x("taggables"))return;let Y=`import type { Database } from '@stacksjs/database'
409
+ `;let X=`${new Date().getTime().toString()}-create-commentables-pivot-table.ts`,J=F.userMigrationsPath(X);await Bun.write(J,Y),M.success(`Created migration: ${y(X)}`)}async function GZ(){if(await q("taggables"))return;let Y=`import type { Database } from '@stacksjs/database'
430
410
  `;Y+=`import { sql } from '@stacksjs/database'
431
411
 
432
412
  `,Y+=`export async function up(db: Database<any>) {
@@ -460,7 +440,7 @@ export default class ${Z}Seeder extends Seeder {
460
440
  `,Y+=` .execute()
461
441
 
462
442
  `,Y+=`}
463
- `;let J=`${new Date().getTime().toString()}-create-taggables-table.ts`,X=N.userMigrationsPath(J);await Bun.write(X,Y),P.success(`Created migration: ${k(J)}`)}async function NZ(){if(await x("taggables"))return;let Y=`import type { Database } from '@stacksjs/database'
443
+ `;let X=`${new Date().getTime().toString()}-create-taggables-table.ts`,J=F.userMigrationsPath(X);await Bun.write(J,Y),M.success(`Created migration: ${y(X)}`)}async function HZ(){if(await q("taggables"))return;let Y=`import type { Database } from '@stacksjs/database'
464
444
  `;Y+=`import { sql } from '@stacksjs/database'
465
445
 
466
446
  `,Y+=`export async function up(db: Database<any>) {
@@ -499,7 +479,7 @@ export default class ${Z}Seeder extends Seeder {
499
479
  `,Y+=` .execute()
500
480
 
501
481
  `,Y+=`}
502
- `;let J=`${new Date().getTime().toString()}-create-taggables-table.ts`,X=N.userMigrationsPath(J);await Bun.write(X,Y),P.success(`Created migration: ${k(J)}`)}async function J6(){if(await x("query_logs"))return;let Y=`import type { Database } from '@stacksjs/database'
482
+ `;let X=`${new Date().getTime().toString()}-create-taggables-table.ts`,J=F.userMigrationsPath(X);await Bun.write(J,Y),M.success(`Created migration: ${y(X)}`)}async function E0(){if(await q("query_logs"))return;let Y=`import type { Database } from '@stacksjs/database'
503
483
  `;Y+=`import { sql } from '@stacksjs/database'
504
484
 
505
485
  `,Y+=`export async function up(db: Database<any>) {
@@ -544,7 +524,7 @@ export default class ${Z}Seeder extends Seeder {
544
524
  `,Y+=` .execute()
545
525
 
546
526
  `,Y+=`}
547
- `;let J=`${new Date().getTime().toString()}-create-query-logs-table.ts`,X=N.userMigrationsPath(J);await Bun.write(X,Y),P.success(`Created migration: ${k(J)}`)}async function X6(){if(await x("query_logs"))return;let Y=`import type { Database } from '@stacksjs/database'
527
+ `;let X=`${new Date().getTime().toString()}-create-query-logs-table.ts`,J=F.userMigrationsPath(X);await Bun.write(J,Y),M.success(`Created migration: ${y(X)}`)}async function A0(){if(await q("query_logs"))return;let Y=`import type { Database } from '@stacksjs/database'
548
528
  `;Y+=`import { sql } from '@stacksjs/database'
549
529
 
550
530
  `,Y+=`export async function up(db: Database<any>) {
@@ -589,235 +569,235 @@ export default class ${Z}Seeder extends Seeder {
589
569
  `,Y+=` .execute()
590
570
 
591
571
  `,Y+=`}
592
- `;let J=`${new Date().getTime().toString()}-create-query-logs-table.ts`,X=N.userMigrationsPath(J);await Bun.write(X,Y),P.success(`Created migration: ${k(J)}`)}function W6(Z){return`\x1B[3m${Z}\x1B[23m`}async function D1(){return await C8(),await LY(),await VY(),v8("All tables dropped successfully!")}async function C8(){let Z=p8([a.userModelsPath("*.ts"),a.storagePath("framework/defaults/app/Models/**/*.ts")],{absolute:!0}),Y=await ZZ();for(let $ of Y){if(!/^[a-z_][\w]*$/i.test($))throw Error(`[mysql] Refusing to drop table with unsafe name: ${$}`);await A.unsafe(`DROP TABLE IF EXISTS \`${$}\``).execute()}await JZ();for(let $ of Z){let J=(await import($)).default,X=await H6(J,$);for(let W of X){if(!/^[a-z_][\w]*$/i.test(W.table))throw Error(`[mysql] Refusing to drop pivot table with unsafe name: ${W.table}`);await A.unsafe(`DROP TABLE IF EXISTS \`${W.table}\``).execute()}}}async function x1(Z){let Y=(await import(Z)).default,$=a.basename(Z),J=yZ(Y,Z),X=JSON.stringify(Y.attributes,null,2),W=a.frameworkPath(`cache/models/${$}`),H=!1;if(b8.existsSync(W)){l.info(`Fields have already been generated for ${J}`);let z=await s($);if(JSON.stringify(z,null,2)===X){l.debug(`Fields have not changed for ${J}`);return}H=!0,l.debug(`Fields have changed for ${J}`)}else l.debug(`Fields have not been generated for ${J}`);await Bun.$`mkdir -p ${a.frameworkPath("cache/models")} && cp ${Z} ${W}`;let G=await JY(J);if(l.debug(`Has ${J} been migrated? ${G}`),H)await u8(Z);else await G6(Z)}async function q1(){await Promise.all([i4(),o4(),r4(),kZ(),$Z(),s4(),J6(),Y6()])}async function G6(Z){l.debug("createTableMigration modelPath:",Z);let Y=(await import(Z)).default,$=yZ(Y,Z),J=Y.traits?.useAuth&&typeof Y.traits.useAuth!=="boolean"?Y.traits.useAuth.useTwoFactor:!1;await c8(Y,Z);let X=Y?.traits?.useTimestamps??Y?.traits?.timestampable??!0,W=Y?.traits?.useSocials&&Array.isArray(Y.traits.useSocials)&&Y.traits.useSocials.length>0,H=Array.isArray(Y?.traits?.likeable)?Y.traits.likeable.length>0:Boolean(Y?.traits?.likeable),G=Y?.traits?.useSoftDeletes??Y?.traits?.softDeletable??!1,z=(typeof Y.traits?.useAuth==="object"&&Y.traits.useAuth.usePasskey)??!1,Q=Y.traits?.billable||!1,_=Y.traits?.useUuid||!1;if(Q&&$==="users")await G6(a.frameworkPath("defaults/app/Models/Subscription.ts"));let U=`import type { Database } from '@stacksjs/database'
593
- `;if(U+=`import { sql } from '@stacksjs/database'
594
-
595
- `,U+=`export async function up(db: Database<any>) {
596
- `,U+=` await (db as any).schema
597
- `,U+=` .createTable('${$}')
598
- `,U+=` .addColumn('id', 'integer', col => col.primaryKey().autoIncrement())
599
- `,_)U+=` .addColumn('uuid', 'varchar(255)')
600
- `;if(W){let B=Y.traits?.useSocials||[];if(B.includes("google"))U+=` .addColumn('google_id', 'varchar(255)')
601
- `;if(B.includes("github"))U+=` .addColumn('github_id', 'varchar(255)')
602
- `;if(B.includes("apple"))U+=` .addColumn('apple_id', 'varchar(255)')
603
- `;if(B.includes("twitter"))U+=` .addColumn('twitter_id', 'varchar(255)')
604
- `;if(B.includes("facebook"))U+=` .addColumn('facebook_id', 'varchar(255)')
605
- `}for(let[B,E]of XY(Y.attributes)){let V=E,j=wY(B),R=WY(V.validation?.rule);U+=` .addColumn('${j}', ${R}`;let v="isRequired"in(V.validation?.rule??{})?(V.validation?.rule).isRequired:!1;if(v||V.unique||V.default!==void 0){if(U+=", col => col",v)U+=".notNull()";if(V.unique)U+=".unique()";if(V.default!==void 0)if(typeof V.default==="string")U+=`.defaultTo('${V.default.replace(/'/g,"\\'")}')`;else if(V.default===null)U+=".defaultTo(null)";else U+=`.defaultTo(${V.default})`;U+=""}U+=`)
606
- `}if(J!==!1&&J)U+=` .addColumn('two_factor_secret', 'varchar(255)')
607
- `;if(Q)U+=` .addColumn('stripe_id', 'varchar(255)')
608
- `;if(z)U+=` .addColumn('public_passkey', 'varchar(255)')
609
- `;if(X)U+=` .addColumn('created_at', 'timestamp', col => col.notNull().defaultTo(sql.raw('CURRENT_TIMESTAMP')))
610
- `,U+=` .addColumn('updated_at', 'timestamp')
611
- `;if(G)U+=` .addColumn('deleted_at', 'timestamp')
612
- `;if(U+=` .execute()
613
- `,U+=d8($),H){let B=UY(Y,$);if(B){let E=RY(Y,$);U+=`
572
+ `;let X=`${new Date().getTime().toString()}-create-query-logs-table.ts`,J=F.userMigrationsPath(X);await Bun.write(J,Y),M.success(`Created migration: ${y(X)}`)}function R0(Z){return`\x1B[3m${Z}\x1B[23m`}async function N6(){return await t1(),await WY(),await JY(),n1("All tables dropped successfully!")}async function t1(){let Z=e1([s.userModelsPath("*.ts"),s.storagePath("framework/defaults/app/Models/**/*.ts")],{absolute:!0}),Y=await vY();for(let $ of Y){if(!/^[a-z_][\w]*$/i.test($))throw Error(`[mysql] Refusing to drop table with unsafe name: ${$}`);await K.unsafe(`DROP TABLE IF EXISTS \`${$}\``).execute()}await hY();for(let $ of Z){let X=(await import($)).default,J=await O0(X,$);for(let W of J){if(!/^[a-z_][\w]*$/i.test(W.table))throw Error(`[mysql] Refusing to drop pivot table with unsafe name: ${W.table}`);await K.unsafe(`DROP TABLE IF EXISTS \`${W.table}\``).execute()}}}async function v6(Z){let Y=(await import(Z)).default,$=s.basename(Z),X=UZ(Y,Z),J=JSON.stringify(Y.attributes,null,2),W=s.frameworkPath(`cache/models/${$}`),z=!1;if(i1.existsSync(W)){b.info(`Fields have already been generated for ${X}`);let I=await c($);if(JSON.stringify(I,null,2)===J){b.debug(`Fields have not changed for ${X}`);return}z=!0,b.debug(`Fields have changed for ${X}`)}else b.debug(`Fields have not been generated for ${X}`);await Bun.$`mkdir -p ${s.frameworkPath("cache/models")} && cp ${Z} ${W}`;let H=await a(X);if(b.debug(`Has ${X} been migrated? ${H}`),z)await Z4(Z);else await B0(Z)}async function f6(){await Promise.all([H0(),Q0(),z0(),GZ(),fY(),J0(),E0(),V0()])}async function B0(Z){b.debug("createTableMigration modelPath:",Z);let Y=(await import(Z)).default,$=UZ(Y,Z),X=Y.traits?.useAuth&&typeof Y.traits.useAuth!=="boolean"?Y.traits.useAuth.useTwoFactor:!1;await Y4(Y,Z);let J=Y?.traits?.useTimestamps??Y?.traits?.timestampable??!0,W=Y?.traits?.useSocials&&Array.isArray(Y.traits.useSocials)&&Y.traits.useSocials.length>0,z=Array.isArray(Y?.traits?.likeable)?Y.traits.likeable.length>0:Boolean(Y?.traits?.likeable),H=Y?.traits?.useSoftDeletes??Y?.traits?.softDeletable??!1,I=(typeof Y.traits?.useAuth==="object"&&Y.traits.useAuth.usePasskey)??!1,Q=Y.traits?.billable||!1,E=Y.traits?.useUuid||!1;if(Q&&$==="users")await B0(s.frameworkPath("defaults/app/Models/Subscription.ts"));let G=`import type { Database } from '@stacksjs/database'
573
+ `;if(G+=`import { sql } from '@stacksjs/database'
574
+
575
+ `,G+=`export async function up(db: Database<any>) {
576
+ `,G+=` await (db as any).schema
577
+ `,G+=` .createTable('${$}')
578
+ `,G+=` .addColumn('id', 'integer', col => col.primaryKey().autoIncrement())
579
+ `,E)G+=` .addColumn('uuid', 'varchar(255)')
580
+ `;if(W){let V=Y.traits?.useSocials||[];if(V.includes("google"))G+=` .addColumn('google_id', 'varchar(255)')
581
+ `;if(V.includes("github"))G+=` .addColumn('github_id', 'varchar(255)')
582
+ `;if(V.includes("apple"))G+=` .addColumn('apple_id', 'varchar(255)')
583
+ `;if(V.includes("twitter"))G+=` .addColumn('twitter_id', 'varchar(255)')
584
+ `;if(V.includes("facebook"))G+=` .addColumn('facebook_id', 'varchar(255)')
585
+ `}for(let[V,L]of n(Y.attributes)){let _=L,x=IY(V),B=o(_.validation?.rule);G+=` .addColumn('${x}', ${B}`;let f="isRequired"in(_.validation?.rule??{})?(_.validation?.rule).isRequired:!1;if(f||_.unique||_.default!==void 0){if(G+=", col => col",f)G+=".notNull()";if(_.unique)G+=".unique()";if(_.default!==void 0)if(typeof _.default==="string")G+=`.defaultTo('${_.default.replace(/'/g,"\\'")}')`;else if(_.default===null)G+=".defaultTo(null)";else G+=`.defaultTo(${_.default})`;G+=""}G+=`)
586
+ `}if(X!==!1&&X)G+=` .addColumn('two_factor_secret', 'varchar(255)')
587
+ `;if(Q)G+=` .addColumn('stripe_id', 'varchar(255)')
588
+ `;if(I)G+=` .addColumn('public_passkey', 'varchar(255)')
589
+ `;if(J)G+=` .addColumn('created_at', 'timestamp', col => col.notNull().defaultTo(sql.raw('CURRENT_TIMESTAMP')))
590
+ `,G+=` .addColumn('updated_at', 'timestamp')
591
+ `;if(H)G+=` .addColumn('deleted_at', 'timestamp')
592
+ `;if(G+=` .execute()
593
+ `,G+=X4($),z){let V=t(Y,$);if(V){let L=QY(Y,$);G+=`
614
594
  // Create upvote table
615
- `,U+=` await (db as any).schema
616
- `,U+=` .createTable('${B}')
617
- `,U+=` .addColumn('id', 'integer', col => col.primaryKey().autoIncrement())
618
- `,U+=` .addColumn('${E}', 'integer', col => col.notNull())
619
- `,U+=` .addColumn('user_id', 'integer', col => col.notNull())
620
- `,U+=` .addColumn('created_at', 'timestamp', col => col.notNull().defaultTo(sql.raw('CURRENT_TIMESTAMP')))
621
- `,U+=` .addColumn('updated_at', 'timestamp')
622
- `,U+=` .execute()
623
-
624
- `,U+=` // Add indexes for upvote table
625
- `,U+=` await (db as any).schema.createIndex('${B}_${E}_index').on('${B}').column('${E}').execute()
626
- `,U+=` await (db as any).schema.createIndex('${B}_user_${E}_unique').on('${B}').columns(['user_id', '${E}']).unique().execute()
627
- `,U+=` await (db as any).schema.createIndex('${B}_id_index').on('${B}').column('id').execute()
628
- `}}U+=`}
629
- `;let O=`${new Date().getTime().toString()}-create-${$}-table.ts`,L=a.userMigrationsPath(O);l.debug(L),await Bun.write(L,U),l.success(`Created migration: ${W6(O)}`)}async function c8(Z,Y){let $=await H6(Z,Y),J=new Set;if(!$.length)return;for(let X of $){if(J.has(X.table))continue;if(await EY(X.table)){J.add(X.table);continue}let H=`import type { Database } from '@stacksjs/database'
630
- `;H+=`import { sql } from '@stacksjs/database'
631
-
632
- `,H+=`export async function up(db: Database<any>) {
633
- `,H+=` await (db as any).schema
634
- `,H+=` .createTable('${X.table}')
635
- `,H+=` .addColumn('id', 'integer', col => col.primaryKey().autoIncrement())
636
- `,H+=` .addColumn('${X.firstForeignKey}', 'integer')
637
- `,H+=` .addColumn('${X.secondForeignKey}', 'integer')
638
- `,H+=` .addColumn('created_at', 'timestamp', col => col.defaultTo(sql.raw('CURRENT_TIMESTAMP')))
639
- `,H+=` .execute()
640
- `,H+=` }
641
- `;let z=`${new Date().getTime().toString()}-create-${X.table}-table.ts`,Q=a.userMigrationsPath(z);await Bun.write(Q,H),J.add(X.table),l.success(`Created pivot migration: ${z}`)}}async function u8(Z){let Y=(await import(Z)).default,$=f8(Y,Z),J=yZ(Y,Z),X=!1,H=await s($)??{},G=Y.attributes,z=IY(Object.keys(H),Object.keys(G)),Q=z?.added||[],_=z?.removed||[],U=`import type { Database } from '@stacksjs/database'
642
- `;if(U+=`import { sql } from '@stacksjs/database'
643
-
644
- `,U+=`export async function up(db: Database<any>) {
645
- `,Q.length||_.length)X=!0,U+=` await (db as any).schema.alterTable('${J}')
646
- `;let I=jY(H,G);for(let B of I){X=!0;let E=wY(B.key);U+=` .modifyColumn('${E}', 'varchar(${B.max})')
647
- `}let O=Object.values(H).map((B)=>B.order),L=Object.values(G).map((B)=>B.order);if(!KY(O,L))X=!0,U+=m8(Y.attributes,J);if(X){U+=` .execute()
648
- `,U+=`}
649
- `;let E=`${new Date().getTime().toString()}-alter-${J}-table.ts`,V=a.userMigrationsPath(E);await Bun.write(V,U),l.success(`Created alter migration: ${W6(E)}`)}}function g8(Z,Y){if(Y.unique||Y.where){let J=Y.unique?"UNIQUE ":"",X=Y.columns.map((H)=>wY(H)).join(", "),W=Y.where?` WHERE ${Y.where}`:"";return` await db.unsafe(\`CREATE ${J}INDEX IF NOT EXISTS \\\`${Y.name}\\\` ON \\\`${Z}\\\` (${X})${W}\`).execute()
650
- `}let $=Y.columns.map((J)=>`'${wY(J)}'`).join(", ");return` await (db as any).schema.createIndex('${Y.name}').on('${Z}').columns([${$}]).execute()
651
- `}function d8(Z){return` await (db as any).schema.createIndex('${Z}_id_index').on('${Z}').column('id').execute()
652
- `}function m8(Z,Y){let $=XY(Z),J="",X="";for(let[W]of $){let H=wY(W);if(X)J+=`await sql\`
595
+ `,G+=` await (db as any).schema
596
+ `,G+=` .createTable('${V}')
597
+ `,G+=` .addColumn('id', 'integer', col => col.primaryKey().autoIncrement())
598
+ `,G+=` .addColumn('${L}', 'integer', col => col.notNull())
599
+ `,G+=` .addColumn('user_id', 'integer', col => col.notNull())
600
+ `,G+=` .addColumn('created_at', 'timestamp', col => col.notNull().defaultTo(sql.raw('CURRENT_TIMESTAMP')))
601
+ `,G+=` .addColumn('updated_at', 'timestamp')
602
+ `,G+=` .execute()
603
+
604
+ `,G+=` // Add indexes for upvote table
605
+ `,G+=` await (db as any).schema.createIndex('${V}_${L}_index').on('${V}').column('${L}').execute()
606
+ `,G+=` await (db as any).schema.createIndex('${V}_user_${L}_unique').on('${V}').columns(['user_id', '${L}']).unique().execute()
607
+ `,G+=` await (db as any).schema.createIndex('${V}_id_index').on('${V}').column('id').execute()
608
+ `}}G+=`}
609
+ `;let U=`${new Date().getTime().toString()}-create-${$}-table.ts`,A=s.userMigrationsPath(U);b.debug(A),await Bun.write(A,G),b.success(`Created migration: ${R0(U)}`)}async function Y4(Z,Y){let $=await O0(Z,Y),X=new Set;if(!$.length)return;for(let J of $){if(X.has(J.table))continue;if(await zY(J.table)){X.add(J.table);continue}let z=`import type { Database } from '@stacksjs/database'
610
+ `;z+=`import { sql } from '@stacksjs/database'
611
+
612
+ `,z+=`export async function up(db: Database<any>) {
613
+ `,z+=` await (db as any).schema
614
+ `,z+=` .createTable('${J.table}')
615
+ `,z+=` .addColumn('id', 'integer', col => col.primaryKey().autoIncrement())
616
+ `,z+=` .addColumn('${J.firstForeignKey}', 'integer')
617
+ `,z+=` .addColumn('${J.secondForeignKey}', 'integer')
618
+ `,z+=` .addColumn('created_at', 'timestamp', col => col.defaultTo(sql.raw('CURRENT_TIMESTAMP')))
619
+ `,z+=` .execute()
620
+ `,z+=` }
621
+ `;let I=`${new Date().getTime().toString()}-create-${J.table}-table.ts`,Q=s.userMigrationsPath(I);await Bun.write(Q,z),X.add(J.table),b.success(`Created pivot migration: ${I}`)}}async function Z4(Z){let Y=(await import(Z)).default,$=o1(Y,Z),X=UZ(Y,Z),J=!1,z=await c($)??{},H=Y.attributes,I=GY(Object.keys(z),Object.keys(H)),Q=I?.added||[],E=I?.removed||[],G=`import type { Database } from '@stacksjs/database'
622
+ `;if(G+=`import { sql } from '@stacksjs/database'
623
+
624
+ `,G+=`export async function up(db: Database<any>) {
625
+ `,Q.length||E.length)J=!0,G+=` await (db as any).schema.alterTable('${X}')
626
+ `;let S=UY(z,H);for(let V of S){J=!0;let L=IY(V.key);G+=` .modifyColumn('${L}', 'varchar(${V.max})')
627
+ `}let U=Object.values(z).map((V)=>V.order),A=Object.values(H).map((V)=>V.order);if(!HY(U,A))J=!0,G+=J4(Y.attributes,X);if(J){G+=` .execute()
628
+ `,G+=`}
629
+ `;let L=`${new Date().getTime().toString()}-alter-${X}-table.ts`,_=s.userMigrationsPath(L);await Bun.write(_,G),b.success(`Created alter migration: ${R0(L)}`)}}function $4(Z,Y){if(Y.unique||Y.where){let X=Y.unique?"UNIQUE ":"",J=Y.columns.map((z)=>IY(z)).join(", "),W=Y.where?` WHERE ${Y.where}`:"";return` await db.unsafe(\`CREATE ${X}INDEX IF NOT EXISTS \\\`${Y.name}\\\` ON \\\`${Z}\\\` (${J})${W}\`).execute()
630
+ `}let $=Y.columns.map((X)=>`'${IY(X)}'`).join(", ");return` await (db as any).schema.createIndex('${Y.name}').on('${Z}').columns([${$}]).execute()
631
+ `}function X4(Z){return` await (db as any).schema.createIndex('${Z}_id_index').on('${Z}').column('id').execute()
632
+ `}function J4(Z,Y){let $=n(Z),X="",J="";for(let[W]of $){let z=IY(W);if(J)X+=`await sql\`
653
633
  ALTER TABLE ${Y}
654
- MODIFY COLUMN ${H} VARCHAR(255) NOT NULL AFTER ${wY(X)};
634
+ MODIFY COLUMN ${z} VARCHAR(255) NOT NULL AFTER ${IY(J)};
655
635
  \`.execute(db)
656
636
 
657
- `;X=H}return J}F();import{log as r}from"@stacksjs/logging";import{ok as s8}from"@stacksjs/error-handling";import{getModelName as l8,getPivotTables as z6,getTableName as XZ}from"@stacksjs/orm";import{path as y}from"@stacksjs/path";import{fs as SY,globSync as U6}from"@stacksjs/storage";import{plural as r8,snakeCase as gY}from"@stacksjs/strings";function vZ(Z){return`\x1B[3m${Z}\x1B[23m`}async function n8(){let Z=await Y$(),Y=U6([y.userModelsPath("*.ts"),y.storagePath("framework/defaults/app/Models/**/*.ts")],{absolute:!0});await e4();for(let $ of Z)await A.unsafe(`DROP TABLE IF EXISTS "${$}" CASCADE`).execute();await i8();for(let $ of Y){let J=(await import($)).default,X=await z6(J,$);for(let W of X)await A.unsafe(`DROP TABLE IF EXISTS "${W.table}" CASCADE`).execute()}}async function i8(){await A.unsafe('DROP TABLE IF EXISTS "passkeys" CASCADE').execute(),await A.unsafe('DROP TABLE IF EXISTS "password_resets" CASCADE').execute(),await A.unsafe('DROP TABLE IF EXISTS "query_logs" CASCADE').execute(),await A.unsafe('DROP TABLE IF EXISTS "categorizables" CASCADE').execute(),await A.unsafe('DROP TABLE IF EXISTS "commentables" CASCADE').execute(),await A.unsafe('DROP TABLE IF EXISTS "comments" CASCADE').execute(),await A.unsafe('DROP TABLE IF EXISTS "tags" CASCADE').execute(),await A.unsafe('DROP TABLE IF EXISTS "taggables" CASCADE').execute(),await A.unsafe('DROP TABLE IF EXISTS "commentable_upvotes" CASCADE').execute()}async function u1(){await a4(),await t4(),await n4(),await Z6(),await l4(),await X6(),await $Z(),await $6(),await NZ()}async function g1(){return await n8(),await LY(),await VY(),await A.unsafe('CREATE TABLE IF NOT EXISTS "migrations" (id SERIAL PRIMARY KEY)').execute(),await A.unsafe('CREATE TABLE IF NOT EXISTS "migration_locks" (id SERIAL PRIMARY KEY)').execute(),await A.unsafe('CREATE TABLE IF NOT EXISTS "activities" (id SERIAL PRIMARY KEY)').execute(),s8("All tables dropped successfully!")}async function d1(Z){if((await SY.promises.readdir(y.userMigrationsPath(""))).length===0){r.debug("No migrations found in the database folder, clearing the model snapshot cache...");let _=y.frameworkPath("cache/models");if(SY.existsSync(_)){let U=await SY.promises.readdir(_);if(U.length){for(let I of U)if(I.endsWith(".ts"))await SY.promises.unlink(y.frameworkPath(`cache/models/${I}`))}}}let $=(await import(Z)).default,J=y.basename(Z),X=XZ($,Z),W=JSON.stringify($.attributes,null,2),H=y.frameworkPath(`cache/models/${J}`),G=!1;if(SY.existsSync(H)){r.info(`Fields have already been generated for ${X}`);let _=await s(J);if(JSON.stringify(_,null,2)===W){r.debug(`Fields have not changed for ${X}`);return}G=!0,r.debug(`Fields have changed for ${X}`)}else r.debug(`Fields have not been generated for ${X}`);await Bun.$`mkdir -p ${y.frameworkPath("cache/models")} && cp ${Z} ${H}`;let z=await JY(X);if(r.debug(`Has ${X} been migrated? ${z}`),($.traits?.billable||!1)&&X==="users")await hZ(y.frameworkPath("defaults/app/Models/Subscription.ts"));if(G)await o8(Z);else await hZ(Z)}async function hZ(Z){r.debug("createTableMigration modelPath:",Z);let Y=(await import(Z)).default,$=XZ(Y,Z),J=Y.traits?.useAuth&&typeof Y.traits.useAuth!=="boolean"?Y.traits.useAuth.useTwoFactor:!1;await a8(Y,Z);let X=Y.traits?.useTimestamps??Y.traits?.timestampable??!0,W=Y?.traits?.useSocials&&Array.isArray(Y.traits.useSocials)&&Y.traits.useSocials.length>0,H=Array.isArray(Y?.traits?.likeable)?Y.traits.likeable.length>0:Boolean(Y?.traits?.likeable),G=Y.traits?.useSoftDeletes??Y.traits?.softDeletable??!1,z=(typeof Y.traits?.useAuth==="object"&&Y.traits.useAuth.usePasskey)??!1,Q=Y.traits?.billable||!1,_=Y.traits?.useUuid||!1;if(Q&&$==="users")await hZ(y.frameworkPath("defaults/app/Models/Subscription.ts"));let U=`import type { Database } from '@stacksjs/database'
637
+ `;J=z}return X}D();import{log as C}from"@stacksjs/logging";import{ok as W4}from"@stacksjs/error-handling";import{getModelName as z4,getPivotTables as j0,getTableName as pY}from"@stacksjs/orm";import{path as T}from"@stacksjs/path";import{fs as KY,globSync as w0}from"@stacksjs/storage";import{plural as G4,snakeCase as qY}from"@stacksjs/strings";function IZ(Z){return`\x1B[3m${Z}\x1B[23m`}async function H4(){let Z=await _4(),Y=w0([T.userModelsPath("*.ts"),T.storagePath("framework/defaults/app/Models/**/*.ts")],{absolute:!0});await K0();for(let $ of Z)await K.unsafe(`DROP TABLE IF EXISTS "${$}" CASCADE`).execute();await U4();for(let $ of Y){let X=(await import($)).default,J=await j0(X,$);for(let W of J)await K.unsafe(`DROP TABLE IF EXISTS "${W.table}" CASCADE`).execute()}}async function U4(){await K.unsafe('DROP TABLE IF EXISTS "passkeys" CASCADE').execute(),await K.unsafe('DROP TABLE IF EXISTS "password_resets" CASCADE').execute(),await K.unsafe('DROP TABLE IF EXISTS "query_logs" CASCADE').execute(),await K.unsafe('DROP TABLE IF EXISTS "categorizables" CASCADE').execute(),await K.unsafe('DROP TABLE IF EXISTS "commentables" CASCADE').execute(),await K.unsafe('DROP TABLE IF EXISTS "comments" CASCADE').execute(),await K.unsafe('DROP TABLE IF EXISTS "tags" CASCADE').execute(),await K.unsafe('DROP TABLE IF EXISTS "taggables" CASCADE').execute(),await K.unsafe('DROP TABLE IF EXISTS "commentable_upvotes" CASCADE').execute()}async function a6(){await U0(),await I0(),await G0(),await _0(),await W0(),await A0(),await fY(),await L0(),await HZ()}async function n6(){return await H4(),await WY(),await JY(),await K.unsafe('CREATE TABLE IF NOT EXISTS "migrations" (id SERIAL PRIMARY KEY)').execute(),await K.unsafe('CREATE TABLE IF NOT EXISTS "migration_locks" (id SERIAL PRIMARY KEY)').execute(),await K.unsafe('CREATE TABLE IF NOT EXISTS "activities" (id SERIAL PRIMARY KEY)').execute(),W4("All tables dropped successfully!")}async function o6(Z){if((await KY.promises.readdir(T.userMigrationsPath(""))).length===0){C.debug("No migrations found in the database folder, clearing the model snapshot cache...");let E=T.frameworkPath("cache/models");if(KY.existsSync(E)){let G=await KY.promises.readdir(E);if(G.length){for(let S of G)if(S.endsWith(".ts"))await KY.promises.unlink(T.frameworkPath(`cache/models/${S}`))}}}let $=(await import(Z)).default,X=T.basename(Z),J=pY($,Z),W=JSON.stringify($.attributes,null,2),z=T.frameworkPath(`cache/models/${X}`),H=!1;if(KY.existsSync(z)){C.info(`Fields have already been generated for ${J}`);let E=await c(X);if(JSON.stringify(E,null,2)===W){C.debug(`Fields have not changed for ${J}`);return}H=!0,C.debug(`Fields have changed for ${J}`)}else C.debug(`Fields have not been generated for ${J}`);await Bun.$`mkdir -p ${T.frameworkPath("cache/models")} && cp ${Z} ${z}`;let I=await a(J);if(C.debug(`Has ${J} been migrated? ${I}`),($.traits?.billable||!1)&&J==="users")await QZ(T.frameworkPath("defaults/app/Models/Subscription.ts"));if(H)await I4(Z);else await QZ(Z)}async function QZ(Z){C.debug("createTableMigration modelPath:",Z);let Y=(await import(Z)).default,$=pY(Y,Z),X=Y.traits?.useAuth&&typeof Y.traits.useAuth!=="boolean"?Y.traits.useAuth.useTwoFactor:!1;await Q4(Y,Z);let J=Y.traits?.useTimestamps??Y.traits?.timestampable??!0,W=Y?.traits?.useSocials&&Array.isArray(Y.traits.useSocials)&&Y.traits.useSocials.length>0,z=Array.isArray(Y?.traits?.likeable)?Y.traits.likeable.length>0:Boolean(Y?.traits?.likeable),H=Y.traits?.useSoftDeletes??Y.traits?.softDeletable??!1,I=(typeof Y.traits?.useAuth==="object"&&Y.traits.useAuth.usePasskey)??!1,Q=Y.traits?.billable||!1,E=Y.traits?.useUuid||!1;if(Q&&$==="users")await QZ(T.frameworkPath("defaults/app/Models/Subscription.ts"));let G=`import type { Database } from '@stacksjs/database'
638
+ `;if(G+=`import { sql } from '@stacksjs/database'
639
+
640
+ `,G+=`export async function up(db: Database<any>) {
641
+ `,G+=` await (db as any).schema
642
+ `,G+=` .createTable('${$}')
643
+ `,G+=` .addColumn('id', 'serial', (col) => col.primaryKey())
644
+ `,E)G+=` .addColumn('uuid', 'uuid', (col) => col.defaultTo(sql.raw('gen_random_uuid()')))
645
+ `;for(let[V,L]of n(Y.attributes)){let _=L,x=qY(V),B=o(_.validation?.rule,"postgres"),f="isRequired"in(_.validation?.rule??{})?(_.validation?.rule).isRequired:!1;if(G+=` .addColumn('${x}', ${B}`,f||_.unique||_.default!==void 0){if(G+=", col => col",f)G+=".notNull()";if(_.unique)G+=".unique()";if(_.default!==void 0)if(typeof _.default==="string")G+=`.defaultTo('${_.default.replace(/'/g,"\\'")}')`;else if(_.default===null)G+=".defaultTo(null)";else G+=`.defaultTo(${_.default})`;G+=""}G+=`)
646
+ `}if(W){let V=Y.traits?.useSocials||[];if(V.includes("google"))G+=` .addColumn('google_id', 'text')
647
+ `;if(V.includes("github"))G+=` .addColumn('github_id', 'text')
648
+ `;if(V.includes("apple"))G+=` .addColumn('apple_id', 'text')
649
+ `;if(V.includes("twitter"))G+=` .addColumn('twitter_id', 'text')
650
+ `;if(V.includes("facebook"))G+=` .addColumn('facebook_id', 'text')
651
+ `}if(z){let V=Array.isArray(Y.traits?.likeable)?Y.traits.likeable:[];for(let L of V)G+=` .addColumn('${L}_count', 'integer', (col) => col.defaultTo(0))
652
+ `}if(X!==!1&&X)G+=` .addColumn('two_factor_secret', 'text')
653
+ `;if(Q)G+=` .addColumn('stripe_id', 'text')
654
+ `;if(I)G+=` .addColumn('public_passkey', 'text')
655
+ `;if(J)G+=` .addColumn('created_at', 'timestamptz', col => col.notNull().defaultTo(sql.raw('CURRENT_TIMESTAMP')))
656
+ `,G+=` .addColumn('updated_at', 'timestamptz')
657
+ `;if(H)G+=` .addColumn('deleted_at', 'timestamptz')
658
+ `;if(G+=` .execute()
659
+ `,G+=V4($),z){let V=t(Y,$);if(V){let L=QY(Y,$);G+=`
660
+ // Create upvote table
661
+ `,G+=` await (db as any).schema
662
+ `,G+=` .createTable('${V}')
663
+ `,G+=` .addColumn('id', 'serial', (col) => col.primaryKey())
664
+ `,G+=` .addColumn('${L}', 'integer', (col) => col.notNull())
665
+ `,G+=` .addColumn('user_id', 'integer', (col) => col.notNull())
666
+ `,G+=` .addColumn('created_at', 'timestamptz', col => col.notNull().defaultTo(sql.raw('CURRENT_TIMESTAMP')))
667
+ `,G+=` .addColumn('updated_at', 'timestamptz')
668
+ `,G+=` .execute()
669
+
670
+ `,G+=` // Add indexes for upvote table
671
+ `,G+=` await (db as any).schema.createIndex('${V}_${L}_index').on('${V}').column('${L}').execute()
672
+ `,G+=` await (db as any).schema.createIndex('${V}_user_${L}_unique').on('${V}').columns(['user_id', '${L}']).unique().execute()
673
+ `,G+=` await (db as any).schema.createIndex('${V}_id_index').on('${V}').column('id').execute()
674
+ `}}G+=`}
675
+ `;let U=`${new Date().getTime().toString()}-create-${$}-table.ts`,A=T.userMigrationsPath(U);await Bun.write(A,G),C.success(`Created migration: ${IZ(U)}`)}async function Q4(Z,Y){let $=await j0(Z,Y),X=new Set;if(!$.length)return;for(let J of $){if(X.has(J.table))continue;if(await zY(J.table)){X.add(J.table);continue}let z=`import type { Database } from '@stacksjs/database'
676
+ `;z+=`import { sql } from '@stacksjs/database'
677
+
678
+ `,z+=`export async function up(db: Database<any>) {
679
+ `,z+=` await (db as any).schema
680
+ `,z+=` .createTable('${J.table}')
681
+ `,z+=` .addColumn('id', 'serial', (col) => col.primaryKey())
682
+ `,z+=` .addColumn('${J.firstForeignKey}', 'integer', (col) => col.notNull())
683
+ `,z+=` .addColumn('${J.secondForeignKey}', 'integer', (col) => col.notNull())
684
+ `,z+=` .addColumn('created_at', 'timestamptz', col => col.notNull().defaultTo(sql.raw('CURRENT_TIMESTAMP')))
685
+ `,z+=` .execute()
686
+
687
+ `,z+=` await (db as any).schema
688
+ `,z+=` .alterTable('${J.table}')
689
+ `,z+=` .addForeignKeyConstraint('${J.table}_${J.firstForeignKey}_fkey', ['${J.firstForeignKey}'], '${G4(J.firstForeignKey?.replace(/_id$/,"")||"")}', ['id'], (cb) => cb.onDelete('cascade'))
690
+ `,z+=` .execute()
691
+
692
+ `,z+=` await (db as any).schema
693
+ `,z+=` .alterTable('${J.table}')
694
+ `,z+=` .addUniqueConstraint('${J.table}_unique', ['${J.firstForeignKey}', '${J.secondForeignKey}'])
695
+ `,z+=` .execute()
696
+
697
+ `,z+=` await (db as any).schema
698
+ `,z+=` .createIndex('${J.table}_${J.firstForeignKey}_idx')
699
+ `,z+=` .on('${J.table}')
700
+ `,z+=` .column('${J.firstForeignKey}')
701
+ `,z+=` .execute()
702
+
703
+ `,z+=` await (db as any).schema
704
+ `,z+=` .createIndex('${J.table}_${J.secondForeignKey}_idx')
705
+ `,z+=` .on('${J.table}')
706
+ `,z+=` .column('${J.secondForeignKey}')
707
+ `,z+=` .execute()
708
+ `,z+=`}
709
+ `;let I=`${new Date().getTime().toString()}-create-${J.table}-table.ts`,Q=T.userMigrationsPath(I);await Bun.write(Q,z),X.add(J.table),C.success(`Created migration: ${IZ(I)}`)}}async function I4(Z){let Y=(await import(Z)).default,$=z4(Y,Z),X=pY(Y,Z),J=!1,z=await c($)??{},H=Y.attributes,I=GY(Object.keys(z),Object.keys(H)),Q=I?.added||[],E=I?.removed||[],G=`import type { Database } from '@stacksjs/database'
710
+ `;if(G+=`import { sql } from '@stacksjs/database'
711
+
712
+ `,G+=`export async function up(db: Database<any>) {
713
+ `,Q.length||E.length)J=!0,G+=` await (db as any).schema.alterTable('${X}')
714
+ `;for(let V of Q){let L=H[V],_=o(L.validation?.rule,"postgres"),x=qY(V),B="isRequired"in(L.validation?.rule??{})?(L.validation?.rule).isRequired:!1;if(G+=` .addColumn('${x}', '${_}'`,B||L.unique||L.default!==void 0){if(G+=", col => col",B)G+=".notNull()";if(L.unique)G+=".unique()";if(L.default!==void 0)if(typeof L.default==="string")G+=`.defaultTo('${L.default}')`;else if(L.default===null)G+=".defaultTo(null)";else G+=`.defaultTo(${L.default})`;G+=""}G+=`)
715
+ `}for(let V of E)G+=` .dropColumn('${V}')
716
+ `;let S=UY(z,H);for(let V of S){J=!0;let L=qY(V.key);G+=` .alterColumn('${L}', (col) => col.setDataType('text'))
717
+ `}let U=Object.values(z).map((V)=>V.order),A=Object.values(H).map((V)=>V.order);if(!HY(U,A))J=!0;if(J){G+=` .execute()
718
+ `,G+=`}
719
+ `;let L=`${new Date().getTime().toString()}-alter-${X}-table.ts`,_=T.userMigrationsPath(L);await Bun.write(_,G),C.success(`Created alter migration: ${IZ(L)}`)}}function K4(Z,Y){if(Y.unique||Y.where){let X=Y.unique?"UNIQUE ":"",J=Y.columns.map((z)=>qY(z)).join(", "),W=Y.where?` WHERE ${Y.where}`:"";return` await db.unsafe(\`CREATE ${X}INDEX IF NOT EXISTS "${Y.name}" ON "${Z}" (${J})${W}\`).execute()
720
+ `}let $=Y.columns.map((X)=>`'${qY(X)}'`).join(", ");return` await (db as any).schema.createIndex('${Y.name}').on('${Z}').columns([${$}]).execute()
721
+ `}function V4(Z){return` await (db as any).schema.createIndex('${Z}_id_index').on('${Z}').column('id').execute()
722
+ `}async function _4(){let Z=w0([T.userModelsPath("*.ts"),T.storagePath("framework/defaults/app/Models/**/*.ts")],{absolute:!0}),Y=[];for(let $ of Z){let X=(await import($)).default,J=pY(X,$);Y.push(J)}return Y}D();import{log as v}from"@stacksjs/logging";import{app as L4}from"@stacksjs/config";import{ok as E4}from"@stacksjs/error-handling";import{fetchOtherModelRelations as A4,getModelName as x0,getPivotTables as q0,getTableName as uY}from"@stacksjs/orm";import{path as N}from"@stacksjs/path";import{fs as k0,globSync as R4}from"@stacksjs/storage";import{snakeCase as YY}from"@stacksjs/strings";function S0(Z){return`\x1B[3m${Z}\x1B[23m`}async function H7(){return await WY(),await JY(),await O4(),E4("All tables dropped successfully!")}async function U7(){try{for(let Z of rY)await K.unsafe(Z).execute()}catch(Z){v.debug(`[sqlite] Failed to apply pragmas: ${Z.message}`)}}async function O4(){let Z=R4([N.userModelsPath("*.ts"),N.storagePath("framework/defaults/app/Models/**/*.ts")],{absolute:!0}),Y=await vY(),$=/^[a-z_][\w]*$/i;await K.unsafe("PRAGMA foreign_keys = OFF").execute();try{for(let X of Y){if(!$.test(X))throw Error(`[sqlite] Refusing to drop table with unsafe name: ${X}`);await K.unsafe(`DROP TABLE IF EXISTS "${X}"`).execute()}await K.unsafe('DROP TABLE IF EXISTS "migrations"').execute(),await hY();for(let X of Z){let J=(await import(X)).default,W=await q0(J,X);for(let z of W){if(!$.test(z.table))throw Error(`[sqlite] Refusing to drop pivot table with unsafe name: ${z.table}`);await K.unsafe(`DROP TABLE IF EXISTS "${z.table}"`).execute()}}}finally{await K.unsafe("PRAGMA foreign_keys = ON").execute()}}function Q7(){if(L4.env==="testing")return B4();return N.userDatabasePath("stacks.sqlite")}function B4(){return N.userDatabasePath("stacks_testing.sqlite")}async function I7(Z){let Y=(await import(Z)).default,$=N.basename(Z),X=await uY(Y,Z),J=JSON.stringify(Y.attributes,null,2),W=N.frameworkPath(`cache/models/${$}`),z=!1;if(k0.existsSync(W)){v.debug(`Fields have already been generated for ${X}`);let I=await c($);if(JSON.stringify(I,null,2)===J){v.debug(`Fields have not changed for ${X}`);return}z=!0,v.debug(`Fields have changed for ${X}`)}else v.debug(`Fields have not been generated for ${X}`);await Bun.$`mkdir -p ${N.frameworkPath("cache/models")} && cp ${Z} ${W}`;let H=!1;if(v.debug(`Has ${X} been migrated? ${H}`),z)await S4(Z);else await j4(Z)}async function K7(Z){let Y=(await import(Z)).default,$=N.basename(Z),X=await uY(Y,Z),J=JSON.stringify(Y.attributes,null,2),W=N.frameworkPath(`cache/models/${$}`);if(k0.existsSync(W)){v.debug(`Fields have already been generated for ${X}`);let z=await c($);if(JSON.stringify(z,null,2)===J){v.debug(`Fields have not changed for ${X}`);return}}await Bun.$`mkdir -p ${N.frameworkPath("cache/models")} && cp ${Z} ${W}`}async function j4(Z){v.debug("createTableMigration modelPath:",Z);let Y=(await import(Z)).default,$=uY(Y,Z),X=x0(Y,Z),J=Y.traits?.useAuth&&typeof Y.traits.useAuth!=="boolean"?Y.traits.useAuth.useTwoFactor:!1;await w4(Y,Z);let W=await A4(X),z=Y?.traits?.useTimestamps??Y?.traits?.timestampable??!0,H=Y?.traits?.useSocials&&Array.isArray(Y.traits.useSocials)&&Y.traits.useSocials.length>0,I=Array.isArray(Y?.traits?.likeable)?Y.traits.likeable.length>0:Boolean(Y?.traits?.likeable),Q=Y?.traits?.useSoftDeletes??Y?.traits?.softDeletable??!1,E=(typeof Y.traits?.useAuth==="object"&&Y.traits.useAuth.usePasskey)??!1,G=Y.traits?.billable||!1,S=Y.traits?.useUuid||!1,U=`import type { Database } from '@stacksjs/database'
658
723
  `;if(U+=`import { sql } from '@stacksjs/database'
659
724
 
660
725
  `,U+=`export async function up(db: Database<any>) {
661
726
  `,U+=` await (db as any).schema
662
727
  `,U+=` .createTable('${$}')
663
- `,U+=` .addColumn('id', 'serial', (col) => col.primaryKey())
664
- `,_)U+=` .addColumn('uuid', 'uuid', (col) => col.defaultTo(sql.raw('gen_random_uuid()')))
665
- `;for(let[B,E]of XY(Y.attributes)){let V=E,j=gY(B),R=WY(V.validation?.rule,"postgres"),v="isRequired"in(V.validation?.rule??{})?(V.validation?.rule).isRequired:!1;if(U+=` .addColumn('${j}', ${R}`,v||V.unique||V.default!==void 0){if(U+=", col => col",v)U+=".notNull()";if(V.unique)U+=".unique()";if(V.default!==void 0)if(typeof V.default==="string")U+=`.defaultTo('${V.default.replace(/'/g,"\\'")}')`;else if(V.default===null)U+=".defaultTo(null)";else U+=`.defaultTo(${V.default})`;U+=""}U+=`)
666
- `}if(W){let B=Y.traits?.useSocials||[];if(B.includes("google"))U+=` .addColumn('google_id', 'text')
667
- `;if(B.includes("github"))U+=` .addColumn('github_id', 'text')
668
- `;if(B.includes("apple"))U+=` .addColumn('apple_id', 'text')
669
- `;if(B.includes("twitter"))U+=` .addColumn('twitter_id', 'text')
670
- `;if(B.includes("facebook"))U+=` .addColumn('facebook_id', 'text')
671
- `}if(H){let B=Array.isArray(Y.traits?.likeable)?Y.traits.likeable:[];for(let E of B)U+=` .addColumn('${E}_count', 'integer', (col) => col.defaultTo(0))
728
+ `,U+=` .addColumn('id', 'integer', col => col.primaryKey().autoIncrement())
729
+ `,S)U+=` .addColumn('uuid', 'text')
730
+ `;if(H){let _=Y.traits?.useSocials||[];if(_.includes("google"))U+=` .addColumn('google_id', 'text')
731
+ `;if(_.includes("github"))U+=` .addColumn('github_id', 'text')
732
+ `;if(_.includes("apple"))U+=` .addColumn('apple_id', 'text')
733
+ `;if(_.includes("twitter"))U+=` .addColumn('twitter_id', 'text')
734
+ `;if(_.includes("facebook"))U+=` .addColumn('facebook_id', 'text')
735
+ `}for(let[_,x]of n(Y.attributes)){let B=x,f=YY(_),kY=o(B.validation?.rule,"sqlite");U+=` .addColumn('${f}', ${kY}`;let w=B.validation?.rule.isRequired;if(w||B.unique||B.default!==void 0){if(U+=", col => col",w)U+=".notNull()";if(B.unique)U+=".unique()";if(B.default!==void 0)if(typeof B.default==="string")U+=`.defaultTo('${B.default}')`;else if(B.default===null)U+=".defaultTo(null)";else U+=`.defaultTo(${B.default})`;U+=""}U+=`)
672
736
  `}if(J!==!1&&J)U+=` .addColumn('two_factor_secret', 'text')
673
- `;if(Q)U+=` .addColumn('stripe_id', 'text')
674
- `;if(z)U+=` .addColumn('public_passkey', 'text')
675
- `;if(X)U+=` .addColumn('created_at', 'timestamptz', col => col.notNull().defaultTo(sql.raw('CURRENT_TIMESTAMP')))
676
- `,U+=` .addColumn('updated_at', 'timestamptz')
677
- `;if(G)U+=` .addColumn('deleted_at', 'timestamptz')
737
+ `;if(G)U+=` .addColumn('stripe_id', 'text')
738
+ `;if(Q)U+=` .addColumn('deleted_at', 'timestamp')
739
+ `;if(E)U+=` .addColumn('public_passkey', 'text')
740
+ `;if(W?.length)for(let _ of W){if(!_.foreignKey)continue;U+=` .addColumn('${_.foreignKey}', 'integer', (col) =>
741
+ col.references('${_.relationTable}.id').onDelete('cascade')
742
+ )
743
+ `}if(z)U+=" .addColumn('created_at', 'timestamp', col => col.notNull().defaultTo(sql`CURRENT_TIMESTAMP`))\n",U+=` .addColumn('updated_at', 'timestamp')
678
744
  `;if(U+=` .execute()
679
- `,U+=e8($),H){let B=UY(Y,$);if(B){let E=RY(Y,$);U+=`
745
+
746
+ `,W?.length)for(let _ of W){if(!_.foreignKey)continue;U+=k4($,_.foreignKey)}if(Y.indexes?.length){U+=`
747
+ `;for(let _ of Y.indexes)U+=KZ($,_)}if(U+=q4($),I){let _=t(Y,$);if(_){let x=QY(Y,$);U+=`
680
748
  // Create upvote table
681
749
  `,U+=` await (db as any).schema
682
- `,U+=` .createTable('${B}')
683
- `,U+=` .addColumn('id', 'serial', (col) => col.primaryKey())
684
- `,U+=` .addColumn('${E}', 'integer', (col) => col.notNull())
685
- `,U+=` .addColumn('user_id', 'integer', (col) => col.notNull())
686
- `,U+=` .addColumn('created_at', 'timestamptz', col => col.notNull().defaultTo(sql.raw('CURRENT_TIMESTAMP')))
687
- `,U+=` .addColumn('updated_at', 'timestamptz')
750
+ `,U+=` .createTable('${_}')
751
+ `,U+=` .addColumn('id', 'integer', col => col.primaryKey().autoIncrement())
752
+ `,U+=` .addColumn('${x}', 'integer', col => col.notNull())
753
+ `,U+=` .addColumn('user_id', 'integer', col => col.notNull())
754
+ `,U+=" .addColumn('created_at', 'timestamp', col => col.notNull().defaultTo(sql`CURRENT_TIMESTAMP`))\n",U+=` .addColumn('updated_at', 'timestamp')
688
755
  `,U+=` .execute()
689
756
 
690
757
  `,U+=` // Add indexes for upvote table
691
- `,U+=` await (db as any).schema.createIndex('${B}_${E}_index').on('${B}').column('${E}').execute()
692
- `,U+=` await (db as any).schema.createIndex('${B}_user_${E}_unique').on('${B}').columns(['user_id', '${E}']).unique().execute()
693
- `,U+=` await (db as any).schema.createIndex('${B}_id_index').on('${B}').column('id').execute()
758
+ `,U+=` await (db as any).schema.createIndex('${_}_${x}_index').on('${_}').column('${x}').execute()
759
+ `,U+=` await (db as any).schema.createIndex('${_}_user_${x}_unique').on('${_}').columns(['user_id', '${x}']).unique().execute()
760
+ `,U+=` await (db as any).schema.createIndex('${_}_id_index').on('${_}').column('id').execute()
694
761
  `}}U+=`}
695
- `;let O=`${new Date().getTime().toString()}-create-${$}-table.ts`,L=y.userMigrationsPath(O);await Bun.write(L,U),r.success(`Created migration: ${vZ(O)}`)}async function a8(Z,Y){let $=await z6(Z,Y),J=new Set;if(!$.length)return;for(let X of $){if(J.has(X.table))continue;if(await EY(X.table)){J.add(X.table);continue}let H=`import type { Database } from '@stacksjs/database'
696
- `;H+=`import { sql } from '@stacksjs/database'
697
-
698
- `,H+=`export async function up(db: Database<any>) {
699
- `,H+=` await (db as any).schema
700
- `,H+=` .createTable('${X.table}')
701
- `,H+=` .addColumn('id', 'serial', (col) => col.primaryKey())
702
- `,H+=` .addColumn('${X.firstForeignKey}', 'integer', (col) => col.notNull())
703
- `,H+=` .addColumn('${X.secondForeignKey}', 'integer', (col) => col.notNull())
704
- `,H+=` .addColumn('created_at', 'timestamptz', col => col.notNull().defaultTo(sql.raw('CURRENT_TIMESTAMP')))
705
- `,H+=` .execute()
706
-
707
- `,H+=` await (db as any).schema
708
- `,H+=` .alterTable('${X.table}')
709
- `,H+=` .addForeignKeyConstraint('${X.table}_${X.firstForeignKey}_fkey', ['${X.firstForeignKey}'], '${r8(X.firstForeignKey?.replace(/_id$/,"")||"")}', ['id'], (cb) => cb.onDelete('cascade'))
710
- `,H+=` .execute()
711
-
712
- `,H+=` await (db as any).schema
713
- `,H+=` .alterTable('${X.table}')
714
- `,H+=` .addUniqueConstraint('${X.table}_unique', ['${X.firstForeignKey}', '${X.secondForeignKey}'])
715
- `,H+=` .execute()
716
-
717
- `,H+=` await (db as any).schema
718
- `,H+=` .createIndex('${X.table}_${X.firstForeignKey}_idx')
719
- `,H+=` .on('${X.table}')
720
- `,H+=` .column('${X.firstForeignKey}')
721
- `,H+=` .execute()
722
-
723
- `,H+=` await (db as any).schema
724
- `,H+=` .createIndex('${X.table}_${X.secondForeignKey}_idx')
725
- `,H+=` .on('${X.table}')
726
- `,H+=` .column('${X.secondForeignKey}')
727
- `,H+=` .execute()
728
- `,H+=`}
729
- `;let z=`${new Date().getTime().toString()}-create-${X.table}-table.ts`,Q=y.userMigrationsPath(z);await Bun.write(Q,H),J.add(X.table),r.success(`Created migration: ${vZ(z)}`)}}async function o8(Z){let Y=(await import(Z)).default,$=l8(Y,Z),J=XZ(Y,Z),X=!1,H=await s($)??{},G=Y.attributes,z=IY(Object.keys(H),Object.keys(G)),Q=z?.added||[],_=z?.removed||[],U=`import type { Database } from '@stacksjs/database'
730
- `;if(U+=`import { sql } from '@stacksjs/database'
731
-
732
- `,U+=`export async function up(db: Database<any>) {
733
- `,Q.length||_.length)X=!0,U+=` await (db as any).schema.alterTable('${J}')
734
- `;for(let B of Q){let E=G[B],V=WY(E.validation?.rule,"postgres"),j=gY(B),R="isRequired"in(E.validation?.rule??{})?(E.validation?.rule).isRequired:!1;if(U+=` .addColumn('${j}', '${V}'`,R||E.unique||E.default!==void 0){if(U+=", col => col",R)U+=".notNull()";if(E.unique)U+=".unique()";if(E.default!==void 0)if(typeof E.default==="string")U+=`.defaultTo('${E.default}')`;else if(E.default===null)U+=".defaultTo(null)";else U+=`.defaultTo(${E.default})`;U+=""}U+=`)
735
- `}for(let B of _)U+=` .dropColumn('${B}')
736
- `;let I=jY(H,G);for(let B of I){X=!0;let E=gY(B.key);U+=` .alterColumn('${E}', (col) => col.setDataType('text'))
737
- `}let O=Object.values(H).map((B)=>B.order),L=Object.values(G).map((B)=>B.order);if(!KY(O,L))X=!0;if(X){U+=` .execute()
738
- `,U+=`}
739
- `;let E=`${new Date().getTime().toString()}-alter-${J}-table.ts`,V=y.userMigrationsPath(E);await Bun.write(V,U),r.success(`Created alter migration: ${vZ(E)}`)}}function t8(Z,Y){if(Y.unique||Y.where){let J=Y.unique?"UNIQUE ":"",X=Y.columns.map((H)=>gY(H)).join(", "),W=Y.where?` WHERE ${Y.where}`:"";return` await db.unsafe(\`CREATE ${J}INDEX IF NOT EXISTS "${Y.name}" ON "${Z}" (${X})${W}\`).execute()
740
- `}let $=Y.columns.map((J)=>`'${gY(J)}'`).join(", ");return` await (db as any).schema.createIndex('${Y.name}').on('${Z}').columns([${$}]).execute()
741
- `}function e8(Z){return` await (db as any).schema.createIndex('${Z}_id_index').on('${Z}').column('id').execute()
742
- `}async function Y$(){let Z=U6([y.userModelsPath("*.ts"),y.storagePath("framework/defaults/app/Models/**/*.ts")],{absolute:!0}),Y=[];for(let $ of Z){let J=(await import($)).default,X=XZ(J,$);Y.push(X)}return Y}F();import{log as c}from"@stacksjs/logging";import{app as Z$}from"@stacksjs/config";import{ok as $$}from"@stacksjs/error-handling";import{fetchOtherModelRelations as J$,getModelName as _6,getPivotTables as O6,getTableName as WZ}from"@stacksjs/orm";import{path as f}from"@stacksjs/path";import{fs as A6,globSync as X$}from"@stacksjs/storage";import{snakeCase as QY}from"@stacksjs/strings";function Q6(Z){return`\x1B[3m${Z}\x1B[23m`}async function Z9(){return await LY(),await VY(),await W$(),$$("All tables dropped successfully!")}async function $9(){try{for(let Z of BZ)await A.unsafe(Z).execute()}catch(Z){c.debug(`[sqlite] Failed to apply pragmas: ${Z.message}`)}}async function W$(){let Z=X$([f.userModelsPath("*.ts"),f.storagePath("framework/defaults/app/Models/**/*.ts")],{absolute:!0}),Y=await ZZ(),$=/^[a-z_][\w]*$/i;await A.unsafe("PRAGMA foreign_keys = OFF").execute();try{for(let J of Y){if(!$.test(J))throw Error(`[sqlite] Refusing to drop table with unsafe name: ${J}`);await A.unsafe(`DROP TABLE IF EXISTS "${J}"`).execute()}await A.unsafe('DROP TABLE IF EXISTS "migrations"').execute(),await JZ();for(let J of Z){let X=(await import(J)).default,W=await O6(X,J);for(let H of W){if(!$.test(H.table))throw Error(`[sqlite] Refusing to drop pivot table with unsafe name: ${H.table}`);await A.unsafe(`DROP TABLE IF EXISTS "${H.table}"`).execute()}}}finally{await A.unsafe("PRAGMA foreign_keys = ON").execute()}}function J9(){if(Z$.env==="testing")return H$();return f.userDatabasePath("stacks.sqlite")}function H$(){return f.userDatabasePath("stacks_testing.sqlite")}async function X9(Z){let Y=(await import(Z)).default,$=f.basename(Z),J=await WZ(Y,Z),X=JSON.stringify(Y.attributes,null,2),W=f.frameworkPath(`cache/models/${$}`),H=!1;if(A6.existsSync(W)){c.debug(`Fields have already been generated for ${J}`);let z=await s($);if(JSON.stringify(z,null,2)===X){c.debug(`Fields have not changed for ${J}`);return}H=!0,c.debug(`Fields have changed for ${J}`)}else c.debug(`Fields have not been generated for ${J}`);await Bun.$`mkdir -p ${f.frameworkPath("cache/models")} && cp ${Z} ${W}`;let G=!1;if(c.debug(`Has ${J} been migrated? ${G}`),H)await U$(Z);else await G$(Z)}async function W9(Z){let Y=(await import(Z)).default,$=f.basename(Z),J=await WZ(Y,Z),X=JSON.stringify(Y.attributes,null,2),W=f.frameworkPath(`cache/models/${$}`);if(A6.existsSync(W)){c.debug(`Fields have already been generated for ${J}`);let H=await s($);if(JSON.stringify(H,null,2)===X){c.debug(`Fields have not changed for ${J}`);return}}await Bun.$`mkdir -p ${f.frameworkPath("cache/models")} && cp ${Z} ${W}`}async function G$(Z){c.debug("createTableMigration modelPath:",Z);let Y=(await import(Z)).default,$=WZ(Y,Z),J=_6(Y,Z),X=Y.traits?.useAuth&&typeof Y.traits.useAuth!=="boolean"?Y.traits.useAuth.useTwoFactor:!1;await z$(Y,Z);let W=await J$(J),H=Y?.traits?.useTimestamps??Y?.traits?.timestampable??!0,G=Y?.traits?.useSocials&&Array.isArray(Y.traits.useSocials)&&Y.traits.useSocials.length>0,z=Array.isArray(Y?.traits?.likeable)?Y.traits.likeable.length>0:Boolean(Y?.traits?.likeable),Q=Y?.traits?.useSoftDeletes??Y?.traits?.softDeletable??!1,_=(typeof Y.traits?.useAuth==="object"&&Y.traits.useAuth.usePasskey)??!1,U=Y.traits?.billable||!1,I=Y.traits?.useUuid||!1,O=`import type { Database } from '@stacksjs/database'
743
- `;if(O+=`import { sql } from '@stacksjs/database'
744
-
745
- `,O+=`export async function up(db: Database<any>) {
746
- `,O+=` await (db as any).schema
747
- `,O+=` .createTable('${$}')
748
- `,O+=` .addColumn('id', 'integer', col => col.primaryKey().autoIncrement())
749
- `,I)O+=` .addColumn('uuid', 'text')
750
- `;if(G){let V=Y.traits?.useSocials||[];if(V.includes("google"))O+=` .addColumn('google_id', 'text')
751
- `;if(V.includes("github"))O+=` .addColumn('github_id', 'text')
752
- `;if(V.includes("apple"))O+=` .addColumn('apple_id', 'text')
753
- `;if(V.includes("twitter"))O+=` .addColumn('twitter_id', 'text')
754
- `;if(V.includes("facebook"))O+=` .addColumn('facebook_id', 'text')
755
- `}for(let[V,j]of XY(Y.attributes)){let R=j,v=QY(V),rY=WY(R.validation?.rule,"sqlite");O+=` .addColumn('${v}', ${rY}`;let D=R.validation?.rule.isRequired;if(D||R.unique||R.default!==void 0){if(O+=", col => col",D)O+=".notNull()";if(R.unique)O+=".unique()";if(R.default!==void 0)if(typeof R.default==="string")O+=`.defaultTo('${R.default}')`;else if(R.default===null)O+=".defaultTo(null)";else O+=`.defaultTo(${R.default})`;O+=""}O+=`)
756
- `}if(X!==!1&&X)O+=` .addColumn('two_factor_secret', 'text')
757
- `;if(U)O+=` .addColumn('stripe_id', 'text')
758
- `;if(Q)O+=` .addColumn('deleted_at', 'timestamp')
759
- `;if(_)O+=` .addColumn('public_passkey', 'text')
760
- `;if(W?.length)for(let V of W){if(!V.foreignKey)continue;O+=` .addColumn('${V.foreignKey}', 'integer', (col) =>
761
- col.references('${V.relationTable}.id').onDelete('cascade')
762
- )
763
- `}if(H)O+=" .addColumn('created_at', 'timestamp', col => col.notNull().defaultTo(sql`CURRENT_TIMESTAMP`))\n",O+=` .addColumn('updated_at', 'timestamp')
764
- `;if(O+=` .execute()
765
-
766
- `,W?.length)for(let V of W){if(!V.foreignKey)continue;O+=O$($,V.foreignKey)}if(Y.indexes?.length){O+=`
767
- `;for(let V of Y.indexes)O+=fZ($,V)}if(O+=_$($),z){let V=UY(Y,$);if(V){let j=RY(Y,$);O+=`
768
- // Create upvote table
769
- `,O+=` await (db as any).schema
770
- `,O+=` .createTable('${V}')
771
- `,O+=` .addColumn('id', 'integer', col => col.primaryKey().autoIncrement())
772
- `,O+=` .addColumn('${j}', 'integer', col => col.notNull())
773
- `,O+=` .addColumn('user_id', 'integer', col => col.notNull())
774
- `,O+=" .addColumn('created_at', 'timestamp', col => col.notNull().defaultTo(sql`CURRENT_TIMESTAMP`))\n",O+=` .addColumn('updated_at', 'timestamp')
775
- `,O+=` .execute()
776
-
777
- `,O+=` // Add indexes for upvote table
778
- `,O+=` await (db as any).schema.createIndex('${V}_${j}_index').on('${V}').column('${j}').execute()
779
- `,O+=` await (db as any).schema.createIndex('${V}_user_${j}_unique').on('${V}').columns(['user_id', '${j}']).unique().execute()
780
- `,O+=` await (db as any).schema.createIndex('${V}_id_index').on('${V}').column('id').execute()
781
- `}}O+=`}
782
- `;let B=`${new Date().getTime().toString()}-create-${$}-table.ts`,E=f.userMigrationsPath(B);await Bun.write(E,O),c.success(`Created migration: ${Q6(B)}`)}async function z$(Z,Y){let $=await O6(Z,Y);if(!$.length)return;for(let J of $){if(await EY(J.table))return;let W=`import type { Database } from '@stacksjs/database'
762
+ `;let V=`${new Date().getTime().toString()}-create-${$}-table.ts`,L=N.userMigrationsPath(V);await Bun.write(L,U),v.success(`Created migration: ${S0(V)}`)}async function w4(Z,Y){let $=await q0(Z,Y);if(!$.length)return;for(let X of $){if(await zY(X.table))return;let W=`import type { Database } from '@stacksjs/database'
783
763
  `;W+=`import { sql } from '@stacksjs/database'
784
764
 
785
765
  `,W+=`export async function up(db: Database<any>) {
786
766
  `,W+=` await (db as any).schema
787
- `,W+=` .createTable('${J.table}')
767
+ `,W+=` .createTable('${X.table}')
788
768
  `,W+=` .addColumn('id', 'integer', col => col.primaryKey().autoIncrement())
789
- `,W+=` .addColumn('${J.firstForeignKey}', 'integer')
790
- `,W+=` .addColumn('${J.secondForeignKey}', 'integer')
769
+ `,W+=` .addColumn('${X.firstForeignKey}', 'integer')
770
+ `,W+=` .addColumn('${X.secondForeignKey}', 'integer')
791
771
  `,W+=` .addColumn('created_at', 'timestamp', col => col.defaultTo(sql.raw('CURRENT_TIMESTAMP')))
792
772
  `,W+=` .execute()
793
773
  `,W+=` }
794
- `;let G=`${new Date().getTime().toString()}-create-${J.table}-table.ts`,z=f.userMigrationsPath(G);await Bun.write(z,W),c.success(`Created pivot migration: ${G}`)}}async function U$(Z){let Y=(await import(Z)).default,$=_6(Y,Z),J=WZ(Y,Z),X=!1,H=(await import(f.frameworkPath(`cache/models/${$}.ts`))).default,z=await s($)??{},Q=Y.attributes,_=IY(Object.keys(z),Object.keys(Q)),U=_?.added||[],I=_?.removed||[],O=`import type { Database } from '@stacksjs/database'
795
- `;if(O+=`import { sql } from '@stacksjs/database'
796
-
797
- `,O+=`export async function up(db: Database<any>) {
798
- `,U.length||I.length)X=!0,O+=` await (db as any).schema.alterTable('${J}')
799
- `;let L=jY(z,Q);for(let D of L){X=!0;let q=QY(D.key);O+=`await sql\`
800
- ALTER TABLE ${J}
801
- MODIFY COLUMN ${q} TEXT
774
+ `;let H=`${new Date().getTime().toString()}-create-${X.table}-table.ts`,I=N.userMigrationsPath(H);await Bun.write(I,W),v.success(`Created pivot migration: ${H}`)}}async function S4(Z){let Y=(await import(Z)).default,$=x0(Y,Z),X=uY(Y,Z),J=!1,z=(await import(N.frameworkPath(`cache/models/${$}.ts`))).default,I=await c($)??{},Q=Y.attributes,E=GY(Object.keys(I),Object.keys(Q)),G=E?.added||[],S=E?.removed||[],U=`import type { Database } from '@stacksjs/database'
775
+ `;if(U+=`import { sql } from '@stacksjs/database'
776
+
777
+ `,U+=`export async function up(db: Database<any>) {
778
+ `,G.length||S.length)J=!0,U+=` await (db as any).schema.alterTable('${X}')
779
+ `;let A=UY(I,Q);for(let w of A){J=!0;let k=YY(w.key);U+=`await sql\`
780
+ ALTER TABLE ${X}
781
+ MODIFY COLUMN ${k} TEXT
802
782
  \`.execute(db)
803
783
 
804
- `}for(let D of U){let q=Q[D],w=WY(q.validation?.rule,"sqlite"),g=QY(D),zY=q.validation?.rule.isRequired;if(O+=` .addColumn('${g}', ${w}`,zY||q.unique||q.default!==void 0){if(O+=", col => col",zY)O+=".notNull()";if(q.unique)O+=".unique()";if(q.default!==void 0)if(typeof q.default==="string")O+=`.defaultTo('${q.default}')`;else if(q.default===null)O+=".defaultTo(null)";else O+=`.defaultTo(${q.default})`;O+=""}O+=`)
784
+ `}for(let w of G){let k=Q[w],O=o(k.validation?.rule,"sqlite"),h=YY(w),i=k.validation?.rule.isRequired;if(U+=` .addColumn('${h}', ${O}`,i||k.unique||k.default!==void 0){if(U+=", col => col",i)U+=".notNull()";if(k.unique)U+=".unique()";if(k.default!==void 0)if(typeof k.default==="string")U+=`.defaultTo('${k.default}')`;else if(k.default===null)U+=".defaultTo(null)";else U+=`.defaultTo(${k.default})`;U+=""}U+=`)
805
785
 
806
- `}for(let D of I)O+=` .dropColumn('${D}')
807
- `;if(U.length||I.length)O+=` .execute();
808
- `;let B=Object.values(z).map((D)=>D.order),E=Object.values(Q).map((D)=>D.order);if(!KY(B,E))X=!0,O+=Q$(Y.attributes,J);let V=H.indexes||[],j=Y.indexes||[];for(let D of V)if(!j.find((q)=>q.name===D.name))X=!0,O+=` await (db as any).schema.dropIndex('${D.name}').execute()
809
- `;for(let D of j)if(!V.find((q)=>q.name===D.name))X=!0,O+=fZ(J,D);O+=`}
810
- `;let v=`${new Date().getTime().toString()}-update-${J}-table.ts`,rY=f.userMigrationsPath(v);if(X)await Bun.write(rY,O),c.success(`Created migration: ${Q6(v)}`)}function Q$(Z,Y){let $=XY(Z),J="",X="";for(let[W]of $){let H=QY(W);if(X)J+=`await sql\`
786
+ `}for(let w of S)U+=` .dropColumn('${w}')
787
+ `;if(G.length||S.length)U+=` .execute();
788
+ `;let V=Object.values(I).map((w)=>w.order),L=Object.values(Q).map((w)=>w.order);if(!HY(V,L))J=!0,U+=x4(Y.attributes,X);let _=z.indexes||[],x=Y.indexes||[];for(let w of _)if(!x.find((k)=>k.name===w.name))J=!0,U+=` await (db as any).schema.dropIndex('${w.name}').execute()
789
+ `;for(let w of x)if(!_.find((k)=>k.name===w.name))J=!0,U+=KZ(X,w);U+=`}
790
+ `;let f=`${new Date().getTime().toString()}-update-${X}-table.ts`,kY=N.userMigrationsPath(f);if(J)await Bun.write(kY,U),v.success(`Created migration: ${S0(f)}`)}function x4(Z,Y){let $=n(Z),X="",J="";for(let[W]of $){let z=YY(W);if(J)X+=`await sql\`
811
791
  ALTER TABLE ${Y}
812
- MODIFY COLUMN ${H} TEXT NOT NULL AFTER ${QY(X)};
792
+ MODIFY COLUMN ${z} TEXT NOT NULL AFTER ${YY(J)};
813
793
  \`.execute(db)
814
794
 
815
- `;X=H}return J}function fZ(Z,Y){if(Y.unique||Y.where){let J=Y.unique?"UNIQUE ":"",X=Y.columns.map((H)=>QY(H)).join(", "),W=Y.where?` WHERE ${Y.where}`:"";return` await db.unsafe(\`CREATE ${J}INDEX IF NOT EXISTS "${Y.name}" ON "${Z}" (${X})${W}\`).execute()
816
- `}let $=Y.columns.map((J)=>`\`${QY(J)}\``).join(", ");return` await (db as any).schema.createIndex('${Y.name}').on('${Z}').columns([${$}]).execute()
817
- `}function _$(Z){return` await (db as any).schema.createIndex('${Z}_id_index').on('${Z}').column('id').execute()
818
- `}function O$(Z,Y){return` await (db as any).schema.createIndex('${Z}_${Y}_index').on('${Z}').column(\`${Y}\`).execute()
795
+ `;J=z}return X}function KZ(Z,Y){if(Y.unique||Y.where){let X=Y.unique?"UNIQUE ":"",J=Y.columns.map((z)=>YY(z)).join(", "),W=Y.where?` WHERE ${Y.where}`:"";return` await db.unsafe(\`CREATE ${X}INDEX IF NOT EXISTS "${Y.name}" ON "${Z}" (${J})${W}\`).execute()
796
+ `}let $=Y.columns.map((X)=>`\`${YY(X)}\``).join(", ");return` await (db as any).schema.createIndex('${Y.name}').on('${Z}').columns([${$}]).execute()
797
+ `}function q4(Z){return` await (db as any).schema.createIndex('${Z}_id_index').on('${Z}').column('id').execute()
798
+ `}function k4(Z,Y){return` await (db as any).schema.createIndex('${Z}_${Y}_index').on('${Z}').column(\`${Y}\`).execute()
819
799
 
820
- `}function bZ(Z){if(Z===null||Z===void 0)return{NULL:!0};if(typeof Z==="string")return{S:Z};if(typeof Z==="number")return{N:String(Z)};if(typeof Z==="boolean")return{BOOL:Z};if(Array.isArray(Z))return{L:Z.map((Y)=>bZ(Y))};if(typeof Z==="object"){let Y={};for(let[$,J]of Object.entries(Z))Y[$]=bZ(J);return{M:Y}}return{S:String(Z)}}function pZ(Z){if("NULL"in Z&&Z.NULL)return null;if("S"in Z&&Z.S!==void 0)return Z.S;if("N"in Z&&Z.N!==void 0)return Number(Z.N);if("BOOL"in Z&&Z.BOOL!==void 0)return Z.BOOL;if("L"in Z&&Z.L!==void 0)return Z.L.map((Y)=>pZ(Y));if("M"in Z&&Z.M!==void 0){let Y={};for(let[$,J]of Object.entries(Z.M))Y[$]=pZ(J);return Y}if("SS"in Z&&Z.SS!==void 0)return Z.SS;if("NS"in Z&&Z.NS!==void 0)return Z.NS.map((Y)=>Number(Y));if("B"in Z&&Z.B!==void 0)return Z.B;if("BS"in Z&&Z.BS!==void 0)return Z.BS;return null}function C(Z){let Y={};for(let[$,J]of Object.entries(Z))Y[$]=bZ(J);return Y}function HZ(Z){let Y=C({value:Z}).value;if(!Y)throw Error("Failed to marshal DynamoDB attribute value");return Y}function dY(Z){let Y={};for(let[$,J]of Object.entries(Z))Y[$]=pZ(J);return Y}class CZ{client;tableName;pkAttribute;skAttribute;entityTypeAttr;delimiter;_entityType;_pkValue;_skCondition;_indexName;_projectionAttrs=[];_filterConditions=[];_limitValue;_scanForward=!0;_consistentRead=!1;_startKey;constructor(Z,Y,$){this.client=Z,this.tableName=Y,this.pkAttribute=$.pkAttribute,this.skAttribute=$.skAttribute,this.entityTypeAttr=$.entityTypeAttribute,this.delimiter=$.keyDelimiter}entity(Z){return this._entityType=Z,this}pk(Z){return this._pkValue=Z,this}get sk(){let Z=this;return{equals(Y){return Z._skCondition={type:"eq",value:Y},Z},beginsWith(Y){return Z._skCondition={type:"begins_with",value:Y},Z},between(Y,$){return Z._skCondition={type:"between",value:Y,value2:$},Z},lt(Y){return Z._skCondition={type:"lt",value:Y},Z},lte(Y){return Z._skCondition={type:"lte",value:Y},Z},gt(Y){return Z._skCondition={type:"gt",value:Y},Z},gte(Y){return Z._skCondition={type:"gte",value:Y},Z}}}index(Z){return this._indexName=Z,this}project(...Z){return this._projectionAttrs.push(...Z),this}filter(Z,Y,$){return this._filterConditions.push({attribute:Z,operator:Y,value:$}),this}where(Z,Y){return this.filter(Z,"=",Y)}whereIn(Z,Y){return this._filterConditions.push({attribute:Z,operator:"IN",values:Y}),this}limit(Z){return this._limitValue=Z,this}asc(){return this._scanForward=!0,this}desc(){return this._scanForward=!1,this}consistent(){return this._consistentRead=!0,this}startFrom(Z){return this._startKey=Z,this}toRequest(){let Z={TableName:this.tableName};if(this._indexName)Z.IndexName=this._indexName;let Y=[],$={},J={},X=0;if(this._pkValue){let W=`#pk${X}`,H=`:pk${X}`;$[W]=this.pkAttribute,J[H]={S:this._pkValue},Y.push(`${W} = ${H}`),X++}if(this._skCondition){let W=`#sk${X}`;switch($[W]=this.skAttribute,this._skCondition.type){case"eq":{let H=`:sk${X}`;J[H]={S:this._skCondition.value},Y.push(`${W} = ${H}`);break}case"begins_with":{let H=`:sk${X}`;J[H]={S:this._skCondition.value},Y.push(`begins_with(${W}, ${H})`);break}case"between":{if(this._skCondition.value2===void 0)throw Error("DynamoDB between condition requires a second value");let H=`:sk${X}a`,G=`:sk${X}b`;J[H]={S:this._skCondition.value},J[G]={S:this._skCondition.value2},Y.push(`${W} BETWEEN ${H} AND ${G}`);break}case"lt":{let H=`:sk${X}`;J[H]={S:this._skCondition.value},Y.push(`${W} < ${H}`);break}case"lte":{let H=`:sk${X}`;J[H]={S:this._skCondition.value},Y.push(`${W} <= ${H}`);break}case"gt":{let H=`:sk${X}`;J[H]={S:this._skCondition.value},Y.push(`${W} > ${H}`);break}case"gte":{let H=`:sk${X}`;J[H]={S:this._skCondition.value},Y.push(`${W} >= ${H}`);break}}X++}if(Y.length>0)Z.KeyConditionExpression=Y.join(" AND ");if(this._filterConditions.length>0){let W=[];for(let H of this._filterConditions){let G=`#flt${X}`;if($[G]=H.attribute,H.operator==="IN"&&H.values){let z=H.values.map((Q,_)=>`:flt${X}_${_}`);H.values.forEach((Q,_)=>{J[`:flt${X}_${_}`]=HZ(Q)}),W.push(`${G} IN (${z.join(", ")})`)}else{let z=`:flt${X}`;J[z]=HZ(H.value),W.push(`${G} ${H.operator} ${z}`)}X++}Z.FilterExpression=W.join(" AND ")}if(this._projectionAttrs.length>0){let W=[];for(let H of this._projectionAttrs){let G=`#proj${X}`;$[G]=H,W.push(G),X++}Z.ProjectionExpression=W.join(", ")}if(Object.keys($).length>0)Z.ExpressionAttributeNames=$;if(Object.keys(J).length>0)Z.ExpressionAttributeValues=J;if(this._limitValue!==void 0)Z.Limit=this._limitValue;if(Z.ScanIndexForward=this._scanForward,this._consistentRead)Z.ConsistentRead=!0;if(this._startKey)Z.ExclusiveStartKey=C(this._startKey);return Z}async get(){if(!this.client)throw Error("DynamoDB client not configured. Call dynamo.connection() first.");let Z=this.toRequest();return((this._pkValue!==void 0?await this.client.query(Z):await this.client.scan(Z)).Items??[]).map((J)=>dY(J))}async first(){return this._limitValue=1,(await this.get())[0]}async getAll(){let Z=[],Y;do{if(Y)this._startKey=Y;let $=this.toRequest(),J=this.client;if(!J)throw Error("DynamoDB client is not configured");let W=this._pkValue!==void 0?await J.query($):await J.scan($),H=(W.Items??[]).map((G)=>dY(G));Z.push(...H),Y=W.LastEvaluatedKey?dY(W.LastEvaluatedKey):void 0}while(Y);return Z}async count(){if(!this.client)throw Error("DynamoDB client not configured. Call dynamo.connection() first.");let Z=this.toRequest();return Z.Select="COUNT",(this._pkValue!==void 0?await this.client.query(Z):await this.client.scan(Z)).Count??0}}class cZ{client;tableName="";pkAttribute="pk";skAttribute="sk";entityTypeAttr="_et";delimiter="#";entityMappings=new Map;_configured=!1;connection(Z){return this.tableName=Z.table,this.pkAttribute=Z.pkAttribute??"pk",this.skAttribute=Z.skAttribute??"sk",this.entityTypeAttr=Z.entityTypeAttribute??"_et",this.delimiter=Z.keyDelimiter??"#",this._configured=!0,this}isConfigured(){return this._configured}setClient(Z){return this.client=Z,this}getClient(){return this.client}registerEntity(Z){return this.entityMappings.set(Z.entityType,Z),this}registerModel(Z){let Y=Z.name??"Unknown",$=Y.toUpperCase(),J={entityType:Y,pkPattern:`${$}#{id}`,skPattern:`${$}#{id}`};return this.entityMappings.set(Y,J),this}getEntityMapping(Z){return this.entityMappings.get(Z)}entity(Z){if(!this._configured)throw Error("DynamoDB not configured. Call dynamo.connection() first.");return new CZ(this.client,this.tableName,{pkAttribute:this.pkAttribute,skAttribute:this.skAttribute,entityTypeAttribute:this.entityTypeAttr,keyDelimiter:this.delimiter}).entity(Z)}async batchWrite(Z){if(!this.client)throw Error("DynamoDB client not configured. Call setClient() first.");if(!this._configured)throw Error("DynamoDB not configured. Call dynamo.connection() first.");let Y=[];for(let $ of Z)if($.put){let J={...$.put.item,[this.entityTypeAttr]:$.put.entity};Y.push({PutRequest:{Item:C(J)}})}else if($.delete)Y.push({DeleteRequest:{Key:C({[this.pkAttribute]:$.delete.pk,[this.skAttribute]:$.delete.sk})}});if(Y.length>0)await this.client.batchWriteItem({RequestItems:{[this.tableName]:Y}})}async transactWrite(Z){if(!this.client)throw Error("DynamoDB client not configured. Call setClient() first.");if(!this._configured)throw Error("DynamoDB not configured. Call dynamo.connection() first.");let Y=[];for(let $ of Z)if($.put){let J={...$.put.item,[this.entityTypeAttr]:$.put.entity},X={TableName:this.tableName,Item:C(J)};if($.put.condition)X.ConditionExpression=$.put.condition;Y.push({Put:X})}else if($.update){let J={[this.pkAttribute]:$.update.pk};if($.update.sk)J[this.skAttribute]=$.update.sk;let X=[],W={},H={},G=0;if($.update.set){let z=[];for(let[Q,_]of Object.entries($.update.set)){let U=`#set${G}`,I=`:set${G}`;W[U]=Q,H[I]=HZ(_),z.push(`${U} = ${I}`),G++}if(z.length>0)X.push(`SET ${z.join(", ")}`)}if($.update.add){let z=[];for(let[Q,_]of Object.entries($.update.add)){let U=`#add${G}`,I=`:add${G}`;W[U]=Q,H[I]={N:String(_)},z.push(`${U} ${I}`),G++}if(z.length>0)X.push(`ADD ${z.join(", ")}`)}if($.update.remove&&$.update.remove.length>0){let z=[];for(let Q of $.update.remove){let _=`#rem${G}`;W[_]=Q,z.push(_),G++}X.push(`REMOVE ${z.join(", ")}`)}Y.push({Update:{TableName:this.tableName,Key:C(J),UpdateExpression:X.join(" "),ExpressionAttributeNames:W,ExpressionAttributeValues:H}})}else if($.delete){let J={TableName:this.tableName,Key:C({[this.pkAttribute]:$.delete.pk,[this.skAttribute]:$.delete.sk})};if($.delete.condition)J.ConditionExpression=$.delete.condition;Y.push({Delete:J})}else if($.conditionCheck)Y.push({ConditionCheck:{TableName:this.tableName,Key:C({[this.pkAttribute]:$.conditionCheck.pk,[this.skAttribute]:$.conditionCheck.sk}),ConditionExpression:$.conditionCheck.condition}});if(Y.length>0)await this.client.transactWriteItems({TransactItems:Y})}async put(Z,Y){if(!this.client)throw Error("DynamoDB client not configured. Call setClient() first.");let $={...Y,[this.entityTypeAttr]:Z};await this.client.putItem({TableName:this.tableName,Item:C($)})}async get(Z,Y){if(!this.client)throw Error("DynamoDB client not configured. Call setClient() first.");let $={[this.pkAttribute]:Z};if(Y)$[this.skAttribute]=Y;let J=await this.client.getItem({TableName:this.tableName,Key:C($)});if(!J.Item)return;return dY(J.Item)}async delete(Z,Y){if(!this.client)throw Error("DynamoDB client not configured. Call setClient() first.");let $={[this.pkAttribute]:Z};if(Y)$[this.skAttribute]=Y;await this.client.deleteItem({TableName:this.tableName,Key:C($)})}async update(Z,Y,$){if(!this.client)throw Error("DynamoDB client not configured. Call setClient() first.");let J={[this.pkAttribute]:Z};if(Y)J[this.skAttribute]=Y;let X=[],W={},H={},G=0,z=[];for(let[Q,_]of Object.entries($)){let U=`#upd${G}`,I=`:upd${G}`;W[U]=Q,H[I]=HZ(_),z.push(`${U} = ${I}`),G++}if(z.length>0)X.push(`SET ${z.join(", ")}`);await this.client.updateItem({TableName:this.tableName,Key:C(J),UpdateExpression:X.join(" "),ExpressionAttributeNames:W,ExpressionAttributeValues:H})}getTableName(){return this.tableName}getConfig(){return{tableName:this.tableName,pkAttribute:this.pkAttribute,skAttribute:this.skAttribute,entityTypeAttribute:this.entityTypeAttr,keyDelimiter:this.delimiter}}}function A$(Z,Y="id"){return`${Z.toUpperCase()}#{${Y}}`}function B$(Z,Y){let $={},J=Z.split("#"),X=Y.split("#");for(let W=0;W<J.length;W++){let H=J[W],G=X[W];if(H?.startsWith("{")&&H.endsWith("}")){let z=H.slice(1,-1);$[z]=G??""}}return $}function V$(Z,Y){let $=Z;for(let[J,X]of Object.entries(Y))$=$.replace(`{${J}}`,X);return $}var L$=new cZ;function E$(){return new cZ}import{log as I$}from"@stacksjs/logging";import{database as K$}from"@stacksjs/config";import{path as j$}from"@stacksjs/path";async function F9(){if(!["sqlite","mysql"].includes(R$()))return;if(await JY("model_audits"))return;let Y=`import type { Database } from '@stacksjs/database'
800
+ `}import{log as D4}from"@stacksjs/logging";import{database as M4}from"@stacksjs/config";import{path as y4}from"@stacksjs/path";async function M7(){if(!["sqlite","mysql"].includes(F4()))return;if(await a("model_audits"))return;let Y=`import type { Database } from '@stacksjs/database'
821
801
  import { sql } from '@stacksjs/database'
822
802
 
823
803
  `;Y+=`export async function up(db: Database<any>) {
@@ -839,7 +819,7 @@ import { sql } from '@stacksjs/database'
839
819
  `,Y+=` .columns(['auditable_type', 'auditable_id', 'created_at'])
840
820
  `,Y+=` .execute()
841
821
  `,Y+=`}
842
- `;let J=`${new Date().getTime().toString()}-create-model-audits-table.ts`,X=j$.userMigrationsPath(J);await Bun.write(X,Y),I$.success("Created model_audits table migration")}function R$(){return K$.default||""}import{log as w$}from"@stacksjs/logging";import{database as S$}from"@stacksjs/config";import{path as M$}from"@stacksjs/path";async function k9(){if(["sqlite","mysql"].includes(F$())){if(await JY("errors"))return;let Y=`import type { Database } from '@stacksjs/database'
822
+ `;let X=`${new Date().getTime().toString()}-create-model-audits-table.ts`,J=y4.userMigrationsPath(X);await Bun.write(J,Y),D4.success("Created model_audits table migration")}function F4(){return M4.default||""}import{log as T4}from"@stacksjs/logging";import{database as P4}from"@stacksjs/config";import{path as N4}from"@stacksjs/path";async function v7(){if(["sqlite","mysql"].includes(v4())){if(await a("errors"))return;let Y=`import type { Database } from '@stacksjs/database'
843
823
  import { sql } from '@stacksjs/database'
844
824
 
845
825
  `;Y+=`export async function up(db: Database<any>) {
@@ -856,7 +836,7 @@ import { sql } from '@stacksjs/database'
856
836
  `,Y+=` .addColumn('updated_at', 'timestamp')
857
837
  `,Y+=` .execute()
858
838
  `,Y+=`}
859
- `;let J=`${new Date().getTime().toString()}-create-errors-table.ts`,X=M$.userMigrationsPath(J);await Bun.write(X,Y),w$.success("Created errors table")}}function F$(){return S$.default||""}import{err as D$,ok as x$}from"@stacksjs/error-handling";import{existsSync as MY,readdirSync as q$,writeFileSync as T$,mkdirSync as P$}from"fs";import{join as uZ}from"path";import B6 from"process";import GZ from"bun:sqlite";import{env as V6}from"@stacksjs/env";function gZ(){return V6.DB_CONNECTION||"sqlite"}function L6(){return uZ(B6.cwd(),"database","migrations")}function k$(){try{let Z=L6();if(!MY(Z))return!1;return q$(Z).some(($)=>$.includes("create-jobs-table"))}catch{return!1}}async function N$(){let Z=zZ();if(MY(Z))try{let $=new GZ(Z),J=$.query("SELECT name FROM sqlite_master WHERE type='table' AND name='job_batches'").get();return $.close(),J!==null}catch{}if(gZ()!=="sqlite")try{let{db:$}=await Promise.resolve().then(() => (F(),u));return await $.selectFrom("job_batches").select("id").limit(1).execute(),!0}catch{return!1}return!1}function zZ(){let Z=V6.APP_ROOT||B6.cwd();return uZ(Z,"database","stacks.sqlite")}async function y$(){let Z=gZ(),Y=zZ();if(MY(Y))try{let $=new GZ(Y),J=$.query("SELECT name FROM sqlite_master WHERE type='table' AND name='jobs'").get();return $.close(),J!==null}catch{}if(Z!=="sqlite")try{let{db:$}=await Promise.resolve().then(() => (F(),u));return await $.selectFrom("jobs").select("id").limit(1).execute(),!0}catch{return!1}return!1}async function C9(){try{let Z=gZ();if(["sqlite","mysql","postgres"].includes(Z)){if(!k$()){let X="";if(Z==="sqlite")X=`-- Create jobs table
839
+ `;let X=`${new Date().getTime().toString()}-create-errors-table.ts`,J=N4.userMigrationsPath(X);await Bun.write(J,Y),T4.success("Created errors table")}}function v4(){return P4.default||""}import{err as f4,ok as h4}from"@stacksjs/error-handling";import{existsSync as VY,readdirSync as p4,writeFileSync as u4,mkdirSync as c4}from"fs";import{join as VZ}from"path";import D0 from"process";import cY from"bun:sqlite";import{env as M0}from"@stacksjs/env";function _Z(){return M0.DB_CONNECTION||"sqlite"}function y0(){return VZ(D0.cwd(),"database","migrations")}function b4(){try{let Z=y0();if(!VY(Z))return!1;return p4(Z).some(($)=>$.includes("create-jobs-table"))}catch{return!1}}async function C4(){let Z=bY();if(VY(Z))try{let $=new cY(Z),X=$.query("SELECT name FROM sqlite_master WHERE type='table' AND name='job_batches'").get();return $.close(),X!==null}catch{}if(_Z()!=="sqlite")try{let{db:$}=await Promise.resolve().then(() => (D(),e));return await $.selectFrom("job_batches").select("id").limit(1).execute(),!0}catch{return!1}return!1}function bY(){let Z=M0.APP_ROOT||D0.cwd();return VZ(Z,"database","stacks.sqlite")}async function d4(){let Z=_Z(),Y=bY();if(VY(Y))try{let $=new cY(Y),X=$.query("SELECT name FROM sqlite_master WHERE type='table' AND name='jobs'").get();return $.close(),X!==null}catch{}if(Z!=="sqlite")try{let{db:$}=await Promise.resolve().then(() => (D(),e));return await $.selectFrom("jobs").select("id").limit(1).execute(),!0}catch{return!1}return!1}async function d7(){try{let Z=_Z();if(["sqlite","mysql","postgres"].includes(Z)){if(!b4()){let J="";if(Z==="sqlite")J=`-- Create jobs table
860
840
  CREATE TABLE IF NOT EXISTS jobs (
861
841
  id INTEGER PRIMARY KEY AUTOINCREMENT,
862
842
  queue TEXT NOT NULL DEFAULT 'default',
@@ -946,7 +926,7 @@ CREATE TABLE IF NOT EXISTS queue_circuit_state (
946
926
  paused_at DATETIME,
947
927
  resume_at DATETIME
948
928
  );
949
- `;else if(Z==="mysql")X=`-- Create jobs table
929
+ `;else if(Z==="mysql")J=`-- Create jobs table
950
930
  CREATE TABLE IF NOT EXISTS jobs (
951
931
  id INT AUTO_INCREMENT PRIMARY KEY,
952
932
  queue VARCHAR(255) NOT NULL DEFAULT 'default',
@@ -1021,7 +1001,7 @@ CREATE TABLE IF NOT EXISTS queue_circuit_state (
1021
1001
  paused_at TIMESTAMP NULL,
1022
1002
  resume_at TIMESTAMP NULL
1023
1003
  );
1024
- `;else if(Z==="postgres")X=`-- Create jobs table
1004
+ `;else if(Z==="postgres")J=`-- Create jobs table
1025
1005
  CREATE TABLE IF NOT EXISTS jobs (
1026
1006
  id SERIAL PRIMARY KEY,
1027
1007
  queue VARCHAR(255) NOT NULL DEFAULT 'default',
@@ -1096,7 +1076,7 @@ CREATE TABLE IF NOT EXISTS queue_circuit_state (
1096
1076
  paused_at TIMESTAMP,
1097
1077
  resume_at TIMESTAMP
1098
1078
  );
1099
- `;let H=`${new Date().getTime().toString()}-create-jobs-table.sql`,G=L6();if(!MY(G))P$(G,{recursive:!0});let z=uZ(G,H);T$(z,X),console.log("\u2713 Created jobs migration file")}else console.log("\u2713 Jobs migration file already exists");if(!await y$()){console.log(" Running migration...");let X=zZ();if(Z==="sqlite"||MY(X)){let W=new GZ(X);W.run(`CREATE TABLE IF NOT EXISTS jobs (
1079
+ `;let z=`${new Date().getTime().toString()}-create-jobs-table.sql`,H=y0();if(!VY(H))c4(H,{recursive:!0});let I=VZ(H,z);u4(I,J),console.log("\u2713 Created jobs migration file")}else console.log("\u2713 Jobs migration file already exists");if(!await d4()){console.log(" Running migration...");let J=bY();if(Z==="sqlite"||VY(J)){let W=new cY(J);W.run(`CREATE TABLE IF NOT EXISTS jobs (
1100
1080
  id INTEGER PRIMARY KEY AUTOINCREMENT,
1101
1081
  queue TEXT NOT NULL DEFAULT 'default',
1102
1082
  payload TEXT NOT NULL,
@@ -1113,7 +1093,7 @@ CREATE TABLE IF NOT EXISTS queue_circuit_state (
1113
1093
  payload TEXT NOT NULL,
1114
1094
  exception TEXT NOT NULL,
1115
1095
  failed_at DATETIME DEFAULT CURRENT_TIMESTAMP
1116
- )`),W.close()}else if(Z==="mysql"){let{db:W}=await Promise.resolve().then(() => (F(),u));await W.unsafe(`CREATE TABLE IF NOT EXISTS jobs (
1096
+ )`),W.close()}else if(Z==="mysql"){let{db:W}=await Promise.resolve().then(() => (D(),e));await W.unsafe(`CREATE TABLE IF NOT EXISTS jobs (
1117
1097
  id INT AUTO_INCREMENT PRIMARY KEY,
1118
1098
  queue VARCHAR(255) NOT NULL DEFAULT 'default',
1119
1099
  payload LONGTEXT NOT NULL,
@@ -1130,7 +1110,7 @@ CREATE TABLE IF NOT EXISTS queue_circuit_state (
1130
1110
  payload LONGTEXT NOT NULL,
1131
1111
  exception LONGTEXT NOT NULL,
1132
1112
  failed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
1133
- )`).execute()}else if(Z==="postgres"){let{db:W}=await Promise.resolve().then(() => (F(),u));await W.unsafe(`CREATE TABLE IF NOT EXISTS jobs (
1113
+ )`).execute()}else if(Z==="postgres"){let{db:W}=await Promise.resolve().then(() => (D(),e));await W.unsafe(`CREATE TABLE IF NOT EXISTS jobs (
1134
1114
  id SERIAL PRIMARY KEY,
1135
1115
  queue VARCHAR(255) NOT NULL DEFAULT 'default',
1136
1116
  payload TEXT NOT NULL,
@@ -1147,7 +1127,7 @@ CREATE TABLE IF NOT EXISTS queue_circuit_state (
1147
1127
  payload TEXT NOT NULL,
1148
1128
  exception TEXT NOT NULL,
1149
1129
  failed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
1150
- )`).execute()}console.log("\u2713 Jobs and failed_jobs tables created")}else console.log("\u2713 Jobs tables already exist");if(!await N$()){console.log(" Creating job_batches table...");let X=zZ();if(Z==="sqlite"||MY(X)){let W=new GZ(X);W.run(`CREATE TABLE IF NOT EXISTS job_batches (
1130
+ )`).execute()}console.log("\u2713 Jobs and failed_jobs tables created")}else console.log("\u2713 Jobs tables already exist");if(!await C4()){console.log(" Creating job_batches table...");let J=bY();if(Z==="sqlite"||VY(J)){let W=new cY(J);W.run(`CREATE TABLE IF NOT EXISTS job_batches (
1151
1131
  id TEXT PRIMARY KEY,
1152
1132
  name TEXT NOT NULL DEFAULT '',
1153
1133
  total_jobs INTEGER NOT NULL DEFAULT 0,
@@ -1158,7 +1138,7 @@ CREATE TABLE IF NOT EXISTS queue_circuit_state (
1158
1138
  cancelled_at DATETIME,
1159
1139
  created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
1160
1140
  finished_at DATETIME
1161
- )`),W.close()}else if(Z==="mysql"){let{db:W}=await Promise.resolve().then(() => (F(),u));await W.unsafe(`CREATE TABLE IF NOT EXISTS job_batches (
1141
+ )`),W.close()}else if(Z==="mysql"){let{db:W}=await Promise.resolve().then(() => (D(),e));await W.unsafe(`CREATE TABLE IF NOT EXISTS job_batches (
1162
1142
  id VARCHAR(255) PRIMARY KEY,
1163
1143
  name VARCHAR(255) NOT NULL DEFAULT '',
1164
1144
  total_jobs INT NOT NULL DEFAULT 0,
@@ -1169,7 +1149,7 @@ CREATE TABLE IF NOT EXISTS queue_circuit_state (
1169
1149
  cancelled_at TIMESTAMP NULL,
1170
1150
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
1171
1151
  finished_at TIMESTAMP NULL
1172
- )`).execute()}else if(Z==="postgres"){let{db:W}=await Promise.resolve().then(() => (F(),u));await W.unsafe(`CREATE TABLE IF NOT EXISTS job_batches (
1152
+ )`).execute()}else if(Z==="postgres"){let{db:W}=await Promise.resolve().then(() => (D(),e));await W.unsafe(`CREATE TABLE IF NOT EXISTS job_batches (
1173
1153
  id VARCHAR(255) PRIMARY KEY,
1174
1154
  name VARCHAR(255) NOT NULL DEFAULT '',
1175
1155
  total_jobs INTEGER NOT NULL DEFAULT 0,
@@ -1180,9 +1160,9 @@ CREATE TABLE IF NOT EXISTS queue_circuit_state (
1180
1160
  cancelled_at TIMESTAMP,
1181
1161
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
1182
1162
  finished_at TIMESTAMP
1183
- )`).execute()}console.log("\u2713 job_batches table created")}else console.log("\u2713 job_batches table already exists")}return x$("Migration created and executed.")}catch(Z){return D$(Z instanceof Error?Z:Error(String(Z)))}}F();import{randomBytes as h$}from"crypto";import{log as h}from"@stacksjs/logging";import{env as v$}from"@stacksjs/env";function HY(Z){let Y=Z==="postgres",$=Z==="mysql"||Z==="singlestore";return{driver:Z,isPostgres:Y,isMysql:$,isSqlite:!Y&&!$,now:Y||$?"NOW()":"datetime('now')",boolTrue:Y?"true":"1",boolFalse:Y?"false":"0",autoIncrement:Y?"SERIAL":"INTEGER",primaryKey:Y?"PRIMARY KEY":$?"PRIMARY KEY AUTO_INCREMENT":"PRIMARY KEY AUTOINCREMENT",pkColumn:Y?"id SERIAL PRIMARY KEY":$?"id INTEGER PRIMARY KEY AUTO_INCREMENT":"id INTEGER PRIMARY KEY AUTOINCREMENT",nullableTimestamp:$?"TIMESTAMP NULL":"TIMESTAMP",param(X){return Y?`$${X}`:"?"},params(...X){if(Y)return{sql:X.map((G,z)=>`$${z+1}`).join(", "),values:X};return{sql:X.map(()=>"?").join(", "),values:X}}}}function f$(){return v$.DB_CONNECTION||"sqlite"}function b$(Z){return`ALTER TABLE users ADD COLUMN email_verified_at ${Z.nullableTimestamp}`}function p$(Z){return`ALTER TABLE users ADD COLUMN password_changed_at ${Z.nullableTimestamp}`}function C$(Z){return["ALTER TABLE users ADD COLUMN two_factor_secret VARCHAR(255)",`ALTER TABLE users ADD COLUMN two_factor_enabled BOOLEAN NOT NULL DEFAULT ${Z.boolFalse}`]}function c$(){return"ALTER TABLE users ADD COLUMN stripe_id VARCHAR(255)"}async function u$(Z,Y={}){let $=[b$(Z),p$(Z),...C$(Z),c$()];for(let J of $)try{await A.unsafe(J).execute()}catch{if(Y.verbose)h.debug(`[auth-tables] Skipped (already applied or users missing): ${J}`)}try{await A.unsafe("CREATE UNIQUE INDEX IF NOT EXISTS idx_users_stripe_id ON users(stripe_id)").execute()}catch{if(Y.verbose)h.debug("[auth-tables] Skipped users.stripe_id unique index (already applied or users missing)")}}async function o9(Z={}){let Y=f$(),$=HY(Y),{isPostgres:J,boolTrue:X,now:W,pkColumn:H,nullableTimestamp:G}=$;if(Z.verbose)h.info(`Creating auth tables for ${Y}...`);try{if(Z.verbose)h.info("Creating oauth_clients table...");if(await A.unsafe(`
1163
+ )`).execute()}console.log("\u2713 job_batches table created")}else console.log("\u2713 job_batches table already exists")}return h4("Migration created and executed.")}catch(Z){return f4(Z instanceof Error?Z:Error(String(Z)))}}D();import{randomBytes as g4}from"crypto";import{log as P}from"@stacksjs/logging";import{env as s4}from"@stacksjs/env";function CY(Z){let Y=Z==="postgres",$=Z==="mysql"||Z==="singlestore";return{driver:Z,isPostgres:Y,isMysql:$,isSqlite:!Y&&!$,now:Y||$?"NOW()":"datetime('now')",boolTrue:Y?"true":"1",boolFalse:Y?"false":"0",autoIncrement:Y?"SERIAL":"INTEGER",primaryKey:Y?"PRIMARY KEY":$?"PRIMARY KEY AUTO_INCREMENT":"PRIMARY KEY AUTOINCREMENT",pkColumn:Y?"id SERIAL PRIMARY KEY":$?"id INTEGER PRIMARY KEY AUTO_INCREMENT":"id INTEGER PRIMARY KEY AUTOINCREMENT",nullableTimestamp:$?"TIMESTAMP NULL":"TIMESTAMP",param(J){return Y?`$${J}`:"?"},params(...J){if(Y)return{sql:J.map((H,I)=>`$${I+1}`).join(", "),values:J};return{sql:J.map(()=>"?").join(", "),values:J}}}}function m4(){return s4.DB_CONNECTION||"sqlite"}function l4(Z){return`ALTER TABLE users ADD COLUMN email_verified_at ${Z.nullableTimestamp}`}function r4(Z){return`ALTER TABLE users ADD COLUMN password_changed_at ${Z.nullableTimestamp}`}function a4(Z){return["ALTER TABLE users ADD COLUMN two_factor_secret VARCHAR(255)",`ALTER TABLE users ADD COLUMN two_factor_enabled BOOLEAN NOT NULL DEFAULT ${Z.boolFalse}`]}function n4(){return"ALTER TABLE users ADD COLUMN stripe_id VARCHAR(255)"}async function o4(Z,Y={}){let $=[l4(Z),r4(Z),...a4(Z),n4()];for(let X of $)try{await K.unsafe(X).execute()}catch{if(Y.verbose)P.debug(`[auth-tables] Skipped (already applied or users missing): ${X}`)}try{await K.unsafe("CREATE UNIQUE INDEX IF NOT EXISTS idx_users_stripe_id ON users(stripe_id)").execute()}catch{if(Y.verbose)P.debug("[auth-tables] Skipped users.stripe_id unique index (already applied or users missing)")}}async function o7(Z={}){let Y=m4(),$=CY(Y),{isPostgres:X,boolTrue:J,now:W,pkColumn:z,nullableTimestamp:H}=$;if(Z.verbose)P.info(`Creating auth tables for ${Y}...`);try{if(Z.verbose)P.info("Creating oauth_clients table...");if(await K.unsafe(`
1184
1164
  CREATE TABLE IF NOT EXISTS oauth_clients (
1185
- ${H},
1165
+ ${z},
1186
1166
  name VARCHAR(255) NOT NULL,
1187
1167
  secret VARCHAR(100),
1188
1168
  provider VARCHAR(255),
@@ -1191,40 +1171,40 @@ CREATE TABLE IF NOT EXISTS queue_circuit_state (
1191
1171
  password_client BOOLEAN NOT NULL DEFAULT ${$.boolFalse},
1192
1172
  revoked BOOLEAN NOT NULL DEFAULT ${$.boolFalse},
1193
1173
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
1194
- updated_at ${G}
1174
+ updated_at ${H}
1195
1175
  )
1196
- `).execute(),Z.verbose)h.info("Creating oauth_access_tokens table...");if(await A.unsafe(`
1176
+ `).execute(),Z.verbose)P.info("Creating oauth_access_tokens table...");if(await K.unsafe(`
1197
1177
  CREATE TABLE IF NOT EXISTS oauth_access_tokens (
1198
- ${H},
1178
+ ${z},
1199
1179
  user_id INTEGER NOT NULL,
1200
1180
  oauth_client_id INTEGER NOT NULL,
1201
1181
  token TEXT NOT NULL,
1202
1182
  name VARCHAR(255),
1203
1183
  scopes TEXT,
1204
1184
  revoked BOOLEAN NOT NULL DEFAULT ${$.boolFalse},
1205
- expires_at ${G},
1185
+ expires_at ${H},
1206
1186
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
1207
- updated_at ${G}
1187
+ updated_at ${H}
1208
1188
  )
1209
- `).execute(),await E6("idx_oauth_access_tokens_token","oauth_access_tokens","token"),Z.verbose)h.info("Creating oauth_refresh_tokens table...");if(await A.unsafe(`
1189
+ `).execute(),await F0("idx_oauth_access_tokens_token","oauth_access_tokens","token"),Z.verbose)P.info("Creating oauth_refresh_tokens table...");if(await K.unsafe(`
1210
1190
  CREATE TABLE IF NOT EXISTS oauth_refresh_tokens (
1211
- ${H},
1191
+ ${z},
1212
1192
  access_token_id INTEGER NOT NULL,
1213
1193
  token TEXT NOT NULL,
1214
1194
  revoked BOOLEAN NOT NULL DEFAULT ${$.boolFalse},
1215
- expires_at ${G},
1195
+ expires_at ${H},
1216
1196
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
1217
1197
  )
1218
- `).execute(),await E6("idx_oauth_refresh_tokens_token","oauth_refresh_tokens","token"),Z.verbose)h.info("Creating password_resets table...");await A.unsafe(`
1198
+ `).execute(),await F0("idx_oauth_refresh_tokens_token","oauth_refresh_tokens","token"),Z.verbose)P.info("Creating password_resets table...");await K.unsafe(`
1219
1199
  CREATE TABLE IF NOT EXISTS password_resets (
1220
- ${H},
1200
+ ${z},
1221
1201
  email VARCHAR(255) NOT NULL,
1222
1202
  token VARCHAR(255) NOT NULL,
1223
1203
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
1224
1204
  )
1225
- `).execute();try{await A.unsafe(`
1205
+ `).execute();try{await K.unsafe(`
1226
1206
  CREATE INDEX IF NOT EXISTS idx_password_resets_email ON password_resets(email)
1227
- `).execute()}catch{}if(Z.verbose)h.info("Creating passkeys table...");await A.unsafe(`
1207
+ `).execute()}catch{}if(Z.verbose)P.info("Creating passkeys table...");await K.unsafe(`
1228
1208
  CREATE TABLE IF NOT EXISTS passkeys (
1229
1209
  id VARCHAR(255) PRIMARY KEY,
1230
1210
  cred_public_key TEXT NOT NULL,
@@ -1237,135 +1217,47 @@ CREATE TABLE IF NOT EXISTS queue_circuit_state (
1237
1217
  backup_status BOOLEAN NOT NULL DEFAULT ${$.boolFalse},
1238
1218
  transports TEXT,
1239
1219
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
1240
- last_used_at ${G}
1220
+ last_used_at ${H}
1241
1221
  )
1242
- `).execute();try{await A.unsafe(`
1222
+ `).execute();try{await K.unsafe(`
1243
1223
  CREATE INDEX IF NOT EXISTS idx_passkeys_user_id ON passkeys(user_id)
1244
- `).execute()}catch{}if(Z.verbose)h.info("Creating webauthn_challenges table...");await A.unsafe(`
1224
+ `).execute()}catch{}if(Z.verbose)P.info("Creating webauthn_challenges table...");await K.unsafe(`
1245
1225
  CREATE TABLE IF NOT EXISTS webauthn_challenges (
1246
- ${H},
1226
+ ${z},
1247
1227
  user_id INTEGER NOT NULL,
1248
1228
  challenge TEXT NOT NULL,
1249
1229
  purpose VARCHAR(20) NOT NULL,
1250
1230
  expires_at TIMESTAMP NOT NULL,
1251
1231
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
1252
1232
  )
1253
- `).execute();try{await A.unsafe(`
1233
+ `).execute();try{await K.unsafe(`
1254
1234
  CREATE UNIQUE INDEX IF NOT EXISTS idx_webauthn_challenges_user_purpose ON webauthn_challenges(user_id, purpose)
1255
- `).execute()}catch{}if(Z.verbose)h.info("Creating two_factor_challenges table...");await A.unsafe(`
1235
+ `).execute()}catch{}if(Z.verbose)P.info("Creating two_factor_challenges table...");await K.unsafe(`
1256
1236
  CREATE TABLE IF NOT EXISTS two_factor_challenges (
1257
1237
  id VARCHAR(255) PRIMARY KEY,
1258
1238
  user_id INTEGER NOT NULL,
1259
1239
  expires_at TIMESTAMP NOT NULL,
1260
1240
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
1261
1241
  )
1262
- `).execute();try{await A.unsafe(`
1242
+ `).execute();try{await K.unsafe(`
1263
1243
  CREATE INDEX IF NOT EXISTS idx_two_factor_challenges_user_id ON two_factor_challenges(user_id)
1264
- `).execute()}catch{}if(Z.verbose)h.info("Creating two_factor_pending_secrets table...");if(await A.unsafe(`
1244
+ `).execute()}catch{}if(Z.verbose)P.info("Creating two_factor_pending_secrets table...");if(await K.unsafe(`
1265
1245
  CREATE TABLE IF NOT EXISTS two_factor_pending_secrets (
1266
1246
  user_id INTEGER PRIMARY KEY,
1267
1247
  secret VARCHAR(255) NOT NULL,
1268
1248
  expires_at TIMESTAMP NOT NULL,
1269
1249
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
1270
1250
  )
1271
- `).execute(),Z.verbose)h.info("Ensuring users auth columns exist (users may not exist yet on a fresh install \u2014 see ensureUsersAuthColumns)...");if(await u$($,Z),Z.verbose)h.info("Ensuring personal access client exists...");if((await A.unsafe(`
1272
- SELECT id FROM oauth_clients WHERE personal_access_client = ${X} LIMIT 1
1273
- `).execute())?.length===0){let Q=h$(40).toString("hex");if(J)await A.unsafe(`
1251
+ `).execute(),Z.verbose)P.info("Ensuring users auth columns exist (users may not exist yet on a fresh install \u2014 see ensureUsersAuthColumns)...");if(await o4($,Z),Z.verbose)P.info("Ensuring personal access client exists...");if((await K.unsafe(`
1252
+ SELECT id FROM oauth_clients WHERE personal_access_client = ${J} LIMIT 1
1253
+ `).execute())?.length===0){let Q=g4(40).toString("hex");if(X)await K.unsafe(`
1274
1254
  INSERT INTO oauth_clients (name, secret, provider, redirect, personal_access_client, password_client, revoked, created_at)
1275
1255
  VALUES ($1, $2, $3, $4, $5, $6, $7, NOW())
1276
- `,["Personal Access Client",Q,"local","http://localhost",!0,!1,!1]).execute();else await A.unsafe(`
1256
+ `,["Personal Access Client",Q,"local","http://localhost",!0,!1,!1]).execute();else await K.unsafe(`
1277
1257
  INSERT INTO oauth_clients (name, secret, provider, redirect, personal_access_client, password_client, revoked, created_at)
1278
1258
  VALUES (?, ?, ?, ?, ?, ?, ?, ${W})
1279
- `,["Personal Access Client",Q,"local","http://localhost",1,0,0]).execute();if(Z.verbose)h.success("Personal access client created")}return h.debug("Auth tables migrated successfully"),{success:!0}}catch(z){let Q=z instanceof Error?z.message:String(z);return h.error("Failed to migrate auth tables:",Q),{success:!1,error:Q}}}async function E6(Z,Y,$){try{await A.unsafe(`
1259
+ `,["Personal Access Client",Q,"local","http://localhost",1,0,0]).execute();if(Z.verbose)P.success("Personal access client created")}return P.debug("Auth tables migrated successfully"),{success:!0}}catch(I){let Q=I instanceof Error?I.message:String(I);return P.error("Failed to migrate auth tables:",Q),{success:!1,error:Q}}}async function F0(Z,Y,$){try{await K.unsafe(`
1280
1260
  CREATE INDEX IF NOT EXISTS ${Z} ON ${Y}(${$}(255))
1281
- `).execute()}catch{try{await A.unsafe(`
1261
+ `).execute()}catch{try{await K.unsafe(`
1282
1262
  CREATE INDEX IF NOT EXISTS ${Z} ON ${Y}(${$})
1283
- `).execute()}catch{}}}F();import g$ from"process";import{log as I6}from"@stacksjs/logging";import{path as dZ}from"@stacksjs/path";import{getTableName as d$}from"@stacksjs/orm";import{fs as K6}from"@stacksjs/storage";function m$(){return g$.env.DB_CONNECTION||"sqlite"}function s$(Z){if(Z.isPostgres)return"UUID";if(Z.isMysql)return"VARCHAR(255)";return"TEXT"}function l$(Z,Y){return`ALTER TABLE ${Z} ADD COLUMN uuid ${s$(Y)}`}async function j6(Z){let Y=[];if(!K6.existsSync(Z))return Y;let $=K6.readdirSync(Z,{withFileTypes:!0});for(let J of $){let X=dZ.join(Z,J.name);if(J.isDirectory()){Y.push(...await j6(X));continue}if(!J.name.endsWith(".ts"))continue;if(J.name.startsWith("_")||J.name.startsWith("index"))continue;try{let W=(await import(X)).default;if(W?.name||W?.table)Y.push({filePath:X,model:W})}catch{}}return Y}async function r$(){let Z=[dZ.userModelsPath(),dZ.frameworkPath("defaults/app/Models")],Y=new Set;for(let $ of Z)for(let{filePath:J,model:X}of await j6($)){if(!X.traits?.useUuid)continue;Y.add(d$(X,J))}return[...Y]}async function n$(Z,Y={}){let $=await r$();for(let J of $)try{if(await A.unsafe(l$(J,Z)).execute(),Y.verbose)I6.debug(`[uuid-columns] Added uuid column to ${J}`)}catch{if(Y.verbose)I6.debug(`[uuid-columns] Skipped (already applied or ${J} missing): uuid column`)}}async function GJ(Z={}){await n$(HY(m$()),Z)}F();import{log as mY}from"@stacksjs/logging";import{env as i$}from"@stacksjs/env";function a$(){return i$.DB_CONNECTION||"sqlite"}function o$(Z){let{pkColumn:Y,nullableTimestamp:$}=Z;return`CREATE TABLE IF NOT EXISTS notifications (
1284
- ${Y},
1285
- user_id INTEGER NOT NULL,
1286
- type VARCHAR(255) NOT NULL,
1287
- data TEXT NOT NULL,
1288
- read_at ${$},
1289
- created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
1290
- updated_at ${$}
1291
- )`}function t$(Z){let{pkColumn:Y,boolTrue:$,nullableTimestamp:J}=Z;return`CREATE TABLE IF NOT EXISTS notification_preferences (
1292
- ${Y},
1293
- user_id INTEGER NOT NULL,
1294
- channel VARCHAR(50) NOT NULL,
1295
- enabled BOOLEAN NOT NULL DEFAULT ${$},
1296
- category VARCHAR(255),
1297
- created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
1298
- updated_at ${J},
1299
- UNIQUE (user_id, channel, category)
1300
- )`}async function e$(Z={}){let Y=a$(),$=HY(Y);if(Z.verbose)mY.info(`Creating notification tables for ${Y}...`);try{if(Z.verbose)mY.info("Creating notifications table...");if(await A.unsafe(o$($)).execute(),await A.unsafe("CREATE INDEX IF NOT EXISTS idx_notifications_user ON notifications (user_id)").execute(),Z.verbose)mY.info("Creating notification_preferences table...");if(await A.unsafe(t$($)).execute(),await A.unsafe("CREATE INDEX IF NOT EXISTS idx_notification_preferences_user ON notification_preferences (user_id)").execute(),Z.verbose)mY.success("Notification tables created");return{success:!0}}catch(J){let X=J instanceof Error?J.message:String(J);return mY.error(`Failed to create notification tables: ${X}`),{success:!1,error:X}}}F();import{log as GY}from"@stacksjs/logging";import{env as Y0}from"@stacksjs/env";function Z0(){return Y0.DB_CONNECTION||"sqlite"}function $0(Z){let{pkColumn:Y,nullableTimestamp:$}=Z;return`CREATE TABLE IF NOT EXISTS roles (
1301
- ${Y},
1302
- name VARCHAR(255) NOT NULL,
1303
- guard_name VARCHAR(255) NOT NULL DEFAULT 'web',
1304
- description TEXT,
1305
- created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
1306
- updated_at ${$},
1307
- UNIQUE (name, guard_name)
1308
- )`}function J0(Z){let{pkColumn:Y,nullableTimestamp:$}=Z;return`CREATE TABLE IF NOT EXISTS permissions (
1309
- ${Y},
1310
- name VARCHAR(255) NOT NULL,
1311
- guard_name VARCHAR(255) NOT NULL DEFAULT 'web',
1312
- description TEXT,
1313
- created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
1314
- updated_at ${$},
1315
- UNIQUE (name, guard_name)
1316
- )`}function X0(){return`CREATE TABLE IF NOT EXISTS user_roles (
1317
- user_id INTEGER NOT NULL,
1318
- role_id INTEGER NOT NULL,
1319
- created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
1320
- PRIMARY KEY (user_id, role_id)
1321
- )`}function W0(){return`CREATE TABLE IF NOT EXISTS user_permissions (
1322
- user_id INTEGER NOT NULL,
1323
- permission_id INTEGER NOT NULL,
1324
- created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
1325
- PRIMARY KEY (user_id, permission_id)
1326
- )`}function H0(){return`CREATE TABLE IF NOT EXISTS role_permissions (
1327
- role_id INTEGER NOT NULL,
1328
- permission_id INTEGER NOT NULL,
1329
- created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
1330
- PRIMARY KEY (role_id, permission_id)
1331
- )`}async function G0(Z={}){let Y=Z0(),$=HY(Y);if(Z.verbose)GY.info(`Creating RBAC tables for ${Y}...`);try{if(Z.verbose)GY.info("Creating roles table...");if(await A.unsafe($0($)).execute(),Z.verbose)GY.info("Creating permissions table...");if(await A.unsafe(J0($)).execute(),Z.verbose)GY.info("Creating user_roles pivot...");if(await A.unsafe(X0()).execute(),Z.verbose)GY.info("Creating user_permissions pivot...");if(await A.unsafe(W0()).execute(),Z.verbose)GY.info("Creating role_permissions pivot...");if(await A.unsafe(H0()).execute(),Z.verbose)GY.success("RBAC tables created");return{success:!0}}catch(J){let X=J instanceof Error?J.message:String(J);return GY.error(`Failed to create RBAC tables: ${X}`),{success:!1,error:X}}}iY();import{existsSync as z0}from"fs";import{dirname as R6}from"path";import{plural as mZ,singular as w6,snakeCase as sY}from"@stacksjs/strings";import{path as S6}from"@stacksjs/path";import{globSync as U0}from"@stacksjs/storage";function lY(Z){let Y=Z.search(/[*?[]/),$=Y===-1?R6(Z):R6(Z.slice(0,Y));if(!z0($))return[];try{return U0(Z,{absolute:!0})}catch{return[]}}async function M6(){let Z=[...lY(S6.userModelsPath("*.ts")),...lY(S6.storagePath("framework/defaults/app/Models/**/*.ts"))],Y=[];for(let $ of Z){let J;try{J=(await import($)).default}catch{continue}if(!J||typeof J!=="object")continue;let X=J.table||mZ(sY(J.name||"")),W=J.belongsTo;if(Array.isArray(W))for(let H of W){let G=typeof H==="string"?H:H?.model??"";if(!G)continue;let z=`${sY(w6(G))}_id`,Q=mZ(sY(G));Y.push({fromTable:X,fromColumn:z,toTable:Q,toColumn:"id",model:J.name||""})}else if(W&&typeof W==="object")for(let H of Object.keys(W)){let G=`${sY(w6(H))}_id`,z=mZ(sY(H));Y.push({fromTable:X,fromColumn:G,toTable:z,toColumn:"id",model:J.name||""})}}return Y}async function F6(){let{db:Z}=await Promise.resolve().then(() => (F(),u)),Y=await D6();if(Y==="sqlite")return O0(Z);if(Y==="mysql")return A0(Z);if(Y==="postgres")return B0(Z);return[]}async function Q0(){let Z=await M6(),Y=await F6(),$=new Set(Y.map((X)=>`${X.fromTable.toLowerCase()}.${X.fromColumn.toLowerCase()}\u2192${X.toTable.toLowerCase()}.${X.toColumn.toLowerCase()}`)),J=Z.filter((X)=>{let W=`${X.fromTable.toLowerCase()}.${X.fromColumn.toLowerCase()}\u2192${X.toTable.toLowerCase()}.${X.toColumn.toLowerCase()}`;return!$.has(W)});return{declared:Z,live:Y,missing:J}}async function _0(Z){if((Z??await D6())!=="sqlite")return{supported:!1,total:0,orphans:[]};let{db:$}=await Promise.resolve().then(() => (F(),u)),J=await $.unsafe("PRAGMA foreign_key_check").execute(),X=Array.isArray(J)?J:[],W=new Map;async function H(_){if(W.has(_))return W.get(_);if(!/^[a-z_]\w*$/i.test(_))return W.set(_,[]),[];let U=await $.unsafe(`PRAGMA foreign_key_list("${_}")`).execute(),I=Array.isArray(U)?U:[];return W.set(_,I),I}let G=new Map;for(let _ of X){let U=_,I=String(U.table??""),O=String(U.parent??"");if(!I||!O)continue;let L=Number(U.fkid??0),B="",E=await H(I);for(let R of E){let v=R;if(Number(v.id)===L&&v.from){B=String(v.from);break}}let V=`${I}\x00${O}\x00${L}`,j=G.get(V);if(!j)j={table:I,column:B,parent:O,count:0,sampleRowids:[]},G.set(V,j);if(j.count++,j.sampleRowids.length<5&&typeof U.rowid==="number")j.sampleRowids.push(U.rowid)}let z=[...G.values()];return{supported:!0,total:z.reduce((_,U)=>_+U.count,0),orphans:z}}async function D6(){let Y=((await import("@stacksjs/env")).env?.DB_CONNECTION??"sqlite").toLowerCase();if(Y==="sqlite"||Y==="mysql"||Y==="postgres")return Y;return"other"}async function O0(Z){let Y=await Z.unsafe("SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%'"),$=Array.isArray(Y)?Y:[],J=[];for(let X of $){let W=X.name;if(!W)continue;if(!/^[a-z_][\w]*$/i.test(W))continue;let H=await Z.unsafe(`PRAGMA foreign_key_list("${W}")`);for(let G of Array.isArray(H)?H:[]){let z=G;if((z.seq??0)!==0)continue;if(!z.from||!z.to||!z.table)continue;J.push({fromTable:W,fromColumn:z.from,toTable:z.table,toColumn:z.to})}}return J}async function A0(Z){let Y=await Z.unsafe(`
1332
- SELECT TABLE_NAME, COLUMN_NAME, REFERENCED_TABLE_NAME, REFERENCED_COLUMN_NAME
1333
- FROM information_schema.KEY_COLUMN_USAGE
1334
- WHERE TABLE_SCHEMA = DATABASE()
1335
- AND REFERENCED_TABLE_NAME IS NOT NULL
1336
- `);return(Array.isArray(Y)?Y:[]).map(($)=>({fromTable:String($.TABLE_NAME??$.table_name??""),fromColumn:String($.COLUMN_NAME??$.column_name??""),toTable:String($.REFERENCED_TABLE_NAME??$.referenced_table_name??""),toColumn:String($.REFERENCED_COLUMN_NAME??$.referenced_column_name??"")})).filter(($)=>$.fromTable&&$.fromColumn&&$.toTable&&$.toColumn)}async function B0(Z){let Y=await Z.unsafe(`
1337
- SELECT
1338
- kcu.table_name AS from_table,
1339
- kcu.column_name AS from_column,
1340
- ccu.table_name AS to_table,
1341
- ccu.column_name AS to_column
1342
- FROM information_schema.referential_constraints rc
1343
- JOIN information_schema.key_column_usage kcu
1344
- ON kcu.constraint_name = rc.constraint_name
1345
- AND kcu.constraint_schema = rc.constraint_schema
1346
- JOIN information_schema.constraint_column_usage ccu
1347
- ON ccu.constraint_name = rc.constraint_name
1348
- AND ccu.constraint_schema = rc.constraint_schema
1349
- WHERE rc.constraint_schema = 'public'
1350
- `);return(Array.isArray(Y)?Y:[]).map(($)=>({fromTable:String($.from_table??""),fromColumn:String($.from_column??""),toTable:String($.to_table??""),toColumn:String($.to_column??"")})).filter(($)=>$.fromTable&&$.fromColumn&&$.toTable&&$.toColumn)}import{path as x6}from"@stacksjs/path";import{plural as V0,snakeCase as sZ}from"@stacksjs/strings";async function T6(){let Z=[...lY(x6.userModelsPath("*.ts")),...lY(x6.storagePath("framework/defaults/app/Models/**/*.ts"))],Y=[];for(let $ of Z){let J;try{J=(await import($)).default}catch{continue}if(!J||typeof J!=="object")continue;let X=J.table||V0(sZ(J.name||"")),W=J.name||"",H=J.attributes;if(H&&typeof H==="object"){for(let[z,Q]of Object.entries(H))if(Q&&typeof Q==="object"&&Q.unique===!0)Y.push({table:X,columns:[sZ(z)],model:W,source:"attribute"})}let G=J.indexes;if(Array.isArray(G)){for(let z of G)if(z&&z.unique===!0&&Array.isArray(z.columns)&&z.columns.length>0)Y.push({table:X,columns:z.columns.map((Q)=>sZ(Q)),model:W,source:"index",indexName:z.name})}}return Y}async function P6(Z){let{db:Y}=await Promise.resolve().then(() => (F(),u)),$=Z??await k6();if($==="sqlite")return I0(Y);if($==="mysql")return K0(Y);if($==="postgres")return j0(Y);return[]}async function L0(Z){let Y=Z??await k6();if(Y!=="sqlite"&&Y!=="mysql"&&Y!=="postgres")return{supported:!1,declared:[],live:[],missing:[],skippedTables:[]};let $=await T6(),J=await P6(Y),X=await E0(Y),W=new Map;for(let z of J){let Q=z.table.toLowerCase(),_=q6(z.columns);if(!W.has(Q))W.set(Q,new Set);W.get(Q).add(_)}let H=[],G=new Set;for(let z of $){let Q=z.table.toLowerCase();if(!X.has(Q)){G.add(z.table);continue}let _=q6(z.columns);if(!(W.get(Q)?.has(_)??!1))H.push(z)}return{supported:!0,declared:$,live:J,missing:H,skippedTables:[...G]}}async function E0(Z){let{db:Y}=await Promise.resolve().then(() => (F(),u)),$=[];if(Z==="sqlite"){let J=await Y.unsafe("SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%'").execute();$=(Array.isArray(J)?J:[]).map((X)=>X.name)}else if(Z==="mysql"){let J=await Y.unsafe("SELECT TABLE_NAME AS name FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE()").execute();$=(Array.isArray(J)?J:[]).map((X)=>X.name??X.TABLE_NAME)}else if(Z==="postgres"){let J=await Y.unsafe("SELECT tablename AS name FROM pg_tables WHERE schemaname = 'public'").execute();$=(Array.isArray(J)?J:[]).map((X)=>X.name??X.tablename)}return new Set($.filter((J)=>typeof J==="string"&&J.length>0).map((J)=>J.toLowerCase()))}function q6(Z){return[...Z].map((Y)=>Y.toLowerCase()).sort().join(",")}async function k6(){let Y=((await import("@stacksjs/env")).env?.DB_CONNECTION??"sqlite").toLowerCase();if(Y==="sqlite"||Y==="mysql"||Y==="postgres")return Y;return"other"}async function I0(Z){let Y=await Z.unsafe("SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%'").execute(),$=Array.isArray(Y)?Y:[],J=[];for(let X of $){let W=X.name;if(!W)continue;if(!/^[a-z_]\w*$/i.test(W))continue;let H=await Z.unsafe(`PRAGMA index_list("${W}")`).execute();for(let G of Array.isArray(H)?H:[]){let z=G;if(Number(z.unique)!==1||!z.name)continue;if(!/^[a-z_]\w*$/i.test(z.name))continue;let Q=await Z.unsafe(`PRAGMA index_info("${z.name}")`).execute(),_=(Array.isArray(Q)?Q:[]).map((U)=>String(U.name??"")).filter((U)=>U.length>0);if(_.length>0)J.push({table:W,name:z.name,columns:_})}}return J}async function K0(Z){let Y=await Z.unsafe(`
1351
- SELECT TABLE_NAME, INDEX_NAME, COLUMN_NAME, SEQ_IN_INDEX
1352
- FROM information_schema.STATISTICS
1353
- WHERE TABLE_SCHEMA = DATABASE()
1354
- AND NON_UNIQUE = 0
1355
- ORDER BY TABLE_NAME, INDEX_NAME, SEQ_IN_INDEX
1356
- `).execute();return N6(Array.isArray(Y)?Y:[],($)=>({table:String($.TABLE_NAME??$.table_name??""),name:String($.INDEX_NAME??$.index_name??""),column:String($.COLUMN_NAME??$.column_name??"")}))}async function j0(Z){let Y=await Z.unsafe(`
1357
- SELECT
1358
- t.relname AS table_name,
1359
- ix.relname AS index_name,
1360
- a.attname AS column_name,
1361
- k.ord AS seq_in_index
1362
- FROM pg_index i
1363
- JOIN pg_class t ON t.oid = i.indrelid
1364
- JOIN pg_class ix ON ix.oid = i.indexrelid
1365
- JOIN pg_namespace n ON n.oid = t.relnamespace
1366
- JOIN LATERAL unnest(i.indkey) WITH ORDINALITY AS k(attnum, ord) ON true
1367
- JOIN pg_attribute a ON a.attrelid = t.oid AND a.attnum = k.attnum
1368
- WHERE i.indisunique = true
1369
- AND n.nspname = 'public'
1370
- ORDER BY table_name, index_name, seq_in_index
1371
- `).execute();return N6(Array.isArray(Y)?Y:[],($)=>({table:String($.table_name??""),name:String($.index_name??""),column:String($.column_name??"")}))}function N6(Z,Y){let $=new Map;for(let J of Z){let{table:X,name:W,column:H}=Y(J);if(!X||!W||!H)continue;let G=`${X} ${W}`,z=$.get(G);if(z)z.columns.push(H);else $.set(G,{table:X,name:W,columns:[H]})}return[...$.values()]}import{AsyncLocalStorage as R0}from"async_hooks";var FY=new R0;function w0(){return FY.getStore()!==void 0}function S0(Z){let Y=FY.getStore();if(!Y)return!1;return Y.pending.push(Z),!0}async function M0(Z,Y={}){let $=FY.getStore();if($){$.depth+=1;try{return await Z()}finally{$.depth-=1}}let J={pending:[],depth:1,onError:Y.onError},X;try{X=await FY.run(J,Z)}catch(W){throw J.pending.length=0,W}return await y6(J),X}async function y6(Z){for(let Y=0;Y<Z.pending.length;Y++)try{await Z.pending[Y]()}catch($){if(Z.onError)try{Z.onError($,Y)}catch{}else console.error("[transaction-context] after-commit callback threw:",$)}Z.pending.length=0}async function F0(){let Z=FY.getStore();if(!Z)return 0;let Y=Z.pending.length;return await y6(Z),Y}function D0(){return FY.getStore()?.pending.length??0}import{createQueryBuilder as ZX,setConfig as $X}from"@stacksjs/query-builder";export{r6 as validateDriverConfig,l$ as uuidColumnSql,C$ as usersTwoFactorColumnsSql,c$ as usersStripeIdSql,p$ as usersPasswordChangedAtSql,b$ as usersEmailVerifiedAtSql,dY as unmarshall,O1 as truncateMigrationTables,HY as sqlHelpers,PY as sql,l7 as setQueryTracker,$X as setConfig,D4 as seedModelDirect,N5 as seedModel$,K8 as seed,D8 as scaffoldClassSeedersFromModels,K8 as runSeeders,M0 as runInTransactionScope,G5 as runDatabaseMigration,G8 as runClassSeeders,Z9 as resetSqliteDatabase,g1 as resetPostgresDatabase,D1 as resetMysqlDatabase,z5 as resetDatabase,x8 as renderSeederFile,U8 as renameColumnSafely,U5 as previewPendingMigrations,y7 as preprocessSqliteMigrations,N8 as prepareTextColumnType,y8 as prepareNumberColumnType,h8 as prepareEnumColumnType,t5 as prepareDateTimeColumnType,IY as pluckChanges,B$ as parseKeyPattern,o5 as modelTableName,G0 as migrateRbacTables,e$ as migrateNotificationTables,o9 as migrateAuthTables,n6 as mergeWithDefaults,C as marshall,WY as mapFieldTypeToColumnType,r7 as logQuery,h5 as listSeedableModels,O8 as isProtectedModel,w0 as isInTransaction,KY as isArrayEqual,J4 as initializeDbConfig,JY as hasTableBeenMigrated,x as hasMigrationBeenCreated,UY as getUpvoteTableName,_1 as getTraitTables,P6 as getLiveUniqueIndexes,F6 as getLiveFKs,RY as getLikeableForeignKey,s as getLastMigrationFields,k8 as getExecutedMigrations,T6 as getDeclaredUniques,M6 as getDeclaredFKs,l6 as getConnectionString,t as getConnectionDefaults,i6 as getConfigFromEnv,X9 as generateSqliteMigration,fZ as generateSqliteIndexCreationSQL,u1 as generatePostgresTraitMigrations,d1 as generatePostgresMigration,t8 as generatePostgresIndexCreationSQL,q1 as generateMysqlTraitMigrations,x1 as generateMysqlMigration,_5 as generateMigrations2,Q5 as generateMigrations,A$ as generateKeyPattern,g8 as generateIndexCreationSQL,y5 as freshWithSeed,y5 as freshSeed,r$ as findUuidTables,_0 as findFkOrphans,jY as findDifferingKeys,H$ as fetchTestSqliteFile,ZZ as fetchTables,J9 as fetchSqliteFile,Y$ as fetchPostgresTables,T4 as factoryGenerate,S8 as factory,GJ as ensureUuidColumnsForCurrentDriver,n$ as ensureUuidColumns,u$ as ensureUsersAuthColumns,AZ as ensureDatabaseConfigLoaded,S0 as enqueueAfterCommit,L$ as dynamo,W$ as dropSqliteTables,n8 as dropPostgresTables,C8 as dropMysqlTables,e4 as dropMigrationTables,JZ as dropCommonTables,nZ as driverDefaults,a6 as detectDriver,VY as deleteMigrationFiles,LY as deleteFrameworkModels,A as db,kZ as createTaggablesTable,r4 as createTaggableTable,d6 as createSqliteDatabase,J6 as createQueryLogsTable,ZX as createQueryBuilder,n4 as createPostgresTagsTable,NZ as createPostgresTaggablesTable,X6 as createPostgresQueryLogsTable,W1 as createPostgresPasswordResetsTable,l4 as createPostgresPasskeyMigration,m6 as createPostgresDatabase,t4 as createPostgresCommentsTable,$6 as createPostgresCommentablesPivotTable,Z6 as createPostgresCommentUpvoteMigration,a4 as createPostgresCategorizableTable,$Z as createPasswordResetsTable,s4 as createPasskeyMigration,s6 as createMysqlDatabase,F9 as createModelAuditsTable,C9 as createJobsMigration,k9 as createErrorsTable,E$ as createDynamo,g6 as createDatabase,o4 as createCommentablesTable,A1 as createCommentablesPivotTable,Y6 as createCommentUpvoteMigration,i4 as createCategorizableTable,u8 as createAlterTableMigration,W9 as copyModelFiles,$9 as configureSqlitePragmas,e5 as compareRanges,EY as checkPivotMigration,Y1 as checkIsRequired,V$ as buildKey,w4 as backfillInBatches,L0 as auditUniqueIndexes,Q0 as auditForeignKeys,XY as arrangeColumns,H7 as applySqlitePragmas,z8 as addColumnSafely,Y7 as acquireDbConfigLock,D0 as __pendingAfterCommitCount,F0 as __flushAfterCommitNow,j4 as Seeder,BZ as SQLITE_BOOTSTRAP_PRAGMAS,v0 as REDIS_DEFAULTS,_8 as PROTECTED_MODELS,CZ as EntityQueryBuilder,o as Database,aZ as DB_USERS,iZ as DB_PORTS,UZ as DB_NAMES,h0 as DB_HOST_DEFAULT,f0 as AWS_DEFAULTS};
1263
+ `).execute()}catch{}}}D();import i4 from"process";import{log as T0}from"@stacksjs/logging";import{path as LZ}from"@stacksjs/path";import{getTableName as e4}from"@stacksjs/orm";import{fs as P0}from"@stacksjs/storage";function t4(){return i4.env.DB_CONNECTION||"sqlite"}function Y5(Z){if(Z.isPostgres)return"UUID";if(Z.isMysql)return"VARCHAR(255)";return"TEXT"}function Z5(Z,Y){return`ALTER TABLE ${Z} ADD COLUMN uuid ${Y5(Y)}`}async function N0(Z){let Y=[];if(!P0.existsSync(Z))return Y;let $=P0.readdirSync(Z,{withFileTypes:!0});for(let X of $){let J=LZ.join(Z,X.name);if(X.isDirectory()){Y.push(...await N0(J));continue}if(!X.name.endsWith(".ts"))continue;if(X.name.startsWith("_")||X.name.startsWith("index"))continue;try{let W=(await import(J)).default;if(W?.name||W?.table)Y.push({filePath:J,model:W})}catch{}}return Y}async function $5(){let Z=[LZ.userModelsPath(),LZ.frameworkPath("defaults/app/Models")],Y=new Set;for(let $ of Z)for(let{filePath:X,model:J}of await N0($)){if(!J.traits?.useUuid)continue;Y.add(e4(J,X))}return[...Y]}async function X5(Z,Y={}){let $=await $5();for(let X of $)try{if(await K.unsafe(Z5(X,Z)).execute(),Y.verbose)T0.debug(`[uuid-columns] Added uuid column to ${X}`)}catch{if(Y.verbose)T0.debug(`[uuid-columns] Skipped (already applied or ${X} missing): uuid column`)}}async function z8(Z={}){await X5(CY(t4()),Z)}MY();export{j8 as validateDriverConfig,Z5 as uuidColumnSql,a4 as usersTwoFactorColumnsSql,n4 as usersStripeIdSql,r4 as usersPasswordChangedAtSql,l4 as usersEmailVerifiedAtSql,x9 as unmarshall,O6 as truncateMigrationTables,CY as sqlHelpers,TZ as sql,k8 as setQueryTracker,L9 as setConfig,m5 as seedModelDirect,l5 as seedModel$,C1 as seed,b8 as scaffoldClassSeedersFromModels,C1 as runSeeders,K9 as runInTransactionScope,N5 as runDatabaseMigration,F8 as runClassSeeders,H7 as resetSqliteDatabase,n6 as resetPostgresDatabase,N6 as resetMysqlDatabase,v5 as resetDatabase,C8 as renderSeederFile,v8 as renameColumnSafely,f5 as previewPendingMigrations,w1 as preprocessSqliteMigrations,l1 as prepareTextColumnType,r1 as prepareNumberColumnType,a1 as prepareEnumColumnType,W6 as prepareDateTimeColumnType,GY as pluckChanges,j9 as parseKeyPattern,J6 as modelTableName,n8 as migrateRbacTables,r8 as migrateNotificationTables,o7 as migrateAuthTables,B8 as mergeWithDefaults,S9 as marshall,o as mapFieldTypeToColumnType,D8 as logQuery,a5 as listSeedableModels,v1 as isProtectedModel,I9 as isInTransaction,HY as isArrayEqual,kZ as initializeDbConfig,a as hasTableBeenMigrated,q as hasMigrationBeenCreated,t as getUpvoteTableName,R6 as getTraitTables,z9 as getLiveUniqueIndexes,$9 as getLiveFKs,QY as getLikeableForeignKey,c as getLastMigrationFields,m1 as getExecutedMigrations,W9 as getDeclaredUniques,Z9 as getDeclaredFKs,O8 as getConnectionString,m as getConnectionDefaults,R8 as getConfigFromEnv,I7 as generateSqliteMigration,KZ as generateSqliteIndexCreationSQL,a6 as generatePostgresTraitMigrations,o6 as generatePostgresMigration,K4 as generatePostgresIndexCreationSQL,f6 as generateMysqlTraitMigrations,v6 as generateMysqlMigration,p5 as generateMigrations2,h5 as generateMigrations,B9 as generateKeyPattern,$4 as generateIndexCreationSQL,r5 as freshWithSeed,r5 as freshSeed,$5 as findUuidTables,Y9 as findFkOrphans,UY as findDifferingKeys,B4 as fetchTestSqliteFile,vY as fetchTables,Q7 as fetchSqliteFile,_4 as fetchPostgresTables,u8 as factoryGenerate,p8 as factory,z8 as ensureUuidColumnsForCurrentDriver,X5 as ensureUuidColumns,o4 as ensureUsersAuthColumns,lY as ensureDatabaseConfigLoaded,Q9 as enqueueAfterCommit,R9 as dynamo,O4 as dropSqliteTables,H4 as dropPostgresTables,t1 as dropMysqlTables,K0 as dropMigrationTables,hY as dropCommonTables,A8 as driverDefaults,E8 as detectDriver,JY as deleteMigrationFiles,WY as deleteFrameworkModels,K as db,GZ as createTaggablesTable,z0 as createTaggableTable,_8 as createSqliteDatabase,E0 as createQueryLogsTable,_9 as createQueryBuilder,G0 as createPostgresTagsTable,HZ as createPostgresTaggablesTable,A0 as createPostgresQueryLogsTable,K6 as createPostgresPasswordResetsTable,W0 as createPostgresPasskeyMigration,V8 as createPostgresDatabase,I0 as createPostgresCommentsTable,L0 as createPostgresCommentablesPivotTable,_0 as createPostgresCommentUpvoteMigration,U0 as createPostgresCategorizableTable,fY as createPasswordResetsTable,J0 as createPasskeyMigration,K8 as createMysqlDatabase,M7 as createModelAuditsTable,d7 as createJobsMigration,v7 as createErrorsTable,A9 as createDynamo,I8 as createDatabase,Q0 as createCommentablesTable,B6 as createCommentablesPivotTable,V0 as createCommentUpvoteMigration,H0 as createCategorizableTable,Z4 as createAlterTableMigration,K7 as copyModelFiles,U7 as configureSqlitePragmas,z6 as compareRanges,zY as checkPivotMigration,G6 as checkIsRequired,w9 as buildKey,N8 as backfillInBatches,J9 as auditUniqueIndexes,t8 as auditForeignKeys,n as arrangeColumns,n0 as applySqlitePragmas,P8 as addColumnSafely,g0 as acquireDbConfigLock,U9 as __pendingAfterCommitCount,H9 as __flushAfterCommitNow,y8 as Seeder,rY as SQLITE_BOOTSTRAP_PRAGMAS,G5 as REDIS_DEFAULTS,N1 as PROTECTED_MODELS,O9 as EntityQueryBuilder,Q8 as Database,OZ as DB_USERS,RZ as DB_PORTS,dY as DB_NAMES,z5 as DB_HOST_DEFAULT,H5 as AWS_DEFAULTS};