@enfyra/kernel 1.0.4 → 1.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +6 -6
- package/dist/package-metadata.json +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
"use strict";var Gr=Object.create;var Lt=Object.defineProperty;var Yr=Object.getOwnPropertyDescriptor;var Xr=Object.getOwnPropertyNames;var Zr=Object.getPrototypeOf,ei=Object.prototype.hasOwnProperty;var D=(r,e)=>()=>(r&&(e=r(r=0)),e);var mn=(r,e)=>{for(var t in e)Lt(r,t,{get:e[t],enumerable:!0})},Zn=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of Xr(e))!ei.call(r,o)&&o!==t&&Lt(r,o,{get:()=>e[o],enumerable:!(n=Yr(e,o))||n.enumerable});return r};var re=(r,e,t)=>(t=r!=null?Gr(Zr(r)):{},Zn(e||!r||!r.__esModule?Lt(t,"default",{value:r,enumerable:!0}):t,r)),ti=r=>Zn(Lt({},"__esModule",{value:!0}),r);function xn(r){return dr.createHash("md5").update(r).digest("hex").substring(0,8)}function pr(r){return r.length<=Sn-3?`${r}_pk`:`j_${xn(r)}_pk`}function gr(r,e,t){let n=`${r}_${e}_foreign`;return n.length<=Sn?n:`j_${xn(r)}_${t}_fk`}function Pe(r,e,t){let n=`${r}_${e}_${t}`;if(n.length<=Sn)return n;let o=xn(n),i=r.replace(/_definition/g,"").substring(0,10),s=e.substring(0,10),a=t.replace(/_definition/g,"").substring(0,10);return`j_${o}_${i}_${s}_${a}`}function L(r){return`${r}Id`}function je(r,e,t){let n=L(r);if(r===t){let i=L(e);return{sourceColumn:n,targetColumn:i}}let o=L(t);return{sourceColumn:n,targetColumn:o}}function yr(r){return r.replace(/_([a-z])/g,e=>e[1].toUpperCase())}function mr(r){return r.replace(/([A-Z])/g,"_$1").toLowerCase()}function hr(r,e,t){return`${r}_${e}_${t}_fk`}function br(r,e,t){return`${r}_${e}_${t}_idx`}var dr,Sn,Le=D(()=>{"use strict";dr=re(require("crypto")),Sn=63});function Yt(r){return vi[r]??null}var Y,Nn,Ct,vi,Ft=D(()=>{"use strict";Y=new Set(["_eq","_neq","_gt","_gte","_lt","_lte","_in","_not_in","_nin","_contains","_starts_with","_ends_with","_between","_is_null","_is_not_null"]),Nn=new Set(["_and","_or","_not"]),Ct=[...Array.from(Nn),...Array.from(Y)],vi={_eq:"eq",_neq:"neq",_gt:"gt",_gte:"gte",_lt:"lt",_lte:"lte",_in:"in",_not_in:"not_in",_nin:"not_in",_contains:"contains",_starts_with:"starts_with",_ends_with:"ends_with",_between:"between"}});var E,Nt=D(()=>{"use strict";E=class extends Error{constructor(t="Bad Request",n){let o=Array.isArray(t),i=o?t.join("; ")||"Bad Request":typeof t=="string"?t:JSON.stringify(t);super(i);this.statusCode=400;this.errorCode="BAD_REQUEST";this.name="BadRequestException",this.details=n,o&&(this.messages=t)}}});function $r(){let r=process.env.DB_URI||"";return r.startsWith("mongodb://")||r.startsWith("mongodb+srv://")}var kr=D(()=>{"use strict"});function Be(r,e,t){throw new E({message:`Unsupported filter operator "${r}" on field "${e}"${t?` (table "${t}")`:""}. Supported operators: ${Ct.join(", ")}.`,error:"UnsupportedFilterOperator",operator:r,field:e,supportedOperators:Ct})}function Xt(r,e,t){if(!e||typeof e!="object"||Array.isArray(e))return;let n=$r();for(let o of Object.keys(e))if(o.startsWith("_")&&!Y.has(o)){if(n&&o==="_id")continue;Be(o,r,t)}}function B(r,e,t){if(!r||typeof r!="object")return;let n=t?.tables?.get(e),o=new Set((n?.columns??[]).map(s=>s.name)),i=new Map((n?.relations??[]).map(s=>[s.propertyName,s]));for(let[s,a]of Object.entries(r)){if(Ai.has(s)){if(Array.isArray(a))for(let l of a)B(l,e,t);else a&&typeof a=="object"&&B(a,e,t);continue}let f=i.get(s);if(f){if(a&&typeof a=="object"&&!Array.isArray(a)){Xt(s,a,e);let l=f.targetTableName||f.targetTable;if(l){let u=Object.keys(a).filter(c=>!c.startsWith("_"));if(u.length>0){let c={};for(let p of u)c[p]=a[p];B(c,l,t)}}}continue}s.startsWith("_")&&!o.has(s)&&s!=="_id"&&Be(s,s,e),a&&typeof a=="object"&&!Array.isArray(a)&&Xt(s,a,e)}}var Ai,Ye=D(()=>{"use strict";Nt();Ft();kr();Ai=new Set(["_and","_or","_not"])});function he(r,e,t,n){return!r||typeof r!="object"?{node:null,hasRelationFilters:!1}:Zt(r,{tableName:e,metadata:t,registry:n,parentJoinId:null,currentJoinId:null,currentTable:e})}function Zt(r,e){if(!r||typeof r!="object")return{node:null,hasRelationFilters:!1};let t=[],n=!1;for(let[o,i]of Object.entries(r)){let s=Oi(o,i,e);s.hasRelationFilters&&(n=!0),s.node&&t.push(s.node)}return t.length===0?{node:null,hasRelationFilters:n}:t.length===1?{node:t[0],hasRelationFilters:n}:{node:{kind:"and",children:t},hasRelationFilters:n}}function Oi(r,e,t){if(r==="_and")return Sr("and",e,t);if(r==="_or")return Sr("or",e,t);if(r==="_not"){let l=Zt(e,t);return l.node?{node:{kind:"not",child:l.node},hasRelationFilters:l.hasRelationFilters}:{node:null,hasRelationFilters:l.hasRelationFilters}}let n=t.metadata?.tables?.get(t.currentTable),o=n?.columns?.some(l=>l.name==="_id"&&l.isPrimary),i=n?.columns?.some(l=>l.name==="id"),a=r==="id"?o&&!i?"_id":"id":r,f=n?.relations?.find(l=>l.propertyName===a);return f?Ii(a,e,f,t):n&&!n.columns?.find(u=>u.name===a)?(r.startsWith("_")&&r!=="_id"&&Be(r,r,t.currentTable),console.warn(`[filter-parser] Unknown field "${r}" on table "${t.currentTable}" \u2014 skipped (not a column or relation in metadata).`),{node:null,hasRelationFilters:!1}):Mi(a,e,t)}function Sr(r,e,t){if(!Array.isArray(e))return{node:null,hasRelationFilters:!1};let n=[],o=!1;for(let i of e){let s=Zt(i,t);s.hasRelationFilters&&(o=!0),s.node&&n.push(s.node)}return n.length===0?{node:null,hasRelationFilters:o}:n.length===1?{node:n[0],hasRelationFilters:o}:{node:{kind:r,children:n},hasRelationFilters:o}}function Ii(r,e,t,n){if(typeof e!="object"||e===null)return{node:null,hasRelationFilters:!0};let o=Object.keys(e),i=o.length===1&&(o[0]==="_is_null"||o[0]==="_is_not_null"||o[0]==="_eq"||o[0]==="_neq"||o[0]==="_in"||o[0]==="_not_in"||o[0]==="_nin"),s=n.registry.registerWithParent(n.currentTable,r,n.metadata,"left",n.currentJoinId,"filter");if(i&&o[0]==="_is_null")return s?{node:{kind:"relation_exists",joinId:s,negate:e._is_null===!0},hasRelationFilters:!0}:{node:null,hasRelationFilters:!0};if(i&&o[0]==="_is_not_null")return s?{node:{kind:"relation_exists",joinId:s,negate:e._is_not_null!==!0},hasRelationFilters:!0}:{node:null,hasRelationFilters:!0};if(i&&(o[0]==="_eq"||o[0]==="_neq")&&e[o[0]]===null)return s?{node:{kind:"relation_exists",joinId:s,negate:o[0]==="_eq"},hasRelationFilters:!0}:{node:null,hasRelationFilters:!0};if(!s)return{node:null,hasRelationFilters:!0};let a=t.targetTableName||t.targetTable,f={...n,parentJoinId:n.currentJoinId,currentJoinId:s,currentTable:a},l=new Set(["_eq","_neq","_in","_not_in","_nin","_gt","_gte","_lt","_lte"]),c=o.length>0&&o.every(d=>l.has(d))?{id:e}:e;return{node:Zt(c,f).node,hasRelationFilters:!0}}function Mi(r,e,t){let n={joinId:t.currentJoinId,fieldName:r,isUuid:Pi(r,t)};if(e===null)return{node:{kind:"compare",field:n,op:"is_null",value:!0},hasRelationFilters:!1};if(typeof e!="object")return{node:{kind:"compare",field:n,op:"eq",value:e},hasRelationFilters:!1};for(let s of Object.keys(e))s.startsWith("_")&&!Y.has(s)&&Be(s,r,t.tableName);let o=Object.entries(e).filter(([s])=>Y.has(s));if(o.length===0)return{node:{kind:"compare",field:n,op:"eq",value:e},hasRelationFilters:!1};let i=[];for(let[s,a]of o){let f=Ei(n,s,a);f&&i.push(f)}return i.length===0?{node:null,hasRelationFilters:!1}:i.length===1?{node:i[0],hasRelationFilters:!1}:{node:{kind:"and",children:i},hasRelationFilters:!1}}function Ei(r,e,t){if(e==="_is_null")return{kind:"compare",field:r,op:"is_null",value:t===!0};if(e==="_is_not_null")return{kind:"compare",field:r,op:"is_null",value:t!==!0};let n=Yt(e);return n?{kind:"compare",field:r,op:n,value:t}:null}function Pi(r,e){let t=e.metadata?.tables?.get(e.currentTable);if(!t)return!1;let n=r.includes(".")?r.split(".").pop():r,o=t.columns?.find(s=>s.name===n);if(!o)return!1;let i=(o.type||"").toLowerCase();return i==="uuid"||i==="uuidv4"||i.includes("uuid")}var vt=D(()=>{"use strict";Ft();Ye()});var ee,At=D(()=>{"use strict";ee=class{constructor(){this.map=new Map}size(){return this.map.size}has(e){return this.map.has(e)}get(e){return this.map.get(e)}getAll(){return Array.from(this.map.values())}registerWithParent(e,t,n,o="left",i=null,s="data"){let a=i?`${i}.${t}`:t;if(this.map.has(a)){let p=this.map.get(a);return o==="inner"&&(p.joinType="inner"),p.purposes.includes(s)||p.purposes.push(s),a}let f=n?.tables?.get(e);if(!f)return null;let l=f.relations?.find(p=>p.propertyName===t);if(!l)return null;let u=l.targetTableName||l.targetTable;if(!u)return null;let c={id:a,propertyName:t,parentTable:e,targetTable:u,relationType:l.type,parentJoinId:i,joinType:o,relationMeta:l,purposes:[s]};return this.map.set(a,c),a}}});async function H(r,e){if(r.length<=5e3)return e(r);let t=[];for(let o=0;o<r.length;o+=5e3)t.push(r.slice(o,o+5e3));return(await Promise.all(t.map(e))).flat()}function Ze(r){let e=[],t=new Map;for(let n of r)if(n==="*"||!n.includes("."))e.push(n);else{let o=n.split("."),i=o[0],s=o.slice(1).join(".");t.has(i)||t.set(i,[]),t.get(i).push(s)}return{rootFields:e,subRelations:t}}var ae,vr,_e,et=D(()=>{"use strict";ae=16,vr=5e3;_e=class{constructor(e,t,n){this.adapter=e;this.metadataGetter=t;this.trace=n}enrichNestedDescs(e,t){return!t||Object.keys(t).length===0?e:e.map(n=>{let o=t[n.relationName];if(!o)return n;let i=o.fields!=null?Array.isArray(o.fields)?o.fields:String(o.fields).split(",").map(s=>s.trim()).filter(Boolean):n.fields;return{...n,fields:i,userFilter:o.filter??n.userFilter,userSort:o.sort??n.userSort,userLimit:o.limit!==void 0?Number(o.limit):n.userLimit,userPage:o.page!==void 0?Number(o.page):n.userPage,nestedDeep:o.deep??n.nestedDeep}})}async execute(e,t,n=3,o=0,i){if(e.length===0||t.length===0||o>=n)return;let s;i&&(s=await this.metadataGetter(i)??void 0),await Promise.all(t.map(a=>a.type==="many-to-one"||a.type==="one-to-one"&&!a.isInverse?this.fetchOwnerRelation(e,a,n,o):a.type==="one-to-many"||a.type==="one-to-one"&&a.isInverse?this.fetchInverseRelation(e,a,n,o,s):a.type==="many-to-many"?this.fetchM2MRelation(e,a,n,o,s):Promise.resolve()))}async fetchOwnerRelation(e,t,n,o){let i=this.adapter.resolveOwnerFkKey(t),s=new Set,a=[];for(let b of e){let _=b[i];if(_==null)continue;let w=this.adapter.keyOf(_);s.has(w)||(s.add(w),a.push(_))}if(a.length===0){for(let b of e)b[i]=null,t.fkColumn&&t.fkColumn!==i&&delete b[t.fkColumn];return}let f=await this.metadataGetter(t.targetTable);if(!f)throw new Error(`Metadata not found for target table: ${t.targetTable}`);let{isPkOnly:l,nestedDescs:u,fetchSpec:c}=this.adapter.resolveFields(t.fields,f),p=this.adapter.getTargetPkField(f);if(l){for(let b of e){let _=b[i];b[i]=_!=null?this.adapter.buildScalarRef(_,p):null,t.fkColumn&&t.fkColumn!==i&&delete b[t.fkColumn]}return}let d=performance.now(),g=await this.adapter.fetchOwner(t.targetTable,a,c,t);this.trace?.dur(`batch_fetch_L${o}_${t.relationName}`,d,{relationType:t.type,targetTable:t.targetTable,strategy:"batch-in",roundtrips:Math.ceil(a.length/5e3)||1,rowsTransferred:g.length,rowsReturned:g.length,rowsDiscarded:0,userFilter:!!t.userFilter,userSort:!!t.userSort});let m=this.enrichNestedDescs(u,t.nestedDeep);m.length>0&&await this.execute(g,m,n,o+1,t.targetTable);let y=new Map;for(let b of g)y.set(this.adapter.keyOf(b[p]),b);for(let b of e){let _=b[i];b[i]=_!=null&&y.get(this.adapter.keyOf(_))||null,t.fkColumn&&t.fkColumn!==i&&delete b[t.fkColumn]}}async fetchInverseRelation(e,t,n,o,i){let s=this.adapter.resolveParentPk(i),a=e.map(S=>S[s]).filter(S=>S!=null);if(a.length===0)return;let f=this.adapter.resolveInverseFkField(t),l=await this.metadataGetter(t.targetTable);if(!l)throw new Error(`Metadata not found for target table: ${t.targetTable}`);let{nestedDescs:u,fetchSpec:c}=this.adapter.resolveFields(t.fields,l),p=performance.now(),{docs:d,groupKeyField:g}=await this.adapter.fetchInverse(t.targetTable,f,a,c,t),m=new Map,y=t.fields.includes(f)||t.fields.includes("*");for(let S of d){let R=S[g],F=this.adapter.keyOf(R);m.has(F)||m.set(F,[]),m.get(F).push(S)}let b=t.userLimit!==void 0?"per-parent-c16":"batch-in",_=t.userLimit!==void 0?a.length:Math.ceil(a.length/5e3)||1,w=t.userLimit!==void 0?Math.ceil(a.length/16):void 0,$=Array.from(m.values()).reduce((S,R)=>S+R.length,0);if(this.trace?.dur(`batch_fetch_L${o}_${t.relationName}`,p,{relationType:t.type,targetTable:t.targetTable,strategy:b,roundtrips:_,concurrencyWaves:w,rowsTransferred:d.length,rowsReturned:$,rowsDiscarded:d.length-$,userLimit:t.userLimit,userFilter:!!t.userFilter,userSort:!!t.userSort}),this.adapter.postProcessInverseChild)for(let S of d)this.adapter.postProcessInverseChild(S,f,y);let h=this.enrichNestedDescs(u,t.nestedDeep);h.length>0&&await this.execute(d,h,n,o+1,t.targetTable);let k=t.type==="one-to-one";for(let S of e){let R=this.adapter.keyOf(S[s]),F=m.get(R)||[];S[t.relationName]=k?F[0]||null:F}}async fetchM2MRelation(e,t,n,o,i){let s=this.adapter.resolveParentPk(i),a=e.map(w=>w[s]).filter(w=>w!=null);if(a.length===0)return;let f=await this.metadataGetter(t.targetTable);if(!f)throw new Error(`Metadata not found for target table: ${t.targetTable}`);let{nestedDescs:l,fetchSpec:u}=this.adapter.resolveFields(t.fields,f),c=performance.now(),{grouped:p,docs:d}=await this.adapter.fetchM2M(e,t,i,f,u),g=t.userLimit!==void 0?"m2m-per-parent-c16":"m2m-batch",m=t.userLimit!==void 0?a.length:Math.ceil(a.length/5e3)||1,y=t.userLimit!==void 0?Math.ceil(a.length/16):void 0,b=Array.from(p.values()).reduce((w,$)=>w+$.length,0);this.trace?.dur(`batch_fetch_L${o}_${t.relationName}`,c,{relationType:t.type,targetTable:t.targetTable,strategy:g,roundtrips:m,concurrencyWaves:y,rowsTransferred:d.length,rowsReturned:b,rowsDiscarded:d.length-b,userLimit:t.userLimit,userFilter:!!t.userFilter,userSort:!!t.userSort});let _=this.enrichNestedDescs(l,t.nestedDeep);_.length>0&&d.length>0&&await this.execute(d,_,n,o+1,t.targetTable);for(let w of e){let $=this.adapter.keyOf(w[s]);w[t.relationName]=p.get($)||[]}}}});async function le(r,e,t){let n=new Map,o=0;async function i(){for(;o<r.length;){let f=o++,l=r[f];n.set(String(l),await e(l))}}let s=Math.min(t,r.length);if(s===0)return n;let a=Array.from({length:s},i);return await Promise.all(a),n}var rn=D(()=>{"use strict"});function N(r,e){switch(e){case"mysql":return`\`${r}\``;case"postgres":case"pg":case"sqlite":return`"${r}"`;case"mongodb":return r;default:return`\`${r}\``}}var $e=D(()=>{"use strict"});function q(r,e,t){e&&fn(r,e,t,"and")}function fn(r,e,t,n){switch(e.kind){case"true":return;case"false":n==="or"?r.orWhereRaw("1 = 0"):r.whereRaw("1 = 0");return;case"and":{let o=function(){for(let i of e.children)this.where(function(){fn(this,i,t,"and")})};n==="or"?r.orWhere(o):r.where(o);return}case"or":{let o=function(){for(let i of e.children)this.orWhere(function(){fn(this,i,t,"and")})};n==="or"?r.orWhere(o):r.where(o);return}case"not":{let o=function(){this.whereNot(function(){fn(this,e.child,t,"and")})};n==="or"?r.orWhere(o):r.where(o);return}case"compare":ro(r,e,t,n);return;case"relation_exists":console.warn(`[sql-render-filter] relation_exists node reached renderer directly (rootTable=${t.rootTable}, joinId=${e.joinId}) \u2014 expected to be handled by applyRelationFilters. Filter silently skipped.`);return}}function ro(r,e,t,n){if(e.field.joinId!==null){console.warn(`[sql-render-filter] compare node has joinId=${e.field.joinId} (field=${e.field.fieldName}) but reached renderer \u2014 expected join path to handle it. Filter silently skipped.`);return}let o=io(e.field,t),i=!!e.field.isUuid,s=t.dbType==="postgres",a=n==="or"?"orWhere":"where",f=n==="or"?"orWhereRaw":"whereRaw",l=n==="or"?"orWhereIn":"whereIn",u=n==="or"?"orWhereNotIn":"whereNotIn",c=n==="or"?"orWhereBetween":"whereBetween",p=n==="or"?"orWhereNull":"whereNull",d=n==="or"?"orWhereNotNull":"whereNotNull";switch(e.op){case"eq":i&&s&&typeof e.value=="string"?r[f](`${o} = ?::uuid`,[e.value]):r[a](o,"=",e.value);return;case"neq":i&&s&&typeof e.value=="string"?r[f](`${o} != ?::uuid`,[e.value]):r[a](o,"!=",e.value);return;case"gt":i&&s&&typeof e.value=="string"?r[f](`${o} > ?::uuid`,[e.value]):r[a](o,">",e.value);return;case"gte":i&&s&&typeof e.value=="string"?r[f](`${o} >= ?::uuid`,[e.value]):r[a](o,">=",e.value);return;case"lt":i&&s&&typeof e.value=="string"?r[f](`${o} < ?::uuid`,[e.value]):r[a](o,"<",e.value);return;case"lte":i&&s&&typeof e.value=="string"?r[f](`${o} <= ?::uuid`,[e.value]):r[a](o,"<=",e.value);return;case"in":{let g=Kr(e.value);i&&s&&g.every(m=>typeof m=="string")?r[f](`${o} = ANY(?::uuid[])`,[g]):r[l](o,g);return}case"not_in":{let g=Kr(e.value);i&&s&&g.every(m=>typeof m=="string")?r[f](`${o} != ALL(?::uuid[])`,[g]):r[u](o,g);return}case"contains":Qn(r,o,e.value,"contains",t,n);return;case"starts_with":Qn(r,o,e.value,"starts_with",t,n);return;case"ends_with":Qn(r,o,e.value,"ends_with",t,n);return;case"between":Array.isArray(e.value)&&e.value.length===2&&r[c](o,[e.value[0],e.value[1]]);return;case"is_null":e.value===!0?r[p](o):r[d](o);return}}function Qn(r,e,t,n,o,i){let s=i==="or"?"orWhereRaw":"whereRaw";if(o.dbType==="postgres"){let f=n==="contains"?`lower(unaccent(${e})) ILIKE '%' || lower(unaccent(?)) || '%'`:n==="starts_with"?`lower(unaccent(${e})) ILIKE lower(unaccent(?)) || '%'`:`lower(unaccent(${e})) ILIKE '%' || lower(unaccent(?))`;r[s](f,[t]);return}if(o.dbType==="sqlite"){let f=n==="contains"?`lower(${e}) LIKE '%' || lower(?) || '%'`:n==="starts_with"?`lower(${e}) LIKE lower(?) || '%'`:`lower(${e}) LIKE '%' || lower(?)`;r[s](f,[t]);return}let a=n==="contains"?`lower(unaccent(${e})) COLLATE utf8mb4_general_ci LIKE CONCAT('%', lower(unaccent(?)) COLLATE utf8mb4_general_ci, '%')`:n==="starts_with"?`lower(unaccent(${e})) COLLATE utf8mb4_general_ci LIKE CONCAT(lower(unaccent(?)) COLLATE utf8mb4_general_ci, '%')`:`lower(unaccent(${e})) COLLATE utf8mb4_general_ci LIKE CONCAT('%', lower(unaccent(?)) COLLATE utf8mb4_general_ci)`;r[s](a,[t])}function io(r,e){return r.fieldName.includes(".")?r.fieldName:`${e.rootTable}.${r.fieldName}`}function Kr(r){return Array.isArray(r)?r:typeof r=="string"&&r.includes(",")?r.split(",").map(e=>e.trim()):[r]}var Jn=D(()=>{"use strict"});function ue(r){return r.columns.find(e=>e.isPrimary)||null}var dn=D(()=>{"use strict"});var Ur={};mn(Ur,{expandFieldsToJoinsAndSelect:()=>zn});async function zn(r,e,t,n,o,i){let s=[],a=[],f=await t(r);if(!f)return{select:[],batchFetchDescriptors:[]};let l=new Map;for(let c of e)if(c==="*"||!c.includes("."))l.has("")||l.set("",[]),l.get("").push(c);else{let p=c.split("."),d=p[0],g=p.slice(1).join(".");l.has(d)||l.set(d,[]),l.get(d).push(g)}let u=l.get("")||[];for(let c of u){if(c==="*"){let g=new Set;for(let y of f.relations||[])if(y.type==="many-to-one"||y.type==="one-to-one"&&!y.isInverse){let b=y.foreignKeyColumn||L(y.targetTableName);b&&g.add(b)}let m=new Set;for(let y of f.columns)g.has(y.name)||(s.push(`${r}.${y.name}`),m.add(y.name));for(let y of f.relations||[])!l.has(y.propertyName)&&!m.has(y.propertyName)&&l.set(y.propertyName,["id"]);continue}if(c.includes(".")){s.push(`${r}.${c}`);continue}if(f.columns?.find(g=>g.name===c)){s.push(`${r}.${c}`);continue}if(f.relations?.find(g=>g.propertyName===c)){l.has(c)||l.set(c,["id"]);continue}}return l.forEach((c,p)=>{if(p==="")return;let d=f.relations?.find(_=>_.propertyName===p);if(!d)return;if(d.type==="many-to-one"||d.type==="one-to-one"&&!d.isInverse){let _=d.foreignKeyColumn||L(d.targetTableName||d.targetTable),w=N(r,n),$=N(_,n),h=N(p,n);s.push(`${w}.${$} as ${h}`)}let m=d.targetTableName||d.targetTable,y=i?.[p],b=y?.fields!=null?Array.isArray(y.fields)?y.fields:String(y.fields).split(",").map(_=>_.trim()).filter(Boolean):c;a.push({relationName:p,type:d.type,targetTable:m,fields:b,isInverse:d.isInverse,fkColumn:d.foreignKeyColumn,mappedBy:d.mappedBy,junctionTableName:d.junctionTableName,junctionSourceColumn:d.junctionSourceColumn,junctionTargetColumn:d.junctionTargetColumn,userFilter:y?.filter,userSort:y?.sort,userLimit:y?.limit!==void 0?Number(y.limit):void 0,userPage:y?.page!==void 0?Number(y.page):void 0,nestedDeep:y?.deep})}),{select:s,batchFetchDescriptors:a}}var Vn=D(()=>{"use strict";Le();$e()});var ct,qn=D(()=>{"use strict";Le();$e();dn();et();Jn();At();vt();rn();ct=class{constructor(e,t="postgres",n){this.knex=e;this.dbType=t;this.metadata=n;this.pkField="id"}buildFilterTree(e,t){if(!e||!this.metadata)return null;let n=new ee,o=this.metadata?.tables?this.metadata:{tables:new Map(Object.entries(this.metadata))},{node:i}=he(e,t,o,n);return i}parseSortTokens(e,t,n){return e?(Array.isArray(e)?e:e.split(",").map(i=>i.trim()).filter(Boolean)).map(i=>{let s=i.startsWith("-"),f=(s?i.slice(1):i).split(".");if(f.length===1)return{column:n?`${n}.${f[0]}`:`${t}.${f[0]}`,order:s?"desc":"asc"};let l=f[f.length-1];return{column:`${`__sort_${f.slice(0,-1).join("_")}`}.${l}`,order:s?"desc":"asc"}}):[]}applySortJoins(e,t,n,o){if(!t||!this.metadata)return;let i=Array.isArray(t)?t:t.split(",").map(a=>a.trim()).filter(Boolean),s=new Set;for(let a of i){let l=(a.startsWith("-")?a.slice(1):a).split(".");if(l.length<=1)continue;let u=n,c=o||n;for(let p=0;p<l.length-1;p++){let d=l[p],g=this.metadata?.tables?.get(u);if(!g)break;let m=g.relations?.find(_=>_.propertyName===d);if(!m)break;let y=m.targetTableName||m.targetTable,b=`__sort_${l.slice(0,p+1).join("_")}`;if(!s.has(b)){s.add(b);let _=m.foreignKeyColumn||L(m.propertyName),w=this.metadata?.tables?.get(y),$=w&&ue(w)?.name||"id";e.leftJoin(`${y} as ${b}`,`${b}.${$}`,`${c}.${_}`)}u=y,c=b}}}toKnexSelect(e,t){let n=e.indexOf(" as ");if(n!==-1){let o=e.substring(0,n),i=e.substring(n+4),s=N(i,this.dbType),a=t?`${t}.${N(o,this.dbType)}`:N(o,this.dbType);return this.knex.raw(`${a} as ${s}`)}return t?this.knex.raw(`${t}.${N(e,this.dbType)} as ${N(e,this.dbType)}`):e}keyOf(e){return e==null?"":String(e)}buildScalarRef(e,t){return{[t||this.pkField]:e}}getTargetPkField(e){return ue(e)?.name||"id"}resolveOwnerFkKey(e){return e.relationName}resolveInverseFkField(e){let t=e.fkColumn;return!t&&e.mappedBy&&(t=L(e.mappedBy)),t||(t=L(e.targetTable)),t}resolveParentPk(e){return e&&ue(e)?.name||"id"}resolveFields(e,t){let{rootFields:n,subRelations:o}=Ze(e),i=[];if(n.includes("*")){let l=new Set;for(let u of t.relations||[])if(u.type==="many-to-one"||u.type==="one-to-one"&&!u.isInverse){let c=u.foreignKeyColumn||L(u.propertyName);c&&l.add(c)}for(let u of t.columns)l.has(u.name)||i.push(u.name);for(let u of t.relations||[])o.has(u.propertyName)||o.set(u.propertyName,["id"])}else for(let l of n){let u=t.columns.find(c=>c.name===l);u?i.push(u.name):t.relations?.find(p=>p.propertyName===l)&&!o.has(l)&&o.set(l,["id"])}let s=ue(t)?.name||"id";i.includes(s)||i.push(s),o.forEach((l,u)=>{let c=t.relations?.find(p=>p.propertyName===u);if(c&&(c.type==="many-to-one"||c.type==="one-to-one"&&!c.isInverse)){let p=c.foreignKeyColumn||L(c.propertyName);p&&i.push(`${p} as ${u}`)}});let a=[];return o.forEach((l,u)=>{let c=t.relations?.find(d=>d.propertyName===u);if(!c)return;let p=c.targetTableName||c.targetTable;p&&a.push({relationName:u,type:c.type,targetTable:p,fields:l,isInverse:c.isInverse,fkColumn:c.foreignKeyColumn,mappedBy:c.mappedBy,junctionTableName:c.junctionTableName,junctionSourceColumn:c.junctionSourceColumn,junctionTargetColumn:c.junctionTargetColumn})}),{isPkOnly:i.length===1&&i[0]===s&&a.length===0,nestedDescs:a,fetchSpec:{selectCols:i,pkCol:s}}}async fetchOwner(e,t,n,o){let i=o?.userFilter?this.buildFilterTree(o.userFilter,e):null,s=o?.userSort?this.parseSortTokens(o.userSort,e):[],a=n.selectCols.map(f=>this.toKnexSelect(f));return H(t,f=>{let l=this.knex(e).select(a).whereIn(n.pkCol,f);if(i&&q(l,i,{dbType:this.dbType,rootTable:e}),s.length>0){this.applySortJoins(l,o.userSort,e);for(let u of s)l.orderBy(u.column,u.order)}return l})}async fetchInverse(e,t,n,o,i){let s=t,a=o.selectCols.find(g=>g.startsWith(`${t} as `));a?s=a.split(" as ")[1].trim():o.selectCols.includes(t)||o.selectCols.push(t);let f=i?.userFilter?this.buildFilterTree(i.userFilter,e):null,l=i?.userSort?this.parseSortTokens(i.userSort,e):[],u=i?.userLimit,c=i?.userPage;if(u!==void 0){let g=c?(c-1)*u:0,m=o.selectCols.map(_=>this.toKnexSelect(_)),y=await le(n,async _=>{let w=this.knex(e).select(m).where(t,_);if(f&&q(w,f,{dbType:this.dbType,rootTable:e}),this.applySortJoins(w,i.userSort,e),l.length>0)for(let $ of l)w.orderBy($.column,$.order);else w.orderBy(o.pkCol,"asc");return g>0&&w.offset(g),w.limit(u),w},16),b=[];for(let[_,w]of y.entries()){let $=n.find(h=>String(h)===_);for(let h of w)h[t]||(h[t]=$??_),b.push(h)}return{docs:b,groupKeyField:s}}let p=o.selectCols.map(g=>this.toKnexSelect(g));return{docs:await H(n,g=>{let m=this.knex(e).select(p).whereIn(t,g);if(f&&q(m,f,{dbType:this.dbType,rootTable:e}),this.applySortJoins(m,i?.userSort,e),l.length>0)for(let y of l)m.orderBy(y.column,y.order);else m.orderBy(o.pkCol,"asc");return m}),groupKeyField:s}}postProcessInverseChild(e,t,n){n||delete e[t]}async fetchM2M(e,t,n,o,i){let s=this.resolveParentPk(n),a=e.map(w=>w[s]).filter(w=>w!=null);if(a.length===0)return{grouped:new Map,docs:[]};let f=t.junctionTableName,l=t.junctionSourceColumn,u=t.junctionTargetColumn;if(!f||!l||!u)throw new Error(`Missing junction table config for relation: ${t.relationName}`);let c=t.userFilter?this.buildFilterTree(t.userFilter,t.targetTable):null,p=t.userSort?this.parseSortTokens(t.userSort,t.targetTable,"t"):[],d=t.userLimit,g=t.userPage;if(i.selectCols.length===1&&i.selectCols[0]===i.pkCol&&!c&&!d){let w=await H(a,h=>this.knex(f).select([`${l} as __sourceId__`,`${u} as __targetId__`]).whereIn(l,h).orderBy(u,"asc")),$=new Map;for(let h of w){let k=this.keyOf(h.__sourceId__);$.has(k)||$.set(k,[]),$.get(k).push({[i.pkCol]:h.__targetId__})}return{grouped:$,docs:[]}}let y=i.selectCols.map(w=>this.toKnexSelect(w,"t"));if(d!==void 0){let w=g?(g-1)*d:0,$=new Map;for(let S of a)$.set(this.keyOf(S),[]);let h=await le(a,async S=>{let R=this.knex(f).join(`${t.targetTable} as t`,`${f}.${u}`,`t.${i.pkCol}`).select(y).where(`${f}.${l}`,S);if(c&&q(R,c,{dbType:this.dbType,rootTable:"t"}),this.applySortJoins(R,t.userSort,t.targetTable,"t"),p.length>0)for(let F of p)R.orderBy(F.column,F.order);else R.orderBy(`t.${i.pkCol}`,"asc");return w>0&&R.offset(w),R.limit(d),R},16),k=[];for(let[S,R]of h.entries()){$.set(S,R);for(let F of R)k.push(F)}return{grouped:$,docs:k}}let b=await H(a,w=>{let $=this.knex(f).join(`${t.targetTable} as t`,`${f}.${u}`,`t.${i.pkCol}`).select([`${f}.${l} as __sourceId__`,...y]).whereIn(`${f}.${l}`,w);if(c&&q($,c,{dbType:this.dbType,rootTable:"t"}),this.applySortJoins($,t.userSort,t.targetTable,"t"),p.length>0)for(let h of p)$.orderBy(h.column,h.order);else $.orderBy(`t.${i.pkCol}`,"asc");return $}),_=new Map;for(let w of b){let $=w.__sourceId__;delete w.__sourceId__;let h=this.keyOf($);_.has(h)||_.set(h,[]),_.get(h).push(w)}return{grouped:_,docs:b}}}});var zr={};mn(zr,{executeBatchFetches:()=>Gn});async function Gn(r,e,t,n,o=3,i=0,s,a="postgres",f,l){let u=new ct(r,a,f);await new _e(u,n,l).execute(e,t,o,i,s)}var Yn=D(()=>{"use strict";et();qn()});var lo={};mn(lo,{ALL_SUPPORTED_OPERATORS:()=>Ct,AuthenticationException:()=>Ae,AuthorizationException:()=>Oe,BadRequestException:()=>E,BatchFetchEngine:()=>_e,BusinessLogicException:()=>Ce,ConfigurationException:()=>_t,DEFAULT_TIMEOUT_MS:()=>Dt,DOTTED_PATH_MAX_HOPS:()=>dt,DatabaseException:()=>ge,DuplicateResourceException:()=>ve,ErrorHandler:()=>Me,ExecutorEngineService:()=>Qe,ExternalServiceException:()=>ht,FIELD_OPERATORS:()=>Y,FileNotFoundException:()=>Tt,FileSizeExceededException:()=>$t,FileUploadException:()=>wt,HttpException:()=>Re,ISOLATED_EXECUTOR_RUNTIME_LOG_PATH:()=>Kt,InvalidTokenException:()=>mt,IsolatedExecutorService:()=>ze,JoinRegistry:()=>ee,LOGICAL_OPERATORS:()=>Nn,MongoBatchAdapter:()=>tt,MongoQueryExecutor:()=>ot,PER_PARENT_CONCURRENCY:()=>ae,QueryBuilderService:()=>ft,QueryPlanner:()=>K,ResourceNotFoundException:()=>Ne,SchemaException:()=>bt,ScriptExecutionException:()=>pe,ScriptTimeoutException:()=>de,ServiceUnavailableException:()=>Ie,SqlBatchAdapter:()=>ct,SqlQueryExecutor:()=>ut,TokenExpiredException:()=>yt,ValidationException:()=>Fe,WHERE_IN_CHUNK_SIZE:()=>vr,WorkerPool:()=>Rt,appendIsolatedExecutorRuntimeLog:()=>U,applyOperatorToMatch:()=>Gt,applyRelationFilters:()=>Ue,applyWhereToKnex:()=>lt,assertFieldOperatorValueIsClean:()=>Xt,buildAggregateFilter:()=>it,buildMongoCharFoldMapJson:()=>Cn,buildMongoFoldTextSearchJs:()=>zt,buildRelationSubquery:()=>Mt,buildSqlWherePartsFromFieldAst:()=>Pt,buildWhereClause:()=>ne,camelToSnake:()=>mr,chunkedFetch:()=>H,compileScriptSource:()=>ie,computeEngineTuning:()=>wn,createEnfyraKernel:()=>ao,dslOpToCompareOp:()=>Yt,encodeMainThreadToIsolate:()=>kn,escapeSqlValue:()=>Wr,executeBatchFetches:()=>Gn,executeMongoBatchFetches:()=>on,expandFieldsToJoinsAndSelect:()=>zn,getEffectiveCpuCount:()=>_n,getEffectiveMemoryBytes:()=>kt,getEngineTuning:()=>Qt,getExecutableScript:()=>pi,getForeignKeyColumnName:()=>L,getIoAbortSignal:()=>fr,getJunctionColumnNames:()=>je,getJunctionTableName:()=>Pe,getPrimaryKeyColumn:()=>ue,getScriptLegacyField:()=>Tn,getShortFkConstraintName:()=>gr,getShortFkName:()=>hr,getShortIndexName:()=>br,getShortPkName:()=>pr,hasAggregateQuery:()=>Ln,hasLogicalOperators:()=>ce,isExecutableJavaScript:()=>ir,isScriptTable:()=>$n,mergeAggregateValue:()=>Te,normalizeAggregateQuery:()=>rt,normalizeFlowStepScriptConfig:()=>gi,normalizeScriptLanguage:()=>xt,normalizeScriptPatch:()=>di,normalizeScriptRecord:()=>fi,parseBatchFields:()=>Ze,parseFields:()=>sn,parseFilter:()=>he,perParentRun:()=>le,quoteIdentifier:()=>N,resolveExecutableScript:()=>or,rewriteFilterDenyingFields:()=>Hr,rewriteSortDroppingDenied:()=>qr,separateFilters:()=>V,snakeToCamel:()=>yr,throwUnsupportedFieldOperator:()=>Be,transformCode:()=>bn,validateDeepOptions:()=>Xn,validateFilterShape:()=>B,whereToMongoFilter:()=>Ge});module.exports=ti(lo);var ni={"@CACHE":"$ctx.$cache","@REPOS":"$ctx.$repos","@HELPERS":"$ctx.$helpers","@FETCH":"$ctx.$helpers.$fetch","@LOGS":"$ctx.$logs","@BODY":"$ctx.$body","@DATA":"$ctx.$data","@PARAMS":"$ctx.$params","@QUERY":"$ctx.$query","@USER":"$ctx.$user","@REQ":"$ctx.$req","@RES":"$ctx.$res","@SHARE":"$ctx.$share","@API":"$ctx.$api","@UPLOADED_FILE":"$ctx.$uploadedFile","@PKGS":"$ctx.$pkgs","@SOCKET":"$ctx.$socket","@TRIGGER":"$ctx.$trigger","@FLOW":"$ctx.$flow","@FLOW_PAYLOAD":"$ctx.$flow.$payload","@FLOW_LAST":"$ctx.$flow.$last","@FLOW_META":"$ctx.$flow.$meta","@THROW400":"$ctx.$throw['400']","@THROW401":"$ctx.$throw['401']","@THROW403":"$ctx.$throw['403']","@THROW404":"$ctx.$throw['404']","@THROW409":"$ctx.$throw['409']","@THROW422":"$ctx.$throw['422']","@THROW429":"$ctx.$throw['429']","@THROW500":"$ctx.$throw['500']","@THROW503":"$ctx.$throw['503']","@THROW":"$ctx.$throw","@ERROR":"$ctx.$error","@STATUS":"$ctx.$statusCode"},fe=0,er=1,tr=2,hn=3,nr=4,rr=5;function bn(r){let e=r.length,t="",n=0,o=fe,i=0,s=0;for(;n<e;){let a=r[n],f=r[n+1];switch(o){case fe:if(a==='"')o=er,t+=a,n++;else if(a==="'")o=tr,t+=a,n++;else if(a==="`")o=hn,t+=a,n++;else if(a==="/"&&f==="/")o=nr,t+=a+f,n+=2;else if(a==="/"&&f==="*")o=rr,t+=a+f,n+=2;else if(a==="@"||a==="#"||a==="%"){let l=n,u=a;for(n++;n<e;){let p=r[n];if(p>="A"&&p<="Z"||p>="0"&&p<="9"||p==="_")n++;else break}let c=r.substring(l,n);if(u==="@"){let p=ni[c];t+=p||c}else u==="#"?t+="$ctx.$repos."+c.substring(1):t+="$ctx.$pkgs."+c.substring(1)}else a==="{"?(i>0&&s++,t+=a,n++):a==="}"&&i>0?s>0?(s--,t+=a,n++):(i--,t+=a,n++,o=hn):(t+=a,n++);break;case er:t+=a,a==="\\"?(n++,n<e&&(t+=r[n],n++)):(a==='"'&&(o=fe),n++);break;case tr:t+=a,a==="\\"?(n++,n<e&&(t+=r[n],n++)):(a==="'"&&(o=fe),n++);break;case hn:t+=a,a==="\\"?(n++,n<e&&(t+=r[n],n++)):a==="`"?(o=fe,n++):a==="$"&&n+1<e&&r[n+1]==="{"?(t+="{",n+=2,i++,o=fe):n++;break;case nr:t+=a,a===`
|
|
2
|
-
`&&(
|
|
3
|
-
`;Wt.appendFileSync(Kt,t)}catch{}}var
|
|
4
|
-
`));return n.outputText.trimEnd()}function
|
|
1
|
+
"use strict";var Yr=Object.create;var Lt=Object.defineProperty;var Xr=Object.getOwnPropertyDescriptor;var Zr=Object.getOwnPropertyNames;var ei=Object.getPrototypeOf,ti=Object.prototype.hasOwnProperty;var D=(r,e)=>()=>(r&&(e=r(r=0)),e);var mn=(r,e)=>{for(var t in e)Lt(r,t,{get:e[t],enumerable:!0})},er=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of Zr(e))!ti.call(r,i)&&i!==t&&Lt(r,i,{get:()=>e[i],enumerable:!(n=Xr(e,i))||n.enumerable});return r};var ie=(r,e,t)=>(t=r!=null?Yr(ei(r)):{},er(e||!r||!r.__esModule?Lt(t,"default",{value:r,enumerable:!0}):t,r)),ni=r=>er(Lt({},"__esModule",{value:!0}),r);function xn(r){return pr.createHash("md5").update(r).digest("hex").substring(0,8)}function gr(r){return r.length<=Sn-3?`${r}_pk`:`j_${xn(r)}_pk`}function yr(r,e,t){let n=`${r}_${e}_foreign`;return n.length<=Sn?n:`j_${xn(r)}_${t}_fk`}function Pe(r,e,t){let n=`${r}_${e}_${t}`;if(n.length<=Sn)return n;let i=xn(n),o=r.replace(/_definition/g,"").substring(0,10),s=e.substring(0,10),a=t.replace(/_definition/g,"").substring(0,10);return`j_${i}_${o}_${s}_${a}`}function L(r){return`${r}Id`}function je(r,e,t){let n=L(r);if(r===t){let o=L(e);return{sourceColumn:n,targetColumn:o}}let i=L(t);return{sourceColumn:n,targetColumn:i}}function mr(r){return r.replace(/_([a-z])/g,e=>e[1].toUpperCase())}function hr(r){return r.replace(/([A-Z])/g,"_$1").toLowerCase()}function br(r,e,t){return`${r}_${e}_${t}_fk`}function _r(r,e,t){return`${r}_${e}_${t}_idx`}var pr,Sn,Le=D(()=>{"use strict";pr=ie(require("crypto")),Sn=63});function Yt(r){return Ai[r]??null}var Y,Nn,Ct,Ai,Ft=D(()=>{"use strict";Y=new Set(["_eq","_neq","_gt","_gte","_lt","_lte","_in","_not_in","_nin","_contains","_starts_with","_ends_with","_between","_is_null","_is_not_null"]),Nn=new Set(["_and","_or","_not"]),Ct=[...Array.from(Nn),...Array.from(Y)],Ai={_eq:"eq",_neq:"neq",_gt:"gt",_gte:"gte",_lt:"lt",_lte:"lte",_in:"in",_not_in:"not_in",_nin:"not_in",_contains:"contains",_starts_with:"starts_with",_ends_with:"ends_with",_between:"between"}});var E,Nt=D(()=>{"use strict";E=class extends Error{constructor(t="Bad Request",n){let i=Array.isArray(t),o=i?t.join("; ")||"Bad Request":typeof t=="string"?t:JSON.stringify(t);super(o);this.statusCode=400;this.errorCode="BAD_REQUEST";this.name="BadRequestException",this.details=n,i&&(this.messages=t)}}});function kr(){let r=process.env.DB_URI||"";return r.startsWith("mongodb://")||r.startsWith("mongodb+srv://")}var Sr=D(()=>{"use strict"});function Be(r,e,t){throw new E({message:`Unsupported filter operator "${r}" on field "${e}"${t?` (table "${t}")`:""}. Supported operators: ${Ct.join(", ")}.`,error:"UnsupportedFilterOperator",operator:r,field:e,supportedOperators:Ct})}function Xt(r,e,t){if(!e||typeof e!="object"||Array.isArray(e))return;let n=kr();for(let i of Object.keys(e))if(i.startsWith("_")&&!Y.has(i)){if(n&&i==="_id")continue;Be(i,r,t)}}function B(r,e,t){if(!r||typeof r!="object")return;let n=t?.tables?.get(e),i=new Set((n?.columns??[]).map(s=>s.name)),o=new Map((n?.relations??[]).map(s=>[s.propertyName,s]));for(let[s,a]of Object.entries(r)){if(Oi.has(s)){if(Array.isArray(a))for(let l of a)B(l,e,t);else a&&typeof a=="object"&&B(a,e,t);continue}let f=o.get(s);if(f){if(a&&typeof a=="object"&&!Array.isArray(a)){Xt(s,a,e);let l=f.targetTableName||f.targetTable;if(l){let u=Object.keys(a).filter(c=>!c.startsWith("_"));if(u.length>0){let c={};for(let p of u)c[p]=a[p];B(c,l,t)}}}continue}s.startsWith("_")&&!i.has(s)&&s!=="_id"&&Be(s,s,e),a&&typeof a=="object"&&!Array.isArray(a)&&Xt(s,a,e)}}var Oi,Ye=D(()=>{"use strict";Nt();Ft();Sr();Oi=new Set(["_and","_or","_not"])});function be(r,e,t,n){return!r||typeof r!="object"?{node:null,hasRelationFilters:!1}:Zt(r,{tableName:e,metadata:t,registry:n,parentJoinId:null,currentJoinId:null,currentTable:e})}function Zt(r,e){if(!r||typeof r!="object")return{node:null,hasRelationFilters:!1};let t=[],n=!1;for(let[i,o]of Object.entries(r)){let s=Ii(i,o,e);s.hasRelationFilters&&(n=!0),s.node&&t.push(s.node)}return t.length===0?{node:null,hasRelationFilters:n}:t.length===1?{node:t[0],hasRelationFilters:n}:{node:{kind:"and",children:t},hasRelationFilters:n}}function Ii(r,e,t){if(r==="_and")return xr("and",e,t);if(r==="_or")return xr("or",e,t);if(r==="_not"){let l=Zt(e,t);return l.node?{node:{kind:"not",child:l.node},hasRelationFilters:l.hasRelationFilters}:{node:null,hasRelationFilters:l.hasRelationFilters}}let n=t.metadata?.tables?.get(t.currentTable),i=n?.columns?.some(l=>l.name==="_id"&&l.isPrimary),o=n?.columns?.some(l=>l.name==="id"),a=r==="id"?i&&!o?"_id":"id":r,f=n?.relations?.find(l=>l.propertyName===a);return f?Mi(a,e,f,t):n&&!n.columns?.find(u=>u.name===a)?(r.startsWith("_")&&r!=="_id"&&Be(r,r,t.currentTable),console.warn(`[filter-parser] Unknown field "${r}" on table "${t.currentTable}" \u2014 skipped (not a column or relation in metadata).`),{node:null,hasRelationFilters:!1}):Ei(a,e,t)}function xr(r,e,t){if(!Array.isArray(e))return{node:null,hasRelationFilters:!1};let n=[],i=!1;for(let o of e){let s=Zt(o,t);s.hasRelationFilters&&(i=!0),s.node&&n.push(s.node)}return n.length===0?{node:null,hasRelationFilters:i}:n.length===1?{node:n[0],hasRelationFilters:i}:{node:{kind:r,children:n},hasRelationFilters:i}}function Mi(r,e,t,n){if(typeof e!="object"||e===null)return{node:null,hasRelationFilters:!0};let i=Object.keys(e),o=i.length===1&&(i[0]==="_is_null"||i[0]==="_is_not_null"||i[0]==="_eq"||i[0]==="_neq"||i[0]==="_in"||i[0]==="_not_in"||i[0]==="_nin"),s=n.registry.registerWithParent(n.currentTable,r,n.metadata,"left",n.currentJoinId,"filter");if(o&&i[0]==="_is_null")return s?{node:{kind:"relation_exists",joinId:s,negate:e._is_null===!0},hasRelationFilters:!0}:{node:null,hasRelationFilters:!0};if(o&&i[0]==="_is_not_null")return s?{node:{kind:"relation_exists",joinId:s,negate:e._is_not_null!==!0},hasRelationFilters:!0}:{node:null,hasRelationFilters:!0};if(o&&(i[0]==="_eq"||i[0]==="_neq")&&e[i[0]]===null)return s?{node:{kind:"relation_exists",joinId:s,negate:i[0]==="_eq"},hasRelationFilters:!0}:{node:null,hasRelationFilters:!0};if(!s)return{node:null,hasRelationFilters:!0};let a=t.targetTableName||t.targetTable,f={...n,parentJoinId:n.currentJoinId,currentJoinId:s,currentTable:a},l=new Set(["_eq","_neq","_in","_not_in","_nin","_gt","_gte","_lt","_lte"]),c=i.length>0&&i.every(d=>l.has(d))?{id:e}:e;return{node:Zt(c,f).node,hasRelationFilters:!0}}function Ei(r,e,t){let n={joinId:t.currentJoinId,fieldName:r,isUuid:ji(r,t)};if(e===null)return{node:{kind:"compare",field:n,op:"is_null",value:!0},hasRelationFilters:!1};if(typeof e!="object")return{node:{kind:"compare",field:n,op:"eq",value:e},hasRelationFilters:!1};for(let s of Object.keys(e))s.startsWith("_")&&!Y.has(s)&&Be(s,r,t.tableName);let i=Object.entries(e).filter(([s])=>Y.has(s));if(i.length===0)return{node:{kind:"compare",field:n,op:"eq",value:e},hasRelationFilters:!1};let o=[];for(let[s,a]of i){let f=Pi(n,s,a);f&&o.push(f)}return o.length===0?{node:null,hasRelationFilters:!1}:o.length===1?{node:o[0],hasRelationFilters:!1}:{node:{kind:"and",children:o},hasRelationFilters:!1}}function Pi(r,e,t){if(e==="_is_null")return{kind:"compare",field:r,op:"is_null",value:t===!0};if(e==="_is_not_null")return{kind:"compare",field:r,op:"is_null",value:t!==!0};let n=Yt(e);return n?{kind:"compare",field:r,op:n,value:t}:null}function ji(r,e){let t=e.metadata?.tables?.get(e.currentTable);if(!t)return!1;let n=r.includes(".")?r.split(".").pop():r,i=t.columns?.find(s=>s.name===n);if(!i)return!1;let o=(i.type||"").toLowerCase();return o==="uuid"||o==="uuidv4"||o.includes("uuid")}var vt=D(()=>{"use strict";Ft();Ye()});var te,At=D(()=>{"use strict";te=class{constructor(){this.map=new Map}size(){return this.map.size}has(e){return this.map.has(e)}get(e){return this.map.get(e)}getAll(){return Array.from(this.map.values())}registerWithParent(e,t,n,i="left",o=null,s="data"){let a=o?`${o}.${t}`:t;if(this.map.has(a)){let p=this.map.get(a);return i==="inner"&&(p.joinType="inner"),p.purposes.includes(s)||p.purposes.push(s),a}let f=n?.tables?.get(e);if(!f)return null;let l=f.relations?.find(p=>p.propertyName===t);if(!l)return null;let u=l.targetTableName||l.targetTable;if(!u)return null;let c={id:a,propertyName:t,parentTable:e,targetTable:u,relationType:l.type,parentJoinId:o,joinType:i,relationMeta:l,purposes:[s]};return this.map.set(a,c),a}}});async function H(r,e){if(r.length<=5e3)return e(r);let t=[];for(let i=0;i<r.length;i+=5e3)t.push(r.slice(i,i+5e3));return(await Promise.all(t.map(e))).flat()}function Ze(r){let e=[],t=new Map;for(let n of r)if(n==="*"||!n.includes("."))e.push(n);else{let i=n.split("."),o=i[0],s=i.slice(1).join(".");t.has(o)||t.set(o,[]),t.get(o).push(s)}return{rootFields:e,subRelations:t}}var le,Ar,_e,et=D(()=>{"use strict";le=16,Ar=5e3;_e=class{constructor(e,t,n){this.adapter=e;this.metadataGetter=t;this.trace=n}enrichNestedDescs(e,t){return!t||Object.keys(t).length===0?e:e.map(n=>{let i=t[n.relationName];if(!i)return n;let o=i.fields!=null?Array.isArray(i.fields)?i.fields:String(i.fields).split(",").map(s=>s.trim()).filter(Boolean):n.fields;return{...n,fields:o,userFilter:i.filter??n.userFilter,userSort:i.sort??n.userSort,userLimit:i.limit!==void 0?Number(i.limit):n.userLimit,userPage:i.page!==void 0?Number(i.page):n.userPage,nestedDeep:i.deep??n.nestedDeep}})}async execute(e,t,n=3,i=0,o){if(e.length===0||t.length===0||i>=n)return;let s;o&&(s=await this.metadataGetter(o)??void 0),await Promise.all(t.map(a=>a.type==="many-to-one"||a.type==="one-to-one"&&!a.isInverse?this.fetchOwnerRelation(e,a,n,i):a.type==="one-to-many"||a.type==="one-to-one"&&a.isInverse?this.fetchInverseRelation(e,a,n,i,s):a.type==="many-to-many"?this.fetchM2MRelation(e,a,n,i,s):Promise.resolve()))}async fetchOwnerRelation(e,t,n,i){let o=this.adapter.resolveOwnerFkKey(t),s=new Set,a=[];for(let b of e){let _=b[o];if(_==null)continue;let w=this.adapter.keyOf(_);s.has(w)||(s.add(w),a.push(_))}if(a.length===0){for(let b of e)b[o]=null,t.fkColumn&&t.fkColumn!==o&&delete b[t.fkColumn];return}let f=await this.metadataGetter(t.targetTable);if(!f)throw new Error(`Metadata not found for target table: ${t.targetTable}`);let{isPkOnly:l,nestedDescs:u,fetchSpec:c}=this.adapter.resolveFields(t.fields,f),p=this.adapter.getTargetPkField(f);if(l){for(let b of e){let _=b[o];b[o]=_!=null?this.adapter.buildScalarRef(_,p):null,t.fkColumn&&t.fkColumn!==o&&delete b[t.fkColumn]}return}let d=performance.now(),g=await this.adapter.fetchOwner(t.targetTable,a,c,t);this.trace?.dur(`batch_fetch_L${i}_${t.relationName}`,d,{relationType:t.type,targetTable:t.targetTable,strategy:"batch-in",roundtrips:Math.ceil(a.length/5e3)||1,rowsTransferred:g.length,rowsReturned:g.length,rowsDiscarded:0,userFilter:!!t.userFilter,userSort:!!t.userSort});let m=this.enrichNestedDescs(u,t.nestedDeep);m.length>0&&await this.execute(g,m,n,i+1,t.targetTable);let y=new Map;for(let b of g)y.set(this.adapter.keyOf(b[p]),b);for(let b of e){let _=b[o];b[o]=_!=null&&y.get(this.adapter.keyOf(_))||null,t.fkColumn&&t.fkColumn!==o&&delete b[t.fkColumn]}}async fetchInverseRelation(e,t,n,i,o){let s=this.adapter.resolveParentPk(o),a=e.map(S=>S[s]).filter(S=>S!=null);if(a.length===0)return;let f=this.adapter.resolveInverseFkField(t),l=await this.metadataGetter(t.targetTable);if(!l)throw new Error(`Metadata not found for target table: ${t.targetTable}`);let{nestedDescs:u,fetchSpec:c}=this.adapter.resolveFields(t.fields,l),p=performance.now(),{docs:d,groupKeyField:g}=await this.adapter.fetchInverse(t.targetTable,f,a,c,t),m=new Map,y=t.fields.includes(f)||t.fields.includes("*");for(let S of d){let R=S[g],F=this.adapter.keyOf(R);m.has(F)||m.set(F,[]),m.get(F).push(S)}let b=t.userLimit!==void 0?"per-parent-c16":"batch-in",_=t.userLimit!==void 0?a.length:Math.ceil(a.length/5e3)||1,w=t.userLimit!==void 0?Math.ceil(a.length/16):void 0,$=Array.from(m.values()).reduce((S,R)=>S+R.length,0);if(this.trace?.dur(`batch_fetch_L${i}_${t.relationName}`,p,{relationType:t.type,targetTable:t.targetTable,strategy:b,roundtrips:_,concurrencyWaves:w,rowsTransferred:d.length,rowsReturned:$,rowsDiscarded:d.length-$,userLimit:t.userLimit,userFilter:!!t.userFilter,userSort:!!t.userSort}),this.adapter.postProcessInverseChild)for(let S of d)this.adapter.postProcessInverseChild(S,f,y);let h=this.enrichNestedDescs(u,t.nestedDeep);h.length>0&&await this.execute(d,h,n,i+1,t.targetTable);let k=t.type==="one-to-one";for(let S of e){let R=this.adapter.keyOf(S[s]),F=m.get(R)||[];S[t.relationName]=k?F[0]||null:F}}async fetchM2MRelation(e,t,n,i,o){let s=this.adapter.resolveParentPk(o),a=e.map(w=>w[s]).filter(w=>w!=null);if(a.length===0)return;let f=await this.metadataGetter(t.targetTable);if(!f)throw new Error(`Metadata not found for target table: ${t.targetTable}`);let{nestedDescs:l,fetchSpec:u}=this.adapter.resolveFields(t.fields,f),c=performance.now(),{grouped:p,docs:d}=await this.adapter.fetchM2M(e,t,o,f,u),g=t.userLimit!==void 0?"m2m-per-parent-c16":"m2m-batch",m=t.userLimit!==void 0?a.length:Math.ceil(a.length/5e3)||1,y=t.userLimit!==void 0?Math.ceil(a.length/16):void 0,b=Array.from(p.values()).reduce((w,$)=>w+$.length,0);this.trace?.dur(`batch_fetch_L${i}_${t.relationName}`,c,{relationType:t.type,targetTable:t.targetTable,strategy:g,roundtrips:m,concurrencyWaves:y,rowsTransferred:d.length,rowsReturned:b,rowsDiscarded:d.length-b,userLimit:t.userLimit,userFilter:!!t.userFilter,userSort:!!t.userSort});let _=this.enrichNestedDescs(l,t.nestedDeep);_.length>0&&d.length>0&&await this.execute(d,_,n,i+1,t.targetTable);for(let w of e){let $=this.adapter.keyOf(w[s]);w[t.relationName]=p.get($)||[]}}}});async function ce(r,e,t){let n=new Map,i=0;async function o(){for(;i<r.length;){let f=i++,l=r[f];n.set(String(l),await e(l))}}let s=Math.min(t,r.length);if(s===0)return n;let a=Array.from({length:s},o);return await Promise.all(a),n}var rn=D(()=>{"use strict"});function N(r,e){switch(e){case"mysql":return`\`${r}\``;case"postgres":case"pg":case"sqlite":return`"${r}"`;case"mongodb":return r;default:return`\`${r}\``}}var $e=D(()=>{"use strict"});function q(r,e,t){e&&fn(r,e,t,"and")}function fn(r,e,t,n){switch(e.kind){case"true":return;case"false":n==="or"?r.orWhereRaw("1 = 0"):r.whereRaw("1 = 0");return;case"and":{let i=function(){for(let o of e.children)this.where(function(){fn(this,o,t,"and")})};n==="or"?r.orWhere(i):r.where(i);return}case"or":{let i=function(){for(let o of e.children)this.orWhere(function(){fn(this,o,t,"and")})};n==="or"?r.orWhere(i):r.where(i);return}case"not":{let i=function(){this.whereNot(function(){fn(this,e.child,t,"and")})};n==="or"?r.orWhere(i):r.where(i);return}case"compare":io(r,e,t,n);return;case"relation_exists":console.warn(`[sql-render-filter] relation_exists node reached renderer directly (rootTable=${t.rootTable}, joinId=${e.joinId}) \u2014 expected to be handled by applyRelationFilters. Filter silently skipped.`);return}}function io(r,e,t,n){if(e.field.joinId!==null){console.warn(`[sql-render-filter] compare node has joinId=${e.field.joinId} (field=${e.field.fieldName}) but reached renderer \u2014 expected join path to handle it. Filter silently skipped.`);return}let i=oo(e.field,t),o=!!e.field.isUuid,s=t.dbType==="postgres",a=n==="or"?"orWhere":"where",f=n==="or"?"orWhereRaw":"whereRaw",l=n==="or"?"orWhereIn":"whereIn",u=n==="or"?"orWhereNotIn":"whereNotIn",c=n==="or"?"orWhereBetween":"whereBetween",p=n==="or"?"orWhereNull":"whereNull",d=n==="or"?"orWhereNotNull":"whereNotNull";switch(e.op){case"eq":o&&s&&typeof e.value=="string"?r[f](`${i} = ?::uuid`,[e.value]):r[a](i,"=",e.value);return;case"neq":o&&s&&typeof e.value=="string"?r[f](`${i} != ?::uuid`,[e.value]):r[a](i,"!=",e.value);return;case"gt":o&&s&&typeof e.value=="string"?r[f](`${i} > ?::uuid`,[e.value]):r[a](i,">",e.value);return;case"gte":o&&s&&typeof e.value=="string"?r[f](`${i} >= ?::uuid`,[e.value]):r[a](i,">=",e.value);return;case"lt":o&&s&&typeof e.value=="string"?r[f](`${i} < ?::uuid`,[e.value]):r[a](i,"<",e.value);return;case"lte":o&&s&&typeof e.value=="string"?r[f](`${i} <= ?::uuid`,[e.value]):r[a](i,"<=",e.value);return;case"in":{let g=Wr(e.value);o&&s&&g.every(m=>typeof m=="string")?r[f](`${i} = ANY(?::uuid[])`,[g]):r[l](i,g);return}case"not_in":{let g=Wr(e.value);o&&s&&g.every(m=>typeof m=="string")?r[f](`${i} != ALL(?::uuid[])`,[g]):r[u](i,g);return}case"contains":Jn(r,i,e.value,"contains",t,n);return;case"starts_with":Jn(r,i,e.value,"starts_with",t,n);return;case"ends_with":Jn(r,i,e.value,"ends_with",t,n);return;case"between":Array.isArray(e.value)&&e.value.length===2&&r[c](i,[e.value[0],e.value[1]]);return;case"is_null":e.value===!0?r[p](i):r[d](i);return}}function Jn(r,e,t,n,i,o){let s=o==="or"?"orWhereRaw":"whereRaw";if(i.dbType==="postgres"){let f=n==="contains"?`lower(unaccent(${e})) ILIKE '%' || lower(unaccent(?)) || '%'`:n==="starts_with"?`lower(unaccent(${e})) ILIKE lower(unaccent(?)) || '%'`:`lower(unaccent(${e})) ILIKE '%' || lower(unaccent(?))`;r[s](f,[t]);return}if(i.dbType==="sqlite"){let f=n==="contains"?`lower(${e}) LIKE '%' || lower(?) || '%'`:n==="starts_with"?`lower(${e}) LIKE lower(?) || '%'`:`lower(${e}) LIKE '%' || lower(?)`;r[s](f,[t]);return}let a=n==="contains"?`lower(unaccent(${e})) COLLATE utf8mb4_general_ci LIKE CONCAT('%', lower(unaccent(?)) COLLATE utf8mb4_general_ci, '%')`:n==="starts_with"?`lower(unaccent(${e})) COLLATE utf8mb4_general_ci LIKE CONCAT(lower(unaccent(?)) COLLATE utf8mb4_general_ci, '%')`:`lower(unaccent(${e})) COLLATE utf8mb4_general_ci LIKE CONCAT('%', lower(unaccent(?)) COLLATE utf8mb4_general_ci)`;r[s](a,[t])}function oo(r,e){return r.fieldName.includes(".")?r.fieldName:`${e.rootTable}.${r.fieldName}`}function Wr(r){return Array.isArray(r)?r:typeof r=="string"&&r.includes(",")?r.split(",").map(e=>e.trim()):[r]}var zn=D(()=>{"use strict"});function fe(r){return r.columns.find(e=>e.isPrimary)||null}var dn=D(()=>{"use strict"});var Qr={};mn(Qr,{expandFieldsToJoinsAndSelect:()=>Vn});async function Vn(r,e,t,n,i,o){let s=[],a=[],f=await t(r);if(!f)return{select:[],batchFetchDescriptors:[]};let l=new Map;for(let c of e)if(c==="*"||!c.includes("."))l.has("")||l.set("",[]),l.get("").push(c);else{let p=c.split("."),d=p[0],g=p.slice(1).join(".");l.has(d)||l.set(d,[]),l.get(d).push(g)}let u=l.get("")||[];for(let c of u){if(c==="*"){let g=new Set;for(let y of f.relations||[])if(y.type==="many-to-one"||y.type==="one-to-one"&&!y.isInverse){let b=y.foreignKeyColumn||L(y.targetTableName);b&&g.add(b)}let m=new Set;for(let y of f.columns)g.has(y.name)||(s.push(`${r}.${y.name}`),m.add(y.name));for(let y of f.relations||[])!l.has(y.propertyName)&&!m.has(y.propertyName)&&l.set(y.propertyName,["id"]);continue}if(c.includes(".")){s.push(`${r}.${c}`);continue}if(f.columns?.find(g=>g.name===c)){s.push(`${r}.${c}`);continue}if(f.relations?.find(g=>g.propertyName===c)){l.has(c)||l.set(c,["id"]);continue}}return l.forEach((c,p)=>{if(p==="")return;let d=f.relations?.find(_=>_.propertyName===p);if(!d)return;if(d.type==="many-to-one"||d.type==="one-to-one"&&!d.isInverse){let _=d.foreignKeyColumn||L(d.targetTableName||d.targetTable),w=N(r,n),$=N(_,n),h=N(p,n);s.push(`${w}.${$} as ${h}`)}let m=d.targetTableName||d.targetTable,y=o?.[p],b=y?.fields!=null?Array.isArray(y.fields)?y.fields:String(y.fields).split(",").map(_=>_.trim()).filter(Boolean):c;a.push({relationName:p,type:d.type,targetTable:m,fields:b,isInverse:d.isInverse,fkColumn:d.foreignKeyColumn,mappedBy:d.mappedBy,junctionTableName:d.junctionTableName,junctionSourceColumn:d.junctionSourceColumn,junctionTargetColumn:d.junctionTargetColumn,userFilter:y?.filter,userSort:y?.sort,userLimit:y?.limit!==void 0?Number(y.limit):void 0,userPage:y?.page!==void 0?Number(y.page):void 0,nestedDeep:y?.deep})}),{select:s,batchFetchDescriptors:a}}var Hn=D(()=>{"use strict";Le();$e()});var ct,Gn=D(()=>{"use strict";Le();$e();dn();et();zn();At();vt();rn();ct=class{constructor(e,t="postgres",n){this.knex=e;this.dbType=t;this.metadata=n;this.pkField="id"}buildFilterTree(e,t){if(!e||!this.metadata)return null;let n=new te,i=this.metadata?.tables?this.metadata:{tables:new Map(Object.entries(this.metadata))},{node:o}=be(e,t,i,n);return o}parseSortTokens(e,t,n){return e?(Array.isArray(e)?e:e.split(",").map(o=>o.trim()).filter(Boolean)).map(o=>{let s=o.startsWith("-"),f=(s?o.slice(1):o).split(".");if(f.length===1)return{column:n?`${n}.${f[0]}`:`${t}.${f[0]}`,order:s?"desc":"asc"};let l=f[f.length-1];return{column:`${`__sort_${f.slice(0,-1).join("_")}`}.${l}`,order:s?"desc":"asc"}}):[]}applySortJoins(e,t,n,i){if(!t||!this.metadata)return;let o=Array.isArray(t)?t:t.split(",").map(a=>a.trim()).filter(Boolean),s=new Set;for(let a of o){let l=(a.startsWith("-")?a.slice(1):a).split(".");if(l.length<=1)continue;let u=n,c=i||n;for(let p=0;p<l.length-1;p++){let d=l[p],g=this.metadata?.tables?.get(u);if(!g)break;let m=g.relations?.find(_=>_.propertyName===d);if(!m)break;let y=m.targetTableName||m.targetTable,b=`__sort_${l.slice(0,p+1).join("_")}`;if(!s.has(b)){s.add(b);let _=m.foreignKeyColumn||L(m.propertyName),w=this.metadata?.tables?.get(y),$=w&&fe(w)?.name||"id";e.leftJoin(`${y} as ${b}`,`${b}.${$}`,`${c}.${_}`)}u=y,c=b}}}toKnexSelect(e,t){let n=e.indexOf(" as ");if(n!==-1){let i=e.substring(0,n),o=e.substring(n+4),s=N(o,this.dbType),a=t?`${t}.${N(i,this.dbType)}`:N(i,this.dbType);return this.knex.raw(`${a} as ${s}`)}return t?this.knex.raw(`${t}.${N(e,this.dbType)} as ${N(e,this.dbType)}`):e}keyOf(e){return e==null?"":String(e)}buildScalarRef(e,t){return{[t||this.pkField]:e}}getTargetPkField(e){return fe(e)?.name||"id"}resolveOwnerFkKey(e){return e.relationName}resolveInverseFkField(e){let t=e.fkColumn;return!t&&e.mappedBy&&(t=L(e.mappedBy)),t||(t=L(e.targetTable)),t}resolveParentPk(e){return e&&fe(e)?.name||"id"}resolveFields(e,t){let{rootFields:n,subRelations:i}=Ze(e),o=[];if(n.includes("*")){let l=new Set;for(let u of t.relations||[])if(u.type==="many-to-one"||u.type==="one-to-one"&&!u.isInverse){let c=u.foreignKeyColumn||L(u.propertyName);c&&l.add(c)}for(let u of t.columns)l.has(u.name)||o.push(u.name);for(let u of t.relations||[])i.has(u.propertyName)||i.set(u.propertyName,["id"])}else for(let l of n){let u=t.columns.find(c=>c.name===l);u?o.push(u.name):t.relations?.find(p=>p.propertyName===l)&&!i.has(l)&&i.set(l,["id"])}let s=fe(t)?.name||"id";o.includes(s)||o.push(s),i.forEach((l,u)=>{let c=t.relations?.find(p=>p.propertyName===u);if(c&&(c.type==="many-to-one"||c.type==="one-to-one"&&!c.isInverse)){let p=c.foreignKeyColumn||L(c.propertyName);p&&o.push(`${p} as ${u}`)}});let a=[];return i.forEach((l,u)=>{let c=t.relations?.find(d=>d.propertyName===u);if(!c)return;let p=c.targetTableName||c.targetTable;p&&a.push({relationName:u,type:c.type,targetTable:p,fields:l,isInverse:c.isInverse,fkColumn:c.foreignKeyColumn,mappedBy:c.mappedBy,junctionTableName:c.junctionTableName,junctionSourceColumn:c.junctionSourceColumn,junctionTargetColumn:c.junctionTargetColumn})}),{isPkOnly:o.length===1&&o[0]===s&&a.length===0,nestedDescs:a,fetchSpec:{selectCols:o,pkCol:s}}}async fetchOwner(e,t,n,i){let o=i?.userFilter?this.buildFilterTree(i.userFilter,e):null,s=i?.userSort?this.parseSortTokens(i.userSort,e):[],a=n.selectCols.map(f=>this.toKnexSelect(f));return H(t,f=>{let l=this.knex(e).select(a).whereIn(n.pkCol,f);if(o&&q(l,o,{dbType:this.dbType,rootTable:e}),s.length>0){this.applySortJoins(l,i.userSort,e);for(let u of s)l.orderBy(u.column,u.order)}return l})}async fetchInverse(e,t,n,i,o){let s=t,a=i.selectCols.find(g=>g.startsWith(`${t} as `));a?s=a.split(" as ")[1].trim():i.selectCols.includes(t)||i.selectCols.push(t);let f=o?.userFilter?this.buildFilterTree(o.userFilter,e):null,l=o?.userSort?this.parseSortTokens(o.userSort,e):[],u=o?.userLimit,c=o?.userPage;if(u!==void 0){let g=c?(c-1)*u:0,m=i.selectCols.map(_=>this.toKnexSelect(_)),y=await ce(n,async _=>{let w=this.knex(e).select(m).where(t,_);if(f&&q(w,f,{dbType:this.dbType,rootTable:e}),this.applySortJoins(w,o.userSort,e),l.length>0)for(let $ of l)w.orderBy($.column,$.order);else w.orderBy(i.pkCol,"asc");return g>0&&w.offset(g),w.limit(u),w},16),b=[];for(let[_,w]of y.entries()){let $=n.find(h=>String(h)===_);for(let h of w)h[t]||(h[t]=$??_),b.push(h)}return{docs:b,groupKeyField:s}}let p=i.selectCols.map(g=>this.toKnexSelect(g));return{docs:await H(n,g=>{let m=this.knex(e).select(p).whereIn(t,g);if(f&&q(m,f,{dbType:this.dbType,rootTable:e}),this.applySortJoins(m,o?.userSort,e),l.length>0)for(let y of l)m.orderBy(y.column,y.order);else m.orderBy(i.pkCol,"asc");return m}),groupKeyField:s}}postProcessInverseChild(e,t,n){n||delete e[t]}async fetchM2M(e,t,n,i,o){let s=this.resolveParentPk(n),a=e.map(w=>w[s]).filter(w=>w!=null);if(a.length===0)return{grouped:new Map,docs:[]};let f=t.junctionTableName,l=t.junctionSourceColumn,u=t.junctionTargetColumn;if(!f||!l||!u)throw new Error(`Missing junction table config for relation: ${t.relationName}`);let c=t.userFilter?this.buildFilterTree(t.userFilter,t.targetTable):null,p=t.userSort?this.parseSortTokens(t.userSort,t.targetTable,"t"):[],d=t.userLimit,g=t.userPage;if(o.selectCols.length===1&&o.selectCols[0]===o.pkCol&&!c&&!d){let w=await H(a,h=>this.knex(f).select([`${l} as __sourceId__`,`${u} as __targetId__`]).whereIn(l,h).orderBy(u,"asc")),$=new Map;for(let h of w){let k=this.keyOf(h.__sourceId__);$.has(k)||$.set(k,[]),$.get(k).push({[o.pkCol]:h.__targetId__})}return{grouped:$,docs:[]}}let y=o.selectCols.map(w=>this.toKnexSelect(w,"t"));if(d!==void 0){let w=g?(g-1)*d:0,$=new Map;for(let S of a)$.set(this.keyOf(S),[]);let h=await ce(a,async S=>{let R=this.knex(f).join(`${t.targetTable} as t`,`${f}.${u}`,`t.${o.pkCol}`).select(y).where(`${f}.${l}`,S);if(c&&q(R,c,{dbType:this.dbType,rootTable:"t"}),this.applySortJoins(R,t.userSort,t.targetTable,"t"),p.length>0)for(let F of p)R.orderBy(F.column,F.order);else R.orderBy(`t.${o.pkCol}`,"asc");return w>0&&R.offset(w),R.limit(d),R},16),k=[];for(let[S,R]of h.entries()){$.set(S,R);for(let F of R)k.push(F)}return{grouped:$,docs:k}}let b=await H(a,w=>{let $=this.knex(f).join(`${t.targetTable} as t`,`${f}.${u}`,`t.${o.pkCol}`).select([`${f}.${l} as __sourceId__`,...y]).whereIn(`${f}.${l}`,w);if(c&&q($,c,{dbType:this.dbType,rootTable:"t"}),this.applySortJoins($,t.userSort,t.targetTable,"t"),p.length>0)for(let h of p)$.orderBy(h.column,h.order);else $.orderBy(`t.${o.pkCol}`,"asc");return $}),_=new Map;for(let w of b){let $=w.__sourceId__;delete w.__sourceId__;let h=this.keyOf($);_.has(h)||_.set(h,[]),_.get(h).push(w)}return{grouped:_,docs:b}}}});var Vr={};mn(Vr,{executeBatchFetches:()=>Yn});async function Yn(r,e,t,n,i=3,o=0,s,a="postgres",f,l){let u=new ct(r,a,f);await new _e(u,n,l).execute(e,t,i,o,s)}var Xn=D(()=>{"use strict";et();Gn()});var co={};mn(co,{ALL_SUPPORTED_OPERATORS:()=>Ct,AuthenticationException:()=>Ae,AuthorizationException:()=>Oe,BadRequestException:()=>E,BatchFetchEngine:()=>_e,BusinessLogicException:()=>Ce,ConfigurationException:()=>_t,DEFAULT_TIMEOUT_MS:()=>Dt,DOTTED_PATH_MAX_HOPS:()=>dt,DatabaseException:()=>ye,DuplicateResourceException:()=>ve,ErrorHandler:()=>Me,ExecutorEngineService:()=>Qe,ExternalServiceException:()=>ht,FIELD_OPERATORS:()=>Y,FileNotFoundException:()=>Tt,FileSizeExceededException:()=>$t,FileUploadException:()=>wt,HttpException:()=>Re,ISOLATED_EXECUTOR_RUNTIME_LOG_PATH:()=>Kt,InvalidTokenException:()=>mt,IsolatedExecutorService:()=>ze,JoinRegistry:()=>te,LOGICAL_OPERATORS:()=>Nn,MongoBatchAdapter:()=>tt,MongoQueryExecutor:()=>ot,PER_PARENT_CONCURRENCY:()=>le,QueryBuilderService:()=>ft,QueryPlanner:()=>K,ResourceNotFoundException:()=>Ne,SchemaException:()=>bt,ScriptExecutionException:()=>ge,ScriptTimeoutException:()=>pe,ServiceUnavailableException:()=>Ie,SqlBatchAdapter:()=>ct,SqlQueryExecutor:()=>ut,TokenExpiredException:()=>yt,ValidationException:()=>Fe,WHERE_IN_CHUNK_SIZE:()=>Ar,WorkerPool:()=>Rt,appendIsolatedExecutorRuntimeLog:()=>U,applyOperatorToMatch:()=>Gt,applyRelationFilters:()=>Ue,applyWhereToKnex:()=>lt,assertFieldOperatorValueIsClean:()=>Xt,buildAggregateFilter:()=>it,buildMongoCharFoldMapJson:()=>Cn,buildMongoFoldTextSearchJs:()=>zt,buildRelationSubquery:()=>Mt,buildSqlWherePartsFromFieldAst:()=>Pt,buildWhereClause:()=>re,camelToSnake:()=>hr,chunkedFetch:()=>H,compileScriptSource:()=>oe,computeEngineTuning:()=>wn,createEnfyraKernel:()=>lo,dslOpToCompareOp:()=>Yt,encodeMainThreadToIsolate:()=>kn,escapeSqlValue:()=>Ur,executeBatchFetches:()=>Yn,executeMongoBatchFetches:()=>on,expandFieldsToJoinsAndSelect:()=>Vn,getEffectiveCpuCount:()=>_n,getEffectiveMemoryBytes:()=>kt,getEngineTuning:()=>Qt,getExecutableScript:()=>gi,getForeignKeyColumnName:()=>L,getIoAbortSignal:()=>dr,getJunctionColumnNames:()=>je,getJunctionTableName:()=>Pe,getPrimaryKeyColumn:()=>fe,getScriptLegacyField:()=>Tn,getShortFkConstraintName:()=>yr,getShortFkName:()=>br,getShortIndexName:()=>_r,getShortPkName:()=>gr,hasAggregateQuery:()=>Dn,hasLogicalOperators:()=>ue,isExecutableJavaScript:()=>or,isScriptTable:()=>$n,mergeAggregateValue:()=>Te,normalizeAggregateQuery:()=>rt,normalizeFlowStepScriptConfig:()=>yi,normalizeScriptLanguage:()=>xt,normalizeScriptPatch:()=>pi,normalizeScriptRecord:()=>di,parseBatchFields:()=>Ze,parseFields:()=>sn,parseFilter:()=>be,perParentRun:()=>ce,quoteIdentifier:()=>N,resolveExecutableScript:()=>sr,rewriteFilterDenyingFields:()=>qr,rewriteSortDroppingDenied:()=>Gr,separateFilters:()=>V,snakeToCamel:()=>mr,throwUnsupportedFieldOperator:()=>Be,transformCode:()=>bn,validateDeepOptions:()=>Zn,validateFilterShape:()=>B,whereToMongoFilter:()=>Ge});module.exports=ni(co);var ri={"@CACHE":"$ctx.$cache","@REPOS":"$ctx.$repos","@HELPERS":"$ctx.$helpers","@FETCH":"$ctx.$helpers.$fetch","@LOGS":"$ctx.$logs","@BODY":"$ctx.$body","@DATA":"$ctx.$data","@PARAMS":"$ctx.$params","@QUERY":"$ctx.$query","@USER":"$ctx.$user","@REQ":"$ctx.$req","@RES":"$ctx.$res","@SHARE":"$ctx.$share","@API":"$ctx.$api","@UPLOADED_FILE":"$ctx.$uploadedFile","@PKGS":"$ctx.$pkgs","@SOCKET":"$ctx.$socket","@TRIGGER":"$ctx.$trigger","@FLOW":"$ctx.$flow","@FLOW_PAYLOAD":"$ctx.$flow.$payload","@FLOW_LAST":"$ctx.$flow.$last","@FLOW_META":"$ctx.$flow.$meta","@THROW400":"$ctx.$throw['400']","@THROW401":"$ctx.$throw['401']","@THROW403":"$ctx.$throw['403']","@THROW404":"$ctx.$throw['404']","@THROW409":"$ctx.$throw['409']","@THROW422":"$ctx.$throw['422']","@THROW429":"$ctx.$throw['429']","@THROW500":"$ctx.$throw['500']","@THROW503":"$ctx.$throw['503']","@THROW":"$ctx.$throw","@ERROR":"$ctx.$error","@STATUS":"$ctx.$statusCode"},de=0,tr=1,nr=2,hn=3,rr=4,ir=5;function bn(r){let e=r.length,t="",n=0,i=de,o=0,s=0;for(;n<e;){let a=r[n],f=r[n+1];switch(i){case de:if(a==='"')i=tr,t+=a,n++;else if(a==="'")i=nr,t+=a,n++;else if(a==="`")i=hn,t+=a,n++;else if(a==="/"&&f==="/")i=rr,t+=a+f,n+=2;else if(a==="/"&&f==="*")i=ir,t+=a+f,n+=2;else if(a==="@"||a==="#"||a==="%"){let l=n,u=a;for(n++;n<e;){let p=r[n];if(p>="A"&&p<="Z"||p>="0"&&p<="9"||p==="_")n++;else break}let c=r.substring(l,n);if(u==="@"){let p=ri[c];t+=p||c}else u==="#"?t+="$ctx.$repos."+c.substring(1):t+="$ctx.$pkgs."+c.substring(1)}else a==="{"?(o>0&&s++,t+=a,n++):a==="}"&&o>0?s>0?(s--,t+=a,n++):(o--,t+=a,n++,i=hn):(t+=a,n++);break;case tr:t+=a,a==="\\"?(n++,n<e&&(t+=r[n],n++)):(a==='"'&&(i=de),n++);break;case nr:t+=a,a==="\\"?(n++,n<e&&(t+=r[n],n++)):(a==="'"&&(i=de),n++);break;case hn:t+=a,a==="\\"?(n++,n<e&&(t+=r[n],n++)):a==="`"?(i=de,n++):a==="$"&&n+1<e&&r[n+1]==="{"?(t+="{",n+=2,o++,i=de):n++;break;case rr:t+=a,a===`
|
|
2
|
+
`&&(i=de),n++;break;case ir:t+=a,a==="*"&&f==="/"?(t+=f,n+=2,i=de):n++;break}}return t}var Dt=3e4,Qe=class{constructor(e){this.isolatedExecutorService=e.isolatedExecutorService}register(e,t){e.routeData.__codeBlocks||(e.routeData.__codeBlocks=[]),e.routeData.__codeBlocks.push(t)}async runBatch(e,t){let n=e.routeData.__codeBlocks||[];return n.length===0?{value:void 0,shortCircuit:!1}:this.isolatedExecutorService.runBatch(n,e.routeData.context,t??Dt)}async run(e,t,n=Dt){return this.isolatedExecutorService.run(e,t,n)}};var Bt=class{constructor(e){this.context=e}log(e){console.log(this.format(e))}warn(e){console.warn(this.format(e))}error(e,t){console.error(this.format(e)),t&&console.error(t)}debug(e){process.env.DEBUG&&console.debug(this.format(e))}verbose(e){process.env.DEBUG&&console.debug(this.format(e))}format(e){let t=typeof e=="string"?e:JSON.stringify(e);return this.context?`[${this.context}] ${t}`:t}};var lr=require("async_hooks"),cr=ie(require("path")),ur=require("worker_threads");var pe=class extends Error{constructor(t=0,n){let i=typeof t=="number"&&t>0?`${t}ms`:String(t||"configured timeout");super(`Script execution timed out after ${i}`);this.statusCode=408;this.errorCode="SCRIPT_TIMEOUT";this.name="ScriptTimeoutException",this.details={timeoutMs:t,scriptId:n}}},ge=class extends Error{constructor(t,n,i){super(`Script execution failed: ${t}`);this.statusCode=400;this.errorCode="SCRIPT_EXECUTION_ERROR";this.name="ScriptExecutionException",this.details={scriptId:n,...i}}},M=class extends Error{constructor(t,n,i,o){super(t);this.statusCode=n;this.errorCode=i;this.name=this.constructor.name,this.details=o}},Re=class extends M{constructor(e,t,n){super(e,t,`HTTP_${t}`,n)}},Ce=class extends M{constructor(e,t){super(e,400,"BUSINESS_LOGIC_ERROR",t)}},Fe=class extends M{constructor(e,t){super(e,422,"VALIDATION_ERROR",t)}},Ne=class extends M{constructor(e,t){super(t?`${e} with identifier '${t}' not found`:`${e} not found`,404,"RESOURCE_NOT_FOUND",{resource:e,identifier:t})}},ve=class extends M{constructor(e,t,n){super(`${e} with ${t} '${n}' already exists`,409,"DUPLICATE_RESOURCE",{resource:e,field:t,value:n})}},Ae=class extends M{constructor(e="Authentication failed",t){super(e,401,"AUTHENTICATION_ERROR",t)}},Oe=class extends M{constructor(e="Insufficient permissions",t){super(e,403,"AUTHORIZATION_ERROR",t)}},yt=class extends M{constructor(){super("Token has expired",401,"TOKEN_EXPIRED")}},mt=class extends M{constructor(){super("Invalid token provided",401,"INVALID_TOKEN")}},ye=class extends M{constructor(e,t){super(e,500,"DATABASE_ERROR",t)}},ht=class extends M{constructor(e,t,n){super(`External service '${e}' error: ${t}`,502,"EXTERNAL_SERVICE_ERROR",{service:e,details:n})}},Ie=class extends M{constructor(e){super(`Service '${e}' is currently unavailable`,503,"SERVICE_UNAVAILABLE",{service:e})}},bt=class extends M{constructor(e,t){super(e,400,"SCHEMA_ERROR",t)}},_t=class extends M{constructor(e,t){super(e,500,"CONFIGURATION_ERROR",t)}},wt=class extends M{constructor(e,t){super(e,400,"FILE_UPLOAD_ERROR",t)}},Tt=class extends M{constructor(e="File not found"){super(e,404,"FILE_NOT_FOUND")}},$t=class extends M{constructor(e,t){super("File size exceeded",413,"FILE_SIZE_EXCEEDED",{maxSize:e,actualSize:t})}};var Me=class{static createException(e,t,n,i,o){if(e?.includes("$throw"))switch(e){case"$throw.businessLogic":return new Ce(n||"Bad request",o);case"$throw.validation":return new Fe(n||"Validation failed",o);case"$throw.notFound":return new Ne(n||"Resource");case"$throw.duplicate":return new ve(n||"Resource","field","value");case"$throw.unauthorized":return new Ae(n||"Unauthorized");case"$throw.forbidden":return new Oe(n||"Forbidden");case"$throw.tokenExpired":return new yt;case"$throw.invalidToken":return new mt;case"$throw.database":return new ye(n||"Database error",o);case"$throw.dbQuery":return new ye(n||"Query error",o);case"$throw.externalService":return new ht(n||"Service",n||"Error",o);case"$throw.serviceUnavailable":return new Ie(n||"Service");case"$throw.rateLimit":return new Re(n||"Rate limit exceeded",429);case"$throw.scriptError":return new ge(n||"Script error",i,o);case"$throw.scriptTimeout":return new pe(o?.timeout||5e3,i);case"$throw.schema":return new bt(n||"Schema error",o);case"$throw.config":return new _t(n||"Configuration error",o);case"$throw.fileUpload":return new wt(n||"File upload error",o);case"$throw.fileNotFound":return new Tt(n||"File not found");case"$throw.fileSizeExceeded":return new $t(o?.maxSize||"unknown",o?.actualSize||"unknown");case"$throw.400":return new Ce(n||"Bad request");case"$throw.401":return new Ae(n||"Authentication required");case"$throw.403":return new Oe(n||"Insufficient permissions");case"$throw.404":return new Ne(n||"Resource");case"$throw.409":return new ve(n||"Resource","field","value");case"$throw.422":return new Fe(n||"Validation failed");case"$throw.429":return new Re(n||"Rate limit exceeded",429);case"$throw.500":return new ye(n||"Internal server error",o);case"$throw.503":return new Ie(n||"Service");default:return new ge(n||"Unknown error",i)}if(t)switch(t){case 400:return new Ce(n||"Bad request");case 401:return new Ae(n||"Authentication required");case 403:return new Oe(n||"Insufficient permissions");case 404:return new Ne(n||"Resource");case 409:return new ve(n||"Resource","field","value");case 422:return new Fe(n||"Validation failed");case 429:return new Re(n||"Rate limit exceeded",429);case 500:return new ye(n||"Internal server error",o);case 503:return new Ie(n||"Service");default:return new ge(n||"Unknown error",i,o)}return new ge(n||"Unknown error",i,o)}};var Wt=ie(require("fs")),Ut=ie(require("path")),Kt=Ut.join(process.cwd(),"test","logs","isolated-executor-runtime.log");function ii(){return process.env.ISOLATED_EXECUTOR_FILE_LOG==="0"?!1:process.env.ISOLATED_EXECUTOR_FILE_LOG==="1"?!0:process.env.JEST_WORKER_ID!==void 0}var oi=ii();function U(r){if(oi)try{let e=Ut.dirname(Kt);Wt.mkdirSync(e,{recursive:!0});let t=JSON.stringify({ts:new Date().toISOString(),pid:process.pid,...r})+`
|
|
3
|
+
`;Wt.appendFileSync(Kt,t)}catch{}}var me=ie(require("os")),Je=ie(require("fs"));function kt(){try{let r=Je.readFileSync("/sys/fs/cgroup/memory.max","utf8").trim();if(r!=="max"){let e=parseInt(r,10);if(Number.isFinite(e)&&e>0&&e<me.totalmem())return e}}catch{}try{let r=Je.readFileSync("/sys/fs/cgroup/memory/memory.limit_in_bytes","utf8").trim(),e=parseInt(r,10);if(Number.isFinite(e)&&e>0&&e<me.totalmem())return e}catch{}return me.totalmem()}function _n(){let r=me.availableParallelism?.()||me.cpus()?.length||1;try{let e=Je.readFileSync("/sys/fs/cgroup/cpu.max","utf8").trim(),[t,n]=e.split(/\s+/);if(t!=="max"){let i=parseInt(t,10),o=parseInt(n,10);if(i>0&&o>0)return Math.max(1,Math.ceil(i/o))}}catch{}try{let e=parseInt(Je.readFileSync("/sys/fs/cgroup/cpu/cpu.cfs_quota_us","utf8").trim(),10),t=parseInt(Je.readFileSync("/sys/fs/cgroup/cpu/cpu.cfs_period_us","utf8").trim(),10);if(e>0&&t>0)return Math.max(1,Math.ceil(e/t))}catch{}return r}var si=.25,ai=2,li=2048,ci=40,ui=128,fi=32;function wn(r){let e=Math.max(1,Math.trunc(r.logicalCpuCount)||1),t=Math.max(1,r.totalMemoryBytes/(1024*1024)),n=Math.min(ui,Math.max(ci,Math.round(t/fi))),i=t*si,o=Math.max(1,Math.floor(i/n)),s=Math.max(1,Math.min(e,2,o)),a=Math.min(256,Math.max(16,Math.floor(t/n/s))),f=t<li?1:ai,l=Math.max(1,Math.min(f,Math.floor(i/(s*n))));return{maxConcurrentWorkers:s,isolateMemoryLimitMb:n,tasksPerWorkerCap:a,isolatePoolSize:l}}function Qt(){return wn({logicalCpuCount:_n(),totalMemoryBytes:kt()})}var Ee=ie(require("typescript"));var St={oauth_config_definition:"",route_handler_definition:"logic",pre_hook_definition:"code",post_hook_definition:"code",bootstrap_script_definition:"logic",websocket_definition:"connectionHandlerScript",websocket_event_definition:"handlerScript"};function Tn(r){return St[r]}function $n(r){return r in St}function xt(r){return r==="javascript"?"javascript":"typescript"}function oe(r,e){if(r==null||r==="")return null;let t=bn(String(r));if(xt(e)==="javascript")return t;let n=Ee.default.transpileModule(t,{compilerOptions:{target:Ee.default.ScriptTarget.ES2022,module:Ee.default.ModuleKind.CommonJS,importsNotUsedAsValues:Ee.default.ImportsNotUsedAsValues.Remove,sourceMap:!1,inlineSourceMap:!1,inlineSources:!1},reportDiagnostics:!0}),i=n.diagnostics?.find(o=>o.category===Ee.default.DiagnosticCategory.Error);if(i)throw new Error(Ee.default.flattenDiagnosticMessageText(i.messageText,`
|
|
4
|
+
`));return n.outputText.trimEnd()}function or(r){if(!r)return!1;try{return new Function(`return (async () => {
|
|
5
5
|
"use strict";
|
|
6
6
|
${r}
|
|
7
|
-
});`),!0}catch{return!1}}function fi(r,e){if(!$n(r)||!e||typeof e!="object")return e;let t={...e},n=Tn(r);return n&&(t.sourceCode===void 0||t.sourceCode===null||t.sourceCode==="")&&t[n]!==void 0&&(t.sourceCode=t[n]),t.scriptLanguage=xt(t.scriptLanguage),(t.compiledCode===void 0||t.compiledCode===null||t.compiledCode==="")&&(t.compiledCode=ie(t.sourceCode,t.scriptLanguage)),n&&n in t&&delete t[n],t}function di(r,e,t){if(!$n(r)||!e||typeof e!="object")return e;let n=Tn(r),o=Object.prototype.hasOwnProperty.call(e,"sourceCode")||(n?Object.prototype.hasOwnProperty.call(e,n):!1),i=Object.prototype.hasOwnProperty.call(e,"scriptLanguage");if(!o&&!i)return e;let s=o?e.sourceCode??(n?e[n]:void 0):t?.sourceCode??(n&&t?t[n]:void 0),a=i?e.scriptLanguage:t?.scriptLanguage,f=ie(s,a),l={...e};return o&&(l.sourceCode=s??null),l.scriptLanguage=xt(a),l.compiledCode=f,n&&n in l&&delete l[n],l}function pi(r){return or(r).code}function or(r){if(!r||typeof r!="object")return{code:null,compiledCode:null,shouldPersistCompiledCode:!1};if(typeof r.compiledCode=="string"&&r.compiledCode!==""&&ir(r.compiledCode))return{code:r.compiledCode,compiledCode:r.compiledCode,shouldPersistCompiledCode:!1};if(typeof r.sourceCode=="string"&&r.sourceCode!==""){let t=ie(r.sourceCode,r.scriptLanguage);return{code:t,compiledCode:t,shouldPersistCompiledCode:t!==r.compiledCode}}let e=Object.keys(St).find(t=>St[t]in r);if(e){let t=r[St[e]];if(typeof t=="string"&&t!==""){let n=ie(t,r.scriptLanguage);return{code:n,compiledCode:n,shouldPersistCompiledCode:n!==r.compiledCode}}}return typeof r.compiledCode=="string"&&r.compiledCode!==""?{code:r.compiledCode,compiledCode:r.compiledCode,shouldPersistCompiledCode:!1}:{code:null,compiledCode:null,shouldPersistCompiledCode:!1}}function gi(r){if(!r||typeof r!="object")return r;let e=r.type;if(e!=="script"&&e!=="condition")return r;let t=r.config;if(typeof t=="string")try{t=JSON.parse(t)}catch{return r}if(!t||typeof t!="object")return r;let n={...t};return n.sourceCode=n.sourceCode??n.code??null,n.scriptLanguage=xt(n.scriptLanguage),n.compiledCode=ie(n.sourceCode,n.scriptLanguage),delete n.code,{...r,config:typeof r.config=="string"?JSON.stringify(n):n}}var Si=lr.join(__dirname,"execution/worker.js"),xi=["Invalid or unexpected token","Unexpected identifier","Unexpected token","Missing initializer in const declaration","await is only valid"],ur=new ar.AsyncLocalStorage;function fr(){return ur.getStore()}var Rt=class{constructor(e,t,n,o,i,s,a,f=6e4){this.scriptPath=i;this.onCrash=s;this.onRotate=a;this.entries=[];this.waiting=[];this.cachedMemoryOk=!0;this.lastMemoryCheckMs=0;this.memorySampleIntervalMs=200;this.destroying=!1;this.entryCounter=0;this.max=e,this.effectiveMemory=t,this.rssCeiling=n,this.tasksCap=o,this.drainTimeoutMs=f;for(let l=0;l<e;l++)this.spawnEntry()}getEntries(){return this.entries}spawnEntry(){let e=new cr.Worker(this.scriptPath),t={id:++this.entryCounter,worker:e,tasks:new Map,draining:!1,spawnedAt:Date.now()};return e.on("message",n=>{let o=t.tasks.get(n.id);o&&(n.type==="result"?(typeof n.heapRatio=="number"&&(t.lastHeapRatio=n.heapRatio),n.contextStats&&(t.contextStats=n.contextStats),o.onResult(n),!t.draining&&typeof n.heapRatio=="number"&&n.heapRatio>=.8&&this.rotateEntry(t,`heap=${Math.round(n.heapRatio*100)}%`)):o.onIoCall(n))}),e.on("exit",()=>{let n=t.draining,o=this.destroying;t.drainTimeout&&(clearTimeout(t.drainTimeout),t.drainTimeout=void 0);for(let[,s]of t.tasks)s.abortController.abort(),s.onResult({type:"result",success:!1,error:{message:o?"Worker terminated":"Worker crashed"}});t.tasks.clear();let i=this.entries.indexOf(t);i!==-1&&this.entries.splice(i,1),!n&&!o&&(this.onCrash&&this.onCrash(),this.entries.length<this.max&&this.spawnEntry()),this.drainWaiting()}),this.entries.push(t),t}rotateEntry(e,t){if(e.draining)return;e.draining=!0;let n=Date.now()-e.spawnedAt;if(this.onRotate&&this.onRotate({reason:t,ageMs:n}),this.spawnEntry(),e.tasks.size===0){e.worker.terminate();return}e.drainTimeout=setTimeout(()=>{e.drainTimeout=void 0,e.worker.terminate()},this.drainTimeoutMs)}isMemoryAvailable(){let e=Date.now();return e-this.lastMemoryCheckMs>=this.memorySampleIntervalMs&&(this.cachedMemoryOk=process.memoryUsage().rss/this.effectiveMemory<this.rssCeiling,this.lastMemoryCheckMs=e),this.cachedMemoryOk}findLeastBusy(){let e=null;for(let t of this.entries)t.draining||t.tasks.size<this.tasksCap&&(!e||t.tasks.size<e.tasks.size)&&(e=t);return e}dispatch(){let e=this.findLeastBusy();return e&&(e.tasks.size===0||this.isMemoryAvailable())?Promise.resolve(e):new Promise(t=>this.waiting.push(t))}registerTask(e,t,n){e.tasks.set(t,n)}unregisterTask(e,t){e.tasks.delete(t),e.draining&&e.tasks.size===0&&(e.drainTimeout&&(clearTimeout(e.drainTimeout),e.drainTimeout=void 0),e.worker.terminate()),this.drainWaiting()}drainWaiting(){for(;this.waiting.length>0;){let e=this.findLeastBusy();if(e&&(e.tasks.size===0||this.isMemoryAvailable()))this.waiting.shift()(e);else break}}terminateEntry(e){e.worker.terminate()}resize(e){for(this.max=Math.max(1,e);this.entries.length<this.max;)this.spawnEntry()}getMax(){return this.max}getWaitingCount(){return this.waiting.length}getTotalActiveTasks(){let e=0;for(let t of this.entries)e+=t.tasks.size;return e}getMetrics(){return{max:this.max,activeTasks:this.getTotalActiveTasks(),waitingTasks:this.waiting.length,workers:this.entries.map(e=>({id:e.id,activeTasks:e.tasks.size,draining:e.draining,ageMs:Date.now()-e.spawnedAt,lastHeapRatio:e.lastHeapRatio??0,contextStats:e.contextStats??{}}))}}destroyAll(){this.destroying=!0;for(let e of this.entries)e.worker.terminate();this.entries.length=0,this.waiting.length=0}};function kn(r){if(r===void 0)return JSON.stringify({__e:"u"});try{return JSON.stringify({__e:"v",d:r},(e,t)=>typeof t=="bigint"?t.toString():t)}catch{return JSON.stringify({__e:"v",d:{__serializationError:!0,message:"Result is not JSON-serializable"}})}}var ze=class r{constructor(e){this.logger=new Bt(r.name);this.effectiveMemory=kt();this.isolationTuning=Qt();this.pool=new Rt(this.isolationTuning.maxConcurrentWorkers,this.effectiveMemory,.9,this.isolationTuning.tasksPerWorkerCap,Si,()=>{this.crashesTotal++,this.logger.warn("Worker crashed, replacement spawned")},({reason:e,ageMs:t})=>{this.rotationsTotal++,this.logger.log(`Worker rotation: reason=${e} age=${Math.round(t/1e3)}s`)});this.ceiling=this.isolationTuning.maxConcurrentWorkers;this.prevCpuUsage=process.cpuUsage();this.prevCpuTime=process.hrtime.bigint();this.pressureTicks=0;this.recoveryTicks=0;this.taskCounter=0;this.taskDoneTotal=0;this.taskErrorTotal=0;this.taskTimeoutTotal=0;this.rotationsTotal=0;this.crashesTotal=0;this.taskDurationsMs=[];this.packageCacheService=e.packageCacheService,this.packageCdnLoaderService=e.packageCdnLoaderService,this.logger.log(`Worker pool started: ${this.isolationTuning.maxConcurrentWorkers} workers, ${this.isolationTuning.isolateMemoryLimitMb}MB per isolate, ${this.isolationTuning.isolatePoolSize} isolates/worker, ${this.isolationTuning.tasksPerWorkerCap} tasks/worker cap`),this.tuneTimer=setInterval(()=>this.autoTune(),3e4)}onDestroy(){this.tuneTimer&&clearInterval(this.tuneTimer),this.pool.destroyAll()}autoTune(){let t=process.memoryUsage().rss/this.effectiveMemory,n=process.hrtime.bigint(),o=process.cpuUsage(this.prevCpuUsage),i=Number(n-this.prevCpuTime)/1e3,s=i>0?(o.user+o.system)/i:0;this.prevCpuUsage=process.cpuUsage(),this.prevCpuTime=n;let a=this.pool.getMax(),f=this.pool.getWaitingCount(),l=t>.85||s>.7,u=t<.7&&s<.5,c=f>0,p=a;l?(this.recoveryTicks=0,this.pressureTicks++,this.pressureTicks>=3&&(p=Math.max(1,a-1))):u&&c?(this.pressureTicks=0,this.recoveryTicks++,this.recoveryTicks>=3&&(p=Math.min(this.ceiling,a+2))):(this.pressureTicks=0,this.recoveryTicks=0),p!==a&&(this.pool.resize(p),this.pressureTicks=0,this.recoveryTicks=0,this.logger.log(`Worker pool adjusted: ${a} -> ${p} (rss=${Math.round(t*100)}% cpu=${Math.round(s*100)}% queue=${f})`))}createSnapshot(e){let t={$body:e.$body,$query:e.$query,$params:e.$params,$user:e.$user,$share:e.$share,$data:e.$data,$api:{request:e.$api?.request},$uploadedFile:e.$uploadedFile},n=e.$flow;if(n!=null)try{t.$flow=JSON.parse(JSON.stringify(n,(o,i)=>typeof i=="bigint"?String(i):i))}catch{t.$flow={}}return t}mergeCtxChanges(e,t){t&&(t.$body!==void 0&&(e.$body=t.$body),t.$query!==void 0&&(e.$query=t.$query),t.$params!==void 0&&(e.$params=t.$params),t.$data!==void 0&&(e.$data=t.$data),t.$error!==void 0&&(e.$error=t.$error),t.$statusCode!==void 0&&(e.$statusCode=t.$statusCode),t.$share!==void 0&&(e.$share=t.$share),t.$api!==void 0&&e.$api&&(t.$api.error&&(e.$api.error=t.$api.error),t.$api.response&&(e.$api.response=t.$api.response)),t.$flow!==void 0&&t.$flow!==null&&typeof t.$flow=="object"&&e.$flow!=null&&typeof e.$flow=="object"&&Object.assign(e.$flow,t.$flow),delete e.$pkgs)}spawnAndExecute(e,t,n,o){return(async()=>{let i=await this.pool.dispatch(),s=`t_${++this.taskCounter}`,a=Date.now();return new Promise((f,l)=>{let u=!1,c=new AbortController,p=setTimeout(()=>{if(u)return;u=!0,c.abort(),this.pool.unregisterTask(i,s),this.taskTimeoutTotal++,U({event:"task_timeout",id:s,timeoutMs:o}),this.pool.terminateEntry(i);let d=new Error(`Script execution timed out after ${o}ms`);d.code="ERR_SCRIPT_EXECUTION_TIMEOUT",d.isTimeout=!0,l(d)},o+5e3);this.pool.registerTask(i,s,{abortController:c,onResult:d=>{if(!u)if(u=!0,clearTimeout(p),this.pool.unregisterTask(i,s),this.recordTaskDuration(Date.now()-a),d.success){this.taskDoneTotal++,U({event:"task_done",id:s,ok:!0});let g={value:d.value,valueAbsent:d.valueAbsent===!0,ctxChanges:d.ctxChanges};d.shortCircuit&&(g.shortCircuit=!0),f(g)}else{this.taskErrorTotal++,U({event:"task_done",id:s,ok:!1,message:d.error?.message});let g=new Error(d.error?.message||"Handler execution failed");g.statusCode=d.error?.statusCode,g.code=d.error?.code,g.details=d.error?.details,d.error?.stack&&(g.stack=d.error.stack),d.ctxChanges&&(g.ctxChanges=d.ctxChanges),l(g)}},onIoCall:d=>{if(u)return;let g=c.signal;d.type==="repoCall"?this.handleIoCall(()=>this.execRepoCall(d,n),i.worker,d.callId,g):d.type==="helpersCall"?this.handleIoCall(()=>this.execHelpersCall(d,n),i.worker,d.callId,g):d.type==="socketCall"?this.handleIoCall(()=>this.execSocketCall(d,n),i.worker,d.callId,g):d.type==="cacheCall"?this.handleIoCall(()=>this.execCacheCall(d,n),i.worker,d.callId,g):d.type==="dispatchCall"&&this.handleIoCall(()=>this.execDispatchCall(d,n),i.worker,d.callId,g)}}),i.worker.postMessage({type:e,id:s,...t})})})()}async handleIoCall(e,t,n,o){if(!o?.aborted)try{let i=await(o?ur.run(o,e):e());if(o?.aborted)return;try{t.postMessage({type:"callResult",callId:n,result:kn(i)})}catch{}}catch(i){if(o?.aborted)return;try{let s={__userThrow:!0,message:i.message,statusCode:i.statusCode,code:i.errorCode??i.code,details:i.details,messages:i.messages};t.postMessage({type:"callError",callId:n,error:JSON.stringify(s)})}catch{}}}async execRepoCall(e,t){let n=JSON.parse(e.argsJson),o=t?.$repos?.[e.table];if(!o||typeof o[e.method]!="function")throw new Error(`Repo method not found: ${e.table}.${e.method}`);return o[e.method](...n)}async execHelpersCall(e,t){let n=JSON.parse(e.argsJson),o=e.name.split("."),i=t?.$helpers;for(let s of o)i=i?.[s];if(typeof i!="function")throw new Error(`Helper not found: ${e.name}`);return i(...n)}async execSocketCall(e,t){let n=JSON.parse(e.argsJson),o=t?.$socket?.[e.method];if(typeof o!="function")throw new Error(`Socket method not found: ${e.method}`);return o(...n)}async execCacheCall(e,t){let n=JSON.parse(e.argsJson),o=t?.$cache?.[e.method];if(typeof o!="function")throw new Error(`Cache method not found: ${e.method}`);return o(...n)}async execDispatchCall(e,t){let n=JSON.parse(e.argsJson),o=t?.$trigger;if(typeof o!="function")throw new Error("$trigger is not available");return o(...n)}isScriptParseFailure(e){let t=e.message||"";return xi.some(n=>t.includes(n))}async run(e,t,n){let o=Math.max(1,Math.trunc(Number(n)||3e4)),i=await this.packageCacheService.getPackages(),s=this.packageCdnLoaderService.getPackageSources(i),a=this.createSnapshot(t);U({event:"isolated_run_start",timeoutMs:o,codeLen:e?.length??0});let f;try{let l={code:e,pkgSources:s,snapshot:a,timeoutMs:o,memoryLimitMb:this.isolationTuning.isolateMemoryLimitMb,isolatePoolSize:this.isolationTuning.isolatePoolSize};try{f=await this.spawnAndExecute("execute",l,t,o)}catch(u){let c=u,p=ie(e,"typescript")||"";if(!this.isScriptParseFailure(c)||p===e)throw u;U({event:"isolated_run_ts_retry",message:c.message}),f=await this.spawnAndExecute("execute",{...l,code:p},t,o)}}catch(l){let u=l;if(U({event:"isolated_run_error",message:u.message,code:u.code,isTimeout:!!u.isTimeout}),u.isTimeout||u.code==="ERR_SCRIPT_EXECUTION_TIMEOUT")throw new de(o,e);let c=u.statusCode??(typeof u.status=="number"?u.status:void 0);throw Me.createException(void 0,c,u.message||"Unknown error",e,u.details||{})}return this.mergeCtxChanges(t,f.ctxChanges||{}),U({event:"isolated_run_ok"}),f.valueAbsent?void 0:f.value}async runBatch(e,t,n){let o=Math.max(1,Math.trunc(Number(n)||3e4)),i=await this.packageCacheService.getPackages(),s=this.packageCdnLoaderService.getPackageSources(i),a=this.createSnapshot(t);U({event:"isolated_batch_start",timeoutMs:o,blocks:e.length});let f;try{let l={codeBlocks:e,pkgSources:s,snapshot:a,timeoutMs:o,memoryLimitMb:this.isolationTuning.isolateMemoryLimitMb,isolatePoolSize:this.isolationTuning.isolatePoolSize};try{f=await this.spawnAndExecute("executeBatch",l,t,o)}catch(u){let c=u,p=e.map(g=>({...g,code:ie(g.code,"typescript")||""})),d=p.some((g,m)=>g.code!==e[m]?.code);if(!this.isScriptParseFailure(c)||!d)throw u;U({event:"isolated_batch_ts_retry",message:c.message}),f=await this.spawnAndExecute("executeBatch",{...l,codeBlocks:p},t,o)}}catch(l){let u=l;if(U({event:"isolated_batch_error",message:u.message,code:u.code,isTimeout:!!u.isTimeout}),u.ctxChanges&&this.mergeCtxChanges(t,u.ctxChanges),u.isTimeout||u.code==="ERR_SCRIPT_EXECUTION_TIMEOUT")throw new de(o,"(batch execution)");let c=u.statusCode??(typeof u.status=="number"?u.status:void 0);throw Me.createException(void 0,c,u.message||"Unknown error","(batch execution)",u.details||{})}return this.mergeCtxChanges(t,f.ctxChanges||{}),U({event:"isolated_batch_ok"}),{value:f.valueAbsent?void 0:f.value,shortCircuit:f.shortCircuit===!0}}recordTaskDuration(e){this.taskDurationsMs.push(e),this.taskDurationsMs.length>512&&this.taskDurationsMs.shift()}percentile(e,t){if(e.length===0)return 0;let n=[...e].sort((i,s)=>i-s),o=Math.min(n.length-1,Math.max(0,Math.ceil(t/100*n.length)-1));return n[o]}getMetrics(){let e=this.pool.getMetrics(),t=this.taskDurationsMs,n=t.length===0?0:t.reduce((o,i)=>o+i,0)/t.length;return{tuning:this.isolationTuning,pool:e,taskDoneTotal:this.taskDoneTotal,taskErrorTotal:this.taskErrorTotal,taskTimeoutTotal:this.taskTimeoutTotal,rotationsTotal:this.rotationsTotal,crashesTotal:this.crashesTotal,avgTaskMs:n,p95TaskMs:this.percentile(t,95),p99TaskMs:this.percentile(t,99),maxHeapRatio:Math.max(0,...e.workers.map(o=>o.lastHeapRatio||0))}}};var Rn=require("mongodb");Le();function De(r){return r.type==="one-to-many"||r.isInverse===!0||r.type==="one-to-one"&&!!r.mappedBy}function G(r){return(r.type==="many-to-one"||r.type==="one-to-one")&&!De(r)&&(r.foreignKeyColumn||r.propertyName)||null}function Q(r){return r.mappedBy||r.foreignKeyColumn||r.propertyName||null}function oe(r){if(!r||typeof r!="object")return r;if(r instanceof Rn.ObjectId)return r.toString();if(r instanceof Date)return r.toISOString();if(Array.isArray(r))return r.map(t=>oe(t));if("buffer"in r&&r.buffer&&typeof r.buffer=="object"&&Object.keys(r.buffer).length===12)try{let t=r.buffer,n=Object.keys(t).sort((o,i)=>parseInt(o)-parseInt(i)).map(o=>t[o]);return new Rn.ObjectId(Buffer.from(n)).toString()}catch{}let e={};for(let[t,n]of Object.entries(r))e[t]=n&&typeof n=="object"&&!(n instanceof Buffer)?oe(n):n;return e}function Ve(r,e){if(e.type!=="many-to-many")return null;let t=e.targetTableName||e.targetTable;if(!t)return null;if(e.mappedBy){let a=t,f=e.mappedBy,l=r,u=e.junctionTableName||Pe(a,f,l);if(e.junctionSourceColumn&&e.junctionTargetColumn)return{junctionName:u,selfColumn:e.junctionSourceColumn,otherColumn:e.junctionTargetColumn,owningTable:a,inverseTable:l};let c=je(a,f,l);return{junctionName:u,selfColumn:c.targetColumn,otherColumn:c.sourceColumn,owningTable:a,inverseTable:l}}let n=r,o=t,i=e.junctionTableName||Pe(n,e.propertyName,o);if(e.junctionSourceColumn&&e.junctionTargetColumn)return{junctionName:i,selfColumn:e.junctionSourceColumn,otherColumn:e.junctionTargetColumn,owningTable:n,inverseTable:o};let s=je(n,e.propertyName,o);return{junctionName:i,selfColumn:s.sourceColumn,otherColumn:s.targetColumn,owningTable:n,inverseTable:o}}async function Jt(r,e,t){if(!r)return{scalarFields:[],relations:[]};let n=r.tables?.get(e);if(!n)return{scalarFields:[],relations:[]};let o=new Map;for(let f of t)if(f==="*")o.has("")||o.set("",[]),o.get("").push(f);else if(f.includes(".")){let l=f.split("."),u=l[0],c=l.slice(1).join(".");o.has(u)||o.set(u,[]),o.get(u).push(c)}else n.relations?.some(u=>u.propertyName===f)?o.has(f)||o.set(f,["_id"]):(o.has("")||o.set("",[]),o.get("").push(f));let i=[],s=[],a=o.get("")||[];for(let f of a)if(f==="*"){if(n.columns)for(let l of n.columns)i.includes(l.name)||i.push(l.name);if(n.relations)for(let l of n.relations)o.has(l.propertyName)||o.set(l.propertyName,["_id"])}else n.columns?.some(u=>u.name===f)&&!i.includes(f)&&i.push(f);for(let[f,l]of o.entries()){if(f==="")continue;let u=n.relations?.find(m=>m.propertyName===f);if(!u)continue;let c="",p="",d=!1;u.type==="many-to-one"||u.type==="one-to-one"?De(u)?(c="_id",p=Q(u)||u.propertyName,d=!0):(c=G(u)||u.propertyName,p="_id",d=!1):u.type==="one-to-many"?(c="_id",p=Q(u)||u.propertyName,d=!0):u.type==="many-to-many"&&(u.mappedBy?(c="_id",p=u.mappedBy,d=!0):(c=u.propertyName,p="_id",d=!1));let g=u.type==="one-to-many"||u.type==="many-to-many";s.push({propertyName:f,targetTable:u.targetTableName,localField:c,foreignField:p,type:g?"many":"one",isInverse:d,nestedFields:l})}return{scalarFields:i,relations:s}}var Vt=re(require("fs")),Fn=re(require("path"));var Ri=new RegExp("\\p{Mark}","gu");function _r(r){return r==null?"":String(r).normalize("NFKD").replace(Ri,"").toLowerCase()}function Cn(){let r={};for(let e=128;e<=1114111;e++)try{let t=String.fromCodePoint(e),n=_r(t);n!==t&&(r[t]=n)}catch{}return JSON.stringify(r)}function zt(){return`function() {
|
|
7
|
+
});`),!0}catch{return!1}}function di(r,e){if(!$n(r)||!e||typeof e!="object")return e;let t={...e},n=Tn(r);return n&&(t.sourceCode===void 0||t.sourceCode===null||t.sourceCode==="")&&t[n]!==void 0&&(t.sourceCode=t[n]),t.scriptLanguage=xt(t.scriptLanguage),(t.compiledCode===void 0||t.compiledCode===null||t.compiledCode==="")&&(t.compiledCode=oe(t.sourceCode,t.scriptLanguage)),n&&n in t&&delete t[n],t}function pi(r,e,t){if(!$n(r)||!e||typeof e!="object")return e;let n=Tn(r),i=Object.prototype.hasOwnProperty.call(e,"sourceCode")||(n?Object.prototype.hasOwnProperty.call(e,n):!1),o=Object.prototype.hasOwnProperty.call(e,"scriptLanguage");if(!i&&!o)return e;let s=i?e.sourceCode??(n?e[n]:void 0):t?.sourceCode??(n&&t?t[n]:void 0),a=o?e.scriptLanguage:t?.scriptLanguage,f=oe(s,a),l={...e};return i&&(l.sourceCode=s??null),l.scriptLanguage=xt(a),l.compiledCode=f,n&&n in l&&delete l[n],l}function gi(r){return sr(r).code}function sr(r){if(!r||typeof r!="object")return{code:null,compiledCode:null,shouldPersistCompiledCode:!1};if(typeof r.compiledCode=="string"&&r.compiledCode!==""&&or(r.compiledCode))return{code:r.compiledCode,compiledCode:r.compiledCode,shouldPersistCompiledCode:!1};if(typeof r.sourceCode=="string"&&r.sourceCode!==""){let t=oe(r.sourceCode,r.scriptLanguage);return{code:t,compiledCode:t,shouldPersistCompiledCode:t!==r.compiledCode}}let e=Object.keys(St).find(t=>St[t]in r);if(e){let t=r[St[e]];if(typeof t=="string"&&t!==""){let n=oe(t,r.scriptLanguage);return{code:n,compiledCode:n,shouldPersistCompiledCode:n!==r.compiledCode}}}return typeof r.compiledCode=="string"&&r.compiledCode!==""?{code:r.compiledCode,compiledCode:r.compiledCode,shouldPersistCompiledCode:!1}:{code:null,compiledCode:null,shouldPersistCompiledCode:!1}}function yi(r){if(!r||typeof r!="object")return r;let e=r.type;if(e!=="script"&&e!=="condition")return r;let t=r.config;if(typeof t=="string")try{t=JSON.parse(t)}catch{return r}if(!t||typeof t!="object")return r;let n={...t};return n.sourceCode=n.sourceCode??n.code??null,n.scriptLanguage=xt(n.scriptLanguage),n.compiledCode=oe(n.sourceCode,n.scriptLanguage),delete n.code,{...r,config:typeof r.config=="string"?JSON.stringify(n):n}}var xi=cr.join(__dirname,"execution/worker.js"),Ri=["Invalid or unexpected token","Unexpected identifier","Unexpected token","Missing initializer in const declaration","await is only valid"],fr=new lr.AsyncLocalStorage;function dr(){return fr.getStore()}var Rt=class{constructor(e,t,n,i,o,s,a,f=6e4){this.scriptPath=o;this.onCrash=s;this.onRotate=a;this.entries=[];this.waiting=[];this.cachedMemoryOk=!0;this.lastMemoryCheckMs=0;this.memorySampleIntervalMs=200;this.destroying=!1;this.entryCounter=0;this.max=e,this.effectiveMemory=t,this.rssCeiling=n,this.tasksCap=i,this.drainTimeoutMs=f;for(let l=0;l<e;l++)this.spawnEntry()}getEntries(){return this.entries}spawnEntry(){let e=new ur.Worker(this.scriptPath),t={id:++this.entryCounter,worker:e,tasks:new Map,draining:!1,spawnedAt:Date.now()};return e.on("message",n=>{let i=t.tasks.get(n.id);i&&(n.type==="result"?(typeof n.heapRatio=="number"&&(t.lastHeapRatio=n.heapRatio),n.contextStats&&(t.contextStats=n.contextStats),i.onResult(n),!t.draining&&typeof n.heapRatio=="number"&&n.heapRatio>=.8&&this.rotateEntry(t,`heap=${Math.round(n.heapRatio*100)}%`)):i.onIoCall(n))}),e.on("exit",()=>{let n=t.draining,i=this.destroying;t.drainTimeout&&(clearTimeout(t.drainTimeout),t.drainTimeout=void 0);for(let[,s]of t.tasks)s.abortController.abort(),s.onResult({type:"result",success:!1,error:{message:i?"Worker terminated":"Worker crashed"}});t.tasks.clear();let o=this.entries.indexOf(t);o!==-1&&this.entries.splice(o,1),!n&&!i&&(this.onCrash&&this.onCrash(),this.entries.length<this.max&&this.spawnEntry()),this.drainWaiting()}),this.entries.push(t),t}rotateEntry(e,t){if(e.draining)return;e.draining=!0;let n=Date.now()-e.spawnedAt;if(this.onRotate&&this.onRotate({reason:t,ageMs:n}),this.spawnEntry(),e.tasks.size===0){e.worker.terminate();return}e.drainTimeout=setTimeout(()=>{e.drainTimeout=void 0,e.worker.terminate()},this.drainTimeoutMs)}isMemoryAvailable(){let e=Date.now();return e-this.lastMemoryCheckMs>=this.memorySampleIntervalMs&&(this.cachedMemoryOk=process.memoryUsage().rss/this.effectiveMemory<this.rssCeiling,this.lastMemoryCheckMs=e),this.cachedMemoryOk}findLeastBusy(){let e=null;for(let t of this.entries)t.draining||t.tasks.size<this.tasksCap&&(!e||t.tasks.size<e.tasks.size)&&(e=t);return e}dispatch(){let e=this.findLeastBusy();return e&&(e.tasks.size===0||this.isMemoryAvailable())?Promise.resolve(e):new Promise(t=>this.waiting.push(t))}registerTask(e,t,n){e.tasks.set(t,n)}unregisterTask(e,t){e.tasks.delete(t),e.draining&&e.tasks.size===0&&(e.drainTimeout&&(clearTimeout(e.drainTimeout),e.drainTimeout=void 0),e.worker.terminate()),this.drainWaiting()}drainWaiting(){for(;this.waiting.length>0;){let e=this.findLeastBusy();if(e&&(e.tasks.size===0||this.isMemoryAvailable()))this.waiting.shift()(e);else break}}terminateEntry(e){e.worker.terminate()}resize(e){for(this.max=Math.max(1,e);this.entries.length<this.max;)this.spawnEntry()}getMax(){return this.max}getWaitingCount(){return this.waiting.length}getTotalActiveTasks(){let e=0;for(let t of this.entries)e+=t.tasks.size;return e}getMetrics(){return{max:this.max,activeTasks:this.getTotalActiveTasks(),waitingTasks:this.waiting.length,workers:this.entries.map(e=>({id:e.id,activeTasks:e.tasks.size,draining:e.draining,ageMs:Date.now()-e.spawnedAt,lastHeapRatio:e.lastHeapRatio??0,contextStats:e.contextStats??{}}))}}destroyAll(){this.destroying=!0;for(let e of this.entries)e.worker.terminate();this.entries.length=0,this.waiting.length=0}};function kn(r){if(r===void 0)return JSON.stringify({__e:"u"});try{return JSON.stringify({__e:"v",d:r},(e,t)=>typeof t=="bigint"?t.toString():t)}catch{return JSON.stringify({__e:"v",d:{__serializationError:!0,message:"Result is not JSON-serializable"}})}}var ze=class r{constructor(e){this.logger=new Bt(r.name);this.effectiveMemory=kt();this.isolationTuning=Qt();this.pool=new Rt(this.isolationTuning.maxConcurrentWorkers,this.effectiveMemory,.9,this.isolationTuning.tasksPerWorkerCap,xi,()=>{this.crashesTotal++,this.logger.warn("Worker crashed, replacement spawned")},({reason:e,ageMs:t})=>{this.rotationsTotal++,this.logger.log(`Worker rotation: reason=${e} age=${Math.round(t/1e3)}s`)});this.ceiling=this.isolationTuning.maxConcurrentWorkers;this.prevCpuUsage=process.cpuUsage();this.prevCpuTime=process.hrtime.bigint();this.pressureTicks=0;this.recoveryTicks=0;this.taskCounter=0;this.taskDoneTotal=0;this.taskErrorTotal=0;this.taskTimeoutTotal=0;this.rotationsTotal=0;this.crashesTotal=0;this.taskDurationsMs=[];this.packageCacheService=e.packageCacheService,this.packageCdnLoaderService=e.packageCdnLoaderService,this.logger.log(`Worker pool started: ${this.isolationTuning.maxConcurrentWorkers} workers, ${this.isolationTuning.isolateMemoryLimitMb}MB per isolate, ${this.isolationTuning.isolatePoolSize} isolates/worker, ${this.isolationTuning.tasksPerWorkerCap} tasks/worker cap`),this.tuneTimer=setInterval(()=>this.autoTune(),3e4)}onDestroy(){this.tuneTimer&&clearInterval(this.tuneTimer),this.pool.destroyAll()}autoTune(){let t=process.memoryUsage().rss/this.effectiveMemory,n=process.hrtime.bigint(),i=process.cpuUsage(this.prevCpuUsage),o=Number(n-this.prevCpuTime)/1e3,s=o>0?(i.user+i.system)/o:0;this.prevCpuUsage=process.cpuUsage(),this.prevCpuTime=n;let a=this.pool.getMax(),f=this.pool.getWaitingCount(),l=t>.85||s>.7,u=t<.7&&s<.5,c=f>0,p=a;l?(this.recoveryTicks=0,this.pressureTicks++,this.pressureTicks>=3&&(p=Math.max(1,a-1))):u&&c?(this.pressureTicks=0,this.recoveryTicks++,this.recoveryTicks>=3&&(p=Math.min(this.ceiling,a+2))):(this.pressureTicks=0,this.recoveryTicks=0),p!==a&&(this.pool.resize(p),this.pressureTicks=0,this.recoveryTicks=0,this.logger.log(`Worker pool adjusted: ${a} -> ${p} (rss=${Math.round(t*100)}% cpu=${Math.round(s*100)}% queue=${f})`))}createSnapshot(e){let t={$body:e.$body,$query:e.$query,$params:e.$params,$user:e.$user,$share:e.$share,$data:e.$data,$api:{request:e.$api?.request},$uploadedFile:e.$uploadedFile},n=e.$flow;if(n!=null)try{t.$flow=JSON.parse(JSON.stringify(n,(i,o)=>typeof o=="bigint"?String(o):o))}catch{t.$flow={}}return t}mergeCtxChanges(e,t){t&&(t.$body!==void 0&&(e.$body=t.$body),t.$query!==void 0&&(e.$query=t.$query),t.$params!==void 0&&(e.$params=t.$params),t.$data!==void 0&&(e.$data=t.$data),t.$error!==void 0&&(e.$error=t.$error),t.$statusCode!==void 0&&(e.$statusCode=t.$statusCode),t.$share!==void 0&&(e.$share=t.$share),t.$api!==void 0&&e.$api&&(t.$api.error&&(e.$api.error=t.$api.error),t.$api.response&&(e.$api.response=t.$api.response)),t.$flow!==void 0&&t.$flow!==null&&typeof t.$flow=="object"&&e.$flow!=null&&typeof e.$flow=="object"&&Object.assign(e.$flow,t.$flow),delete e.$pkgs)}spawnAndExecute(e,t,n,i){return(async()=>{let o=await this.pool.dispatch(),s=`t_${++this.taskCounter}`,a=Date.now();return new Promise((f,l)=>{let u=!1,c=new AbortController,p=setTimeout(()=>{if(u)return;u=!0,c.abort(),this.pool.unregisterTask(o,s),this.taskTimeoutTotal++,U({event:"task_timeout",id:s,timeoutMs:i}),this.pool.terminateEntry(o);let d=new Error(`Script execution timed out after ${i}ms`);d.code="ERR_SCRIPT_EXECUTION_TIMEOUT",d.isTimeout=!0,l(d)},i+5e3);this.pool.registerTask(o,s,{abortController:c,onResult:d=>{if(!u)if(u=!0,clearTimeout(p),this.pool.unregisterTask(o,s),this.recordTaskDuration(Date.now()-a),d.success){this.taskDoneTotal++,U({event:"task_done",id:s,ok:!0});let g={value:d.value,valueAbsent:d.valueAbsent===!0,ctxChanges:d.ctxChanges};d.shortCircuit&&(g.shortCircuit=!0),f(g)}else{this.taskErrorTotal++,U({event:"task_done",id:s,ok:!1,message:d.error?.message});let g=new Error(d.error?.message||"Handler execution failed");g.statusCode=d.error?.statusCode,g.code=d.error?.code,g.details=d.error?.details,d.error?.stack&&(g.stack=d.error.stack),d.ctxChanges&&(g.ctxChanges=d.ctxChanges),l(g)}},onIoCall:d=>{if(u)return;let g=c.signal;d.type==="repoCall"?this.handleIoCall(()=>this.execRepoCall(d,n),o.worker,d.callId,g):d.type==="helpersCall"?this.handleIoCall(()=>this.execHelpersCall(d,n),o.worker,d.callId,g):d.type==="socketCall"?this.handleIoCall(()=>this.execSocketCall(d,n),o.worker,d.callId,g):d.type==="cacheCall"?this.handleIoCall(()=>this.execCacheCall(d,n),o.worker,d.callId,g):d.type==="dispatchCall"&&this.handleIoCall(()=>this.execDispatchCall(d,n),o.worker,d.callId,g)}}),o.worker.postMessage({type:e,id:s,...t})})})()}async handleIoCall(e,t,n,i){if(!i?.aborted)try{let o=await(i?fr.run(i,e):e());if(i?.aborted)return;try{t.postMessage({type:"callResult",callId:n,result:kn(o)})}catch{}}catch(o){if(i?.aborted)return;try{let s={__userThrow:!0,message:o.message,statusCode:o.statusCode,code:o.errorCode??o.code,details:o.details,messages:o.messages};t.postMessage({type:"callError",callId:n,error:JSON.stringify(s)})}catch{}}}async execRepoCall(e,t){let n=JSON.parse(e.argsJson),i=t?.$repos?.[e.table];if(!i||typeof i[e.method]!="function")throw new Error(`Repo method not found: ${e.table}.${e.method}`);return i[e.method](...n)}async execHelpersCall(e,t){let n=JSON.parse(e.argsJson),i=e.name.split("."),o=t?.$helpers;for(let s of i)o=o?.[s];if(typeof o!="function")throw new Error(`Helper not found: ${e.name}`);return o(...n)}async execSocketCall(e,t){let n=JSON.parse(e.argsJson),i=t?.$socket?.[e.method];if(typeof i!="function")throw new Error(`Socket method not found: ${e.method}`);return i(...n)}async execCacheCall(e,t){let n=JSON.parse(e.argsJson),i=t?.$cache?.[e.method];if(typeof i!="function")throw new Error(`Cache method not found: ${e.method}`);return i(...n)}async execDispatchCall(e,t){let n=JSON.parse(e.argsJson),i=t?.$trigger;if(typeof i!="function")throw new Error("$trigger is not available");return i(...n)}isScriptParseFailure(e){let t=e.message||"";return Ri.some(n=>t.includes(n))}async run(e,t,n){let i=Math.max(1,Math.trunc(Number(n)||3e4)),o=await this.packageCacheService.getPackages(),s=this.packageCdnLoaderService.getPackageSources(o),a=this.createSnapshot(t);U({event:"isolated_run_start",timeoutMs:i,codeLen:e?.length??0});let f;try{let l={code:e,pkgSources:s,snapshot:a,timeoutMs:i,memoryLimitMb:this.isolationTuning.isolateMemoryLimitMb,isolatePoolSize:this.isolationTuning.isolatePoolSize};try{f=await this.spawnAndExecute("execute",l,t,i)}catch(u){let c=u,p=oe(e,"typescript")||"";if(!this.isScriptParseFailure(c)||p===e)throw u;U({event:"isolated_run_ts_retry",message:c.message}),f=await this.spawnAndExecute("execute",{...l,code:p},t,i)}}catch(l){let u=l;if(U({event:"isolated_run_error",message:u.message,code:u.code,isTimeout:!!u.isTimeout}),u.isTimeout||u.code==="ERR_SCRIPT_EXECUTION_TIMEOUT")throw new pe(i,e);let c=u.statusCode??(typeof u.status=="number"?u.status:void 0);throw Me.createException(void 0,c,u.message||"Unknown error",e,u.details||{})}return this.mergeCtxChanges(t,f.ctxChanges||{}),U({event:"isolated_run_ok"}),f.valueAbsent?void 0:f.value}async runBatch(e,t,n){let i=Math.max(1,Math.trunc(Number(n)||3e4)),o=await this.packageCacheService.getPackages(),s=this.packageCdnLoaderService.getPackageSources(o),a=this.createSnapshot(t);U({event:"isolated_batch_start",timeoutMs:i,blocks:e.length});let f;try{let l={codeBlocks:e,pkgSources:s,snapshot:a,timeoutMs:i,memoryLimitMb:this.isolationTuning.isolateMemoryLimitMb,isolatePoolSize:this.isolationTuning.isolatePoolSize};try{f=await this.spawnAndExecute("executeBatch",l,t,i)}catch(u){let c=u,p=e.map(g=>({...g,code:oe(g.code,"typescript")||""})),d=p.some((g,m)=>g.code!==e[m]?.code);if(!this.isScriptParseFailure(c)||!d)throw u;U({event:"isolated_batch_ts_retry",message:c.message}),f=await this.spawnAndExecute("executeBatch",{...l,codeBlocks:p},t,i)}}catch(l){let u=l;if(U({event:"isolated_batch_error",message:u.message,code:u.code,isTimeout:!!u.isTimeout}),u.ctxChanges&&this.mergeCtxChanges(t,u.ctxChanges),u.isTimeout||u.code==="ERR_SCRIPT_EXECUTION_TIMEOUT")throw new pe(i,"(batch execution)");let c=u.statusCode??(typeof u.status=="number"?u.status:void 0);throw Me.createException(void 0,c,u.message||"Unknown error","(batch execution)",u.details||{})}return this.mergeCtxChanges(t,f.ctxChanges||{}),U({event:"isolated_batch_ok"}),{value:f.valueAbsent?void 0:f.value,shortCircuit:f.shortCircuit===!0}}recordTaskDuration(e){this.taskDurationsMs.push(e),this.taskDurationsMs.length>512&&this.taskDurationsMs.shift()}percentile(e,t){if(e.length===0)return 0;let n=[...e].sort((o,s)=>o-s),i=Math.min(n.length-1,Math.max(0,Math.ceil(t/100*n.length)-1));return n[i]}getMetrics(){let e=this.pool.getMetrics(),t=this.taskDurationsMs,n=t.length===0?0:t.reduce((i,o)=>i+o,0)/t.length;return{tuning:this.isolationTuning,pool:e,taskDoneTotal:this.taskDoneTotal,taskErrorTotal:this.taskErrorTotal,taskTimeoutTotal:this.taskTimeoutTotal,rotationsTotal:this.rotationsTotal,crashesTotal:this.crashesTotal,avgTaskMs:n,p95TaskMs:this.percentile(t,95),p99TaskMs:this.percentile(t,99),maxHeapRatio:Math.max(0,...e.workers.map(i=>i.lastHeapRatio||0))}}};var Rn=require("mongodb");Le();function De(r){return r.type==="one-to-many"||r.isInverse===!0||r.type==="one-to-one"&&!!r.mappedBy}function G(r){return(r.type==="many-to-one"||r.type==="one-to-one")&&!De(r)&&(r.foreignKeyColumn||r.propertyName)||null}function Q(r){return r.mappedBy||r.foreignKeyColumn||r.propertyName||null}function Z(r){if(!r||typeof r!="object")return r;if(r instanceof Rn.ObjectId)return r.toString();if(r instanceof Date)return r.toISOString();if(Array.isArray(r))return r.map(t=>Z(t));if("buffer"in r&&r.buffer&&typeof r.buffer=="object"&&Object.keys(r.buffer).length===12)try{let t=r.buffer,n=Object.keys(t).sort((i,o)=>parseInt(i)-parseInt(o)).map(i=>t[i]);return new Rn.ObjectId(Buffer.from(n)).toString()}catch{}let e={};for(let[t,n]of Object.entries(r))e[t]=n&&typeof n=="object"&&!(n instanceof Buffer)?Z(n):n;return e}function Ve(r,e){if(e.type!=="many-to-many")return null;let t=e.targetTableName||e.targetTable;if(!t)return null;if(e.mappedBy){let a=t,f=e.mappedBy,l=r,u=e.junctionTableName||Pe(a,f,l);if(e.junctionSourceColumn&&e.junctionTargetColumn)return{junctionName:u,selfColumn:e.junctionSourceColumn,otherColumn:e.junctionTargetColumn,owningTable:a,inverseTable:l};let c=je(a,f,l);return{junctionName:u,selfColumn:c.targetColumn,otherColumn:c.sourceColumn,owningTable:a,inverseTable:l}}let n=r,i=t,o=e.junctionTableName||Pe(n,e.propertyName,i);if(e.junctionSourceColumn&&e.junctionTargetColumn)return{junctionName:o,selfColumn:e.junctionSourceColumn,otherColumn:e.junctionTargetColumn,owningTable:n,inverseTable:i};let s=je(n,e.propertyName,i);return{junctionName:o,selfColumn:s.sourceColumn,otherColumn:s.targetColumn,owningTable:n,inverseTable:i}}async function Jt(r,e,t){if(!r)return{scalarFields:[],relations:[]};let n=r.tables?.get(e);if(!n)return{scalarFields:[],relations:[]};let i=new Map;for(let f of t)if(f==="*")i.has("")||i.set("",[]),i.get("").push(f);else if(f.includes(".")){let l=f.split("."),u=l[0],c=l.slice(1).join(".");i.has(u)||i.set(u,[]),i.get(u).push(c)}else n.relations?.some(u=>u.propertyName===f)?i.has(f)||i.set(f,["_id"]):(i.has("")||i.set("",[]),i.get("").push(f));let o=[],s=[],a=i.get("")||[];for(let f of a)if(f==="*"){if(n.columns)for(let l of n.columns)o.includes(l.name)||o.push(l.name);if(n.relations)for(let l of n.relations)i.has(l.propertyName)||i.set(l.propertyName,["_id"])}else n.columns?.some(u=>u.name===f)&&!o.includes(f)&&o.push(f);for(let[f,l]of i.entries()){if(f==="")continue;let u=n.relations?.find(m=>m.propertyName===f);if(!u)continue;let c="",p="",d=!1;u.type==="many-to-one"||u.type==="one-to-one"?De(u)?(c="_id",p=Q(u)||u.propertyName,d=!0):(c=G(u)||u.propertyName,p="_id",d=!1):u.type==="one-to-many"?(c="_id",p=Q(u)||u.propertyName,d=!0):u.type==="many-to-many"&&(u.mappedBy?(c="_id",p=u.mappedBy,d=!0):(c=u.propertyName,p="_id",d=!1));let g=u.type==="one-to-many"||u.type==="many-to-many";s.push({propertyName:f,targetTable:u.targetTableName,localField:c,foreignField:p,type:g?"many":"one",isInverse:d,nestedFields:l})}return{scalarFields:o,relations:s}}var Vt=ie(require("fs")),Fn=ie(require("path"));var Ci=new RegExp("\\p{Mark}","gu");function wr(r){return r==null?"":String(r).normalize("NFKD").replace(Ci,"").toLowerCase()}function Cn(){let r={};for(let e=128;e<=1114111;e++)try{let t=String.fromCodePoint(e),n=wr(t);n!==t&&(r[t]=n)}catch{}return JSON.stringify(r)}function zt(){return`function() {
|
|
8
8
|
var M = ${Cn()};
|
|
9
9
|
function foldStr(s) {
|
|
10
10
|
if (s == null) return '';
|
|
@@ -50,4 +50,4 @@ ${r}
|
|
|
50
50
|
}
|
|
51
51
|
}
|
|
52
52
|
return true;
|
|
53
|
-
}`}var wr="mongo-fold-text-search.body.txt",He=null;function Ci(){let r=[Fn.join(__dirname,wr),Fn.join(process.cwd(),"dist","kernel","query","utils",wr)];for(let e of r)try{if(Vt.existsSync(e))return Vt.readFileSync(e,"utf8")}catch{}return null}function Ht(){if(He!==null)return He;let r=Ci();return r?(He=r,He):(He=zt(),He)}var me=require("mongodb");function P(r,e,t,n){if(t==="_id"){if(n instanceof me.ObjectId)return n;if(typeof n=="string")try{return new me.ObjectId(n)}catch{return n}return n}let o=r?.tables?.get(e);if(!o){if((t==="_id"||t==="id"||t.endsWith("Id"))&&typeof n=="string"&&n.length===24)try{return new me.ObjectId(n)}catch{return n}return n}if(!o.columns){if((t==="_id"||t==="id"||t.endsWith("Id"))&&typeof n=="string"&&n.length===24)try{return new me.ObjectId(n)}catch{return n}return n}let i=o.columns.find(s=>s.name===t);if(!i){if(o.relations?.find(a=>a.propertyName===t||a.foreignKeyColumn===t)&&typeof n=="string"&&n.length===24)try{return new me.ObjectId(n)}catch{return n}if((t==="_id"||t==="id"||t.endsWith("Id"))&&typeof n=="string"&&n.length===24)try{return new me.ObjectId(n)}catch{return n}return n}if(n==null)return n;switch(i.type){case"int":case"integer":case"bigint":case"smallint":case"tinyint":return typeof n=="string"?parseInt(n,10):Number(n);case"float":case"double":case"decimal":case"numeric":case"real":return typeof n=="string"?parseFloat(n):Number(n);case"boolean":case"bool":return typeof n=="string"?n==="true"||n==="1":!!n;case"date":case"datetime":case"timestamp":return typeof n=="string"?new Date(n):n;case"uuid":if(typeof n=="string")try{return new me.ObjectId(n)}catch{return n}return n;default:return n}}var qt="__mongoFoldTextTriples";function Fi(r){return r==="_id"?"$_id":`$${r}`}function qe(r,e,t,n){let o=Fi(e),i=r[qt]??[];i.push({ref:o,needle:t,mode:n}),r[qt]=i}function Ni(r){let e=r[qt];if(delete r[qt],!e?.length)return;let t=[];for(let i of e)t.push(i.ref,i.needle,i.mode);let n={$eq:[{$function:{body:Ht(),args:t,lang:"js"}},!0]},o=r.$expr;o?r.$expr={$and:[o,n]}:r.$expr=n}function Ge(r,e,t,n){let o={},i=n==="mongodb"||!n;for(let s of e){let a=s.field.includes(".")?s.field.split(".").pop()??s.field:s.field,f=t||s.field.split(".")[0]||"";i&&a==="id"&&(a="_id");let l=P(r,f,a,s.value);switch(s.operator){case"=":o[a]=l;break;case"!=":o[a]={$ne:l};break;case">":o[a]={$gt:l};break;case"<":o[a]={$lt:l};break;case">=":o[a]={$gte:l};break;case"<=":o[a]={$lte:l};break;case"like":o[a]={$regex:l.replace(/%/g,".*"),$options:"i"};break;case"in":let u=s.value;Array.isArray(u)||(u=typeof u=="string"&&u.includes(",")?u.split(",").map(b=>b.trim()):[u]);let c=u.map(b=>P(r,f,a,b));o[a]={$in:c};break;case"not in":let p=s.value;Array.isArray(p)||(p=typeof p=="string"&&p.includes(",")?p.split(",").map(b=>b.trim()):[p]);let d=p.map(b=>P(r,f,a,b));o[a]={$nin:d};break;case"is null":o[a]=null;break;case"is not null":o[a]={$ne:null};break;case"_contains":qe(o,a,String(l),"contains");break;case"_starts_with":qe(o,a,String(l),"starts");break;case"_ends_with":qe(o,a,String(l),"ends");break;case"_between":let g=s.value;if(typeof g=="string"&&(g=g.split(",").map(b=>b.trim())),Array.isArray(g)&&g.length===2){let b=P(r,f,a,g[0]),_=P(r,f,a,g[1]);o[a]={$gte:b,$lte:_}}break;case"_is_null":let m=l===!0||l==="true";o[a]=m?{$eq:null}:{$ne:null};break;case"_is_not_null":let y=l===!0||l==="true";o[a]=y?{$ne:null}:{$eq:null};break}}return Ni(o),o}function Tr(r,e,t){let o=r?.tables?.get?.(e)?.columns?.find(i=>i.name===t);return o?o.isNullable!==!1:!0}function Gt(r,e,t,n,o,i){switch(o){case"_contains":qe(e,n,String(i),"contains");break;case"_starts_with":qe(e,n,String(i),"starts");break;case"_ends_with":qe(e,n,String(i),"ends");break;case"_eq":e[n]=P(r,t,n,i);break;case"_neq":{let c=P(r,t,n,i);Tr(r,t,n)?(e.$and||(e.$and=[]),e.$and.push({[n]:{$ne:null}}),e.$and.push({[n]:{$ne:c}})):e[n]={$ne:c};break}case"_in":{let c=i;Array.isArray(c)||(c=typeof c=="string"&&c.includes(",")?c.split(",").map(d=>d.trim()):[c]);let p=c.map(d=>P(r,t,n,d));e[n]={$in:p};break}case"_not_in":case"_nin":let s=i;Array.isArray(s)||(s=typeof s=="string"&&s.includes(",")?s.split(",").map(c=>c.trim()):[s]);let a=s.map(c=>P(r,t,n,c));Tr(r,t,n)?(e.$and||(e.$and=[]),e.$and.push({[n]:{$ne:null}}),e.$and.push({[n]:{$nin:a}})):e[n]={$nin:a};break;case"_gt":e[n]={$gt:P(r,t,n,i)};break;case"_gte":e[n]={$gte:P(r,t,n,i)};break;case"_lt":e[n]={$lt:P(r,t,n,i)};break;case"_lte":e[n]={$lte:P(r,t,n,i)};break;case"_is_null":let f=i===!0||i==="true";e[n]=f?{$eq:null}:{$ne:null};break;case"_is_not_null":let l=i===!0||i==="true";e[n]=l?{$ne:null}:{$eq:null};break;case"_between":let u=i;if(typeof u=="string"&&(u=u.split(",").map(c=>c.trim())),Array.isArray(u)&&u.length===2){let c=P(r,t,n,u[0]),p=P(r,t,n,u[1]);e[n]={$gte:c,$lte:p}}break}}var On=require("mongodb");function se(r,e){if(!r||typeof r!="object")return!1;for(let[t,n]of Object.entries(r))if(t==="_and"||t==="_or"){if(Array.isArray(n)){for(let o of n)if(se(o,e))return!0}}else if(t==="_not"){if(se(n,e))return!0}else if(e.has(t))return!0;return!1}function V(r,e){if(!r||typeof r!="object")return{fieldFilters:{},relationFilters:{},hasRelations:!1};let t={},n={},o=new Set(e.relations.map(s=>s.propertyName));for(let[s,a]of Object.entries(r)){if(s==="_and"||s==="_or"||s==="_not"){t[s]=a;continue}if(o.has(s))if(typeof a=="object"&&a!==null){let f=Object.keys(a);if(f.some(u=>u.startsWith("_"))){let u=["_is_null","_is_not_null","_eq","_neq","_in","_not_in","_nin","_gt","_gte","_lt","_lte"];f.length===1&&u.includes(f[0])?n[s]={id:a}:n[s]=a}else n[s]=a}else n[s]=a;else t[s]=a}let i=se(r,o);return{fieldFilters:t,relationFilters:n,hasRelations:i}}vt();At();var nn="__mongoFoldTextTriples";function Ke(r,e){if(!r)return{};let t={};return en(r,t,e),tn(t),t}function X(r,e,t){if(!e)return{};let n=new ee,{node:o}=he(e,t,r,n);return Ke(o,{metadata:r,rootTable:t})}function en(r,e,t){switch(r.kind){case"true":return;case"false":Ot(e,{_id:{$exists:!1,$type:"null"}});return;case"and":{let o=r.children.map(i=>{let s={};return en(i,s,t),tn(s),s}).filter(i=>Object.keys(i).length>0);if(o.length===0)return;if(o.length===1){Object.assign(e,o[0]);return}Ot(e,...o);return}case"or":{let o=r.children.map(s=>{let a={};return en(s,a,t),tn(a),a}).filter(s=>Object.keys(s).length>0);if(o.length===0)return;let i=e.$or;e.$or=i?[...i,...o]:o;return}case"not":{let n={};en(r.child,n,t),tn(n);let o=e.$nor;e.$nor=o?[...o,n]:[n];return}case"compare":ji(r,e,t);return;case"relation_exists":{console.warn(`[mongo-render-filter] relation_exists node reached renderer directly (rootTable=${t.rootTable}, joinId=${r.joinId}) \u2014 expected applyRelationFilters or null-only short-circuit to handle it. Filter silently skipped.`);return}}}function ji(r,e,t){let n=r.field.fieldName;if(n==="id"&&(n="_id"),r.field.joinId!==null){console.warn(`[mongo-render-filter] compare node has joinId=${r.field.joinId} (field=${r.field.fieldName}) but reached renderer \u2014 expected relation pipeline to handle it. Filter silently skipped.`);return}let o=i=>P(t.metadata,t.rootTable,n,i);switch(r.op){case"eq":te(e,n,o(r.value));return;case"neq":{let i=o(r.value);xr(t,n)?Ot(e,{[n]:{$ne:null}},{[n]:{$ne:i}}):te(e,n,{$ne:i});return}case"gt":te(e,n,{$gt:o(r.value)});return;case"gte":te(e,n,{$gte:o(r.value)});return;case"lt":te(e,n,{$lt:o(r.value)});return;case"lte":te(e,n,{$lte:o(r.value)});return;case"in":{let i=Rr(r.value).map(o);te(e,n,{$in:i});return}case"not_in":{let i=Rr(r.value).map(o);xr(t,n)?Ot(e,{[n]:{$ne:null}},{[n]:{$nin:i}}):te(e,n,{$nin:i});return}case"between":{let i=Array.isArray(r.value)?r.value:typeof r.value=="string"?r.value.split(",").map(s=>s.trim()):null;Array.isArray(i)&&i.length===2&&te(e,n,{$gte:o(i[0]),$lte:o(i[1])});return}case"is_null":te(e,n,r.value===!0?{$eq:null}:{$ne:null});return;case"contains":vn(e,n,String(r.value),"contains");return;case"starts_with":vn(e,n,String(r.value),"starts");return;case"ends_with":vn(e,n,String(r.value),"ends");return}}function te(r,e,t){r[e]===void 0?r[e]=t:(Ot(r,{[e]:r[e]},{[e]:t}),delete r[e])}function Ot(r,...e){if(e.length===0)return;let t=r.$and;r.$and=t?[...t,...e]:e}function xr(r,e){let n=r.metadata?.tables?.get?.(r.rootTable)?.columns?.find(o=>o.name===e);return n?n.isNullable!==!1:!0}function Rr(r){return Array.isArray(r)?r:typeof r=="string"&&r.includes(",")?r.split(",").map(e=>e.trim()):[r]}function Li(r){return r==="_id"?"$_id":`$${r}`}function vn(r,e,t,n){let o=Li(e),i=r[nn]??[];i.push({ref:o,needle:t,mode:n}),r[nn]=i}function tn(r){let e=r[nn];if(delete r[nn],!e?.length)return;let t=[];for(let i of e)t.push(i.ref,i.needle,i.mode);let n={$eq:[{$function:{body:Ht(),args:t,lang:"js"}},!0]},o=r.$expr;o?r.$expr={$and:[o,n]}:r.$expr=n}async function be(r,e,t,n){if(!r||typeof r!="object")return{};let o=t?.tables?.get(e);if(!o)return X(t,r,e);let i=new Set((o.relations||[]).map(l=>l.propertyName));if(!se(r,i))return X(t,r,e);if(r._and&&Array.isArray(r._and)){let u=(await Promise.all(r._and.map(c=>be(c,e,t,n)))).filter(c=>c&&Object.keys(c).length>0);return u.length===0?{}:u.length===1?u[0]:{$and:u}}if(r._or&&Array.isArray(r._or)){let u=(await Promise.all(r._or.map(c=>be(c,e,t,n)))).filter(c=>c&&Object.keys(c).length>0);return u.length===0?{}:{$or:u}}if(r._not){let l=await be(r._not,e,t,n);return!l||Object.keys(l).length===0?{}:{$nor:[l]}}let{fieldFilters:s,relationFilters:a}=V(r,o),f=[];if(s&&Object.keys(s).length>0){let l=X(t,s,e);l&&Object.keys(l).length>0&&f.push(l)}if(a&&Object.keys(a).length>0)for(let[l,u]of Object.entries(a)){let c=await Di(l,u,e,o,t,n);c&&Object.keys(c).length>0&&f.push(c)}return f.length===0?{}:f.length===1?f[0]:{$and:f}}async function Di(r,e,t,n,o,i){let s=(n.relations||[]).find(l=>l.propertyName===r);if(!s)return{};let a=s.targetTableName||s.targetTable,f=o?.tables?.get(a);return!a||!f?{}:s.type==="many-to-one"||s.type==="one-to-one"?Bi(e,s,r,a,f,o,i):s.type==="one-to-many"?Ki(e,s,t,a,f,o,i):s.type==="many-to-many"?Wi(e,s,t,a,f,o,i):{}}async function Bi(r,e,t,n,o,i,s){let a=G(e)||t,f=In(r),l=Mn(f);if(l!==null)return l?{[a]:null}:{[a]:{$ne:null}};let u=Fr(f);if(u!==null){let g=En(u.value);if(u.op==="eq")return{[a]:g};if(u.op==="neq")return{[a]:{$ne:g}};if(u.op==="in")return{[a]:{$in:g}};if(u.op==="not_in")return{$and:[{[a]:{$nin:g}},{[a]:{$ne:null}}]}}let c=X(i,f,n);if(!c||Object.keys(c).length===0)return{};let d=(await s.collection(n).find(c,{projection:{_id:1}}).toArray()).map(g=>g._id).filter(Boolean);return d.length===0?{[a]:null}:{[a]:{$in:d}}}async function Ki(r,e,t,n,o,i,s){let a=Q(e)||t,f=In(r),l=Mn(f);if(l!==null){let p=await Cr(s,n,a,{});return l?p.length===0?{}:{_id:{$nin:p}}:p.length===0?{__impossible__:!0}:{_id:{$in:p}}}let u=X(i,f,n);if(!u||Object.keys(u).length===0)return{};let c=await Cr(s,n,a,u);return c.length===0?{__impossible__:!0}:{_id:{$in:c}}}async function Wi(r,e,t,n,o,i,s){let a=Ve(t,e);if(!a)return{};let f=In(r),l=Mn(f);if(l!==null){let m=await An(s,a,n,null);return l?m.length===0?{}:{_id:{$nin:m}}:m.length===0?{__impossible__:!0}:{_id:{$in:m}}}let u=Fr(f);if(u!==null){let m=En(u.value),y=Array.isArray(m)?m:[m],b=await An(s,a,n,{_id:{$in:y}});return b.length===0?{__impossible__:!0}:{_id:{$in:b}}}let c=X(i,f,n);if(!c||Object.keys(c).length===0)return{};let d=(await s.collection(n).find(c,{projection:{_id:1}}).toArray()).map(m=>m._id).filter(Boolean);if(d.length===0)return{__impossible__:!0};let g=await An(s,a,n,{_id:{$in:d}});return g.length===0?{__impossible__:!0}:{_id:{$in:g}}}async function Cr(r,e,t,n){let o=await r.collection(e).find(n,{projection:{[t]:1}}).toArray(),i=new Set,s=[];for(let a of o){let f=a[t];if(f==null)continue;let l=String(f);i.has(l)||(i.add(l),s.push(f))}return s}async function An(r,e,t,n){let o=null;n&&t&&(o=(await r.collection(t).find(n,{projection:{_id:1}}).toArray()).map(u=>u._id).filter(Boolean));let i=o?{[e.otherColumn]:{$in:o}}:{},s=await r.collection(e.junctionName).find(i,{projection:{[e.selfColumn]:1}}).toArray(),a=new Set,f=[];for(let l of s){let u=l[e.selfColumn];if(u==null)continue;let c=String(u);a.has(c)||(a.add(c),f.push(u))}return f}function In(r){return r&&typeof r=="object"&&!Array.isArray(r)&&Object.keys(r).length===1&&r.id&&typeof r.id=="object"?r.id:r}function Mn(r){if(!r||typeof r!="object"||Array.isArray(r))return null;let e=Object.keys(r);if(e.length!==1)return null;let t=e[0],n=r[t];return t==="_is_null"?n===!0:t==="_is_not_null"?n!==!0:t==="_eq"?n===null?!0:null:t==="_neq"&&n===null?!1:null}function En(r){if(Array.isArray(r))return r.map(e=>En(e));if(typeof r!="string")return r;try{return new On.ObjectId(r)}catch{return r}}function Fr(r){if(Array.isArray(r))return{op:"in",value:r};if(r instanceof On.ObjectId)return{op:"eq",value:r};if(r==null)return null;if(typeof r!="object")return{op:"eq",value:r};if(!r||typeof r!="object"||Array.isArray(r))return null;let e=Object.keys(r);if(e.length!==1)return null;let t=e[0];return t==="_eq"?{op:"eq",value:r._eq}:t==="_neq"?{op:"neq",value:r._neq}:t==="_in"&&Array.isArray(r._in)?{op:"in",value:r._in}:t==="_not_in"&&Array.isArray(r._not_in)?{op:"not_in",value:r._not_in}:null}async function It(r,e,t,n){let o=await Jt(r,e,t),i=[],s={},a={};if(n&&typeof n=="object")for(let[d,g]of Object.entries(n))if(typeof g=="object"&&g!==null){let m=Object.keys(g)[0];m&&["_eq","_neq","_gt","_gte","_lt","_lte","_in","_not_in","_nin","_contains","_starts_with","_ends_with","_between","_is_null","_is_not_null"].includes(m)?s[d]=g:a[d]=g}else s[d]=g;if(Object.keys(s).length>0){let d={};for(let[g,m]of Object.entries(s))if(typeof m=="object"&&m!==null)for(let[y,b]of Object.entries(m))Gt(r,d,e,g,y,b);else d[g]=m;Object.keys(d).length>0&&i.push({$match:d})}let l=r?.tables?.get(e)?.relations||[],u=[];for(let[d,g]of Object.entries(a))if(!o.relations.some(y=>y.propertyName===d)){let y=l.find(b=>b.propertyName===d);if(y){let b="",_="";if(y.type==="many-to-one"||y.type==="one-to-one")b=G(y)||y.propertyName,_="_id";else if(y.type==="one-to-many")b="_id",_=Q(y)||y.propertyName;else if(y.type==="many-to-many")continue;let w=y.type==="one-to-many"||y.type==="many-to-many";u.push({propertyName:d,targetTable:y.targetTableName,localField:b,foreignField:_,type:w?"many":"one",nestedFields:[]})}}let c=[...o.relations,...u];for(let d of c){let g=a[d.propertyName],m=d.nestedFields&&d.nestedFields.length>0?await It(r,d.targetTable,d.nestedFields,g):g?await It(r,d.targetTable,["_id"],g):[];d.type==="one"&&m.length>0&&m.push({$limit:1}),i.push({$lookup:{from:d.targetTable,localField:d.localField,foreignField:d.foreignField,as:d.propertyName,pipeline:m.length>0?m:void 0}}),d.type==="one"&&(i.push({$unwind:{path:`$${d.propertyName}`,preserveNullAndEmptyArrays:!0}}),g&&(Xe(g)||i.push({$match:{[d.propertyName]:{$ne:null}}})))}let p=l.filter(d=>!c.some(g=>g.propertyName===d.propertyName));if(o.scalarFields.length>0||o.relations.length>0||p.length>0){let d={_id:1};for(let m of o.scalarFields)d[m]=1;for(let m of c)d[m.propertyName]=1;if(t.includes("*"))for(let m of p){if(m.type==="one-to-many"||m.type==="many-to-many")continue;m.type==="many-to-many"?d[m.propertyName]={$map:{input:`$${m.propertyName}`,as:"item",in:{_id:"$$item"}}}:d[m.propertyName]={$cond:{if:{$ne:[`$${m.propertyName}`,null]},then:{_id:`$${m.propertyName}`},else:null}}}i.push({$project:d})}return i}async function Nr(r,e,t,n,o){let i=r?.tables?.get(t),s=i?.relations||[],a=i?.columns||[],f=s.filter(u=>!o.some(c=>c.propertyName===u.propertyName)),l=n.length===a.length||n.length===0&&o.length===0;if(f.length>0||!l){let u={_id:1};for(let c of n)u[c]=1;for(let c of o)u[c.propertyName]=1;for(let c of f){if(c.type==="one-to-many"||c.type==="many-to-many")continue;c.type==="many-to-many"?u[c.propertyName]={$map:{input:`$${c.propertyName}`,as:"item",in:{_id:"$$item"}}}:u[c.propertyName]={$cond:{if:{$ne:[`$${c.propertyName}`,null]},then:{_id:`$${c.propertyName}`},else:null}}}e.push({$project:u})}}function Xe(r){if(!r||typeof r!="object")return!1;if(r===null)return!0;if(Array.isArray(r))return r.some(e=>Xe(e));if("_or"in r&&Array.isArray(r._or))return r._or.some(e=>Xe(e));if("_and"in r&&Array.isArray(r._and))return r._and.some(e=>Xe(e));if("_not"in r)return Xe(r._not);for(let[e,t]of Object.entries(r)){if(t===null){if(e==="_eq"||e==="$eq")return!0;continue}if(typeof t=="object"&&("_is_null"in t&&(t._is_null===!0||t._is_null==="true")||"_eq"in t&&t._eq===null||"$eq"in t&&t.$eq===null||Xe(t)))return!0}return!1}et();var Pn=require("mongodb");et();rn();var tt=class{constructor(e,t,n){this.db=e;this.metadata=t;this.fieldRenamesByTable=n;this.pkField="_id"}normalizeMetadata(){return this.metadata?this.metadata.tables?this.metadata:{tables:new Map(Object.entries(this.metadata))}:this.metadata}buildSortFromTokens(e){if(!e)return;let t=Array.isArray(e)?e:e.split(",").map(o=>o.trim()).filter(Boolean),n={};for(let o of t){let i=o.startsWith("-"),a=(i?o.slice(1):o).split(".");if(a.length===1)n[a[0]]=i?-1:1;else{let f=`__sort_${a.slice(0,-1).join("_")}`;n[`${f}.${a[a.length-1]}`]=i?-1:1}}return Object.keys(n).length>0?n:void 0}hasDottedSort(e){return e?(Array.isArray(e)?e:e.split(",").map(n=>n.trim()).filter(Boolean)).some(n=>(n.startsWith("-")?n.slice(1):n).includes(".")):!1}buildSortAggregatePipeline(e,t,n){let o=Array.isArray(n)?n:n.split(",").map(l=>l.trim()).filter(Boolean),i=[{$match:t}],s=new Set;for(let l of o){let c=(l.startsWith("-")?l.slice(1):l).split(".");if(c.length<=1)continue;let p=e;for(let d=0;d<c.length-1;d++){let g=c[d],m=this.normalizeMetadata()?.tables?.get(p);if(!m)break;let y=m.relations?.find(w=>w.propertyName===g);if(!y)break;let b=y.targetTableName||y.targetTable,_=`__sort_${c.slice(0,d+1).join("_")}`;if(!s.has(_)){s.add(_);let w=G(y)||y.propertyName,$=d===0?null:`__sort_${c.slice(0,d).join("_")}`,h=$?`${$}.${w}`:w;i.push({$lookup:{from:b,localField:h,foreignField:"_id",as:_}},{$unwind:{path:`$${_}`,preserveNullAndEmptyArrays:!0}})}p=b}}let a=this.buildSortFromTokens(n);a&&i.push({$sort:a});let f={};for(let l of s)f[l]=0;return Object.keys(f).length>0&&i.push({$project:f}),i}toObjectId(e){try{return typeof e=="string"?new Pn.ObjectId(e):e}catch{return e}}keyOf(e){return e==null?"":e instanceof Pn.ObjectId||typeof e=="object"&&typeof e.toHexString=="function"?e.toHexString():String(e)}buildScalarRef(e){return{[this.pkField]:e}}getTargetPkField(e){return this.pkField}resolveOwnerFkKey(e){return e.relationName}resolveInverseFkField(e){return e.foreignField?e.foreignField:e.mappedBy?e.mappedBy:e.relationName}resolveParentPk(e){return this.pkField}resolveFields(e,t){let{rootFields:n,subRelations:o}=Ze(e),i={},s=!1;if(n.includes("*")){s=!0;for(let p of t.relations||[])o.has(p.propertyName)||o.set(p.propertyName,["_id"])}else for(let p of n){let d=t.columns.find(g=>g.name===p);d?i[d.name]=1:t.relations?.find(m=>m.propertyName===p)&&!o.has(p)&&o.set(p,["_id"])}o.forEach((p,d)=>{let g=t.relations?.find(m=>m.propertyName===d);g&&(g.type==="many-to-one"||g.type==="one-to-one"&&!g.isInverse)&&(s||(i[g.propertyName]=1))}),s||(i._id=1);let a=[];o.forEach((p,d)=>{let g=t.relations?.find(_=>_.propertyName===d);if(!g)return;let m=g.targetTableName||g.targetTable;if(!m)return;let y,b;g.type==="many-to-one"||g.type==="one-to-one"?De(g)?(y="_id",b=Q(g)||g.propertyName):(y=G(g)||g.propertyName,b="_id"):g.type==="one-to-many"?(y="_id",b=Q(g)||g.propertyName):g.type==="many-to-many"&&(g.isInverse?(y="_id",b=g.mappedBy):(y=g.propertyName,b="_id")),a.push({relationName:d,type:g.type,targetTable:m,fields:p,isInverse:g.isInverse,fkColumn:g.foreignKeyColumn,mappedBy:g.mappedBy,junctionTableName:g.junctionTableName,junctionSourceColumn:g.junctionSourceColumn,junctionTargetColumn:g.junctionTargetColumn,localField:y,foreignField:b})});let f=!s&&Object.keys(i).length===1&&i._id===1&&a.length===0,l=this.fieldRenamesByTable?.get(t.name)??[],u=[];if(!s&&l.length>0)for(let p of l)i[p.newName]===1&&i[p.oldName]!==1&&(i[p.oldName]=1,u.push(p.oldName));return{isPkOnly:f,nestedDescs:a,fetchSpec:{projection:s?void 0:i,pendingRenames:l,hiddenFields:u}}}async fetchOwner(e,t,n,o){let i=o?.userFilter?X(this.normalizeMetadata(),o.userFilter,e):null,s=this.buildSortFromTokens(o?.userSort),a=await H(t,f=>{let l={_id:{$in:f}};i&&Object.keys(i).length>0&&Object.assign(l,i);let u={projection:n.projection};return s&&(u.sort=s),this.db.collection(e).find(l,u).toArray()});return this.applyReadFallback(a,n)}async fetchInverse(e,t,n,o,i){let s=o.projection?{...o.projection}:void 0;s&&s[t]===void 0&&(s[t]=1);let a=n.filter(y=>y!=null).map(y=>this.toObjectId(y)),f=i?.userFilter?X(this.normalizeMetadata(),i.userFilter,e):null,l=i?.userLimit,u=i?.userPage,c=this.hasDottedSort(i?.userSort);if(l!==void 0){let y=u?(u-1)*l:0,b=await le(a,async w=>{let $={[t]:w};if(f&&Object.keys(f).length>0&&Object.assign($,f),c){let R=this.buildSortAggregatePipeline(e,$,i.userSort);y>0&&R.push({$skip:y}),R.push({$limit:l}),s&&R.push({$project:s});let F=await this.db.collection(e).aggregate(R).toArray();return this.applyReadFallback(F,o)}let k={sort:this.buildSortFromTokens(i?.userSort)||{_id:1}};s&&(k.projection=s);let S=this.db.collection(e).find($,k);return y>0&&S.skip(y),S.limit(l),this.applyReadFallback(await S.toArray(),o)},16),_=[];for(let[w,$]of b.entries()){let h=a.find(k=>this.keyOf(k)===w);for(let k of $)k[t]||(k[t]=h??w),_.push(k)}return{docs:_,groupKeyField:t}}if(c){let y=[],b=await le(a,async _=>{let w={[t]:_};f&&Object.keys(f).length>0&&Object.assign(w,f);let $=this.buildSortAggregatePipeline(e,w,i.userSort);s&&$.push({$project:s});let h=await this.db.collection(e).aggregate($).toArray();return this.applyReadFallback(h,o)},16);for(let _ of b.values())for(let w of _)y.push(w);return{docs:y,groupKeyField:t}}let p={[t]:{$in:a}};f&&Object.keys(f).length>0&&Object.assign(p,f);let d=this.buildSortFromTokens(i?.userSort)||{_id:1},g={projection:s,sort:d},m=await H(a,y=>this.db.collection(e).find({[t]:{$in:y},...f||{}},g).toArray());return{docs:this.applyReadFallback(m,o),groupKeyField:t}}postProcessInverseChild(e,t,n){n||delete e[t]}async fetchM2M(e,t,n,o,i){let s=n?.name;if(!s)throw new Error(`Missing parentMeta.name for M2M batch fetch: ${t.relationName}`);let a=Ve(s,{type:"many-to-many",propertyName:t.relationName,targetTable:t.targetTable,mappedBy:t.isInverse?t.mappedBy:void 0});if(!a)throw new Error(`Failed to resolve junction info for ${s}.${t.relationName}`);let f=e.map(w=>w._id).filter(w=>w!=null),l=new Map;for(let w of e)l.set(this.keyOf(w._id),[]);if(f.length===0)return{grouped:l,docs:[]};let u=await H(f,w=>this.db.collection(a.junctionName).find({[a.selfColumn]:{$in:w}},{projection:{_id:0,[a.selfColumn]:1,[a.otherColumn]:1}}).toArray());if(u.length===0)return{grouped:l,docs:[]};let c=t.userFilter?X(this.normalizeMetadata(),t.userFilter,t.targetTable):null,p=t.userLimit,d=t.userPage;if(p!==void 0){let w=d?(d-1)*p:0,$=await le(f,async k=>{let R=(await this.db.collection(a.junctionName).find({[a.selfColumn]:k},{projection:{_id:0,[a.otherColumn]:1}}).toArray()).map(W=>W[a.otherColumn]).filter(W=>W!=null);if(R.length===0)return[];let F={_id:{$in:R}};if(c&&Object.keys(c).length>0&&Object.assign(F,c),this.hasDottedSort(t.userSort)){let W=this.buildSortAggregatePipeline(t.targetTable,F,t.userSort);w>0&&W.push({$skip:w}),W.push({$limit:p}),i.projection&&W.push({$project:i.projection});let Se=await this.db.collection(t.targetTable).aggregate(W).toArray();return this.applyReadFallback(Se,i)}let O={sort:this.buildSortFromTokens(t.userSort)||{_id:1}};i.projection&&(O.projection=i.projection);let j=this.db.collection(t.targetTable).find(F,O);return w>0&&j.skip(w),j.limit(p),this.applyReadFallback(await j.toArray(),i)},16),h=[];for(let[k,S]of $.entries()){l.set(k,S);for(let R of S)h.push(R)}return{grouped:l,docs:h}}let g=new Set,m=[];for(let w of u){let $=w[a.otherColumn];if($==null)continue;let h=this.keyOf($);g.has(h)||(g.add(h),m.push($))}let y=i.projection&&Object.keys(i.projection).length===1&&i.projection._id===1&&!c,b=[],_=new Map;if(y)for(let w of m)_.set(this.keyOf(w),{_id:w});else{let w={_id:{$in:m}};c&&Object.keys(c).length>0&&Object.assign(w,c);let $=this.hasDottedSort(t.userSort),h;if($){let k=this.buildSortAggregatePipeline(t.targetTable,w,t.userSort);i.projection&&k.push({$project:i.projection}),h=await this.db.collection(t.targetTable).aggregate(k).toArray()}else{let S={sort:this.buildSortFromTokens(t.userSort)||{_id:1}};i.projection&&(S.projection=i.projection),h=await H(m,R=>this.db.collection(t.targetTable).find({_id:{$in:R},...c||{}},S).toArray())}b=this.applyReadFallback(h,i);for(let k of b)_.set(this.keyOf(k._id),k)}for(let w of u){let $=this.keyOf(w[a.selfColumn]),h=this.keyOf(w[a.otherColumn]),k=_.get(h);if(!k)continue;let S=l.get($);S&&S.push(k)}return{grouped:l,docs:b}}applyReadFallback(e,t){let n=t.pendingRenames??[];if(e.length===0||n.length===0)return e;let o=new Set(t.hiddenFields??[]);for(let i of e)for(let s of n)i[s.newName]===void 0&&i[s.oldName]!==void 0&&(i[s.newName]=i[s.oldName]),(o.has(s.oldName)||i[s.newName]!==void 0)&&delete i[s.oldName];return e}};async function on(r,e,t,n,o=3,i=0,s,a,f,l){let u=await l?.getActiveFieldRenamesByTable?.(),c=new tt(r,a,u);await new _e(c,n,f).execute(e,t,o,i,s)}async function jn(r,e,t){let n=[],{db:o,metadata:i,dbType:s,debugLog:a}=t,f=i?.tables?.get(e.table),l=new Set((f?.relations??[]).map(h=>h.propertyName)),u=!!e.mongoRawFilter&&!!i&&se(e.mongoRawFilter,l),c=e.plan,p=c?.filterTree&&!c.hasRelationFilters&&!e.where;if(e.mongoRawFilter&&i&&u){let h=await be(e.mongoRawFilter,e.table,i,o);h&&Object.keys(h).length>0&&n.push({$match:h})}else if(p){let h=Ke(c.filterTree,{metadata:i,rootTable:e.table});Object.keys(h).length>0&&n.push({$match:h})}else if(e.where){console.warn(`[mongo-executor:fallback] whereToMongoFilter path hit for table=${e.table} where=${JSON.stringify(e.where)}`);let h=Ge(i,e.where,e.table,s);n.push({$match:h})}let d=e.plan,g=d?d.hasRelationSort:e.sort?.some(h=>{if(!h.field.includes("."))return!1;let k=h.field.split(".")[0];return e.mongoFieldsExpanded?.relations?.some(S=>S.propertyName===k)??!1})??!1,m=u||g,y=()=>d?.sortItems?Ji(d.sortItems):e.sort?Qi(e.sort):null;if(!e.mongoFieldsExpanded){let h=y();if(h&&n.push({$sort:h}),e.mongoCountOnly?n.push({$count:"count"}):(e.offset&&n.push({$skip:e.offset}),e.limit!==void 0&&e.limit!==null&&e.limit>0&&n.push({$limit:e.limit})),e.select){let S={};for(let R of e.select)S[R]=1;n.push({$project:S})}a&&a.push({type:"MongoDB Aggregation Pipeline",collection:e.table,pipeline:JSON.parse(JSON.stringify(n))});let k=await r.aggregate(n).toArray();return e.mongoCountOnly?{results:k,pipeline:n}:{results:Ar(k),pipeline:n}}let{scalarFields:b,relations:_}=e.mongoFieldsExpanded;if(!m){let h=y();h&&n.push({$sort:h}),e.mongoCountOnly||(e.offset&&n.push({$skip:e.offset}),e.limit!==void 0&&e.limit!==null&&e.limit>0&&n.push({$limit:e.limit}))}let w=[];for(let h of _){let k=e.mongoRawFilter?.[h.propertyName],S=e.sort?.some(R=>R.field.startsWith(`${h.propertyName}.`));if(k||S){if(h.nestedFields&&h.nestedFields.length>0){let F=await It(i,h.targetTable,h.nestedFields??[],k);h.type==="one"&&F.length>0&&F.push({$limit:1}),n.push({$lookup:{from:h.targetTable,localField:h.localField,foreignField:h.foreignField,as:h.propertyName,pipeline:F.length>0?F:void 0}})}else if(k){let F=await It(i,h.targetTable,["_id"],k);h.type==="one"&&F.length>0&&F.push({$limit:1}),n.push({$lookup:{from:h.targetTable,localField:h.localField,foreignField:h.foreignField,as:h.propertyName,pipeline:F.length>0?F:void 0}})}else n.push({$lookup:{from:h.targetTable,localField:h.localField,foreignField:h.foreignField,as:h.propertyName}});h.type==="one"&&(n.push({$unwind:{path:`$${h.propertyName}`,preserveNullAndEmptyArrays:!0}}),k&&(nt(k)||n.push({$match:{[h.propertyName]:{$ne:null}}})))}else w.push(h)}if(m){let h=y();h&&n.push({$sort:h}),e.mongoCountOnly||(e.offset&&n.push({$skip:e.offset}),e.limit!==void 0&&e.limit!==null&&e.limit>0&&n.push({$limit:e.limit}))}await Nr(i,n,e.table,b,[..._]),e.mongoCountOnly&&n.push({$count:"count"}),a&&a.push({type:"MongoDB Aggregation Pipeline",collection:e.table,pipeline:JSON.parse(JSON.stringify(n))});let $=await r.aggregate(n).toArray();if(e.mongoCountOnly)return{results:$,pipeline:n};if(w.length>0&&$.length>0){let h=e.deep||{},k=w.map(R=>{let Z=i?.tables?.get(e.table)?.relations?.find(j=>j.propertyName===R.propertyName),A=h[R.propertyName],O=A?.fields!=null?Array.isArray(A.fields)?A.fields:String(A.fields).split(",").map(j=>j.trim()).filter(Boolean):R.nestedFields&&R.nestedFields.length>0?R.nestedFields:["_id"];return{relationName:R.propertyName,type:Z?.type,targetTable:R.targetTable,fields:O,isInverse:Z?.isInverse,mappedBy:Z?.mappedBy,junctionTableName:Z?.junctionTableName,localField:R.localField,foreignField:R.foreignField,userFilter:A?.filter,userSort:A?.sort,userLimit:A?.limit!==void 0?Number(A.limit):void 0,userPage:A?.page!==void 0?Number(A.page):void 0,nestedDeep:A?.deep}}),S=Ui(i);S&&await on(o,$,k,S,3,0,e.table,i,void 0,t.mongoPhysicalMigrationService)}return{results:Ar($),pipeline:n}}function Ui(r){let e=r;return e?async t=>{let n=e.tables?.get(t);return n?{name:n.name,columns:(n.columns||[]).map(o=>({name:o.name,type:o.type})),relations:n.relations||[]}:null}:null}function Qi(r){let e={};for(let t of r){let n=t.field;n==="id"&&(n="_id"),e[n]=t.direction==="asc"?1:-1}return e}function Ji(r){let e={};for(let t of r){let n=t.joinId!==null?t.fullPath:t.field;n==="id"&&(n="_id"),e[n]=t.direction==="asc"?1:-1}return e}function nt(r){if(!r||typeof r!="object")return!1;if(r===null)return!0;if(Array.isArray(r))return r.some(e=>nt(e));if("_or"in r&&Array.isArray(r._or))return r._or.some(e=>nt(e));if("_and"in r&&Array.isArray(r._and))return r._and.some(e=>nt(e));if("_not"in r)return nt(r._not);for(let[e,t]of Object.entries(r)){if(t===null){if(e==="_eq"||e==="$eq")return!0;continue}if(typeof t=="object"&&("_is_null"in t&&(t._is_null===!0||t._is_null==="true")||"_eq"in t&&t._eq===null||"$eq"in t&&t.$eq===null||nt(t)))return!0}return!1}function Ar(r){return r.map(oe)}function Or(r,e){let t=[],n=[],o=e?.tables?.get(r.rootTable);if(!o)return{scalarFields:t,relations:n};for(let i of r.nodes)if(i.kind==="wildcard")for(let s of o.columns||[])t.includes(s.name)||t.push(s.name);else i.kind==="scalar"?o.columns?.some(a=>a.name===i.name)&&!t.includes(i.name)&&t.push(i.name):i.kind==="relation"&&n.push(zi(i,o,e));return{scalarFields:t,relations:n}}function zi(r,e,t){let n=e.relations?.find(l=>l.propertyName===r.propertyName),o,i,s=!1;r.relationType==="many-to-one"||r.relationType==="one-to-one"?n&&De(n)?(o="_id",i=Q(n)||r.propertyName,s=!0):(o=n&&G(n)||r.propertyName,i="_id",s=!1):r.relationType==="one-to-many"?(o="_id",i=n&&Q(n)||r.propertyName,s=!0):n?.mappedBy?(o="_id",i=n.mappedBy,s=!0):(o=r.propertyName,i="_id",s=!1);let a=r.relationType==="one-to-many"||r.relationType==="many-to-many",f=Ir(r.children);return{propertyName:r.propertyName,targetTable:r.targetTable,localField:o,foreignField:i,type:a?"many":"one",isInverse:s,nestedFields:f}}function Ir(r){let e=[];for(let t of r)if(t.kind==="wildcard")e.push("*");else if(t.kind==="scalar")e.push(t.name);else if(t.kind==="relation"){let n=Ir(t.children);if(n.length===0)e.push(`${t.propertyName}.id`);else for(let o of n)e.push(`${t.propertyName}.${o}`)}return e}Ye();At();vt();function sn(r,e,t,n){let o={rootTable:e,nodes:[]};if(!r||r.length===0)return o;let i=t?.tables?.get(e);if(!i)return o;let s=i.columns?.some(c=>c.name==="_id"&&c.isPrimary),a=i.columns?.some(c=>c.name==="id"),f=s&&!a?"_id":"id",l=new Map,u=[];for(let c of r){let p=c==="id"?f:c;if(p==="*")u.push("*");else if(p.includes(".")){let d=p.indexOf("."),g=p.substring(0,d),m=p.substring(d+1);if(!i.relations?.some(b=>b.propertyName===g))continue;l.has(g)||l.set(g,[]),l.get(g).push(m)}else if(i.relations?.some(g=>g.propertyName===p))l.has(p)||l.set(p,[f]);else{if(!i.columns?.some(m=>m.name===p))continue;u.push(p)}}if(u.includes("*")){o.nodes.push({kind:"wildcard"});for(let c of i.relations||[])l.has(c.propertyName)||l.set(c.propertyName,[f])}else for(let c of u)o.nodes.push({kind:"scalar",name:c});for(let[c,p]of l.entries()){let d=i.relations?.find(y=>y.propertyName===c);if(!d)continue;let g=d.targetTableName||d.targetTable,m={kind:"relation",propertyName:c,joinId:null,relationType:d.type,isInverse:!!d.isInverse,targetTable:g,children:Mr(p,g,t)};if(d.type==="many-to-one"||d.type==="one-to-one"){let y=n.registerWithParent(e,c,t,"left",null,"data");m.joinId=y}o.nodes.push(m)}return o}function Mr(r,e,t){let n=t?.tables?.get(e);if(!n)return[];let o=n.columns?.some(u=>u.name==="_id"&&u.isPrimary),i=n.columns?.some(u=>u.name==="id"),s=o&&!i?"_id":"id",a=new Map,f=[];for(let u of r){let c=u==="id"?s:u;if(c==="*")f.push("*");else if(c.includes(".")){let p=c.indexOf("."),d=c.substring(0,p),g=c.substring(p+1);if(!n.relations?.some(y=>y.propertyName===d))continue;a.has(d)||a.set(d,[]),a.get(d).push(g)}else if(n.relations?.some(d=>d.propertyName===c))a.has(c)||a.set(c,[s]);else{if(!n.columns?.some(g=>g.name===c))continue;f.push(c)}}let l=[];if(f.includes("*")){l.push({kind:"wildcard"});for(let u of n.relations||[])a.has(u.propertyName)||a.set(u.propertyName,[s])}else for(let u of f)l.push({kind:"scalar",name:u});for(let[u,c]of a.entries()){let p=n.relations?.find(g=>g.propertyName===u);if(!p)continue;let d=p.targetTableName||p.targetTable;l.push({kind:"relation",propertyName:u,joinId:null,relationType:p.type,isInverse:!!p.isInverse,targetTable:d,children:Mr(c,d,t)})}return l}var K=class{plan(e){let{tableName:t,fields:n,filter:o,sort:i,page:s,limit:a,meta:f,metadata:l,dbType:u}=e,c=l?.tables?.get(t),p=new ee,d=this.parseFields(n),g=null;d&&c&&(g=sn(d,t,l,p));let m=!1,y=null;if(o&&c){let A=he(o,t,l,p);y=A.node,m=A.hasRelationFilters}let b=this.parseSort(i),_=[],w=!1;for(let A of b){let O=A.startsWith("-"),j=O?A.substring(1):A,W=O?"desc":"asc";if(j.includes(".")&&c){let Se=j.split(".")[0];if(c.relations?.find(x=>x.propertyName===Se)){let x=this.registerSortJoinChain(j,t,l,p,null);x&&(_.push({joinId:x.lastJoinId,field:x.field,direction:W,fullPath:j}),w=!0);continue}}_.push({joinId:null,field:j,direction:W,fullPath:j})}_.length===0&&_.push({joinId:null,field:"id",direction:"asc",fullPath:"id"});let $=this.parseLimit(a),h=this.parsePage(s),k=h!==void 0&&$!==void 0?(h-1)*$:void 0,S=this.parseMeta(f),R=S.includes("totalCount")||S.includes("*"),F=S.includes("filterCount")||S.includes("*"),Z=p.getAll();return{table:t,dbType:u,rawFields:d,rawFilter:o??null,joins:Z,sortItems:_,limit:$,offset:k,needsTotalCount:R,needsFilterCount:F,hasRelationFilters:m,hasRelationSort:w,filterTree:y,fieldTree:g}}parseFields(e){if(e)return Array.isArray(e)?e.map(t=>t.trim()).filter(Boolean):e.split(",").map(t=>t.trim()).filter(Boolean)}parseSort(e){return e?(Array.isArray(e)?e:e.split(",")).map(n=>n.trim()).filter(Boolean):[]}parseLimit(e){if(e==null)return;let t=typeof e=="string"?parseInt(e,10):e;if(!Number.isNaN(t))return t<0?0:t}parsePage(e){if(e==null)return;let t=typeof e=="string"?parseInt(e,10):e;return Number.isNaN(t)?void 0:t}parseMeta(e){return e?Array.isArray(e)?e:e.split(",").map(t=>t.trim()).filter(Boolean):[]}registerSortJoinChain(e,t,n,o,i){let s=e.indexOf(".");if(s===-1)return null;let a=e.slice(0,s),f=e.slice(s+1),l=n?.tables?.get(t);if(!l)return null;let u=l.relations?.find(d=>d.propertyName===a);if(!u||u.type!=="many-to-one"&&u.type!=="one-to-one")return null;let c=o.registerWithParent(t,a,n,"left",i,"sort");if(!c)return null;if(!f.includes("."))return{lastJoinId:c,field:f};let p=u.targetTableName||u.targetTable;return this.registerSortJoinChain(f,p,n,o,c)}};Nt();Ft();var Vi=new Set(["count","sum","avg","min","max","countRecords"]),Hi=new Set(["int","integer","bigint","float","double","decimal","numeric","real","number"]),qi=new Set(["_and","_or","_not"]);function we(r){return!!r&&typeof r=="object"&&!Array.isArray(r)}function I(r,e){let t=r.replace(/^aggregate\./,"");throw new E(e,{path:r,aggregate:{[t]:e}})}function Gi(r){return typeof r!="string"?!1:Hi.has(r.toLowerCase())}function Er(r){return Object.keys(r).length===0}function Yi(r,e,t){return r===!0?{}:(r==null&&I(t,`aggregate.${e} condition must be true or an object`),we(r)||I(t,`aggregate.${e} condition must be true or an object`),r)}function Xi(r,e,t){let n=r?.tables?.get(e);return n||I(t,`Table "${e}" metadata is not available`),n}function Pr(r,e){let t=r?.targetTableName??r?.targetTable;return(typeof t!="string"||t.length===0)&&I(e,"aggregate.countRecords relation target is not available"),t}function an(r,e,t,n){let o=Xi(t,e,n);for(let[i,s]of Object.entries(r)){if(i==="_and"||i==="_or"){Array.isArray(s)||I(n,`aggregate.countRecords ${i} condition must be an array`);for(let u of s)we(u)||I(n,`aggregate.countRecords ${i} items must be objects`),an(u,e,t,n);continue}if(i==="_not"){we(s)||I(n,"aggregate.countRecords _not condition must be an object"),an(s,e,t,n);continue}(i.startsWith("_")||qi.has(i))&&I(n,`Unsupported aggregate.countRecords condition key "${i}"`);let a=o.columns?.find(u=>u.name===i),f=o.relations?.find(u=>u.propertyName===i);if(!a&&!f&&I(n,`Unknown aggregate.countRecords field or relation "${i}" on table "${e}"`),we(s)||I(n,`aggregate.countRecords condition for "${i}" must be an object`),a){for(let u of Object.keys(s))Y.has(u)||I(n,`aggregate.countRecords condition for "${i}" only supports field operators`);continue}let l=Pr(f,n);an(s,l,t,n)}}function Ln(r){return we(r)&&Object.keys(r).length>0}function rt(r,e,t){if(!Ln(r))return[];we(r)||I("aggregate","aggregate must be an object");let n=t?.tables?.get(e);n||I("aggregate",`Table "${e}" metadata is not available`);let o=[];for(let[i,s]of Object.entries(r)){let a=`aggregate.${i}`;(!i||typeof i!="string")&&I("aggregate","aggregate field name must be a non-empty string"),we(s)||I(a,"aggregate field config must be an object");let f=i,l=a,u=n.columns?.find(d=>d.name===i),c=n.relations?.find(d=>d.propertyName===i);!u&&!c&&I(l,`Unknown aggregate field or relation "${i}" on table "${e}"`);let p=Object.entries(s).filter(([d])=>d!=="as");p.length===0&&I(l,"aggregate field must define at least one operation");for(let[d,g]of p){Vi.has(d)||I(l,`Unsupported aggregate operation "${d}"`);let m=Yi(g,d,l);if(c&&d!=="countRecords"&&I(l,`aggregate.${d} is not supported on relation "${i}"; use countRecords`),u&&d==="countRecords"&&I(l,`aggregate.countRecords requires a relation, but "${i}" is a field`),u&&(d==="sum"||d==="avg")&&!Gi(u.type)&&I(l,`aggregate.${d} requires a numeric field, but "${i}" is "${u.type}"`),u)for(let y of Object.keys(m))Y.has(y)||I(l,`aggregate.${d} condition for "${i}" only supports field operators`);if(c&&d==="countRecords"){let y=Pr(c,l);an(m,y,t,l)}o.push({field:i,outputKey:f,path:l,op:d,condition:m})}}return o}function it(r,e){let t=[];return we(r)&&!Er(r)&&t.push(r),Er(e.condition)||t.push({[e.field]:e.condition}),t.length===0?{}:t.length===1?t[0]:{_and:t}}function Te(r,e,t){r[e.outputKey]??={},r[e.outputKey][e.op]=t}var ot=class{constructor(e,t){this.mongoService=e;this.mongoPhysicalMigrationService=t;this.debugLog=[];this.lastBuiltPipeline=null;this.db=e.getDb()}async execute(e){if(this.metadata=e.metadata,this.dbType=e.dbType||"mongodb",!e.plan){let p=new K;e={...e,plan:p.plan({tableName:e.tableName,fields:e.fields,filter:e.filter,sort:e.sort,page:e.page,limit:e.limit,meta:e.meta,metadata:e.metadata,dbType:"mongodb"})}}let t=e.debugLog||[];this.debugLog=t;let n={table:e.tableName,aggregate:e.aggregate,metadata:e.metadata};if(e.pipeline&&(n.pipeline=e.pipeline),e.fields&&(Array.isArray(e.fields)?n.fields=e.fields:typeof e.fields=="string"&&(n.fields=e.fields.split(",").map(p=>p.trim()))),e.filter&&(B(e.filter,e.tableName,e.metadata),n.mongoRawFilter=e.filter),e.sort){let p=Array.isArray(e.sort)?e.sort:e.sort.split(",").map(d=>d.trim());n.sort=p.map(d=>{let g=d.trim();return g.startsWith("-")?{field:g.substring(1),direction:"desc"}:{field:g,direction:"asc"}})}else n.sort=[{field:"id",direction:"asc"}];if(e.page&&e.limit){let p=typeof e.page=="string"?parseInt(e.page,10):e.page,d=typeof e.limit=="string"?parseInt(e.limit,10):e.limit;n.offset=(p-1)*d,n.limit=d}else e.limit&&(n.limit=typeof e.limit=="string"?parseInt(e.limit,10):e.limit);let o=Array.isArray(e.meta)?e.meta:(e.meta||"").split(",").map(p=>p.trim()).filter(Boolean),i=0,s=0;(o.includes("totalCount")||o.includes("*"))&&(i=await this.mongoService.collection(e.tableName).countDocuments({}));let a=this.metadata?.tables?.get(e.tableName),f=new Set((a?.relations??[]).map(p=>p.propertyName)),l=!!n.mongoRawFilter&&se(n.mongoRawFilter,f);if((o.includes("filterCount")||o.includes("*"))&&!l){let p=this.mongoService.collection(e.tableName),d=e.plan?.filterTree?Ke(e.plan.filterTree,{metadata:this.metadata,rootTable:e.tableName}):{};s=await p.countDocuments(d)}this.lastBuiltPipeline=null,n.plan=e.plan,n.deep=e.deep;let u=await this.selectLegacy(n);if(e.debugMode){let p=this.lastBuiltPipeline??[],d;try{d=await this.db.collection(e.tableName).aggregate(p).explain()}catch(g){d={error:String(g)}}return{pipeline:p,explain:d}}if(l&&(o.includes("filterCount")||o.includes("*"))){let p={...n,mongoCountOnly:!0},d=await this.selectLegacy(p);s=d.length>0?d[0].count:0}let c=await this.executeAggregate(n,e.filter);return{data:u,...(o.length>0||c)&&{meta:{...o.includes("totalCount")||o.includes("*")?{totalCount:i}:{},...o.includes("filterCount")||o.includes("*")?{filterCount:s}:{},...c?{aggregate:c}:{}}}}}async selectLegacy(e){let t=[];if(e.fields&&e.fields.length>0){let s=e.plan;if(s?.fieldTree?e.mongoFieldsExpanded=Or(s.fieldTree,this.metadata):(console.warn(`[mongo-executor:fallback] expandFieldsMongo path hit for table=${e.table} fields=${JSON.stringify(e.fields)}`),e.mongoFieldsExpanded=await Jt(this.metadata,e.table,e.fields)),this.mongoPhysicalMigrationService&&e.mongoFieldsExpanded){let a=await this.mongoPhysicalMigrationService.augmentScalarProjection(e.table,e.mongoFieldsExpanded.scalarFields);e.mongoFieldsExpanded={...e.mongoFieldsExpanded,scalarFields:a.scalarFields},t=a.hiddenFields}}e.where&&(e.where=e.where.map(s=>s.field.includes(".")?s:{...s,field:`${e.table}.${s.field}`}));let n=this.db.collection(e.table);if(e.pipeline)return this.debugLog&&this.debugLog.push({type:"MongoDB Custom Pipeline",collection:e.table,pipeline:JSON.parse(JSON.stringify(e.pipeline))}),(await n.aggregate(e.pipeline).toArray()).map(oe);let{results:o,pipeline:i}=await jn(n,e,{db:this.db,metadata:this.metadata,dbType:this.dbType,debugLog:this.debugLog,mongoPhysicalMigrationService:this.mongoPhysicalMigrationService});return this.lastBuiltPipeline=i,this.mongoPhysicalMigrationService?await this.mongoPhysicalMigrationService.applyReadFallback(e.table,o,t):o}async executeAggregationPipeline(e,t){let{results:n,pipeline:o}=await jn(e,t,{db:this.db,metadata:this.metadata,dbType:this.dbType,debugLog:this.debugLog,mongoPhysicalMigrationService:this.mongoPhysicalMigrationService});return this.lastBuiltPipeline=o,n}async executeAggregate(e,t){let n=rt(e.aggregate,e.table,e.metadata);if(n.length===0)return;let o={},i=this.db.collection(e.table);for(let s of n){let a=it(t,s);B(a,e.table,e.metadata);let l=new K().plan({tableName:e.table,filter:a,metadata:e.metadata,dbType:"mongodb"});if(s.op==="countRecords"){let p=await this.executeRelationCountRecords(e,t,s);Te(o,s,p);continue}let u=l.hasRelationFilters?await be(a,e.table,e.metadata,this.db):l.filterTree?Ke(l.filterTree,{metadata:e.metadata,rootTable:e.table}):{},c;if(s.op==="count")c=await i.countDocuments(u);else{let[{value:p}={value:null}]=await i.aggregate([{$match:u},{$group:{_id:null,value:{[`$${s.op}`]:`$${s.field}`}}}]).toArray();c=p??0}Te(o,s,c)}return o}async executeRelationCountRecords(e,t,n){let i=e.metadata?.tables?.get(e.table)?.relations?.find(u=>u.propertyName===n.field),s=i?.targetTableName||i?.targetTable,a=s?e.metadata?.tables?.get(s):null;if(!i||!s||!a)return 0;let f=await this.resolveMatchFilter(e.table,t,e.metadata),l=await this.resolveMatchFilter(s,n.condition,e.metadata);if(i.type==="one-to-many"){let c=(await this.db.collection(e.table).find(f,{projection:{_id:1}}).toArray()).map(p=>p._id).filter(p=>p!=null);return c.length===0?0:await this.db.collection(s).countDocuments({$and:[l,{[i.foreignKeyColumn]:{$in:c}}]})}if(i.type==="many-to-many"){let u=Ve(e.table,i);if(!u)return 0;let p=(await this.db.collection(e.table).find(f,{projection:{_id:1}}).toArray()).map(m=>m._id).filter(m=>m!=null);if(p.length===0)return 0;let g=(await this.db.collection(u.junctionName).find({[u.selfColumn]:{$in:p}},{projection:{[u.otherColumn]:1}}).toArray()).map(m=>m[u.otherColumn]).filter(m=>m!=null);return g.length===0?0:await this.db.collection(s).countDocuments({$and:[l,{_id:{$in:g}}]})}if(i.type==="many-to-one"||i.type==="one-to-one"){let u=i.foreignKeyColumn||`${n.field}Id`,p=(await this.db.collection(e.table).find(f,{projection:{[u]:1}}).toArray()).map(d=>d[u]).filter(d=>d!=null);return p.length===0?0:await this.db.collection(s).countDocuments({$and:[l,{_id:{$in:p}}]})}return 0}async resolveMatchFilter(e,t,n){if(!t||Object.keys(t).length===0)return{};B(t,e,n);let i=new K().plan({tableName:e,filter:t,metadata:n,dbType:"mongodb"});return i.hasRelationFilters?await be(t,e,n,this.db):i.filterTree?Ke(i.filterTree,{metadata:n,rootTable:e}):{}}};var ln=class{constructor(e){this.context=e}log(e){console.log(this.format(e))}warn(e){console.warn(this.format(e))}error(e,t){console.error(this.format(e)),t&&console.error(t)}debug(e){process.env.DEBUG&&console.debug(this.format(e))}verbose(e){process.env.DEBUG&&console.debug(this.format(e))}fatal(e,t){this.error(e,t)}format(e){let t=typeof e=="string"?e:JSON.stringify(e);return this.context?`[${this.context}] ${t}`:t}};var Zi=["_and","_or","_not"];function ce(r){if(!r||typeof r!="object")return!1;if(Array.isArray(r))return r.some(e=>ce(e));for(let e of Object.keys(r))if(Zi.includes(e)||typeof r[e]=="object"&&r[e]!==null&&ce(r[e]))return!0;return!1}var jr=["_eq","_neq","_gt","_gte","_lt","_lte","_in","_not_in","_nin","_contains","_starts_with","_ends_with","_between","_is_null","_is_not_null"];function eo(r){return{_eq:"=",_neq:"!=",_gt:">",_gte:">=",_lt:"<",_lte:"<=",_in:"in",_not_in:"not in"}[r]||r}function cn(r,e,t){if(!t)return!1;let n=r;if(r.includes(".")){let s=r.split(".");n=s[s.length-1]}let o=t.columns.find(s=>s.name===n);if(!o)return!1;let i=o.type?.toLowerCase()||"";return i==="uuid"||i==="uuidv4"||i.includes("uuid")}function to(r,e,t,n,o){return n!=="postgres"||typeof e!="string"||!/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(e)||cn(r,t,o),e}function Lr(r,e,t,n,o,i,s){let a=o&&!e.includes(".")?`${o}.${e}`:e,f=cn(e,o,s),l=to(e,n,o,i,s);switch(t){case"_eq":f&&i==="postgres"&&typeof n=="string"?r.whereRaw(`${a} = ?::uuid`,[n]):r.where(a,"=",l);break;case"_neq":f&&i==="postgres"&&typeof n=="string"?r.whereRaw(`${a} != ?::uuid`,[n]):r.where(a,"!=",l);break;case"_gt":f&&i==="postgres"&&typeof n=="string"?r.whereRaw(`${a} > ?::uuid`,[n]):r.where(a,">",l);break;case"_gte":f&&i==="postgres"&&typeof n=="string"?r.whereRaw(`${a} >= ?::uuid`,[n]):r.where(a,">=",l);break;case"_lt":f&&i==="postgres"&&typeof n=="string"?r.whereRaw(`${a} < ?::uuid`,[n]):r.where(a,"<",l);break;case"_lte":f&&i==="postgres"&&typeof n=="string"?r.whereRaw(`${a} <= ?::uuid`,[n]):r.where(a,"<=",l);break;case"_in":let u=n;Array.isArray(u)||(u=typeof u=="string"&&u.includes(",")?u.split(",").map(p=>p.trim()):[u]),f&&i==="postgres"&&u.every(p=>typeof p=="string")?r.whereRaw(`${a} = ANY(?::uuid[])`,[u]):r.whereIn(a,u);break;case"_not_in":case"_nin":let c=n;Array.isArray(c)||(c=typeof c=="string"&&c.includes(",")?c.split(",").map(p=>p.trim()):[c]),f&&i==="postgres"&&c.every(p=>typeof p=="string")?r.whereRaw(`${a} != ALL(?::uuid[])`,[c]):r.whereNotIn(a,c);break;case"_contains":i==="postgres"?r.whereRaw(`lower(unaccent(${a})) ILIKE '%' || lower(unaccent(?)) || '%'`,[n]):i==="sqlite"?r.whereRaw(`lower(${a}) LIKE '%' || lower(?) || '%'`,[n]):r.whereRaw(`lower(unaccent(${a})) COLLATE utf8mb4_general_ci LIKE CONCAT('%', lower(unaccent(?)) COLLATE utf8mb4_general_ci, '%')`,[n]);break;case"_starts_with":i==="postgres"?r.whereRaw(`lower(unaccent(${a})) ILIKE lower(unaccent(?)) || '%'`,[n]):i==="sqlite"?r.whereRaw(`lower(${a}) LIKE lower(?) || '%'`,[n]):r.whereRaw(`lower(unaccent(${a})) COLLATE utf8mb4_general_ci LIKE CONCAT(lower(unaccent(?)) COLLATE utf8mb4_general_ci, '%')`,[n]);break;case"_ends_with":i==="postgres"?r.whereRaw(`lower(unaccent(${a})) ILIKE '%' || lower(unaccent(?))`,[n]):i==="sqlite"?r.whereRaw(`lower(${a}) LIKE '%' || lower(?)`,[n]):r.whereRaw(`lower(unaccent(${a})) COLLATE utf8mb4_general_ci LIKE CONCAT('%', lower(unaccent(?)) COLLATE utf8mb4_general_ci)`,[n]);break;case"_between":Array.isArray(n)&&n.length===2&&r.whereBetween(a,[n[0],n[1]]);break;case"_is_null":n===!0?r.whereNull(a):r.whereNotNull(a);break;case"_is_not_null":n===!0?r.whereNotNull(a):r.whereNull(a);break;default:r.where(a,eo(t),n)}}function no(r,e,t){if(!t||!e||r.startsWith("_"))return!0;let n=r.includes(".")?r.split(".").pop():r,o=t.columns?.some(s=>s.name===n),i=t.relations?.some(s=>s.propertyName===n);return o||i}function st(r,e,t,n="and",o,i){if(!(!e||typeof e!="object")){if(Array.isArray(e)){for(let s of e)n==="and"?r.where(function(){st(this,s,t,"and",o,i)}):r.orWhere(function(){st(this,s,t,"and",o,i)});return}for(let[s,a]of Object.entries(e))if(no(s,t,i)){if(s==="_and"){Array.isArray(a)&&r.where(function(){for(let f of a)this.where(function(){st(this,f,t,"and",o,i)})});continue}if(s==="_or"){Array.isArray(a)&&r.where(function(){for(let f of a)this.orWhere(function(){st(this,f,t,"and",o,i)})});continue}if(s==="_not"){r.whereNot(function(){st(this,a,t,"and",o,i)});continue}if(typeof a=="object"&&a!==null)if(Object.keys(a).some(l=>jr.includes(l)))for(let[l,u]of Object.entries(a))jr.includes(l)&&(n==="and"?r.where(function(){Lr(this,s,l,u,t,o,i)}):r.orWhere(function(){Lr(this,s,l,u,t,o,i)}));else{let l=t&&!s.includes(".")?`${t}.${s}`:s;cn(s,t,i)&&o==="postgres"&&typeof a=="string"&&/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(a)?n==="and"?r.whereRaw(`${l} = ?::uuid`,[a]):r.orWhereRaw(`${l} = ?::uuid`,[a]):n==="and"?r.where(l,"=",a):r.orWhere(l,"=",a)}else{let f=t&&!s.includes(".")?`${t}.${s}`:s;cn(s,t,i)&&o==="postgres"&&typeof a=="string"&&/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(a)?n==="and"?r.whereRaw(`${f} = ?::uuid`,[a]):r.orWhereRaw(`${f} = ?::uuid`,[a]):n==="and"?r.where(f,"=",a):r.orWhere(f,"=",a)}}}}function ne(r,e,t,n,o){return!e||typeof e!="object"||st(r,e,t,"and",n,o),r}$e();function Kn(r,e,t){return`${N(r,t)}.${N(e,t)}`}function ke(r,e){return r==null?"NULL":typeof r=="string"?`'${r.replace(/'/g,"''")}'`:typeof r=="boolean"?r?"true":"false":typeof r=="number"?String(r):`'${String(r).replace(/'/g,"''")}'`}function Dr(r,e){if(!e)return!1;let t=e.columns.find(o=>o.name===r);if(!t)return!1;let n=t.type?.toLowerCase()||"";return n==="uuid"||n==="uuidv4"||n.includes("uuid")}function at(r){return r===!0||r==="true"?!0:r===!1||r==="false"?!1:null}async function Wn(r,e,t,n,o,i){let s=[];for(let[a,f]of Object.entries(i)){let l=await Mt(r,e,a,f,t,n,o);if(l!==null)s.push(`EXISTS (${l})`);else{let u=t.relations.find(c=>c.propertyName===a);if(u&&u.foreignKeyColumn){let c=Kn(e,u.foreignKeyColumn,n),d=f.id;if(d&&typeof d=="object"){let g=at(d._is_null),m=at(d._is_not_null);if(g===!0)s.push(`${c} IS NULL`);else if(g===!1)s.push(`${c} IS NOT NULL`);else if(m===!0)s.push(`${c} IS NOT NULL`);else if(m===!1)s.push(`${c} IS NULL`);else if(d._eq!==void 0){let y=ke(d._eq,n);s.push(`${c} = ${y}`)}else if(d._neq!==void 0){let y=ke(d._neq,n);s.push(`${c} != ${y}`)}else if(d._in!==void 0){let b=(Array.isArray(d._in)?d._in:[d._in]).map(_=>ke(_,n)).join(", ");s.push(`${c} IN (${b})`)}else if(d._not_in!==void 0||d._nin!==void 0){let y=d._not_in??d._nin,_=(Array.isArray(y)?y:[y]).map(w=>ke(w,n)).join(", ");s.push(`${c} NOT IN (${_})`)}else if(d._gt!==void 0){let y=ke(d._gt,n);s.push(`${c} > ${y}`)}else if(d._gte!==void 0){let y=ke(d._gte,n);s.push(`${c} >= ${y}`)}else if(d._lt!==void 0){let y=ke(d._lt,n);s.push(`${c} < ${y}`)}else if(d._lte!==void 0){let y=ke(d._lte,n);s.push(`${c} <= ${y}`)}}}}}return s}function Un(r){return!r||typeof r!="object"||Array.isArray(r)?!1:!!(r._and&&Array.isArray(r._and)||r._or&&Array.isArray(r._or)||r._not!==void 0&&r._not!==null)}async function Dn(r,e,t,n,o,i){let s=[];for(let a of r)if(a._and&&Array.isArray(a._and)&&a._and.length>0){let f=[];for(let l of a._and)if(Un(l)){let u=e(t).select(`${t}.id`);await We(e,u,l,t,n,o,i),f.push({idSubquery:u})}else{let{fieldFilters:u,relationFilters:c}=V(l,n),p=await Wn(e,t,n,o,i,c);f.push({fieldFilters:u,subqueries:p})}s.push(f)}else if(Un(a)){let f=e(t).select(`${t}.id`);await We(e,f,a,t,n,o,i),s.push([{idSubquery:f}])}else{let{fieldFilters:f,relationFilters:l}=V(a,n),u=await Wn(e,t,n,o,i,l);s.push([{fieldFilters:f,subqueries:u}])}return s}function Br(r,e,t,n,o){if("idSubquery"in e&&e.idSubquery){r.whereIn(`${t}.id`,e.idSubquery);return}let i=e;Object.keys(i.fieldFilters).length===0&&i.subqueries.length===0||r.where(function(){Object.keys(i.fieldFilters).length>0&&ne(this,i.fieldFilters,t,o,n);for(let s of i.subqueries)this.whereRaw(s)})}function Bn(r,e,t,n,o){let i=!0;for(let s of e){let a=function(){for(let f of s)Br(this,f,t,n,o)};i?(r.where(a),i=!1):r.orWhere(a)}}function un(r,e,t,n,o,i,s){let a=Dr(e,o),f=Dr(n,i),l=`${N(r,s)}.${N(e,s)}`,u=`${N(t,s)}.${N(n,s)}`;if(s==="postgres"){if(a&&!f)return`${l} = ${u}::uuid`;if(!a&&f)return`${l}::uuid = ${u}`}return`${l} = ${u}`}async function Mt(r,e,t,n,o,i,s){let a=o.relations.find(p=>p.propertyName===t);if(!a)throw new Error(`Relation "${t}" not found in table "${e}"`);let f=a.targetTableName||a.targetTable;if(!f)throw new Error(`Relation "${t}" in table "${e}" is missing targetTable/targetTableName. Relation metadata: ${JSON.stringify(a,null,2)}`);let l=new Set(["_is_null","_is_not_null","_eq","_neq","_in","_not_in","_nin","_gt","_gte","_lt","_lte"]);if((a.type==="many-to-one"||a.type==="one-to-one")&&a.foreignKeyColumn){let p=Object.keys(n||{});if(p.length===1&&p[0]==="id"&&typeof n.id=="object"&&Object.keys(n.id).every(g=>l.has(g)))return null}let u=s?await s(f):null,c;switch(a.type){case"one-to-many":c=r(f).select(r.raw("1")).whereRaw(un(f,a.foreignKeyColumn,e,"id",u,o,i));break;case"many-to-many":let p=s?await s(a.junctionTableName):null;c=r(a.junctionTableName).select(r.raw("1")).join(f,r.raw(un(a.junctionTableName,a.junctionTargetColumn,f,"id",p,u,i))).whereRaw(un(a.junctionTableName,a.junctionSourceColumn,e,"id",p,o,i));break;case"many-to-one":case"one-to-one":c=r(f).select(r.raw("1")).whereRaw(un(f,"id",e,a.foreignKeyColumn,u,o,i));break;default:throw new Error(`Unsupported relation type: ${a.type}`)}return s?u?await We(r,c,n,f,u,i,s):c=ne(c,n,f,i,u||void 0):c=ne(c,n,f,i),c.toString()}async function We(r,e,t,n,o,i,s){if(!t||typeof t!="object")return;if(t._and&&Array.isArray(t._and)){for(let l of t._and)if(l._or&&Array.isArray(l._or)&&l._or.length>0){let u=await Dn(l._or,r,n,o,i,s);e.where(function(){Bn(this,u,n,o,i)})}else if(l._and&&Array.isArray(l._and)&&l._and.length>0)for(let u of l._and)await We(r,e,u,n,o,i,s);else await We(r,e,l,n,o,i,s);return}if(t._or&&Array.isArray(t._or)){let l=await Dn(t._or,r,n,o,i,s);e.where(function(){Bn(this,l,n,o,i)});return}if(t._not){let l=t._not;if(l._and&&Array.isArray(l._and)&&l._and.length>0){let p=[];for(let d of l._and)if(Un(d)){let g=r(n).select(`${n}.id`);await We(r,g,d,n,o,i,s),p.push({idSubquery:g})}else{let{fieldFilters:g,relationFilters:m}=V(d,o),y=await Wn(r,n,o,i,s,m);p.push({fieldFilters:g,subqueries:y})}e.whereNot(function(){for(let d of p)Br(this,d,n,o,i)});return}if(l._or&&Array.isArray(l._or)&&l._or.length>0){let p=await Dn(l._or,r,n,o,i,s);e.whereNot(function(){Bn(this,p,n,o,i)});return}let{fieldFilters:u,relationFilters:c}=V(l,o);e.whereNot(function(){Object.keys(u).length>0&&ne(this,u,n,i,o)});for(let[p,d]of Object.entries(c)){let g=await Mt(r,n,p,d,o,i,s);if(g===null){let m=o.relations.find(y=>y.propertyName===p);if(m&&m.foreignKeyColumn){let y=Kn(n,m.foreignKeyColumn,i),_=d.id;if(_&&typeof _=="object"){let w=at(_._is_null),$=at(_._is_not_null);if(w===!0)e.whereRaw(`${y} IS NOT NULL`);else if(w===!1)e.whereRaw(`${y} IS NULL`);else if($===!0)e.whereRaw(`${y} IS NULL`);else if($===!1)e.whereRaw(`${y} IS NOT NULL`);else if(_._eq!==void 0)e.whereRaw(`${y} != ?`,[_._eq]);else if(_._neq!==void 0)e.whereRaw(`${y} = ?`,[_._neq]);else if(_._in!==void 0){let h=Array.isArray(_._in)?_._in:[_._in];e.whereRaw(`${y} NOT IN (${h.map(()=>"?").join(", ")})`,h)}else if(_._not_in!==void 0||_._nin!==void 0){let h=_._not_in??_._nin,k=Array.isArray(h)?h:[h];e.whereRaw(`${y} IN (${k.map(()=>"?").join(", ")})`,k)}}}}else e.whereRaw(`NOT EXISTS (${g})`)}return}let{fieldFilters:a,relationFilters:f}=V(t,o);Object.keys(a).length>0&&ne(e,a,n,i,o);for(let[l,u]of Object.entries(f)){let c=await Mt(r,n,l,u,o,i,s);if(c===null){let p=o.relations.find(d=>d.propertyName===l);if(p&&p.foreignKeyColumn){let d=Kn(n,p.foreignKeyColumn,i),m=u.id;if(m&&typeof m=="object"){let y=at(m._is_null),b=at(m._is_not_null);if(y===!0)e.whereRaw(`${d} IS NULL`);else if(y===!1)e.whereRaw(`${d} IS NOT NULL`);else if(b===!0)e.whereRaw(`${d} IS NOT NULL`);else if(b===!1)e.whereRaw(`${d} IS NULL`);else if(m._eq!==void 0)e.whereRaw(`${d} = ?`,[m._eq]);else if(m._neq!==void 0)e.whereRaw(`${d} != ?`,[m._neq]);else if(m._in!==void 0){let _=Array.isArray(m._in)?m._in:[m._in];e.whereRaw(`${d} IN (${_.map(()=>"?").join(", ")})`,_)}else if(m._not_in!==void 0||m._nin!==void 0){let _=m._not_in??m._nin,w=Array.isArray(_)?_:[_];e.whereRaw(`${d} NOT IN (${w.map(()=>"?").join(", ")})`,w)}}}}else e.whereRaw(`EXISTS (${c})`)}}async function Ue(r,e,t,n,o,i,s){await We(r,e,t,n,o,i,s)}$e();Jn();Ye();Le();$e();function lt(r,e,t,n,o){for(let i of e){let s=i.field.split("."),a=t||s[0],f=s[s.length-1],l=Et(n,a,f,i.value);switch(i.operator){case"=":r=r.where(i.field,"=",l);break;case"!=":r=r.where(i.field,"!=",l);break;case">":r=r.where(i.field,">",l);break;case"<":r=r.where(i.field,"<",l);break;case">=":r=r.where(i.field,">=",l);break;case"<=":r=r.where(i.field,"<=",l);break;case"like":r=r.where(i.field,"like",l);break;case"in":let u=Array.isArray(i.value)?i.value.map(m=>Et(n,a,f,m)):[l];r=r.whereIn(i.field,u);break;case"not in":let c=Array.isArray(i.value)?i.value.map(m=>Et(n,a,f,m)):[l];r=r.whereNotIn(i.field,c);break;case"is null":r=r.whereNull(i.field);break;case"is not null":r=r.whereNotNull(i.field);break;case"_contains":r=r.where(i.field,"like",`%${i.value}%`);break;case"_starts_with":r=r.where(i.field,"like",`${i.value}%`);break;case"_ends_with":r=r.where(i.field,"like",`%${i.value}`);break;case"_between":let p=i.value;if(typeof p=="string"&&(p=p.split(",").map(m=>m.trim())),Array.isArray(p)&&p.length===2){let m=Et(n,a,f,p[0]),y=Et(n,a,f,p[1]);r=r.whereBetween(i.field,[m,y])}break;case"_is_null":r=l===!0||l==="true"?r.whereNull(i.field):r.whereNotNull(i.field);break;case"_is_not_null":r=l===!0||l==="true"?r.whereNotNull(i.field):r.whereNull(i.field);break}}return r}function Pt(r,e,t,n){let o=[],i=t;if(!r||typeof r!="object")return o;for(let[s,a]of Object.entries(r))if(s==="_and"&&Array.isArray(a)){let f=a.map(l=>{let u=Pt(l,e,t,n);return u.length>0?`(${u.join(" AND ")})`:null}).filter(l=>l!==null);f.length>0&&o.push(`(${f.join(" AND ")})`)}else if(s==="_or"&&Array.isArray(a)){let f=a.map(l=>{let u=Pt(l,e,t,n);return u.length>0?`(${u.join(" AND ")})`:null}).filter(l=>l!==null);f.length>0&&o.push(`(${f.join(" OR ")})`)}else if(s==="_not"&&typeof a=="object"&&a!==null){let f=Pt(a,e,t,n);f.length>0&&o.push(`NOT (${f.join(" AND ")})`)}else if(typeof a=="object"&&a!==null&&!Array.isArray(a))for(let[f,l]of Object.entries(a)){let u=`${N(e,n)}.${N(s,n)}`,c;if(l===null)c="NULL";else if(typeof l=="string"){let p=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,d=i.columns?.find(m=>m.name===s);d&&(d.type?.toLowerCase()==="uuid"||d.type?.toLowerCase().includes("uuid"))&&p.test(l)&&n==="postgres"?c=`'${l}'::uuid`:c=`'${l.replace(/'/g,"''")}'`}else typeof l=="boolean"?c=l?"true":"false":typeof l=="number"?c=String(l):c=`'${String(l).replace(/'/g,"''")}'`;if(f==="_eq")o.push(`${u} = ${c}`);else if(f==="_neq")o.push(`${u} != ${c}`);else if(f==="_gt")o.push(`${u} > ${c}`);else if(f==="_gte")o.push(`${u} >= ${c}`);else if(f==="_lt")o.push(`${u} < ${c}`);else if(f==="_lte")o.push(`${u} <= ${c}`);else if(f==="_is_null")o.push(`${u} IS NULL`);else if(f==="_is_not_null")o.push(`${u} IS NOT NULL`);else if(f==="_in"){let d=(Array.isArray(l)?l:[l]).map(g=>typeof g=="string"?`'${g.replace(/'/g,"''")}'`:String(g)).join(", ");o.push(`${u} IN (${d})`)}else if(f==="_not_in"||f==="_nin"){let d=(Array.isArray(l)?l:[l]).map(g=>typeof g=="string"?`'${g.replace(/'/g,"''")}'`:String(g)).join(", ");o.push(`${u} NOT IN (${d})`)}else if(f==="_contains"){let p=String(l).replace(/'/g,"''");n==="postgres"?o.push(`lower(unaccent(${u})) ILIKE '%' || lower(unaccent('${p}')) || '%'`):n==="mysql"?o.push(`lower(unaccent(${u})) COLLATE utf8mb4_general_ci LIKE CONCAT('%', lower(unaccent('${p}')) COLLATE utf8mb4_general_ci, '%')`):o.push(`lower(${u}) LIKE '%${p.toLowerCase()}%'`)}else if(f==="_starts_with"){let p=String(l).replace(/'/g,"''");n==="postgres"?o.push(`lower(unaccent(${u})) ILIKE lower(unaccent('${p}')) || '%'`):n==="mysql"?o.push(`lower(unaccent(${u})) COLLATE utf8mb4_general_ci LIKE CONCAT(lower(unaccent('${p}')) COLLATE utf8mb4_general_ci, '%')`):o.push(`lower(${u}) LIKE '${p.toLowerCase()}%'`)}else if(f==="_ends_with"){let p=String(l).replace(/'/g,"''");n==="postgres"?o.push(`lower(unaccent(${u})) ILIKE '%' || lower(unaccent('${p}'))`):n==="mysql"?o.push(`lower(unaccent(${u})) COLLATE utf8mb4_general_ci LIKE CONCAT('%', lower(unaccent('${p}')) COLLATE utf8mb4_general_ci)`):o.push(`lower(${u}) LIKE '%${p.toLowerCase()}'`)}else if(f==="_between"&&Array.isArray(l)&&l.length===2){let p=typeof l[0]=="string"?`'${l[0].replace(/'/g,"''")}'`:String(l[0]),d=typeof l[1]=="string"?`'${l[1].replace(/'/g,"''")}'`:String(l[1]);o.push(`${u} BETWEEN ${p} AND ${d}`)}}else{let f=`${N(e,n)}.${N(s,n)}`,l;a===null?l="NULL":typeof a=="string"?l=`'${a.replace(/'/g,"''")}'`:typeof a=="boolean"?l=a?"true":"false":l=String(a),o.push(`${f} = ${l}`)}return o}function Wr(r){return r==null?"NULL":typeof r=="string"?`'${r.replace(/'/g,"''")}'`:typeof r=="boolean"?r?"true":"false":typeof r=="number"?String(r):`'${String(r).replace(/'/g,"''")}'`}function Et(r,e,t,n){if(n==null)return n;let o=r?.tables?.get(e);if(!o?.columns)return n;let i=o.columns.find(s=>s.name===t);if(!i)return n;switch(i.type){case"int":case"integer":case"bigint":case"smallint":case"tinyint":return typeof n=="string"?parseInt(n,10):Number(n);case"float":case"double":case"decimal":case"numeric":case"real":return typeof n=="string"?parseFloat(n):Number(n);case"boolean":case"bool":return typeof n=="string"?n==="true"||n==="1":!!n;case"date":case"datetime":case"timestamp":return typeof n=="string"?new Date(n):n;default:return n}}$e();dn();Le();async function Qr(r,e,t,n,o,i,s){if(!n)return{select:t};try{let{expandFieldsToJoinsAndSelect:a}=await Promise.resolve().then(()=>(Vn(),Ur)),f=await a(e,t,n,o,i,s);return{select:f.select,batchFetchDescriptors:f.batchFetchDescriptors}}catch{return{select:t}}}function Hn(r){let e=r;return e?async t=>{let n=e.tables?.get(t);return n?{name:n.name,columns:(n.columns||[]).map(o=>({name:o.name,type:o.type})),relations:n.relations||[]}:null}:null}function Jr(r,e,t,n,o){let i=r.targetTableName||r.targetTable;if(!i)return null;let s=r.foreignKeyColumn||L(i);if(!s)return null;let a=c=>N(c,o),f=n?.tables?.get(i),u=(f?ue(f):null)?.name||"id";return`(SELECT ${a(i)}.${a(e)} FROM ${a(i)} WHERE ${a(i)}.${a(u)} = ${a(t)}.${a(s)})`}var ut=class r{constructor(e,t,n,o){this.knex=e;this.dbType=t;this.knexService=n;this.maxQueryDepth=o;this.logger=new ln(r.name);this.debugLog=[]}async execute(e){let t=performance.now();this.metadata=e.metadata;let n=e.debugLog||[];this.debugLog=n;let o=e.debugTrace;if(e.filter&&B(e.filter,e.tableName,e.metadata),!e.plan){let T=new K;e={...e,plan:T.plan({tableName:e.tableName,fields:e.fields,filter:e.filter,sort:e.sort,page:e.page,limit:e.limit,meta:e.meta,metadata:e.metadata,dbType:this.dbType})}}let i=e.plan,s=e.metadata?.tables?.get(e.tableName),a=s?.relations&&s.relations.length>0,f=e.deep&&typeof e.deep=="object"&&Object.keys(e.deep).length>0,l=i.rawFields&&i.rawFields.length>0&&!i.rawFields.includes("*");if(i.joins.length===0&&!i.hasRelationFilters&&!i.hasRelationSort&&!f&&!a&&l){o&&o.setQueryPath("simple");let T=await this.executeSimple(e,i);return o&&o.dur("sql_executor",t,{table:e.tableName}),T}let c={table:e.tableName,aggregate:e.aggregate,metadata:e.metadata};e.fields&&(Array.isArray(e.fields)?c.fields=e.fields:typeof e.fields=="string"&&(c.fields=e.fields.split(",").map(T=>T.trim())));let p=e.filter;if(e.filter&&!ce(e.filter)){c.where=[];for(let[T,x]of Object.entries(e.filter))if(typeof x=="object"&&x!==null)for(let[C,xe]of Object.entries(x)){let v;if(C==="_eq")v="=";else if(C==="_neq")v="!=";else if(C==="_in")v="in";else if(C==="_not_in"||C==="_nin")v="not in";else if(C==="_gt")v=">";else if(C==="_gte")v=">=";else if(C==="_lt")v="<";else if(C==="_lte")v="<=";else if(C==="_contains")v="_contains";else if(C==="_starts_with")v="_starts_with";else if(C==="_ends_with")v="_ends_with";else if(C==="_between")v="_between";else if(C==="_is_null")v="_is_null";else if(C==="_is_not_null")v="_is_not_null";else if(C==="_like")v="like";else if(C==="_ilike")v="ilike";else continue;c.where.push({field:T,operator:v,value:xe})}else c.where.push({field:T,operator:"=",value:x})}if(e.sort){let T=Array.isArray(e.sort)?e.sort:e.sort.split(",").map(x=>x.trim());c.sort=T.map(x=>{let C=x.trim();return C.startsWith("-")?{field:C.substring(1),direction:"desc"}:{field:C,direction:"asc"}})}else c.sort=[{field:"id",direction:"asc"}];let d=e.limit===void 0||e.limit===null?void 0:typeof e.limit=="string"?parseInt(e.limit,10):e.limit,g=d===void 0||Number.isNaN(d)?void 0:d<0?0:d,m=e.page===void 0||e.page===null?void 0:typeof e.page=="string"?parseInt(e.page,10):e.page,y=m===void 0||Number.isNaN(m)?void 0:m;y&&g!==void 0?(c.offset=(y-1)*g,c.limit=g):g!==void 0&&(c.limit=g);let b=e.plan?.sortItems??(c.sort??[]).map(T=>({joinId:null,field:T.field,direction:T.direction,fullPath:T.field})),_=[],w=[];for(let T of b)if(T.joinId===null){if(T.field.includes(".")&&!e.plan){let x=T.field.split(".")[0];if(this.metadata?.tables?.get(c.table)?.relations?.some(v=>v.propertyName===x))continue}_.push({field:T.field.includes(".")?T.field:`${c.table}.${T.field}`,direction:T.direction})}else{let x=e.plan?.joins.find(C=>C.id===T.joinId);if(x&&(x.relationType==="many-to-one"||x.relationType==="one-to-one")){let C=Jr(x.relationMeta,T.field,c.table,this.metadata,this.dbType);C&&w.push({sql:C,direction:T.direction})}}let $=[];if(c.fields&&c.fields.length>0){let T=Hn(this.metadata),x=await Qr(this.knex,c.table,c.fields,T,this.dbType,this.maxQueryDepth,e.deep);c.select=[...c.select||[],...x.select],$=x.batchFetchDescriptors||[]}c.where&&(c.where=c.where.map(T=>T.field.includes(".")?T:{...T,field:`${c.table}.${T.field}`})),c.sort=_;let h=this.knex(c.table),k=Array.isArray(e.meta)?e.meta:(e.meta||"").split(",").map(T=>T.trim()).filter(Boolean),S=k.includes("filterCount")||k.includes("*"),R=k.includes("totalCount")||k.includes("*");if(c.select){let T=c.select.map(x=>typeof x=="string"&&x.trim().startsWith("(")?this.knex.raw(x):typeof x=="string"&&/ as /i.test(x)?this.knex.raw(x):x);h=h.select(T)}if(S&&h.select(this.knex.raw("COUNT(*) OVER() as __filter_count__")),R){let T=N(c.table,this.dbType);h.select(this.knex.raw(`(SELECT COUNT(*) FROM ${T}) as __total_count__`))}let F=["table_definition","column_definition","relation_definition","method_definition"].includes(c.table);if(p&&(ce(p)||Object.keys(p).length>0)){let T=this.metadata?.tables?.get(c.table);(!F&&T&&T.relations&&T.relations.length>0?V(p,T).hasRelations:!1)?await Ue(this.knex,h,p,c.table,T,this.dbType,C=>this.metadata?.tables?.get(C)):e.plan?.filterTree?q(h,e.plan.filterTree,{dbType:this.dbType,rootTable:c.table}):(this.logger.debug(`buildWhereClause fallback for table=${c.table}`),h=ne(h,p,c.table,this.dbType,T))}else c.where&&c.where.length>0&&(h=lt(h,c.where,c.table,this.metadata,this.dbType));if(c.sort)for(let T of c.sort){let x=T.field.includes(".")?T.field:`${c.table}.${T.field}`;h=h.orderBy(x,T.direction)}for(let T of w)h=h.orderByRaw(`${T.sql} ${T.direction.toUpperCase()}`);c.groupBy&&(h=h.groupBy(c.groupBy)),c.offset&&(h=h.offset(c.offset)),c.limit!==void 0&&c.limit!==null&&c.limit>0&&(h=h.limit(c.limit));let Z=0;this.debugLog&&this.debugLog.push({type:"SQL Query",table:c.table,sql:h.toSQL().toNative()});let A;if(e.debugMode&&(A=h.toSQL().toNative().sql),e.debugMode&&o){let T=h.toSQL().toNative();o.setSql(T.sql);try{let x=T.sql.replace(/\$\d+/g,"?"),C=await this.knex.raw(`EXPLAIN ${x}`,T.bindings);o.setExplain(this.dbType==="postgres"?C.rows:C[0])}catch(x){o.setExplain({error:String(x)})}}let O,j=performance.now();O=await h,o&&o.dur("db_execute",j,{table:e.tableName});let W=0;if(S&&O.length>0&&(W=Number(O[0].__filter_count__||0),O.forEach(T=>{delete T.__filter_count__})),R&&O.length>0&&O[0].__total_count__!==void 0&&(Z=Number(O[0].__total_count__||0),O.forEach(T=>{delete T.__total_count__})),$&&$.length>0&&O.length>0){let T=Hn(this.metadata);if(T){let{executeBatchFetches:x}=await Promise.resolve().then(()=>(Yn(),zr));await x(this.knex,O,$,T,this.maxQueryDepth??3,0,c.table,this.dbType,this.metadata,o)}}if(this.knexService){let T=performance.now();O=await this.knexService.parseResult(O,c.table),o&&o.dur("db_parseResult",T,{table:e.tableName})}else{let T=(x,C)=>{if(!x||!this.metadata)return x;let xe=this.metadata.tables?.get(C);if(!xe)return x;if(Array.isArray(x))return x.map(J=>T(J,C));if(typeof x!="object"||Buffer.isBuffer(x))return x;let v={...x};for(let J of xe.columns)if(J.type==="simple-json"&&v[J.name]&&typeof v[J.name]=="string")try{v[J.name]=JSON.parse(v[J.name])}catch{}for(let[J,z]of Object.entries(v))if(z&&typeof z=="object"&&!Array.isArray(z)&&!Buffer.isBuffer(z)){let yn=z;if(yn.id!==void 0||yn.createdAt!==void 0){let pt=xe.relations?.find(gt=>gt.propertyName===J);pt&&(v[J]=T(z,pt.targetTableName))}}else if(Array.isArray(z)&&z.length>0&&typeof z[0]=="object"&&z[0].id!==void 0){let pt=xe.relations?.find(gt=>gt.propertyName===J);pt&&(v[J]=z.map(gt=>T(gt,pt.targetTableName)))}return v};O=T(O,c.table)}o&&(o.setQueryPath("full"),o.dur("sql_executor",t,{table:e.tableName}));let Se=await this.executeAggregate(c,p);return{data:O,...(k.length>0||Se)&&{meta:{...k.includes("totalCount")||k.includes("*")?{totalCount:Z}:{},...k.includes("filterCount")||k.includes("*")?{filterCount:W}:{},...Se?{aggregate:Se}:{}}},...A!==void 0&&{sql:A}}}async executeSimple(e,t){let n=e.tableName,o=t.rawFields&&t.rawFields.length>0?t.rawFields:["*"],i=this.knex(n).select(o);t.filterTree&&q(i,t.filterTree,{dbType:this.dbType,rootTable:n});for(let y of t.sortItems){let b=y.field.includes(".")?y.field:`${n}.${y.field}`;i=i.orderBy(b,y.direction)}t.limit!==void 0&&t.limit!==null&&t.limit>0&&(i=i.limit(t.limit)),t.offset!==void 0&&(i=i.offset(t.offset));let s=Array.isArray(e.meta)?e.meta:(e.meta||"").split(",").map(y=>y.trim()).filter(Boolean),a=s.includes("filterCount")||s.includes("*"),f=s.includes("totalCount")||s.includes("*");if(a&&i.select(this.knex.raw("COUNT(*) OVER() as __filter_count__")),f){let y=N(n,this.dbType);i.select(this.knex.raw(`(SELECT COUNT(*) FROM ${y}) as __total_count__`))}let l=e.debugTrace,u;if(e.debugMode){let y=i.toSQL().toNative();if(u=y.sql,l){l.setSql(y.sql);try{let b=y.sql.replace(/\$\d+/g,"?"),_=await this.knex.raw(`EXPLAIN ${b}`,y.bindings);l.setExplain(this.dbType==="postgres"?_.rows:_[0])}catch(b){l.setExplain({error:String(b)})}}}let c=performance.now(),p;p=await i,l&&l.dur("db_execute",c,{table:n}),this.knexService&&(p=await this.knexService.parseResult(p,n));let d=0,g=0;a&&p.length>0&&(d=Number(p[0].__filter_count__||0),p.forEach(y=>delete y.__filter_count__)),f&&p.length>0&&(g=Number(p[0].__total_count__||0),p.forEach(y=>delete y.__total_count__));let m=await this.executeAggregate({table:n,aggregate:e.aggregate,metadata:e.metadata},e.filter);return{data:p,...(s.length>0||m)&&{meta:{...f?{totalCount:g}:{},...a?{filterCount:d}:{},...m?{aggregate:m}:{}}},...u!==void 0&&{sql:u}}}async executeAggregate(e,t){let n=rt(e.aggregate,e.table,e.metadata);if(n.length===0)return;let o={};for(let i of n){let s=it(t,i);B(s,e.table,e.metadata);let f=new K().plan({tableName:e.table,filter:s,metadata:e.metadata,dbType:this.dbType});if(i.op==="countRecords"){let d=await this.executeRelationCountRecords(e,t,i);Te(o,i,d);continue}let l=this.knex(e.table);if(f.hasRelationFilters){let d=e.metadata?.tables?.get(e.table);await Ue(this.knex,l,s,e.table,d,this.dbType,g=>e.metadata?.tables?.get(g))}else f.filterTree&&q(l,f.filterTree,{dbType:this.dbType,rootTable:e.table});let u=`${N(e.table,this.dbType)}.${N(i.field,this.dbType)}`,c=i.op==="count"?this.knex.raw("COUNT(*) as value"):this.knex.raw(`${i.op.toUpperCase()}(${u}) as value`),p=await l.clearSelect().select(c).first();Te(o,i,p?.value??0)}return o}async executeRelationCountRecords(e,t,n){let o=e.metadata?.tables?.get(e.table),i=o?.relations?.find(c=>c.propertyName===n.field),s=i?.targetTableName||i?.targetTable,a=s?e.metadata?.tables?.get(s):null;if(!i||!s||!a)return 0;let f=this.knex(e.table).select(`${e.table}.id`);if(t&&Object.keys(t).length>0){let p=new K().plan({tableName:e.table,filter:t,metadata:e.metadata,dbType:this.dbType});p.hasRelationFilters?await Ue(this.knex,f,t,e.table,o,this.dbType,d=>e.metadata?.tables?.get(d)):p.filterTree&&q(f,p.filterTree,{dbType:this.dbType,rootTable:e.table})}let l=this.knex(s).count("* as value");if(n.condition&&Object.keys(n.condition).length>0){B(n.condition,s,e.metadata);let p=new K().plan({tableName:s,filter:n.condition,metadata:e.metadata,dbType:this.dbType});p.hasRelationFilters?await Ue(this.knex,l,n.condition,s,a,this.dbType,d=>e.metadata?.tables?.get(d)):p.filterTree&&q(l,p.filterTree,{dbType:this.dbType,rootTable:s})}if(i.type==="one-to-many")l.whereIn(`${s}.${i.foreignKeyColumn}`,f);else if(i.type==="many-to-many"){let c=i.junctionTableName||Pe(e.table,i.propertyName,s),p=je(e.table,i.propertyName,s),d=i.junctionSourceColumn||p.sourceColumn,g=i.junctionTargetColumn||p.targetColumn;l.whereIn(`${s}.id`,this.knex(c).select(`${c}.${g}`).whereIn(`${c}.${d}`,f))}else(i.type==="many-to-one"||i.type==="one-to-one")&&l.whereIn(`${s}.id`,function(){this.select(`${e.table}.${i.foreignKeyColumn}`).from(e.table),t&&Object.keys(t).length>0&&this.whereIn(`${e.table}.id`,f),this.whereNotNull(`${e.table}.${i.foreignKeyColumn}`)});let u=await l.first();return Number(u?.value??0)}};var pn=require("mongodb"),ft=class{constructor(e){this.debugLog=[];this.knexService=e.knexService,this.mongoService=e.mongoService,this.databaseConfigService=e.databaseConfigService,this.runtimeMetricsCollectorService=e.runtimeMetricsCollectorService,this.lazyRef=e.lazyRef,this.dbType=this.databaseConfigService.getDbType()}async runWithPolicy(e,t){return this.knexService?this.knexService.runWithPolicy(e,t):this.mongoService?this.mongoService.runWithPolicy(e,t):t()}async runWithFieldPermissionCheck(e,t){return this.knexService?this.knexService.runWithFieldPermissionCheck(e,t):this.mongoService?this.mongoService.runWithFieldPermissionCheck(e,t):t()}async runWithTelemetryContext(e,t){return this.runtimeMetricsCollectorService?await this.runtimeMetricsCollectorService.runWithQueryContext(e,t):await t()}getDbType(){return this.dbType}safeObjectId(e){if(!pn.ObjectId)return e;if(typeof e=="string")try{return new pn.ObjectId(e)}catch{return e}return e}async getMetadataForQuery(){let e={tables:new Map,tablesList:[]},t=this.lazyRef.metadataCacheService;return t?t.isLoaded?.()?await t.getMetadata?.()??e:t.getDirectMetadata?.()??e:e}async buildMongoFilter(e,t){let n=await this.getMetadataForQuery(),o=Ge(n,e,t,this.dbType);return o._id!==void 0&&(o._id=this.safeObjectId(o._id)),o}async applyWhereToKnex(e,t,n){let o=await this.getMetadataForQuery();return{query:lt(e,t,n??"",o,this.dbType)}}async insertWithOptions(e){if(this.dbType==="mongodb"){let t=this.mongoService.collection(e.table);if(Array.isArray(e.data)){let n=await Promise.all(e.data.map(s=>this.mongoService.processNestedRelations(e.table,s))),o=this.mongoService.applyTimestamps(n),i=await t.insertMany(o);return Object.values(i.insertedIds).map((s,a)=>({id:s.toString(),...o[a]}))}else return this.mongoService.insertOne(e.table,e.data)}if(Array.isArray(e.data)){let t=[];for(let n of e.data){let o=await this.knexService.insertWithCascade(e.table,n);t.push(o)}return t}else return await this.knexService.insertWithCascade(e.table,e.data)}async select(e){let t=performance.now(),n=await this.getMetadataForQuery(),o=performance.now(),s=new K().plan({tableName:e.tableName,fields:e.fields,filter:e.filter,sort:e.sort,page:e.page,limit:e.limit,meta:e.meta,metadata:n,dbType:this.dbType}),a=e.debugTrace;if(a&&(a.dur("qb_planner",o,{table:e.tableName}),a.setPlan(this.sanitizePlan(s))),this.dbType==="mongodb")return new ot(this.mongoService,this.lazyRef.mongoPhysicalMigrationService).execute({...e,metadata:n,dbType:this.dbType,plan:s,aggregate:e.aggregate});let l=await new ut(this.knexService.getKnex(),this.dbType,this.knexService,e.maxQueryDepth).execute({...e,metadata:n,plan:s});return a&&a.dur("qb_total_select",t,{table:e.tableName}),l}sanitizePlan(e){return{rawFields:e.rawFields,hasRelationFilters:e.hasRelationFilters,hasRelationSort:e.hasRelationSort,joins:e.joins?.length??0,sortItems:e.sortItems,limit:e.limit,offset:e.offset,page:e.page,isSimpleQuery:e.joins?.length===0&&!e.hasRelationFilters&&!e.hasRelationSort}}async updateWithOptions(e){if(this.dbType==="mongodb"){let i=await this.mongoService.processNestedRelations(e.table,e.data),s=this.mongoService.applyUpdateTimestamp(i),a=await this.buildMongoFilter(e.where,e.table),f=this.mongoService.collection(e.table);return await f.updateMany(a,{$set:s}),await f.find(a).toArray()}let t=this.knexService.getKnex(),n=t(e.table);e.where.length>0&&({query:n}=await this.applyWhereToKnex(n,e.where,e.table));let o=await n;for(let i of o)await this.knexService.updateWithCascade(e.table,i.id,e.data);if(e.returning){let i=t(e.table);return e.where.length>0&&await this.applyWhereToKnex(i,e.where,e.table),await i.select(e.returning)}return{affected:o.length}}async deleteWithOptions(e){if(this.dbType==="mongodb"){let o=await this.buildMongoFilter(e.where,e.table);return(await this.mongoService.collection(e.table).deleteMany(o)).deletedCount}let n=this.knexService.getKnex()(e.table);return e.where.length>0&&({query:n}=await this.applyWhereToKnex(n,e.where,e.table)),await n.delete()}async count(e){if(this.dbType==="mongodb"){let i=e.where?await this.buildMongoFilter(e.where,e.table):{};return this.mongoService.count(e.table,i)}let n=this.knexService.getKnex()(e.table);e.where&&e.where.length>0&&({query:n}=await this.applyWhereToKnex(n,e.where,e.table));let o=await n.count("* as count").first();return Number(o?.count||0)}whereToFilter(e){let t={},n=this.databaseConfigService.isMongoDb();for(let[o,i]of Object.entries(e))o==="id"||o==="_id"?n?t._id=this.normalizeWhereFilterValue("_id",i):t.id=this.normalizeWhereFilterValue("id",i):t[o]=this.normalizeWhereFilterValue(o,i);return t}normalizeWhereFilterValue(e,t){return this.isFilterOperatorObject(t)?this.databaseConfigService.isMongoDb()&&e==="_id"?this.normalizeMongoIdOperatorValue(t):t:{_eq:this.databaseConfigService.isMongoDb()&&e==="_id"?this.safeObjectId(t):t}}isFilterOperatorObject(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)&&!(e instanceof pn.ObjectId)&&Object.keys(e).length>0&&Object.keys(e).every(t=>t.startsWith("_"))}normalizeMongoIdOperatorValue(e){let t={};for(let[n,o]of Object.entries(e))t[n]=Array.isArray(o)?o.map(i=>this.safeObjectId(i)):this.safeObjectId(o);return t}filterToWhere(e){let t=[];for(let[n,o]of Object.entries(e))if(typeof o=="object"&&o!==null&&!Array.isArray(o)){let i=Object.entries(o)[0];if(i){let[s,a]=i,f=this.mapFilterOperatorToSql(s);t.push({field:n,operator:f,value:a})}}return t}mapFilterOperatorToSql(e){return{_eq:"=",_neq:"!=",_gt:">",_gte:">=",_lt:"<",_lte:"<=",_in:"in",_not_in:"not in",_contains:"like",_starts_with:"like",_ends_with:"like",_is_null:"is null",_is_not_null:"is not null"}[e]||"="}async find(e){return this.trackQueryMetric("find",e.table,async()=>{let t=e.filter||(e.where?this.whereToFilter(e.where):void 0);return await this.select({tableName:e.table,filter:t,fields:e.fields,sort:e.sort,page:e.page,limit:e.limit,meta:e.meta,deep:e.deep,debugMode:e.debugMode,debugLog:e.debugLog,debugTrace:e.debugTrace,pipeline:e.pipeline,aggregate:e.aggregate,maxQueryDepth:e.maxQueryDepth})})}async findOne(e){return(await this.find({...e,limit:1}))?.data?.[0]??null}async insert(e,t){return this.trackQueryMetric("insert",e,async()=>{if(this.dbType==="mongodb"){let s=await this.mongoService.insertOne(e,t);return oe(s)}let n=await this.knexService.insertWithCascade(e,t),o=this.knexService.getKnex(),i=n||t.id;return await o(e).where("id",i).first()})}async update(e,t,n){return this.trackQueryMetric("update",e,async()=>{if(t&&typeof t=="object"&&"where"in t)return await this.updateWithOptions({table:e,where:t.where,data:n});if(this.dbType==="mongodb"){let i=await this.mongoService.updateOne(e,t,n);return oe(i)}return await this.knexService.updateWithCascade(e,t,n),await this.knexService.getKnex()(e).where("id",t).first()})}async delete(e,t){return this.trackQueryMetric("delete",e,async()=>t&&typeof t=="object"&&"where"in t?await this.deleteWithOptions({table:e,where:t.where})>0:this.dbType==="mongodb"?await this.mongoService.deleteOne(e,t):await this.knexService.getKnex()(e).where("id",t).delete()>0)}async countRecords(e,t){if(this.dbType==="mongodb")return this.mongoService.count(e,t||{});let o=this.knexService.getKnex()(e);if(t&&Object.keys(t).length>0){let s=this.filterToWhere(t);({query:o}=await this.applyWhereToKnex(o,s,e))}let i=await o.count("* as count").first();return Number(i?.count||0)}async transaction(e){if(this.dbType==="mongodb"){let t=this.mongoService.getClient().startSession();try{await t.startTransaction();let n=await e(t);return await t.commitTransaction(),n}catch(n){throw await t.abortTransaction(),n}finally{await t.endSession()}}return this.knexService.transaction(e)}async findById(e,t){if(this.dbType==="mongodb"){let o=this.safeObjectId(t);return this.mongoService.findOne(e,{_id:o})}return await this.knexService.getKnex()(e).where("id",t).first()}async findOneWhere(e,t){if(this.dbType==="mongodb"){let o={};for(let[i,s]of Object.entries(t))i==="id"||i==="_id"?o._id=this.safeObjectId(s):o[i]=s;return this.mongoService.findOne(e,o)}return await this.knexService.getKnex()(e).where(t).first()}async findWhere(e,t){if(this.dbType==="mongodb"){let o={};for(let[a,f]of Object.entries(t))a==="id"||a==="_id"?o._id=this.safeObjectId(f):o[a]=f;return await this.mongoService.collection(e).find(o).toArray()}return await this.knexService.getKnex()(e).where(t)}async insertAndGet(e,t){if(this.dbType==="mongodb")return this.mongoService.insertOne(e,t);let n=await this.knexService.insertWithCascade(e,t),o=this.knexService.getKnex(),i=n||t.id;return await o(e).where("id",i).first()}async updateById(e,t,n){return this.dbType==="mongodb"?this.mongoService.updateOne(e,t,n):(await this.knexService.updateWithCascade(e,t,n),await this.knexService.getKnex()(e).where("id",t).first())}async deleteById(e,t){return this.dbType==="mongodb"?await this.mongoService.deleteOne(e,t)?1:0:this.knexService.getKnex()(e).where("id",t).delete()}async raw(e,t){let n=this.dbType==="mongodb"?"mongodb":"sql";return this.trackQueryMetric("raw",n,async()=>{if(this.dbType==="mongodb"){let i=this.mongoService.getDb();if(typeof e=="string"){if(e.toLowerCase().includes("select 1"))return await i.command({ping:1});throw new Error("String queries not supported for MongoDB. Use db.command() object instead.")}return await i.command(e)}return await this.knexService.getKnex().raw(e,t)})}async trackQueryMetric(e,t,n){return this.runtimeMetricsCollectorService?await this.runtimeMetricsCollectorService.trackQuery({op:e,table:t},n):await n()}getConnection(){return this.dbType==="mongodb"?this.mongoService.getDb():this.knexService.getKnex()}getKnex(){if(this.dbType==="mongodb")throw new Error("getKnex() is not available for MongoDB. Use getConnection() or unified methods.");return this.knexService.getKnex()}getMongoDb(){if(this.dbType!=="mongodb")throw new Error("getMongoDb() is not available for SQL. Use getConnection() or unified methods.");return this.mongoService.getDb()}getDatabaseType(){return this.dbType}isMongoDb(){return this.dbType==="mongodb"}isSql(){return["mysql","postgres","mariadb","sqlite"].includes(this.dbType)}getPkField(){return this.isMongoDb()?"_id":"id"}getRecordId(e){return this.isMongoDb()?e._id:e.id}};Yn();qn();Vn();$e();dn();et();Nt();Ye();var Vr=new Set(["fields","filter","sort","limit","page","deep"]),dt=3;function Xn(r,e,t,n=0,o=3){if(!e||typeof e!="object")return;if(n>=o)throw new E(`deep option exceeds maximum query depth of ${o}`);let i=t?.tables?.get(r),s=new Map((i?.relations??[]).map(a=>[a.propertyName,a]));for(let[a,f]of Object.entries(e)){let l=s.get(a);if(!l)throw new E(`Unknown relation '${a}' on '${r}'`);if(!f||typeof f!="object")continue;for(let p of Object.keys(f))if(!Vr.has(p))throw new E(`Unknown deep option key '${p}' for relation '${a}'. Allowed: ${[...Vr].join(", ")}`);let u=l.type;if(f.limit!==void 0&&(u==="many-to-one"||u==="one-to-one"))throw new E(`'limit' not supported on many-to-one/one-to-one relations (relation '${a}' on '${r}')`);if(f.page!==void 0&&f.limit===void 0)throw new E(`'page' requires 'limit' to be present (relation '${a}' on '${r}')`);let c=l.targetTableName||l.targetTable;if(c){if(f.filter&&(B(f.filter,c,t),gn(f.filter,0,a,r)),f.sort){let p=Array.isArray(f.sort)?f.sort:String(f.sort).split(",").map(d=>d.trim()).filter(Boolean);for(let d of p){let g=d.startsWith("-")?d.slice(1):d;oo(g,c,t,a,r)}}f.deep&&Xn(c,f.deep,t,n+1,o)}}}function oo(r,e,t,n,o){let i=r.split(".");if(i.length-1>dt)throw new E(`Sort path '${r}' exceeds max dotted hops of ${dt} (relation '${n}' on '${o}')`);let a=e;for(let f=0;f<i.length;f++){let l=i[f],u=f===i.length-1,c=t?.tables?.get(a);if(!c)throw new E(`Sort path '${r}' references unknown table '${a}' (relation '${n}' on '${o}')`);if(c.columns?.find(g=>g.name===l)){if(!u)throw new E(`Sort path '${r}' references column '${l}' in non-terminal position (relation '${n}' on '${o}')`);return}let d=c.relations?.find(g=>g.propertyName===l);if(!d)throw new E(`Sort path '${r}' references unknown field '${l}' on '${a}' (relation '${n}' on '${o}')`);if(!u){let g=d.type;if(g==="one-to-many"||g==="many-to-many")throw new E(`Sort path '${r}' passes through '${l}' which is a ${g} relation \u2014 sort path must only traverse many-to-one or one-to-one (owner-side) relations (relation '${n}' on '${o}')`);a=d.targetTableName||d.targetTable||a}}}var so=new Set(["_and","_or","_not"]);function gn(r,e,t,n){if(!(!r||typeof r!="object"))for(let[o,i]of Object.entries(r)){if(so.has(o)){if(Array.isArray(i))for(let l of i)gn(l,e,t,n);else i&&typeof i=="object"&&gn(i,e,t,n);continue}if(o.startsWith("_")||!i||typeof i!="object"||Array.isArray(i)||!Object.keys(i).some(l=>!l.startsWith("_")))continue;let a=e+1;if(a>dt)throw new E(`Filter path exceeds max dotted hops of ${dt} at '${o}' (relation '${t}' on '${n}')`);let f={};for(let l of Object.keys(i))l.startsWith("_")||(f[l]=i[l]);gn(f,a,t,n)}}function Hr(r,e,t,n){return!r||typeof r!="object"?r:jt(r,e,t,n)}function jt(r,e,t,n){if(!r||typeof r!="object")return r;if(Array.isArray(r)){let i=r.map(s=>jt(s,e,t,n)).filter(s=>s!=null);return i.length>0?i:null}let o={};for(let[i,s]of Object.entries(r)){if(i==="_and"||i==="_or"){let c=(Array.isArray(s)?s:[s]).map(p=>jt(p,e,t,n)).filter(p=>p!=null&&Object.keys(p).length>0);c.length>0&&(o[i]=c);continue}if(i==="_not"){let u=jt(s,e,t,n);u!=null&&Object.keys(u).length>0&&(o[i]=u);continue}let a=t?.tables?.get(e),f=a?.relations?.find(u=>u.propertyName===i);if(f){if(!n(e,i,"relation"))continue;let u=f.targetTableName||f.targetTable;if(!u)continue;let c=jt(s,u,t,n);c!=null&&Object.keys(c).length>0&&(o[i]=c);continue}if(a?.columns?.find(u=>u.name===i)){if(!n(e,i,"column"))continue;o[i]=s;continue}o[i]=s}return o}function qr(r,e,t,n){if(!r)return r;let o=Array.isArray(r)?r:r.split(",").map(s=>s.trim()).filter(Boolean),i=[];for(let s of o){let l=(s.startsWith("-")?s.slice(1):s).split("."),u=!0,c=e;for(let p=0;p<l.length;p++){let d=l[p],g=p===l.length-1,m=t?.tables?.get(c);if(!m){u=!1;break}if(g)m.columns?.find(b=>b.name===d)?n(c,d,"column")||(u=!1):m.relations?.find(_=>_.propertyName===d)&&(n(c,d,"relation")||(u=!1));else{let y=m.relations?.find(b=>b.propertyName===d);if(!y){u=!1;break}if(!n(c,d,"relation")){u=!1;break}c=y.targetTableName||y.targetTable||c}}u&&i.push(s)}if(i.length!==0)return Array.isArray(r)?i:i.join(",")}vt();Ye();At();rn();Ft();Le();Nt();function ao(r){let e=new ft({knexService:r.knexService,mongoService:r.mongoService,databaseConfigService:r.databaseConfigService,runtimeMetricsCollectorService:r.runtimeMetricsCollectorService,lazyRef:r.lazyRef}),t,n,o=()=>(t||(t=new ze({packageCacheService:r.getPackageCacheService?.()??r.packageCacheService,packageCdnLoaderService:r.getPackageCdnLoaderService?.()??r.packageCdnLoaderService})),t),i=()=>(n||(n=new Qe({isolatedExecutorService:o()})),n);return{queryBuilderService:e,get isolatedExecutorService(){return o()},get executorEngineService(){return i()},async onDestroy(){await t?.onDestroy?.()}}}0&&(module.exports={ALL_SUPPORTED_OPERATORS,AuthenticationException,AuthorizationException,BadRequestException,BatchFetchEngine,BusinessLogicException,ConfigurationException,DEFAULT_TIMEOUT_MS,DOTTED_PATH_MAX_HOPS,DatabaseException,DuplicateResourceException,ErrorHandler,ExecutorEngineService,ExternalServiceException,FIELD_OPERATORS,FileNotFoundException,FileSizeExceededException,FileUploadException,HttpException,ISOLATED_EXECUTOR_RUNTIME_LOG_PATH,InvalidTokenException,IsolatedExecutorService,JoinRegistry,LOGICAL_OPERATORS,MongoBatchAdapter,MongoQueryExecutor,PER_PARENT_CONCURRENCY,QueryBuilderService,QueryPlanner,ResourceNotFoundException,SchemaException,ScriptExecutionException,ScriptTimeoutException,ServiceUnavailableException,SqlBatchAdapter,SqlQueryExecutor,TokenExpiredException,ValidationException,WHERE_IN_CHUNK_SIZE,WorkerPool,appendIsolatedExecutorRuntimeLog,applyOperatorToMatch,applyRelationFilters,applyWhereToKnex,assertFieldOperatorValueIsClean,buildAggregateFilter,buildMongoCharFoldMapJson,buildMongoFoldTextSearchJs,buildRelationSubquery,buildSqlWherePartsFromFieldAst,buildWhereClause,camelToSnake,chunkedFetch,compileScriptSource,computeEngineTuning,createEnfyraKernel,dslOpToCompareOp,encodeMainThreadToIsolate,escapeSqlValue,executeBatchFetches,executeMongoBatchFetches,expandFieldsToJoinsAndSelect,getEffectiveCpuCount,getEffectiveMemoryBytes,getEngineTuning,getExecutableScript,getForeignKeyColumnName,getIoAbortSignal,getJunctionColumnNames,getJunctionTableName,getPrimaryKeyColumn,getScriptLegacyField,getShortFkConstraintName,getShortFkName,getShortIndexName,getShortPkName,hasAggregateQuery,hasLogicalOperators,isExecutableJavaScript,isScriptTable,mergeAggregateValue,normalizeAggregateQuery,normalizeFlowStepScriptConfig,normalizeScriptLanguage,normalizeScriptPatch,normalizeScriptRecord,parseBatchFields,parseFields,parseFilter,perParentRun,quoteIdentifier,resolveExecutableScript,rewriteFilterDenyingFields,rewriteSortDroppingDenied,separateFilters,snakeToCamel,throwUnsupportedFieldOperator,transformCode,validateDeepOptions,validateFilterShape,whereToMongoFilter});
|
|
53
|
+
}`}var Tr="mongo-fold-text-search.body.txt",He=null;function Fi(){let r=[Fn.join(__dirname,Tr),Fn.join(process.cwd(),"dist","kernel","query","utils",Tr)];for(let e of r)try{if(Vt.existsSync(e))return Vt.readFileSync(e,"utf8")}catch{}return null}function Ht(){if(He!==null)return He;let r=Fi();return r?(He=r,He):(He=zt(),He)}var he=require("mongodb");function P(r,e,t,n){if(t==="_id"){if(n instanceof he.ObjectId)return n;if(typeof n=="string")try{return new he.ObjectId(n)}catch{return n}return n}let i=r?.tables?.get(e);if(!i){if((t==="_id"||t==="id"||t.endsWith("Id"))&&typeof n=="string"&&n.length===24)try{return new he.ObjectId(n)}catch{return n}return n}if(!i.columns){if((t==="_id"||t==="id"||t.endsWith("Id"))&&typeof n=="string"&&n.length===24)try{return new he.ObjectId(n)}catch{return n}return n}let o=i.columns.find(s=>s.name===t);if(!o){if(i.relations?.find(a=>a.propertyName===t||a.foreignKeyColumn===t)&&typeof n=="string"&&n.length===24)try{return new he.ObjectId(n)}catch{return n}if((t==="_id"||t==="id"||t.endsWith("Id"))&&typeof n=="string"&&n.length===24)try{return new he.ObjectId(n)}catch{return n}return n}if(n==null)return n;switch(o.type){case"int":case"integer":case"bigint":case"smallint":case"tinyint":return typeof n=="string"?parseInt(n,10):Number(n);case"float":case"double":case"decimal":case"numeric":case"real":return typeof n=="string"?parseFloat(n):Number(n);case"boolean":case"bool":return typeof n=="string"?n==="true"||n==="1":!!n;case"date":case"datetime":case"timestamp":return typeof n=="string"?new Date(n):n;case"uuid":if(typeof n=="string")try{return new he.ObjectId(n)}catch{return n}return n;default:return n}}var qt="__mongoFoldTextTriples";function Ni(r){return r==="_id"?"$_id":`$${r}`}function qe(r,e,t,n){let i=Ni(e),o=r[qt]??[];o.push({ref:i,needle:t,mode:n}),r[qt]=o}function vi(r){let e=r[qt];if(delete r[qt],!e?.length)return;let t=[];for(let o of e)t.push(o.ref,o.needle,o.mode);let n={$eq:[{$function:{body:Ht(),args:t,lang:"js"}},!0]},i=r.$expr;i?r.$expr={$and:[i,n]}:r.$expr=n}function Ge(r,e,t,n){let i={},o=n==="mongodb"||!n;for(let s of e){let a=s.field.includes(".")?s.field.split(".").pop()??s.field:s.field,f=t||s.field.split(".")[0]||"";o&&a==="id"&&(a="_id");let l=P(r,f,a,s.value);switch(s.operator){case"=":i[a]=l;break;case"!=":i[a]={$ne:l};break;case">":i[a]={$gt:l};break;case"<":i[a]={$lt:l};break;case">=":i[a]={$gte:l};break;case"<=":i[a]={$lte:l};break;case"like":i[a]={$regex:l.replace(/%/g,".*"),$options:"i"};break;case"in":let u=s.value;Array.isArray(u)||(u=typeof u=="string"&&u.includes(",")?u.split(",").map(b=>b.trim()):[u]);let c=u.map(b=>P(r,f,a,b));i[a]={$in:c};break;case"not in":let p=s.value;Array.isArray(p)||(p=typeof p=="string"&&p.includes(",")?p.split(",").map(b=>b.trim()):[p]);let d=p.map(b=>P(r,f,a,b));i[a]={$nin:d};break;case"is null":i[a]=null;break;case"is not null":i[a]={$ne:null};break;case"_contains":qe(i,a,String(l),"contains");break;case"_starts_with":qe(i,a,String(l),"starts");break;case"_ends_with":qe(i,a,String(l),"ends");break;case"_between":let g=s.value;if(typeof g=="string"&&(g=g.split(",").map(b=>b.trim())),Array.isArray(g)&&g.length===2){let b=P(r,f,a,g[0]),_=P(r,f,a,g[1]);i[a]={$gte:b,$lte:_}}break;case"_is_null":let m=l===!0||l==="true";i[a]=m?{$eq:null}:{$ne:null};break;case"_is_not_null":let y=l===!0||l==="true";i[a]=y?{$ne:null}:{$eq:null};break}}return vi(i),i}function $r(r,e,t){let i=r?.tables?.get?.(e)?.columns?.find(o=>o.name===t);return i?i.isNullable!==!1:!0}function Gt(r,e,t,n,i,o){switch(i){case"_contains":qe(e,n,String(o),"contains");break;case"_starts_with":qe(e,n,String(o),"starts");break;case"_ends_with":qe(e,n,String(o),"ends");break;case"_eq":e[n]=P(r,t,n,o);break;case"_neq":{let c=P(r,t,n,o);$r(r,t,n)?(e.$and||(e.$and=[]),e.$and.push({[n]:{$ne:null}}),e.$and.push({[n]:{$ne:c}})):e[n]={$ne:c};break}case"_in":{let c=o;Array.isArray(c)||(c=typeof c=="string"&&c.includes(",")?c.split(",").map(d=>d.trim()):[c]);let p=c.map(d=>P(r,t,n,d));e[n]={$in:p};break}case"_not_in":case"_nin":let s=o;Array.isArray(s)||(s=typeof s=="string"&&s.includes(",")?s.split(",").map(c=>c.trim()):[s]);let a=s.map(c=>P(r,t,n,c));$r(r,t,n)?(e.$and||(e.$and=[]),e.$and.push({[n]:{$ne:null}}),e.$and.push({[n]:{$nin:a}})):e[n]={$nin:a};break;case"_gt":e[n]={$gt:P(r,t,n,o)};break;case"_gte":e[n]={$gte:P(r,t,n,o)};break;case"_lt":e[n]={$lt:P(r,t,n,o)};break;case"_lte":e[n]={$lte:P(r,t,n,o)};break;case"_is_null":let f=o===!0||o==="true";e[n]=f?{$eq:null}:{$ne:null};break;case"_is_not_null":let l=o===!0||o==="true";e[n]=l?{$ne:null}:{$eq:null};break;case"_between":let u=o;if(typeof u=="string"&&(u=u.split(",").map(c=>c.trim())),Array.isArray(u)&&u.length===2){let c=P(r,t,n,u[0]),p=P(r,t,n,u[1]);e[n]={$gte:c,$lte:p}}break}}var On=require("mongodb");function ee(r,e){if(!r||typeof r!="object")return!1;for(let[t,n]of Object.entries(r))if(t==="_and"||t==="_or"){if(Array.isArray(n)){for(let i of n)if(ee(i,e))return!0}}else if(t==="_not"){if(ee(n,e))return!0}else if(e.has(t))return!0;return!1}function V(r,e){if(!r||typeof r!="object")return{fieldFilters:{},relationFilters:{},hasRelations:!1};let t={},n={},i=new Set(e.relations.map(s=>s.propertyName));for(let[s,a]of Object.entries(r)){if(s==="_and"||s==="_or"||s==="_not"){t[s]=a;continue}if(i.has(s))if(typeof a=="object"&&a!==null){let f=Object.keys(a);if(f.some(u=>u.startsWith("_"))){let u=["_is_null","_is_not_null","_eq","_neq","_in","_not_in","_nin","_gt","_gte","_lt","_lte"];f.length===1&&u.includes(f[0])?n[s]={id:a}:n[s]=a}else n[s]=a}else n[s]=a;else t[s]=a}let o=ee(r,i);return{fieldFilters:t,relationFilters:n,hasRelations:o}}vt();At();var nn="__mongoFoldTextTriples";function Ke(r,e){if(!r)return{};let t={};return en(r,t,e),tn(t),t}function se(r,e,t){if(!e)return{};let n=new te,{node:i}=be(e,t,r,n);return Ke(i,{metadata:r,rootTable:t})}function en(r,e,t){switch(r.kind){case"true":return;case"false":Ot(e,{_id:{$exists:!1,$type:"null"}});return;case"and":{let i=r.children.map(o=>{let s={};return en(o,s,t),tn(s),s}).filter(o=>Object.keys(o).length>0);if(i.length===0)return;if(i.length===1){Object.assign(e,i[0]);return}Ot(e,...i);return}case"or":{let i=r.children.map(s=>{let a={};return en(s,a,t),tn(a),a}).filter(s=>Object.keys(s).length>0);if(i.length===0)return;let o=e.$or;e.$or=o?[...o,...i]:i;return}case"not":{let n={};en(r.child,n,t),tn(n);let i=e.$nor;e.$nor=i?[...i,n]:[n];return}case"compare":Li(r,e,t);return;case"relation_exists":{console.warn(`[mongo-render-filter] relation_exists node reached renderer directly (rootTable=${t.rootTable}, joinId=${r.joinId}) \u2014 expected applyRelationFilters or null-only short-circuit to handle it. Filter silently skipped.`);return}}}function Li(r,e,t){let n=r.field.fieldName;if(n==="id"&&(n="_id"),r.field.joinId!==null){console.warn(`[mongo-render-filter] compare node has joinId=${r.field.joinId} (field=${r.field.fieldName}) but reached renderer \u2014 expected relation pipeline to handle it. Filter silently skipped.`);return}let i=o=>P(t.metadata,t.rootTable,n,o);switch(r.op){case"eq":ne(e,n,i(r.value));return;case"neq":{let o=i(r.value);Rr(t,n)?Ot(e,{[n]:{$ne:null}},{[n]:{$ne:o}}):ne(e,n,{$ne:o});return}case"gt":ne(e,n,{$gt:i(r.value)});return;case"gte":ne(e,n,{$gte:i(r.value)});return;case"lt":ne(e,n,{$lt:i(r.value)});return;case"lte":ne(e,n,{$lte:i(r.value)});return;case"in":{let o=Cr(r.value).map(i);ne(e,n,{$in:o});return}case"not_in":{let o=Cr(r.value).map(i);Rr(t,n)?Ot(e,{[n]:{$ne:null}},{[n]:{$nin:o}}):ne(e,n,{$nin:o});return}case"between":{let o=Array.isArray(r.value)?r.value:typeof r.value=="string"?r.value.split(",").map(s=>s.trim()):null;Array.isArray(o)&&o.length===2&&ne(e,n,{$gte:i(o[0]),$lte:i(o[1])});return}case"is_null":ne(e,n,r.value===!0?{$eq:null}:{$ne:null});return;case"contains":vn(e,n,String(r.value),"contains");return;case"starts_with":vn(e,n,String(r.value),"starts");return;case"ends_with":vn(e,n,String(r.value),"ends");return}}function ne(r,e,t){r[e]===void 0?r[e]=t:(Ot(r,{[e]:r[e]},{[e]:t}),delete r[e])}function Ot(r,...e){if(e.length===0)return;let t=r.$and;r.$and=t?[...t,...e]:e}function Rr(r,e){let n=r.metadata?.tables?.get?.(r.rootTable)?.columns?.find(i=>i.name===e);return n?n.isNullable!==!1:!0}function Cr(r){return Array.isArray(r)?r:typeof r=="string"&&r.includes(",")?r.split(",").map(e=>e.trim()):[r]}function Di(r){return r==="_id"?"$_id":`$${r}`}function vn(r,e,t,n){let i=Di(e),o=r[nn]??[];o.push({ref:i,needle:t,mode:n}),r[nn]=o}function tn(r){let e=r[nn];if(delete r[nn],!e?.length)return;let t=[];for(let o of e)t.push(o.ref,o.needle,o.mode);let n={$eq:[{$function:{body:Ht(),args:t,lang:"js"}},!0]},i=r.$expr;i?r.$expr={$and:[i,n]}:r.$expr=n}async function ae(r,e,t,n){if(!r||typeof r!="object")return{};let i=t?.tables?.get(e);if(!i)return se(t,r,e);let o=new Set((i.relations||[]).map(l=>l.propertyName));if(!ee(r,o))return se(t,r,e);if(r._and&&Array.isArray(r._and)){let u=(await Promise.all(r._and.map(c=>ae(c,e,t,n)))).filter(c=>c&&Object.keys(c).length>0);return u.length===0?{}:u.length===1?u[0]:{$and:u}}if(r._or&&Array.isArray(r._or)){let u=(await Promise.all(r._or.map(c=>ae(c,e,t,n)))).filter(c=>c&&Object.keys(c).length>0);return u.length===0?{}:{$or:u}}if(r._not){let l=await ae(r._not,e,t,n);return!l||Object.keys(l).length===0?{}:{$nor:[l]}}let{fieldFilters:s,relationFilters:a}=V(r,i),f=[];if(s&&Object.keys(s).length>0){let l=se(t,s,e);l&&Object.keys(l).length>0&&f.push(l)}if(a&&Object.keys(a).length>0)for(let[l,u]of Object.entries(a)){let c=await Bi(l,u,e,i,t,n);c&&Object.keys(c).length>0&&f.push(c)}return f.length===0?{}:f.length===1?f[0]:{$and:f}}async function Bi(r,e,t,n,i,o){let s=(n.relations||[]).find(l=>l.propertyName===r);if(!s)return{};let a=s.targetTableName||s.targetTable,f=i?.tables?.get(a);return!a||!f?{}:s.type==="many-to-one"||s.type==="one-to-one"?Ki(e,s,r,a,f,i,o):s.type==="one-to-many"?Wi(e,s,t,a,f,i,o):s.type==="many-to-many"?Ui(e,s,t,a,f,i,o):{}}async function Ki(r,e,t,n,i,o,s){let a=G(e)||t,f=Mn(r),l=En(f);if(l!==null)return l?{[a]:null}:{[a]:{$ne:null}};let u=Nr(f);if(u!==null){let g=Pn(u.value);if(u.op==="eq")return{[a]:g};if(u.op==="neq")return{[a]:{$ne:g}};if(u.op==="in")return{[a]:{$in:g}};if(u.op==="not_in")return{$and:[{[a]:{$nin:g}},{[a]:{$ne:null}}]}}let c=await In(f,n,i,o,s);if(!c||Object.keys(c).length===0)return{};let d=(await s.collection(n).find(c,{projection:{_id:1}}).toArray()).map(g=>g._id).filter(Boolean);return d.length===0?{[a]:null}:{[a]:{$in:d}}}async function Wi(r,e,t,n,i,o,s){let a=Q(e)||t,f=Mn(r),l=En(f);if(l!==null){let p=await Fr(s,n,a,{});return l?p.length===0?{}:{_id:{$nin:p}}:p.length===0?{__impossible__:!0}:{_id:{$in:p}}}let u=await In(f,n,i,o,s);if(!u||Object.keys(u).length===0)return{};let c=await Fr(s,n,a,u);return c.length===0?{__impossible__:!0}:{_id:{$in:c}}}async function Ui(r,e,t,n,i,o,s){let a=Ve(t,e);if(!a)return{};let f=Mn(r),l=En(f);if(l!==null){let m=await An(s,a,n,null);return l?m.length===0?{}:{_id:{$nin:m}}:m.length===0?{__impossible__:!0}:{_id:{$in:m}}}let u=Nr(f);if(u!==null){let m=Pn(u.value),y=Array.isArray(m)?m:[m],b=await An(s,a,n,{_id:{$in:y}});return b.length===0?{__impossible__:!0}:{_id:{$in:b}}}let c=await In(f,n,i,o,s);if(!c||Object.keys(c).length===0)return{};let d=(await s.collection(n).find(c,{projection:{_id:1}}).toArray()).map(m=>m._id).filter(Boolean);if(d.length===0)return{__impossible__:!0};let g=await An(s,a,n,{_id:{$in:d}});return g.length===0?{__impossible__:!0}:{_id:{$in:g}}}async function In(r,e,t,n,i){let o=new Set((t?.relations??[]).map(s=>s.propertyName));return ee(r,o)?ae(r,e,n,i):se(n,r,e)}async function Fr(r,e,t,n){let i=await r.collection(e).find(n,{projection:{[t]:1}}).toArray(),o=new Set,s=[];for(let a of i){let f=a[t];if(f==null)continue;let l=String(f);o.has(l)||(o.add(l),s.push(f))}return s}async function An(r,e,t,n){let i=null;n&&t&&(i=(await r.collection(t).find(n,{projection:{_id:1}}).toArray()).map(u=>u._id).filter(Boolean));let o=i?{[e.otherColumn]:{$in:i}}:{},s=await r.collection(e.junctionName).find(o,{projection:{[e.selfColumn]:1}}).toArray(),a=new Set,f=[];for(let l of s){let u=l[e.selfColumn];if(u==null)continue;let c=String(u);a.has(c)||(a.add(c),f.push(u))}return f}function Mn(r){return r&&typeof r=="object"&&!Array.isArray(r)&&Object.keys(r).length===1&&r.id&&typeof r.id=="object"?r.id:r}function En(r){if(!r||typeof r!="object"||Array.isArray(r))return null;let e=Object.keys(r);if(e.length!==1)return null;let t=e[0],n=r[t];return t==="_is_null"?n===!0:t==="_is_not_null"?n!==!0:t==="_eq"?n===null?!0:null:t==="_neq"&&n===null?!1:null}function Pn(r){if(Array.isArray(r))return r.map(e=>Pn(e));if(typeof r!="string")return r;try{return new On.ObjectId(r)}catch{return r}}function Nr(r){if(Array.isArray(r))return{op:"in",value:r};if(r instanceof On.ObjectId)return{op:"eq",value:r};if(r==null)return null;if(typeof r!="object")return{op:"eq",value:r};if(!r||typeof r!="object"||Array.isArray(r))return null;let e=Object.keys(r);if(e.length!==1)return null;let t=e[0];return t==="_eq"?{op:"eq",value:r._eq}:t==="_neq"?{op:"neq",value:r._neq}:t==="_in"&&Array.isArray(r._in)?{op:"in",value:r._in}:t==="_not_in"&&Array.isArray(r._not_in)?{op:"not_in",value:r._not_in}:null}async function It(r,e,t,n){let i=await Jt(r,e,t),o=[],s={},a={};if(n&&typeof n=="object")for(let[d,g]of Object.entries(n))if(typeof g=="object"&&g!==null){let m=Object.keys(g)[0];m&&["_eq","_neq","_gt","_gte","_lt","_lte","_in","_not_in","_nin","_contains","_starts_with","_ends_with","_between","_is_null","_is_not_null"].includes(m)?s[d]=g:a[d]=g}else s[d]=g;if(Object.keys(s).length>0){let d={};for(let[g,m]of Object.entries(s))if(typeof m=="object"&&m!==null)for(let[y,b]of Object.entries(m))Gt(r,d,e,g,y,b);else d[g]=m;Object.keys(d).length>0&&o.push({$match:d})}let l=r?.tables?.get(e)?.relations||[],u=[];for(let[d,g]of Object.entries(a))if(!i.relations.some(y=>y.propertyName===d)){let y=l.find(b=>b.propertyName===d);if(y){let b="",_="";if(y.type==="many-to-one"||y.type==="one-to-one")b=G(y)||y.propertyName,_="_id";else if(y.type==="one-to-many")b="_id",_=Q(y)||y.propertyName;else if(y.type==="many-to-many")continue;let w=y.type==="one-to-many"||y.type==="many-to-many";u.push({propertyName:d,targetTable:y.targetTableName,localField:b,foreignField:_,type:w?"many":"one",nestedFields:[]})}}let c=[...i.relations,...u];for(let d of c){let g=a[d.propertyName],m=d.nestedFields&&d.nestedFields.length>0?await It(r,d.targetTable,d.nestedFields,g):g?await It(r,d.targetTable,["_id"],g):[];d.type==="one"&&m.length>0&&m.push({$limit:1}),o.push({$lookup:{from:d.targetTable,localField:d.localField,foreignField:d.foreignField,as:d.propertyName,pipeline:m.length>0?m:void 0}}),d.type==="one"&&(o.push({$unwind:{path:`$${d.propertyName}`,preserveNullAndEmptyArrays:!0}}),g&&(Xe(g)||o.push({$match:{[d.propertyName]:{$ne:null}}})))}let p=l.filter(d=>!c.some(g=>g.propertyName===d.propertyName));if(i.scalarFields.length>0||i.relations.length>0||p.length>0){let d={_id:1};for(let m of i.scalarFields)d[m]=1;for(let m of c)d[m.propertyName]=1;if(t.includes("*"))for(let m of p){if(m.type==="one-to-many"||m.type==="many-to-many")continue;m.type==="many-to-many"?d[m.propertyName]={$map:{input:`$${m.propertyName}`,as:"item",in:{_id:"$$item"}}}:d[m.propertyName]={$cond:{if:{$ne:[`$${m.propertyName}`,null]},then:{_id:`$${m.propertyName}`},else:null}}}o.push({$project:d})}return o}async function vr(r,e,t,n,i){let o=r?.tables?.get(t),s=o?.relations||[],a=o?.columns||[],f=s.filter(u=>!i.some(c=>c.propertyName===u.propertyName)),l=n.length===a.length||n.length===0&&i.length===0;if(f.length>0||!l){let u={_id:1};for(let c of n)u[c]=1;for(let c of i)u[c.propertyName]=1;for(let c of f){if(c.type==="one-to-many"||c.type==="many-to-many")continue;c.type==="many-to-many"?u[c.propertyName]={$map:{input:`$${c.propertyName}`,as:"item",in:{_id:"$$item"}}}:u[c.propertyName]={$cond:{if:{$ne:[`$${c.propertyName}`,null]},then:{_id:`$${c.propertyName}`},else:null}}}e.push({$project:u})}}function Xe(r){if(!r||typeof r!="object")return!1;if(r===null)return!0;if(Array.isArray(r))return r.some(e=>Xe(e));if("_or"in r&&Array.isArray(r._or))return r._or.some(e=>Xe(e));if("_and"in r&&Array.isArray(r._and))return r._and.some(e=>Xe(e));if("_not"in r)return Xe(r._not);for(let[e,t]of Object.entries(r)){if(t===null){if(e==="_eq"||e==="$eq")return!0;continue}if(typeof t=="object"&&("_is_null"in t&&(t._is_null===!0||t._is_null==="true")||"_eq"in t&&t._eq===null||"$eq"in t&&t.$eq===null||Xe(t)))return!0}return!1}et();var jn=require("mongodb");et();rn();var tt=class{constructor(e,t,n){this.db=e;this.metadata=t;this.fieldRenamesByTable=n;this.pkField="_id"}normalizeMetadata(){return this.metadata?this.metadata.tables?this.metadata:{tables:new Map(Object.entries(this.metadata))}:this.metadata}buildSortFromTokens(e){if(!e)return;let t=Array.isArray(e)?e:e.split(",").map(i=>i.trim()).filter(Boolean),n={};for(let i of t){let o=i.startsWith("-"),a=(o?i.slice(1):i).split(".");if(a.length===1)n[a[0]]=o?-1:1;else{let f=`__sort_${a.slice(0,-1).join("_")}`;n[`${f}.${a[a.length-1]}`]=o?-1:1}}return Object.keys(n).length>0?n:void 0}hasDottedSort(e){return e?(Array.isArray(e)?e:e.split(",").map(n=>n.trim()).filter(Boolean)).some(n=>(n.startsWith("-")?n.slice(1):n).includes(".")):!1}buildSortAggregatePipeline(e,t,n){let i=Array.isArray(n)?n:n.split(",").map(l=>l.trim()).filter(Boolean),o=[{$match:t}],s=new Set;for(let l of i){let c=(l.startsWith("-")?l.slice(1):l).split(".");if(c.length<=1)continue;let p=e;for(let d=0;d<c.length-1;d++){let g=c[d],m=this.normalizeMetadata()?.tables?.get(p);if(!m)break;let y=m.relations?.find(w=>w.propertyName===g);if(!y)break;let b=y.targetTableName||y.targetTable,_=`__sort_${c.slice(0,d+1).join("_")}`;if(!s.has(_)){s.add(_);let w=G(y)||y.propertyName,$=d===0?null:`__sort_${c.slice(0,d).join("_")}`,h=$?`${$}.${w}`:w;o.push({$lookup:{from:b,localField:h,foreignField:"_id",as:_}},{$unwind:{path:`$${_}`,preserveNullAndEmptyArrays:!0}})}p=b}}let a=this.buildSortFromTokens(n);a&&o.push({$sort:a});let f={};for(let l of s)f[l]=0;return Object.keys(f).length>0&&o.push({$project:f}),o}toObjectId(e){try{return typeof e=="string"?new jn.ObjectId(e):e}catch{return e}}keyOf(e){return e==null?"":e instanceof jn.ObjectId||typeof e=="object"&&typeof e.toHexString=="function"?e.toHexString():String(e)}buildScalarRef(e){return{[this.pkField]:e}}getTargetPkField(e){return this.pkField}resolveOwnerFkKey(e){return e.relationName}resolveInverseFkField(e){return e.foreignField?e.foreignField:e.mappedBy?e.mappedBy:e.relationName}resolveParentPk(e){return this.pkField}resolveFields(e,t){let{rootFields:n,subRelations:i}=Ze(e),o={},s=!1;if(n.includes("*")){s=!0;for(let p of t.relations||[])i.has(p.propertyName)||i.set(p.propertyName,["_id"])}else for(let p of n){let d=t.columns.find(g=>g.name===p);d?o[d.name]=1:t.relations?.find(m=>m.propertyName===p)&&!i.has(p)&&i.set(p,["_id"])}i.forEach((p,d)=>{let g=t.relations?.find(m=>m.propertyName===d);g&&(g.type==="many-to-one"||g.type==="one-to-one"&&!g.isInverse)&&(s||(o[g.propertyName]=1))}),s||(o._id=1);let a=[];i.forEach((p,d)=>{let g=t.relations?.find(_=>_.propertyName===d);if(!g)return;let m=g.targetTableName||g.targetTable;if(!m)return;let y,b;g.type==="many-to-one"||g.type==="one-to-one"?De(g)?(y="_id",b=Q(g)||g.propertyName):(y=G(g)||g.propertyName,b="_id"):g.type==="one-to-many"?(y="_id",b=Q(g)||g.propertyName):g.type==="many-to-many"&&(g.isInverse?(y="_id",b=g.mappedBy):(y=g.propertyName,b="_id")),a.push({relationName:d,type:g.type,targetTable:m,fields:p,isInverse:g.isInverse,fkColumn:g.foreignKeyColumn,mappedBy:g.mappedBy,junctionTableName:g.junctionTableName,junctionSourceColumn:g.junctionSourceColumn,junctionTargetColumn:g.junctionTargetColumn,localField:y,foreignField:b})});let f=!s&&Object.keys(o).length===1&&o._id===1&&a.length===0,l=this.fieldRenamesByTable?.get(t.name)??[],u=[];if(!s&&l.length>0)for(let p of l)o[p.newName]===1&&o[p.oldName]!==1&&(o[p.oldName]=1,u.push(p.oldName));return{isPkOnly:f,nestedDescs:a,fetchSpec:{projection:s?void 0:o,pendingRenames:l,hiddenFields:u}}}async fetchOwner(e,t,n,i){let o=i?.userFilter?se(this.normalizeMetadata(),i.userFilter,e):null,s=this.buildSortFromTokens(i?.userSort),a=await H(t,f=>{let l={_id:{$in:f}};o&&Object.keys(o).length>0&&Object.assign(l,o);let u={projection:n.projection};return s&&(u.sort=s),this.db.collection(e).find(l,u).toArray()});return this.applyReadFallback(a,n)}async fetchInverse(e,t,n,i,o){let s=i.projection?{...i.projection}:void 0;s&&s[t]===void 0&&(s[t]=1);let a=n.filter(y=>y!=null).map(y=>this.toObjectId(y)),f=o?.userFilter?se(this.normalizeMetadata(),o.userFilter,e):null,l=o?.userLimit,u=o?.userPage,c=this.hasDottedSort(o?.userSort);if(l!==void 0){let y=u?(u-1)*l:0,b=await ce(a,async w=>{let $={[t]:w};if(f&&Object.keys(f).length>0&&Object.assign($,f),c){let R=this.buildSortAggregatePipeline(e,$,o.userSort);y>0&&R.push({$skip:y}),R.push({$limit:l}),s&&R.push({$project:s});let F=await this.db.collection(e).aggregate(R).toArray();return this.applyReadFallback(F,i)}let k={sort:this.buildSortFromTokens(o?.userSort)||{_id:1}};s&&(k.projection=s);let S=this.db.collection(e).find($,k);return y>0&&S.skip(y),S.limit(l),this.applyReadFallback(await S.toArray(),i)},16),_=[];for(let[w,$]of b.entries()){let h=a.find(k=>this.keyOf(k)===w);for(let k of $)k[t]||(k[t]=h??w),_.push(k)}return{docs:_,groupKeyField:t}}if(c){let y=[],b=await ce(a,async _=>{let w={[t]:_};f&&Object.keys(f).length>0&&Object.assign(w,f);let $=this.buildSortAggregatePipeline(e,w,o.userSort);s&&$.push({$project:s});let h=await this.db.collection(e).aggregate($).toArray();return this.applyReadFallback(h,i)},16);for(let _ of b.values())for(let w of _)y.push(w);return{docs:y,groupKeyField:t}}let p={[t]:{$in:a}};f&&Object.keys(f).length>0&&Object.assign(p,f);let d=this.buildSortFromTokens(o?.userSort)||{_id:1},g={projection:s,sort:d},m=await H(a,y=>this.db.collection(e).find({[t]:{$in:y},...f||{}},g).toArray());return{docs:this.applyReadFallback(m,i),groupKeyField:t}}postProcessInverseChild(e,t,n){n||delete e[t]}async fetchM2M(e,t,n,i,o){let s=n?.name;if(!s)throw new Error(`Missing parentMeta.name for M2M batch fetch: ${t.relationName}`);let a=Ve(s,{type:"many-to-many",propertyName:t.relationName,targetTable:t.targetTable,mappedBy:t.isInverse?t.mappedBy:void 0});if(!a)throw new Error(`Failed to resolve junction info for ${s}.${t.relationName}`);let f=e.map(w=>w._id).filter(w=>w!=null),l=new Map;for(let w of e)l.set(this.keyOf(w._id),[]);if(f.length===0)return{grouped:l,docs:[]};let u=await H(f,w=>this.db.collection(a.junctionName).find({[a.selfColumn]:{$in:w}},{projection:{_id:0,[a.selfColumn]:1,[a.otherColumn]:1}}).toArray());if(u.length===0)return{grouped:l,docs:[]};let c=t.userFilter?se(this.normalizeMetadata(),t.userFilter,t.targetTable):null,p=t.userLimit,d=t.userPage;if(p!==void 0){let w=d?(d-1)*p:0,$=await ce(f,async k=>{let R=(await this.db.collection(a.junctionName).find({[a.selfColumn]:k},{projection:{_id:0,[a.otherColumn]:1}}).toArray()).map(W=>W[a.otherColumn]).filter(W=>W!=null);if(R.length===0)return[];let F={_id:{$in:R}};if(c&&Object.keys(c).length>0&&Object.assign(F,c),this.hasDottedSort(t.userSort)){let W=this.buildSortAggregatePipeline(t.targetTable,F,t.userSort);w>0&&W.push({$skip:w}),W.push({$limit:p}),o.projection&&W.push({$project:o.projection});let Se=await this.db.collection(t.targetTable).aggregate(W).toArray();return this.applyReadFallback(Se,o)}let O={sort:this.buildSortFromTokens(t.userSort)||{_id:1}};o.projection&&(O.projection=o.projection);let j=this.db.collection(t.targetTable).find(F,O);return w>0&&j.skip(w),j.limit(p),this.applyReadFallback(await j.toArray(),o)},16),h=[];for(let[k,S]of $.entries()){l.set(k,S);for(let R of S)h.push(R)}return{grouped:l,docs:h}}let g=new Set,m=[];for(let w of u){let $=w[a.otherColumn];if($==null)continue;let h=this.keyOf($);g.has(h)||(g.add(h),m.push($))}let y=o.projection&&Object.keys(o.projection).length===1&&o.projection._id===1&&!c,b=[],_=new Map;if(y)for(let w of m)_.set(this.keyOf(w),{_id:w});else{let w={_id:{$in:m}};c&&Object.keys(c).length>0&&Object.assign(w,c);let $=this.hasDottedSort(t.userSort),h;if($){let k=this.buildSortAggregatePipeline(t.targetTable,w,t.userSort);o.projection&&k.push({$project:o.projection}),h=await this.db.collection(t.targetTable).aggregate(k).toArray()}else{let S={sort:this.buildSortFromTokens(t.userSort)||{_id:1}};o.projection&&(S.projection=o.projection),h=await H(m,R=>this.db.collection(t.targetTable).find({_id:{$in:R},...c||{}},S).toArray())}b=this.applyReadFallback(h,o);for(let k of b)_.set(this.keyOf(k._id),k)}for(let w of u){let $=this.keyOf(w[a.selfColumn]),h=this.keyOf(w[a.otherColumn]),k=_.get(h);if(!k)continue;let S=l.get($);S&&S.push(k)}return{grouped:l,docs:b}}applyReadFallback(e,t){let n=t.pendingRenames??[];if(e.length===0||n.length===0)return e;let i=new Set(t.hiddenFields??[]);for(let o of e)for(let s of n)o[s.newName]===void 0&&o[s.oldName]!==void 0&&(o[s.newName]=o[s.oldName]),(i.has(s.oldName)||o[s.newName]!==void 0)&&delete o[s.oldName];return e}};async function on(r,e,t,n,i=3,o=0,s,a,f,l){let u=await l?.getActiveFieldRenamesByTable?.(),c=new tt(r,a,u);await new _e(c,n,f).execute(e,t,i,o,s)}async function Ln(r,e,t){let n=[],{db:i,metadata:o,dbType:s,debugLog:a}=t,f=o?.tables?.get(e.table),l=new Set((f?.relations??[]).map(h=>h.propertyName)),u=!!e.mongoRawFilter&&!!o&&ee(e.mongoRawFilter,l),c=e.plan,p=c?.filterTree&&!c.hasRelationFilters&&!e.where;if(e.mongoRawFilter&&o&&u){let h=await ae(e.mongoRawFilter,e.table,o,i);h&&Object.keys(h).length>0&&n.push({$match:h})}else if(p){let h=Ke(c.filterTree,{metadata:o,rootTable:e.table});Object.keys(h).length>0&&n.push({$match:h})}else if(e.where){console.warn(`[mongo-executor:fallback] whereToMongoFilter path hit for table=${e.table} where=${JSON.stringify(e.where)}`);let h=Ge(o,e.where,e.table,s);n.push({$match:h})}let d=e.plan,g=d?d.hasRelationSort:e.sort?.some(h=>{if(!h.field.includes("."))return!1;let k=h.field.split(".")[0];return e.mongoFieldsExpanded?.relations?.some(S=>S.propertyName===k)??!1})??!1,m=u||g,y=()=>d?.sortItems?zi(d.sortItems):e.sort?Ji(e.sort):null;if(!e.mongoFieldsExpanded){let h=y();if(h&&n.push({$sort:h}),e.mongoCountOnly?n.push({$count:"count"}):(e.offset&&n.push({$skip:e.offset}),e.limit!==void 0&&e.limit!==null&&e.limit>0&&n.push({$limit:e.limit})),e.select){let S={};for(let R of e.select)S[R]=1;n.push({$project:S})}a&&a.push({type:"MongoDB Aggregation Pipeline",collection:e.table,pipeline:JSON.parse(JSON.stringify(n))});let k=await r.aggregate(n).toArray();return e.mongoCountOnly?{results:k,pipeline:n}:{results:Or(k),pipeline:n}}let{scalarFields:b,relations:_}=e.mongoFieldsExpanded;if(!m){let h=y();h&&n.push({$sort:h}),e.mongoCountOnly||(e.offset&&n.push({$skip:e.offset}),e.limit!==void 0&&e.limit!==null&&e.limit>0&&n.push({$limit:e.limit}))}let w=[];for(let h of _){let k=e.mongoRawFilter?.[h.propertyName],S=e.sort?.some(R=>R.field.startsWith(`${h.propertyName}.`));if(k||S){if(h.nestedFields&&h.nestedFields.length>0){let F=await It(o,h.targetTable,h.nestedFields??[],k);h.type==="one"&&F.length>0&&F.push({$limit:1}),n.push({$lookup:{from:h.targetTable,localField:h.localField,foreignField:h.foreignField,as:h.propertyName,pipeline:F.length>0?F:void 0}})}else if(k){let F=await It(o,h.targetTable,["_id"],k);h.type==="one"&&F.length>0&&F.push({$limit:1}),n.push({$lookup:{from:h.targetTable,localField:h.localField,foreignField:h.foreignField,as:h.propertyName,pipeline:F.length>0?F:void 0}})}else n.push({$lookup:{from:h.targetTable,localField:h.localField,foreignField:h.foreignField,as:h.propertyName}});h.type==="one"&&(n.push({$unwind:{path:`$${h.propertyName}`,preserveNullAndEmptyArrays:!0}}),k&&(nt(k)||n.push({$match:{[h.propertyName]:{$ne:null}}})))}else w.push(h)}if(m){let h=y();h&&n.push({$sort:h}),e.mongoCountOnly||(e.offset&&n.push({$skip:e.offset}),e.limit!==void 0&&e.limit!==null&&e.limit>0&&n.push({$limit:e.limit}))}await vr(o,n,e.table,b,[..._]),e.mongoCountOnly&&n.push({$count:"count"}),a&&a.push({type:"MongoDB Aggregation Pipeline",collection:e.table,pipeline:JSON.parse(JSON.stringify(n))});let $=await r.aggregate(n).toArray();if(e.mongoCountOnly)return{results:$,pipeline:n};if(w.length>0&&$.length>0){let h=e.deep||{},k=w.map(R=>{let X=o?.tables?.get(e.table)?.relations?.find(j=>j.propertyName===R.propertyName),A=h[R.propertyName],O=A?.fields!=null?Array.isArray(A.fields)?A.fields:String(A.fields).split(",").map(j=>j.trim()).filter(Boolean):R.nestedFields&&R.nestedFields.length>0?R.nestedFields:["_id"];return{relationName:R.propertyName,type:X?.type,targetTable:R.targetTable,fields:O,isInverse:X?.isInverse,mappedBy:X?.mappedBy,junctionTableName:X?.junctionTableName,localField:R.localField,foreignField:R.foreignField,userFilter:A?.filter,userSort:A?.sort,userLimit:A?.limit!==void 0?Number(A.limit):void 0,userPage:A?.page!==void 0?Number(A.page):void 0,nestedDeep:A?.deep}}),S=Qi(o);S&&await on(i,$,k,S,3,0,e.table,o,void 0,t.mongoPhysicalMigrationService)}return{results:Or($),pipeline:n}}function Qi(r){let e=r;return e?async t=>{let n=e.tables?.get(t);return n?{name:n.name,columns:(n.columns||[]).map(i=>({name:i.name,type:i.type})),relations:n.relations||[]}:null}:null}function Ji(r){let e={};for(let t of r){let n=t.field;n==="id"&&(n="_id"),e[n]=t.direction==="asc"?1:-1}return e}function zi(r){let e={};for(let t of r){let n=t.joinId!==null?t.fullPath:t.field;n==="id"&&(n="_id"),e[n]=t.direction==="asc"?1:-1}return e}function nt(r){if(!r||typeof r!="object")return!1;if(r===null)return!0;if(Array.isArray(r))return r.some(e=>nt(e));if("_or"in r&&Array.isArray(r._or))return r._or.some(e=>nt(e));if("_and"in r&&Array.isArray(r._and))return r._and.some(e=>nt(e));if("_not"in r)return nt(r._not);for(let[e,t]of Object.entries(r)){if(t===null){if(e==="_eq"||e==="$eq")return!0;continue}if(typeof t=="object"&&("_is_null"in t&&(t._is_null===!0||t._is_null==="true")||"_eq"in t&&t._eq===null||"$eq"in t&&t.$eq===null||nt(t)))return!0}return!1}function Or(r){return r.map(Z)}function Ir(r,e){let t=[],n=[],i=e?.tables?.get(r.rootTable);if(!i)return{scalarFields:t,relations:n};for(let o of r.nodes)if(o.kind==="wildcard")for(let s of i.columns||[])t.includes(s.name)||t.push(s.name);else o.kind==="scalar"?i.columns?.some(a=>a.name===o.name)&&!t.includes(o.name)&&t.push(o.name):o.kind==="relation"&&n.push(Vi(o,i,e));return{scalarFields:t,relations:n}}function Vi(r,e,t){let n=e.relations?.find(l=>l.propertyName===r.propertyName),i,o,s=!1;r.relationType==="many-to-one"||r.relationType==="one-to-one"?n&&De(n)?(i="_id",o=Q(n)||r.propertyName,s=!0):(i=n&&G(n)||r.propertyName,o="_id",s=!1):r.relationType==="one-to-many"?(i="_id",o=n&&Q(n)||r.propertyName,s=!0):n?.mappedBy?(i="_id",o=n.mappedBy,s=!0):(i=r.propertyName,o="_id",s=!1);let a=r.relationType==="one-to-many"||r.relationType==="many-to-many",f=Mr(r.children);return{propertyName:r.propertyName,targetTable:r.targetTable,localField:i,foreignField:o,type:a?"many":"one",isInverse:s,nestedFields:f}}function Mr(r){let e=[];for(let t of r)if(t.kind==="wildcard")e.push("*");else if(t.kind==="scalar")e.push(t.name);else if(t.kind==="relation"){let n=Mr(t.children);if(n.length===0)e.push(`${t.propertyName}.id`);else for(let i of n)e.push(`${t.propertyName}.${i}`)}return e}Ye();At();vt();function sn(r,e,t,n){let i={rootTable:e,nodes:[]};if(!r||r.length===0)return i;let o=t?.tables?.get(e);if(!o)return i;let s=o.columns?.some(c=>c.name==="_id"&&c.isPrimary),a=o.columns?.some(c=>c.name==="id"),f=s&&!a?"_id":"id",l=new Map,u=[];for(let c of r){let p=c==="id"?f:c;if(p==="*")u.push("*");else if(p.includes(".")){let d=p.indexOf("."),g=p.substring(0,d),m=p.substring(d+1);if(!o.relations?.some(b=>b.propertyName===g))continue;l.has(g)||l.set(g,[]),l.get(g).push(m)}else if(o.relations?.some(g=>g.propertyName===p))l.has(p)||l.set(p,[f]);else{if(!o.columns?.some(m=>m.name===p))continue;u.push(p)}}if(u.includes("*")){i.nodes.push({kind:"wildcard"});for(let c of o.relations||[])l.has(c.propertyName)||l.set(c.propertyName,[f])}else for(let c of u)i.nodes.push({kind:"scalar",name:c});for(let[c,p]of l.entries()){let d=o.relations?.find(y=>y.propertyName===c);if(!d)continue;let g=d.targetTableName||d.targetTable,m={kind:"relation",propertyName:c,joinId:null,relationType:d.type,isInverse:!!d.isInverse,targetTable:g,children:Er(p,g,t)};if(d.type==="many-to-one"||d.type==="one-to-one"){let y=n.registerWithParent(e,c,t,"left",null,"data");m.joinId=y}i.nodes.push(m)}return i}function Er(r,e,t){let n=t?.tables?.get(e);if(!n)return[];let i=n.columns?.some(u=>u.name==="_id"&&u.isPrimary),o=n.columns?.some(u=>u.name==="id"),s=i&&!o?"_id":"id",a=new Map,f=[];for(let u of r){let c=u==="id"?s:u;if(c==="*")f.push("*");else if(c.includes(".")){let p=c.indexOf("."),d=c.substring(0,p),g=c.substring(p+1);if(!n.relations?.some(y=>y.propertyName===d))continue;a.has(d)||a.set(d,[]),a.get(d).push(g)}else if(n.relations?.some(d=>d.propertyName===c))a.has(c)||a.set(c,[s]);else{if(!n.columns?.some(g=>g.name===c))continue;f.push(c)}}let l=[];if(f.includes("*")){l.push({kind:"wildcard"});for(let u of n.relations||[])a.has(u.propertyName)||a.set(u.propertyName,[s])}else for(let u of f)l.push({kind:"scalar",name:u});for(let[u,c]of a.entries()){let p=n.relations?.find(g=>g.propertyName===u);if(!p)continue;let d=p.targetTableName||p.targetTable;l.push({kind:"relation",propertyName:u,joinId:null,relationType:p.type,isInverse:!!p.isInverse,targetTable:d,children:Er(c,d,t)})}return l}var K=class{plan(e){let{tableName:t,fields:n,filter:i,sort:o,page:s,limit:a,meta:f,metadata:l,dbType:u}=e,c=l?.tables?.get(t),p=new te,d=this.parseFields(n),g=null;d&&c&&(g=sn(d,t,l,p));let m=!1,y=null;if(i&&c){let A=be(i,t,l,p);y=A.node,m=A.hasRelationFilters}let b=this.parseSort(o),_=[],w=!1;for(let A of b){let O=A.startsWith("-"),j=O?A.substring(1):A,W=O?"desc":"asc";if(j.includes(".")&&c){let Se=j.split(".")[0];if(c.relations?.find(x=>x.propertyName===Se)){let x=this.registerSortJoinChain(j,t,l,p,null);x&&(_.push({joinId:x.lastJoinId,field:x.field,direction:W,fullPath:j}),w=!0);continue}}_.push({joinId:null,field:j,direction:W,fullPath:j})}_.length===0&&_.push({joinId:null,field:"id",direction:"asc",fullPath:"id"});let $=this.parseLimit(a),h=this.parsePage(s),k=h!==void 0&&$!==void 0?(h-1)*$:void 0,S=this.parseMeta(f),R=S.includes("totalCount")||S.includes("*"),F=S.includes("filterCount")||S.includes("*"),X=p.getAll();return{table:t,dbType:u,rawFields:d,rawFilter:i??null,joins:X,sortItems:_,limit:$,offset:k,needsTotalCount:R,needsFilterCount:F,hasRelationFilters:m,hasRelationSort:w,filterTree:y,fieldTree:g}}parseFields(e){if(e)return Array.isArray(e)?e.map(t=>t.trim()).filter(Boolean):e.split(",").map(t=>t.trim()).filter(Boolean)}parseSort(e){return e?(Array.isArray(e)?e:e.split(",")).map(n=>n.trim()).filter(Boolean):[]}parseLimit(e){if(e==null)return;let t=typeof e=="string"?parseInt(e,10):e;if(!Number.isNaN(t))return t<0?0:t}parsePage(e){if(e==null)return;let t=typeof e=="string"?parseInt(e,10):e;return Number.isNaN(t)?void 0:t}parseMeta(e){return e?Array.isArray(e)?e:e.split(",").map(t=>t.trim()).filter(Boolean):[]}registerSortJoinChain(e,t,n,i,o){let s=e.indexOf(".");if(s===-1)return null;let a=e.slice(0,s),f=e.slice(s+1),l=n?.tables?.get(t);if(!l)return null;let u=l.relations?.find(d=>d.propertyName===a);if(!u||u.type!=="many-to-one"&&u.type!=="one-to-one")return null;let c=i.registerWithParent(t,a,n,"left",o,"sort");if(!c)return null;if(!f.includes("."))return{lastJoinId:c,field:f};let p=u.targetTableName||u.targetTable;return this.registerSortJoinChain(f,p,n,i,c)}};Nt();Ft();var Hi=new Set(["count","sum","avg","min","max","countRecords"]),qi=new Set(["int","integer","bigint","float","double","decimal","numeric","real","number"]),Gi=new Set(["_and","_or","_not"]);function we(r){return!!r&&typeof r=="object"&&!Array.isArray(r)}function I(r,e){let t=r.replace(/^aggregate\./,"");throw new E(e,{path:r,aggregate:{[t]:e}})}function Yi(r){return typeof r!="string"?!1:qi.has(r.toLowerCase())}function Pr(r){return Object.keys(r).length===0}function Xi(r,e,t){return r===!0?{}:(r==null&&I(t,`aggregate.${e} condition must be true or an object`),we(r)||I(t,`aggregate.${e} condition must be true or an object`),r)}function Zi(r,e,t){let n=r?.tables?.get(e);return n||I(t,`Table "${e}" metadata is not available`),n}function jr(r,e){let t=r?.targetTableName??r?.targetTable;return(typeof t!="string"||t.length===0)&&I(e,"aggregate.countRecords relation target is not available"),t}function an(r,e,t,n){let i=Zi(t,e,n);for(let[o,s]of Object.entries(r)){if(o==="_and"||o==="_or"){Array.isArray(s)||I(n,`aggregate.countRecords ${o} condition must be an array`);for(let u of s)we(u)||I(n,`aggregate.countRecords ${o} items must be objects`),an(u,e,t,n);continue}if(o==="_not"){we(s)||I(n,"aggregate.countRecords _not condition must be an object"),an(s,e,t,n);continue}(o.startsWith("_")||Gi.has(o))&&I(n,`Unsupported aggregate.countRecords condition key "${o}"`);let a=i.columns?.find(u=>u.name===o),f=i.relations?.find(u=>u.propertyName===o);if(!a&&!f&&I(n,`Unknown aggregate.countRecords field or relation "${o}" on table "${e}"`),we(s)||I(n,`aggregate.countRecords condition for "${o}" must be an object`),a){for(let u of Object.keys(s))Y.has(u)||I(n,`aggregate.countRecords condition for "${o}" only supports field operators`);continue}let l=jr(f,n);an(s,l,t,n)}}function Dn(r){return we(r)&&Object.keys(r).length>0}function rt(r,e,t){if(!Dn(r))return[];we(r)||I("aggregate","aggregate must be an object");let n=t?.tables?.get(e);n||I("aggregate",`Table "${e}" metadata is not available`);let i=[];for(let[o,s]of Object.entries(r)){let a=`aggregate.${o}`;(!o||typeof o!="string")&&I("aggregate","aggregate field name must be a non-empty string"),we(s)||I(a,"aggregate field config must be an object");let f=o,l=a,u=n.columns?.find(d=>d.name===o),c=n.relations?.find(d=>d.propertyName===o);!u&&!c&&I(l,`Unknown aggregate field or relation "${o}" on table "${e}"`);let p=Object.entries(s).filter(([d])=>d!=="as");p.length===0&&I(l,"aggregate field must define at least one operation");for(let[d,g]of p){Hi.has(d)||I(l,`Unsupported aggregate operation "${d}"`);let m=Xi(g,d,l);if(c&&d!=="countRecords"&&I(l,`aggregate.${d} is not supported on relation "${o}"; use countRecords`),u&&d==="countRecords"&&I(l,`aggregate.countRecords requires a relation, but "${o}" is a field`),u&&(d==="sum"||d==="avg")&&!Yi(u.type)&&I(l,`aggregate.${d} requires a numeric field, but "${o}" is "${u.type}"`),u)for(let y of Object.keys(m))Y.has(y)||I(l,`aggregate.${d} condition for "${o}" only supports field operators`);if(c&&d==="countRecords"){let y=jr(c,l);an(m,y,t,l)}i.push({field:o,outputKey:f,path:l,op:d,condition:m})}}return i}function it(r,e){let t=[];return we(r)&&!Pr(r)&&t.push(r),Pr(e.condition)||t.push({[e.field]:e.condition}),t.length===0?{}:t.length===1?t[0]:{_and:t}}function Te(r,e,t){r[e.outputKey]??={},r[e.outputKey][e.op]=t}var ot=class{constructor(e,t){this.mongoService=e;this.mongoPhysicalMigrationService=t;this.debugLog=[];this.lastBuiltPipeline=null;this.db=e.getDb()}async execute(e){if(this.metadata=e.metadata,this.dbType=e.dbType||"mongodb",!e.plan){let p=new K;e={...e,plan:p.plan({tableName:e.tableName,fields:e.fields,filter:e.filter,sort:e.sort,page:e.page,limit:e.limit,meta:e.meta,metadata:e.metadata,dbType:"mongodb"})}}let t=e.debugLog||[];this.debugLog=t;let n={table:e.tableName,aggregate:e.aggregate,metadata:e.metadata};if(e.pipeline&&(n.pipeline=e.pipeline),e.fields&&(Array.isArray(e.fields)?n.fields=e.fields:typeof e.fields=="string"&&(n.fields=e.fields.split(",").map(p=>p.trim()))),e.filter&&(B(e.filter,e.tableName,e.metadata),n.mongoRawFilter=e.filter),e.sort){let p=Array.isArray(e.sort)?e.sort:e.sort.split(",").map(d=>d.trim());n.sort=p.map(d=>{let g=d.trim();return g.startsWith("-")?{field:g.substring(1),direction:"desc"}:{field:g,direction:"asc"}})}else n.sort=[{field:"id",direction:"asc"}];if(e.page&&e.limit){let p=typeof e.page=="string"?parseInt(e.page,10):e.page,d=typeof e.limit=="string"?parseInt(e.limit,10):e.limit;n.offset=(p-1)*d,n.limit=d}else e.limit&&(n.limit=typeof e.limit=="string"?parseInt(e.limit,10):e.limit);let i=Array.isArray(e.meta)?e.meta:(e.meta||"").split(",").map(p=>p.trim()).filter(Boolean),o=0,s=0;(i.includes("totalCount")||i.includes("*"))&&(o=await this.mongoService.collection(e.tableName).countDocuments({}));let a=this.metadata?.tables?.get(e.tableName),f=new Set((a?.relations??[]).map(p=>p.propertyName)),l=!!n.mongoRawFilter&&ee(n.mongoRawFilter,f);if((i.includes("filterCount")||i.includes("*"))&&!l){let p=this.mongoService.collection(e.tableName),d=e.plan?.filterTree?Ke(e.plan.filterTree,{metadata:this.metadata,rootTable:e.tableName}):{};s=await p.countDocuments(d)}this.lastBuiltPipeline=null,n.plan=e.plan,n.deep=e.deep;let u=await this.selectLegacy(n);if(e.debugMode){let p=this.lastBuiltPipeline??[],d;try{d=await this.db.collection(e.tableName).aggregate(p).explain()}catch(g){d={error:String(g)}}return{pipeline:p,explain:d}}if(l&&(i.includes("filterCount")||i.includes("*"))){let p={...n,mongoCountOnly:!0},d=await this.selectLegacy(p);s=d.length>0?d[0].count:0}let c=await this.executeAggregate(n,e.filter);return{data:u,...(i.length>0||c)&&{meta:{...i.includes("totalCount")||i.includes("*")?{totalCount:o}:{},...i.includes("filterCount")||i.includes("*")?{filterCount:s}:{},...c?{aggregate:c}:{}}}}}async selectLegacy(e){let t=[];if(e.fields&&e.fields.length>0){let s=e.plan;if(s?.fieldTree?e.mongoFieldsExpanded=Ir(s.fieldTree,this.metadata):(console.warn(`[mongo-executor:fallback] expandFieldsMongo path hit for table=${e.table} fields=${JSON.stringify(e.fields)}`),e.mongoFieldsExpanded=await Jt(this.metadata,e.table,e.fields)),this.mongoPhysicalMigrationService&&e.mongoFieldsExpanded){let a=await this.mongoPhysicalMigrationService.augmentScalarProjection(e.table,e.mongoFieldsExpanded.scalarFields);e.mongoFieldsExpanded={...e.mongoFieldsExpanded,scalarFields:a.scalarFields},t=a.hiddenFields}}e.where&&(e.where=e.where.map(s=>s.field.includes(".")?s:{...s,field:`${e.table}.${s.field}`}));let n=this.db.collection(e.table);if(e.pipeline)return this.debugLog&&this.debugLog.push({type:"MongoDB Custom Pipeline",collection:e.table,pipeline:JSON.parse(JSON.stringify(e.pipeline))}),(await n.aggregate(e.pipeline).toArray()).map(Z);let{results:i,pipeline:o}=await Ln(n,e,{db:this.db,metadata:this.metadata,dbType:this.dbType,debugLog:this.debugLog,mongoPhysicalMigrationService:this.mongoPhysicalMigrationService});return this.lastBuiltPipeline=o,this.mongoPhysicalMigrationService?await this.mongoPhysicalMigrationService.applyReadFallback(e.table,i,t):i}async executeAggregationPipeline(e,t){let{results:n,pipeline:i}=await Ln(e,t,{db:this.db,metadata:this.metadata,dbType:this.dbType,debugLog:this.debugLog,mongoPhysicalMigrationService:this.mongoPhysicalMigrationService});return this.lastBuiltPipeline=i,n}async executeAggregate(e,t){let n=rt(e.aggregate,e.table,e.metadata);if(n.length===0)return;let i={},o=this.db.collection(e.table);for(let s of n){let a=it(t,s);B(a,e.table,e.metadata);let l=new K().plan({tableName:e.table,filter:a,metadata:e.metadata,dbType:"mongodb"});if(s.op==="countRecords"){let p=await this.executeRelationCountRecords(e,t,s);Te(i,s,p);continue}let u=l.hasRelationFilters?await ae(a,e.table,e.metadata,this.db):l.filterTree?Ke(l.filterTree,{metadata:e.metadata,rootTable:e.table}):{},c;if(s.op==="count")c=await o.countDocuments(u);else{let[{value:p}={value:null}]=await o.aggregate([{$match:u},{$group:{_id:null,value:{[`$${s.op}`]:`$${s.field}`}}}]).toArray();c=p??0}Te(i,s,c)}return i}async executeRelationCountRecords(e,t,n){let o=e.metadata?.tables?.get(e.table)?.relations?.find(u=>u.propertyName===n.field),s=o?.targetTableName||o?.targetTable,a=s?e.metadata?.tables?.get(s):null;if(!o||!s||!a)return 0;let f=await this.resolveMatchFilter(e.table,t,e.metadata),l=await this.resolveMatchFilter(s,n.condition,e.metadata);if(o.type==="one-to-many"){let c=(await this.db.collection(e.table).find(f,{projection:{_id:1}}).toArray()).map(p=>p._id).filter(p=>p!=null);return c.length===0?0:await this.db.collection(s).countDocuments({$and:[l,{[o.foreignKeyColumn]:{$in:c}}]})}if(o.type==="many-to-many"){let u=Ve(e.table,o);if(!u)return 0;let p=(await this.db.collection(e.table).find(f,{projection:{_id:1}}).toArray()).map(m=>m._id).filter(m=>m!=null);if(p.length===0)return 0;let g=(await this.db.collection(u.junctionName).find({[u.selfColumn]:{$in:p}},{projection:{[u.otherColumn]:1}}).toArray()).map(m=>m[u.otherColumn]).filter(m=>m!=null);return g.length===0?0:await this.db.collection(s).countDocuments({$and:[l,{_id:{$in:g}}]})}if(o.type==="many-to-one"||o.type==="one-to-one"){let u=o.foreignKeyColumn||`${n.field}Id`,p=(await this.db.collection(e.table).find(f,{projection:{[u]:1}}).toArray()).map(d=>d[u]).filter(d=>d!=null);return p.length===0?0:await this.db.collection(s).countDocuments({$and:[l,{_id:{$in:p}}]})}return 0}async resolveMatchFilter(e,t,n){if(!t||Object.keys(t).length===0)return{};B(t,e,n);let o=new K().plan({tableName:e,filter:t,metadata:n,dbType:"mongodb"});return o.hasRelationFilters?await ae(t,e,n,this.db):o.filterTree?Ke(o.filterTree,{metadata:n,rootTable:e}):{}}};var ln=class{constructor(e){this.context=e}log(e){console.log(this.format(e))}warn(e){console.warn(this.format(e))}error(e,t){console.error(this.format(e)),t&&console.error(t)}debug(e){process.env.DEBUG&&console.debug(this.format(e))}verbose(e){process.env.DEBUG&&console.debug(this.format(e))}fatal(e,t){this.error(e,t)}format(e){let t=typeof e=="string"?e:JSON.stringify(e);return this.context?`[${this.context}] ${t}`:t}};var eo=["_and","_or","_not"];function ue(r){if(!r||typeof r!="object")return!1;if(Array.isArray(r))return r.some(e=>ue(e));for(let e of Object.keys(r))if(eo.includes(e)||typeof r[e]=="object"&&r[e]!==null&&ue(r[e]))return!0;return!1}var Lr=["_eq","_neq","_gt","_gte","_lt","_lte","_in","_not_in","_nin","_contains","_starts_with","_ends_with","_between","_is_null","_is_not_null"];function to(r){return{_eq:"=",_neq:"!=",_gt:">",_gte:">=",_lt:"<",_lte:"<=",_in:"in",_not_in:"not in"}[r]||r}function cn(r,e,t){if(!t)return!1;let n=r;if(r.includes(".")){let s=r.split(".");n=s[s.length-1]}let i=t.columns.find(s=>s.name===n);if(!i)return!1;let o=i.type?.toLowerCase()||"";return o==="uuid"||o==="uuidv4"||o.includes("uuid")}function no(r,e,t,n,i){return n!=="postgres"||typeof e!="string"||!/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(e)||cn(r,t,i),e}function Dr(r,e,t,n,i,o,s){let a=i&&!e.includes(".")?`${i}.${e}`:e,f=cn(e,i,s),l=no(e,n,i,o,s);switch(t){case"_eq":f&&o==="postgres"&&typeof n=="string"?r.whereRaw(`${a} = ?::uuid`,[n]):r.where(a,"=",l);break;case"_neq":f&&o==="postgres"&&typeof n=="string"?r.whereRaw(`${a} != ?::uuid`,[n]):r.where(a,"!=",l);break;case"_gt":f&&o==="postgres"&&typeof n=="string"?r.whereRaw(`${a} > ?::uuid`,[n]):r.where(a,">",l);break;case"_gte":f&&o==="postgres"&&typeof n=="string"?r.whereRaw(`${a} >= ?::uuid`,[n]):r.where(a,">=",l);break;case"_lt":f&&o==="postgres"&&typeof n=="string"?r.whereRaw(`${a} < ?::uuid`,[n]):r.where(a,"<",l);break;case"_lte":f&&o==="postgres"&&typeof n=="string"?r.whereRaw(`${a} <= ?::uuid`,[n]):r.where(a,"<=",l);break;case"_in":let u=n;Array.isArray(u)||(u=typeof u=="string"&&u.includes(",")?u.split(",").map(p=>p.trim()):[u]),f&&o==="postgres"&&u.every(p=>typeof p=="string")?r.whereRaw(`${a} = ANY(?::uuid[])`,[u]):r.whereIn(a,u);break;case"_not_in":case"_nin":let c=n;Array.isArray(c)||(c=typeof c=="string"&&c.includes(",")?c.split(",").map(p=>p.trim()):[c]),f&&o==="postgres"&&c.every(p=>typeof p=="string")?r.whereRaw(`${a} != ALL(?::uuid[])`,[c]):r.whereNotIn(a,c);break;case"_contains":o==="postgres"?r.whereRaw(`lower(unaccent(${a})) ILIKE '%' || lower(unaccent(?)) || '%'`,[n]):o==="sqlite"?r.whereRaw(`lower(${a}) LIKE '%' || lower(?) || '%'`,[n]):r.whereRaw(`lower(unaccent(${a})) COLLATE utf8mb4_general_ci LIKE CONCAT('%', lower(unaccent(?)) COLLATE utf8mb4_general_ci, '%')`,[n]);break;case"_starts_with":o==="postgres"?r.whereRaw(`lower(unaccent(${a})) ILIKE lower(unaccent(?)) || '%'`,[n]):o==="sqlite"?r.whereRaw(`lower(${a}) LIKE lower(?) || '%'`,[n]):r.whereRaw(`lower(unaccent(${a})) COLLATE utf8mb4_general_ci LIKE CONCAT(lower(unaccent(?)) COLLATE utf8mb4_general_ci, '%')`,[n]);break;case"_ends_with":o==="postgres"?r.whereRaw(`lower(unaccent(${a})) ILIKE '%' || lower(unaccent(?))`,[n]):o==="sqlite"?r.whereRaw(`lower(${a}) LIKE '%' || lower(?)`,[n]):r.whereRaw(`lower(unaccent(${a})) COLLATE utf8mb4_general_ci LIKE CONCAT('%', lower(unaccent(?)) COLLATE utf8mb4_general_ci)`,[n]);break;case"_between":Array.isArray(n)&&n.length===2&&r.whereBetween(a,[n[0],n[1]]);break;case"_is_null":n===!0?r.whereNull(a):r.whereNotNull(a);break;case"_is_not_null":n===!0?r.whereNotNull(a):r.whereNull(a);break;default:r.where(a,to(t),n)}}function ro(r,e,t){if(!t||!e||r.startsWith("_"))return!0;let n=r.includes(".")?r.split(".").pop():r,i=t.columns?.some(s=>s.name===n),o=t.relations?.some(s=>s.propertyName===n);return i||o}function st(r,e,t,n="and",i,o){if(!(!e||typeof e!="object")){if(Array.isArray(e)){for(let s of e)n==="and"?r.where(function(){st(this,s,t,"and",i,o)}):r.orWhere(function(){st(this,s,t,"and",i,o)});return}for(let[s,a]of Object.entries(e))if(ro(s,t,o)){if(s==="_and"){Array.isArray(a)&&r.where(function(){for(let f of a)this.where(function(){st(this,f,t,"and",i,o)})});continue}if(s==="_or"){Array.isArray(a)&&r.where(function(){for(let f of a)this.orWhere(function(){st(this,f,t,"and",i,o)})});continue}if(s==="_not"){r.whereNot(function(){st(this,a,t,"and",i,o)});continue}if(typeof a=="object"&&a!==null)if(Object.keys(a).some(l=>Lr.includes(l)))for(let[l,u]of Object.entries(a))Lr.includes(l)&&(n==="and"?r.where(function(){Dr(this,s,l,u,t,i,o)}):r.orWhere(function(){Dr(this,s,l,u,t,i,o)}));else{let l=t&&!s.includes(".")?`${t}.${s}`:s;cn(s,t,o)&&i==="postgres"&&typeof a=="string"&&/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(a)?n==="and"?r.whereRaw(`${l} = ?::uuid`,[a]):r.orWhereRaw(`${l} = ?::uuid`,[a]):n==="and"?r.where(l,"=",a):r.orWhere(l,"=",a)}else{let f=t&&!s.includes(".")?`${t}.${s}`:s;cn(s,t,o)&&i==="postgres"&&typeof a=="string"&&/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(a)?n==="and"?r.whereRaw(`${f} = ?::uuid`,[a]):r.orWhereRaw(`${f} = ?::uuid`,[a]):n==="and"?r.where(f,"=",a):r.orWhere(f,"=",a)}}}}function re(r,e,t,n,i){return!e||typeof e!="object"||st(r,e,t,"and",n,i),r}$e();function Wn(r,e,t){return`${N(r,t)}.${N(e,t)}`}function ke(r,e){return r==null?"NULL":typeof r=="string"?`'${r.replace(/'/g,"''")}'`:typeof r=="boolean"?r?"true":"false":typeof r=="number"?String(r):`'${String(r).replace(/'/g,"''")}'`}function Br(r,e){if(!e)return!1;let t=e.columns.find(i=>i.name===r);if(!t)return!1;let n=t.type?.toLowerCase()||"";return n==="uuid"||n==="uuidv4"||n.includes("uuid")}function at(r){return r===!0||r==="true"?!0:r===!1||r==="false"?!1:null}async function Un(r,e,t,n,i,o){let s=[];for(let[a,f]of Object.entries(o)){let l=await Mt(r,e,a,f,t,n,i);if(l!==null)s.push(`EXISTS (${l})`);else{let u=t.relations.find(c=>c.propertyName===a);if(u&&u.foreignKeyColumn){let c=Wn(e,u.foreignKeyColumn,n),d=f.id;if(d&&typeof d=="object"){let g=at(d._is_null),m=at(d._is_not_null);if(g===!0)s.push(`${c} IS NULL`);else if(g===!1)s.push(`${c} IS NOT NULL`);else if(m===!0)s.push(`${c} IS NOT NULL`);else if(m===!1)s.push(`${c} IS NULL`);else if(d._eq!==void 0){let y=ke(d._eq,n);s.push(`${c} = ${y}`)}else if(d._neq!==void 0){let y=ke(d._neq,n);s.push(`${c} != ${y}`)}else if(d._in!==void 0){let b=(Array.isArray(d._in)?d._in:[d._in]).map(_=>ke(_,n)).join(", ");s.push(`${c} IN (${b})`)}else if(d._not_in!==void 0||d._nin!==void 0){let y=d._not_in??d._nin,_=(Array.isArray(y)?y:[y]).map(w=>ke(w,n)).join(", ");s.push(`${c} NOT IN (${_})`)}else if(d._gt!==void 0){let y=ke(d._gt,n);s.push(`${c} > ${y}`)}else if(d._gte!==void 0){let y=ke(d._gte,n);s.push(`${c} >= ${y}`)}else if(d._lt!==void 0){let y=ke(d._lt,n);s.push(`${c} < ${y}`)}else if(d._lte!==void 0){let y=ke(d._lte,n);s.push(`${c} <= ${y}`)}}}}}return s}function Qn(r){return!r||typeof r!="object"||Array.isArray(r)?!1:!!(r._and&&Array.isArray(r._and)||r._or&&Array.isArray(r._or)||r._not!==void 0&&r._not!==null)}async function Bn(r,e,t,n,i,o){let s=[];for(let a of r)if(a._and&&Array.isArray(a._and)&&a._and.length>0){let f=[];for(let l of a._and)if(Qn(l)){let u=e(t).select(`${t}.id`);await We(e,u,l,t,n,i,o),f.push({idSubquery:u})}else{let{fieldFilters:u,relationFilters:c}=V(l,n),p=await Un(e,t,n,i,o,c);f.push({fieldFilters:u,subqueries:p})}s.push(f)}else if(Qn(a)){let f=e(t).select(`${t}.id`);await We(e,f,a,t,n,i,o),s.push([{idSubquery:f}])}else{let{fieldFilters:f,relationFilters:l}=V(a,n),u=await Un(e,t,n,i,o,l);s.push([{fieldFilters:f,subqueries:u}])}return s}function Kr(r,e,t,n,i){if("idSubquery"in e&&e.idSubquery){r.whereIn(`${t}.id`,e.idSubquery);return}let o=e;Object.keys(o.fieldFilters).length===0&&o.subqueries.length===0||r.where(function(){Object.keys(o.fieldFilters).length>0&&re(this,o.fieldFilters,t,i,n);for(let s of o.subqueries)this.whereRaw(s)})}function Kn(r,e,t,n,i){let o=!0;for(let s of e){let a=function(){for(let f of s)Kr(this,f,t,n,i)};o?(r.where(a),o=!1):r.orWhere(a)}}function un(r,e,t,n,i,o,s){let a=Br(e,i),f=Br(n,o),l=`${N(r,s)}.${N(e,s)}`,u=`${N(t,s)}.${N(n,s)}`;if(s==="postgres"){if(a&&!f)return`${l} = ${u}::uuid`;if(!a&&f)return`${l}::uuid = ${u}`}return`${l} = ${u}`}async function Mt(r,e,t,n,i,o,s){let a=i.relations.find(p=>p.propertyName===t);if(!a)throw new Error(`Relation "${t}" not found in table "${e}"`);let f=a.targetTableName||a.targetTable;if(!f)throw new Error(`Relation "${t}" in table "${e}" is missing targetTable/targetTableName. Relation metadata: ${JSON.stringify(a,null,2)}`);let l=new Set(["_is_null","_is_not_null","_eq","_neq","_in","_not_in","_nin","_gt","_gte","_lt","_lte"]);if((a.type==="many-to-one"||a.type==="one-to-one")&&a.foreignKeyColumn){let p=Object.keys(n||{});if(p.length===1&&p[0]==="id"&&typeof n.id=="object"&&Object.keys(n.id).every(g=>l.has(g)))return null}let u=s?await s(f):null,c;switch(a.type){case"one-to-many":c=r(f).select(r.raw("1")).whereRaw(un(f,a.foreignKeyColumn,e,"id",u,i,o));break;case"many-to-many":let p=s?await s(a.junctionTableName):null;c=r(a.junctionTableName).select(r.raw("1")).join(f,r.raw(un(a.junctionTableName,a.junctionTargetColumn,f,"id",p,u,o))).whereRaw(un(a.junctionTableName,a.junctionSourceColumn,e,"id",p,i,o));break;case"many-to-one":case"one-to-one":c=r(f).select(r.raw("1")).whereRaw(un(f,"id",e,a.foreignKeyColumn,u,i,o));break;default:throw new Error(`Unsupported relation type: ${a.type}`)}return s?u?await We(r,c,n,f,u,o,s):c=re(c,n,f,o,u||void 0):c=re(c,n,f,o),c.toString()}async function We(r,e,t,n,i,o,s){if(!t||typeof t!="object")return;if(t._and&&Array.isArray(t._and)){for(let l of t._and)if(l._or&&Array.isArray(l._or)&&l._or.length>0){let u=await Bn(l._or,r,n,i,o,s);e.where(function(){Kn(this,u,n,i,o)})}else if(l._and&&Array.isArray(l._and)&&l._and.length>0)for(let u of l._and)await We(r,e,u,n,i,o,s);else await We(r,e,l,n,i,o,s);return}if(t._or&&Array.isArray(t._or)){let l=await Bn(t._or,r,n,i,o,s);e.where(function(){Kn(this,l,n,i,o)});return}if(t._not){let l=t._not;if(l._and&&Array.isArray(l._and)&&l._and.length>0){let p=[];for(let d of l._and)if(Qn(d)){let g=r(n).select(`${n}.id`);await We(r,g,d,n,i,o,s),p.push({idSubquery:g})}else{let{fieldFilters:g,relationFilters:m}=V(d,i),y=await Un(r,n,i,o,s,m);p.push({fieldFilters:g,subqueries:y})}e.whereNot(function(){for(let d of p)Kr(this,d,n,i,o)});return}if(l._or&&Array.isArray(l._or)&&l._or.length>0){let p=await Bn(l._or,r,n,i,o,s);e.whereNot(function(){Kn(this,p,n,i,o)});return}let{fieldFilters:u,relationFilters:c}=V(l,i);e.whereNot(function(){Object.keys(u).length>0&&re(this,u,n,o,i)});for(let[p,d]of Object.entries(c)){let g=await Mt(r,n,p,d,i,o,s);if(g===null){let m=i.relations.find(y=>y.propertyName===p);if(m&&m.foreignKeyColumn){let y=Wn(n,m.foreignKeyColumn,o),_=d.id;if(_&&typeof _=="object"){let w=at(_._is_null),$=at(_._is_not_null);if(w===!0)e.whereRaw(`${y} IS NOT NULL`);else if(w===!1)e.whereRaw(`${y} IS NULL`);else if($===!0)e.whereRaw(`${y} IS NULL`);else if($===!1)e.whereRaw(`${y} IS NOT NULL`);else if(_._eq!==void 0)e.whereRaw(`${y} != ?`,[_._eq]);else if(_._neq!==void 0)e.whereRaw(`${y} = ?`,[_._neq]);else if(_._in!==void 0){let h=Array.isArray(_._in)?_._in:[_._in];e.whereRaw(`${y} NOT IN (${h.map(()=>"?").join(", ")})`,h)}else if(_._not_in!==void 0||_._nin!==void 0){let h=_._not_in??_._nin,k=Array.isArray(h)?h:[h];e.whereRaw(`${y} IN (${k.map(()=>"?").join(", ")})`,k)}}}}else e.whereRaw(`NOT EXISTS (${g})`)}return}let{fieldFilters:a,relationFilters:f}=V(t,i);Object.keys(a).length>0&&re(e,a,n,o,i);for(let[l,u]of Object.entries(f)){let c=await Mt(r,n,l,u,i,o,s);if(c===null){let p=i.relations.find(d=>d.propertyName===l);if(p&&p.foreignKeyColumn){let d=Wn(n,p.foreignKeyColumn,o),m=u.id;if(m&&typeof m=="object"){let y=at(m._is_null),b=at(m._is_not_null);if(y===!0)e.whereRaw(`${d} IS NULL`);else if(y===!1)e.whereRaw(`${d} IS NOT NULL`);else if(b===!0)e.whereRaw(`${d} IS NOT NULL`);else if(b===!1)e.whereRaw(`${d} IS NULL`);else if(m._eq!==void 0)e.whereRaw(`${d} = ?`,[m._eq]);else if(m._neq!==void 0)e.whereRaw(`${d} != ?`,[m._neq]);else if(m._in!==void 0){let _=Array.isArray(m._in)?m._in:[m._in];e.whereRaw(`${d} IN (${_.map(()=>"?").join(", ")})`,_)}else if(m._not_in!==void 0||m._nin!==void 0){let _=m._not_in??m._nin,w=Array.isArray(_)?_:[_];e.whereRaw(`${d} NOT IN (${w.map(()=>"?").join(", ")})`,w)}}}}else e.whereRaw(`EXISTS (${c})`)}}async function Ue(r,e,t,n,i,o,s){await We(r,e,t,n,i,o,s)}$e();zn();Ye();Le();$e();function lt(r,e,t,n,i){for(let o of e){let s=o.field.split("."),a=t||s[0],f=s[s.length-1],l=Et(n,a,f,o.value);switch(o.operator){case"=":r=r.where(o.field,"=",l);break;case"!=":r=r.where(o.field,"!=",l);break;case">":r=r.where(o.field,">",l);break;case"<":r=r.where(o.field,"<",l);break;case">=":r=r.where(o.field,">=",l);break;case"<=":r=r.where(o.field,"<=",l);break;case"like":r=r.where(o.field,"like",l);break;case"in":let u=Array.isArray(o.value)?o.value.map(m=>Et(n,a,f,m)):[l];r=r.whereIn(o.field,u);break;case"not in":let c=Array.isArray(o.value)?o.value.map(m=>Et(n,a,f,m)):[l];r=r.whereNotIn(o.field,c);break;case"is null":r=r.whereNull(o.field);break;case"is not null":r=r.whereNotNull(o.field);break;case"_contains":r=r.where(o.field,"like",`%${o.value}%`);break;case"_starts_with":r=r.where(o.field,"like",`${o.value}%`);break;case"_ends_with":r=r.where(o.field,"like",`%${o.value}`);break;case"_between":let p=o.value;if(typeof p=="string"&&(p=p.split(",").map(m=>m.trim())),Array.isArray(p)&&p.length===2){let m=Et(n,a,f,p[0]),y=Et(n,a,f,p[1]);r=r.whereBetween(o.field,[m,y])}break;case"_is_null":r=l===!0||l==="true"?r.whereNull(o.field):r.whereNotNull(o.field);break;case"_is_not_null":r=l===!0||l==="true"?r.whereNotNull(o.field):r.whereNull(o.field);break}}return r}function Pt(r,e,t,n){let i=[],o=t;if(!r||typeof r!="object")return i;for(let[s,a]of Object.entries(r))if(s==="_and"&&Array.isArray(a)){let f=a.map(l=>{let u=Pt(l,e,t,n);return u.length>0?`(${u.join(" AND ")})`:null}).filter(l=>l!==null);f.length>0&&i.push(`(${f.join(" AND ")})`)}else if(s==="_or"&&Array.isArray(a)){let f=a.map(l=>{let u=Pt(l,e,t,n);return u.length>0?`(${u.join(" AND ")})`:null}).filter(l=>l!==null);f.length>0&&i.push(`(${f.join(" OR ")})`)}else if(s==="_not"&&typeof a=="object"&&a!==null){let f=Pt(a,e,t,n);f.length>0&&i.push(`NOT (${f.join(" AND ")})`)}else if(typeof a=="object"&&a!==null&&!Array.isArray(a))for(let[f,l]of Object.entries(a)){let u=`${N(e,n)}.${N(s,n)}`,c;if(l===null)c="NULL";else if(typeof l=="string"){let p=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,d=o.columns?.find(m=>m.name===s);d&&(d.type?.toLowerCase()==="uuid"||d.type?.toLowerCase().includes("uuid"))&&p.test(l)&&n==="postgres"?c=`'${l}'::uuid`:c=`'${l.replace(/'/g,"''")}'`}else typeof l=="boolean"?c=l?"true":"false":typeof l=="number"?c=String(l):c=`'${String(l).replace(/'/g,"''")}'`;if(f==="_eq")i.push(`${u} = ${c}`);else if(f==="_neq")i.push(`${u} != ${c}`);else if(f==="_gt")i.push(`${u} > ${c}`);else if(f==="_gte")i.push(`${u} >= ${c}`);else if(f==="_lt")i.push(`${u} < ${c}`);else if(f==="_lte")i.push(`${u} <= ${c}`);else if(f==="_is_null")i.push(`${u} IS NULL`);else if(f==="_is_not_null")i.push(`${u} IS NOT NULL`);else if(f==="_in"){let d=(Array.isArray(l)?l:[l]).map(g=>typeof g=="string"?`'${g.replace(/'/g,"''")}'`:String(g)).join(", ");i.push(`${u} IN (${d})`)}else if(f==="_not_in"||f==="_nin"){let d=(Array.isArray(l)?l:[l]).map(g=>typeof g=="string"?`'${g.replace(/'/g,"''")}'`:String(g)).join(", ");i.push(`${u} NOT IN (${d})`)}else if(f==="_contains"){let p=String(l).replace(/'/g,"''");n==="postgres"?i.push(`lower(unaccent(${u})) ILIKE '%' || lower(unaccent('${p}')) || '%'`):n==="mysql"?i.push(`lower(unaccent(${u})) COLLATE utf8mb4_general_ci LIKE CONCAT('%', lower(unaccent('${p}')) COLLATE utf8mb4_general_ci, '%')`):i.push(`lower(${u}) LIKE '%${p.toLowerCase()}%'`)}else if(f==="_starts_with"){let p=String(l).replace(/'/g,"''");n==="postgres"?i.push(`lower(unaccent(${u})) ILIKE lower(unaccent('${p}')) || '%'`):n==="mysql"?i.push(`lower(unaccent(${u})) COLLATE utf8mb4_general_ci LIKE CONCAT(lower(unaccent('${p}')) COLLATE utf8mb4_general_ci, '%')`):i.push(`lower(${u}) LIKE '${p.toLowerCase()}%'`)}else if(f==="_ends_with"){let p=String(l).replace(/'/g,"''");n==="postgres"?i.push(`lower(unaccent(${u})) ILIKE '%' || lower(unaccent('${p}'))`):n==="mysql"?i.push(`lower(unaccent(${u})) COLLATE utf8mb4_general_ci LIKE CONCAT('%', lower(unaccent('${p}')) COLLATE utf8mb4_general_ci)`):i.push(`lower(${u}) LIKE '%${p.toLowerCase()}'`)}else if(f==="_between"&&Array.isArray(l)&&l.length===2){let p=typeof l[0]=="string"?`'${l[0].replace(/'/g,"''")}'`:String(l[0]),d=typeof l[1]=="string"?`'${l[1].replace(/'/g,"''")}'`:String(l[1]);i.push(`${u} BETWEEN ${p} AND ${d}`)}}else{let f=`${N(e,n)}.${N(s,n)}`,l;a===null?l="NULL":typeof a=="string"?l=`'${a.replace(/'/g,"''")}'`:typeof a=="boolean"?l=a?"true":"false":l=String(a),i.push(`${f} = ${l}`)}return i}function Ur(r){return r==null?"NULL":typeof r=="string"?`'${r.replace(/'/g,"''")}'`:typeof r=="boolean"?r?"true":"false":typeof r=="number"?String(r):`'${String(r).replace(/'/g,"''")}'`}function Et(r,e,t,n){if(n==null)return n;let i=r?.tables?.get(e);if(!i?.columns)return n;let o=i.columns.find(s=>s.name===t);if(!o)return n;switch(o.type){case"int":case"integer":case"bigint":case"smallint":case"tinyint":return typeof n=="string"?parseInt(n,10):Number(n);case"float":case"double":case"decimal":case"numeric":case"real":return typeof n=="string"?parseFloat(n):Number(n);case"boolean":case"bool":return typeof n=="string"?n==="true"||n==="1":!!n;case"date":case"datetime":case"timestamp":return typeof n=="string"?new Date(n):n;default:return n}}$e();dn();Le();async function Jr(r,e,t,n,i,o,s){if(!n)return{select:t};try{let{expandFieldsToJoinsAndSelect:a}=await Promise.resolve().then(()=>(Hn(),Qr)),f=await a(e,t,n,i,o,s);return{select:f.select,batchFetchDescriptors:f.batchFetchDescriptors}}catch{return{select:t}}}function qn(r){let e=r;return e?async t=>{let n=e.tables?.get(t);return n?{name:n.name,columns:(n.columns||[]).map(i=>({name:i.name,type:i.type})),relations:n.relations||[]}:null}:null}function zr(r,e,t,n,i){let o=r.targetTableName||r.targetTable;if(!o)return null;let s=r.foreignKeyColumn||L(o);if(!s)return null;let a=c=>N(c,i),f=n?.tables?.get(o),u=(f?fe(f):null)?.name||"id";return`(SELECT ${a(o)}.${a(e)} FROM ${a(o)} WHERE ${a(o)}.${a(u)} = ${a(t)}.${a(s)})`}var ut=class r{constructor(e,t,n,i){this.knex=e;this.dbType=t;this.knexService=n;this.maxQueryDepth=i;this.logger=new ln(r.name);this.debugLog=[]}async execute(e){let t=performance.now();this.metadata=e.metadata;let n=e.debugLog||[];this.debugLog=n;let i=e.debugTrace;if(e.filter&&B(e.filter,e.tableName,e.metadata),!e.plan){let T=new K;e={...e,plan:T.plan({tableName:e.tableName,fields:e.fields,filter:e.filter,sort:e.sort,page:e.page,limit:e.limit,meta:e.meta,metadata:e.metadata,dbType:this.dbType})}}let o=e.plan,s=e.metadata?.tables?.get(e.tableName),a=s?.relations&&s.relations.length>0,f=e.deep&&typeof e.deep=="object"&&Object.keys(e.deep).length>0,l=o.rawFields&&o.rawFields.length>0&&!o.rawFields.includes("*");if(o.joins.length===0&&!o.hasRelationFilters&&!o.hasRelationSort&&!f&&!a&&l){i&&i.setQueryPath("simple");let T=await this.executeSimple(e,o);return i&&i.dur("sql_executor",t,{table:e.tableName}),T}let c={table:e.tableName,aggregate:e.aggregate,metadata:e.metadata};e.fields&&(Array.isArray(e.fields)?c.fields=e.fields:typeof e.fields=="string"&&(c.fields=e.fields.split(",").map(T=>T.trim())));let p=e.filter;if(e.filter&&!ue(e.filter)){c.where=[];for(let[T,x]of Object.entries(e.filter))if(typeof x=="object"&&x!==null)for(let[C,xe]of Object.entries(x)){let v;if(C==="_eq")v="=";else if(C==="_neq")v="!=";else if(C==="_in")v="in";else if(C==="_not_in"||C==="_nin")v="not in";else if(C==="_gt")v=">";else if(C==="_gte")v=">=";else if(C==="_lt")v="<";else if(C==="_lte")v="<=";else if(C==="_contains")v="_contains";else if(C==="_starts_with")v="_starts_with";else if(C==="_ends_with")v="_ends_with";else if(C==="_between")v="_between";else if(C==="_is_null")v="_is_null";else if(C==="_is_not_null")v="_is_not_null";else if(C==="_like")v="like";else if(C==="_ilike")v="ilike";else continue;c.where.push({field:T,operator:v,value:xe})}else c.where.push({field:T,operator:"=",value:x})}if(e.sort){let T=Array.isArray(e.sort)?e.sort:e.sort.split(",").map(x=>x.trim());c.sort=T.map(x=>{let C=x.trim();return C.startsWith("-")?{field:C.substring(1),direction:"desc"}:{field:C,direction:"asc"}})}else c.sort=[{field:"id",direction:"asc"}];let d=e.limit===void 0||e.limit===null?void 0:typeof e.limit=="string"?parseInt(e.limit,10):e.limit,g=d===void 0||Number.isNaN(d)?void 0:d<0?0:d,m=e.page===void 0||e.page===null?void 0:typeof e.page=="string"?parseInt(e.page,10):e.page,y=m===void 0||Number.isNaN(m)?void 0:m;y&&g!==void 0?(c.offset=(y-1)*g,c.limit=g):g!==void 0&&(c.limit=g);let b=e.plan?.sortItems??(c.sort??[]).map(T=>({joinId:null,field:T.field,direction:T.direction,fullPath:T.field})),_=[],w=[];for(let T of b)if(T.joinId===null){if(T.field.includes(".")&&!e.plan){let x=T.field.split(".")[0];if(this.metadata?.tables?.get(c.table)?.relations?.some(v=>v.propertyName===x))continue}_.push({field:T.field.includes(".")?T.field:`${c.table}.${T.field}`,direction:T.direction})}else{let x=e.plan?.joins.find(C=>C.id===T.joinId);if(x&&(x.relationType==="many-to-one"||x.relationType==="one-to-one")){let C=zr(x.relationMeta,T.field,c.table,this.metadata,this.dbType);C&&w.push({sql:C,direction:T.direction})}}let $=[];if(c.fields&&c.fields.length>0){let T=qn(this.metadata),x=await Jr(this.knex,c.table,c.fields,T,this.dbType,this.maxQueryDepth,e.deep);c.select=[...c.select||[],...x.select],$=x.batchFetchDescriptors||[]}c.where&&(c.where=c.where.map(T=>T.field.includes(".")?T:{...T,field:`${c.table}.${T.field}`})),c.sort=_;let h=this.knex(c.table),k=Array.isArray(e.meta)?e.meta:(e.meta||"").split(",").map(T=>T.trim()).filter(Boolean),S=k.includes("filterCount")||k.includes("*"),R=k.includes("totalCount")||k.includes("*");if(c.select){let T=c.select.map(x=>typeof x=="string"&&x.trim().startsWith("(")?this.knex.raw(x):typeof x=="string"&&/ as /i.test(x)?this.knex.raw(x):x);h=h.select(T)}if(S&&h.select(this.knex.raw("COUNT(*) OVER() as __filter_count__")),R){let T=N(c.table,this.dbType);h.select(this.knex.raw(`(SELECT COUNT(*) FROM ${T}) as __total_count__`))}let F=["table_definition","column_definition","relation_definition","method_definition"].includes(c.table);if(p&&(ue(p)||Object.keys(p).length>0)){let T=this.metadata?.tables?.get(c.table);(!F&&T&&T.relations&&T.relations.length>0?V(p,T).hasRelations:!1)?await Ue(this.knex,h,p,c.table,T,this.dbType,C=>this.metadata?.tables?.get(C)):e.plan?.filterTree?q(h,e.plan.filterTree,{dbType:this.dbType,rootTable:c.table}):(this.logger.debug(`buildWhereClause fallback for table=${c.table}`),h=re(h,p,c.table,this.dbType,T))}else c.where&&c.where.length>0&&(h=lt(h,c.where,c.table,this.metadata,this.dbType));if(c.sort)for(let T of c.sort){let x=T.field.includes(".")?T.field:`${c.table}.${T.field}`;h=h.orderBy(x,T.direction)}for(let T of w)h=h.orderByRaw(`${T.sql} ${T.direction.toUpperCase()}`);c.groupBy&&(h=h.groupBy(c.groupBy)),c.offset&&(h=h.offset(c.offset)),c.limit!==void 0&&c.limit!==null&&c.limit>0&&(h=h.limit(c.limit));let X=0;this.debugLog&&this.debugLog.push({type:"SQL Query",table:c.table,sql:h.toSQL().toNative()});let A;if(e.debugMode&&(A=h.toSQL().toNative().sql),e.debugMode&&i){let T=h.toSQL().toNative();i.setSql(T.sql);try{let x=T.sql.replace(/\$\d+/g,"?"),C=await this.knex.raw(`EXPLAIN ${x}`,T.bindings);i.setExplain(this.dbType==="postgres"?C.rows:C[0])}catch(x){i.setExplain({error:String(x)})}}let O,j=performance.now();O=await h,i&&i.dur("db_execute",j,{table:e.tableName});let W=0;if(S&&O.length>0&&(W=Number(O[0].__filter_count__||0),O.forEach(T=>{delete T.__filter_count__})),R&&O.length>0&&O[0].__total_count__!==void 0&&(X=Number(O[0].__total_count__||0),O.forEach(T=>{delete T.__total_count__})),$&&$.length>0&&O.length>0){let T=qn(this.metadata);if(T){let{executeBatchFetches:x}=await Promise.resolve().then(()=>(Xn(),Vr));await x(this.knex,O,$,T,this.maxQueryDepth??3,0,c.table,this.dbType,this.metadata,i)}}if(this.knexService){let T=performance.now();O=await this.knexService.parseResult(O,c.table),i&&i.dur("db_parseResult",T,{table:e.tableName})}else{let T=(x,C)=>{if(!x||!this.metadata)return x;let xe=this.metadata.tables?.get(C);if(!xe)return x;if(Array.isArray(x))return x.map(J=>T(J,C));if(typeof x!="object"||Buffer.isBuffer(x))return x;let v={...x};for(let J of xe.columns)if(J.type==="simple-json"&&v[J.name]&&typeof v[J.name]=="string")try{v[J.name]=JSON.parse(v[J.name])}catch{}for(let[J,z]of Object.entries(v))if(z&&typeof z=="object"&&!Array.isArray(z)&&!Buffer.isBuffer(z)){let yn=z;if(yn.id!==void 0||yn.createdAt!==void 0){let pt=xe.relations?.find(gt=>gt.propertyName===J);pt&&(v[J]=T(z,pt.targetTableName))}}else if(Array.isArray(z)&&z.length>0&&typeof z[0]=="object"&&z[0].id!==void 0){let pt=xe.relations?.find(gt=>gt.propertyName===J);pt&&(v[J]=z.map(gt=>T(gt,pt.targetTableName)))}return v};O=T(O,c.table)}i&&(i.setQueryPath("full"),i.dur("sql_executor",t,{table:e.tableName}));let Se=await this.executeAggregate(c,p);return{data:O,...(k.length>0||Se)&&{meta:{...k.includes("totalCount")||k.includes("*")?{totalCount:X}:{},...k.includes("filterCount")||k.includes("*")?{filterCount:W}:{},...Se?{aggregate:Se}:{}}},...A!==void 0&&{sql:A}}}async executeSimple(e,t){let n=e.tableName,i=t.rawFields&&t.rawFields.length>0?t.rawFields:["*"],o=this.knex(n).select(i);t.filterTree&&q(o,t.filterTree,{dbType:this.dbType,rootTable:n});for(let y of t.sortItems){let b=y.field.includes(".")?y.field:`${n}.${y.field}`;o=o.orderBy(b,y.direction)}t.limit!==void 0&&t.limit!==null&&t.limit>0&&(o=o.limit(t.limit)),t.offset!==void 0&&(o=o.offset(t.offset));let s=Array.isArray(e.meta)?e.meta:(e.meta||"").split(",").map(y=>y.trim()).filter(Boolean),a=s.includes("filterCount")||s.includes("*"),f=s.includes("totalCount")||s.includes("*");if(a&&o.select(this.knex.raw("COUNT(*) OVER() as __filter_count__")),f){let y=N(n,this.dbType);o.select(this.knex.raw(`(SELECT COUNT(*) FROM ${y}) as __total_count__`))}let l=e.debugTrace,u;if(e.debugMode){let y=o.toSQL().toNative();if(u=y.sql,l){l.setSql(y.sql);try{let b=y.sql.replace(/\$\d+/g,"?"),_=await this.knex.raw(`EXPLAIN ${b}`,y.bindings);l.setExplain(this.dbType==="postgres"?_.rows:_[0])}catch(b){l.setExplain({error:String(b)})}}}let c=performance.now(),p;p=await o,l&&l.dur("db_execute",c,{table:n}),this.knexService&&(p=await this.knexService.parseResult(p,n));let d=0,g=0;a&&p.length>0&&(d=Number(p[0].__filter_count__||0),p.forEach(y=>delete y.__filter_count__)),f&&p.length>0&&(g=Number(p[0].__total_count__||0),p.forEach(y=>delete y.__total_count__));let m=await this.executeAggregate({table:n,aggregate:e.aggregate,metadata:e.metadata},e.filter);return{data:p,...(s.length>0||m)&&{meta:{...f?{totalCount:g}:{},...a?{filterCount:d}:{},...m?{aggregate:m}:{}}},...u!==void 0&&{sql:u}}}async executeAggregate(e,t){let n=rt(e.aggregate,e.table,e.metadata);if(n.length===0)return;let i={};for(let o of n){let s=it(t,o);B(s,e.table,e.metadata);let f=new K().plan({tableName:e.table,filter:s,metadata:e.metadata,dbType:this.dbType});if(o.op==="countRecords"){let d=await this.executeRelationCountRecords(e,t,o);Te(i,o,d);continue}let l=this.knex(e.table);if(f.hasRelationFilters){let d=e.metadata?.tables?.get(e.table);await Ue(this.knex,l,s,e.table,d,this.dbType,g=>e.metadata?.tables?.get(g))}else f.filterTree&&q(l,f.filterTree,{dbType:this.dbType,rootTable:e.table});let u=`${N(e.table,this.dbType)}.${N(o.field,this.dbType)}`,c=o.op==="count"?this.knex.raw("COUNT(*) as value"):this.knex.raw(`${o.op.toUpperCase()}(${u}) as value`),p=await l.clearSelect().select(c).first();Te(i,o,p?.value??0)}return i}async executeRelationCountRecords(e,t,n){let i=e.metadata?.tables?.get(e.table),o=i?.relations?.find(c=>c.propertyName===n.field),s=o?.targetTableName||o?.targetTable,a=s?e.metadata?.tables?.get(s):null;if(!o||!s||!a)return 0;let f=this.knex(e.table).select(`${e.table}.id`);if(t&&Object.keys(t).length>0){let p=new K().plan({tableName:e.table,filter:t,metadata:e.metadata,dbType:this.dbType});p.hasRelationFilters?await Ue(this.knex,f,t,e.table,i,this.dbType,d=>e.metadata?.tables?.get(d)):p.filterTree&&q(f,p.filterTree,{dbType:this.dbType,rootTable:e.table})}let l=this.knex(s).count("* as value");if(n.condition&&Object.keys(n.condition).length>0){B(n.condition,s,e.metadata);let p=new K().plan({tableName:s,filter:n.condition,metadata:e.metadata,dbType:this.dbType});p.hasRelationFilters?await Ue(this.knex,l,n.condition,s,a,this.dbType,d=>e.metadata?.tables?.get(d)):p.filterTree&&q(l,p.filterTree,{dbType:this.dbType,rootTable:s})}if(o.type==="one-to-many")l.whereIn(`${s}.${o.foreignKeyColumn}`,f);else if(o.type==="many-to-many"){let c=o.junctionTableName||Pe(e.table,o.propertyName,s),p=je(e.table,o.propertyName,s),d=o.junctionSourceColumn||p.sourceColumn,g=o.junctionTargetColumn||p.targetColumn;l.whereIn(`${s}.id`,this.knex(c).select(`${c}.${g}`).whereIn(`${c}.${d}`,f))}else(o.type==="many-to-one"||o.type==="one-to-one")&&l.whereIn(`${s}.id`,function(){this.select(`${e.table}.${o.foreignKeyColumn}`).from(e.table),t&&Object.keys(t).length>0&&this.whereIn(`${e.table}.id`,f),this.whereNotNull(`${e.table}.${o.foreignKeyColumn}`)});let u=await l.first();return Number(u?.value??0)}};var pn=require("mongodb"),ft=class{constructor(e){this.debugLog=[];this.knexService=e.knexService,this.mongoService=e.mongoService,this.databaseConfigService=e.databaseConfigService,this.runtimeMetricsCollectorService=e.runtimeMetricsCollectorService,this.lazyRef=e.lazyRef,this.dbType=this.databaseConfigService.getDbType()}async runWithPolicy(e,t){return this.knexService?this.knexService.runWithPolicy(e,t):this.mongoService?this.mongoService.runWithPolicy(e,t):t()}async runWithFieldPermissionCheck(e,t){return this.knexService?this.knexService.runWithFieldPermissionCheck(e,t):this.mongoService?this.mongoService.runWithFieldPermissionCheck(e,t):t()}async runWithTelemetryContext(e,t){return this.runtimeMetricsCollectorService?await this.runtimeMetricsCollectorService.runWithQueryContext(e,t):await t()}getDbType(){return this.dbType}safeObjectId(e){if(!pn.ObjectId)return e;if(typeof e=="string")try{return new pn.ObjectId(e)}catch{return e}return e}async getMetadataForQuery(){let e={tables:new Map,tablesList:[]},t=this.lazyRef.metadataCacheService;return t?t.isLoaded?.()?await t.getMetadata?.()??e:t.getDirectMetadata?.()??e:e}async buildMongoFilter(e,t){let n=await this.getMetadataForQuery(),i=Ge(n,e,t,this.dbType);return i._id!==void 0&&(i._id=this.safeObjectId(i._id)),i}async applyWhereToKnex(e,t,n){let i=await this.getMetadataForQuery();return{query:lt(e,t,n??"",i,this.dbType)}}async runMongoMutationInSaga(e){return!this.mongoService?.runInSaga||this.mongoService.isInSaga?.()?e():(await this.mongoService.runInSaga(e)).data}async insertWithOptions(e){if(this.dbType==="mongodb")return this.runMongoMutationInSaga(async()=>{if(Array.isArray(e.data)){let t=[];for(let n of e.data){let i=await this.mongoService.insertOne(e.table,n);t.push(Z(i))}return t}return this.mongoService.insertOne(e.table,e.data)});if(Array.isArray(e.data)){let t=[];for(let n of e.data){let i=await this.knexService.insertWithCascade(e.table,n);t.push(i)}return t}else return await this.knexService.insertWithCascade(e.table,e.data)}async select(e){let t=performance.now(),n=await this.getMetadataForQuery(),i=performance.now(),s=new K().plan({tableName:e.tableName,fields:e.fields,filter:e.filter,sort:e.sort,page:e.page,limit:e.limit,meta:e.meta,metadata:n,dbType:this.dbType}),a=e.debugTrace;if(a&&(a.dur("qb_planner",i,{table:e.tableName}),a.setPlan(this.sanitizePlan(s))),this.dbType==="mongodb")return new ot(this.mongoService,this.lazyRef.mongoPhysicalMigrationService).execute({...e,metadata:n,dbType:this.dbType,plan:s,aggregate:e.aggregate});let l=await new ut(this.knexService.getKnex(),this.dbType,this.knexService,e.maxQueryDepth).execute({...e,metadata:n,plan:s});return a&&a.dur("qb_total_select",t,{table:e.tableName}),l}sanitizePlan(e){return{rawFields:e.rawFields,hasRelationFilters:e.hasRelationFilters,hasRelationSort:e.hasRelationSort,joins:e.joins?.length??0,sortItems:e.sortItems,limit:e.limit,offset:e.offset,page:e.page,isSimpleQuery:e.joins?.length===0&&!e.hasRelationFilters&&!e.hasRelationSort}}async updateWithOptions(e){if(this.dbType==="mongodb")return this.runMongoMutationInSaga(async()=>{let o=await this.buildMongoFilter(e.where,e.table),a=await this.mongoService.collection(e.table).find(o).toArray(),f=[];for(let l of a){let u=await this.mongoService.updateOne(e.table,l._id,e.data);f.push(u)}return f});let t=this.knexService.getKnex(),n=t(e.table);e.where.length>0&&({query:n}=await this.applyWhereToKnex(n,e.where,e.table));let i=await n;for(let o of i)await this.knexService.updateWithCascade(e.table,o.id,e.data);if(e.returning){let o=t(e.table);return e.where.length>0&&await this.applyWhereToKnex(o,e.where,e.table),await o.select(e.returning)}return{affected:i.length}}async deleteWithOptions(e){if(this.dbType==="mongodb")return this.runMongoMutationInSaga(async()=>{let i=await this.buildMongoFilter(e.where,e.table),s=await this.mongoService.collection(e.table).find(i).toArray(),a=0;for(let f of s)await this.mongoService.deleteOne(e.table,f._id)&&a++;return a});let n=this.knexService.getKnex()(e.table);return e.where.length>0&&({query:n}=await this.applyWhereToKnex(n,e.where,e.table)),await n.delete()}async count(e){if(this.dbType==="mongodb"){let o=e.where?await this.buildMongoFilter(e.where,e.table):{};return this.mongoService.count(e.table,o)}let n=this.knexService.getKnex()(e.table);e.where&&e.where.length>0&&({query:n}=await this.applyWhereToKnex(n,e.where,e.table));let i=await n.count("* as count").first();return Number(i?.count||0)}whereToFilter(e){let t={},n=this.databaseConfigService.isMongoDb();for(let[i,o]of Object.entries(e))i==="id"||i==="_id"?n?t._id=this.normalizeWhereFilterValue("_id",o):t.id=this.normalizeWhereFilterValue("id",o):t[i]=this.normalizeWhereFilterValue(i,o);return t}normalizeWhereFilterValue(e,t){return this.isFilterOperatorObject(t)?this.databaseConfigService.isMongoDb()&&e==="_id"?this.normalizeMongoIdOperatorValue(t):t:{_eq:this.databaseConfigService.isMongoDb()&&e==="_id"?this.safeObjectId(t):t}}isFilterOperatorObject(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)&&!(e instanceof pn.ObjectId)&&Object.keys(e).length>0&&Object.keys(e).every(t=>t.startsWith("_"))}normalizeMongoIdOperatorValue(e){let t={};for(let[n,i]of Object.entries(e))t[n]=Array.isArray(i)?i.map(o=>this.safeObjectId(o)):this.safeObjectId(i);return t}filterToWhere(e){let t=[];for(let[n,i]of Object.entries(e))if(typeof i=="object"&&i!==null&&!Array.isArray(i)){let o=Object.entries(i)[0];if(o){let[s,a]=o,f=this.mapFilterOperatorToSql(s);t.push({field:n,operator:f,value:a})}}return t}mapFilterOperatorToSql(e){return{_eq:"=",_neq:"!=",_gt:">",_gte:">=",_lt:"<",_lte:"<=",_in:"in",_not_in:"not in",_contains:"like",_starts_with:"like",_ends_with:"like",_is_null:"is null",_is_not_null:"is not null"}[e]||"="}async find(e){return this.trackQueryMetric("find",e.table,async()=>{let t=e.filter||(e.where?this.whereToFilter(e.where):void 0);return await this.select({tableName:e.table,filter:t,fields:e.fields,sort:e.sort,page:e.page,limit:e.limit,meta:e.meta,deep:e.deep,debugMode:e.debugMode,debugLog:e.debugLog,debugTrace:e.debugTrace,pipeline:e.pipeline,aggregate:e.aggregate,maxQueryDepth:e.maxQueryDepth})})}async findOne(e){return(await this.find({...e,limit:1}))?.data?.[0]??null}async insert(e,t){return this.trackQueryMetric("insert",e,async()=>{if(this.dbType==="mongodb"){let s=await this.runMongoMutationInSaga(()=>this.mongoService.insertOne(e,t));return Z(s)}let n=await this.knexService.insertWithCascade(e,t),i=this.knexService.getKnex(),o=n||t.id;return await i(e).where("id",o).first()})}async update(e,t,n){return this.trackQueryMetric("update",e,async()=>{if(t&&typeof t=="object"&&"where"in t)return await this.updateWithOptions({table:e,where:t.where,data:n});if(this.dbType==="mongodb"){let o=await this.runMongoMutationInSaga(()=>this.mongoService.updateOne(e,t,n));return Z(o)}return await this.knexService.updateWithCascade(e,t,n),await this.knexService.getKnex()(e).where("id",t).first()})}async delete(e,t){return this.trackQueryMetric("delete",e,async()=>t&&typeof t=="object"&&"where"in t?await this.deleteWithOptions({table:e,where:t.where})>0:this.dbType==="mongodb"?await this.runMongoMutationInSaga(()=>this.mongoService.deleteOne(e,t)):await this.knexService.getKnex()(e).where("id",t).delete()>0)}async countRecords(e,t){if(this.dbType==="mongodb")return this.mongoService.count(e,t||{});let i=this.knexService.getKnex()(e);if(t&&Object.keys(t).length>0){let s=this.filterToWhere(t);({query:i}=await this.applyWhereToKnex(i,s,e))}let o=await i.count("* as count").first();return Number(o?.count||0)}async transaction(e){return this.dbType==="mongodb"?this.runMongoMutationInSaga(()=>e(this.mongoService)):this.knexService.transaction(e)}async findById(e,t){if(this.dbType==="mongodb"){let i=this.safeObjectId(t);return this.mongoService.findOne(e,{_id:i})}return await this.knexService.getKnex()(e).where("id",t).first()}async findOneWhere(e,t){if(this.dbType==="mongodb"){let i={};for(let[o,s]of Object.entries(t))o==="id"||o==="_id"?i._id=this.safeObjectId(s):i[o]=s;return this.mongoService.findOne(e,i)}return await this.knexService.getKnex()(e).where(t).first()}async findWhere(e,t){if(this.dbType==="mongodb"){let i={};for(let[a,f]of Object.entries(t))a==="id"||a==="_id"?i._id=this.safeObjectId(f):i[a]=f;return await this.mongoService.collection(e).find(i).toArray()}return await this.knexService.getKnex()(e).where(t)}async insertAndGet(e,t){if(this.dbType==="mongodb")return this.runMongoMutationInSaga(()=>this.mongoService.insertOne(e,t));let n=await this.knexService.insertWithCascade(e,t),i=this.knexService.getKnex(),o=n||t.id;return await i(e).where("id",o).first()}async updateById(e,t,n){return this.dbType==="mongodb"?this.runMongoMutationInSaga(()=>this.mongoService.updateOne(e,t,n)):(await this.knexService.updateWithCascade(e,t,n),await this.knexService.getKnex()(e).where("id",t).first())}async deleteById(e,t){return this.dbType==="mongodb"?await this.runMongoMutationInSaga(()=>this.mongoService.deleteOne(e,t))?1:0:this.knexService.getKnex()(e).where("id",t).delete()}async raw(e,t){let n=this.dbType==="mongodb"?"mongodb":"sql";return this.trackQueryMetric("raw",n,async()=>{if(this.dbType==="mongodb"){let o=this.mongoService.getDb();if(typeof e=="string"){if(e.toLowerCase().includes("select 1"))return await o.command({ping:1});throw new Error("String queries not supported for MongoDB. Use db.command() object instead.")}return await o.command(e)}return await this.knexService.getKnex().raw(e,t)})}async trackQueryMetric(e,t,n){return this.runtimeMetricsCollectorService?await this.runtimeMetricsCollectorService.trackQuery({op:e,table:t},n):await n()}getConnection(){return this.dbType==="mongodb"?this.mongoService.getDb():this.knexService.getKnex()}getKnex(){if(this.dbType==="mongodb")throw new Error("getKnex() is not available for MongoDB. Use getConnection() or unified methods.");return this.knexService.getKnex()}getMongoDb(){if(this.dbType!=="mongodb")throw new Error("getMongoDb() is not available for SQL. Use getConnection() or unified methods.");return this.mongoService.getDb()}getDatabaseType(){return this.dbType}isMongoDb(){return this.dbType==="mongodb"}isSql(){return["mysql","postgres","mariadb","sqlite"].includes(this.dbType)}getPkField(){return this.isMongoDb()?"_id":"id"}getRecordId(e){return this.isMongoDb()?e._id:e.id}};Xn();Gn();Hn();$e();dn();et();Nt();Ye();var Hr=new Set(["fields","filter","sort","limit","page","deep"]),dt=3;function Zn(r,e,t,n=0,i=3){if(!e||typeof e!="object")return;if(n>=i)throw new E(`deep option exceeds maximum query depth of ${i}`);let o=t?.tables?.get(r),s=new Map((o?.relations??[]).map(a=>[a.propertyName,a]));for(let[a,f]of Object.entries(e)){let l=s.get(a);if(!l)throw new E(`Unknown relation '${a}' on '${r}'`);if(!f||typeof f!="object")continue;for(let p of Object.keys(f))if(!Hr.has(p))throw new E(`Unknown deep option key '${p}' for relation '${a}'. Allowed: ${[...Hr].join(", ")}`);let u=l.type;if(f.limit!==void 0&&(u==="many-to-one"||u==="one-to-one"))throw new E(`'limit' not supported on many-to-one/one-to-one relations (relation '${a}' on '${r}')`);if(f.page!==void 0&&f.limit===void 0)throw new E(`'page' requires 'limit' to be present (relation '${a}' on '${r}')`);let c=l.targetTableName||l.targetTable;if(c){if(f.filter&&(B(f.filter,c,t),gn(f.filter,0,a,r)),f.sort){let p=Array.isArray(f.sort)?f.sort:String(f.sort).split(",").map(d=>d.trim()).filter(Boolean);for(let d of p){let g=d.startsWith("-")?d.slice(1):d;so(g,c,t,a,r)}}f.deep&&Zn(c,f.deep,t,n+1,i)}}}function so(r,e,t,n,i){let o=r.split(".");if(o.length-1>dt)throw new E(`Sort path '${r}' exceeds max dotted hops of ${dt} (relation '${n}' on '${i}')`);let a=e;for(let f=0;f<o.length;f++){let l=o[f],u=f===o.length-1,c=t?.tables?.get(a);if(!c)throw new E(`Sort path '${r}' references unknown table '${a}' (relation '${n}' on '${i}')`);if(c.columns?.find(g=>g.name===l)){if(!u)throw new E(`Sort path '${r}' references column '${l}' in non-terminal position (relation '${n}' on '${i}')`);return}let d=c.relations?.find(g=>g.propertyName===l);if(!d)throw new E(`Sort path '${r}' references unknown field '${l}' on '${a}' (relation '${n}' on '${i}')`);if(!u){let g=d.type;if(g==="one-to-many"||g==="many-to-many")throw new E(`Sort path '${r}' passes through '${l}' which is a ${g} relation \u2014 sort path must only traverse many-to-one or one-to-one (owner-side) relations (relation '${n}' on '${i}')`);a=d.targetTableName||d.targetTable||a}}}var ao=new Set(["_and","_or","_not"]);function gn(r,e,t,n){if(!(!r||typeof r!="object"))for(let[i,o]of Object.entries(r)){if(ao.has(i)){if(Array.isArray(o))for(let l of o)gn(l,e,t,n);else o&&typeof o=="object"&&gn(o,e,t,n);continue}if(i.startsWith("_")||!o||typeof o!="object"||Array.isArray(o)||!Object.keys(o).some(l=>!l.startsWith("_")))continue;let a=e+1;if(a>dt)throw new E(`Filter path exceeds max dotted hops of ${dt} at '${i}' (relation '${t}' on '${n}')`);let f={};for(let l of Object.keys(o))l.startsWith("_")||(f[l]=o[l]);gn(f,a,t,n)}}function qr(r,e,t,n){return!r||typeof r!="object"?r:jt(r,e,t,n)}function jt(r,e,t,n){if(!r||typeof r!="object")return r;if(Array.isArray(r)){let o=r.map(s=>jt(s,e,t,n)).filter(s=>s!=null);return o.length>0?o:null}let i={};for(let[o,s]of Object.entries(r)){if(o==="_and"||o==="_or"){let c=(Array.isArray(s)?s:[s]).map(p=>jt(p,e,t,n)).filter(p=>p!=null&&Object.keys(p).length>0);c.length>0&&(i[o]=c);continue}if(o==="_not"){let u=jt(s,e,t,n);u!=null&&Object.keys(u).length>0&&(i[o]=u);continue}let a=t?.tables?.get(e),f=a?.relations?.find(u=>u.propertyName===o);if(f){if(!n(e,o,"relation"))continue;let u=f.targetTableName||f.targetTable;if(!u)continue;let c=jt(s,u,t,n);c!=null&&Object.keys(c).length>0&&(i[o]=c);continue}if(a?.columns?.find(u=>u.name===o)){if(!n(e,o,"column"))continue;i[o]=s;continue}i[o]=s}return i}function Gr(r,e,t,n){if(!r)return r;let i=Array.isArray(r)?r:r.split(",").map(s=>s.trim()).filter(Boolean),o=[];for(let s of i){let l=(s.startsWith("-")?s.slice(1):s).split("."),u=!0,c=e;for(let p=0;p<l.length;p++){let d=l[p],g=p===l.length-1,m=t?.tables?.get(c);if(!m){u=!1;break}if(g)m.columns?.find(b=>b.name===d)?n(c,d,"column")||(u=!1):m.relations?.find(_=>_.propertyName===d)&&(n(c,d,"relation")||(u=!1));else{let y=m.relations?.find(b=>b.propertyName===d);if(!y){u=!1;break}if(!n(c,d,"relation")){u=!1;break}c=y.targetTableName||y.targetTable||c}}u&&o.push(s)}if(o.length!==0)return Array.isArray(r)?o:o.join(",")}vt();Ye();At();rn();Ft();Le();Nt();function lo(r){let e=new ft({knexService:r.knexService,mongoService:r.mongoService,databaseConfigService:r.databaseConfigService,runtimeMetricsCollectorService:r.runtimeMetricsCollectorService,lazyRef:r.lazyRef}),t,n,i=()=>(t||(t=new ze({packageCacheService:r.getPackageCacheService?.()??r.packageCacheService,packageCdnLoaderService:r.getPackageCdnLoaderService?.()??r.packageCdnLoaderService})),t),o=()=>(n||(n=new Qe({isolatedExecutorService:i()})),n);return{queryBuilderService:e,get isolatedExecutorService(){return i()},get executorEngineService(){return o()},async onDestroy(){await t?.onDestroy?.()}}}0&&(module.exports={ALL_SUPPORTED_OPERATORS,AuthenticationException,AuthorizationException,BadRequestException,BatchFetchEngine,BusinessLogicException,ConfigurationException,DEFAULT_TIMEOUT_MS,DOTTED_PATH_MAX_HOPS,DatabaseException,DuplicateResourceException,ErrorHandler,ExecutorEngineService,ExternalServiceException,FIELD_OPERATORS,FileNotFoundException,FileSizeExceededException,FileUploadException,HttpException,ISOLATED_EXECUTOR_RUNTIME_LOG_PATH,InvalidTokenException,IsolatedExecutorService,JoinRegistry,LOGICAL_OPERATORS,MongoBatchAdapter,MongoQueryExecutor,PER_PARENT_CONCURRENCY,QueryBuilderService,QueryPlanner,ResourceNotFoundException,SchemaException,ScriptExecutionException,ScriptTimeoutException,ServiceUnavailableException,SqlBatchAdapter,SqlQueryExecutor,TokenExpiredException,ValidationException,WHERE_IN_CHUNK_SIZE,WorkerPool,appendIsolatedExecutorRuntimeLog,applyOperatorToMatch,applyRelationFilters,applyWhereToKnex,assertFieldOperatorValueIsClean,buildAggregateFilter,buildMongoCharFoldMapJson,buildMongoFoldTextSearchJs,buildRelationSubquery,buildSqlWherePartsFromFieldAst,buildWhereClause,camelToSnake,chunkedFetch,compileScriptSource,computeEngineTuning,createEnfyraKernel,dslOpToCompareOp,encodeMainThreadToIsolate,escapeSqlValue,executeBatchFetches,executeMongoBatchFetches,expandFieldsToJoinsAndSelect,getEffectiveCpuCount,getEffectiveMemoryBytes,getEngineTuning,getExecutableScript,getForeignKeyColumnName,getIoAbortSignal,getJunctionColumnNames,getJunctionTableName,getPrimaryKeyColumn,getScriptLegacyField,getShortFkConstraintName,getShortFkName,getShortIndexName,getShortPkName,hasAggregateQuery,hasLogicalOperators,isExecutableJavaScript,isScriptTable,mergeAggregateValue,normalizeAggregateQuery,normalizeFlowStepScriptConfig,normalizeScriptLanguage,normalizeScriptPatch,normalizeScriptRecord,parseBatchFields,parseFields,parseFilter,perParentRun,quoteIdentifier,resolveExecutableScript,rewriteFilterDenyingFields,rewriteSortDroppingDenied,separateFilters,snakeToCamel,throwUnsupportedFieldOperator,transformCode,validateDeepOptions,validateFilterShape,whereToMongoFilter});
|