arcanajs 3.0.1 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/dist/arcanajs.js +2 -1
  2. package/dist/arcanajs.js.LICENSE.txt +14 -0
  3. package/dist/arcanajs.js.map +1 -1
  4. package/dist/arcanox.js +2 -0
  5. package/dist/arcanox.js.map +1 -0
  6. package/dist/cli/commands/db.d.ts +1 -0
  7. package/dist/cli/commands/make.d.ts +1 -0
  8. package/dist/cli/commands/migrate.d.ts +1 -0
  9. package/dist/cli/index.d.ts +1 -0
  10. package/dist/cli/index.js +1 -1
  11. package/dist/cli/index.js.map +1 -1
  12. package/dist/lib/arcanox/Model.d.ts +203 -0
  13. package/dist/lib/arcanox/QueryBuilder.d.ts +141 -0
  14. package/dist/lib/arcanox/adapters/MongoAdapter.d.ts +22 -0
  15. package/dist/lib/arcanox/adapters/MySQLAdapter.d.ts +27 -0
  16. package/dist/lib/arcanox/adapters/PostgresAdapter.d.ts +27 -0
  17. package/dist/lib/arcanox/extensions/MongoExtensions.d.ts +33 -0
  18. package/dist/lib/arcanox/factory/Factory.d.ts +26 -0
  19. package/dist/lib/arcanox/factory/index.d.ts +1 -0
  20. package/dist/lib/arcanox/index.d.ts +13 -0
  21. package/dist/lib/arcanox/providers/DatabaseProvider.d.ts +5 -0
  22. package/dist/lib/arcanox/relations/BelongsTo.d.ts +11 -0
  23. package/dist/lib/arcanox/relations/BelongsToMany.d.ts +15 -0
  24. package/dist/lib/arcanox/relations/HasMany.d.ts +11 -0
  25. package/dist/lib/arcanox/relations/HasOne.d.ts +11 -0
  26. package/dist/lib/arcanox/relations/Relation.d.ts +14 -0
  27. package/dist/lib/arcanox/schema/Blueprint.d.ts +183 -0
  28. package/dist/lib/arcanox/schema/Migration.d.ts +76 -0
  29. package/dist/lib/arcanox/schema/Schema.d.ts +49 -0
  30. package/dist/lib/arcanox/schema/index.d.ts +4 -0
  31. package/dist/lib/arcanox/seeder/Seeder.d.ts +13 -0
  32. package/dist/lib/arcanox/seeder/index.d.ts +1 -0
  33. package/dist/lib/arcanox/support/Macroable.d.ts +19 -0
  34. package/dist/lib/arcanox/types.d.ts +76 -0
  35. package/dist/lib/index.arcanox.d.ts +6 -0
  36. package/dist/lib/{index.d.ts → index.server.d.ts} +7 -11
  37. package/dist/lib/server/ArcanaJSServer.d.ts +35 -9
  38. package/dist/lib/server/Container.d.ts +31 -0
  39. package/dist/lib/server/MiddlewareBinder.d.ts +4 -0
  40. package/dist/lib/server/ResponseHandlerMiddleware.d.ts +0 -25
  41. package/dist/lib/server/Router.d.ts +12 -3
  42. package/dist/lib/server/http/FormRequest.d.ts +10 -0
  43. package/dist/lib/server/http/JsonResource.d.ts +13 -0
  44. package/dist/lib/server/http/Middleware.d.ts +4 -0
  45. package/dist/lib/server/support/ServiceProvider.d.ts +13 -0
  46. package/dist/lib/server/utils/dynamicRequire.d.ts +6 -0
  47. package/dist/lib/server/validation/ValidationException.d.ts +5 -0
  48. package/dist/lib/server/validation/Validator.d.ts +12 -0
  49. package/package.json +26 -14
  50. package/dist/lib/global.d.ts +0 -61
@@ -0,0 +1,2 @@
1
+ (()=>{"use strict";var __webpack_modules__={14:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{__webpack_require__.d(__webpack_exports__,{dynamicRequire:()=>dynamicRequire});const dynamicRequire=id=>"undefined"!=typeof require?require(id):eval("require")(id)},896:t=>{t.exports=require("fs")},928:t=>{t.exports=require("path")},941:t=>{t.exports=require("@faker-js/faker")}},__webpack_module_cache__={},leafPrototypes,getProto;function __webpack_require__(t){var e=__webpack_module_cache__[t];if(void 0!==e)return e.exports;var i=__webpack_module_cache__[t]={exports:{}};return __webpack_modules__[t](i,i.exports,__webpack_require__),i.exports}getProto=Object.getPrototypeOf?t=>Object.getPrototypeOf(t):t=>t.__proto__,__webpack_require__.t=function(t,e){if(1&e&&(t=this(t)),8&e)return t;if("object"==typeof t&&t){if(4&e&&t.__esModule)return t;if(16&e&&"function"==typeof t.then)return t}var i=Object.create(null);__webpack_require__.r(i);var r={};leafPrototypes=leafPrototypes||[null,getProto({}),getProto([]),getProto(getProto)];for(var s=2&e&&t;("object"==typeof s||"function"==typeof s)&&!~leafPrototypes.indexOf(s);s=getProto(s))Object.getOwnPropertyNames(s).forEach(e=>r[e]=()=>t[e]);return r.default=()=>t,__webpack_require__.d(i,r),i},__webpack_require__.d=(t,e)=>{for(var i in e)__webpack_require__.o(e,i)&&!__webpack_require__.o(t,i)&&Object.defineProperty(t,i,{enumerable:!0,get:e[i]})},__webpack_require__.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),__webpack_require__.r=t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})};var __webpack_exports__={};__webpack_require__.r(__webpack_exports__),__webpack_require__.d(__webpack_exports__,{Blueprint:()=>Blueprint,Factory:()=>Factory,Macroable:()=>Macroable,Migration:()=>Migration,MigrationRunner:()=>MigrationRunner,Model:()=>Model,MongoAdapter:()=>MongoAdapter,MySQLAdapter:()=>MySQLAdapter,PostgresAdapter:()=>PostgresAdapter,QueryBuilder:()=>QueryBuilder,Schema:()=>Schema,Seeder:()=>Seeder});var dynamicRequire=__webpack_require__(14);class MongoAdapter{client=null;db=null;async connect(t){const{MongoClient:e}=(0,dynamicRequire.dynamicRequire)("mongodb"),i=`mongodb://${t.host}:${t.port}`;return this.client=new e(i,{auth:t.username&&t.password?{username:t.username,password:t.password}:void 0}),await this.client.connect(),this.db=this.client.db(t.database),{query:async(t,e)=>{throw new Error("Raw SQL queries are not supported in MongoDB adapter")},execute:async(t,e)=>{throw new Error("Raw SQL execution is not supported in MongoDB adapter")},close:async()=>{await this.disconnect()}}}async disconnect(){this.client&&(await this.client.close(),this.client=null,this.db=null)}async createTable(t,e){if(!this.db)throw new Error("Database not connected");await this.db.createCollection(t)}async dropTable(t){if(!this.db)throw new Error("Database not connected");await this.db.collection(t).drop()}async hasTable(t){if(!this.db)throw new Error("Database not connected");return(await this.db.listCollections({name:t}).toArray()).length>0}async hasColumn(t,e){return!0}async select(t,e){if(!this.db)throw new Error("Database not connected");const i=this.db.collection(t),r=this.buildFilter(e.where||[]),s=this.buildProjection(e.columns);let n=i.find(r);if(s&&(n=n.project(s)),e.orderBy){const t={};e.orderBy.forEach(e=>{t[e.column]="ASC"===e.direction?1:-1}),n=n.sort(t)}return e.offset&&(n=n.skip(e.offset)),e.limit&&(n=n.limit(e.limit)),(await n.toArray()).map(t=>{const{_id:e,...i}=t;return{id:e,_id:e,...i}})}async insert(t,e){if(!this.db)throw new Error("Database not connected");const i=this.db.collection(t),r={...e};r.id&&(r._id=r.id,delete r.id);const s=await i.insertOne(r);return{id:s.insertedId,_id:s.insertedId,...e}}async update(t,e,i){if(!this.db)throw new Error("Database not connected");const r=this.db.collection(t),s={_id:this.normalizeId(e)},n={$set:i};await r.updateOne(s,n);const a=await r.findOne(s);if(a){const{_id:t,...e}=a;return{id:t,_id:t,...e}}return null}async delete(t,e){if(!this.db)throw new Error("Database not connected");const i=this.db.collection(t);return 1===(await i.deleteOne({_id:this.normalizeId(e)})).deletedCount}async beginTransaction(){}async raw(t,e=[]){if(!this.db)throw new Error("Database not connected");return"db"===t?this.db:await this.db.command(JSON.parse(t))}async commit(){}async rollback(){}buildFilter(t){const e={};return t.forEach(t=>{const i="id"===t.column?"_id":t.column;let r=t.value;switch("_id"===i&&(r=this.normalizeId(r)),t.operator){case"=":e[i]=r;break;case"!=":e[i]={$ne:r};break;case">":e[i]={$gt:r};break;case"<":e[i]={$lt:r};break;case">=":e[i]={$gte:r};break;case"<=":e[i]={$lte:r};break;case"IN":e[i]={$in:Array.isArray(r)?r:[r]};break;case"NOT IN":e[i]={$nin:Array.isArray(r)?r:[r]};break;case"LIKE":e[i]={$regex:new RegExp(r.replace(/%/g,".*"),"i")};break;case"IS NULL":e[i]=null;break;case"IS NOT NULL":e[i]={$ne:null}}}),e}buildProjection(t){if(!t||0===t.length||t.includes("*"))return null;const e={};return t.forEach(t=>{"id"===t||(e[t]=1)}),e}normalizeId(t){const{ObjectId:e}=(0,dynamicRequire.dynamicRequire)("mongodb");return t instanceof e?t:"string"==typeof t&&e.isValid(t)?new e(t):t}}class MySQLAdapter{pool=null;connection=null;async connect(t){var e;const i=(0,dynamicRequire.dynamicRequire)("mysql2/promise");return this.pool=i.createPool({host:t.host,port:t.port,database:t.database,user:t.username,password:t.password,waitForConnections:!0,connectionLimit:(null===(e=t.pool)||void 0===e?void 0:e.max)||10,queueLimit:0}),{query:this.query.bind(this),execute:this.execute.bind(this),close:this.disconnect.bind(this)}}async disconnect(){this.pool&&(await this.pool.end(),this.pool=null)}async query(t,e){if(!this.pool)throw new Error("Database not connected");const[i]=await this.pool.query(t,e);return i}async execute(t,e){if(!this.pool)throw new Error("Database not connected");const[i]=await this.pool.execute(t,e);return i}async createTable(t,e){const i=`CREATE TABLE IF NOT EXISTS \`${t}\` (${e.map(t=>{let e=`\`${t.name}\` ${this.mapType(t.type,t.length)}`;return t.unsigned&&(e+=" UNSIGNED"),t.autoIncrement&&(e+=" AUTO_INCREMENT"),t.nullable||(e+=" NOT NULL"),void 0!==t.default&&(e+=` DEFAULT ${this.formatValue(t.default)}`),t.primary&&(e+=" PRIMARY KEY"),t.unique&&(e+=" UNIQUE"),e}).join(", ")}) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci`;await this.execute(i)}async dropTable(t){await this.execute(`DROP TABLE IF EXISTS \`${t}\``)}async hasTable(t){var e;return(null===(e=(await this.query("SELECT COUNT(*) as count FROM information_schema.tables \n WHERE table_schema = DATABASE() AND table_name = ?",[t]))[0])||void 0===e?void 0:e.count)>0}async hasColumn(t,e){var i;return(null===(i=(await this.query("SELECT COUNT(*) as count FROM information_schema.columns \n WHERE table_schema = DATABASE() AND table_name = ? AND column_name = ?",[t,e]))[0])||void 0===i?void 0:i.count)>0}async select(t,e){var i;let r=`SELECT ${(null===(i=e.columns)||void 0===i?void 0:i.join(", "))||"*"} FROM \`${t}\``;const s=[];if(e.joins&&e.joins.length>0)for(const t of e.joins)r+=` ${t.type} JOIN \`${t.table}\` ON ${t.first} ${t.operator} ${t.second}`;return e.where&&e.where.length>0&&(r+=" "+e.where.map((t,e)=>`${0===e?"WHERE":t.boolean} ${this.buildWhereCondition(t,s)}`).join(" ")),e.orderBy&&e.orderBy.length>0&&(r+=` ORDER BY ${e.orderBy.map(t=>`\`${t.column}\` ${t.direction}`).join(", ")}`),e.limit&&(r+=" LIMIT ?",s.push(e.limit)),e.offset&&(r+=" OFFSET ?",s.push(e.offset)),await this.query(r,s)}async insert(t,e){const i=Object.keys(e),r=Object.values(e),s=r.map(()=>"?").join(", "),n=`INSERT INTO \`${t}\` (${i.map(t=>`\`${t}\``).join(", ")}) VALUES (${s})`;return{id:(await this.execute(n,r)).insertId,...e}}async update(t,e,i){const r=Object.keys(i),s=Object.values(i),n=`UPDATE \`${t}\` SET ${r.map(t=>`\`${t}\` = ?`).join(", ")} WHERE id = ?`;return await this.execute(n,[...s,e]),{id:e,...i}}async delete(t,e){const i=`DELETE FROM \`${t}\` WHERE id = ?`;return(await this.execute(i,[e])).affectedRows>0}async beginTransaction(){if(!this.pool)throw new Error("Database not connected");this.connection=await this.pool.getConnection(),await this.connection.beginTransaction()}async commit(){if(!this.connection)throw new Error("No active transaction");await this.connection.commit(),this.connection.release(),this.connection=null}async rollback(){if(!this.connection)throw new Error("No active transaction");await this.connection.rollback(),this.connection.release(),this.connection=null}async raw(t,e=[]){if(!this.pool)throw new Error("Database not connected");const[i]=await this.pool.execute(t,e);return i}buildWhereCondition(t,e){const i=`\`${t.column}\``;switch(t.operator){case"IN":const r=t.value.map(()=>"?").join(", ");return e.push(...t.value),`${i} IN (${r})`;case"NOT IN":const s=t.value.map(()=>"?").join(", ");return e.push(...t.value),`${i} NOT IN (${s})`;case"BETWEEN":return e.push(t.value[0],t.value[1]),`${i} BETWEEN ? AND ?`;case"IS NULL":return`${i} IS NULL`;case"IS NOT NULL":return`${i} IS NOT NULL`;default:return e.push(t.value),`${i} ${t.operator} ?`}}mapType(t,e){return{string:e?`VARCHAR(${e})`:"VARCHAR(255)",text:"TEXT",integer:"INT",bigInteger:"BIGINT",float:"FLOAT",double:"DOUBLE",decimal:"DECIMAL(10,2)",boolean:"TINYINT(1)",date:"DATE",datetime:"DATETIME",timestamp:"TIMESTAMP",json:"JSON",uuid:"CHAR(36)"}[t]||t.toUpperCase()}formatValue(t){return null===t?"NULL":"string"==typeof t?`'${t.replace(/'/g,"''")}'`:"boolean"==typeof t?t?"1":"0":t instanceof Date?`'${t.toISOString().slice(0,19).replace("T"," ")}'`:String(t)}}class PostgresAdapter{pool=null;client=null;async connect(t){var e,i;const{Pool:r}=(0,dynamicRequire.dynamicRequire)("pg");return this.pool=new r({host:t.host,port:t.port,database:t.database,user:t.username,password:t.password,ssl:t.ssl,min:(null===(e=t.pool)||void 0===e?void 0:e.min)||2,max:(null===(i=t.pool)||void 0===i?void 0:i.max)||10}),{query:this.query.bind(this),execute:this.execute.bind(this),close:this.disconnect.bind(this)}}async disconnect(){this.pool&&(await this.pool.end(),this.pool=null)}async query(t,e){if(!this.pool)throw new Error("Database not connected");return(await this.pool.query(t,e)).rows}async execute(t,e){if(!this.pool)throw new Error("Database not connected");return await this.pool.query(t,e)}async createTable(t,e){const i=`CREATE TABLE IF NOT EXISTS "${t}" (${e.map(t=>{let e=`"${t.name}" ${this.mapType(t.type,t.length)}`;return t.primary&&(e+=" PRIMARY KEY"),t.autoIncrement&&(e+=" GENERATED ALWAYS AS IDENTITY"),t.nullable||(e+=" NOT NULL"),t.unique&&(e+=" UNIQUE"),void 0!==t.default&&(e+=` DEFAULT ${this.formatValue(t.default)}`),e}).join(", ")})`;await this.execute(i)}async dropTable(t){await this.execute(`DROP TABLE IF EXISTS "${t}"`)}async hasTable(t){var e;return(null===(e=(await this.query("SELECT EXISTS (\n SELECT FROM information_schema.tables \n WHERE table_schema = 'public' \n AND table_name = $1\n )",[t]))[0])||void 0===e?void 0:e.exists)||!1}async hasColumn(t,e){var i;return(null===(i=(await this.query("SELECT EXISTS (\n SELECT FROM information_schema.columns \n WHERE table_schema = 'public' \n AND table_name = $1 \n AND column_name = $2\n )",[t,e]))[0])||void 0===i?void 0:i.exists)||!1}async select(t,e){var i;let r=`SELECT ${(null===(i=e.columns)||void 0===i?void 0:i.join(", "))||"*"} FROM "${t}"`;const s=[];let n=1;if(e.joins&&e.joins.length>0)for(const t of e.joins)r+=` ${t.type} JOIN "${t.table}" ON ${t.first} ${t.operator} ${t.second}`;return e.where&&e.where.length>0&&(r+=" "+e.where.map((t,e)=>{const i=0===e?"WHERE":t.boolean,r=this.buildWhereCondition(t,s,n);return n=s.length+1,`${i} ${r}`}).join(" ")),e.orderBy&&e.orderBy.length>0&&(r+=` ORDER BY ${e.orderBy.map(t=>`"${t.column}" ${t.direction}`).join(", ")}`),e.limit&&(r+=" LIMIT $"+n++,s.push(e.limit)),e.offset&&(r+=" OFFSET $"+n++,s.push(e.offset)),await this.query(r,s)}async insert(t,e){const i=Object.keys(e),r=Object.values(e),s=r.map((t,e)=>`$${e+1}`).join(", "),n=`INSERT INTO "${t}" (${i.map(t=>`"${t}"`).join(", ")}) \n VALUES (${s}) \n RETURNING *`;return(await this.query(n,r))[0]}async update(t,e,i){const r=Object.keys(i),s=Object.values(i),n=`UPDATE "${t}" SET ${r.map((t,e)=>`"${t}" = $${e+1}`).join(", ")} WHERE id = $${r.length+1} RETURNING *`;return(await this.query(n,[...s,e]))[0]}async delete(t,e){const i=`DELETE FROM "${t}" WHERE id = $1`;return(await this.execute(i,[e])).rowCount>0}async beginTransaction(){if(!this.pool)throw new Error("Database not connected");this.client=await this.pool.connect(),await this.client.query("BEGIN")}async commit(){if(!this.client)throw new Error("No active transaction");await this.client.query("COMMIT"),this.client.release(),this.client=null}async rollback(){if(!this.client)throw new Error("No active transaction");await this.client.query("ROLLBACK"),this.client.release(),this.client=null}async raw(t,e=[]){if(!this.pool)throw new Error("Database not connected");return(await this.pool.query(t,e)).rows}buildWhereCondition(t,e,i){const r=`"${t.column}"`;switch(t.operator){case"IN":const s=t.value.map((t,e)=>`$${i+e}`).join(", ");return e.push(...t.value),`${r} IN (${s})`;case"NOT IN":const n=t.value.map((t,e)=>`$${i+e}`).join(", ");return e.push(...t.value),`${r} NOT IN (${n})`;case"BETWEEN":return e.push(t.value[0],t.value[1]),`${r} BETWEEN $${i} AND $${i+1}`;case"IS NULL":return`${r} IS NULL`;case"IS NOT NULL":return`${r} IS NOT NULL`;default:return e.push(t.value),`${r} ${t.operator} $${i}`}}mapType(t,e){return{string:e?`VARCHAR(${e})`:"VARCHAR(255)",text:"TEXT",integer:"INTEGER",bigInteger:"BIGINT",float:"REAL",double:"DOUBLE PRECISION",decimal:"DECIMAL",boolean:"BOOLEAN",date:"DATE",datetime:"TIMESTAMP",timestamp:"TIMESTAMP",json:"JSONB",uuid:"UUID"}[t]||t.toUpperCase()}formatValue(t){return null===t?"NULL":"string"==typeof t?`'${t.replace(/'/g,"''")}'`:"boolean"==typeof t?t?"TRUE":"FALSE":t instanceof Date?`'${t.toISOString()}'`:String(t)}}class Macroable{static macros={};static macro(t,e){this.macros[t]=e,this.prototype[t]=e}static mixin(t){Object.keys(t).forEach(e=>{this.macro(e,t[e])})}static hasMacro(t){return!!this.macros[t]}}class QueryBuilder extends Macroable{selectColumns=["*"];whereClauses=[];orderByClauses=[];joinClauses=[];constructor(t,e){super(),this.tableName=t,this.adapter=e}select(...t){return this.selectColumns=t,this}where(t,e,i){return void 0===i&&(i=e,e="="),this.whereClauses.push({column:t,operator:e,value:i,boolean:"AND"}),this}orWhere(t,e,i){return void 0===i&&(i=e,e="="),this.whereClauses.push({column:t,operator:e,value:i,boolean:"OR"}),this}whereIn(t,e){return this.whereClauses.push({column:t,operator:"IN",value:e,boolean:"AND"}),this}whereNotIn(t,e){return this.whereClauses.push({column:t,operator:"NOT IN",value:e,boolean:"AND"}),this}whereBetween(t,e){return this.whereClauses.push({column:t,operator:"BETWEEN",value:e,boolean:"AND"}),this}whereNull(t){return this.whereClauses.push({column:t,operator:"IS NULL",value:null,boolean:"AND"}),this}whereNotNull(t){return this.whereClauses.push({column:t,operator:"IS NOT NULL",value:null,boolean:"AND"}),this}orderBy(t,e="ASC"){return this.orderByClauses.push({column:t,direction:e.toUpperCase()}),this}limit(t){return this.limitValue=t,this}offset(t){return this.offsetValue=t,this}join(t,e,i,r,s="INNER"){return this.joinClauses.push({type:s,table:t,first:e,operator:i,second:r}),this}leftJoin(t,e,i,r){return this.join(t,e,i,r,"LEFT")}rightJoin(t,e,i,r){return this.join(t,e,i,r,"RIGHT")}eagerLoads=[];setModel(t){return this.model=t,this}with(t){return Array.isArray(t)?this.eagerLoads.push(...t):this.eagerLoads.push(t),this}async get(){const t={columns:this.selectColumns,where:this.whereClauses,orderBy:this.orderByClauses,limit:this.limitValue,offset:this.offsetValue,joins:this.joinClauses},e=await this.adapter.select(this.tableName,t);return this.eagerLoads.length>0&&this.model?await this.eagerLoadRelations(e):e}async eagerLoadRelations(t){if(0===t.length)return t;const e=t.map(t=>this.model.hydrate(t));for(const t of this.eagerLoads){const i=new this.model;if("function"!=typeof i[t])throw new Error(`Relation ${t} does not exist on ${this.model.name}`);const r=i[t]();r.addEagerConstraints(e);const s=await r.get();r.match(e,s,t)}return e}async first(){return this.limit(1),(await this.get())[0]||null}async find(t){return this.where("id",t).first()}async count(){this.selectColumns=["COUNT(*) as count"];const t=await this.first();return t?t.count:0}async pluck(t){return this.select(t),(await this.get()).map(e=>e[t])}async sum(t){this.selectColumns=[`SUM(${t}) as sum`];const e=await this.first();return e&&e.sum||0}async avg(t){this.selectColumns=[`AVG(${t}) as avg`];const e=await this.first();return e&&e.avg||0}async min(t){this.selectColumns=[`MIN(${t}) as min`];const e=await this.first();return e?e.min:null}async max(t){this.selectColumns=[`MAX(${t}) as max`];const e=await this.first();return e?e.max:null}async exists(){return await this.count()>0}async paginate(t=1,e=15){const i=await this.count(),r=(t-1)*e;return this.limit(e).offset(r),{data:await this.get(),total:i,perPage:e,currentPage:t,lastPage:Math.ceil(i/e)}}clone(){const t=new QueryBuilder(this.tableName,this.adapter);return t.selectColumns=[...this.selectColumns],t.whereClauses=[...this.whereClauses],t.orderByClauses=[...this.orderByClauses],t.joinClauses=[...this.joinClauses],t.limitValue=this.limitValue,t.offsetValue=this.offsetValue,t}}class Relation{constructor(t,e){this.query=t,this.parent=e,this.related=t.model,this.addConstraints()}getQuery(){return this.query}async get(){return this.query.get()}async first(){return this.query.first()}}class BelongsTo extends Relation{constructor(t,e,i,r){super(t,e),this.foreignKey=i,this.ownerKey=r}addConstraints(){const t=this.parent.getAttribute(this.foreignKey);this.query.where(this.ownerKey,"=",t)}addEagerConstraints(t){const e=t.map(t=>t.getAttribute(this.foreignKey)).filter(t=>null!==t);this.query.whereIn(this.ownerKey,e)}match(t,e,i){const r={};return e.forEach(t=>{const e=t.getAttribute(this.ownerKey);r[e]=t}),t.forEach(t=>{const e=t.getAttribute(this.foreignKey);r[e]&&t.setRelation(i,r[e])}),t}}class BelongsToMany extends Relation{constructor(t,e,i,r,s,n,a){super(t,e),this.table=i,this.foreignPivotKey=r,this.relatedPivotKey=s,this.parentKey=n,this.relatedKey=a}addConstraints(){this.performJoin(),this.query.where(`${this.table}.${this.foreignPivotKey}`,"=",this.parent.getAttribute(this.parentKey))}performJoin(t){const e=t||this.query,i=this.related.prototype.getTable();return e.join(this.table,`${i}.${this.relatedKey}`,"=",`${this.table}.${this.relatedPivotKey}`),this}addEagerConstraints(t){this.performJoin();const e=t.map(t=>t.getAttribute(this.parentKey)).filter(t=>null!==t);this.query.whereIn(`${this.table}.${this.foreignPivotKey}`,e)}match(t,e,i){return t}}class HasMany extends Relation{constructor(t,e,i,r){super(t,e),this.foreignKey=i,this.localKey=r}addConstraints(){const t=this.parent.getAttribute(this.localKey);this.query.where(this.foreignKey,"=",t)}addEagerConstraints(t){const e=t.map(t=>t.getAttribute(this.localKey)).filter(t=>null!==t);this.query.whereIn(this.foreignKey,e)}match(t,e,i){const r={};return e.forEach(t=>{const e=t.getAttribute(this.foreignKey);r[e]||(r[e]=[]),r[e].push(t)}),t.forEach(t=>{const e=t.getAttribute(this.localKey);r[e]?t.setRelation(i,r[e]):t.setRelation(i,[])}),t}}class HasOne extends Relation{constructor(t,e,i,r){super(t,e),this.foreignKey=i,this.localKey=r}addConstraints(){const t=this.parent.getAttribute(this.localKey);this.query.where(this.foreignKey,"=",t)}addEagerConstraints(t){const e=t.map(t=>t.getAttribute(this.localKey)).filter(t=>null!==t);this.query.whereIn(this.foreignKey,e)}match(t,e,i){const r={};return e.forEach(t=>{const e=t.getAttribute(this.foreignKey);r[e]=t}),t.forEach(t=>{const e=t.getAttribute(this.localKey);r[e]&&t.setRelation(i,r[e])}),t}}class Model extends Macroable{static primaryKey="id";static connection="default";attributes={};original={};relations={};exists=!1;fillable=[];guarded=["id"];hidden=[];visible=[];casts={};dates=[];timestamps=!0;createdAt="created_at";updatedAt="updated_at";softDeletes=!1;deletedAt="deleted_at";static setAdapter(t){this.adapter=t}static getTable(){if(this.tableName)return this.tableName;const t=this.name;return this.pluralize(this.snakeCase(t))}static query(){return new QueryBuilder(this.getTable(),this.adapter)}static async all(){return(await this.query().get()).map(t=>this.hydrate(t))}static async find(t){const e=await this.query().where(this.primaryKey,t).first();return e?this.hydrate(e):null}static async findOrFail(t){const e=await this.find(t);if(!e)throw new Error(`Model not found with ${this.primaryKey}: ${t}`);return e}static where(t,e,i){return this.query().where(t,e,i)}static async create(t){const e=new this;if(e.fill(t),e.timestamps){const t=new Date;e.attributes[e.createdAt]=t,e.attributes[e.updatedAt]=t}const i=await this.adapter.insert(this.getTable(),e.attributes),r=i[this.primaryKey]||i.id||i.insertId;return e.attributes[this.primaryKey]=r,"id"!==this.primaryKey&&(e.attributes.id=r),e.exists=!0,e.syncOriginal(),e}static async update(t,e){const i=await this.findOrFail(t);return await i.update(e),i}static async destroy(t){const e=await this.find(t);return!!e&&await e.delete()}static async firstOrCreate(t,e={}){const i=this.query();for(const[e,r]of Object.entries(t))i.where(e,r);const r=await i.first();return r?this.hydrate(r):await this.create({...t,...e})}static async updateOrCreate(t,e={}){const i=this.query();for(const[e,r]of Object.entries(t))i.where(e,r);const r=await i.first();if(r){const t=this.hydrate(r);return await t.update(e),t}return await this.create({...t,...e})}static hydrate(t){const e=new this;return e.attributes={...t},e.original={...t},e.exists=!0,e}fill(t){for(const[e,i]of Object.entries(t))this.isFillable(e)&&this.setAttribute(e,i);return this}isFillable(t){return this.fillable.length>0?this.fillable.includes(t):!this.guarded.includes(t)}setAttribute(t,e){const i=`set${this.studly(t)}Attribute`;"function"==typeof this[i]&&(e=this[i](e)),this.attributes[t]=this.castAttribute(t,e)}getAttribute(t){const e=`get${this.studly(t)}Attribute`;if("function"==typeof this[e])return this[e]();const i=this.attributes[t];return this.castAttribute(t,i,!0)}castAttribute(t,e,i=!1){if(null==e)return e;const r=this.casts[t];if(!r)return e;if(i)switch(r){case"int":case"integer":return parseInt(e);case"float":case"double":return parseFloat(e);case"string":return String(e);case"bool":case"boolean":return Boolean(e);case"array":case"json":return"string"==typeof e?JSON.parse(e):e;case"date":case"datetime":return e instanceof Date?e:new Date(e);default:return e}else switch(r){case"array":case"json":return"object"==typeof e?JSON.stringify(e):e;case"date":case"datetime":return e instanceof Date?e:new Date(e);default:return e}}async save(){const t=this.constructor;if(this.timestamps){const t=new Date;this.exists||(this.attributes[this.createdAt]=t),this.attributes[this.updatedAt]=t}if(this.exists){const e=this.attributes[t.primaryKey];await t.adapter.update(t.getTable(),e,this.attributes)}else{const e=await t.adapter.insert(t.getTable(),this.attributes),i=e[t.primaryKey]||e.id||e.insertId;this.attributes[t.primaryKey]=i,"id"!==t.primaryKey&&(this.attributes.id=i),this.exists=!0}return this.syncOriginal(),this}async update(t){return this.fill(t),await this.save()}async delete(){const t=this.constructor;if(this.softDeletes)return this.attributes[this.deletedAt]=new Date,await this.save(),!0;const e=this.attributes[t.primaryKey];return await t.adapter.delete(t.getTable(),e)}async forceDelete(){const t=this.constructor,e=this.attributes[t.primaryKey];return await t.adapter.delete(t.getTable(),e)}async restore(){return this.softDeletes&&(this.attributes[this.deletedAt]=null,await this.save()),this}syncOriginal(){this.original={...this.attributes}}getDirty(){const t={};for(const[e,i]of Object.entries(this.attributes))this.original[e]!==i&&(t[e]=i);return t}isDirty(){return Object.keys(this.getDirty()).length>0}constructor(t={}){super(),this.fill(t)}toJSON(){const t={};for(const[e,i]of Object.entries(this.attributes))this.hidden.includes(e)||this.visible.length>0&&!this.visible.includes(e)||(t[e]=this.getAttribute(e));for(const[e,i]of Object.entries(this.relations))t[e]=i;return t}hasOne(t,e,i){const r=new t,s=e||`${this.constructor.name.toLowerCase()}_id`,n=i||"id";return new HasOne(r.newQuery(),this,s,n)}hasMany(t,e,i){const r=new t,s=e||`${this.constructor.name.toLowerCase()}_id`,n=i||"id";return new HasMany(r.newQuery(),this,s,n)}belongsTo(t,e,i){const r=new t,s=e||`${r.constructor.name.toLowerCase()}_id`,n=i||"id";return new BelongsTo(r.newQuery(),this,s,n)}belongsToMany(t,e,i,r,s,n){const a=new t,o=e||this.guessPivotTable(a),c=i||`${this.constructor.name.toLowerCase()}_id`,l=r||`${a.constructor.name.toLowerCase()}_id`,u=s||"id",h=n||"id";return new BelongsToMany(a.newQuery(),this,o,c,l,u,h)}guessPivotTable(t){const e=[this.constructor.name.toLowerCase(),t.constructor.name.toLowerCase()];return e.sort(),e.join("_")}static with(t){return this.query().with(t)}setRelation(t,e){return this.relations[t]=e,this}getRelation(t){return this.relations[t]}relationLoaded(t){return void 0!==this.relations[t]}newQuery(){return this.constructor.query()}static snakeCase(t){return t.replace(/([A-Z])/g,"_$1").toLowerCase().replace(/^_/,"")}static pluralize(t){return t.endsWith("y")?t.slice(0,-1)+"ies":t.endsWith("s")?t+"es":t+"s"}studly(t){return t.replace(/(^|_)(\w)/g,(t,e,i)=>i.toUpperCase())}}QueryBuilder.macro("populate",async function(t,e){const i=(await this.adapter.raw("db")).collection(this.tableName),r=(null==e?void 0:e.from)||`${t}s`,s=(null==e?void 0:e.localField)||`${t}_id`,n=(null==e?void 0:e.foreignField)||"_id",a=(null==e?void 0:e.as)||t,o=[];if(this.whereClauses&&this.whereClauses.length>0){var c,l;const t=(null===(c=(l=this.adapter).buildFilter)||void 0===c?void 0:c.call(l,this.whereClauses))||{};Object.keys(t).length>0&&o.push({$match:t})}if(null!=e&&e.select&&e.select.length>0){const t={};e.select.forEach(e=>{t[e]=1}),o.push({$lookup:{from:r,let:{localId:`$${s}`},pipeline:[{$match:{$expr:{$eq:[`$${n}`,"$$localId"]}}},{$project:t}],as:a}})}else o.push({$lookup:{from:r,localField:s,foreignField:n,as:a}});return o.push({$unwind:{path:`$${a}`,preserveNullAndEmptyArrays:!0}}),this.limitValue&&o.push({$limit:this.limitValue}),(await i.aggregate(o).toArray()).map(t=>{const{_id:e,...i}=t;return{id:e,_id:e,...i}})}),QueryBuilder.macro("exec",async function(){return await this.get()}),QueryBuilder.macro("aggregate",async function(t){const e=(await this.adapter.raw("db")).collection(this.tableName);return(await e.aggregate(t).toArray()).map(t=>{if(t._id){const{_id:e,...i}=t;return{id:e,_id:e,...i}}return t})});class ColumnBuilder{constructor(t,e,i){this.definition={name:t,type:e,length:i,nullable:!1}}nullable(){return this.definition.nullable=!0,this}default(t){return this.definition.default=t,this}unique(){return this.definition.unique=!0,this}primary(){return this.definition.primary=!0,this}autoIncrement(){return this.definition.autoIncrement=!0,this}unsigned(){return this.definition.unsigned=!0,this}getDefinition(){return this.definition}}class ForeignKeyBuilder{constructor(t){this.column=t}references(t){return this.referencedColumn=t,this}on(t){return this.referencedTable=t,this}onDelete(t){return this.onDeleteAction=t,this}onUpdate(t){return this.onUpdateAction=t,this}toSQL(){if(!this.referencedTable||!this.referencedColumn)throw new Error("Foreign key must reference a table and column");let t=`FOREIGN KEY (${this.column}) REFERENCES ${this.referencedTable}(${this.referencedColumn})`;return this.onDeleteAction&&(t+=` ON DELETE ${this.onDeleteAction}`),this.onUpdateAction&&(t+=` ON UPDATE ${this.onUpdateAction}`),t}}class Blueprint{columns=[];indexes=[];foreignKeys=[];primaryKeys=[];constructor(t){this.tableName=t}id(t="id"){const e=new ColumnBuilder(t,"bigInteger");return e.primary().autoIncrement().unsigned(),this.columns.push(e.getDefinition()),e}uuid(t="id"){const e=new ColumnBuilder(t,"uuid");return this.columns.push(e.getDefinition()),e}string(t,e=255){const i=new ColumnBuilder(t,"string",e);return this.columns.push(i.getDefinition()),i}text(t){const e=new ColumnBuilder(t,"text");return this.columns.push(e.getDefinition()),e}integer(t){const e=new ColumnBuilder(t,"integer");return this.columns.push(e.getDefinition()),e}bigInteger(t){const e=new ColumnBuilder(t,"bigInteger");return this.columns.push(e.getDefinition()),e}decimal(t,e=10,i=2){const r=new ColumnBuilder(t,"decimal");return this.columns.push(r.getDefinition()),r}float(t){const e=new ColumnBuilder(t,"float");return this.columns.push(e.getDefinition()),e}double(t){const e=new ColumnBuilder(t,"double");return this.columns.push(e.getDefinition()),e}boolean(t){const e=new ColumnBuilder(t,"boolean");return this.columns.push(e.getDefinition()),e}date(t){const e=new ColumnBuilder(t,"date");return this.columns.push(e.getDefinition()),e}datetime(t){const e=new ColumnBuilder(t,"datetime");return this.columns.push(e.getDefinition()),e}timestamp(t){const e=new ColumnBuilder(t,"timestamp");return this.columns.push(e.getDefinition()),e}timestamps(){this.timestamp("created_at").nullable(),this.timestamp("updated_at").nullable()}softDeletes(t="deleted_at"){return this.timestamp(t).nullable()}json(t){const e=new ColumnBuilder(t,"json");return this.columns.push(e.getDefinition()),e}enum(t,e){const i=new ColumnBuilder(t,"enum");return this.columns.push(i.getDefinition()),i}foreign(t){const e=new ForeignKeyBuilder(t);return this.foreignKeys.push(e),e}index(t,e){const i=Array.isArray(t)?t:[t];this.indexes.push({columns:i,unique:!1,name:e})}unique(t,e){const i=Array.isArray(t)?t:[t];this.indexes.push({columns:i,unique:!0,name:e})}primary(t){this.primaryKeys=Array.isArray(t)?t:[t]}getColumns(){return this.columns}getTableName(){return this.tableName}getIndexes(){return this.indexes}getForeignKeys(){return this.foreignKeys}}class Schema{static setAdapter(t){this.adapter=t}static async create(t,e){const i=new Blueprint(t);e(i),await this.adapter.createTable(t,i.getColumns())}static async table(t,e){e(new Blueprint(t)),console.warn("Schema.table() is not fully implemented yet. Use migrations for complex alterations.")}static async drop(t){await this.adapter.dropTable(t)}static async dropIfExists(t){await this.hasTable(t)&&await this.drop(t)}static async rename(t,e){throw new Error("Schema.rename() not yet implemented")}static async hasTable(t){return await this.adapter.hasTable(t)}static async hasColumn(t,e){return await this.adapter.hasColumn(t,e)}static async getTables(){throw new Error("Schema.getTables() not yet implemented")}static async getColumns(t){throw new Error("Schema.getColumns() not yet implemented")}}class Migration{}class MigrationRunner{migrationsTable="migrations";constructor(t,e){this.adapter=t,this.migrationsPath=e}async ensureMigrationsTable(){await Schema.hasTable(this.migrationsTable)||await Schema.create(this.migrationsTable,t=>{t.id(),t.string("migration"),t.integer("batch"),t.timestamp("created_at").nullable()})}async getRanMigrations(){return await this.ensureMigrationsTable(),await this.adapter.select(this.migrationsTable,{orderBy:[{column:"batch",direction:"ASC"}]})}async getPendingMigrations(){const t=await Promise.resolve().then(__webpack_require__.t.bind(__webpack_require__,896,23)),e=(await Promise.resolve().then(__webpack_require__.t.bind(__webpack_require__,928,23)),(await this.getRanMigrations()).map(t=>t.migration));return t.readdirSync(this.migrationsPath).filter(t=>t.endsWith(".ts")||t.endsWith(".js")).filter(t=>!e.includes(t.replace(/\.(ts|js)$/,""))).sort()}async run(){const t=await Promise.resolve().then(__webpack_require__.t.bind(__webpack_require__,928,23)),e=await this.getPendingMigrations();if(0===e.length)return void console.log("No pending migrations");const i=await this.getRanMigrations(),r=i.length>0?Math.max(...i.map(t=>t.batch))+1:1;console.log(`Running ${e.length} migration(s)...`);for(const i of e){const e=t.resolve(this.migrationsPath,i),s=i.replace(/\.(ts|js)$/,"");try{const t=new(await this.loadMigration(e));console.log(`Migrating: ${s}`),await t.up(),await this.adapter.insert(this.migrationsTable,{migration:s,batch:r,created_at:new Date}),console.log(`Migrated: ${s}`)}catch(t){throw console.error(`Failed to migrate ${s}:`,t),t}}console.log("Migrations completed successfully")}async rollback(t=1){const e=await this.getRanMigrations();if(0===e.length)return void console.log("No migrations to rollback");const i=Math.max(...e.map(t=>t.batch)),r=i-t+1,s=e.filter(t=>t.batch>=r&&t.batch<=i).reverse();console.log(`Rolling back ${s.length} migration(s)...`);const n=await Promise.resolve().then(__webpack_require__.t.bind(__webpack_require__,928,23));for(const t of s){const e=n.resolve(this.migrationsPath,`${t.migration}.ts`);try{const i=new(await this.loadMigration(e));console.log(`Rolling back: ${t.migration}`),await i.down(),await this.adapter.delete(this.migrationsTable,t.id),console.log(`Rolled back: ${t.migration}`)}catch(e){throw console.error(`Failed to rollback ${t.migration}:`,e),e}}console.log("Rollback completed successfully")}async reset(){const t=await this.getRanMigrations(),e=Math.max(...t.map(t=>t.batch));await this.rollback(e)}async fresh(){await this.reset(),await this.run()}async status(){return(await this.getRanMigrations()).map(t=>({name:t.migration,batch:t.batch,ranAt:t.created_at||new Date}))}async loadMigration(t){const e=(0,dynamicRequire.dynamicRequire)(t),i=e.default||e;if(!i||"function"!=typeof i)throw new Error(`Migration file ${t} does not export a valid migration class`);const r=new i;if("function"!=typeof r.up||"function"!=typeof r.down)throw new Error(`Migration class in ${t} must implement up() and down() methods`);return i}}class Factory{constructor(){this.faker=__webpack_require__(941).faker}make(t={}){const e=new this.model,i={...this.definition(),...t};return e.fill(i),e}async create(t={}){const e=this.make(t);return await e.save(),e}async createMany(t,e={}){const i=[];for(let r=0;r<t;r++)i.push(await this.create(e));return i}}class Seeder{async call(t){const e=new t;await e.run()}}var __webpack_export_target__=exports;for(var __webpack_i__ in __webpack_exports__)__webpack_export_target__[__webpack_i__]=__webpack_exports__[__webpack_i__];__webpack_exports__.__esModule&&Object.defineProperty(__webpack_export_target__,"__esModule",{value:!0})})();
2
+ //# sourceMappingURL=arcanox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arcanox.js","mappings":"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","sources":["webpack://arcanajs/./src/lib/server/utils/dynamicRequire.ts","webpack://arcanajs/external node-commonjs \"fs\"","webpack://arcanajs/external node-commonjs \"path\"","webpack://arcanajs/external commonjs \"@faker-js/faker\"","webpack://arcanajs/webpack/bootstrap","webpack://arcanajs/webpack/runtime/create fake namespace object","webpack://arcanajs/webpack/runtime/define property getters","webpack://arcanajs/webpack/runtime/hasOwnProperty shorthand","webpack://arcanajs/webpack/runtime/make namespace object","webpack://arcanajs/./src/lib/arcanox/adapters/MongoAdapter.ts","webpack://arcanajs/./src/lib/arcanox/adapters/MySQLAdapter.ts","webpack://arcanajs/./src/lib/arcanox/adapters/PostgresAdapter.ts","webpack://arcanajs/./src/lib/arcanox/support/Macroable.ts","webpack://arcanajs/./src/lib/arcanox/QueryBuilder.ts","webpack://arcanajs/./src/lib/arcanox/relations/Relation.ts","webpack://arcanajs/./src/lib/arcanox/relations/BelongsTo.ts","webpack://arcanajs/./src/lib/arcanox/relations/BelongsToMany.ts","webpack://arcanajs/./src/lib/arcanox/relations/HasMany.ts","webpack://arcanajs/./src/lib/arcanox/relations/HasOne.ts","webpack://arcanajs/./src/lib/arcanox/Model.ts","webpack://arcanajs/./src/lib/arcanox/extensions/MongoExtensions.ts","webpack://arcanajs/./src/lib/arcanox/schema/Blueprint.ts","webpack://arcanajs/./src/lib/arcanox/schema/Schema.ts","webpack://arcanajs/./src/lib/arcanox/schema/Migration.ts","webpack://arcanajs/./src/lib/arcanox/factory/Factory.ts","webpack://arcanajs/./src/lib/arcanox/seeder/Seeder.ts"],"sourcesContent":["/**\n * Helper to dynamically require modules at runtime, bypassing Webpack bundling.\n * This is necessary for loading user configuration files, migrations, and views\n * that are not part of the framework bundle but exist in the user's project.\n */\nexport const dynamicRequire = (id: string) => {\n if (typeof __non_webpack_require__ !== \"undefined\") {\n return __non_webpack_require__(id);\n }\n // Fallback for non-webpack environments (e.g. direct node execution)\n // We use eval to prevent Webpack from seeing this as a dependency\n return eval(\"require\")(id);\n};\n","module.exports = require(\"fs\");","module.exports = require(\"path\");","module.exports = require(\"@faker-js/faker\");","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","var getProto = Object.getPrototypeOf ? (obj) => (Object.getPrototypeOf(obj)) : (obj) => (obj.__proto__);\nvar leafPrototypes;\n// create a fake namespace object\n// mode & 1: value is a module id, require it\n// mode & 2: merge all properties of value into the ns\n// mode & 4: return value when already ns object\n// mode & 16: return value when it's Promise-like\n// mode & 8|1: behave like require\n__webpack_require__.t = function(value, mode) {\n\tif(mode & 1) value = this(value);\n\tif(mode & 8) return value;\n\tif(typeof value === 'object' && value) {\n\t\tif((mode & 4) && value.__esModule) return value;\n\t\tif((mode & 16) && typeof value.then === 'function') return value;\n\t}\n\tvar ns = Object.create(null);\n\t__webpack_require__.r(ns);\n\tvar def = {};\n\tleafPrototypes = leafPrototypes || [null, getProto({}), getProto([]), getProto(getProto)];\n\tfor(var current = mode & 2 && value; (typeof current == 'object' || typeof current == 'function') && !~leafPrototypes.indexOf(current); current = getProto(current)) {\n\t\tObject.getOwnPropertyNames(current).forEach((key) => (def[key] = () => (value[key])));\n\t}\n\tdef['default'] = () => (value);\n\t__webpack_require__.d(ns, def);\n\treturn ns;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import type { Db, MongoClient } from \"mongodb\";\nimport { dynamicRequire } from \"../../server/utils/dynamicRequire\";\nimport {\n ColumnDefinition,\n Connection,\n DatabaseAdapter,\n DatabaseConfig,\n SelectOptions,\n WhereClause,\n} from \"../types\";\n\nexport class MongoAdapter implements DatabaseAdapter {\n private client: MongoClient | null = null;\n private db: Db | null = null;\n\n async connect(config: DatabaseConfig): Promise<Connection> {\n const { MongoClient } = dynamicRequire(\"mongodb\");\n const url = `mongodb://${config.host}:${config.port}`;\n this.client = new MongoClient(url, {\n auth:\n config.username && config.password\n ? {\n username: config.username,\n password: config.password,\n }\n : undefined,\n });\n\n await this.client!.connect();\n this.db = this.client!.db(config.database);\n\n return {\n query: async (sql: string, params?: any[]) => {\n throw new Error(\"Raw SQL queries are not supported in MongoDB adapter\");\n },\n execute: async (sql: string, params?: any[]) => {\n throw new Error(\n \"Raw SQL execution is not supported in MongoDB adapter\"\n );\n },\n close: async () => {\n await this.disconnect();\n },\n };\n }\n\n async disconnect(): Promise<void> {\n if (this.client) {\n await this.client.close();\n this.client = null;\n this.db = null;\n }\n }\n\n // Schema operations\n async createTable(\n tableName: string,\n columns: ColumnDefinition[]\n ): Promise<void> {\n if (!this.db) throw new Error(\"Database not connected\");\n // MongoDB creates collections automatically, but we can create it explicitly\n // to apply validation rules if needed (not implemented here for simplicity)\n await this.db.createCollection(tableName);\n }\n\n async dropTable(tableName: string): Promise<void> {\n if (!this.db) throw new Error(\"Database not connected\");\n await this.db.collection(tableName).drop();\n }\n\n async hasTable(tableName: string): Promise<boolean> {\n if (!this.db) throw new Error(\"Database not connected\");\n const collections = await this.db\n .listCollections({ name: tableName })\n .toArray();\n return collections.length > 0;\n }\n\n async hasColumn(tableName: string, columnName: string): Promise<boolean> {\n // MongoDB is schemaless, so this is always true effectively,\n // or we could check if any document has this field.\n return true;\n }\n\n // Query operations\n async select(table: string, options: SelectOptions): Promise<any[]> {\n if (!this.db) throw new Error(\"Database not connected\");\n\n const collection = this.db.collection(table);\n const filter = this.buildFilter(options.where || []);\n const projection = this.buildProjection(options.columns);\n\n let cursor = collection.find(filter);\n\n if (projection) {\n cursor = cursor.project(projection);\n }\n\n if (options.orderBy) {\n const sort: any = {};\n options.orderBy.forEach((order) => {\n sort[order.column] = order.direction === \"ASC\" ? 1 : -1;\n });\n cursor = cursor.sort(sort);\n }\n\n if (options.offset) {\n cursor = cursor.skip(options.offset);\n }\n\n if (options.limit) {\n cursor = cursor.limit(options.limit);\n }\n\n const results = await cursor.toArray();\n\n // Map _id to id but keep _id\n return results.map((doc) => {\n const { _id, ...rest } = doc;\n return { id: _id, _id, ...rest };\n });\n }\n\n async insert(table: string, data: Record<string, any>): Promise<any> {\n if (!this.db) throw new Error(\"Database not connected\");\n const collection = this.db.collection(table);\n\n // Remove id if present and let Mongo generate _id, or map id to _id\n const doc = { ...data };\n if (doc.id) {\n doc._id = doc.id;\n delete doc.id;\n }\n\n const result = await collection.insertOne(doc);\n\n return {\n id: result.insertedId,\n _id: result.insertedId,\n ...data,\n };\n }\n\n async update(\n table: string,\n id: any,\n data: Record<string, any>\n ): Promise<any> {\n if (!this.db) throw new Error(\"Database not connected\");\n const collection = this.db.collection(table);\n\n const filter = { _id: this.normalizeId(id) };\n const update = { $set: data };\n\n await collection.updateOne(filter, update);\n\n // Return updated document (requires another query or findOneAndUpdate)\n const updated = await collection.findOne(filter);\n if (updated) {\n const { _id, ...rest } = updated;\n return { id: _id, _id, ...rest };\n }\n return null;\n }\n\n async delete(table: string, id: any): Promise<boolean> {\n if (!this.db) throw new Error(\"Database not connected\");\n const collection = this.db.collection(table);\n const result = await collection.deleteOne({ _id: this.normalizeId(id) });\n return result.deletedCount === 1;\n }\n\n // Transaction support\n async beginTransaction(): Promise<void> {\n // MongoDB transactions require replica set\n // Placeholder implementation\n }\n\n async raw(query: string, params: any[] = []): Promise<any> {\n if (!this.db) {\n throw new Error(\"Database not connected\");\n }\n // For MongoDB, raw query might interpret the string as a command\n // or return the raw db object for advanced usage if query is \"db\"\n if (query === \"db\") return this.db;\n\n // Simple command execution\n return await this.db.command(JSON.parse(query));\n }\n\n async commit(): Promise<void> {\n //\n }\n\n async rollback(): Promise<void> {\n //\n }\n\n // Helpers\n private buildFilter(where: WhereClause[]): any {\n const filter: any = {};\n\n where.forEach((clause) => {\n const column = clause.column === \"id\" ? \"_id\" : clause.column;\n let value = clause.value;\n\n if (column === \"_id\") {\n value = this.normalizeId(value);\n }\n\n switch (clause.operator) {\n case \"=\":\n filter[column] = value;\n break;\n case \"!=\":\n filter[column] = { $ne: value };\n break;\n case \">\":\n filter[column] = { $gt: value };\n break;\n case \"<\":\n filter[column] = { $lt: value };\n break;\n case \">=\":\n filter[column] = { $gte: value };\n break;\n case \"<=\":\n filter[column] = { $lte: value };\n break;\n case \"IN\":\n filter[column] = { $in: Array.isArray(value) ? value : [value] };\n break;\n case \"NOT IN\":\n filter[column] = { $nin: Array.isArray(value) ? value : [value] };\n break;\n case \"LIKE\":\n // Simple regex for LIKE\n filter[column] = {\n $regex: new RegExp(value.replace(/%/g, \".*\"), \"i\"),\n };\n break;\n case \"IS NULL\":\n filter[column] = null;\n break;\n case \"IS NOT NULL\":\n filter[column] = { $ne: null };\n break;\n }\n });\n\n return filter;\n }\n\n private buildProjection(columns?: string[]): any {\n if (!columns || columns.length === 0 || columns.includes(\"*\")) {\n return null;\n }\n const projection: any = {};\n columns.forEach((col) => {\n if (col === \"id\") {\n // _id is included by default, no need to project it explicitly unless we want to exclude others\n // But if we select specific columns, we need to ensure _id is handled\n } else {\n projection[col] = 1;\n }\n });\n return projection;\n }\n\n private normalizeId(id: any): any {\n const { ObjectId } = dynamicRequire(\"mongodb\");\n if (id instanceof ObjectId) return id;\n if (typeof id === \"string\" && ObjectId.isValid(id)) {\n return new ObjectId(id);\n }\n return id;\n }\n}\n","import type {\n Pool,\n PoolConnection,\n ResultSetHeader,\n RowDataPacket,\n} from \"mysql2/promise\";\nimport { dynamicRequire } from \"../../server/utils/dynamicRequire\";\nimport type {\n ColumnDefinition,\n Connection,\n DatabaseAdapter,\n DatabaseConfig,\n SelectOptions,\n WhereClause,\n} from \"../types\";\n\n/**\n * MySQL Database Adapter\n */\nexport class MySQLAdapter implements DatabaseAdapter {\n private pool: Pool | null = null;\n private connection: PoolConnection | null = null;\n\n async connect(config: DatabaseConfig): Promise<Connection> {\n const mysql = dynamicRequire(\"mysql2/promise\");\n\n this.pool = mysql.createPool({\n host: config.host,\n port: config.port,\n database: config.database,\n user: config.username,\n password: config.password,\n waitForConnections: true,\n connectionLimit: config.pool?.max || 10,\n queueLimit: 0,\n });\n\n return {\n query: this.query.bind(this),\n execute: this.execute.bind(this),\n close: this.disconnect.bind(this),\n };\n }\n\n async disconnect(): Promise<void> {\n if (this.pool) {\n await this.pool.end();\n this.pool = null;\n }\n }\n\n async query(sql: string, params?: any[]): Promise<any> {\n if (!this.pool) throw new Error(\"Database not connected\");\n const [rows] = await this.pool.query<RowDataPacket[]>(sql, params);\n return rows;\n }\n\n async execute(sql: string, params?: any[]): Promise<any> {\n if (!this.pool) throw new Error(\"Database not connected\");\n const [result] = await this.pool.execute<ResultSetHeader>(sql, params);\n return result;\n }\n\n async createTable(\n tableName: string,\n columns: ColumnDefinition[]\n ): Promise<void> {\n const columnDefs = columns\n .map((col) => {\n let def = `\\`${col.name}\\` ${this.mapType(col.type, col.length)}`;\n\n if (col.unsigned) def += \" UNSIGNED\";\n if (col.autoIncrement) def += \" AUTO_INCREMENT\";\n if (!col.nullable) def += \" NOT NULL\";\n if (col.default !== undefined) {\n def += ` DEFAULT ${this.formatValue(col.default)}`;\n }\n if (col.primary) def += \" PRIMARY KEY\";\n if (col.unique) def += \" UNIQUE\";\n\n return def;\n })\n .join(\", \");\n\n const sql = `CREATE TABLE IF NOT EXISTS \\`${tableName}\\` (${columnDefs}) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci`;\n await this.execute(sql);\n }\n\n async dropTable(tableName: string): Promise<void> {\n await this.execute(`DROP TABLE IF EXISTS \\`${tableName}\\``);\n }\n\n async hasTable(tableName: string): Promise<boolean> {\n const result = await this.query(\n `SELECT COUNT(*) as count FROM information_schema.tables \n WHERE table_schema = DATABASE() AND table_name = ?`,\n [tableName]\n );\n return result[0]?.count > 0;\n }\n\n async hasColumn(tableName: string, columnName: string): Promise<boolean> {\n const result = await this.query(\n `SELECT COUNT(*) as count FROM information_schema.columns \n WHERE table_schema = DATABASE() AND table_name = ? AND column_name = ?`,\n [tableName, columnName]\n );\n return result[0]?.count > 0;\n }\n\n async select(table: string, options: SelectOptions): Promise<any[]> {\n const columns = options.columns?.join(\", \") || \"*\";\n let sql = `SELECT ${columns} FROM \\`${table}\\``;\n const params: any[] = [];\n\n // Joins\n if (options.joins && options.joins.length > 0) {\n for (const join of options.joins) {\n sql += ` ${join.type} JOIN \\`${join.table}\\` ON ${join.first} ${join.operator} ${join.second}`;\n }\n }\n\n // Where clauses\n if (options.where && options.where.length > 0) {\n const whereParts = options.where.map((clause, index) => {\n const boolean = index === 0 ? \"WHERE\" : clause.boolean;\n const condition = this.buildWhereCondition(clause, params);\n return `${boolean} ${condition}`;\n });\n sql += \" \" + whereParts.join(\" \");\n }\n\n // Order by\n if (options.orderBy && options.orderBy.length > 0) {\n const orderParts = options.orderBy.map(\n (o) => `\\`${o.column}\\` ${o.direction}`\n );\n sql += ` ORDER BY ${orderParts.join(\", \")}`;\n }\n\n // Limit and offset\n if (options.limit) {\n sql += ` LIMIT ?`;\n params.push(options.limit);\n }\n if (options.offset) {\n sql += ` OFFSET ?`;\n params.push(options.offset);\n }\n\n return await this.query(sql, params);\n }\n\n async insert(table: string, data: Record<string, any>): Promise<any> {\n const keys = Object.keys(data);\n const values = Object.values(data);\n const placeholders = values.map(() => \"?\").join(\", \");\n\n const sql = `INSERT INTO \\`${table}\\` (${keys\n .map((k) => `\\`${k}\\``)\n .join(\", \")}) VALUES (${placeholders})`;\n const result = await this.execute(sql, values);\n\n return { id: result.insertId, ...data };\n }\n\n async update(\n table: string,\n id: any,\n data: Record<string, any>\n ): Promise<any> {\n const keys = Object.keys(data);\n const values = Object.values(data);\n const setParts = keys.map((k) => `\\`${k}\\` = ?`).join(\", \");\n\n const sql = `UPDATE \\`${table}\\` SET ${setParts} WHERE id = ?`;\n await this.execute(sql, [...values, id]);\n\n return { id, ...data };\n }\n\n async delete(table: string, id: any): Promise<boolean> {\n const sql = `DELETE FROM \\`${table}\\` WHERE id = ?`;\n const result = await this.execute(sql, [id]);\n return result.affectedRows > 0;\n }\n\n async beginTransaction(): Promise<void> {\n if (!this.pool) throw new Error(\"Database not connected\");\n this.connection = await this.pool.getConnection();\n await this.connection.beginTransaction();\n }\n\n async commit(): Promise<void> {\n if (!this.connection) throw new Error(\"No active transaction\");\n await this.connection.commit();\n this.connection.release();\n this.connection = null;\n }\n\n async rollback(): Promise<void> {\n if (!this.connection) throw new Error(\"No active transaction\");\n await this.connection.rollback();\n this.connection.release();\n this.connection = null;\n }\n\n async raw(query: string, params: any[] = []): Promise<any> {\n if (!this.pool) throw new Error(\"Database not connected\");\n const [result] = await this.pool.execute(query, params);\n return result;\n }\n\n private buildWhereCondition(clause: WhereClause, params: any[]): string {\n const column = `\\`${clause.column}\\``;\n\n switch (clause.operator) {\n case \"IN\":\n const inPlaceholders = (clause.value as any[])\n .map(() => \"?\")\n .join(\", \");\n params.push(...clause.value);\n return `${column} IN (${inPlaceholders})`;\n\n case \"NOT IN\":\n const notInPlaceholders = (clause.value as any[])\n .map(() => \"?\")\n .join(\", \");\n params.push(...clause.value);\n return `${column} NOT IN (${notInPlaceholders})`;\n\n case \"BETWEEN\":\n params.push(clause.value[0], clause.value[1]);\n return `${column} BETWEEN ? AND ?`;\n\n case \"IS NULL\":\n return `${column} IS NULL`;\n\n case \"IS NOT NULL\":\n return `${column} IS NOT NULL`;\n\n default:\n params.push(clause.value);\n return `${column} ${clause.operator} ?`;\n }\n }\n\n private mapType(type: string, length?: number): string {\n const typeMap: Record<string, string> = {\n string: length ? `VARCHAR(${length})` : \"VARCHAR(255)\",\n text: \"TEXT\",\n integer: \"INT\",\n bigInteger: \"BIGINT\",\n float: \"FLOAT\",\n double: \"DOUBLE\",\n decimal: \"DECIMAL(10,2)\",\n boolean: \"TINYINT(1)\",\n date: \"DATE\",\n datetime: \"DATETIME\",\n timestamp: \"TIMESTAMP\",\n json: \"JSON\",\n uuid: \"CHAR(36)\",\n };\n return typeMap[type] || type.toUpperCase();\n }\n\n private formatValue(value: any): string {\n if (value === null) return \"NULL\";\n if (typeof value === \"string\") return `'${value.replace(/'/g, \"''\")}'`;\n if (typeof value === \"boolean\") return value ? \"1\" : \"0\";\n if (value instanceof Date)\n return `'${value.toISOString().slice(0, 19).replace(\"T\", \" \")}'`;\n return String(value);\n }\n}\n","import type { Pool, PoolClient, QueryResult } from \"pg\";\nimport { dynamicRequire } from \"../../server/utils/dynamicRequire\";\nimport type {\n ColumnDefinition,\n Connection,\n DatabaseAdapter,\n DatabaseConfig,\n SelectOptions,\n WhereClause,\n} from \"../types\";\n\n/**\n * PostgreSQL Database Adapter\n */\nexport class PostgresAdapter implements DatabaseAdapter {\n private pool: Pool | null = null;\n private client: PoolClient | null = null;\n\n async connect(config: DatabaseConfig): Promise<Connection> {\n const { Pool } = dynamicRequire(\"pg\");\n\n this.pool = new Pool({\n host: config.host,\n port: config.port,\n database: config.database,\n user: config.username,\n password: config.password,\n ssl: config.ssl,\n min: config.pool?.min || 2,\n max: config.pool?.max || 10,\n });\n\n return {\n query: this.query.bind(this),\n execute: this.execute.bind(this),\n close: this.disconnect.bind(this),\n };\n }\n\n async disconnect(): Promise<void> {\n if (this.pool) {\n await this.pool.end();\n this.pool = null;\n }\n }\n\n async query(sql: string, params?: any[]): Promise<any> {\n if (!this.pool) throw new Error(\"Database not connected\");\n const result: QueryResult = await this.pool.query(sql, params);\n return result.rows;\n }\n\n async execute(sql: string, params?: any[]): Promise<any> {\n if (!this.pool) throw new Error(\"Database not connected\");\n const result: QueryResult = await this.pool.query(sql, params);\n return result;\n }\n\n async createTable(\n tableName: string,\n columns: ColumnDefinition[]\n ): Promise<void> {\n const columnDefs = columns\n .map((col) => {\n let def = `\"${col.name}\" ${this.mapType(col.type, col.length)}`;\n\n if (col.primary) def += \" PRIMARY KEY\";\n if (col.autoIncrement) def += \" GENERATED ALWAYS AS IDENTITY\";\n if (!col.nullable) def += \" NOT NULL\";\n if (col.unique) def += \" UNIQUE\";\n if (col.default !== undefined) {\n def += ` DEFAULT ${this.formatValue(col.default)}`;\n }\n\n return def;\n })\n .join(\", \");\n\n const sql = `CREATE TABLE IF NOT EXISTS \"${tableName}\" (${columnDefs})`;\n await this.execute(sql);\n }\n\n async dropTable(tableName: string): Promise<void> {\n await this.execute(`DROP TABLE IF EXISTS \"${tableName}\"`);\n }\n\n async hasTable(tableName: string): Promise<boolean> {\n const result = await this.query(\n `SELECT EXISTS (\n SELECT FROM information_schema.tables \n WHERE table_schema = 'public' \n AND table_name = $1\n )`,\n [tableName]\n );\n return result[0]?.exists || false;\n }\n\n async hasColumn(tableName: string, columnName: string): Promise<boolean> {\n const result = await this.query(\n `SELECT EXISTS (\n SELECT FROM information_schema.columns \n WHERE table_schema = 'public' \n AND table_name = $1 \n AND column_name = $2\n )`,\n [tableName, columnName]\n );\n return result[0]?.exists || false;\n }\n\n async select(table: string, options: SelectOptions): Promise<any[]> {\n const columns = options.columns?.join(\", \") || \"*\";\n let sql = `SELECT ${columns} FROM \"${table}\"`;\n const params: any[] = [];\n let paramIndex = 1;\n\n // Joins\n if (options.joins && options.joins.length > 0) {\n for (const join of options.joins) {\n sql += ` ${join.type} JOIN \"${join.table}\" ON ${join.first} ${join.operator} ${join.second}`;\n }\n }\n\n // Where clauses\n if (options.where && options.where.length > 0) {\n const whereParts = options.where.map((clause, index) => {\n const boolean = index === 0 ? \"WHERE\" : clause.boolean;\n const condition = this.buildWhereCondition(clause, params, paramIndex);\n paramIndex = params.length + 1;\n return `${boolean} ${condition}`;\n });\n sql += \" \" + whereParts.join(\" \");\n }\n\n // Order by\n if (options.orderBy && options.orderBy.length > 0) {\n const orderParts = options.orderBy.map(\n (o) => `\"${o.column}\" ${o.direction}`\n );\n sql += ` ORDER BY ${orderParts.join(\", \")}`;\n }\n\n // Limit and offset\n if (options.limit) {\n sql += ` LIMIT $${paramIndex++}`;\n params.push(options.limit);\n }\n if (options.offset) {\n sql += ` OFFSET $${paramIndex++}`;\n params.push(options.offset);\n }\n\n return await this.query(sql, params);\n }\n\n async insert(table: string, data: Record<string, any>): Promise<any> {\n const keys = Object.keys(data);\n const values = Object.values(data);\n const placeholders = values.map((_, i) => `$${i + 1}`).join(\", \");\n\n const sql = `INSERT INTO \"${table}\" (${keys\n .map((k) => `\"${k}\"`)\n .join(\", \")}) \n VALUES (${placeholders}) \n RETURNING *`;\n\n const result = await this.query(sql, values);\n return result[0];\n }\n\n async update(\n table: string,\n id: any,\n data: Record<string, any>\n ): Promise<any> {\n const keys = Object.keys(data);\n const values = Object.values(data);\n const setParts = keys.map((k, i) => `\"${k}\" = $${i + 1}`).join(\", \");\n\n const sql = `UPDATE \"${table}\" SET ${setParts} WHERE id = $${\n keys.length + 1\n } RETURNING *`;\n const result = await this.query(sql, [...values, id]);\n return result[0];\n }\n\n async delete(table: string, id: any): Promise<boolean> {\n const sql = `DELETE FROM \"${table}\" WHERE id = $1`;\n const result = await this.execute(sql, [id]);\n return result.rowCount > 0;\n }\n\n async beginTransaction(): Promise<void> {\n if (!this.pool) throw new Error(\"Database not connected\");\n this.client = await this.pool.connect();\n await this.client.query(\"BEGIN\");\n }\n\n async commit(): Promise<void> {\n if (!this.client) throw new Error(\"No active transaction\");\n await this.client.query(\"COMMIT\");\n this.client.release();\n this.client = null;\n }\n\n async rollback(): Promise<void> {\n if (!this.client) throw new Error(\"No active transaction\");\n await this.client.query(\"ROLLBACK\");\n this.client.release();\n this.client = null;\n }\n\n async raw(query: string, params: any[] = []): Promise<any> {\n if (!this.pool) throw new Error(\"Database not connected\");\n const result = await this.pool.query(query, params);\n return result.rows;\n }\n\n private buildWhereCondition(\n clause: WhereClause,\n params: any[],\n startIndex: number\n ): string {\n const column = `\"${clause.column}\"`;\n\n switch (clause.operator) {\n case \"IN\":\n const inPlaceholders = (clause.value as any[])\n .map((_, i) => `$${startIndex + i}`)\n .join(\", \");\n params.push(...clause.value);\n return `${column} IN (${inPlaceholders})`;\n\n case \"NOT IN\":\n const notInPlaceholders = (clause.value as any[])\n .map((_, i) => `$${startIndex + i}`)\n .join(\", \");\n params.push(...clause.value);\n return `${column} NOT IN (${notInPlaceholders})`;\n\n case \"BETWEEN\":\n params.push(clause.value[0], clause.value[1]);\n return `${column} BETWEEN $${startIndex} AND $${startIndex + 1}`;\n\n case \"IS NULL\":\n return `${column} IS NULL`;\n\n case \"IS NOT NULL\":\n return `${column} IS NOT NULL`;\n\n default:\n params.push(clause.value);\n return `${column} ${clause.operator} $${startIndex}`;\n }\n }\n\n private mapType(type: string, length?: number): string {\n const typeMap: Record<string, string> = {\n string: length ? `VARCHAR(${length})` : \"VARCHAR(255)\",\n text: \"TEXT\",\n integer: \"INTEGER\",\n bigInteger: \"BIGINT\",\n float: \"REAL\",\n double: \"DOUBLE PRECISION\",\n decimal: \"DECIMAL\",\n boolean: \"BOOLEAN\",\n date: \"DATE\",\n datetime: \"TIMESTAMP\",\n timestamp: \"TIMESTAMP\",\n json: \"JSONB\",\n uuid: \"UUID\",\n };\n return typeMap[type] || type.toUpperCase();\n }\n\n private formatValue(value: any): string {\n if (value === null) return \"NULL\";\n if (typeof value === \"string\") return `'${value.replace(/'/g, \"''\")}'`;\n if (typeof value === \"boolean\") return value ? \"TRUE\" : \"FALSE\";\n if (value instanceof Date) return `'${value.toISOString()}'`;\n return String(value);\n }\n}\n","/**\n * Macroable trait\n * Allows adding custom methods to a class at runtime\n */\nexport class Macroable {\n protected static macros: Record<string, Function> = {};\n\n /**\n * Register a custom macro\n */\n static macro(name: string, macro: Function): void {\n this.macros[name] = macro;\n (this.prototype as any)[name] = macro;\n }\n\n /**\n * Mix another object into the class\n */\n static mixin(mixin: Record<string, Function>): void {\n Object.keys(mixin).forEach((key) => {\n this.macro(key, mixin[key]);\n });\n }\n\n /**\n * Check if macro exists\n */\n static hasMacro(name: string): boolean {\n return !!this.macros[name];\n }\n}\n","import type {\n JoinClause,\n OrderByClause,\n SelectOptions,\n WhereClause,\n} from \"./types\";\n\nimport { Macroable } from \"./support/Macroable\";\n\n/**\n * Query Builder - Fluent interface for building database queries\n * Arcanox Query Builder\n */\nexport class QueryBuilder<T = any> extends Macroable {\n protected tableName: string;\n protected selectColumns: string[] = [\"*\"];\n protected whereClauses: WhereClause[] = [];\n protected orderByClauses: OrderByClause[] = [];\n protected joinClauses: JoinClause[] = [];\n protected limitValue?: number;\n protected offsetValue?: number;\n protected adapter: any; // DatabaseAdapter\n\n constructor(table: string, adapter: any) {\n super();\n this.tableName = table;\n this.adapter = adapter;\n }\n\n /**\n * Select specific columns\n */\n select(...columns: string[]): this {\n this.selectColumns = columns;\n return this;\n }\n\n /**\n * Add a WHERE clause\n */\n where(column: string, operator: any, value?: any): this {\n // Support where(column, value) syntax\n if (value === undefined) {\n value = operator;\n operator = \"=\";\n }\n\n this.whereClauses.push({\n column,\n operator,\n value,\n boolean: \"AND\",\n });\n return this;\n }\n\n /**\n * Add an OR WHERE clause\n */\n orWhere(column: string, operator: any, value?: any): this {\n if (value === undefined) {\n value = operator;\n operator = \"=\";\n }\n\n this.whereClauses.push({\n column,\n operator,\n value,\n boolean: \"OR\",\n });\n return this;\n }\n\n /**\n * WHERE IN clause\n */\n whereIn(column: string, values: any[]): this {\n this.whereClauses.push({\n column,\n operator: \"IN\",\n value: values,\n boolean: \"AND\",\n });\n return this;\n }\n\n /**\n * WHERE NOT IN clause\n */\n whereNotIn(column: string, values: any[]): this {\n this.whereClauses.push({\n column,\n operator: \"NOT IN\",\n value: values,\n boolean: \"AND\",\n });\n return this;\n }\n\n /**\n * WHERE BETWEEN clause\n */\n whereBetween(column: string, range: [any, any]): this {\n this.whereClauses.push({\n column,\n operator: \"BETWEEN\",\n value: range,\n boolean: \"AND\",\n });\n return this;\n }\n\n /**\n * WHERE NULL clause\n */\n whereNull(column: string): this {\n this.whereClauses.push({\n column,\n operator: \"IS NULL\",\n value: null,\n boolean: \"AND\",\n });\n return this;\n }\n\n /**\n * WHERE NOT NULL clause\n */\n whereNotNull(column: string): this {\n this.whereClauses.push({\n column,\n operator: \"IS NOT NULL\",\n value: null,\n boolean: \"AND\",\n });\n return this;\n }\n\n /**\n * Add ORDER BY clause\n */\n orderBy(\n column: string,\n direction: \"ASC\" | \"DESC\" | \"asc\" | \"desc\" = \"ASC\"\n ): this {\n this.orderByClauses.push({\n column,\n direction: direction.toUpperCase() as \"ASC\" | \"DESC\",\n });\n return this;\n }\n\n /**\n * Add LIMIT clause\n */\n limit(count: number): this {\n this.limitValue = count;\n return this;\n }\n\n /**\n * Add OFFSET clause\n */\n offset(count: number): this {\n this.offsetValue = count;\n return this;\n }\n\n /**\n * Add JOIN clause\n */\n join(\n table: string,\n first: string,\n operator: string,\n second: string,\n type: \"INNER\" | \"LEFT\" | \"RIGHT\" = \"INNER\"\n ): this {\n this.joinClauses.push({\n type,\n table,\n first,\n operator,\n second,\n });\n return this;\n }\n\n /**\n * Add LEFT JOIN clause\n */\n leftJoin(\n table: string,\n first: string,\n operator: string,\n second: string\n ): this {\n return this.join(table, first, operator, second, \"LEFT\");\n }\n\n /**\n * Add RIGHT JOIN clause\n */\n rightJoin(\n table: string,\n first: string,\n operator: string,\n second: string\n ): this {\n return this.join(table, first, operator, second, \"RIGHT\");\n }\n\n protected eagerLoads: string[] = [];\n protected model: any; // Model class\n\n /**\n * Set the model class\n */\n setModel(model: any): this {\n this.model = model;\n return this;\n }\n\n /**\n * Eager load relationships\n */\n with(relations: string | string[]): this {\n if (Array.isArray(relations)) {\n this.eagerLoads.push(...relations);\n } else {\n this.eagerLoads.push(relations);\n }\n return this;\n }\n\n /**\n * Execute query and get all results\n */\n async get(): Promise<T[]> {\n const options: SelectOptions = {\n columns: this.selectColumns,\n where: this.whereClauses,\n orderBy: this.orderByClauses,\n limit: this.limitValue,\n offset: this.offsetValue,\n joins: this.joinClauses,\n };\n\n const results = await this.adapter.select(this.tableName, options);\n\n if (this.eagerLoads.length > 0 && this.model) {\n return await this.eagerLoadRelations(results);\n }\n\n return results;\n }\n\n /**\n * Eager load relations\n */\n protected async eagerLoadRelations(results: any[]): Promise<any[]> {\n if (results.length === 0) return results;\n\n // Hydrate models first\n const models = results.map((result) => this.model.hydrate(result));\n\n for (const relationName of this.eagerLoads) {\n // Check if relation exists on model\n const instance = new this.model();\n if (typeof instance[relationName] !== \"function\") {\n throw new Error(\n `Relation ${relationName} does not exist on ${this.model.name}`\n );\n }\n\n // Get relation instance\n const relation = instance[relationName]();\n\n // Add constraints for eager loading\n relation.addEagerConstraints(models);\n\n // Get related results\n const relatedResults = await relation.get();\n\n // Match results to models\n relation.match(models, relatedResults, relationName);\n }\n\n return models;\n }\n\n /**\n * Get first result\n */\n async first(): Promise<T | null> {\n this.limit(1);\n const results = await this.get();\n return results[0] || null;\n }\n\n /**\n * Find by ID\n */\n async find(id: any): Promise<T | null> {\n return this.where(\"id\", id).first();\n }\n\n /**\n * Count results\n */\n async count(): Promise<number> {\n this.selectColumns = [\"COUNT(*) as count\"];\n const result = await this.first();\n return result ? (result as any).count : 0;\n }\n\n /**\n * Get specific column values\n */\n async pluck(column: string): Promise<any[]> {\n this.select(column);\n const results = await this.get();\n return results.map((row) => (row as any)[column]);\n }\n\n /**\n * Sum of column\n */\n async sum(column: string): Promise<number> {\n this.selectColumns = [`SUM(${column}) as sum`];\n const result = await this.first();\n return result ? (result as any).sum || 0 : 0;\n }\n\n /**\n * Average of column\n */\n async avg(column: string): Promise<number> {\n this.selectColumns = [`AVG(${column}) as avg`];\n const result = await this.first();\n return result ? (result as any).avg || 0 : 0;\n }\n\n /**\n * Minimum value of column\n */\n async min(column: string): Promise<any> {\n this.selectColumns = [`MIN(${column}) as min`];\n const result = await this.first();\n return result ? (result as any).min : null;\n }\n\n /**\n * Maximum value of column\n */\n async max(column: string): Promise<any> {\n this.selectColumns = [`MAX(${column}) as max`];\n const result = await this.first();\n return result ? (result as any).max : null;\n }\n\n /**\n * Check if any records exist\n */\n async exists(): Promise<boolean> {\n const count = await this.count();\n return count > 0;\n }\n\n /**\n * Paginate results\n */\n async paginate(\n page: number = 1,\n perPage: number = 15\n ): Promise<{\n data: T[];\n total: number;\n perPage: number;\n currentPage: number;\n lastPage: number;\n }> {\n const total = await this.count();\n const offset = (page - 1) * perPage;\n\n this.limit(perPage).offset(offset);\n const data = await this.get();\n\n return {\n data,\n total,\n perPage,\n currentPage: page,\n lastPage: Math.ceil(total / perPage),\n };\n }\n\n /**\n * Clone the query builder\n */\n clone(): QueryBuilder<T> {\n const cloned = new QueryBuilder<T>(this.tableName, this.adapter);\n cloned.selectColumns = [...this.selectColumns];\n cloned.whereClauses = [...this.whereClauses];\n cloned.orderByClauses = [...this.orderByClauses];\n cloned.joinClauses = [...this.joinClauses];\n cloned.limitValue = this.limitValue;\n cloned.offsetValue = this.offsetValue;\n return cloned;\n }\n}\n","import { Model } from \"../Model\";\nimport { QueryBuilder } from \"../QueryBuilder\";\n\nexport abstract class Relation<R extends Model = any> {\n protected query: QueryBuilder<R>;\n protected parent: Model;\n protected related: new () => R;\n\n constructor(query: QueryBuilder<R>, parent: Model) {\n this.query = query;\n this.parent = parent;\n this.related = (query as any).model;\n this.addConstraints();\n }\n\n abstract addConstraints(): void;\n\n abstract addEagerConstraints(models: Model[]): void;\n\n abstract match(models: Model[], results: R[], relation: string): Model[];\n\n getQuery(): QueryBuilder<R> {\n return this.query;\n }\n\n async get(): Promise<R[]> {\n return this.query.get();\n }\n\n async first(): Promise<R | null> {\n return this.query.first();\n }\n}\n","import { Model } from \"../Model\";\nimport { QueryBuilder } from \"../QueryBuilder\";\nimport { Relation } from \"./Relation\";\n\nexport class BelongsTo<R extends Model = any> extends Relation<R> {\n protected foreignKey: string;\n protected ownerKey: string;\n\n constructor(\n query: QueryBuilder<R>,\n parent: Model,\n foreignKey: string,\n ownerKey: string\n ) {\n super(query, parent);\n this.foreignKey = foreignKey;\n this.ownerKey = ownerKey;\n }\n\n addConstraints(): void {\n const foreignValue = this.parent.getAttribute(this.foreignKey);\n this.query.where(this.ownerKey, \"=\", foreignValue);\n }\n\n addEagerConstraints(models: Model[]): void {\n const keys = models\n .map((model) => model.getAttribute(this.foreignKey))\n .filter((k) => k !== null);\n this.query.whereIn(this.ownerKey, keys);\n }\n\n match(models: Model[], results: R[], relation: string): Model[] {\n const dictionary: Record<string, R> = {};\n\n results.forEach((result) => {\n const key = result.getAttribute(this.ownerKey);\n dictionary[key] = result;\n });\n\n models.forEach((model) => {\n const key = model.getAttribute(this.foreignKey);\n if (dictionary[key]) {\n model.setRelation(relation, dictionary[key]);\n }\n });\n\n return models;\n }\n}\n","import { Model } from \"../Model\";\nimport { QueryBuilder } from \"../QueryBuilder\";\nimport { Relation } from \"./Relation\";\n\nexport class BelongsToMany<R extends Model = any> extends Relation<R> {\n protected table: string;\n protected foreignPivotKey: string;\n protected relatedPivotKey: string;\n protected parentKey: string;\n protected relatedKey: string;\n\n constructor(\n query: QueryBuilder<R>,\n parent: Model,\n table: string,\n foreignPivotKey: string,\n relatedPivotKey: string,\n parentKey: string,\n relatedKey: string\n ) {\n super(query, parent);\n this.table = table;\n this.foreignPivotKey = foreignPivotKey;\n this.relatedPivotKey = relatedPivotKey;\n this.parentKey = parentKey;\n this.relatedKey = relatedKey;\n }\n\n addConstraints(): void {\n this.performJoin();\n this.query.where(\n `${this.table}.${this.foreignPivotKey}`,\n \"=\",\n this.parent.getAttribute(this.parentKey)\n );\n }\n\n protected performJoin(query?: QueryBuilder<R>): this {\n const q = query || this.query;\n const relatedTable = this.related.prototype.getTable();\n\n q.join(\n this.table,\n `${relatedTable}.${this.relatedKey}`,\n \"=\",\n `${this.table}.${this.relatedPivotKey}`\n );\n\n return this;\n }\n\n addEagerConstraints(models: Model[]): void {\n this.performJoin();\n const keys = models\n .map((model) => model.getAttribute(this.parentKey))\n .filter((k) => k !== null);\n this.query.whereIn(`${this.table}.${this.foreignPivotKey}`, keys);\n }\n\n match(models: Model[], results: R[], relation: string): Model[] {\n const dictionary: Record<string, R[]> = {};\n\n // In a real implementation, we'd select the pivot fields to map correctly\n // For now, we'll assume the results contain the pivot data or we re-query\n // This is a simplified implementation\n\n // TODO: Implement proper pivot mapping\n // For now, we'll just map based on the assumption that results are correct\n\n return models;\n }\n}\n","import { Model } from \"../Model\";\nimport { QueryBuilder } from \"../QueryBuilder\";\nimport { Relation } from \"./Relation\";\n\nexport class HasMany<R extends Model = any> extends Relation<R> {\n protected foreignKey: string;\n protected localKey: string;\n\n constructor(\n query: QueryBuilder<R>,\n parent: Model,\n foreignKey: string,\n localKey: string\n ) {\n super(query, parent);\n this.foreignKey = foreignKey;\n this.localKey = localKey;\n }\n\n addConstraints(): void {\n const localValue = this.parent.getAttribute(this.localKey);\n this.query.where(this.foreignKey, \"=\", localValue);\n }\n\n addEagerConstraints(models: Model[]): void {\n const keys = models\n .map((model) => model.getAttribute(this.localKey))\n .filter((k) => k !== null);\n this.query.whereIn(this.foreignKey, keys);\n }\n\n match(models: Model[], results: R[], relation: string): Model[] {\n const dictionary: Record<string, R[]> = {};\n\n results.forEach((result) => {\n const key = result.getAttribute(this.foreignKey);\n if (!dictionary[key]) {\n dictionary[key] = [];\n }\n dictionary[key].push(result);\n });\n\n models.forEach((model) => {\n const key = model.getAttribute(this.localKey);\n if (dictionary[key]) {\n model.setRelation(relation, dictionary[key]);\n } else {\n model.setRelation(relation, []);\n }\n });\n\n return models;\n }\n}\n","import { Model } from \"../Model\";\nimport { QueryBuilder } from \"../QueryBuilder\";\nimport { Relation } from \"./Relation\";\n\nexport class HasOne<R extends Model = any> extends Relation<R> {\n protected foreignKey: string;\n protected localKey: string;\n\n constructor(\n query: QueryBuilder<R>,\n parent: Model,\n foreignKey: string,\n localKey: string\n ) {\n super(query, parent);\n this.foreignKey = foreignKey;\n this.localKey = localKey;\n }\n\n addConstraints(): void {\n const localValue = this.parent.getAttribute(this.localKey);\n this.query.where(this.foreignKey, \"=\", localValue);\n }\n\n addEagerConstraints(models: Model[]): void {\n const keys = models\n .map((model) => model.getAttribute(this.localKey))\n .filter((k) => k !== null);\n this.query.whereIn(this.foreignKey, keys);\n }\n\n match(models: Model[], results: R[], relation: string): Model[] {\n const dictionary: Record<string, R> = {};\n\n results.forEach((result) => {\n const key = result.getAttribute(this.foreignKey);\n dictionary[key] = result;\n });\n\n models.forEach((model) => {\n const key = model.getAttribute(this.localKey);\n if (dictionary[key]) {\n model.setRelation(relation, dictionary[key]);\n }\n });\n\n return models;\n }\n}\n","import { QueryBuilder } from \"./QueryBuilder\";\nimport { BelongsTo } from \"./relations/BelongsTo\";\nimport { BelongsToMany } from \"./relations/BelongsToMany\";\nimport { HasMany } from \"./relations/HasMany\";\nimport { HasOne } from \"./relations/HasOne\";\nimport type { DatabaseAdapter } from \"./types\";\n\n/**\n * Relation types for arcanox relationships\n */\nexport type RelationType = \"hasOne\" | \"hasMany\" | \"belongsTo\" | \"belongsToMany\";\n\nexport interface RelationConfig {\n type: RelationType;\n related: typeof Model;\n foreignKey?: string;\n localKey?: string;\n pivotTable?: string;\n}\n\nimport { Macroable } from \"./support/Macroable\";\n\n/**\n * Base Model class - Arcanox ORM\n */\nexport class Model<T = any> extends Macroable {\n // Static properties\n protected static adapter: DatabaseAdapter;\n protected static tableName: string;\n protected static primaryKey: string = \"id\";\n protected static connection: string = \"default\";\n\n // Instance properties\n protected attributes: Record<string, any> = {};\n protected original: Record<string, any> = {};\n protected relations: Record<string, any> = {};\n protected exists: boolean = false;\n\n // Configuration\n protected fillable: string[] = [];\n protected guarded: string[] = [\"id\"];\n protected hidden: string[] = [];\n protected visible: string[] = [];\n protected casts: Record<string, string> = {};\n protected dates: string[] = [];\n protected timestamps: boolean = true;\n protected createdAt: string = \"created_at\";\n protected updatedAt: string = \"updated_at\";\n protected softDeletes: boolean = false;\n protected deletedAt: string = \"deleted_at\";\n\n /**\n * Set the database adapter\n */\n static setAdapter(adapter: DatabaseAdapter): void {\n this.adapter = adapter;\n }\n\n /**\n * Get the table name\n */\n static getTable(): string {\n if (this.tableName) {\n return this.tableName;\n }\n // Auto-generate table name from class name (pluralize and snake_case)\n const className = this.name;\n return this.pluralize(this.snakeCase(className));\n }\n\n /**\n * Create a new query builder instance\n */\n static query<T>(): QueryBuilder<T> {\n return new QueryBuilder<T>(this.getTable(), this.adapter);\n }\n\n /**\n * Get all records\n */\n static async all<T>(): Promise<T[]> {\n const results = await this.query<T>().get();\n return results.map((data) => this.hydrate<T>(data));\n }\n\n /**\n * Find a record by ID\n */\n static async find<T>(id: any): Promise<T | null> {\n const data = await this.query<T>().where(this.primaryKey, id).first();\n return data ? this.hydrate<T>(data) : null;\n }\n\n /**\n * Find a record by ID or throw exception\n */\n static async findOrFail<T>(id: any): Promise<T> {\n const model = await this.find<T>(id);\n if (!model) {\n throw new Error(`Model not found with ${this.primaryKey}: ${id}`);\n }\n return model;\n }\n\n /**\n * Create a WHERE query\n */\n static where<T>(column: string, operator: any, value?: any): QueryBuilder<T> {\n return this.query<T>().where(column, operator, value);\n }\n\n /**\n * Create a new record\n */\n static async create<T>(data: Partial<T>): Promise<T> {\n const instance = new this() as any;\n instance.fill(data);\n\n if (instance.timestamps) {\n const now = new Date();\n instance.attributes[instance.createdAt] = now;\n instance.attributes[instance.updatedAt] = now;\n }\n\n const result = await this.adapter.insert(\n this.getTable(),\n instance.attributes\n );\n\n const id = result[this.primaryKey] || result.id || result.insertId;\n instance.attributes[this.primaryKey] = id;\n if (this.primaryKey !== \"id\") {\n instance.attributes.id = id;\n }\n\n instance.exists = true;\n instance.syncOriginal();\n\n return instance as T;\n }\n\n /**\n * Update a record\n */\n static async update<T>(id: any, data: Partial<T>): Promise<T> {\n const instance = await this.findOrFail<T>(id);\n await (instance as any).update(data);\n return instance;\n }\n\n /**\n * Delete a record\n */\n static async destroy(id: any): Promise<boolean> {\n const instance = await this.find(id);\n if (!instance) return false;\n return await (instance as any).delete();\n }\n\n /**\n * First or create\n */\n static async firstOrCreate<T>(\n attributes: Partial<T>,\n values: Partial<T> = {}\n ): Promise<T> {\n const query = this.query<T>();\n\n for (const [key, value] of Object.entries(attributes)) {\n query.where(key, value);\n }\n\n const existing = await query.first();\n if (existing) {\n return this.hydrate<T>(existing);\n }\n\n return await this.create<T>({ ...attributes, ...values });\n }\n\n /**\n * Update or create\n */\n static async updateOrCreate<T>(\n attributes: Partial<T>,\n values: Partial<T> = {}\n ): Promise<T> {\n const query = this.query<T>();\n\n for (const [key, value] of Object.entries(attributes)) {\n query.where(key, value);\n }\n\n const existing = await query.first();\n if (existing) {\n const instance = this.hydrate<T>(existing) as any;\n await instance.update(values);\n return instance;\n }\n\n return await this.create<T>({ ...attributes, ...values });\n }\n\n /**\n * Hydrate a model instance from data\n */\n protected static hydrate<T>(data: any): T {\n const instance = new this() as any;\n instance.attributes = { ...data };\n instance.original = { ...data };\n instance.exists = true;\n return instance as T;\n }\n\n /**\n * Fill model attributes\n */\n fill(attributes: Partial<T>): this {\n for (const [key, value] of Object.entries(attributes)) {\n if (this.isFillable(key)) {\n this.setAttribute(key, value);\n }\n }\n return this;\n }\n\n /**\n * Check if attribute is fillable\n */\n protected isFillable(key: string): boolean {\n if (this.fillable.length > 0) {\n return this.fillable.includes(key);\n }\n return !this.guarded.includes(key);\n }\n\n /**\n * Set an attribute\n */\n setAttribute(key: string, value: any): void {\n // Check for mutator\n const mutator = `set${this.studly(key)}Attribute`;\n if (typeof (this as any)[mutator] === \"function\") {\n value = (this as any)[mutator](value);\n }\n\n this.attributes[key] = this.castAttribute(key, value);\n }\n\n /**\n * Get an attribute\n */\n getAttribute(key: string): any {\n // Check for accessor\n const accessor = `get${this.studly(key)}Attribute`;\n if (typeof (this as any)[accessor] === \"function\") {\n return (this as any)[accessor]();\n }\n\n const value = this.attributes[key];\n return this.castAttribute(key, value, true);\n }\n\n /**\n * Cast attribute to specified type\n */\n protected castAttribute(\n key: string,\n value: any,\n isGetting: boolean = false\n ): any {\n if (value === null || value === undefined) return value;\n\n const cast = this.casts[key];\n if (!cast) return value;\n\n if (isGetting) {\n switch (cast) {\n case \"int\":\n case \"integer\":\n return parseInt(value);\n case \"float\":\n case \"double\":\n return parseFloat(value);\n case \"string\":\n return String(value);\n case \"bool\":\n case \"boolean\":\n return Boolean(value);\n case \"array\":\n case \"json\":\n return typeof value === \"string\" ? JSON.parse(value) : value;\n case \"date\":\n case \"datetime\":\n return value instanceof Date ? value : new Date(value);\n default:\n return value;\n }\n } else {\n switch (cast) {\n case \"array\":\n case \"json\":\n return typeof value === \"object\" ? JSON.stringify(value) : value;\n case \"date\":\n case \"datetime\":\n return value instanceof Date ? value : new Date(value);\n default:\n return value;\n }\n }\n }\n\n /**\n * Save the model\n */\n async save(): Promise<this> {\n const constructor = this.constructor as typeof Model;\n\n if (this.timestamps) {\n const now = new Date();\n if (!this.exists) {\n this.attributes[this.createdAt] = now;\n }\n this.attributes[this.updatedAt] = now;\n }\n\n if (this.exists) {\n // Update existing record\n const id = this.attributes[constructor.primaryKey];\n await constructor.adapter.update(\n constructor.getTable(),\n id,\n this.attributes\n );\n } else {\n // Insert new record\n const result = await constructor.adapter.insert(\n constructor.getTable(),\n this.attributes\n );\n\n const id = result[constructor.primaryKey] || result.id || result.insertId;\n this.attributes[constructor.primaryKey] = id;\n if (constructor.primaryKey !== \"id\") {\n this.attributes.id = id;\n }\n\n this.exists = true;\n }\n\n this.syncOriginal();\n return this;\n }\n\n /**\n * Update the model\n */\n async update(attributes: Partial<T>): Promise<this> {\n this.fill(attributes);\n return await this.save();\n }\n\n /**\n * Delete the model\n */\n async delete(): Promise<boolean> {\n const constructor = this.constructor as typeof Model;\n\n if (this.softDeletes) {\n this.attributes[this.deletedAt] = new Date();\n await this.save();\n return true;\n }\n\n const id = this.attributes[constructor.primaryKey];\n return await constructor.adapter.delete(constructor.getTable(), id);\n }\n\n /**\n * Force delete (ignore soft deletes)\n */\n async forceDelete(): Promise<boolean> {\n const constructor = this.constructor as typeof Model;\n const id = this.attributes[constructor.primaryKey];\n return await constructor.adapter.delete(constructor.getTable(), id);\n }\n\n /**\n * Restore soft deleted model\n */\n async restore(): Promise<this> {\n if (this.softDeletes) {\n this.attributes[this.deletedAt] = null;\n await this.save();\n }\n return this;\n }\n\n /**\n * Sync original attributes\n */\n protected syncOriginal(): void {\n this.original = { ...this.attributes };\n }\n\n /**\n * Get dirty attributes (changed since last sync)\n */\n getDirty(): Record<string, any> {\n const dirty: Record<string, any> = {};\n for (const [key, value] of Object.entries(this.attributes)) {\n if (this.original[key] !== value) {\n dirty[key] = value;\n }\n }\n return dirty;\n }\n\n /**\n * Check if model is dirty\n */\n isDirty(): boolean {\n return Object.keys(this.getDirty()).length > 0;\n }\n\n constructor(attributes: Partial<T> = {}) {\n super();\n this.fill(attributes);\n }\n\n /**\n * Convert model to JSON\n */\n toJSON(): Record<string, any> {\n const json: Record<string, any> = {};\n\n // Add attributes\n for (const [key, value] of Object.entries(this.attributes)) {\n if (this.hidden.includes(key)) continue;\n if (this.visible.length > 0 && !this.visible.includes(key)) continue;\n json[key] = this.getAttribute(key);\n }\n\n // Add relations\n for (const [key, value] of Object.entries(this.relations)) {\n json[key] = value;\n }\n\n return json;\n }\n\n /**\n * Define a one-to-one relationship\n */\n hasOne<R extends Model>(\n related: new () => R,\n foreignKey?: string,\n localKey?: string\n ): HasOne<R> {\n const instance = new related();\n const foreign = foreignKey || `${this.constructor.name.toLowerCase()}_id`;\n const local = localKey || \"id\";\n\n return new HasOne<R>(instance.newQuery(), this, foreign, local);\n }\n\n /**\n * Define a one-to-many relationship\n */\n hasMany<R extends Model>(\n related: new () => R,\n foreignKey?: string,\n localKey?: string\n ): HasMany<R> {\n const instance = new related();\n const foreign = foreignKey || `${this.constructor.name.toLowerCase()}_id`;\n const local = localKey || \"id\";\n\n return new HasMany<R>(instance.newQuery(), this, foreign, local);\n }\n\n /**\n * Define an inverse one-to-one or many relationship\n */\n belongsTo<R extends Model>(\n related: new () => R,\n foreignKey?: string,\n ownerKey?: string\n ): BelongsTo<R> {\n const instance = new related();\n const foreign =\n foreignKey || `${instance.constructor.name.toLowerCase()}_id`;\n const owner = ownerKey || \"id\";\n\n return new BelongsTo<R>(instance.newQuery(), this, foreign, owner);\n }\n\n /**\n * Define a many-to-many relationship\n */\n belongsToMany<R extends Model>(\n related: new () => R,\n table?: string,\n foreignPivotKey?: string,\n relatedPivotKey?: string,\n parentKey?: string,\n relatedKey?: string\n ): BelongsToMany<R> {\n const instance = new related();\n const pivotTable = table || this.guessPivotTable(instance);\n const foreignPivot =\n foreignPivotKey || `${this.constructor.name.toLowerCase()}_id`;\n const relatedPivot =\n relatedPivotKey || `${instance.constructor.name.toLowerCase()}_id`;\n const parent = parentKey || \"id\";\n const relatedK = relatedKey || \"id\";\n\n return new BelongsToMany<R>(\n instance.newQuery(),\n this,\n pivotTable,\n foreignPivot,\n relatedPivot,\n parent,\n relatedK\n );\n }\n\n /**\n * Guess the pivot table name (alphabetical order of model names)\n */\n protected guessPivotTable(related: Model): string {\n const segments = [\n this.constructor.name.toLowerCase(),\n related.constructor.name.toLowerCase(),\n ];\n segments.sort();\n return segments.join(\"_\");\n }\n\n /**\n * Eager load relationships\n */\n static with<T>(relations: string | string[]): QueryBuilder<T> {\n return this.query<T>().with(relations);\n }\n\n /**\n * Set a loaded relationship\n */\n setRelation(relation: string, value: any): this {\n this.relations[relation] = value;\n return this;\n }\n\n /**\n * Get a loaded relationship\n */\n getRelation(relation: string): any {\n return this.relations[relation];\n }\n\n /**\n * Check if a relationship is loaded\n */\n relationLoaded(relation: string): boolean {\n return this.relations[relation] !== undefined;\n }\n\n /**\n * Create a new query builder for the model\n */\n newQuery(): QueryBuilder<T> {\n return (this.constructor as typeof Model).query<T>();\n }\n\n /**\n * Helper: Convert string to snake_case\n */\n protected static snakeCase(str: string): string {\n return str\n .replace(/([A-Z])/g, \"_$1\")\n .toLowerCase()\n .replace(/^_/, \"\");\n }\n\n /**\n * Helper: Pluralize string (simple implementation)\n */\n protected static pluralize(str: string): string {\n if (str.endsWith(\"y\")) {\n return str.slice(0, -1) + \"ies\";\n }\n if (str.endsWith(\"s\")) {\n return str + \"es\";\n }\n return str + \"s\";\n }\n\n /**\n * Helper: Convert to StudlyCase\n */\n protected studly(str: string): string {\n return str.replace(/(^|_)(\\w)/g, (_, __, c) => c.toUpperCase());\n }\n}\n","import { QueryBuilder } from \"../QueryBuilder\";\n\n/**\n * MongoDB-specific extensions for QueryBuilder\n * These extensions provide Mongoose-style functionality for MongoDB\n */\n\nexport interface PopulateOptions {\n from?: string;\n localField?: string;\n foreignField?: string;\n as?: string;\n select?: string[];\n}\n\n/**\n * Populate (Mongoose-style relationships)\n * Uses MongoDB's $lookup aggregation to join collections\n */\nQueryBuilder.macro(\n \"populate\",\n async function (\n this: QueryBuilder<any>,\n field: string,\n options?: PopulateOptions\n ) {\n // Get the native DB instance\n const db = await this.adapter.raw(\"db\");\n const collection = db.collection(this.tableName);\n\n // Determine the related collection name\n // By convention: 'author' field -> 'authors' collection\n const relatedCollection = options?.from || `${field}s`;\n const localField = options?.localField || `${field}_id`;\n const foreignField = options?.foreignField || \"_id\";\n const as = options?.as || field;\n\n // Build the aggregation pipeline\n const pipeline: any[] = [];\n\n // Add existing where clauses as $match\n if ((this as any).whereClauses && (this as any).whereClauses.length > 0) {\n const filter =\n this.adapter.buildFilter?.((this as any).whereClauses) || {};\n if (Object.keys(filter).length > 0) {\n pipeline.push({ $match: filter });\n }\n }\n\n // Build $lookup with optional projection\n if (options?.select && options.select.length > 0) {\n // Use pipeline-based $lookup for field selection\n const projection: any = {};\n options.select.forEach((field) => {\n projection[field] = 1;\n });\n\n pipeline.push({\n $lookup: {\n from: relatedCollection,\n let: { localId: `$${localField}` },\n pipeline: [\n { $match: { $expr: { $eq: [`$${foreignField}`, \"$$localId\"] } } },\n { $project: projection },\n ],\n as: as,\n },\n });\n } else {\n // Standard $lookup\n pipeline.push({\n $lookup: {\n from: relatedCollection,\n localField: localField,\n foreignField: foreignField,\n as: as,\n },\n });\n }\n\n // Unwind to convert array to object (if you want single object instead of array)\n pipeline.push({\n $unwind: {\n path: `$${as}`,\n preserveNullAndEmptyArrays: true, // Keep documents even if no match\n },\n });\n\n // Add limit if specified\n if ((this as any).limitValue) {\n pipeline.push({ $limit: (this as any).limitValue });\n }\n\n // Execute aggregation\n const results = await collection.aggregate(pipeline).toArray();\n\n // Map _id to id\n return results.map((doc: any) => {\n const { _id, ...rest } = doc;\n return { id: _id, _id, ...rest };\n });\n }\n);\n\n/**\n * Execute query (alias for get())\n * Provides Mongoose-style exec() method\n */\nQueryBuilder.macro(\"exec\", async function (this: QueryBuilder<any>) {\n return await this.get();\n});\n\n/**\n * Direct aggregation pipeline access\n * Allows running custom MongoDB aggregation pipelines\n */\nQueryBuilder.macro(\n \"aggregate\",\n async function (this: QueryBuilder<any>, pipeline: any[]) {\n // Get the native DB instance\n const db = await this.adapter.raw(\"db\");\n const collection = db.collection(this.tableName);\n\n // Execute aggregation\n const results = await collection.aggregate(pipeline).toArray();\n\n // Map _id to id for consistency\n return results.map((doc: any) => {\n if (doc._id) {\n const { _id, ...rest } = doc;\n return { id: _id, _id, ...rest };\n }\n return doc;\n });\n }\n);\n\n/**\n * TypeScript type augmentation for better IDE support\n */\ndeclare module \"../QueryBuilder\" {\n interface QueryBuilder<T> {\n /**\n * Populate a relationship using MongoDB's $lookup\n * @param field - The field name to populate\n * @param options - Population options\n */\n populate(field: string, options?: PopulateOptions): Promise<T[]>;\n\n /**\n * Execute the query (alias for get())\n */\n exec(): Promise<T[]>;\n\n /**\n * Execute a MongoDB aggregation pipeline\n * @param pipeline - MongoDB aggregation pipeline stages\n */\n aggregate(pipeline: any[]): Promise<any[]>;\n }\n}\n","import type { ColumnDefinition } from \"../types\";\n\n/**\n * Column definition builder - fluent interface for defining columns\n */\nexport class ColumnBuilder {\n private definition: ColumnDefinition;\n\n constructor(name: string, type: string, length?: number) {\n this.definition = {\n name,\n type,\n length,\n nullable: false,\n };\n }\n\n /**\n * Make column nullable\n */\n nullable(): this {\n this.definition.nullable = true;\n return this;\n }\n\n /**\n * Set default value\n */\n default(value: any): this {\n this.definition.default = value;\n return this;\n }\n\n /**\n * Make column unique\n */\n unique(): this {\n this.definition.unique = true;\n return this;\n }\n\n /**\n * Make column primary key\n */\n primary(): this {\n this.definition.primary = true;\n return this;\n }\n\n /**\n * Make column auto-increment\n */\n autoIncrement(): this {\n this.definition.autoIncrement = true;\n return this;\n }\n\n /**\n * Make column unsigned (for numbers)\n */\n unsigned(): this {\n this.definition.unsigned = true;\n return this;\n }\n\n /**\n * Get the column definition\n */\n getDefinition(): ColumnDefinition {\n return this.definition;\n }\n}\n\n/**\n * Foreign key definition builder\n */\nexport class ForeignKeyBuilder {\n private column: string;\n private referencedTable?: string;\n private referencedColumn?: string;\n private onDeleteAction?: string;\n private onUpdateAction?: string;\n\n constructor(column: string) {\n this.column = column;\n }\n\n /**\n * Set referenced table and column\n */\n references(column: string): this {\n this.referencedColumn = column;\n return this;\n }\n\n /**\n * Set referenced table\n */\n on(table: string): this {\n this.referencedTable = table;\n return this;\n }\n\n /**\n * Set ON DELETE action\n */\n onDelete(action: \"CASCADE\" | \"SET NULL\" | \"RESTRICT\" | \"NO ACTION\"): this {\n this.onDeleteAction = action;\n return this;\n }\n\n /**\n * Set ON UPDATE action\n */\n onUpdate(action: \"CASCADE\" | \"SET NULL\" | \"RESTRICT\" | \"NO ACTION\"): this {\n this.onUpdateAction = action;\n return this;\n }\n\n /**\n * Get foreign key SQL\n */\n toSQL(): string {\n if (!this.referencedTable || !this.referencedColumn) {\n throw new Error(\"Foreign key must reference a table and column\");\n }\n\n let sql = `FOREIGN KEY (${this.column}) REFERENCES ${this.referencedTable}(${this.referencedColumn})`;\n\n if (this.onDeleteAction) {\n sql += ` ON DELETE ${this.onDeleteAction}`;\n }\n if (this.onUpdateAction) {\n sql += ` ON UPDATE ${this.onUpdateAction}`;\n }\n\n return sql;\n }\n}\n\n/**\n * Blueprint - defines table structure\n * Arcanox's Schema Blueprint\n */\nexport class Blueprint {\n private tableName: string;\n private columns: ColumnDefinition[] = [];\n private indexes: Array<{\n columns: string[];\n unique: boolean;\n name?: string;\n }> = [];\n private foreignKeys: ForeignKeyBuilder[] = [];\n private primaryKeys: string[] = [];\n\n constructor(tableName: string) {\n this.tableName = tableName;\n }\n\n /**\n * Add auto-incrementing ID column\n */\n id(name: string = \"id\"): ColumnBuilder {\n const col = new ColumnBuilder(name, \"bigInteger\");\n col.primary().autoIncrement().unsigned();\n this.columns.push(col.getDefinition());\n return col;\n }\n\n /**\n * Add UUID column\n */\n uuid(name: string = \"id\"): ColumnBuilder {\n const col = new ColumnBuilder(name, \"uuid\");\n this.columns.push(col.getDefinition());\n return col;\n }\n\n /**\n * Add string column\n */\n string(name: string, length: number = 255): ColumnBuilder {\n const col = new ColumnBuilder(name, \"string\", length);\n this.columns.push(col.getDefinition());\n return col;\n }\n\n /**\n * Add text column\n */\n text(name: string): ColumnBuilder {\n const col = new ColumnBuilder(name, \"text\");\n this.columns.push(col.getDefinition());\n return col;\n }\n\n /**\n * Add integer column\n */\n integer(name: string): ColumnBuilder {\n const col = new ColumnBuilder(name, \"integer\");\n this.columns.push(col.getDefinition());\n return col;\n }\n\n /**\n * Add big integer column\n */\n bigInteger(name: string): ColumnBuilder {\n const col = new ColumnBuilder(name, \"bigInteger\");\n this.columns.push(col.getDefinition());\n return col;\n }\n\n /**\n * Add decimal column\n */\n decimal(\n name: string,\n precision: number = 10,\n scale: number = 2\n ): ColumnBuilder {\n const col = new ColumnBuilder(name, \"decimal\");\n this.columns.push(col.getDefinition());\n return col;\n }\n\n /**\n * Add float column\n */\n float(name: string): ColumnBuilder {\n const col = new ColumnBuilder(name, \"float\");\n this.columns.push(col.getDefinition());\n return col;\n }\n\n /**\n * Add double column\n */\n double(name: string): ColumnBuilder {\n const col = new ColumnBuilder(name, \"double\");\n this.columns.push(col.getDefinition());\n return col;\n }\n\n /**\n * Add boolean column\n */\n boolean(name: string): ColumnBuilder {\n const col = new ColumnBuilder(name, \"boolean\");\n this.columns.push(col.getDefinition());\n return col;\n }\n\n /**\n * Add date column\n */\n date(name: string): ColumnBuilder {\n const col = new ColumnBuilder(name, \"date\");\n this.columns.push(col.getDefinition());\n return col;\n }\n\n /**\n * Add datetime column\n */\n datetime(name: string): ColumnBuilder {\n const col = new ColumnBuilder(name, \"datetime\");\n this.columns.push(col.getDefinition());\n return col;\n }\n\n /**\n * Add timestamp column\n */\n timestamp(name: string): ColumnBuilder {\n const col = new ColumnBuilder(name, \"timestamp\");\n this.columns.push(col.getDefinition());\n return col;\n }\n\n /**\n * Add created_at and updated_at timestamps\n */\n timestamps(): void {\n this.timestamp(\"created_at\").nullable();\n this.timestamp(\"updated_at\").nullable();\n }\n\n /**\n * Add deleted_at timestamp for soft deletes\n */\n softDeletes(name: string = \"deleted_at\"): ColumnBuilder {\n return this.timestamp(name).nullable();\n }\n\n /**\n * Add JSON column\n */\n json(name: string): ColumnBuilder {\n const col = new ColumnBuilder(name, \"json\");\n this.columns.push(col.getDefinition());\n return col;\n }\n\n /**\n * Add enum column\n */\n enum(name: string, values: string[]): ColumnBuilder {\n const col = new ColumnBuilder(name, \"enum\");\n this.columns.push(col.getDefinition());\n return col;\n }\n\n /**\n * Add foreign key constraint\n */\n foreign(column: string): ForeignKeyBuilder {\n const fk = new ForeignKeyBuilder(column);\n this.foreignKeys.push(fk);\n return fk;\n }\n\n /**\n * Add index\n */\n index(columns: string | string[], name?: string): void {\n const cols = Array.isArray(columns) ? columns : [columns];\n this.indexes.push({ columns: cols, unique: false, name });\n }\n\n /**\n * Add unique index\n */\n unique(columns: string | string[], name?: string): void {\n const cols = Array.isArray(columns) ? columns : [columns];\n this.indexes.push({ columns: cols, unique: true, name });\n }\n\n /**\n * Set primary key\n */\n primary(columns: string | string[]): void {\n this.primaryKeys = Array.isArray(columns) ? columns : [columns];\n }\n\n /**\n * Get all columns\n */\n getColumns(): ColumnDefinition[] {\n return this.columns;\n }\n\n /**\n * Get table name\n */\n getTableName(): string {\n return this.tableName;\n }\n\n /**\n * Get indexes\n */\n getIndexes() {\n return this.indexes;\n }\n\n /**\n * Get foreign keys\n */\n getForeignKeys() {\n return this.foreignKeys;\n }\n}\n","import type { DatabaseAdapter } from \"../types\";\nimport { Blueprint } from \"./Blueprint\";\n\n/**\n * Schema - ArcnanJS schema builder\n * Provides fluent interface for creating and modifying database tables\n */\nexport class Schema {\n private static adapter: DatabaseAdapter;\n\n /**\n * Set the database adapter\n */\n static setAdapter(adapter: DatabaseAdapter): void {\n this.adapter = adapter;\n }\n\n /**\n * Create a new table\n */\n static async create(\n tableName: string,\n callback: (table: Blueprint) => void\n ): Promise<void> {\n const blueprint = new Blueprint(tableName);\n callback(blueprint);\n\n await this.adapter.createTable(tableName, blueprint.getColumns());\n }\n\n /**\n * Modify an existing table\n */\n static async table(\n tableName: string,\n callback: (table: Blueprint) => void\n ): Promise<void> {\n const blueprint = new Blueprint(tableName);\n callback(blueprint);\n\n // For now, this is a simplified implementation\n // In a full implementation, this would generate ALTER TABLE statements\n console.warn(\n \"Schema.table() is not fully implemented yet. Use migrations for complex alterations.\"\n );\n }\n\n /**\n * Drop a table\n */\n static async drop(tableName: string): Promise<void> {\n await this.adapter.dropTable(tableName);\n }\n\n /**\n * Drop a table if it exists\n */\n static async dropIfExists(tableName: string): Promise<void> {\n const exists = await this.hasTable(tableName);\n if (exists) {\n await this.drop(tableName);\n }\n }\n\n /**\n * Rename a table\n */\n static async rename(from: string, to: string): Promise<void> {\n // This would need to be implemented in the adapter\n throw new Error(\"Schema.rename() not yet implemented\");\n }\n\n /**\n * Check if a table exists\n */\n static async hasTable(tableName: string): Promise<boolean> {\n return await this.adapter.hasTable(tableName);\n }\n\n /**\n * Check if a column exists in a table\n */\n static async hasColumn(\n tableName: string,\n columnName: string\n ): Promise<boolean> {\n return await this.adapter.hasColumn(tableName, columnName);\n }\n\n /**\n * Get all tables\n */\n static async getTables(): Promise<string[]> {\n // This would need to be implemented in the adapter\n throw new Error(\"Schema.getTables() not yet implemented\");\n }\n\n /**\n * Get all columns for a table\n */\n static async getColumns(tableName: string): Promise<string[]> {\n // This would need to be implemented in the adapter\n throw new Error(\"Schema.getColumns() not yet implemented\");\n }\n}\n","import { dynamicRequire } from \"../../server/utils/dynamicRequire\";\nimport { Schema } from \"./Schema\";\n\n/**\n * Base Migration class\n * All migrations should extend this class and implement up() and down() methods\n */\nexport abstract class Migration {\n /**\n * Run the migration\n */\n abstract up(): Promise<void>;\n\n /**\n * Reverse the migration\n */\n abstract down(): Promise<void>;\n}\n\n/**\n * Migration status\n */\nexport interface MigrationStatus {\n name: string;\n batch: number;\n ranAt: Date;\n}\n\n/**\n * Migration record in database\n */\nexport interface MigrationRecord {\n id?: number;\n migration: string;\n batch: number;\n created_at?: Date;\n}\n\n/**\n * Migration Runner - executes migrations\n */\nexport class MigrationRunner {\n private adapter: any;\n private migrationsTable: string = \"migrations\";\n private migrationsPath: string;\n\n constructor(adapter: any, migrationsPath: string) {\n this.adapter = adapter;\n this.migrationsPath = migrationsPath;\n }\n\n /**\n * Ensure migrations table exists\n */\n private async ensureMigrationsTable(): Promise<void> {\n const exists = await Schema.hasTable(this.migrationsTable);\n if (!exists) {\n await Schema.create(this.migrationsTable, (table) => {\n table.id();\n table.string(\"migration\");\n table.integer(\"batch\");\n table.timestamp(\"created_at\").nullable();\n });\n }\n }\n\n /**\n * Get all ran migrations\n */\n private async getRanMigrations(): Promise<MigrationRecord[]> {\n await this.ensureMigrationsTable();\n return await this.adapter.select(this.migrationsTable, {\n orderBy: [{ column: \"batch\", direction: \"ASC\" }],\n });\n }\n\n /**\n * Get pending migrations\n */\n private async getPendingMigrations(): Promise<string[]> {\n const fs = await import(\"fs\");\n const path = await import(\"path\");\n\n const ranMigrations = await this.getRanMigrations();\n const ranNames = ranMigrations.map((m) => m.migration);\n\n const files = fs.readdirSync(this.migrationsPath);\n const migrationFiles = files\n .filter((f) => f.endsWith(\".ts\") || f.endsWith(\".js\"))\n .filter((f) => !ranNames.includes(f.replace(/\\.(ts|js)$/, \"\")))\n .sort();\n\n return migrationFiles;\n }\n\n /**\n * Run pending migrations\n */\n async run(): Promise<void> {\n const path = await import(\"path\");\n const pendingMigrations = await this.getPendingMigrations();\n\n if (pendingMigrations.length === 0) {\n console.log(\"No pending migrations\");\n return;\n }\n\n const ranMigrations = await this.getRanMigrations();\n const nextBatch =\n ranMigrations.length > 0\n ? Math.max(...ranMigrations.map((m) => m.batch)) + 1\n : 1;\n\n console.log(`Running ${pendingMigrations.length} migration(s)...`);\n\n for (const file of pendingMigrations) {\n const migrationPath = path.resolve(this.migrationsPath, file);\n const migrationName = file.replace(/\\.(ts|js)$/, \"\");\n\n try {\n // Dynamic import of migration\n const MigrationClass = await this.loadMigration(migrationPath);\n const migration = new MigrationClass();\n\n console.log(`Migrating: ${migrationName}`);\n await migration.up();\n\n // Record migration\n await this.adapter.insert(this.migrationsTable, {\n migration: migrationName,\n batch: nextBatch,\n created_at: new Date(),\n });\n\n console.log(`Migrated: ${migrationName}`);\n } catch (error) {\n console.error(`Failed to migrate ${migrationName}:`, error);\n throw error;\n }\n }\n\n console.log(\"Migrations completed successfully\");\n }\n\n /**\n * Rollback last batch of migrations\n */\n async rollback(steps: number = 1): Promise<void> {\n const ranMigrations = await this.getRanMigrations();\n\n if (ranMigrations.length === 0) {\n console.log(\"No migrations to rollback\");\n return;\n }\n\n const maxBatch = Math.max(...ranMigrations.map((m) => m.batch));\n const minBatch = maxBatch - steps + 1;\n\n const migrationsToRollback = ranMigrations\n .filter((m) => m.batch >= minBatch && m.batch <= maxBatch)\n .reverse();\n\n console.log(`Rolling back ${migrationsToRollback.length} migration(s)...`);\n\n const path = await import(\"path\");\n\n for (const record of migrationsToRollback) {\n const migrationPath = path.resolve(\n this.migrationsPath,\n `${record.migration}.ts`\n );\n\n try {\n const MigrationClass = await this.loadMigration(migrationPath);\n const migration = new MigrationClass();\n\n console.log(`Rolling back: ${record.migration}`);\n await migration.down();\n\n // Remove migration record\n await this.adapter.delete(this.migrationsTable, record.id);\n\n console.log(`Rolled back: ${record.migration}`);\n } catch (error) {\n console.error(`Failed to rollback ${record.migration}:`, error);\n throw error;\n }\n }\n\n console.log(\"Rollback completed successfully\");\n }\n\n /**\n * Reset all migrations\n */\n async reset(): Promise<void> {\n const ranMigrations = await this.getRanMigrations();\n const batches = Math.max(...ranMigrations.map((m) => m.batch));\n await this.rollback(batches);\n }\n\n /**\n * Reset and re-run all migrations\n */\n async fresh(): Promise<void> {\n await this.reset();\n await this.run();\n }\n\n /**\n * Get migration status\n */\n async status(): Promise<MigrationStatus[]> {\n const ranMigrations = await this.getRanMigrations();\n return ranMigrations.map((m) => ({\n name: m.migration,\n batch: m.batch,\n ranAt: m.created_at || new Date(),\n }));\n }\n\n /**\n * Load migration class from file\n */\n private async loadMigration(filePath: string): Promise<any> {\n // Use dynamic require to avoid webpack bundling\n const migrationModule = dynamicRequire(filePath);\n const MigrationClass = migrationModule.default || migrationModule;\n\n if (!MigrationClass || typeof MigrationClass !== \"function\") {\n throw new Error(\n `Migration file ${filePath} does not export a valid migration class`\n );\n }\n\n // Validate that it's a concrete class extending Migration\n // Check if the class has the required methods\n const instance = new MigrationClass();\n if (\n typeof instance.up !== \"function\" ||\n typeof instance.down !== \"function\"\n ) {\n throw new Error(\n `Migration class in ${filePath} must implement up() and down() methods`\n );\n }\n\n return MigrationClass;\n }\n}\n","import type { Faker } from \"@faker-js/faker\";\nimport { Model } from \"../Model\";\n\n/**\n * Base Factory class\n */\nexport abstract class Factory<T extends Model> {\n protected abstract model: new () => T;\n protected faker: Faker;\n\n constructor() {\n // We'll load faker dynamically to avoid bundling it if not used\n // But for type safety we declare it here\n this.faker = require(\"@faker-js/faker\").faker;\n }\n\n /**\n * Define the model's default state.\n */\n abstract definition(): Record<string, any>;\n\n /**\n * Create a new model instance with attributes.\n */\n make(attributes: Partial<T> = {}): T {\n const instance = new this.model();\n const defaults = this.definition();\n\n // Merge defaults with overrides\n const data = { ...defaults, ...attributes };\n\n // Fill model\n instance.fill(data);\n\n return instance;\n }\n\n /**\n * Create and save a new model instance.\n */\n async create(attributes: Partial<T> = {}): Promise<T> {\n const instance = this.make(attributes);\n await instance.save();\n return instance;\n }\n\n /**\n * Create multiple instances\n */\n async createMany(count: number, attributes: Partial<T> = {}): Promise<T[]> {\n const instances: T[] = [];\n for (let i = 0; i < count; i++) {\n instances.push(await this.create(attributes));\n }\n return instances;\n }\n}\n","/**\n * Base Seeder class\n */\nexport abstract class Seeder {\n /**\n * Run the database seeds.\n */\n abstract run(): Promise<void>;\n\n /**\n * Call another seeder\n */\n async call(SeederClass: new () => Seeder): Promise<void> {\n const seeder = new SeederClass();\n await seeder.run();\n }\n}\n"],"names":["dynamicRequire","id","__non_webpack_require__","eval","module","exports","require","__webpack_module_cache__","leafPrototypes","getProto","__webpack_require__","moduleId","cachedModule","undefined","__webpack_modules__","Object","getPrototypeOf","obj","t","value","mode","this","__esModule","then","ns","create","r","def","current","indexOf","getOwnPropertyNames","forEach","key","d","definition","o","defineProperty","enumerable","get","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","MongoAdapter","client","db","connect","config","MongoClient","url","host","port","auth","username","password","database","query","async","sql","params","Error","execute","close","disconnect","createTable","tableName","columns","createCollection","dropTable","collection","drop","hasTable","listCollections","name","toArray","length","hasColumn","columnName","select","table","options","filter","buildFilter","where","projection","buildProjection","cursor","find","project","orderBy","sort","order","column","direction","offset","skip","limit","map","doc","_id","rest","insert","data","result","insertOne","insertedId","update","normalizeId","$set","updateOne","updated","findOne","delete","deleteOne","deletedCount","beginTransaction","raw","command","JSON","parse","commit","rollback","clause","operator","$ne","$gt","$lt","$gte","$lte","$in","Array","isArray","$nin","$regex","RegExp","replace","includes","col","ObjectId","isValid","MySQLAdapter","pool","connection","_config$pool","mysql","createPool","user","waitForConnections","connectionLimit","max","queueLimit","bind","end","rows","mapType","type","unsigned","autoIncrement","nullable","default","formatValue","primary","unique","join","_result$","count","_result$2","_options$columns","joins","first","second","index","boolean","buildWhereCondition","push","keys","values","placeholders","k","insertId","affectedRows","getConnection","release","inPlaceholders","notInPlaceholders","string","text","integer","bigInteger","float","double","decimal","date","datetime","timestamp","json","uuid","toUpperCase","Date","toISOString","slice","String","PostgresAdapter","_config$pool2","Pool","ssl","min","exists","paramIndex","condition","_","i","rowCount","startIndex","Macroable","macro","macros","mixin","hasMacro","QueryBuilder","selectColumns","whereClauses","orderByClauses","joinClauses","constructor","adapter","super","orWhere","whereIn","whereNotIn","whereBetween","range","whereNull","whereNotNull","limitValue","offsetValue","leftJoin","rightJoin","eagerLoads","setModel","model","with","relations","results","eagerLoadRelations","models","hydrate","relationName","instance","relation","addEagerConstraints","relatedResults","match","pluck","row","sum","avg","paginate","page","perPage","total","currentPage","lastPage","Math","ceil","clone","cloned","Relation","parent","related","addConstraints","getQuery","BelongsTo","foreignKey","ownerKey","foreignValue","getAttribute","dictionary","setRelation","BelongsToMany","foreignPivotKey","relatedPivotKey","parentKey","relatedKey","performJoin","q","relatedTable","getTable","HasMany","localKey","localValue","HasOne","Model","attributes","original","fillable","guarded","hidden","visible","casts","dates","timestamps","createdAt","updatedAt","softDeletes","deletedAt","setAdapter","className","pluralize","snakeCase","all","primaryKey","findOrFail","fill","now","syncOriginal","destroy","firstOrCreate","entries","existing","updateOrCreate","isFillable","setAttribute","mutator","studly","castAttribute","accessor","isGetting","cast","parseInt","parseFloat","Boolean","stringify","save","forceDelete","restore","getDirty","dirty","isDirty","toJSON","hasOne","foreign","toLowerCase","local","newQuery","hasMany","belongsTo","owner","belongsToMany","pivotTable","guessPivotTable","foreignPivot","relatedPivot","relatedK","segments","getRelation","relationLoaded","str","endsWith","__","c","field","relatedCollection","from","localField","foreignField","as","pipeline","_this$adapter$buildFi","_this$adapter","$match","$lookup","let","localId","$expr","$eq","$project","$unwind","path","preserveNullAndEmptyArrays","$limit","aggregate","ColumnBuilder","getDefinition","ForeignKeyBuilder","references","referencedColumn","on","referencedTable","onDelete","action","onDeleteAction","onUpdate","onUpdateAction","toSQL","Blueprint","indexes","foreignKeys","primaryKeys","precision","scale","enum","fk","cols","getColumns","getTableName","getIndexes","getForeignKeys","Schema","callback","blueprint","console","warn","dropIfExists","rename","to","getTables","Migration","MigrationRunner","migrationsTable","migrationsPath","ensureMigrationsTable","getRanMigrations","getPendingMigrations","fs","ranNames","m","migration","readdirSync","f","run","pendingMigrations","log","ranMigrations","nextBatch","batch","file","migrationPath","resolve","migrationName","loadMigration","up","created_at","error","steps","maxBatch","minBatch","migrationsToRollback","reverse","record","down","reset","batches","fresh","status","ranAt","filePath","migrationModule","MigrationClass","Factory","faker","make","createMany","instances","Seeder","SeederClass","seeder"],"ignoreList":[],"sourceRoot":""}
@@ -0,0 +1 @@
1
+ export declare const handleDb: (args: string[]) => Promise<void>;
@@ -0,0 +1 @@
1
+ export declare const handleMake: (args: string[]) => Promise<void>;
@@ -0,0 +1 @@
1
+ export declare const handleMigrate: (args: string[]) => Promise<void>;
@@ -1 +1,2 @@
1
+ declare module "webpack-node-externals";
1
2
  export {};
package/dist/cli/index.js CHANGED
@@ -1,2 +1,2 @@
1
- (()=>{"use strict";var e={n:s=>{var o=s&&s.__esModule?()=>s.default:()=>s;return e.d(o,{a:o}),o},d:(s,o)=>{for(var r in o)e.o(o,r)&&!e.o(s,r)&&Object.defineProperty(s,r,{enumerable:!0,get:o[r]})},o:(e,s)=>Object.prototype.hasOwnProperty.call(e,s)},s={};const o=require("child_process"),r=require("path");var t=e.n(r);const n=require("webpack");var l=e.n(n);const i=require("clean-webpack-plugin"),a=require("html-webpack-plugin");var c=e.n(a);const d=require("mini-css-extract-plugin");var u=e.n(d);const p=require("webpack-node-externals");var m=e.n(p);const v=require("fs");var x=e.n(v);const g=process.cwd(),h=e=>require.resolve(e),b=e=>{const s=[".ts",".tsx",".js",".jsx"];for(const o of e)for(const e of s){const s=t().resolve(g,o+e);if(x().existsSync(s))return s;const r=t().resolve(g,o,"index"+e);if(x().existsSync(r))return r}const o=t().resolve(g,"src/example/client/index.tsx"),r=t().resolve(g,"src/example/server/index.ts");if(e.some(e=>e.includes("client"))&&x().existsSync(o))return o;if(e.some(e=>e.includes("server"))&&x().existsSync(r))return r;throw new Error(`Could not find entry point. Searched in: ${e.join(", ")}`)},f=()=>{const e=t().resolve(g,"src/views"),s=x().existsSync(e),o=t().resolve(__dirname,"../../node_modules/.cache/arcanajs/views-loader.js"),r=t().dirname(o);x().existsSync(r)||x().mkdirSync(r,{recursive:!0});const n=s?`module.exports = require.context('${e}', true, /\\.(tsx|jsx)$/);`:"module.exports = null;";return x().writeFileSync(o,n),o},y=()=>{const e="production"===process.env.NODE_ENV,s=f();return{mode:e?"production":"development",target:"web",entry:{client:b(["src/client","src/client/index","src/index","src/main"])},output:{path:t().resolve(g,"dist/public"),filename:e?"[name].[contenthash].bundle.js":"[name].bundle.js",publicPath:"/",assetModuleFilename:"assets/[hash][ext][query]"},resolve:{extensions:[".ts",".tsx",".js",".jsx"],alias:{"arcana-views":s}},resolveLoader:{modules:["node_modules",t().resolve(__dirname,"../../node_modules")]},module:{rules:[{test:/\.(ts|tsx|js|jsx)$/,exclude:/node_modules/,use:{loader:h("babel-loader"),options:{presets:[h("@babel/preset-env"),[h("@babel/preset-react"),{runtime:"automatic"}],h("@babel/preset-typescript")]}}},{test:/\.module\.css$/,use:[e?u().loader:h("style-loader"),{loader:h("css-loader"),options:{importLoaders:1,modules:{localIdentName:e?"[hash:base64:8]":"[path][name]__[local]--[hash:base64:5]",exportLocalsConvention:"camelCaseOnly"}}},{loader:h("postcss-loader"),options:{postcssOptions:{config:t().resolve(g,"postcss.config.js")}}}]},{test:/\.css$/,exclude:/\.module\.css$/,use:[e?u().loader:h("style-loader"),{loader:h("css-loader"),options:{importLoaders:1}},{loader:h("postcss-loader"),options:{postcssOptions:{config:t().resolve(g,"postcss.config.js")}}}]},{test:/\.(png|jpg|jpeg|gif|svg|woff|woff2|eot|ttf|otf)$/i,type:"asset/resource"}]},plugins:[new i.CleanWebpackPlugin,new(c())({templateContent:'<!DOCTYPE html>\n<html lang="en">\n <head>\n <meta charset="UTF-8" />\n <meta name="viewport" content="width=device-width, initial-scale=1.0" />\n \x3c!--HEAD_CONTENT--\x3e\n </head>\n <body>\n <div id="root">\x3c!--APP_CONTENT--\x3e</div>\n \x3c!--ARCANAJS_DATA_SCRIPT--\x3e\n </body>\n</html>',filename:"index.html",inject:"body",minify:!!e&&{removeComments:!1,collapseWhitespace:!0,removeRedundantAttributes:!0,useShortDoctype:!0,removeEmptyAttributes:!0,removeStyleLinkTypeAttributes:!0,keepClosingSlash:!0,minifyJS:!0,minifyCSS:!0,minifyURLs:!0}}),new(u())({filename:e?"[name].[contenthash].css":"[name].css"})],optimization:{splitChunks:{chunks:"all",cacheGroups:{defaultVendors:{test:/[\\/]node_modules[\\/]/,priority:-10,reuseExistingChunk:!0},default:{minChunks:2,priority:-20,reuseExistingChunk:!0},react:{test:/[\\/]node_modules[\\/](react|react-dom|scheduler)[\\/]/,name:"react-vendor",chunks:"all",priority:10}}}},performance:{maxEntrypointSize:512e3,maxAssetSize:512e3,hints:!!e&&"warning"},devtool:e?"source-map":"eval-source-map"}},w=()=>{const e="production"===process.env.NODE_ENV,s=b(["src/server","src/server/index","src/server/main"]),o=f();return{mode:e?"production":"development",target:"node",entry:s,output:{path:t().resolve(g,"dist"),filename:"server.js"},externals:[m()({allowlist:[/^arcanajs/]})],resolve:{extensions:[".ts",".tsx",".js",".jsx"],alias:{"arcana-views":o}},resolveLoader:{modules:["node_modules",t().resolve(__dirname,"../../node_modules")]},module:{rules:[{test:/\.(ts|tsx|js|jsx)$/,exclude:/node_modules/,use:{loader:h("babel-loader"),options:{presets:[h("@babel/preset-env"),[h("@babel/preset-react"),{runtime:"automatic"}],h("@babel/preset-typescript")]}}},{test:/\.module\.css$/,use:{loader:h("css-loader"),options:{modules:{localIdentName:e?"[hash:base64:8]":"[path][name]__[local]--[hash:base64:5]",exportLocalsConvention:"camelCaseOnly",exportOnlyLocals:!0}}}},{test:/\.css$/,exclude:/\.module\.css$/,use:h("null-loader")},{test:/\.(png|jpg|jpeg|gif|svg|woff|woff2|eot|ttf|otf)$/i,type:"asset/resource",generator:{emit:!1}}]},devtool:e?"source-map":"eval-source-map"}},_=require("ws"),S=process.argv.slice(2)[0];S||(console.error("Please specify a command: init, dev, build, start"),process.exit(1));const j=e=>new Promise((s,o)=>{e.run((e,r)=>e?(console.error(e),o(e)):r&&r.hasErrors()?(console.error(r.toString({colors:!0})),o(new Error("Webpack build failed"))):(console.log(null==r?void 0:r.toString({colors:!0})),void s()))});let E=null;const k=(e,s)=>{e.watch({},(e,o)=>{e?console.error(e):(console.log(null==o?void 0:o.toString({colors:!0})),o&&!o.hasErrors()&&s&&s())})};switch(S){case"build":(async()=>{process.env.NODE_ENV="production",console.log("Building for production...");const e=y(),s=w();try{await j(l()(e)),await j(l()(s)),console.log("Build complete.")}catch(e){console.error("Build failed:",e),process.exit(1)}})();break;case"dev":(async()=>{process.env.NODE_ENV="development",console.log("Starting development server...");const e=new _.WebSocketServer({port:3001});console.log("HMR Server running on port 3001");const s=()=>{e.clients.forEach(e=>{1===e.readyState&&e.send(JSON.stringify({type:"reload"}))})},r=y(),n=w();let i=!1,a=!1;const c=l()(n);c.hooks.invalid.tap("ArcanaJS",()=>{i=!0}),k(l()(r),()=>{console.log("Client build complete."),i?(console.log("Server is building. Waiting to reload..."),a=!0):(console.log("Reloading browsers..."),s())}),k(c,async()=>{var e;console.log("Server build complete. Restarting server..."),await(e=3001,new Promise(s=>{var r;E&&E.kill();const n=t().resolve(process.cwd(),"dist/server.js");E=(0,o.spawn)("node",[n],{stdio:["inherit","pipe","inherit"],env:{...process.env,ARCANA_HMR_PORT:e.toString()}}),null===(r=E.stdout)||void 0===r||r.on("data",e=>{process.stdout.write(e),e.toString().includes("Server is running")&&s()}),E.on("close",e=>{0!==e&&null!==e&&console.error(`Dev server exited with code ${e}`)})})),i=!1,a&&(console.log("Pending reload found. Reloading browsers..."),s(),a=!1)})})();break;case"start":(()=>{process.env.NODE_ENV="production";const e=t().resolve(process.cwd(),"dist/server.js");console.log(`Starting server at ${e}...`),(0,o.spawn)("node",[e],{stdio:"inherit"}).on("close",e=>{process.exit(e||0)})})();break;default:console.error(`Unknown command: ${S}`),process.exit(1)}var C=exports;for(var N in s)C[N]=s[N];s.__esModule&&Object.defineProperty(C,"__esModule",{value:!0})})();
1
+ (()=>{"use strict";var __webpack_modules__={14:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{__webpack_require__.r(__webpack_exports__),__webpack_require__.d(__webpack_exports__,{dynamicRequire:()=>dynamicRequire});const dynamicRequire=id=>"undefined"!=typeof require?require(id):eval("require")(id)},896:e=>{e.exports=require("fs")},916:e=>{e.exports=require("ts-node")},928:e=>{e.exports=require("path")}},__webpack_module_cache__={},leafPrototypes,getProto;function __webpack_require__(e){var t=__webpack_module_cache__[e];if(void 0!==t)return t.exports;var s=__webpack_module_cache__[e]={exports:{}};return __webpack_modules__[e](s,s.exports,__webpack_require__),s.exports}__webpack_require__.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return __webpack_require__.d(t,{a:t}),t},getProto=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,__webpack_require__.t=function(e,t){if(1&t&&(e=this(e)),8&t)return e;if("object"==typeof e&&e){if(4&t&&e.__esModule)return e;if(16&t&&"function"==typeof e.then)return e}var s=Object.create(null);__webpack_require__.r(s);var r={};leafPrototypes=leafPrototypes||[null,getProto({}),getProto([]),getProto(getProto)];for(var a=2&t&&e;("object"==typeof a||"function"==typeof a)&&!~leafPrototypes.indexOf(a);a=getProto(a))Object.getOwnPropertyNames(a).forEach(t=>r[t]=()=>e[t]);return r.default=()=>e,__webpack_require__.d(s,r),s},__webpack_require__.d=(e,t)=>{for(var s in t)__webpack_require__.o(t,s)&&!__webpack_require__.o(e,s)&&Object.defineProperty(e,s,{enumerable:!0,get:t[s]})},__webpack_require__.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),__webpack_require__.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var __webpack_exports__={};const external_child_process_namespaceObject=require("child_process");var external_path_=__webpack_require__(928),external_path_default=__webpack_require__.n(external_path_);const external_webpack_namespaceObject=require("webpack");var external_webpack_default=__webpack_require__.n(external_webpack_namespaceObject);const external_clean_webpack_plugin_namespaceObject=require("clean-webpack-plugin"),external_html_webpack_plugin_namespaceObject=require("html-webpack-plugin");var external_html_webpack_plugin_default=__webpack_require__.n(external_html_webpack_plugin_namespaceObject);const external_mini_css_extract_plugin_namespaceObject=require("mini-css-extract-plugin");var external_mini_css_extract_plugin_default=__webpack_require__.n(external_mini_css_extract_plugin_namespaceObject);const external_webpack_node_externals_namespaceObject=require("webpack-node-externals");var external_webpack_node_externals_default=__webpack_require__.n(external_webpack_node_externals_namespaceObject),external_fs_=__webpack_require__(896),external_fs_default=__webpack_require__.n(external_fs_);const cwd=process.cwd(),resolveLoader=e=>require.resolve(e),findEntry=e=>{const t=[".ts",".tsx",".js",".jsx"];for(const s of e)for(const e of t){const t=external_path_default().resolve(cwd,s+e);if(external_fs_default().existsSync(t))return t;const r=external_path_default().resolve(cwd,s,"index"+e);if(external_fs_default().existsSync(r))return r}const s=external_path_default().resolve(cwd,"src/example/client/index.tsx"),r=external_path_default().resolve(cwd,"src/example/server/index.ts");if(e.some(e=>e.includes("client"))&&external_fs_default().existsSync(s))return s;if(e.some(e=>e.includes("server"))&&external_fs_default().existsSync(r))return r;throw new Error(`Could not find entry point. Searched in: ${e.join(", ")}`)},getViewsLoaderPath=()=>{const e=external_path_default().resolve(cwd,"src/views"),t=external_fs_default().existsSync(e),s=external_path_default().resolve(__dirname,"../../node_modules/.cache/arcanajs/views-loader.js"),r=external_path_default().dirname(s);external_fs_default().existsSync(r)||external_fs_default().mkdirSync(r,{recursive:!0});const a=t?`module.exports = require.context('${e}', true, /\\.(tsx|jsx)$/);`:"module.exports = null;";return external_fs_default().writeFileSync(s,a),s},createClientConfig=()=>{const e="production"===process.env.NODE_ENV,t=getViewsLoaderPath();return{mode:e?"production":"development",target:"web",entry:{client:findEntry(["src/client","src/client/index","src/index","src/main"])},output:{path:external_path_default().resolve(cwd,"dist/public"),filename:e?"[name].[contenthash].bundle.js":"[name].bundle.js",publicPath:"/",assetModuleFilename:"assets/[hash][ext][query]"},resolve:{extensions:[".ts",".tsx",".js",".jsx"],alias:{"arcana-views":t}},resolveLoader:{modules:["node_modules",external_path_default().resolve(__dirname,"../../node_modules")]},module:{rules:[{test:/\.(ts|tsx|js|jsx)$/,exclude:/node_modules/,use:{loader:resolveLoader("babel-loader"),options:{presets:[resolveLoader("@babel/preset-env"),[resolveLoader("@babel/preset-react"),{runtime:"automatic"}],resolveLoader("@babel/preset-typescript")]}}},{test:/\.module\.css$/,use:[e?external_mini_css_extract_plugin_default().loader:resolveLoader("style-loader"),{loader:resolveLoader("css-loader"),options:{importLoaders:1,modules:{localIdentName:e?"[hash:base64:8]":"[path][name]__[local]--[hash:base64:5]",exportLocalsConvention:"camelCaseOnly"}}},{loader:resolveLoader("postcss-loader"),options:{postcssOptions:{config:external_path_default().resolve(cwd,"postcss.config.js")}}}]},{test:/\.css$/,exclude:/\.module\.css$/,use:[e?external_mini_css_extract_plugin_default().loader:resolveLoader("style-loader"),{loader:resolveLoader("css-loader"),options:{importLoaders:1}},{loader:resolveLoader("postcss-loader"),options:{postcssOptions:{config:external_path_default().resolve(cwd,"postcss.config.js")}}}]},{test:/\.(png|jpg|jpeg|gif|svg|woff|woff2|eot|ttf|otf)$/i,type:"asset/resource"}]},plugins:[new external_clean_webpack_plugin_namespaceObject.CleanWebpackPlugin,new(external_html_webpack_plugin_default())({templateContent:'<!DOCTYPE html>\n<html lang="en">\n <head>\n <meta charset="UTF-8" />\n <meta name="viewport" content="width=device-width, initial-scale=1.0" />\n \x3c!--HEAD_CONTENT--\x3e\n </head>\n <body>\n <div id="root">\x3c!--APP_CONTENT--\x3e</div>\n \x3c!--ARCANAJS_DATA_SCRIPT--\x3e\n </body>\n</html>',filename:"index.html",inject:"body",minify:!!e&&{removeComments:!1,collapseWhitespace:!0,removeRedundantAttributes:!0,useShortDoctype:!0,removeEmptyAttributes:!0,removeStyleLinkTypeAttributes:!0,keepClosingSlash:!0,minifyJS:!0,minifyCSS:!0,minifyURLs:!0}}),new(external_mini_css_extract_plugin_default())({filename:e?"[name].[contenthash].css":"[name].css"})],optimization:{splitChunks:{chunks:"all",cacheGroups:{defaultVendors:{test:/[\\/]node_modules[\\/]/,priority:-10,reuseExistingChunk:!0},default:{minChunks:2,priority:-20,reuseExistingChunk:!0},react:{test:/[\\/]node_modules[\\/](react|react-dom|scheduler)[\\/]/,name:"react-vendor",chunks:"all",priority:10}}}},performance:{maxEntrypointSize:512e3,maxAssetSize:512e3,hints:!!e&&"warning"},devtool:e?"source-map":"eval-source-map"}},createServerConfig=()=>{const e="production"===process.env.NODE_ENV,t=findEntry(["src/server","src/server/index","src/server/main"]),s=getViewsLoaderPath();return{mode:e?"production":"development",target:"node",entry:t,output:{path:external_path_default().resolve(cwd,"dist"),filename:"server.js"},externals:[external_webpack_node_externals_default()({allowlist:[/^arcanajs/]})],resolve:{extensions:[".ts",".tsx",".js",".jsx"],alias:{"arcana-views":s}},resolveLoader:{modules:["node_modules",external_path_default().resolve(__dirname,"../../node_modules")]},module:{rules:[{test:/\.(ts|tsx|js|jsx)$/,exclude:/node_modules/,use:{loader:resolveLoader("babel-loader"),options:{presets:[resolveLoader("@babel/preset-env"),[resolveLoader("@babel/preset-react"),{runtime:"automatic"}],resolveLoader("@babel/preset-typescript")]}}},{test:/\.module\.css$/,use:{loader:resolveLoader("css-loader"),options:{modules:{localIdentName:e?"[hash:base64:8]":"[path][name]__[local]--[hash:base64:5]",exportLocalsConvention:"camelCaseOnly",exportOnlyLocals:!0}}}},{test:/\.css$/,exclude:/\.module\.css$/,use:resolveLoader("null-loader")},{test:/\.(png|jpg|jpeg|gif|svg|woff|woff2|eot|ttf|otf)$/i,type:"asset/resource",generator:{emit:!1}}]},devtool:e?"source-map":"eval-source-map"}},external_ws_namespaceObject=require("ws");var dynamicRequire=__webpack_require__(14);class MySQLAdapter{pool=null;connection=null;async connect(e){var t;const s=(0,dynamicRequire.dynamicRequire)("mysql2/promise");return this.pool=s.createPool({host:e.host,port:e.port,database:e.database,user:e.username,password:e.password,waitForConnections:!0,connectionLimit:(null===(t=e.pool)||void 0===t?void 0:t.max)||10,queueLimit:0}),{query:this.query.bind(this),execute:this.execute.bind(this),close:this.disconnect.bind(this)}}async disconnect(){this.pool&&(await this.pool.end(),this.pool=null)}async query(e,t){if(!this.pool)throw new Error("Database not connected");const[s]=await this.pool.query(e,t);return s}async execute(e,t){if(!this.pool)throw new Error("Database not connected");const[s]=await this.pool.execute(e,t);return s}async createTable(e,t){const s=`CREATE TABLE IF NOT EXISTS \`${e}\` (${t.map(e=>{let t=`\`${e.name}\` ${this.mapType(e.type,e.length)}`;return e.unsigned&&(t+=" UNSIGNED"),e.autoIncrement&&(t+=" AUTO_INCREMENT"),e.nullable||(t+=" NOT NULL"),void 0!==e.default&&(t+=` DEFAULT ${this.formatValue(e.default)}`),e.primary&&(t+=" PRIMARY KEY"),e.unique&&(t+=" UNIQUE"),t}).join(", ")}) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci`;await this.execute(s)}async dropTable(e){await this.execute(`DROP TABLE IF EXISTS \`${e}\``)}async hasTable(e){var t;return(null===(t=(await this.query("SELECT COUNT(*) as count FROM information_schema.tables \n WHERE table_schema = DATABASE() AND table_name = ?",[e]))[0])||void 0===t?void 0:t.count)>0}async hasColumn(e,t){var s;return(null===(s=(await this.query("SELECT COUNT(*) as count FROM information_schema.columns \n WHERE table_schema = DATABASE() AND table_name = ? AND column_name = ?",[e,t]))[0])||void 0===s?void 0:s.count)>0}async select(e,t){var s;let r=`SELECT ${(null===(s=t.columns)||void 0===s?void 0:s.join(", "))||"*"} FROM \`${e}\``;const a=[];if(t.joins&&t.joins.length>0)for(const e of t.joins)r+=` ${e.type} JOIN \`${e.table}\` ON ${e.first} ${e.operator} ${e.second}`;return t.where&&t.where.length>0&&(r+=" "+t.where.map((e,t)=>`${0===t?"WHERE":e.boolean} ${this.buildWhereCondition(e,a)}`).join(" ")),t.orderBy&&t.orderBy.length>0&&(r+=` ORDER BY ${t.orderBy.map(e=>`\`${e.column}\` ${e.direction}`).join(", ")}`),t.limit&&(r+=" LIMIT ?",a.push(t.limit)),t.offset&&(r+=" OFFSET ?",a.push(t.offset)),await this.query(r,a)}async insert(e,t){const s=Object.keys(t),r=Object.values(t),a=r.map(()=>"?").join(", "),n=`INSERT INTO \`${e}\` (${s.map(e=>`\`${e}\``).join(", ")}) VALUES (${a})`;return{id:(await this.execute(n,r)).insertId,...t}}async update(e,t,s){const r=Object.keys(s),a=Object.values(s),n=`UPDATE \`${e}\` SET ${r.map(e=>`\`${e}\` = ?`).join(", ")} WHERE id = ?`;return await this.execute(n,[...a,t]),{id:t,...s}}async delete(e,t){const s=`DELETE FROM \`${e}\` WHERE id = ?`;return(await this.execute(s,[t])).affectedRows>0}async beginTransaction(){if(!this.pool)throw new Error("Database not connected");this.connection=await this.pool.getConnection(),await this.connection.beginTransaction()}async commit(){if(!this.connection)throw new Error("No active transaction");await this.connection.commit(),this.connection.release(),this.connection=null}async rollback(){if(!this.connection)throw new Error("No active transaction");await this.connection.rollback(),this.connection.release(),this.connection=null}async raw(e,t=[]){if(!this.pool)throw new Error("Database not connected");const[s]=await this.pool.execute(e,t);return s}buildWhereCondition(e,t){const s=`\`${e.column}\``;switch(e.operator){case"IN":const r=e.value.map(()=>"?").join(", ");return t.push(...e.value),`${s} IN (${r})`;case"NOT IN":const a=e.value.map(()=>"?").join(", ");return t.push(...e.value),`${s} NOT IN (${a})`;case"BETWEEN":return t.push(e.value[0],e.value[1]),`${s} BETWEEN ? AND ?`;case"IS NULL":return`${s} IS NULL`;case"IS NOT NULL":return`${s} IS NOT NULL`;default:return t.push(e.value),`${s} ${e.operator} ?`}}mapType(e,t){return{string:t?`VARCHAR(${t})`:"VARCHAR(255)",text:"TEXT",integer:"INT",bigInteger:"BIGINT",float:"FLOAT",double:"DOUBLE",decimal:"DECIMAL(10,2)",boolean:"TINYINT(1)",date:"DATE",datetime:"DATETIME",timestamp:"TIMESTAMP",json:"JSON",uuid:"CHAR(36)"}[e]||e.toUpperCase()}formatValue(e){return null===e?"NULL":"string"==typeof e?`'${e.replace(/'/g,"''")}'`:"boolean"==typeof e?e?"1":"0":e instanceof Date?`'${e.toISOString().slice(0,19).replace("T"," ")}'`:String(e)}}class PostgresAdapter{pool=null;client=null;async connect(e){var t,s;const{Pool:r}=(0,dynamicRequire.dynamicRequire)("pg");return this.pool=new r({host:e.host,port:e.port,database:e.database,user:e.username,password:e.password,ssl:e.ssl,min:(null===(t=e.pool)||void 0===t?void 0:t.min)||2,max:(null===(s=e.pool)||void 0===s?void 0:s.max)||10}),{query:this.query.bind(this),execute:this.execute.bind(this),close:this.disconnect.bind(this)}}async disconnect(){this.pool&&(await this.pool.end(),this.pool=null)}async query(e,t){if(!this.pool)throw new Error("Database not connected");return(await this.pool.query(e,t)).rows}async execute(e,t){if(!this.pool)throw new Error("Database not connected");return await this.pool.query(e,t)}async createTable(e,t){const s=`CREATE TABLE IF NOT EXISTS "${e}" (${t.map(e=>{let t=`"${e.name}" ${this.mapType(e.type,e.length)}`;return e.primary&&(t+=" PRIMARY KEY"),e.autoIncrement&&(t+=" GENERATED ALWAYS AS IDENTITY"),e.nullable||(t+=" NOT NULL"),e.unique&&(t+=" UNIQUE"),void 0!==e.default&&(t+=` DEFAULT ${this.formatValue(e.default)}`),t}).join(", ")})`;await this.execute(s)}async dropTable(e){await this.execute(`DROP TABLE IF EXISTS "${e}"`)}async hasTable(e){var t;return(null===(t=(await this.query("SELECT EXISTS (\n SELECT FROM information_schema.tables \n WHERE table_schema = 'public' \n AND table_name = $1\n )",[e]))[0])||void 0===t?void 0:t.exists)||!1}async hasColumn(e,t){var s;return(null===(s=(await this.query("SELECT EXISTS (\n SELECT FROM information_schema.columns \n WHERE table_schema = 'public' \n AND table_name = $1 \n AND column_name = $2\n )",[e,t]))[0])||void 0===s?void 0:s.exists)||!1}async select(e,t){var s;let r=`SELECT ${(null===(s=t.columns)||void 0===s?void 0:s.join(", "))||"*"} FROM "${e}"`;const a=[];let n=1;if(t.joins&&t.joins.length>0)for(const e of t.joins)r+=` ${e.type} JOIN "${e.table}" ON ${e.first} ${e.operator} ${e.second}`;return t.where&&t.where.length>0&&(r+=" "+t.where.map((e,t)=>{const s=0===t?"WHERE":e.boolean,r=this.buildWhereCondition(e,a,n);return n=a.length+1,`${s} ${r}`}).join(" ")),t.orderBy&&t.orderBy.length>0&&(r+=` ORDER BY ${t.orderBy.map(e=>`"${e.column}" ${e.direction}`).join(", ")}`),t.limit&&(r+=" LIMIT $"+n++,a.push(t.limit)),t.offset&&(r+=" OFFSET $"+n++,a.push(t.offset)),await this.query(r,a)}async insert(e,t){const s=Object.keys(t),r=Object.values(t),a=r.map((e,t)=>`$${t+1}`).join(", "),n=`INSERT INTO "${e}" (${s.map(e=>`"${e}"`).join(", ")}) \n VALUES (${a}) \n RETURNING *`;return(await this.query(n,r))[0]}async update(e,t,s){const r=Object.keys(s),a=Object.values(s),n=`UPDATE "${e}" SET ${r.map((e,t)=>`"${e}" = $${t+1}`).join(", ")} WHERE id = $${r.length+1} RETURNING *`;return(await this.query(n,[...a,t]))[0]}async delete(e,t){const s=`DELETE FROM "${e}" WHERE id = $1`;return(await this.execute(s,[t])).rowCount>0}async beginTransaction(){if(!this.pool)throw new Error("Database not connected");this.client=await this.pool.connect(),await this.client.query("BEGIN")}async commit(){if(!this.client)throw new Error("No active transaction");await this.client.query("COMMIT"),this.client.release(),this.client=null}async rollback(){if(!this.client)throw new Error("No active transaction");await this.client.query("ROLLBACK"),this.client.release(),this.client=null}async raw(e,t=[]){if(!this.pool)throw new Error("Database not connected");return(await this.pool.query(e,t)).rows}buildWhereCondition(e,t,s){const r=`"${e.column}"`;switch(e.operator){case"IN":const a=e.value.map((e,t)=>`$${s+t}`).join(", ");return t.push(...e.value),`${r} IN (${a})`;case"NOT IN":const n=e.value.map((e,t)=>`$${s+t}`).join(", ");return t.push(...e.value),`${r} NOT IN (${n})`;case"BETWEEN":return t.push(e.value[0],e.value[1]),`${r} BETWEEN $${s} AND $${s+1}`;case"IS NULL":return`${r} IS NULL`;case"IS NOT NULL":return`${r} IS NOT NULL`;default:return t.push(e.value),`${r} ${e.operator} $${s}`}}mapType(e,t){return{string:t?`VARCHAR(${t})`:"VARCHAR(255)",text:"TEXT",integer:"INTEGER",bigInteger:"BIGINT",float:"REAL",double:"DOUBLE PRECISION",decimal:"DECIMAL",boolean:"BOOLEAN",date:"DATE",datetime:"TIMESTAMP",timestamp:"TIMESTAMP",json:"JSONB",uuid:"UUID"}[e]||e.toUpperCase()}formatValue(e){return null===e?"NULL":"string"==typeof e?`'${e.replace(/'/g,"''")}'`:"boolean"==typeof e?e?"TRUE":"FALSE":e instanceof Date?`'${e.toISOString()}'`:String(e)}}class Macroable{static macros={};static macro(e,t){this.macros[e]=t,this.prototype[e]=t}static mixin(e){Object.keys(e).forEach(t=>{this.macro(t,e[t])})}static hasMacro(e){return!!this.macros[e]}}class QueryBuilder extends Macroable{selectColumns=["*"];whereClauses=[];orderByClauses=[];joinClauses=[];constructor(e,t){super(),this.tableName=e,this.adapter=t}select(...e){return this.selectColumns=e,this}where(e,t,s){return void 0===s&&(s=t,t="="),this.whereClauses.push({column:e,operator:t,value:s,boolean:"AND"}),this}orWhere(e,t,s){return void 0===s&&(s=t,t="="),this.whereClauses.push({column:e,operator:t,value:s,boolean:"OR"}),this}whereIn(e,t){return this.whereClauses.push({column:e,operator:"IN",value:t,boolean:"AND"}),this}whereNotIn(e,t){return this.whereClauses.push({column:e,operator:"NOT IN",value:t,boolean:"AND"}),this}whereBetween(e,t){return this.whereClauses.push({column:e,operator:"BETWEEN",value:t,boolean:"AND"}),this}whereNull(e){return this.whereClauses.push({column:e,operator:"IS NULL",value:null,boolean:"AND"}),this}whereNotNull(e){return this.whereClauses.push({column:e,operator:"IS NOT NULL",value:null,boolean:"AND"}),this}orderBy(e,t="ASC"){return this.orderByClauses.push({column:e,direction:t.toUpperCase()}),this}limit(e){return this.limitValue=e,this}offset(e){return this.offsetValue=e,this}join(e,t,s,r,a="INNER"){return this.joinClauses.push({type:a,table:e,first:t,operator:s,second:r}),this}leftJoin(e,t,s,r){return this.join(e,t,s,r,"LEFT")}rightJoin(e,t,s,r){return this.join(e,t,s,r,"RIGHT")}eagerLoads=[];setModel(e){return this.model=e,this}with(e){return Array.isArray(e)?this.eagerLoads.push(...e):this.eagerLoads.push(e),this}async get(){const e={columns:this.selectColumns,where:this.whereClauses,orderBy:this.orderByClauses,limit:this.limitValue,offset:this.offsetValue,joins:this.joinClauses},t=await this.adapter.select(this.tableName,e);return this.eagerLoads.length>0&&this.model?await this.eagerLoadRelations(t):t}async eagerLoadRelations(e){if(0===e.length)return e;const t=e.map(e=>this.model.hydrate(e));for(const e of this.eagerLoads){const s=new this.model;if("function"!=typeof s[e])throw new Error(`Relation ${e} does not exist on ${this.model.name}`);const r=s[e]();r.addEagerConstraints(t);const a=await r.get();r.match(t,a,e)}return t}async first(){return this.limit(1),(await this.get())[0]||null}async find(e){return this.where("id",e).first()}async count(){this.selectColumns=["COUNT(*) as count"];const e=await this.first();return e?e.count:0}async pluck(e){return this.select(e),(await this.get()).map(t=>t[e])}async sum(e){this.selectColumns=[`SUM(${e}) as sum`];const t=await this.first();return t&&t.sum||0}async avg(e){this.selectColumns=[`AVG(${e}) as avg`];const t=await this.first();return t&&t.avg||0}async min(e){this.selectColumns=[`MIN(${e}) as min`];const t=await this.first();return t?t.min:null}async max(e){this.selectColumns=[`MAX(${e}) as max`];const t=await this.first();return t?t.max:null}async exists(){return await this.count()>0}async paginate(e=1,t=15){const s=await this.count(),r=(e-1)*t;return this.limit(t).offset(r),{data:await this.get(),total:s,perPage:t,currentPage:e,lastPage:Math.ceil(s/t)}}clone(){const e=new QueryBuilder(this.tableName,this.adapter);return e.selectColumns=[...this.selectColumns],e.whereClauses=[...this.whereClauses],e.orderByClauses=[...this.orderByClauses],e.joinClauses=[...this.joinClauses],e.limitValue=this.limitValue,e.offsetValue=this.offsetValue,e}}class Relation{constructor(e,t){this.query=e,this.parent=t,this.related=e.model,this.addConstraints()}getQuery(){return this.query}async get(){return this.query.get()}async first(){return this.query.first()}}class BelongsTo extends Relation{constructor(e,t,s,r){super(e,t),this.foreignKey=s,this.ownerKey=r}addConstraints(){const e=this.parent.getAttribute(this.foreignKey);this.query.where(this.ownerKey,"=",e)}addEagerConstraints(e){const t=e.map(e=>e.getAttribute(this.foreignKey)).filter(e=>null!==e);this.query.whereIn(this.ownerKey,t)}match(e,t,s){const r={};return t.forEach(e=>{const t=e.getAttribute(this.ownerKey);r[t]=e}),e.forEach(e=>{const t=e.getAttribute(this.foreignKey);r[t]&&e.setRelation(s,r[t])}),e}}class BelongsToMany extends Relation{constructor(e,t,s,r,a,n,i){super(e,t),this.table=s,this.foreignPivotKey=r,this.relatedPivotKey=a,this.parentKey=n,this.relatedKey=i}addConstraints(){this.performJoin(),this.query.where(`${this.table}.${this.foreignPivotKey}`,"=",this.parent.getAttribute(this.parentKey))}performJoin(e){const t=e||this.query,s=this.related.prototype.getTable();return t.join(this.table,`${s}.${this.relatedKey}`,"=",`${this.table}.${this.relatedPivotKey}`),this}addEagerConstraints(e){this.performJoin();const t=e.map(e=>e.getAttribute(this.parentKey)).filter(e=>null!==e);this.query.whereIn(`${this.table}.${this.foreignPivotKey}`,t)}match(e,t,s){return e}}class HasMany extends Relation{constructor(e,t,s,r){super(e,t),this.foreignKey=s,this.localKey=r}addConstraints(){const e=this.parent.getAttribute(this.localKey);this.query.where(this.foreignKey,"=",e)}addEagerConstraints(e){const t=e.map(e=>e.getAttribute(this.localKey)).filter(e=>null!==e);this.query.whereIn(this.foreignKey,t)}match(e,t,s){const r={};return t.forEach(e=>{const t=e.getAttribute(this.foreignKey);r[t]||(r[t]=[]),r[t].push(e)}),e.forEach(e=>{const t=e.getAttribute(this.localKey);r[t]?e.setRelation(s,r[t]):e.setRelation(s,[])}),e}}class HasOne extends Relation{constructor(e,t,s,r){super(e,t),this.foreignKey=s,this.localKey=r}addConstraints(){const e=this.parent.getAttribute(this.localKey);this.query.where(this.foreignKey,"=",e)}addEagerConstraints(e){const t=e.map(e=>e.getAttribute(this.localKey)).filter(e=>null!==e);this.query.whereIn(this.foreignKey,t)}match(e,t,s){const r={};return t.forEach(e=>{const t=e.getAttribute(this.foreignKey);r[t]=e}),e.forEach(e=>{const t=e.getAttribute(this.localKey);r[t]&&e.setRelation(s,r[t])}),e}}class Model extends Macroable{static primaryKey="id";static connection="default";attributes={};original={};relations={};exists=!1;fillable=[];guarded=["id"];hidden=[];visible=[];casts={};dates=[];timestamps=!0;createdAt="created_at";updatedAt="updated_at";softDeletes=!1;deletedAt="deleted_at";static setAdapter(e){this.adapter=e}static getTable(){if(this.tableName)return this.tableName;const e=this.name;return this.pluralize(this.snakeCase(e))}static query(){return new QueryBuilder(this.getTable(),this.adapter)}static async all(){return(await this.query().get()).map(e=>this.hydrate(e))}static async find(e){const t=await this.query().where(this.primaryKey,e).first();return t?this.hydrate(t):null}static async findOrFail(e){const t=await this.find(e);if(!t)throw new Error(`Model not found with ${this.primaryKey}: ${e}`);return t}static where(e,t,s){return this.query().where(e,t,s)}static async create(e){const t=new this;if(t.fill(e),t.timestamps){const e=new Date;t.attributes[t.createdAt]=e,t.attributes[t.updatedAt]=e}const s=await this.adapter.insert(this.getTable(),t.attributes),r=s[this.primaryKey]||s.id||s.insertId;return t.attributes[this.primaryKey]=r,"id"!==this.primaryKey&&(t.attributes.id=r),t.exists=!0,t.syncOriginal(),t}static async update(e,t){const s=await this.findOrFail(e);return await s.update(t),s}static async destroy(e){const t=await this.find(e);return!!t&&await t.delete()}static async firstOrCreate(e,t={}){const s=this.query();for(const[t,r]of Object.entries(e))s.where(t,r);const r=await s.first();return r?this.hydrate(r):await this.create({...e,...t})}static async updateOrCreate(e,t={}){const s=this.query();for(const[t,r]of Object.entries(e))s.where(t,r);const r=await s.first();if(r){const e=this.hydrate(r);return await e.update(t),e}return await this.create({...e,...t})}static hydrate(e){const t=new this;return t.attributes={...e},t.original={...e},t.exists=!0,t}fill(e){for(const[t,s]of Object.entries(e))this.isFillable(t)&&this.setAttribute(t,s);return this}isFillable(e){return this.fillable.length>0?this.fillable.includes(e):!this.guarded.includes(e)}setAttribute(e,t){const s=`set${this.studly(e)}Attribute`;"function"==typeof this[s]&&(t=this[s](t)),this.attributes[e]=this.castAttribute(e,t)}getAttribute(e){const t=`get${this.studly(e)}Attribute`;if("function"==typeof this[t])return this[t]();const s=this.attributes[e];return this.castAttribute(e,s,!0)}castAttribute(e,t,s=!1){if(null==t)return t;const r=this.casts[e];if(!r)return t;if(s)switch(r){case"int":case"integer":return parseInt(t);case"float":case"double":return parseFloat(t);case"string":return String(t);case"bool":case"boolean":return Boolean(t);case"array":case"json":return"string"==typeof t?JSON.parse(t):t;case"date":case"datetime":return t instanceof Date?t:new Date(t);default:return t}else switch(r){case"array":case"json":return"object"==typeof t?JSON.stringify(t):t;case"date":case"datetime":return t instanceof Date?t:new Date(t);default:return t}}async save(){const e=this.constructor;if(this.timestamps){const e=new Date;this.exists||(this.attributes[this.createdAt]=e),this.attributes[this.updatedAt]=e}if(this.exists){const t=this.attributes[e.primaryKey];await e.adapter.update(e.getTable(),t,this.attributes)}else{const t=await e.adapter.insert(e.getTable(),this.attributes),s=t[e.primaryKey]||t.id||t.insertId;this.attributes[e.primaryKey]=s,"id"!==e.primaryKey&&(this.attributes.id=s),this.exists=!0}return this.syncOriginal(),this}async update(e){return this.fill(e),await this.save()}async delete(){const e=this.constructor;if(this.softDeletes)return this.attributes[this.deletedAt]=new Date,await this.save(),!0;const t=this.attributes[e.primaryKey];return await e.adapter.delete(e.getTable(),t)}async forceDelete(){const e=this.constructor,t=this.attributes[e.primaryKey];return await e.adapter.delete(e.getTable(),t)}async restore(){return this.softDeletes&&(this.attributes[this.deletedAt]=null,await this.save()),this}syncOriginal(){this.original={...this.attributes}}getDirty(){const e={};for(const[t,s]of Object.entries(this.attributes))this.original[t]!==s&&(e[t]=s);return e}isDirty(){return Object.keys(this.getDirty()).length>0}constructor(e={}){super(),this.fill(e)}toJSON(){const e={};for(const[t,s]of Object.entries(this.attributes))this.hidden.includes(t)||this.visible.length>0&&!this.visible.includes(t)||(e[t]=this.getAttribute(t));for(const[t,s]of Object.entries(this.relations))e[t]=s;return e}hasOne(e,t,s){const r=new e,a=t||`${this.constructor.name.toLowerCase()}_id`,n=s||"id";return new HasOne(r.newQuery(),this,a,n)}hasMany(e,t,s){const r=new e,a=t||`${this.constructor.name.toLowerCase()}_id`,n=s||"id";return new HasMany(r.newQuery(),this,a,n)}belongsTo(e,t,s){const r=new e,a=t||`${r.constructor.name.toLowerCase()}_id`,n=s||"id";return new BelongsTo(r.newQuery(),this,a,n)}belongsToMany(e,t,s,r,a,n){const i=new e,o=t||this.guessPivotTable(i),l=s||`${this.constructor.name.toLowerCase()}_id`,c=r||`${i.constructor.name.toLowerCase()}_id`,u=a||"id",d=n||"id";return new BelongsToMany(i.newQuery(),this,o,l,c,u,d)}guessPivotTable(e){const t=[this.constructor.name.toLowerCase(),e.constructor.name.toLowerCase()];return t.sort(),t.join("_")}static with(e){return this.query().with(e)}setRelation(e,t){return this.relations[e]=t,this}getRelation(e){return this.relations[e]}relationLoaded(e){return void 0!==this.relations[e]}newQuery(){return this.constructor.query()}static snakeCase(e){return e.replace(/([A-Z])/g,"_$1").toLowerCase().replace(/^_/,"")}static pluralize(e){return e.endsWith("y")?e.slice(0,-1)+"ies":e.endsWith("s")?e+"es":e+"s"}studly(e){return e.replace(/(^|_)(\w)/g,(e,t,s)=>s.toUpperCase())}}const handleDb=async e=>{const t=e[0];"db:seed"!==t&&(console.error(`Unknown db command: ${t}`),process.exit(1));const s=external_path_default().resolve(process.cwd(),"database/config.ts");try{__webpack_require__(916).register({transpileOnly:!0,compilerOptions:{module:"commonjs"}})}catch(e){}const{dynamicRequire:r}=__webpack_require__(14);let a,n;try{const e=r(s);a=e.default||e.databaseConfig||e}catch(e){console.error("Failed to load database config:",e),process.exit(1)}"postgres"===a.type?n=new PostgresAdapter:"mysql"===a.type?n=new MySQLAdapter:(console.error(`Unsupported database type: ${a.type}`),process.exit(1));try{await n.connect(a),Model.setAdapter(n);const e=r(external_path_default().resolve(process.cwd(),"database/seeders/DatabaseSeeder.ts")),t=e.default||e.DatabaseSeeder;if(!t)throw new Error("DatabaseSeeder not found");console.log("Seeding database...");const s=new t;await s.run(),console.log("Database seeded successfully")}catch(e){console.error("Seeding failed:",e),process.exit(1)}finally{await n.disconnect()}},handleMake=async e=>{const t=e[0].split(":")[1],s=e[1];switch(s||(console.error(`Please specify a name for the ${t}`),process.exit(1)),t){case"model":await makeModel(s);break;case"controller":await makeController(s);break;case"migration":await makeMigration(s);break;case"seeder":await makeSeeder(s);break;case"factory":await makeFactory(s);break;default:console.error(`Unknown make command: make:${t}`),process.exit(1)}},makeModel=async e=>{const t=`import { Model } from 'arcanajs/arcanox'\n\nexport class ${e} extends Model {\n // protected table = '${e.toLowerCase()}s'\n protected fillable = []\n}\n\nexport default ${e}\n`;await writeFile("app/Models",`${e}.ts`,t)},makeController=async e=>{const t=`import type { Request, Response } from 'express'\n\nexport class ${e} {\n async index(req: Request, res: Response) {\n //\n }\n\n async show(req: Request, res: Response) {\n //\n }\n\n async store(req: Request, res: Response) {\n //\n }\n\n async update(req: Request, res: Response) {\n //\n }\n\n async destroy(req: Request, res: Response) {\n //\n }\n}\n\nexport default ${e}\n`;await writeFile("app/Controllers",`${e}.ts`,t)},makeMigration=async e=>{const t=`${(new Date).toISOString().replace(/[-T:.Z]/g,"").slice(0,14)}_${e}.ts`,s=`import { Migration, Schema } from 'arcanajs/arcanox'\n\nexport class ${toPascalCase(e)} extends Migration {\n async up() {\n // await Schema.create('table_name', (table) => {\n // table.id()\n // table.timestamps()\n // })\n }\n\n async down() {\n // await Schema.dropIfExists('table_name')\n }\n}\n\nexport default ${toPascalCase(e)}\n`;await writeFile("database/migrations",t,s)},makeSeeder=async e=>{const t=`import { Seeder } from 'arcanajs/arcanox'\n\nexport class ${e} extends Seeder {\n async run() {\n //\n }\n}\n\nexport default ${e}\n`;await writeFile("database/seeders",`${e}.ts`,t)},makeFactory=async e=>{const t=e.replace("Factory",""),s=`import { Factory } from 'arcanajs/arcanox'\nimport { ${t} } from '../../app/Models/${t}'\n\nexport class ${e} extends Factory<${t}> {\n protected model = ${t}\n\n definition() {\n return {\n //\n }\n }\n}\n\nexport default ${e}\n`;await writeFile("database/factories",`${e}.ts`,s)},writeFile=async(e,t,s)=>{const r=external_path_default().resolve(process.cwd(),e),a=external_path_default().join(r,t);external_fs_default().existsSync(r)||external_fs_default().mkdirSync(r,{recursive:!0}),external_fs_default().existsSync(a)&&(console.error(`File already exists: ${a}`),process.exit(1)),external_fs_default().writeFileSync(a,s),console.log(`Created: ${external_path_default().join(e,t)}`)},toPascalCase=e=>e.replace(/(^|_)(\w)/g,(e,t,s)=>s.toUpperCase());class ColumnBuilder{constructor(e,t,s){this.definition={name:e,type:t,length:s,nullable:!1}}nullable(){return this.definition.nullable=!0,this}default(e){return this.definition.default=e,this}unique(){return this.definition.unique=!0,this}primary(){return this.definition.primary=!0,this}autoIncrement(){return this.definition.autoIncrement=!0,this}unsigned(){return this.definition.unsigned=!0,this}getDefinition(){return this.definition}}class ForeignKeyBuilder{constructor(e){this.column=e}references(e){return this.referencedColumn=e,this}on(e){return this.referencedTable=e,this}onDelete(e){return this.onDeleteAction=e,this}onUpdate(e){return this.onUpdateAction=e,this}toSQL(){if(!this.referencedTable||!this.referencedColumn)throw new Error("Foreign key must reference a table and column");let e=`FOREIGN KEY (${this.column}) REFERENCES ${this.referencedTable}(${this.referencedColumn})`;return this.onDeleteAction&&(e+=` ON DELETE ${this.onDeleteAction}`),this.onUpdateAction&&(e+=` ON UPDATE ${this.onUpdateAction}`),e}}class Blueprint{columns=[];indexes=[];foreignKeys=[];primaryKeys=[];constructor(e){this.tableName=e}id(e="id"){const t=new ColumnBuilder(e,"bigInteger");return t.primary().autoIncrement().unsigned(),this.columns.push(t.getDefinition()),t}uuid(e="id"){const t=new ColumnBuilder(e,"uuid");return this.columns.push(t.getDefinition()),t}string(e,t=255){const s=new ColumnBuilder(e,"string",t);return this.columns.push(s.getDefinition()),s}text(e){const t=new ColumnBuilder(e,"text");return this.columns.push(t.getDefinition()),t}integer(e){const t=new ColumnBuilder(e,"integer");return this.columns.push(t.getDefinition()),t}bigInteger(e){const t=new ColumnBuilder(e,"bigInteger");return this.columns.push(t.getDefinition()),t}decimal(e,t=10,s=2){const r=new ColumnBuilder(e,"decimal");return this.columns.push(r.getDefinition()),r}float(e){const t=new ColumnBuilder(e,"float");return this.columns.push(t.getDefinition()),t}double(e){const t=new ColumnBuilder(e,"double");return this.columns.push(t.getDefinition()),t}boolean(e){const t=new ColumnBuilder(e,"boolean");return this.columns.push(t.getDefinition()),t}date(e){const t=new ColumnBuilder(e,"date");return this.columns.push(t.getDefinition()),t}datetime(e){const t=new ColumnBuilder(e,"datetime");return this.columns.push(t.getDefinition()),t}timestamp(e){const t=new ColumnBuilder(e,"timestamp");return this.columns.push(t.getDefinition()),t}timestamps(){this.timestamp("created_at").nullable(),this.timestamp("updated_at").nullable()}softDeletes(e="deleted_at"){return this.timestamp(e).nullable()}json(e){const t=new ColumnBuilder(e,"json");return this.columns.push(t.getDefinition()),t}enum(e,t){const s=new ColumnBuilder(e,"enum");return this.columns.push(s.getDefinition()),s}foreign(e){const t=new ForeignKeyBuilder(e);return this.foreignKeys.push(t),t}index(e,t){const s=Array.isArray(e)?e:[e];this.indexes.push({columns:s,unique:!1,name:t})}unique(e,t){const s=Array.isArray(e)?e:[e];this.indexes.push({columns:s,unique:!0,name:t})}primary(e){this.primaryKeys=Array.isArray(e)?e:[e]}getColumns(){return this.columns}getTableName(){return this.tableName}getIndexes(){return this.indexes}getForeignKeys(){return this.foreignKeys}}class Schema{static setAdapter(e){this.adapter=e}static async create(e,t){const s=new Blueprint(e);t(s),await this.adapter.createTable(e,s.getColumns())}static async table(e,t){t(new Blueprint(e)),console.warn("Schema.table() is not fully implemented yet. Use migrations for complex alterations.")}static async drop(e){await this.adapter.dropTable(e)}static async dropIfExists(e){await this.hasTable(e)&&await this.drop(e)}static async rename(e,t){throw new Error("Schema.rename() not yet implemented")}static async hasTable(e){return await this.adapter.hasTable(e)}static async hasColumn(e,t){return await this.adapter.hasColumn(e,t)}static async getTables(){throw new Error("Schema.getTables() not yet implemented")}static async getColumns(e){throw new Error("Schema.getColumns() not yet implemented")}}class Migration{}class MigrationRunner{migrationsTable="migrations";constructor(e,t){this.adapter=e,this.migrationsPath=t}async ensureMigrationsTable(){await Schema.hasTable(this.migrationsTable)||await Schema.create(this.migrationsTable,e=>{e.id(),e.string("migration"),e.integer("batch"),e.timestamp("created_at").nullable()})}async getRanMigrations(){return await this.ensureMigrationsTable(),await this.adapter.select(this.migrationsTable,{orderBy:[{column:"batch",direction:"ASC"}]})}async getPendingMigrations(){const e=await Promise.resolve().then(__webpack_require__.t.bind(__webpack_require__,896,23)),t=(await Promise.resolve().then(__webpack_require__.t.bind(__webpack_require__,928,23)),(await this.getRanMigrations()).map(e=>e.migration));return e.readdirSync(this.migrationsPath).filter(e=>e.endsWith(".ts")||e.endsWith(".js")).filter(e=>!t.includes(e.replace(/\.(ts|js)$/,""))).sort()}async run(){const e=await Promise.resolve().then(__webpack_require__.t.bind(__webpack_require__,928,23)),t=await this.getPendingMigrations();if(0===t.length)return void console.log("No pending migrations");const s=await this.getRanMigrations(),r=s.length>0?Math.max(...s.map(e=>e.batch))+1:1;console.log(`Running ${t.length} migration(s)...`);for(const s of t){const t=e.resolve(this.migrationsPath,s),a=s.replace(/\.(ts|js)$/,"");try{const e=new(await this.loadMigration(t));console.log(`Migrating: ${a}`),await e.up(),await this.adapter.insert(this.migrationsTable,{migration:a,batch:r,created_at:new Date}),console.log(`Migrated: ${a}`)}catch(e){throw console.error(`Failed to migrate ${a}:`,e),e}}console.log("Migrations completed successfully")}async rollback(e=1){const t=await this.getRanMigrations();if(0===t.length)return void console.log("No migrations to rollback");const s=Math.max(...t.map(e=>e.batch)),r=s-e+1,a=t.filter(e=>e.batch>=r&&e.batch<=s).reverse();console.log(`Rolling back ${a.length} migration(s)...`);const n=await Promise.resolve().then(__webpack_require__.t.bind(__webpack_require__,928,23));for(const e of a){const t=n.resolve(this.migrationsPath,`${e.migration}.ts`);try{const s=new(await this.loadMigration(t));console.log(`Rolling back: ${e.migration}`),await s.down(),await this.adapter.delete(this.migrationsTable,e.id),console.log(`Rolled back: ${e.migration}`)}catch(t){throw console.error(`Failed to rollback ${e.migration}:`,t),t}}console.log("Rollback completed successfully")}async reset(){const e=await this.getRanMigrations(),t=Math.max(...e.map(e=>e.batch));await this.rollback(t)}async fresh(){await this.reset(),await this.run()}async status(){return(await this.getRanMigrations()).map(e=>({name:e.migration,batch:e.batch,ranAt:e.created_at||new Date}))}async loadMigration(e){const t=(0,dynamicRequire.dynamicRequire)(e),s=t.default||t;if(!s||"function"!=typeof s)throw new Error(`Migration file ${e} does not export a valid migration class`);const r=new s;if("function"!=typeof r.up||"function"!=typeof r.down)throw new Error(`Migration class in ${e} must implement up() and down() methods`);return s}}const handleMigrate=async e=>{const t=e[0],s=external_path_default().resolve(process.cwd(),"database/config.ts"),{dynamicRequire:r}=__webpack_require__(14);try{r("ts-node").register({transpileOnly:!0,compilerOptions:{module:"commonjs"}})}catch(e){}let a,n;try{const e=r(s);a=e.default||e.databaseConfig||e}catch(e){console.error("Failed to load database config:",e),process.exit(1)}"postgres"===a.type?n=new PostgresAdapter:"mysql"===a.type?n=new MySQLAdapter:(console.error(`Unsupported database type: ${a.type}`),process.exit(1));try{await n.connect(a);const e=external_path_default().resolve(process.cwd(),"database/migrations"),s=new MigrationRunner(n,e);switch(t){case"migrate":await s.run();break;case"migrate:rollback":await s.rollback();break;case"migrate:reset":await s.reset();break;case"migrate:fresh":await s.fresh();break;case"migrate:status":const e=await s.status();console.table(e);break;default:console.error(`Unknown migrate command: ${t}`),process.exit(1)}}catch(e){console.error("Migration failed:",e),process.exit(1)}finally{await n.disconnect()}},args=process.argv.slice(2),command=args[0];command||(console.error("Please specify a command: init, dev, build, start"),process.exit(1));const runCompiler=e=>new Promise((t,s)=>{e.run((e,r)=>e?(console.error(e),s(e)):r&&r.hasErrors()?(console.error(r.toString({colors:!0})),s(new Error("Webpack build failed"))):(console.log(null==r?void 0:r.toString({colors:!0})),void t()))});let serverProcess=null;const startDevServer=e=>new Promise(t=>{var s;serverProcess&&serverProcess.kill();const r=external_path_default().resolve(process.cwd(),"dist/server.js");serverProcess=(0,external_child_process_namespaceObject.spawn)("node",[r],{stdio:["inherit","pipe","inherit"],env:{...process.env,ARCANA_HMR_PORT:e.toString()}}),null===(s=serverProcess.stdout)||void 0===s||s.on("data",e=>{process.stdout.write(e),e.toString().includes("Server is running")&&t()}),serverProcess.on("close",e=>{0!==e&&null!==e&&console.error(`Dev server exited with code ${e}`)})}),watchCompiler=(e,t)=>{e.watch({},(e,s)=>{e?console.error(e):(console.log(null==s?void 0:s.toString({colors:!0})),s&&!s.hasErrors()&&t&&t())})},build=async()=>{process.env.NODE_ENV="production",console.log("Building for production...");const e=createClientConfig(),t=createServerConfig();try{await runCompiler(external_webpack_default()(e)),await runCompiler(external_webpack_default()(t)),console.log("Build complete.")}catch(e){console.error("Build failed:",e),process.exit(1)}},dev=async()=>{process.env.NODE_ENV="development",console.log("Starting development server...");const e=new external_ws_namespaceObject.WebSocketServer({port:3001});console.log("HMR Server running on port 3001");const t=()=>{e.clients.forEach(e=>{1===e.readyState&&e.send(JSON.stringify({type:"reload"}))})},s=createClientConfig(),r=createServerConfig();let a=!1,n=!1;const i=external_webpack_default()(r);i.hooks.invalid.tap("ArcanaJS",()=>{a=!0}),watchCompiler(external_webpack_default()(s),()=>{console.log("Client build complete."),a?(console.log("Server is building. Waiting to reload..."),n=!0):(console.log("Reloading browsers..."),t())}),watchCompiler(i,async()=>{console.log("Server build complete. Restarting server..."),await startDevServer(3001),a=!1,n&&(console.log("Pending reload found. Reloading browsers..."),t(),n=!1)})},start=()=>{process.env.NODE_ENV="production";const e=external_path_default().resolve(process.cwd(),"dist/server.js");console.log(`Starting server at ${e}...`),(0,external_child_process_namespaceObject.spawn)("node",[e],{stdio:"inherit"}).on("close",e=>{process.exit(e||0)})};switch(command){case"build":build();break;case"dev":dev();break;case"start":start();break;default:command.startsWith("make:")?handleMake(args):command.startsWith("migrate")?handleMigrate(args):command.startsWith("db:")?handleDb(args):(console.error(`Unknown command: ${command}`),process.exit(1))}var __webpack_export_target__=exports;for(var __webpack_i__ in __webpack_exports__)__webpack_export_target__[__webpack_i__]=__webpack_exports__[__webpack_i__];__webpack_exports__.__esModule&&Object.defineProperty(__webpack_export_target__,"__esModule",{value:!0})})();
2
2
  //# sourceMappingURL=index.js.map