@mobtakronio/schemakit
Version:
Dynamic entity management system with runtime schema creation, validation, and CRUD operations for Node.js backends.
1 lines • 91.1 kB
JavaScript
var Q=Object.defineProperty;var Je=Object.getOwnPropertyDescriptor;var Ye=Object.getOwnPropertyNames;var Ge=Object.prototype.hasOwnProperty;var l=(s,t)=>Q(s,"name",{value:t,configurable:!0});var $=(s,t)=>()=>(s&&(t=s(s=0)),t);var ve=(s,t)=>{for(var e in t)Q(s,e,{get:t[e],enumerable:!0})},Ze=(s,t,e,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of Ye(t))!Ge.call(s,r)&&r!==e&&Q(s,r,{get:()=>t[r],enumerable:!(n=Je(t,r))||n.enumerable});return s};var qe=s=>Ze(Q({},"__esModule",{value:!0}),s);var ce,b,q,Le,L,ke,k,Fe,F,Me,M,ze,z,Ue,U,m,S=$(()=>{"use strict";ce=class ce extends Error{constructor(t,e={}){super(t),this.name="SchemaKitError",this.code=e.code||"UNEXPECTED_ERROR",e.cause!==void 0&&(this.cause=e.cause),e.context&&(this.context=e.context)}toJSON(){return{name:this.name,message:this.message,code:this.code,context:this.context,stack:this.stack,cause:this.cause instanceof Error?typeof this.cause.toJSON=="function"?this.cause.toJSON():{name:this.cause.name,message:this.cause.message,stack:this.cause.stack}:this.cause}}getContext(){return this.context||{}}};l(ce,"SchemaKitError");b=ce,q=class q extends b{constructor(t,e,n={}){super("Validation failed",{code:q.ERROR_CODE,cause:n.cause,context:{entityName:e,errorCount:t.length,...n.context}}),this.name="ValidationError",this.entityName=e,this.errors=t}};l(q,"ValidationError"),q.ERROR_CODE="VALIDATION_FAILED";Le=q,L=class L extends b{constructor(t,e,n={}){super(t,{code:L.ERROR_CODE,cause:n.cause,context:{entityName:e,...n.context}}),this.name="SchemaError",this.entityName=e}};l(L,"SchemaError"),L.ERROR_CODE="SCHEMA_ERROR";ke=L,k=class k extends b{constructor(t,e,n={}){super(`Entity ${t} with id ${e} not found`,{code:k.ERROR_CODE,cause:n.cause,context:{entityName:t,id:e,...n.context}}),this.name="EntityNotFoundError",this.entityName=t,this.id=e}};l(k,"EntityNotFoundError"),k.ERROR_CODE="NOT_FOUND";Fe=k,F=class F extends b{constructor(t,e,n={}){super(`Permission denied for ${t} on ${e}`,{code:F.ERROR_CODE,cause:n.cause,context:{action:t,entityName:e,...n.context}}),this.name="PermissionError",this.action=t,this.entityName=e}};l(F,"PermissionError"),F.ERROR_CODE="PERMISSION_DENIED";Me=F,M=class M extends b{constructor(t,e,n={}){super(`Workflow ${t} failed at action ${e}`,{code:M.ERROR_CODE,cause:n.cause,context:{workflowName:t,action:e,...n.context}}),this.name="WorkflowError",this.workflowName=t,this.action=e}};l(M,"WorkflowError"),M.ERROR_CODE="WORKFLOW_ERROR";ze=M,z=class z extends b{constructor(t,e={}){super(`Failed to load schema for entity ${t}`,{code:z.ERROR_CODE,cause:e.cause,context:{entityName:t,...e.context}}),this.name="SchemaLoadError",this.entityName=t}};l(z,"SchemaLoadError"),z.ERROR_CODE="SCHEMA_LOAD_ERROR";Ue=z,U=class U extends b{constructor(t,e={}){let n=e.cause instanceof Error?`Database operation '${t}' failed: ${e.cause.message}`:`Database operation '${t}' failed`;super(n,{code:U.ERROR_CODE,cause:e.cause,context:{operation:t,...e.context}}),this.name="DatabaseError",this.operation=t}};l(U,"DatabaseError"),U.ERROR_CODE="DATABASE_ERROR";m=U});var le={};ve(le,{DrizzleAdapter:()=>j,SqlBuilder:()=>p});var p,H,j,K=$(()=>{"use strict";I();S();p={quoteIdent(s,t){return String(s).split(".").map(r=>{if(!/^[_a-zA-Z][_a-zA-Z0-9]*$/.test(r))throw new Error(`Invalid identifier: ${s}`);return t==="mysql"?`\`${r}\``:`"${r}"`}).join(".")},placeholder(s,t){return t==="postgres"?`$${s+1}`:"?"},normalizeDirection(s){return(s||"ASC").toUpperCase()==="DESC"?"DESC":"ASC"},buildWhere(s=[],t){let e=[],n=[];for(let i of s){let a=(i.operator||"eq").toLowerCase(),o=String(i.field);if(a==="contains"||a==="startswith"||a==="endswith"){let d=p.quoteIdent(o,t),g=p.placeholder(n.length,t),w=String(i.value??"");a==="contains"&&(w=`%${w}%`),a==="startswith"&&(w=`${w}%`),a==="endswith"&&(w=`%${w}`),e.push(`${d} LIKE ${g}`),n.push(w);continue}if(a==="in"||a==="nin"){let d=Array.isArray(i.value)?i.value:[],g=p.quoteIdent(o,t);if(d.length===0){e.push(a==="in"?"1=0":"1=1");continue}let w=d.map((E,_)=>p.placeholder(n.length+_,t));e.push(`${g} ${a==="in"?"IN":"NOT IN"} (${w.join(", ")})`),n.push(...d);continue}let u={eq:"=",neq:"!=",gt:">",lt:"<",gte:">=",lte:"<=",like:"LIKE"}[a]||"=",f=p.quoteIdent(o,t),h=p.placeholder(n.length,t);e.push(`${f} ${u} ${h}`),n.push(i.value)}return{clause:e.length>0?`WHERE ${e.join(" AND ")}`:"",params:n}},buildOrderBy(s=[],t){if(!s||s.length===0)return"";let e=s.map(n=>{let r=p.quoteIdent(String(n.field),t),i=p.normalizeDirection(n.direction||n.dir);return`${r} ${i}`});return e.length?`ORDER BY ${e.join(", ")}`:""},buildPagination(s={}){let t=[];return s.limit!=null&&t.push(`LIMIT ${Number(s.limit)}`),s.offset!=null&&t.push(`OFFSET ${Number(s.offset)}`),t.join(" ")},buildSelect(s,t,e,n){let r=p.quoteIdent(s,n),{clause:i,params:a}=p.buildWhere(t,n),o=p.buildOrderBy(e.orderBy,n),c=p.buildPagination(e);return{sql:[`SELECT * FROM ${r}`,i,o,c].filter(Boolean).join(" "),params:a}},buildInsert(s,t,e){let n=p.quoteIdent(s,e),i=Object.keys(t).map(u=>p.quoteIdent(u,e)),a=Object.values(t),o=a.map((u,f)=>p.placeholder(f,e));return{sql:`INSERT INTO ${n} (${i.join(", ")}) VALUES (${o.join(", ")})`,params:a}},buildUpdate(s,t,e,n){let r=p.quoteIdent(s,n),i=Object.keys(e),a=i.map((f,h)=>`${p.quoteIdent(f,n)} = ${p.placeholder(h,n)}`),o=p.placeholder(i.length,n),c=`UPDATE ${r} SET ${a.join(", ")} WHERE ${p.quoteIdent("id",n)} = ${o}`,u=[...Object.values(e),t];return{sql:c,params:u}},buildDelete(s,t,e){return{sql:`DELETE FROM ${p.quoteIdent(s,e)} WHERE ${p.quoteIdent("id",e)} = ${p.placeholder(0,e)}`,params:[t]}},buildCount(s,t,e){let n=p.quoteIdent(s,e),{clause:r,params:i}=p.buildWhere(t,e);return{sql:`SELECT COUNT(*) as count FROM ${n} ${r}`.trim(),params:i}}},H=class H extends x{constructor(e={}){super(e);this.db=null;this.client=null;this.sql=null;this.dbType=e.type||"sqlite"}async connect(){if(!this.db){try{let e=await import("drizzle-orm");this.sql=e.sql}catch{throw new m("connect",{cause:new Error("drizzle-orm is not installed"),context:{dependency:"drizzle-orm"}})}this.dbType==="postgres"?await this.connectPostgres():this.dbType==="mysql"?await this.connectMySQL():await this.connectSQLite()}}async disconnect(){try{this.dbType!=="sqlite"&&this.client?.end?await this.client.end():this.dbType==="sqlite"&&this.client?.close&&this.client.close(),this.db=null,this.client=null}catch(e){throw new m("disconnect",{cause:e})}}isConnected(){return this.db!==null}async query(e,n=[]){await this.ensureConnected();try{let r=this.createQuery(e,n),i=await this.db.execute(r);return Array.isArray(i)?i:i.rows||[]}catch(r){throw new m("query",{cause:r,context:{sql:e,params:n}})}}async execute(e,n=[]){await this.ensureConnected();try{let r=this.createQuery(e,n),i=await this.db.execute(r);return this.extractExecutionMetadata(i)}catch(r){throw new m("execute",{cause:r,context:{sql:e,params:n}})}}async transaction(e){await this.ensureConnected();try{return await this.db.transaction(async n=>{let r=new H(this.config);return r.db=n,r.sql=this.sql,r.dbType=this.dbType,e(r)})}catch(n){throw new m("transaction",{cause:n})}}async tableExists(e){return this.dbType==="sqlite"?(await this.query(`SELECT name FROM sqlite_master WHERE type='table' AND name=${this.valuePlaceholder(0)} LIMIT 1`,[e])).length>0:this.dbType==="postgres"?!!(await this.query(`SELECT EXISTS (SELECT FROM information_schema.tables WHERE table_schema = 'public' AND table_name = ${this.valuePlaceholder(0)}) as exists`,[e]))[0]?.exists:!!(await this.query(`SELECT EXISTS (SELECT * FROM information_schema.tables WHERE table_schema = DATABASE() AND table_name = ${this.valuePlaceholder(0)}) as \`exists\``,[e]))[0]?.exists}async createTable(e,n){let r=n.map(i=>{let a=[p.quoteIdent(i.name,this.dbType),this.mapDataType(i.type)];if(i.primaryKey&&a.push("PRIMARY KEY"),i.notNull&&a.push("NOT NULL"),i.unique&&a.push("UNIQUE"),i.default!==void 0&&a.push("DEFAULT "+this.formatDefault(i.default)),i.references){let o=i.references;a.push(`REFERENCES ${p.quoteIdent(o.table,this.dbType)}(${p.quoteIdent(o.column,this.dbType)})`),o.onDelete&&a.push(`ON DELETE ${o.onDelete}`)}return a.join(" ")}).join(", ");await this.execute(`CREATE TABLE IF NOT EXISTS ${p.quoteIdent(e,this.dbType)} (${r})`)}async getTableColumns(e){if(this.dbType==="sqlite")return(await this.query(`PRAGMA table_info(${p.quoteIdent(e,this.dbType)})`)).map(i=>({name:i.name,type:i.type,notNull:!!i.notnull,default:i.dflt_value,primaryKey:!!i.pk}));if(this.dbType==="postgres"){let r=`SELECT column_name as name, data_type as type, is_nullable = 'NO' as "notNull", column_default as "default" FROM information_schema.columns WHERE table_schema = 'public' AND table_name = ${this.valuePlaceholder(0)} ORDER BY ordinal_position`;return this.query(r,[e])}let n=`SELECT COLUMN_NAME as name, DATA_TYPE as type, IS_NULLABLE = 'NO' as notNull, COLUMN_DEFAULT as \`default\` FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = ${this.valuePlaceholder(0)} ORDER BY ORDINAL_POSITION`;return this.query(n,[e])}async select(e,n,r){let{sql:i,params:a}=p.buildSelect(e,n,r,this.dbType);return this.query(i,a)}async insert(e,n){let{sql:r,params:i}=p.buildInsert(e,n,this.dbType),a=this.dbType==="postgres"?" RETURNING *":"";return{id:(await this.execute(r+a,i)).lastInsertId,...n}}async update(e,n,r){let{sql:i,params:a}=p.buildUpdate(e,n,(this.dbType==="postgres",r),this.dbType);if((await this.execute(i,a)).changes===0)throw new Error(`No record found with id: ${n}`);return{id:n,...r}}async delete(e,n){let{sql:r,params:i}=p.buildDelete(e,n,this.dbType);if((await this.execute(r,i)).changes===0)throw new Error(`No record found with id: ${n}`)}async count(e,n){let{sql:r,params:i}=p.buildCount(e,n,this.dbType),a=await this.query(r,i);return Number(a[0]?.count)||0}async findById(e,n){let r=p.quoteIdent(e,this.dbType),i=p.quoteIdent("id",this.dbType),a=`SELECT * FROM ${r} WHERE ${i} = ${this.valuePlaceholder(0)} LIMIT 1`;return(await this.query(a,[n]))[0]||null}createQuery(e,n){if(n.length===0)return this.sql.raw(e);let r=this.sql;if(r&&typeof r.fromList=="function"){let i=[],a=this.dbType==="postgres"?/\$\d+/:/\?/,o=e.split(a);for(let c=0;c<o.length;c++)o[c]&&i.push(r.raw(o[c])),c<o.length-1&&c<n.length&&i.push(n[c]);return r.fromList(i)}return{sql:e,params:n}}extractExecutionMetadata(e){return this.dbType==="postgres"?{changes:e.rowCount||0,lastInsertId:e.rows?.[0]?.id}:this.dbType==="mysql"?{changes:e.affectedRows||0,lastInsertId:e.insertId}:{changes:e.changes||0,lastInsertId:e.lastInsertRowid}}async createSchema(e){this.dbType==="postgres"?await this.execute(`CREATE SCHEMA IF NOT EXISTS ${p.quoteIdent(e,this.dbType)}`):this.dbType==="mysql"&&await this.execute(`CREATE DATABASE IF NOT EXISTS ${p.quoteIdent(e,this.dbType)}`)}async dropSchema(e){this.dbType==="postgres"?await this.execute(`DROP SCHEMA IF EXISTS ${p.quoteIdent(e,this.dbType)} CASCADE`):this.dbType==="mysql"&&await this.execute(`DROP DATABASE IF EXISTS ${p.quoteIdent(e,this.dbType)}`)}async listSchemas(){return this.dbType==="sqlite"?["main"]:this.dbType==="postgres"?(await this.query("SELECT schema_name FROM information_schema.schemata WHERE schema_name NOT IN ('information_schema', 'pg_catalog', 'pg_toast')")).map(r=>r.schema_name):(await this.query("SELECT SCHEMA_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME NOT IN ('information_schema', 'mysql', 'performance_schema', 'sys')")).map(n=>n.SCHEMA_NAME)}async ensureConnected(){this.db||await this.connect()}valuePlaceholder(e){return p.placeholder(e,this.dbType)}mapDataType(e){return{postgres:{string:"VARCHAR(255)",text:"TEXT",integer:"INTEGER",boolean:"BOOLEAN",date:"DATE",datetime:"TIMESTAMP",json:"JSONB",uuid:"UUID"},mysql:{string:"VARCHAR(255)",text:"TEXT",integer:"INT",boolean:"BOOLEAN",date:"DATE",datetime:"DATETIME",json:"JSON",uuid:"VARCHAR(36)"},sqlite:{string:"TEXT",text:"TEXT",integer:"INTEGER",boolean:"INTEGER",date:"TEXT",datetime:"TEXT",json:"TEXT",uuid:"TEXT"}}[this.dbType]?.[e.toLowerCase()]||e.toUpperCase()}formatDefault(e){return e===null?"NULL":e==="CURRENT_TIMESTAMP"?"CURRENT_TIMESTAMP":typeof e=="string"?`'${e.replace(/'/g,"''")}'`:typeof e=="boolean"&&this.dbType==="sqlite"?e?"1":"0":String(e)}async connectPostgres(){let e,n;try{e=(await import("pg")).Client}catch{throw new Error("pg is not installed")}try{n=(await import("drizzle-orm/node-postgres")).drizzle}catch{throw new Error("drizzle-orm node-postgres not available")}let i=typeof this.config.connectionString=="string"&&this.config.connectionString.length>0?{connectionString:this.config.connectionString,ssl:this.config.ssl?{rejectUnauthorized:!1}:void 0}:{host:this.config.host||"localhost",port:this.config.port||5432,database:this.config.database||"postgres",user:this.config.user,password:this.config.password,ssl:this.config.ssl?{rejectUnauthorized:!1}:void 0},a=new e(i);await a.connect(),this.client=a,this.db=n(a)}async connectMySQL(){let e,n;try{e=await import("mysql2/promise")}catch{throw new Error("mysql2 is not installed")}try{n=(await import("drizzle-orm/mysql2")).drizzle}catch{throw new Error("drizzle-orm mysql2 not available")}this.client=await e.createConnection({host:this.config.host||"localhost",port:this.config.port||3306,database:this.config.database,user:this.config.user,password:this.config.password}),this.db=n(this.client)}async connectSQLite(){let e,n;try{e=(await import("better-sqlite3")).default}catch{throw new Error("better-sqlite3 is not installed")}try{n=(await import("drizzle-orm/better-sqlite3")).drizzle}catch{throw new Error("drizzle-orm better-sqlite3 not available")}let r=this.config.filename||":memory:";this.client=new e(r),this.client?.pragma?.("foreign_keys = ON"),r!==":memory:"&&this.client?.pragma?.("journal_mode = WAL"),this.db=n(this.client)}get drizzleInstance(){return this.db}};l(H,"DrizzleAdapter");j=H});function ue(s,t){switch(s){case"contains":return`%${t}%`;case"startswith":return`${t}%`;case"endswith":return`%${t}`;case"like":return t;default:return t}}var Be=$(()=>{"use strict";l(ue,"processFilterValue")});import*as Ve from"crypto";function de(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(s){let t=Math.random()*16|0;return(s==="x"?t:t&3|8).toString(16)})}function $t(){if(typeof crypto<"u"&&crypto.randomUUID)return crypto.randomUUID();try{return Ve.randomUUID()}catch{return de()}}function et(){return Math.random().toString(36).substring(2,10)}function We(s,t){let n=(t.get(s)||0)+1;return t.set(s,n),n.toString()}function It(){let s=Date.now().toString(36),t=Math.random().toString(36).substring(2,8);return`${s}-${t}`}function Ot(s){return/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(s)}function Pt(s,t="_"){return`${s}${t}${et()}`}var X=$(()=>{"use strict";l(de,"generateId");l($t,"generateUUID");l(et,"generateShortId");l(We,"generateSequentialId");l(It,"generateTimestampId");l(Ot,"isValidUUID");l(Pt,"generatePrefixedId")});function A(){return new Date().toISOString()}function Qe(s){if(s==null)return null;if(s instanceof Date)return isNaN(s.getTime())?null:s;if(typeof s=="string"){if(s.toLowerCase()==="datetime('now')")return new Date;let t=new Date(s);return isNaN(t.getTime())?null:t}if(typeof s=="number"){let t=new Date(s);return isNaN(t.getTime())?null:t}return null}function qt(s,t="iso"){if(!s||isNaN(s.getTime()))throw new Error("Invalid date provided");switch(t.toLowerCase()){case"iso":return s.toISOString();case"date":return s.toISOString().split("T")[0];case"time":return s.toISOString().split("T")[1].split(".")[0];case"datetime":return s.toISOString().replace("T"," ").split(".")[0];case"timestamp":return s.getTime().toString();case"locale":return s.toLocaleString();case"localedate":return s.toLocaleDateString();case"localetime":return s.toLocaleTimeString();default:return tt(s,t)}}function tt(s,t){let e=s.getUTCFullYear(),n=String(s.getUTCMonth()+1).padStart(2,"0"),r=String(s.getUTCDate()).padStart(2,"0"),i=String(s.getUTCHours()).padStart(2,"0"),a=String(s.getUTCMinutes()).padStart(2,"0"),o=String(s.getUTCSeconds()).padStart(2,"0");return t.replace(/YYYY/g,e.toString()).replace(/MM/g,n).replace(/DD/g,r).replace(/HH/g,i).replace(/mm/g,a).replace(/ss/g,o)}function Lt(s){return Qe(s)!==null}function kt(s){let t=new Date(s);return t.setHours(0,0,0,0),t}function Ft(s){let t=new Date(s);return t.setHours(23,59,59,999),t}function Mt(s,t){let e=new Date(s);return e.setDate(e.getDate()+t),e}function zt(s,t){let e=new Date(s);return e.setHours(e.getHours()+t),e}function Ut(s,t){let e=new Date(s);return e.setMinutes(e.getMinutes()+t),e}function Bt(s,t){let e=t.getTime()-s.getTime();return Math.floor(e/(1e3*60*60*24))}function Vt(s,t){let e=t.getTime()-s.getTime();return Math.floor(e/(1e3*60*60))}function nt(s,t){return s.getFullYear()===t.getFullYear()&&s.getMonth()===t.getMonth()&&s.getDate()===t.getDate()}function Wt(s){return nt(s,new Date)}function Qt(s){return s.getTime()<Date.now()}function jt(s){return s.getTime()>Date.now()}function Ht(s){return new Date(s.getTime()+s.getTimezoneOffset()*6e4)}function Kt(s){return new Date(s.getTime()-s.getTimezoneOffset()*6e4)}function Xt(s,t=new Date){let e=t.getFullYear()-s.getFullYear(),n=t.getMonth()-s.getMonth();return(n<0||n===0&&t.getDate()<s.getDate())&&e--,e}function Jt(s){if(s.startsWith("'")&&s.endsWith("'")||s.startsWith('"')&&s.endsWith('"'))return s.slice(1,-1);if(s.toLowerCase()==="datetime('now')")return A();if(s==="1"||s.toLowerCase()==="true")return!0;if(s==="0"||s.toLowerCase()==="false")return!1;if(/^\d+$/.test(s))return parseInt(s,10);if(/^\d+\.\d+$/.test(s))return parseFloat(s);let t=Qe(s);return t?t.toISOString():s}var J=$(()=>{"use strict";l(A,"getCurrentTimestamp");l(Qe,"parseDate");l(qt,"formatDate");l(tt,"formatDateCustom");l(Lt,"isValidDate");l(kt,"getStartOfDay");l(Ft,"getEndOfDay");l(Mt,"addDays");l(zt,"addHours");l(Ut,"addMinutes");l(Bt,"getDaysDifference");l(Vt,"getHoursDifference");l(nt,"isSameDay");l(Wt,"isToday");l(Qt,"isPast");l(jt,"isFuture");l(Ht,"toUTC");l(Kt,"fromUTC");l(Xt,"getAge");l(Jt,"parseValue")});var fe={};ve(fe,{InMemoryAdapter:()=>Y});var pe,Y,G=$(()=>{"use strict";I();S();Be();X();J();pe=class pe extends x{constructor(e={}){super(e);this.tenantData=new Map;this.tenantSchemas=new Set;this.connected=!1;this.lastInsertIds=new Map}getIdField(e){switch(e){case"system_entities":return"entity_id";case"system_fields":return"field_id";case"system_permissions":return"permission_id";case"system_views":return"view_id";case"system_workflows":return"workflow_id";case"system_rls":return"rls_id";default:return"id"}}async connect(){this.connected=!0}async disconnect(){this.connected=!1,this.config?.clearOnDisconnect&&(this.tenantData.clear(),this.tenantSchemas.clear(),this.lastInsertIds.clear())}isConnected(){return this.connected}async query(e,n=[]){this.isConnected()||await this.connect();try{let r=e.match(/SELECT\s+(.+)\s+FROM\s+(\w+)(?:\s+WHERE\s+(.+))?/i);if(r){let a=r[2],o=r[3],c=this.extractTenantFromTable(a),u=this.extractActualTableName(a),f=this.getTableData(c,u);return o&&n.length>0&&(f=f.filter(h=>{if(o.includes("name = ?")&&o.includes("is_active = ?")){let d=n[0],g=n[1];return h.entity_name===d&&h.entity_is_active===g}if(o.includes("entity_id = ?")&&o.includes("is_active = ?")){let d=n[0],g=n[1];return h.field_entity_id===d&&h.field_is_active===g}if(o.includes("entity_id = ?")&&o.includes("role IN (?)")&&o.includes("is_active = ?")){let d=n[0],g=n[1],w=n[2];return h.permission_entity_id===d&&h.permission_role===g&&h.permission_is_active===w}if(o.includes("entity_id = ?")){let d=n[0];return h.view_entity_id===d}if(o.includes("id = ?")){let d=n[0];return h.entity_id===d}return!0})),f}let i=e.match(/SELECT\s+COUNT\(\*\)\s+as\s+count\s+FROM\s+(\w+)/i);if(i){let a=i[1],o=this.extractTenantFromTable(a),c=this.extractActualTableName(a);return[{count:this.getTableData(o,c).length}]}return[]}catch(r){throw new m("query",{cause:r instanceof Error?r:new Error(String(r)),context:{sql:e,params:n}})}}async execute(e,n=[]){this.isConnected()||await this.connect();try{let r=e.match(/CREATE\s+TABLE\s+(?:IF\s+NOT\s+EXISTS\s+)?(\w+)/i);if(r){let c=r[1],u=this.extractTenantFromTable(c),f=this.extractActualTableName(c);return this.ensureTableExists(u,f),{changes:0}}let i=e.match(/CREATE\s+SCHEMA\s+(?:IF\s+NOT\s+EXISTS\s+)?(\w+)/i);if(i){let c=i[1];return this.tenantSchemas.add(c),{changes:0}}let a=e.match(/DROP\s+SCHEMA\s+(?:IF\s+EXISTS\s+)?(\w+)/i);if(a){let c=a[1];return this.tenantSchemas.delete(c),this.tenantData.delete(c),{changes:1}}let o=e.match(/INSERT(?:\s+OR\s+IGNORE)?\s+INTO\s+(\w+)\s*\(([^)]+)\)\s*VALUES\s*(.+?)(?:\s+RETURNING\s+.+)?$/is);if(o){let c=o[1],u=o[2].split(",").map(_=>_.trim()),f=o[3],h=this.extractTenantFromTable(c),d=this.extractActualTableName(c);this.ensureTableExists(h,d);let g=this.parseMultiRowValues(f),w=0,E;for(let _ of g){let y={};u.forEach((Ne,v)=>{v<_.length&&(n.length>0&&_[v]===`$${v+1}`?y[Ne]=n[v]:y[Ne]=_[v])}),d==="system_entities"&&!y.entity_id?(y.entity_id=this.generateId(d),E=y.entity_id):d==="system_fields"&&!y.field_id?(y.field_id=this.generateId(d),E=y.field_id):d==="system_permissions"&&!y.permission_id?(y.permission_id=this.generateId(d),E=y.permission_id):d==="system_views"&&!y.view_id?(y.view_id=this.generateId(d),E=y.view_id):d==="system_workflows"&&!y.workflow_id?(y.workflow_id=this.generateId(d),E=y.workflow_id):d==="system_rls"&&!y.rls_id?(y.rls_id=this.generateId(d),E=y.rls_id):y.id||(y.id=this.generateId(d),E=y.id),this.getTableData(h,d).push(y),w++}return{changes:w,lastInsertId:E}}return{changes:0}}catch(r){throw new m("execute",{cause:r instanceof Error?r:new Error(String(r)),context:{sql:e,params:n}})}}async transaction(e){this.isConnected()||await this.connect();try{return await e(this)}catch(n){throw new m("transaction",{cause:n instanceof Error?n:new Error(String(n))})}}async tableExists(e){this.isConnected()||await this.connect();try{let n=this.extractTenantFromTable(e),r=this.extractActualTableName(e);return this.tenantData.get(n)?.has(r)||!1}catch(n){throw new m("table_exists_check",{cause:n instanceof Error?n:new Error(String(n)),context:{tableName:e}})}}async createTable(e,n){this.isConnected()||await this.connect();try{let r=this.extractTenantFromTable(e),i=this.extractActualTableName(e);this.ensureTableExists(r,i)}catch(r){throw new m("create_table",{cause:r instanceof Error?r:new Error(String(r)),context:{tableName:e}})}}async getTableColumns(e){this.isConnected()||await this.connect();try{return[{name:"id",type:"TEXT",primaryKey:!0,notNull:!0},{name:"created_at",type:"TEXT",notNull:!0},{name:"updated_at",type:"TEXT",notNull:!0}]}catch(n){throw new m("get_table_columns",{cause:n instanceof Error?n:new Error(String(n)),context:{tableName:e}})}}async select(e,n,r){this.isConnected()||await this.connect();try{let i=this.getTableData("default",e);if(n.length>0&&(i=i.filter(a=>n.every(o=>{let c=a[o.field],u=ue(o.operator||"eq",o.value);return this.matchesFilter(c,u,o.operator||"eq")}))),r.orderBy&&r.orderBy.length>0&&i.sort((a,o)=>{for(let c of r.orderBy){let u=a[c.field],f=o[c.field];if(u<f)return c.direction==="ASC"?-1:1;if(u>f)return c.direction==="ASC"?1:-1}return 0}),r.offset||r.limit){let a=r.offset||0,o=r.limit?a+r.limit:void 0;i=i.slice(a,o)}return i}catch(i){throw new m("select",{cause:i instanceof Error?i:new Error(String(i)),context:{table:e,filters:n,options:r}})}}async insert(e,n){this.isConnected()||await this.connect();try{let r="default";this.ensureTableExists(r,e);let i=n.id||this.generateId(e),a=A(),o={...n,id:i,created_at:n.created_at||a,updated_at:n.updated_at||a};return this.getTableData(r,e).push(o),o}catch(r){throw new m("insert",{cause:r instanceof Error?r:new Error(String(r)),context:{table:e,data:n}})}}async update(e,n,r){this.isConnected()||await this.connect();try{let i=this.getTableData("default",e),a=this.getIdField(e),o=i.findIndex(u=>u[a]===n);if(o===-1)throw new Error(`Record with id ${n} not found`);await new Promise(u=>setTimeout(u,1));let c=A();return i[o]={...i[o],...r,[a]:n,updated_at:c},i[o]}catch(i){throw new m("update",{cause:i instanceof Error?i:new Error(String(i)),context:{table:e,id:n,data:r}})}}async delete(e,n){this.isConnected()||await this.connect();try{let r=this.getTableData("default",e),i=this.getIdField(e),a=r.findIndex(o=>o[i]===n);if(a===-1)throw new Error(`Record with id ${n} not found`);r.splice(a,1)}catch(r){throw new m("delete",{cause:r instanceof Error?r:new Error(String(r)),context:{table:e,id:n}})}}async count(e,n){this.isConnected()||await this.connect();try{let r=this.getTableData("default",e);return n.length>0&&(r=r.filter(i=>n.every(a=>{let o=i[a.field],c=ue(a.operator||"eq",a.value);return this.matchesFilter(o,c,a.operator||"eq")}))),r.length}catch(r){throw new m("count",{cause:r instanceof Error?r:new Error(String(r)),context:{table:e,filters:n}})}}async findById(e,n){this.isConnected()||await this.connect();try{let r=this.getTableData("default",e),i=this.getIdField(e);return r.find(o=>o[i]===n)||null}catch(r){throw new m("findById",{cause:r instanceof Error?r:new Error(String(r)),context:{table:e,id:n}})}}async createSchema(e){this.tenantSchemas.add(e),this.tenantData.has(e)||this.tenantData.set(e,new Map)}async dropSchema(e){this.tenantSchemas.delete(e),this.tenantData.delete(e)}async listSchemas(){return Array.from(this.tenantSchemas).sort()}ensureTableExists(e,n){this.tenantData.has(e)||this.tenantData.set(e,new Map);let r=this.tenantData.get(e);r.has(n)||r.set(n,[])}getTableData(e,n){return this.ensureTableExists(e,n),this.tenantData.get(e).get(n)}generateId(e){return We(e,this.lastInsertIds)}extractTenantFromTable(e){return e.includes(".")?e.split(".")[0]:e.includes("_")?e.split("_")[0]:"default"}extractActualTableName(e){return e.includes(".")?e.split(".")[1]:e.includes("_")?e.split("_").slice(1).join("_"):e}matchesFilter(e,n,r){switch(r){case"eq":return e===n;case"neq":return e!==n;case"gt":return e>n;case"gte":return e>=n;case"lt":return e<n;case"lte":return e<=n;case"like":case"contains":return String(e).toLowerCase().includes(String(n).toLowerCase().replace(/%/g,""));case"startswith":return String(e).toLowerCase().startsWith(String(n).toLowerCase().replace(/%/g,""));case"endswith":return String(e).toLowerCase().endsWith(String(n).toLowerCase().replace(/%/g,""));case"in":return Array.isArray(n)&&n.includes(e);case"nin":return Array.isArray(n)&&!n.includes(e);default:return e===n}}parseValue(e){return e.toLowerCase()==="datetime('now')"?A():e.toLowerCase()==="null"?null:e.startsWith("'")&&e.endsWith("'")||e.startsWith('"')&&e.endsWith('"')?e.slice(1,-1):isNaN(Number(e))?e.toLowerCase()==="true"?!0:e.toLowerCase()==="false"?!1:e:Number(e)}parseInsertValues(e){let n=[],r="",i=!1,a="";for(let o=0;o<e.length;o++){let c=e[o];if(!i&&(c==="'"||c==='"'))i=!0,a=c;else if(i&&c===a)i=!1,a="";else if(!i&&c===","){n.push(this.parseValue(r.trim())),r="";continue}r+=c}return r.trim()&&n.push(this.parseValue(r.trim())),n}parseMultiRowValues(e){let n=[],r="",i=0,a=!1,o="";for(let c=0;c<e.length;c++){let u=e[c];if(!a&&(u==="'"||u==='"'))a=!0,o=u,r+=u;else if(a&&u===o)a=!1,o="",r+=u;else if(!a&&u==="(")i++,i===1?r="":r+=u;else if(!a&&u===")")if(i--,i===0){let f=this.parseInsertValues(r);n.push(f),r=""}else r+=u;else{if(!a&&u===","&&i===0)continue;r+=u}}return n}clearAllData(){this.tenantData.clear(),this.tenantSchemas.clear(),this.lastInsertIds.clear()}getAllData(){return this.tenantData}seedData(e,n,r){this.ensureTableExists(e,n),this.getTableData(e,n).push(...r)}};l(pe,"InMemoryAdapter");Y=pe});var he,x,I=$(()=>{"use strict";S();he=class he{constructor(t={}){this.config=t}static async create(t="sqlite",e={}){switch(t.toLowerCase()){case"sqlite":case"postgres":case"mysql":let{DrizzleAdapter:n}=await Promise.resolve().then(()=>(K(),le));return new n({...e,type:t});case"inmemory":let{InMemoryAdapter:r}=await Promise.resolve().then(()=>(G(),fe));return new r(e);default:throw new m("create",{cause:new Error(`Unsupported adapter type: ${t}`)})}}static createSync(t="sqlite",e={}){switch(t.toLowerCase()){case"sqlite":case"postgres":case"mysql":let{DrizzleAdapter:n}=(K(),qe(le));return new n({...e,type:t});case"inmemory":let{InMemoryAdapter:r}=(G(),qe(fe));return new r(e);default:throw new m("create",{cause:new Error(`Unsupported adapter type: ${t}`)})}}};l(he,"DatabaseAdapter");x=he});I();var me=class me{constructor(t){this.adapter=null;this._isQueryBuilder=!1;this._select=[];this._from="";this._where=[];this._orWhere=[];this._orderBy=[];this.tenantId=t.tenantId,this.adapterConfig={type:t.adapter,config:t.config||{}},this.multiTenancy=t.multiTenancy||{strategy:"column",columnName:"tenant_id"}}async init(){this.adapter||(this.adapter=await x.create(this.adapterConfig.type,this.adapterConfig.config))}async ensureAdapter(){this.adapter||await this.init()}resolveTableName(t){switch(this.multiTenancy.strategy){case"schema":return`${this.tenantId}.${t}`;case"table-prefix":let e=this.multiTenancy.separator||"_";return`${this.tenantId}${e}${t}`;case"column":case"none":default:return t}}addTenantFilter(t){if(this.multiTenancy.strategy==="column"&&this.tenantId!=="default"){let e=this.multiTenancy.columnName||"tenant_id";return[...t,{field:e,operator:"eq",value:this.tenantId}]}return t}addTenantData(t){if(this.multiTenancy.strategy==="column"&&this.tenantId!=="default"){let e=this.multiTenancy.columnName||"tenant_id";return{...t,[e]:this.tenantId}}return t}fork(){let t=Object.create(this);return t._isQueryBuilder=!0,t._select=[],t._from="",t._where=[],t._orWhere=[],t._orderBy=[],t._limit=void 0,t._offset=void 0,t}asBuilder(){return this._isQueryBuilder?this:this.fork()}select(t){let e=this.asBuilder();return e._select=Array.isArray(t)?t:[t],e}from(t){let e=this.asBuilder();return e._from=t,e}where(t){let e=this.asBuilder();return e._where.push(t),e}orWhere(t){let e=this.asBuilder();return e._orWhere.push(t),e}orderBy(t,e="ASC"){let n=this.asBuilder();return n._orderBy.push({field:t,dir:e}),n}limit(t){let e=this.asBuilder();return e._limit=t,e}offset(t){let e=this.asBuilder();return e._offset=t,e}buildFilters(){let t=[];for(let e of this._where)for(let n in e)t.push({field:n,value:e[n],operator:"="});return t}buildOptions(){let t={};return this._orderBy.length>0&&(t.orderBy=this._orderBy),this._limit!==void 0&&(t.limit=this._limit),this._offset!==void 0&&(t.offset=this._offset),this._select.length>0&&(t.select=this._select),t}async get(t){await this.ensureAdapter();let e=this.buildFilters(),n=this.addTenantFilter(e),r=this.buildOptions(),i=t||this._from,a=this.resolveTableName(i),o=await this.adapter.select(a,n,r);return this.reset(),o}async insert(t,e){await this.ensureAdapter();let n=this.resolveTableName(t),r=this.addTenantData(e),i=await this.adapter.insert(n,r);return this.reset(),i}async update(t,e){await this.ensureAdapter();let n=this.resolveTableName(t),r=this.addTenantData(e),a=this.buildFilters()[0]?.value,o=await this.adapter.update(n,a,r);return this.reset(),o}async delete(t){await this.ensureAdapter();let e=this.resolveTableName(t),r=this.buildFilters()[0]?.value,i=await this.adapter.delete(e,r);return this.reset(),i}reset(){return this._select=[],this._from="",this._where=[],this._orWhere=[],this._orderBy=[],this._limit=void 0,this._offset=void 0,this}async getAdapter(){return await this.ensureAdapter(),this.adapter}async raw(t,e){return await this.ensureAdapter(),this.adapter.query(t,e)}async transaction(t){return await this.ensureAdapter(),this.adapter.transaction(async e=>{let n=Object.create(this);return n.adapter=e,t(n)})}withTenant(t){let e=Object.create(this);return e.tenantId=t,e._select=[],e._from="",e._where=[],e._orWhere=[],e._orderBy=[],e._limit=void 0,e}getTenantId(){return this.tenantId}getMultiTenancyConfig(){return{...this.multiTenancy}}async createTenantSchema(t){if(this.multiTenancy.strategy!=="schema")throw new Error("Schema creation is only supported for schema-based multi-tenancy");await this.ensureAdapter(),await this.adapter.createSchema(t)}async dropTenantSchema(t){if(this.multiTenancy.strategy!=="schema")throw new Error("Schema dropping is only supported for schema-based multi-tenancy");await this.ensureAdapter(),await this.adapter.dropSchema(t)}async listTenantSchemas(){if(this.multiTenancy.strategy!=="schema")throw new Error("Schema listing is only supported for schema-based multi-tenancy");return await this.ensureAdapter(),this.adapter.listSchemas()}};l(me,"DB");var B=me;S();X();J();function R(s,t){if(typeof s!="string")return t;try{return JSON.parse(s)}catch{return t}}l(R,"safeJsonParse");function wn(s,t=!1){try{return JSON.stringify(s,null,t?2:0)}catch{return""}}l(wn,"safeJsonStringify");function En(s){if(typeof s!="string")return!1;try{return JSON.parse(s),!0}catch{return!1}}l(En,"isValidJson");function Tn(s,t){return s==null?t:typeof s=="string"?R(s,t):typeof s=="object"?s:t}l(Tn,"parseJsonField");function Rn(s){if(s===null||typeof s!="object")return s;try{return JSON.parse(JSON.stringify(s))}catch{return s}}l(Rn,"deepClone");function rt(s,t){let e={...s};for(let n in t)if(t.hasOwnProperty(n)){let r=t[n],i=e[n];C(r)&&C(i)?e[n]=rt(i,r):e[n]=r}return e}l(rt,"deepMerge");function C(s){return s!==null&&typeof s=="object"&&s.constructor===Object&&Object.prototype.toString.call(s)==="[object Object]"}l(C,"isPlainObject");function xn(s,t,e){if(!s||typeof s!="object")return e;let n=t.split("."),r=s;for(let i of n){if(r==null||!(i in r))return e;r=r[i]}return r}l(xn,"getNestedProperty");function it(s,t,e){let n=t.split("."),r=s;for(let i=0;i<n.length-1;i++){let a=n[i];(!(a in r)||!C(r[a]))&&(r[a]={}),r=r[a]}return r[n[n.length-1]]=e,s}l(it,"setNestedProperty");function st(s,t=!1){let e={};for(let n in s)if(s.hasOwnProperty(n)){let r=s[n];if(r===void 0||t&&r===null)continue;if(C(r)){let i=st(r,t);Object.keys(i).length>0&&(e[n]=i)}else e[n]=r}return e}l(st,"removeUndefinedValues");function je(s){if(!C(s))return s;let t={};for(let e in s)if(s.hasOwnProperty(e)){let n=e.replace(/_([a-z])/g,(i,a)=>a.toUpperCase()),r=s[e];C(r)?t[n]=je(r):Array.isArray(r)?t[n]=r.map(i=>C(i)?je(i):i):t[n]=r}return t}l(je,"toCamelCase");function He(s){if(!C(s))return s;let t={};for(let e in s)if(s.hasOwnProperty(e)){let n=e.replace(/[A-Z]/g,i=>`_${i.toLowerCase()}`),r=s[e];C(r)?t[n]=He(r):Array.isArray(r)?t[n]=r.map(i=>C(i)?He(i):i):t[n]=r}return t}l(He,"toSnakeCase");function Cn(s,t){let e={};for(let n of t)n in s&&(e[n]=s[n]);return e}l(Cn,"pick");function Dn(s,t){let e={...s};for(let n of t)delete e[n];return e}l(Dn,"omit");function at(s,t){if(s===t)return!0;if(s===null||t===null||s===void 0||t===void 0)return s===t;if(typeof s!=typeof t)return!1;if(typeof s!="object")return s===t;if(Array.isArray(s)!==Array.isArray(t))return!1;let e=Object.keys(s),n=Object.keys(t);if(e.length!==n.length)return!1;for(let r of e)if(!n.includes(r)||!at(s[r],t[r]))return!1;return!0}l(at,"deepEqual");function ot(s,t=""){let e={};for(let n in s)if(s.hasOwnProperty(n)){let r=t?`${t}.${n}`:n,i=s[n];C(i)?Object.assign(e,ot(i,r)):e[r]=i}return e}l(ot,"flattenObject");function _n(s){let t={};for(let e in s)s.hasOwnProperty(e)&&it(t,e,s[e]);return t}l(_n,"unflattenObject");var ye=class ye{constructor(t){this.databaseAdapter=t}async checkPermission(t,e,n={}){let r=n.user?.roles||[],i=r.length>0?r:["public"];return t.permissions.some(o=>o.permission_action!==e||!i.includes(o.permission_role)||o.permission_is_active===!1?!1:o.permission_conditions?this.evaluatePermissionConditions(o.permission_conditions,n):!0)}async getEntityPermissions(t,e={}){try{let n={create:!1,read:!1,update:!1,delete:!1,list:!1};return n.create=await this.checkPermission(t,"create",e),n.read=await this.checkPermission(t,"read",e),n.update=await this.checkPermission(t,"update",e),n.delete=await this.checkPermission(t,"delete",e),n.list=await this.checkPermission(t,"list",e),n}catch(n){return console.error(`Error getting entity permissions: ${n}`),{create:!1,read:!1,update:!1,delete:!1,list:!1}}}buildRLSConditions(t,e){let n=e.user?.roles||[];if(n.length===0||t.rls.length===0)return{sql:"",params:[]};let r=[],i=[];for(let a of t.rls){if(!a.rls_is_active||!n.includes(a.rls_role))continue;let o=[];for(let c of a.rls_config.conditions){let u;switch(c.op){case"eq":u="=";break;case"ne":u="!=";break;case"gt":u=">";break;case"gte":u=">=";break;case"lt":u="<";break;case"lte":u="<=";break;case"in":u="IN";break;case"notIn":u="NOT IN";break;case"like":u="LIKE";break;default:u="="}let f=c.value;if(typeof f=="string"&&f.startsWith("$context.")){let h=f.substring(9).split("."),d=e;for(let g of h){if(d==null)break;d=d[g]}f=d}if(u==="IN"||u==="NOT IN")if(Array.isArray(f)){let h=f.map(()=>"?").join(", ");o.push(`${c.field} ${u} (${h})`),i.push(...f)}else o.push(`${c.field} ${u} (?)`),i.push(f);else o.push(`${c.field} ${u} ?`),i.push(f)}if(o.length>0){let c=a.rls_config.relationbetweenconditions==="or"?" OR ":" AND ";r.push(`(${o.join(c)})`)}}return r.length>0?{sql:r.join(" OR "),params:i}:{sql:"",params:[]}}checkFieldPermission(t,e,n,r={}){let i=r.user?.roles||[];if(i.length===0)return!0;for(let a of t.permissions)if(i.includes(a.permission_role)&&a.permission_field_permissions&&typeof a.permission_field_permissions=="object"){let o=a.permission_field_permissions,c=`${e}_${n}`;if(o.hasOwnProperty(c))return o[c];if(o.hasOwnProperty(e))return o[e]}return!0}filterFieldsByPermissions(t,e,n,r={}){let i={};for(let[a,o]of Object.entries(e))this.checkFieldPermission(t,a,n,r)&&(i[a]=o);return i}evaluatePermissionConditions(t,e){if(!t||typeof t!="object")return!0;if(Array.isArray(t))return t.every(n=>this.evaluateSingleCondition(n,e));if(t.operator){let{operator:n,conditions:r}=t;if(!Array.isArray(r))return this.evaluateSingleCondition(t,e);switch(n?.toLowerCase()){case"and":return r.every(i=>this.evaluateSingleCondition(i,e));case"or":return r.some(i=>this.evaluateSingleCondition(i,e));default:return r.every(i=>this.evaluateSingleCondition(i,e))}}else return this.evaluateSingleCondition(t,e)}evaluateSingleCondition(t,e){if(!t||typeof t!="object")return!0;let{field:n,operator:r,value:i}=t;if(!n||!r)return!0;let a;if(n.startsWith("$context.")){let o=n.substring(9).split(".");a=e;for(let c of o){if(a==null)break;a=a[c]}}else if(n.startsWith("$user.")){let o=n.substring(6).split(".");a=e.user;for(let c of o){if(a==null)break;a=a[c]}}else a=e[n];switch(r.toLowerCase()){case"eq":case"=":case"==":return a===i;case"ne":case"!=":case"<>":return a!==i;case"gt":case">":return a>i;case"gte":case">=":return a>=i;case"lt":case"<":return a<i;case"lte":case"<=":return a<=i;case"in":return Array.isArray(i)?i.includes(a):a===i;case"notIn":case"not_in":return Array.isArray(i)?!i.includes(a):a!==i;case"like":return typeof a=="string"&&typeof i=="string"?new RegExp(i.replace(/%/g,".*"),"i").test(a):!1;case"exists":return a!=null;case"not_exists":return a==null;default:return!0}}};l(ye,"PermissionManager");var O=ye;var ge=class ge{constructor(){this.restrictions={}}setRestrictions(t){this.restrictions=t}getRestriction(t){t=Array.isArray(t)?t:JSON.parse(t);let e=t.map(n=>{let r=parseInt(n,10);return isNaN(r)?n:r}).sort((n,r)=>typeof n=="number"&&typeof r=="number"?r-n:typeof n=="string"&&typeof r=="string"?r.localeCompare(n):typeof n=="number"?-1:1);for(let n of e){let r=this.restrictions[n.toString()];if(r)return r}}generateQuery(t,e,n={},r){let i=this.getRestriction(t.roles||[]),a;if(i&&i.length>0?a=this.generateWhereClause(i,n,t):(a=this.generateWhereClause([],n,t)||"",a?a+=` AND created_by = '${t.id}'`:a=`created_by = '${t.id}'`),a){let o=e.toLowerCase().includes("where");return`${e} ${o?"AND":"WHERE"} ${a}`}return e}getExposedConditions(t){let e=this.getRestriction(t);return e?e.flatMap(n=>n.conditions.filter(r=>r.exposed)):[]}generateWhereClause(t,e,n){let r=t.map(o=>{let c=o.conditions.flatMap(u=>this.generateCondition(u,e,n));return c.length?`(${c.join(` ${o.combinator} `)})`:null}).filter(Boolean),i=Object.entries(e).map(([o,c])=>{let u=Number.isInteger(Number(c))?"eq":"like";return this.generateCondition({field:o,op:u,value:c,exposed:!0},e,n)}).flat(),a=[...r,...i].filter(Boolean);return a.length?a.join(" AND "):""}generateCondition(t,e,n){let r=t.value,i=[];if(t.exposed&&t.field in e)r=this.validateUserInput(t,e[t.field]);else if(typeof r=="string"&&r.startsWith("currentUser.")){let a=r.split(".")[1];r=n[a]}switch(Array.isArray(r)&&t.op!=="notIn"&&(t.op="in"),t.op){case"eq":i.push(`${t.field} = ${this.formatValue(r)}`);break;case"ne":i.push(`${t.field} != ${this.formatValue(r)}`);break;case"gt":i.push(`${t.field} > ${this.formatValue(r)}`);break;case"lt":i.push(`${t.field} < ${this.formatValue(r)}`);break;case"gte":i.push(`${t.field} >= ${this.formatValue(r)}`);break;case"lte":i.push(`${t.field} <= ${this.formatValue(r)}`);break;case"in":i.push(`${t.field} IN (${this.formatArray(r)})`);break;case"notIn":i.push(`${t.field} NOT IN (${this.formatArray(r)})`);break;case"like":i.push(`${t.field} LIKE "%${r}%"`);break;case"isNull":i.push(`${t.field} IS NULL`);break;case"notNull":i.push(`${t.field} IS NOT NULL`);break;default:throw new Error(`Unsupported operator: ${t.op}`)}return i}validateUserInput(t,e){if(!t.metadata)return e;switch(t.metadata.type){case"number":let n=Number(e);if(isNaN(n))throw new Error(`Invalid number for field ${t.field}`);if(t.metadata.min!==void 0&&n<t.metadata.min)throw new Error(`Value for ${t.field} must be at least ${t.metadata.min}`);if(t.metadata.max!==void 0&&n>t.metadata.max)throw new Error(`Value for ${t.field} must be at most ${t.metadata.max}`);return n;case"string":if(t.metadata.options&&!t.metadata.options.includes(e))throw new Error(`Invalid option for ${t.field}`);return e;default:return e}}formatValue(t){return t==null?"NULL":typeof t=="string"?`'${t}'`:t.toString()}formatArray(t){return t.filter(e=>e!=null).map(this.formatValue.bind(this)).join(", ")}};l(ge,"RowRestrictionManager");var V=ge;var be=class be extends O{constructor(t){super(t),this.rowRestrictionManager=new V}setRoleRestrictions(t){this.rowRestrictionManager.setRestrictions(t)}applyRLSToQuery(t,e,n){return n.user?this.rowRestrictionManager.generateQuery(n.user,t,{},e):t}getExposedConditions(t){return t.user?.roles?this.rowRestrictionManager.getExposedConditions(t.user.roles):[]}buildAdvancedRLSConditions(t,e,n={}){if(!e.user)return"";try{let i="SELECT * FROM dummy",a=this.rowRestrictionManager.generateQuery(e.user,i,n,t.entity.entity_table_name);if(a!==i){let o=a.toLowerCase().indexOf("where");if(o!==-1)return a.substring(o+5).trim()}}catch(i){console.warn("Advanced RLS failed, falling back to basic RLS:",i)}return this.buildRLSConditions(t,e).sql||""}};l(be,"RLSPermissionManager");var W=be;var we=class we{constructor(t,e,n,r,i){this.db=t;this.entityName=e;this.tableName=n;this.fields=r;this.views=i;this.rlsManager=null}setRLSRestrictions(t){this.rlsManager||(this.rlsManager=new W(this.db)),this.rlsManager.setRoleRestrictions(t)}async executeView(t,e={},n={}){let r=this.views.find(d=>d.view_name===t);if(!r)throw new Error(`View '${t}' not found for entity '${this.entityName}'`);let i=this.db.select("*").from(this.tableName);i=this.applyViewSelect(i,r),i=this.applyViewFilters(i,r),i=this.applyUserFilters(i,n),i=this.applySorting(i,r),i=await this.applyRLSRestrictions(i,e);let{page:a,limit:o,offset:c}=this.resolvePagination(n);o&&(i=i.limit(o)),c&&typeof i.offset=="function"&&(i=i.offset(c));let u=await(i?.get?i.get():this.db.get()),f=u.length;try{if(typeof this.db.getAdapter=="function"){let g=await this.db.getAdapter(),w=this.buildCountFilters(r,n,e);g&&typeof g.count=="function"&&(f=await g.count(this.tableName,w))}}catch{f=u.length}let h={results:u,total:f,fields:this.fields,meta:{entityName:this.entityName,viewName:t}};return n.stats&&(h.stats=this.buildDefaultStats(f)),h}applyViewSelect(t,e){return e.view_fields&&e.view_fields.length>0&&(t=this.db.select(e.view_fields).from(this.tableName)),t}applyViewFilters(t,e){if(e.view_filters)for(let[n,r]of Object.entries(e.view_filters))t=t.where({[n]:r});else if(e.view_query_config?.filters)for(let[n,r]of Object.entries(e.view_query_config.filters))t=t.where({[n]:r});return t}applyUserFilters(t,e){if(e.filters)for(let[n,r]of Object.entries(e.filters))t=t.where({[n]:r});return t}applySorting(t,e){let n=e.view_sort||e.view_query_config?.sorting||[];if(n.length>0){for(let i of n){let a=String(i.direction||"asc").toUpperCase();t=t.orderBy(i.field,a)}return t}let r=this.fields.find(i=>i.field_name==="id")?.field_name||this.fields.find(i=>/_id$/i.test(i.field_name))?.field_name||this.fields[0]?.field_name;return r||(r={system_entities:"entity_id",system_fields:"field_id",system_permissions:"permission_id",system_views:"view_id",system_workflows:"workflow_id",system_rls:"rls_id"}[this.tableName]||"id"),t.orderBy(r,"DESC")}resolvePagination(t){let e=Math.max(1,t.pagination?.page||1),n=Math.max(1,t.pagination?.limit||10),r=(e-1)*n;return{page:e,limit:n,offset:r}}buildDefaultStats(t){return[{id:null,title:"All",total:t,filterType:"group",processHubRoles:[],buttons:[],items:[],isDefault:!1}]}buildCountFilters(t,e,n){let r=[];if(t.view_filters)for(let[i,a]of Object.entries(t.view_filters))r.push({field:i,value:a,operator:"eq"});else if(t.view_query_config?.filters)for(let[i,a]of Object.entries(t.view_query_config.filters))r.push({field:i,value:a,operator:"eq"});if(e.filters)for(let[i,a]of Object.entries(e.filters))r.push({field:i,value:a,operator:"eq"});return n.user?.id&&r.push({field:"created_by",value:n.user.id,operator:"eq"}),r}async applyRLSRestrictions(t,e){if(!this.rlsManager||!e.user)return t;try{return e.user?.id&&(t=t.where({created_by:e.user.id})),t}catch(n){return console.warn("Failed to apply RLS restrictions:",n),t}}getExposedConditions(t){return this.rlsManager?this.rlsManager.getExposedConditions(t):[]}};l(we,"ViewManager");var Z=we;var T=class T{constructor(t,e,n){this.initialized=!1;this.validationAdapter=null;this.compiledSchema=null;this.unknownFieldPolicy="strip";this.fields=[];this.permissions=[];this.workflow=[];this.rls=[];this.views=[];this.entityDefinition=null;this.tableName="";this.viewManager=null;this.entityName=t,this.tenantId=e,this.db=n}static create(t,e,n){let r=`${e}:${t}`;if(T.cache.has(r))return T.cache.get(r);let i=new T(t,e,n);return T.cache.set(r,i),i}getPrimaryKeyFieldName(){return`${this.tableName}_id`}get isInitialized(){return this.initialized}get name(){return this.entityName}get tenant(){return this.tenantId}setValidation(t,e){if(this.validationAdapter=t,e&&(this.unknownFieldPolicy=e),this.initialized){let n=this.entityDefinition?.entity_id||`${this.tenantId}:${this.entityName}`;this.compiledSchema=this.validationAdapter.buildSchema(n,this.fields,{unknownFieldPolicy:this.unknownFieldPolicy})}else this.compiledSchema=null}async initialize(t={}){if(this.initialized)return;let e={...t,tenantId:this.tenantId};try{if(this.entityDefinition=await this.loadEntityDefinition(),!this.entityDefinition)throw new Error(`Entity '${this.entityName}' not found`);let[n,r,i,a,o]=await Promise.all([this.loadFields(this.entityDefinition.entity_id),this.loadPermissions(this.entityDefinition.entity_id,e),this.loadWorkflows(this.entityDefinition.entity_id),this.loadViews(this.entityDefinition.entity_id),this.loadRLS(this.entityDefinition.entity_id)]);if(this.fields=n,this.permissions=r,this.workflow=i,this.rls=o,this.views=a,this.tableName=this.entityDefinition.entity_table_name||this.entityName,await this.ensureTable(),this.validationAdapter){let c=this.entityDefinition.entity_id||`${this.tenantId}:${this.entityName}`;this.compiledSchema=this.validationAdapter.buildSchema(c,this.fields,{unknownFieldPolicy:this.unknownFieldPolicy})}this.viewManager=new Z(this.db,this.entityName,this.tableName,this.fields,this.views),this.initialized=!0}catch(n){throw new b(`Failed to initialize entity '${this.entityName}': ${n instanceof Error?n.message:String(n)}`,{code:"ENTITY_INITIALIZATION_FAILED",cause:n})}}async view(t,e={},n={}){if(await this.ensureInitialized(),!this.viewManager)throw new b("ViewManager not initialized");return this.viewManager.executeView(t,n,e)}async get(t={},e={}){await this.ensureInitialized();let n={...e,tenantId:this.tenantId};await this.checkPermission("read",n);let r=this.db.select("*").from(this.tableName);for(let[a,o]of Object.entries(t))r=r.where({[a]:o});let i=this.buildRLSConditions(n);for(let a of i)r=r.where({[a.field]:a.value});return await r.get()}async getById(t,e={}){await this.ensureInitialized();let n={...e,tenantId:this.tenantId};await this.checkPermission("read",n);let r=this.getPrimaryKeyFieldName(),i=this.db.select("*").from(this.tableName).where({[r]:t}),a=this.buildRLSConditions(n);for(let c of a)i=i.where({[c.field]:c.value});let o=await i.get();return o&&o.length>0?o[0]:null}async insert(t,e={}){await this.ensureInitialized();let n={...e,tenantId:this.tenantId};if(await this.checkPermission("create",n),this.validationAdapter&&this.compiledSchema){let o=this.validationAdapter.validate("create",this.compiledSchema,t);if(!o.ok)throw new b("Validation failed",{code:"VALIDATION_FAILED",context:o.errors});t=o.data}else this.validateData(t,"create");let r=this.getPrimaryKeyFieldName(),i=t.id||t[r]||de(),a={...t,id:i,[r]:i,created_at:A(),updated_at:A(),...n.user?.id&&{created_by:n.user.id,updated_by:n.user.id}};return await this.db.insert(this.tableName,a),await this.executeWorkflows("create",null,a,n),a}async update(t,e,n={}){await this.ensureInitialized();let r={...n,tenantId:this.tenantId};if(await this.checkPermission("update",r),this.validationAdapter&&this.compiledSchema){let u=this.validationAdapter.validate("update",this.compiledSchema,e);if(!u.ok)throw new b("Validation failed",{code:"VALIDATION_FAILED",context:u.errors});e=u.data}else this.validateData(e,"update");let i=await this.getById(t,r);if(!i)throw new b(`Record not found: ${this.entityName} with ID ${t}`);let a={...e,updated_at:A(),...r.user?.id&&{updated_by:r.user.id}};delete a.id,delete a[this.getPrimaryKeyFieldName()];let o=this.getPrimaryKeyFieldName();await this