@stacksjs/database 0.70.84 → 0.70.85
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +258 -366
- 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(
|
|
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
|
|
9
|
-
${
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
593
|
-
`;if(
|
|
594
|
-
|
|
595
|
-
`,
|
|
596
|
-
`,
|
|
597
|
-
`,
|
|
598
|
-
`,
|
|
599
|
-
`,
|
|
600
|
-
`;if(W){let
|
|
601
|
-
`;if(
|
|
602
|
-
`;if(
|
|
603
|
-
`;if(
|
|
604
|
-
`;if(
|
|
605
|
-
`}for(let[
|
|
606
|
-
`}if(
|
|
607
|
-
`;if(Q)
|
|
608
|
-
`;if(
|
|
609
|
-
`;if(
|
|
610
|
-
`,
|
|
611
|
-
`;if(G
|
|
612
|
-
`;if(
|
|
613
|
-
`,
|
|
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
|
-
`,
|
|
616
|
-
`,
|
|
617
|
-
`,
|
|
618
|
-
`,
|
|
619
|
-
`,
|
|
620
|
-
`,
|
|
621
|
-
`,
|
|
622
|
-
`,
|
|
623
|
-
|
|
624
|
-
`,
|
|
625
|
-
`,
|
|
626
|
-
`,
|
|
627
|
-
`,
|
|
628
|
-
`}}
|
|
629
|
-
`;let
|
|
630
|
-
`;
|
|
631
|
-
|
|
632
|
-
`,
|
|
633
|
-
`,
|
|
634
|
-
`,
|
|
635
|
-
`,
|
|
636
|
-
`,
|
|
637
|
-
`,
|
|
638
|
-
`,
|
|
639
|
-
`,
|
|
640
|
-
`,
|
|
641
|
-
`;let
|
|
642
|
-
`;if(
|
|
643
|
-
|
|
644
|
-
`,
|
|
645
|
-
`,Q.length||
|
|
646
|
-
`;let
|
|
647
|
-
`}let
|
|
648
|
-
`,
|
|
649
|
-
`;let
|
|
650
|
-
`}let $=Y.columns.map((
|
|
651
|
-
`}function
|
|
652
|
-
`}function
|
|
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 ${
|
|
634
|
+
MODIFY COLUMN ${z} VARCHAR(255) NOT NULL AFTER ${IY(J)};
|
|
655
635
|
\`.execute(db)
|
|
656
636
|
|
|
657
|
-
`;
|
|
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', '
|
|
664
|
-
`,
|
|
665
|
-
`;
|
|
666
|
-
|
|
667
|
-
`;if(
|
|
668
|
-
`;if(
|
|
669
|
-
`;if(
|
|
670
|
-
|
|
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(
|
|
674
|
-
`;if(
|
|
675
|
-
`;if(
|
|
676
|
-
|
|
677
|
-
|
|
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
|
-
|
|
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('${
|
|
683
|
-
`,U+=` .addColumn('id', '
|
|
684
|
-
`,U+=` .addColumn('${
|
|
685
|
-
`,U+=` .addColumn('user_id', 'integer',
|
|
686
|
-
`,U
|
|
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('${
|
|
692
|
-
`,U+=` await (db as any).schema.createIndex('${
|
|
693
|
-
`,U+=` await (db as any).schema.createIndex('${
|
|
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
|
|
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('${
|
|
767
|
+
`,W+=` .createTable('${X.table}')
|
|
788
768
|
`,W+=` .addColumn('id', 'integer', col => col.primaryKey().autoIncrement())
|
|
789
|
-
`,W+=` .addColumn('${
|
|
790
|
-
`,W+=` .addColumn('${
|
|
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
|
|
795
|
-
`;if(
|
|
796
|
-
|
|
797
|
-
`,
|
|
798
|
-
`,
|
|
799
|
-
`;let
|
|
800
|
-
ALTER TABLE ${
|
|
801
|
-
MODIFY COLUMN ${
|
|
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
|
|
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
|
|
807
|
-
`;if(
|
|
808
|
-
`;let
|
|
809
|
-
`;for(let
|
|
810
|
-
`;let
|
|
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 ${
|
|
792
|
+
MODIFY COLUMN ${z} TEXT NOT NULL AFTER ${YY(J)};
|
|
813
793
|
\`.execute(db)
|
|
814
794
|
|
|
815
|
-
`;
|
|
816
|
-
`}let $=Y.columns.map((
|
|
817
|
-
`}function
|
|
818
|
-
`}function
|
|
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
|
|
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
|
|
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")
|
|
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")
|
|
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
|
|
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(() => (
|
|
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(() => (
|
|
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
|
|
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(() => (
|
|
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(() => (
|
|
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
|
|
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
|
-
${
|
|
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 ${
|
|
1174
|
+
updated_at ${H}
|
|
1195
1175
|
)
|
|
1196
|
-
`).execute(),Z.verbose)
|
|
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
|
-
${
|
|
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 ${
|
|
1185
|
+
expires_at ${H},
|
|
1206
1186
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
1207
|
-
updated_at ${
|
|
1187
|
+
updated_at ${H}
|
|
1208
1188
|
)
|
|
1209
|
-
`).execute(),await
|
|
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
|
-
${
|
|
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 ${
|
|
1195
|
+
expires_at ${H},
|
|
1216
1196
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
1217
1197
|
)
|
|
1218
|
-
`).execute(),await
|
|
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
|
-
${
|
|
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
|
|
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)
|
|
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 ${
|
|
1220
|
+
last_used_at ${H}
|
|
1241
1221
|
)
|
|
1242
|
-
`).execute();try{await
|
|
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)
|
|
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
|
-
${
|
|
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
|
|
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)
|
|
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
|
|
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)
|
|
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)
|
|
1272
|
-
SELECT id FROM oauth_clients WHERE personal_access_client = ${
|
|
1273
|
-
`).execute())?.length===0){let Q=
|
|
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
|
|
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)
|
|
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
|
|
1261
|
+
`).execute()}catch{try{await K.unsafe(`
|
|
1282
1262
|
CREATE INDEX IF NOT EXISTS ${Z} ON ${Y}(${$})
|
|
1283
|
-
`).execute()}catch{}}}
|
|
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};
|