@budibase/backend-core 3.22.4 → 3.22.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 +2 -2
- package/dist/index.js.map +2 -2
- package/dist/package.json +2 -2
- package/dist/src/db/Replication.d.ts +3 -0
- package/dist/src/db/Replication.js +38 -0
- package/dist/src/db/Replication.js.map +1 -1
- package/dist/src/events/publishers/action.js +9 -4
- package/dist/src/events/publishers/action.js.map +1 -1
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -33,7 +33,7 @@ attempted value: ${o}
|
|
|
33
33
|
if (doc.ssoId) {
|
|
34
34
|
emit(doc.ssoId, doc._id)
|
|
35
35
|
}
|
|
36
|
-
}`,"platform_users_lowercase_2")},"createPlatformUserView"),Gs=s(async(t,e)=>{let r={account_by_email:yT,platform_users_lowercase_2:TT};return Ke(fe.PLATFORM_INFO.name,async n=>{let i=r[t];return Af(t,e,n,i,{arrayResponse:!0})})},"queryPlatformView"),ST={by_email2:mT,by_api_key:ET,by_app:hT},$t=s(async(t,e,r,n)=>{r||(r=H());let i=ST[t];return Af(t,e,r,i,n)},"queryGlobalView");async function _f(t,e,r){let n=H(),i=ST[t];return Vs(t,e,n,i,r)}s(_f,"queryGlobalViewRaw");var Lb=F(require("pouchdb"));var Of=class{static{s(this,"Replication")}constructor({source:e,target:r}){this.source=Xe(e),this.target=Xe(r),e.startsWith("app_dev")&&r.startsWith("app")?this.direction="toProduction":e.startsWith("app")&&r.startsWith("app_dev")&&(this.direction="toDev")}async close(){await Promise.all([ws(this.source),ws(this.target)])}replicate(e={}){return new Promise(r=>{this.source.replicate.to(this.target,e).on("denied",function(n){throw new Error(`Denied: Document failed to replicate ${n}`)}).on("complete",function(n){return r(n)}).on("error",function(n){throw n})})}appReplicateOpts(e={}){if(typeof e.filter=="string")return e;let r=e.filter,i=this.direction==="toDev";delete e.filter;let o=e.isCreation,a=e.tablesToSync;delete e.isCreation,delete e.tablesToSync;let u=!1,c;typeof a=="string"&&a==="all"?u=!0:a&&(c=a);let l=s((f,p)=>f?.startsWith(p+b),"startsWithID"),d=s(f=>l(f,"ro")||l(f,"li"),"isData");return{...e,filter:(f,p)=>!o&&f._id==="_design/migrations"||i&&f._id.startsWith("_design")?!1:f._deleted||l(f._id,ys)?!0:d(f._id)?!!c?.find(m=>f._id.includes(m))||u:l(f._id,"log_au")||f._id==="app_metadata"?!1:r?r(f,p):!0}}async rollback(){await this.target.destroy(),this.target=Xe(this.target.name),await this.replicate()}},AT=Of;var OT=F(require("node-fetch"));var qs=cr.removeKeyNumbering;function sn(t){return t==null||t===""}s(sn,"isEmpty");var Vt=class t{static{s(this,"QueryBuilder")}#l;#d;#e;#r;#n;#i;#s;#o;#t;#f;#a;#u=!1;#c;static{this.maxLimit=200}constructor(e,r,n){this.#l=e,this.#d=r,this.#e={allOr:!1,onEmptyFilter:"all",string:{},fuzzy:{},range:{},equal:{},notEqual:{},empty:{},notEmpty:{},oneOf:{},contains:{},notContains:{},containsAny:{},...n},this.#r=50,this.#s="ascending",this.#o="string",this.#t=!0}disableEscaping(){return this.#u=!0,this}setIndexBuilder(e){return this.#a=e,this}setVersion(e){return e!=null&&(this.#f=e),this}setTable(e){return this.#e.equal.tableId=e,this}setLimit(e){return e!=null&&(this.#r=e),this}setSort(e){return e!=null&&(this.#n=e),this}setSortOrder(e){return e!=null&&(this.#s=e),this}setSortType(e){return e!=null&&(this.#o=e),this}setBookmark(e){return e!=null&&(this.#i=e),this}setSkip(e){return this.#c=e,this}excludeDocs(){return this.#t=!1,this}includeDocs(){return this.#t=!0,this}addString(e,r){return this.#e.string[e]=r,this}addFuzzy(e,r){return this.#e.fuzzy[e]=r,this}addRange(e,r,n){return this.#e.range[e]={low:r,high:n},this}addEqual(e,r){return this.#e.equal[e]=r,this}addNotEqual(e,r){return this.#e.notEqual[e]=r,this}addEmpty(e,r){return this.#e.empty[e]=r,this}addNotEmpty(e,r){return this.#e.notEmpty[e]=r,this}addOneOf(e,r){return this.#e.oneOf[e]=r,this}addContains(e,r){return this.#e.contains[e]=r,this}addNotContains(e,r){return this.#e.notContains[e]=r,this}addContainsAny(e,r){return this.#e.containsAny[e]=r,this}setAllOr(){this.#e.allOr=!0}setOnEmptyFilter(e){this.#e.onEmptyFilter=e}handleSpaces(e){return this.#u?e:e.replace(/ /g,"_")}preprocess(e,{escape:r,lowercase:n,wrap:i,type:o}={}){let a=!!this.#f,u=typeof e;return e&&n&&(e=e.toLowerCase?e.toLowerCase():e),!this.#u&&r&&u==="string"&&(e=`${e}`.replace(/[ /#+\-&|!(){}\]^"~*?:\\]/g,"\\$&")),u==="string"&&!isNaN(e)&&!o?e=`"${e}"`:a&&i&&(e=u==="number"?e:`"${e}"`),e}isMultiCondition(){let e=0;for(let r of Object.values(this.#e))typeof r=="object"&&(e+=Object.keys(r).length);return e>1}compressFilters(e){let r={};for(let o of Object.keys(e)){let a=qs(o);r[a]?r[a]=r[a].concat(e[o]):r[a]=e[o]}let n={},i=1;for(let[o,a]of Object.entries(r))n[`${i++}:${o}`]=a;return n}buildSearchQuery(){let e=this,r=this.#e&&this.#e.allOr,n=r?"":"*:*",i=!0,o={escape:!0,lowercase:!0,wrap:!0},a="";this.#e.equal.tableId&&(a=this.#e.equal.tableId,delete this.#e.equal.tableId);let u=s((h,g)=>sn(g)?null:`${h}:${e.preprocess(g,o)}`,"equal"),c=s((h,g,y="AND")=>{if(sn(g))return null;if(!Array.isArray(g))return`${h}:${g}`;let S=`${e.preprocess(g[0],{escape:!0})}`;for(let O=1;O<g.length;O++)S+=` ${y} ${e.preprocess(g[O],{escape:!0})}`;return`${h}:(${S})`},"contains"),l=s((h,g)=>sn(g)?null:(g=e.preprocess(g,{escape:!0,lowercase:!0,type:"fuzzy"}),`${h}:/.*${g}.*/`),"fuzzy"),d=s((h,g)=>{let y=r?"*:* AND ":"",S=r?"AND":void 0;return y+"NOT "+c(h,g,S)},"notContains"),f=s((h,g)=>c(h,g,"OR"),"containsAny"),p=s((h,g)=>{if(sn(g))return"*:*";if(!Array.isArray(g))if(typeof g=="string")g=g.split(",");else return"";let y=`${e.preprocess(g[0],o)}`;for(let S=1;S<g.length;S++)y+=` OR ${e.preprocess(g[S],o)}`;return`${h}:(${y})`},"oneOf");function m(h,g,y){let S="";for(let[O,_]of Object.entries(h)){O=qs(O),O=e.preprocess(e.handleSpaces(O),{escape:!0});let D=g(O,_);if(D!=null){if(S.length>0||n.length>0){let T=y?.mode?y.mode:r?"OR":"AND";S+=` ${T} `}S+=D,(typeof _!="string"&&_!=null||typeof _=="string"&&_!==a&&_!=="")&&(i=!1)}}if(y?.returnBuilt)return S;n+=S}if(s(m,"build"),this.#e.string&&m(this.#e.string,(h,g)=>sn(g)?null:(g=e.preprocess(g,{escape:!0,lowercase:!0,type:"string"}),`${h}:${g}*`)),this.#e.range&&m(this.#e.range,(h,g)=>{if(sn(g)||g.low==null||g.low===""||g.high==null||g.high==="")return null;let y=e.preprocess(g.low,o),S=e.preprocess(g.high,o);return`${h}:[${y} TO ${S}]`}),this.#e.fuzzy&&m(this.#e.fuzzy,l),this.#e.equal&&m(this.#e.equal,u),this.#e.notEqual&&m(this.#e.notEqual,(h,g)=>sn(g)?null:typeof g=="boolean"?`(*:* AND !${h}:${g})`:`!${h}:${e.preprocess(g,o)}`),this.#e.empty&&m(this.#e.empty,h=>(i=!1,`(*:* -${h}:["" TO *])`)),this.#e.notEmpty&&m(this.#e.notEmpty,h=>(i=!1,`${h}:["" TO *]`)),this.#e.oneOf&&m(this.#e.oneOf,p),this.#e.contains&&m(this.#e.contains,c),this.#e.notContains&&m(this.compressFilters(this.#e.notContains),d),this.#e.containsAny&&m(this.#e.containsAny,f),a&&(n=this.isMultiCondition()?`(${n})`:n,r=!1,m({tableId:a},u)),i){if(this.#e.onEmptyFilter==="none")return"";if(this.#e?.allOr)return n.replace("()","(*:*)")}return n}buildSearchBody(){let e={q:this.buildSearchQuery(),limit:Math.min(this.#r,t.maxLimit),include_docs:this.#t};if(this.#i&&(e.bookmark=this.#i),this.#n){let r=this.#s==="descending"?"-":"",n=`<${this.#o}>`;e.sort=`${r}${this.handleSpaces(this.#n)}${n}`}return e}async run(){return this.#c&&await this.#m(this.#c),await this.#p()}async#m(e){let r=this.#t,n=this.#r;this.excludeDocs();let i=e,o=0;do{let a=Math.min(t.maxLimit,i);this.setLimit(a);let{bookmark:u,rows:c}=await this.#p();this.setBookmark(u),o=c.length,i-=c.length}while(i>0&&o>0);this.#t=r,this.#r=n}async#p(){let{url:e,cookie:r}=dt(),n=`${e}/${this.#l}/_design/database/_search/${this.#d}`,i=this.buildSearchBody();try{return await _T(n,i,r)}catch(o){if(o.status===404&&this.#a)return await this.#a(),await _T(n,i,r);throw o}}};async function _T(t,e,r){let n=await(0,OT.default)(t,{body:JSON.stringify(e),method:"POST",headers:{Authorization:r}});if(n.status===404)throw n;let i=await n.json(),o={rows:[],totalRows:0};return i.rows!=null&&i.rows.length>0&&(o.rows=i.rows.map(a=>a.doc)),i.bookmark&&(o.bookmark=i.bookmark),i.total_rows&&(o.totalRows=i.total_rows),o}s(_T,"runQuery");async function IT(t,e,r,n){let i=n.bookmark,o=n.rows||[];if(n.limit&&o.length>=n.limit)return o;let a=Vt.maxLimit;n.limit&&o.length>n.limit-Vt.maxLimit&&(a=n.limit-o.length);let u=new Vt(t,e,r);u.setVersion(n.version).setBookmark(i).setLimit(a).setSort(n.sort).setSortOrder(n.sortOrder).setSortType(n.sortType),n.tableId&&u.setTable(n.tableId);let c=await u.run();if(!c.rows.length)return o;if(c.rows.length<Vt.maxLimit)return[...o,...c.rows];let l={...n,bookmark:c.bookmark,rows:[...o,...c.rows]};return await IT(t,e,r,l)}s(IT,"recursiveSearch");async function kb(t,e,r,n){let i=n.limit;(i==null||isNaN(i)||i<0)&&(i=50),i=Math.min(i,Vt.maxLimit);let o=new Vt(t,e,r);n.version&&o.setVersion(n.version),n.tableId&&o.setTable(n.tableId),n.sort&&o.setSort(n.sort).setSortOrder(n.sortOrder).setSortType(n.sortType),n.indexer&&o.setIndexBuilder(n.indexer),n.disableEscaping&&o.disableEscaping();let a=await o.setBookmark(n.bookmark).setLimit(i).run();o.setBookmark(a.bookmark).setLimit(1),n.tableId&&o.setTable(n.tableId);let u=await o.run();return{...a,hasNextPage:u.rows&&u.rows.length>0}}s(kb,"paginatedSearch");async function Mb(t,e,r,n){let i=n.limit;return(i==null||isNaN(i)||i<0)&&(i=1e3),n.limit=Math.min(i,1e3),{rows:await IT(t,e,r,n)}}s(Mb,"fullSearch");var If={};N(If,{createUserIndex:()=>Fb});async function Fb(){let t=H(),e;try{e=await t.get("_design/database")}catch(n){n.status===404&&(e={_id:"_design/database"})}let r=s(function(n){if(n._id&&!n._id.startsWith("us_"))return;let i=["_id","_rev","password","account","license","budibaseAccess","accountPortalAccess","csrfToken"];function o(a,u){for(let c of Object.keys(a)){if(i.includes(c))continue;let l=u!=null?`${u}.${c}`:c;typeof a[c]=="string"?index(l,a[c].toLowerCase(),{facet:!0}):typeof a[c]!="object"?index(l,a[c],{facet:!0}):o(a[c],l)}}s(o,"idx"),o(n)},"fn");e.indexes={user:{index:r.toString(),analyzer:{default:"keyword",name:"perfield"}}},await t.put(e)}s(Fb,"createUserIndex");function wT(t,e){let r=e.toString();if(typeof t=="object")return t.status===e||t.message?.includes(r);if(typeof t=="number")return t===e;if(typeof t=="string")return t.includes(r)}s(wT,"checkErrorCode");function Bb(t){return wT(t,409)}s(Bb,"isDocumentConflictError");var Qs={};N(Qs,{addTenantToUrl:()=>Wb,getTenantDB:()=>wf,getTenantIDFromCtx:()=>Ks,isUserInAppTenant:()=>$b});function wf(t){return De(Xr(t))}s(wf,"getTenantDB");function Wb(t){let e=G();if(pr()){let r=t.indexOf("?")===-1?"?":"&";t+=`${r}tenantId=${e}`}return t}s(Wb,"addTenantToUrl");var $b=s((t,e)=>{let r;return e?r=e.tenantId||ae:r=G(),(zn(t)||ae)===r},"isUserInAppTenant"),Vb=Object.values(Ii),Ks=s((t,e)=>{if(!pr())return ae;e.allowNoTenant===void 0&&(e.allowNoTenant=!1),e.includeStrategies||(e.includeStrategies=Vb),e.excludeStrategies||(e.excludeStrategies=[]);let r=s(n=>{if(e.excludeStrategies?.includes(n))return!1;if(e.includeStrategies?.includes(n))return!0},"isAllowed");if(r("user")){let n=t.user?.tenantId;if(n)return n}if(r("header")){let n=t.request.headers["x-budibase-tenant-id"];if(n)return n}if(r("query")){let n=t.request.query.tenantId;if(n)return n}if(r("subdomain")){let n;try{n=new URL(Xd()).host.split(":")[0]}catch(o){if(o.code!=="ERR_INVALID_URL")throw o}let i=t.host;if(n&&i.includes(n)){let o=i.substring(0,i.indexOf(`.${n}`));if(o)return o}}if(r("path")){let n=t.matched.find(a=>!!a.paramNames.find(u=>u.name==="tenantId")),i=t.originalUrl,o;if(i.includes("?")?o=i.split("?")[0]:o=i,n){let a=n.params(o,n.captures(o),{});if(a.tenantId)return a.tenantId}}e.allowNoTenant||t.throw(403,"Tenant id not set")},"getTenantIDFromCtx");var Df="app"+b,DT="/app/",Gb="/builder",qb=`${Gb}/workspace/`,Kb="/api/public/v";async function Qb(t){let r=`/${t.path.split("/")[2].toLowerCase()}`,n=G();!E.isDev()&&E.MULTI_TENANCY&&(n=Ks(t,{includeStrategies:["subdomain"]}));let o=(await Re(n,()=>$s({dev:!1}))).filter(a=>a.url&&a.url.toLowerCase()===r)[0];return o&&o.appId?o.appId:void 0}s(Qb,"resolveAppUrl");function jb(t){return t.path.startsWith(`/${Df}`)?!0:t.path.startsWith(DT)}s(jb,"isServingApp");function Yb(t){return t.path.startsWith(qb)}s(Yb,"isServingBuilder");function Hb(t){return RT(t.path)}s(Hb,"isServingBuilderPreview");function RT(t){return new RegExp(/^\/app\/app_\w+\/preview$/).test(t)}s(RT,"isBuilderPreviewUrl");function zb(t){return t.path.startsWith(Kb)}s(zb,"isPublicApiRequest");async function on(t){let e;function r(u){return!u||!u.startsWith(Df)?e:(e&&e!==u&&t.throw("App id conflict",403),e??u)}s(r,"confirmAppId");let n=t.request.headers["x-budibase-app-id"]||[];typeof n=="string"&&(n=[n]);for(let u of n)e=r(u);t.request.body&&t.request.body.appId&&(e=r(t.request.body.appId));let i=Jb(t.path);i&&(e=r(i)),t.query?.appId&&(e=r(t.query?.appId));let o=RT(t.path);return t.path.startsWith(DT)&&!o&&(e=r(await Qb(t))),e}s(on,"getAppIdFromCtx");function Jb(t){if(t)return t.split("?")[0].split("/").find(e=>e.startsWith(Df))}s(Jb,"parseAppIdFromUrlPath");function su(t){if(t)try{return iu.default.verify(t,E.JWT_SECRET)}catch(e){if(E.JWT_SECRET_FALLBACK)return iu.default.verify(t,E.JWT_SECRET_FALLBACK);throw e}}s(su,"openJwt");function js(t){return E.INTERNAL_API_KEY&&E.INTERNAL_API_KEY===t?!0:!!(E.INTERNAL_API_KEY_FALLBACK&&E.INTERNAL_API_KEY_FALLBACK===t)}s(js,"isValidInternalAPIKey");function Gt(t,e){let r=t.cookies.get(e);if(r)return su(r)}s(Gt,"getCookie");function CT(t,e,r="builder",n={sign:!0}){e&&n&&n.sign&&(e=iu.default.sign(e,E.JWT_SECRET));let i={expires:Ma,path:"/",httpOnly:!1,overwrite:!0};E.COOKIE_DOMAIN&&(i.domain=E.COOKIE_DOMAIN),t.cookies.set(r,e,i)}s(CT,"setCookie");function gr(t,e){CT(t,null,e)}s(gr,"clearCookie");function Zb(t){return t.headers["x-budibase-type"]==="client"}s(Zb,"isClient");function Rf(t){return new Promise(e=>setTimeout(e,t))}s(Rf,"timeout");function Cf(t){return!!xm[t]}s(Cf,"isAudited");function Xb(t){if(typeof t!="object")return!1;try{JSON.stringify(t)}catch(e){if(e instanceof Error&&e?.message.includes("circular structure"))return!0}return!1}s(Xb,"hasCircularStructure");function ex(t){return!!t.match(/^.+:\/\/.+$/)}s(ex,"urlHasProtocol");function bf(t){return t&&!!t.match(/^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/)}s(bf,"validEmail");var xf=(o=>(o.MILLISECONDS="milliseconds",o.SECONDS="seconds",o.MINUTES="minutes",o.HOURS="hours",o.DAYS="days",o))(xf||{}),ou={milliseconds:1,seconds:1e3,minutes:6e4,hours:36e5,days:864e5},Ee=class t{constructor(e){this.ms=e}static{s(this,"Duration")}to(e){return this.ms/ou[e]}toMs(){return this.ms}toSeconds(){return this.to("seconds")}static convert(e,r,n){return n*ou[e]/ou[r]}static from(e,r){return new t(r*ou[e])}static fromSeconds(e){return t.from("seconds",e)}static fromMinutes(e){return t.from("minutes",e)}static fromHours(e){return t.from("hours",e)}static fromDays(e){return t.from("days",e)}static fromMilliseconds(e){return t.from("milliseconds",e)}};async function tx(t){let e=performance.now();return[await t(),Ee.fromMilliseconds(performance.now()-e)]}s(tx,"time");var xT=require("undici");function bT(t){let e=process.env.GLOBAL_AGENT_HTTP_PROXY||process.env.HTTP_PROXY,n=process.env.GLOBAL_AGENT_HTTPS_PROXY||process.env.HTTPS_PROXY||e;if(!n||!n.trim())return!1;let i=n.trim();try{new URL(i)}catch{return console.log("[fetch] Invalid proxy URL format:",n),!1}let o=t?.rejectUnauthorized!==void 0?t?.rejectUnauthorized:!0;console.log("[fetch] Creating ProxyAgent",{proxyUrl:i,rejectUnauthorized:o});let a={uri:i,requestTls:{rejectUnauthorized:o}};i.startsWith("https://")&&(a.proxyTls={rejectUnauthorized:o});try{return new xT.ProxyAgent(a)}catch(u){return console.log("[fetch] Failed to create ProxyAgent:",u),!1}}s(bT,"createProxyDispatcher");var au=null;function rx(t){return t?bT(t)||!1:(au===null&&(au=bT()),au||!1)}s(rx,"getProxyDispatcher");function nx(){au=null}s(nx,"resetProxyDispatcherCache");function ix(t){let e="",r=-1,n,i,o=t.opts?.repeat;return o&&(i=o.endDate?new Date(o.endDate).getTime():Date.now(),n=o.tz,"cron"in o?e=o.cron:r=o.every),{id:t.id.toString(),name:"",key:t.id.toString(),tz:n,endDate:i,cron:e,every:r,next:0}}s(ix,"jobToJobInformation");var uu=class{static{s(this,"InMemoryQueue")}constructor(e,r){this._name=e,this._opts=r,this._messages=[],this._emitter=new vT.default.EventEmitter,this._runCount=0,this._addCount=0,this._queuedJobIds=new Set,this._attempts=r?.defaultJobOptions?.attempts||1}async process(e,r){r=typeof e=="number"?r:e,this._emitter.on("message",async n=>{if(!n.manualTrigger&&n.opts?.repeat!=null)return;function i(){return r.length===1?r(n):new Promise((c,l)=>{r(n,s((f,p)=>{f?l(f):c(p)},"done"))})}s(i,"execute");let o=this._attempts;async function a(c,l=0){try{return await c}catch(d){if(l++,l<o&&!n._isDiscarded)return await Ne.wait(100*l),await a(i(),l);throw d}}s(a,"retryFunc");try{let c=await a(i());this._emitter.emit("completed",n,c);let l=this._messages.indexOf(n);if(l===-1)throw"Failed deleting a processed message";this._messages.splice(l,1)}catch(c){console.error(c),this._emitter.emit("error",n,c)}this._runCount++;let u=n.opts?.jobId?.toString();u&&n.opts?.removeOnComplete&&this._queuedJobIds.delete(u)})}async isReady(){return this}async add(e,r){if(typeof e=="string")throw new Error("doesn't support named jobs");let n=r,i=n?.jobId?.toString();if(i&&this._queuedJobIds.has(i)){console.log(`Ignoring already queued job ${i}`);return}if(typeof e!="object")throw"Queue only supports carrying JSON.";i&&this._queuedJobIds.add(i);let o=ne(),a=s(()=>{let c={id:o,timestamp:Date.now(),queue:this,data:e,opts:n,discard:async()=>{c._isDiscarded=!0}};this._messages.push(c),this._messages.length>1e3&&this._messages.shift(),this._addCount++,this._emitter.emit("message",c)},"pushMessage"),u=n?.delay;return u?setTimeout(a,u):a(),{id:i,finished:()=>new Promise((c,l)=>{let d=s((p,m)=>{p.id===o&&(this._emitter.off("error",d),this._emitter.off("completed",f),l(m))},"errorHandler"),f=s((p,m)=>{p.id===o&&(this._emitter.off("error",d),this._emitter.off("completed",f),c(m))},"completedHandler");this._emitter.on("error",d),this._emitter.on("completed",f)})}}async close(){}async removeRepeatableByKey(e){for(let[r,n]of this._messages.entries())if(n.id===e){this._messages.splice(r,1),this._emitter.emit("removed",n);return}}async removeJobs(e){}async clean(){return[]}async getJob(e){for(let r of this._messages)if(r.id===e)return r;return null}manualTrigger(e){for(let r of this._messages)if(r.id===e){this._emitter.emit("message",{...r,manualTrigger:!0});return}throw new Error(`Job with id ${e} not found`)}on(e,r){return this._emitter.on(e,r),this}off(e,r){return this._emitter.off(e,r),this}async count(){return this._messages.length}async getCompletedCount(){return this._runCount}async getRepeatableJobs(){return this._messages.filter(e=>e.opts?.repeat!=null).map(e=>ix(e))}async whenCurrentJobsFinished(){do await Rf(50);while(this.hasRunningJobs())}hasRunningJobs(){return this._addCount>this._runCount}},PT=uu;var Nf=F(require("bull"));var ti=(c=>(c.AUTOMATION="automationQueue",c.APP_BACKUP="appBackupQueue",c.AUDIT_LOG="auditLogQueue",c.SYSTEM_EVENT_QUEUE="systemEventQueue",c.APP_MIGRATION="appMigration",c.DOC_WRITETHROUGH_QUEUE="docWritethroughQueue",c.DEV_REVERT_PROCESSOR="devRevertProcessorQueue",c.BATCH_USER_SYNC_PROCESSOR="batchUserSyncProcessorQueue",c))(ti||{});function NT(t,e,r){ax(t,e),r&&sx(t,r)}s(NT,"addListeners");function sx(t,e){t.on("stalled",async r=>{if(e)await e(r);else if(r.opts.repeat){let n=r.id,i=await t.getRepeatableJobs();for(let o of i)o.id===n&&await t.removeRepeatableByKey(o.key);console.log(`jobId=${n} disabled`)}})}s(sx,"handleStalled");function et(t,e,r={},n={}){let i=`[BULL] ${t}=${e}`,o=r.error,a={_logKey:"bull",eventType:t,event:e,job:r.job,jobId:r.jobId||r.job?.id,...n},u;return r.job?.data?.automation&&(u={_logKey:"automation",trigger:r.job?r.job.data.automation.definition.trigger.event:void 0}),[i,o,a,u]}s(et,"getLogParams");var ox={automationQueue:"automation-event",appBackupQueue:"app-backup-event",auditLogQueue:"audit-log-event",systemEventQueue:"system-event",appMigration:"app-migration",docWritethroughQueue:"doc-writethrough",devRevertProcessorQueue:"dev-revert-event",batchUserSyncProcessorQueue:"batch-user-sync-processor"};function ax(t,e){let r=ox[e];function n(i,o){let a=i.data.event?.appId;if(a)return ef(a,o);o()}s(n,"doInJobContext"),t.on("stalled",async i=>{await n(i,()=>{console.error(...et(r,"stalled",{job:i}))})}).on("error",i=>{console.error(...et(r,"error",{error:i}))}),process.env.NODE_DEBUG?.includes("bull")&&t.on("waiting",i=>{console.info(...et(r,"waiting",{jobId:i}))}).on("active",async i=>{await n(i,()=>{console.info(...et(r,"active",{job:i}))})}).on("progress",async(i,o)=>{await n(i,()=>{console.info(...et(r,"progress",{job:i},{progress:o}))})}).on("completed",async(i,o)=>{await n(i,()=>{console.info(...et(r,"completed",{job:i},{result:o}))})}).on("failed",async(i,o)=>{await n(i,()=>{console.error(...et(r,"failed",{job:i,error:o}))})}).on("paused",()=>{console.info(...et(r,"paused"))}).on("resumed",()=>{console.info(...et(r,"resumed"))}).on("cleaned",(i,o)=>{console.info(...et(r,"cleaned",{},{length:i.length,type:o}))}).on("drained",()=>{console.info(...et(r,"drained"))}).on("removed",i=>{console.info(...et(r,"removed",{job:i}))})}s(ax,"logging");var cu={};N(cu,{cleanup:()=>ux,clear:()=>Pf,set:()=>vf});var Ys=[];function vf(t,e){let r=setInterval(t,e);return Ys.push(r),r}s(vf,"set");function Pf(t){let e=Ys.indexOf(t);e!==-1&&Ys.splice(e,1),clearInterval(t)}s(Pf,"clear");function ux(){for(let t of Ys)clearInterval(t);Ys=[]}s(ux,"cleanup");var qt=F(require("dd-trace")),Hs=F(require("object-sizeof"));var cx=Ee.fromMinutes(5).toMs(),lx=Ee.fromSeconds(30).toMs(),Uf=Ee.fromSeconds(60).toMs(),zs=[],lu;async function UT(){for(let t of zs)await t.clean(Uf,"completed"),await t.clean(Uf,"failed")}s(UT,"cleanup");async function dx(t,e,r){let n=performance.now();try{let i=await e();return qt.default.dogstatsd.increment(`${t}.success`,1,r),i}catch(i){throw qt.default.dogstatsd.increment(`${t}.error`,1,r),i}finally{let i=performance.now()-n;qt.default.dogstatsd.distribution(`${t}.duration.ms`,i,r),qt.default.dogstatsd.increment(t,1,r)}}s(dx,"withMetrics");function LT(t){return{"job.opts.attempts":t.attempts,"job.opts.backoff":t.backoff,"job.opts.delay":t.delay,"job.opts.jobId":t.jobId,"job.opts.lifo":t.lifo,"job.opts.preventParsingData":t.preventParsingData,"job.opts.priority":t.priority,"job.opts.removeOnComplete":t.removeOnComplete,"job.opts.removeOnFail":t.removeOnFail,"job.opts.repeat":t.repeat,"job.opts.stackTraceLimit":t.stackTraceLimit,"job.opts.timeout":t.timeout}}s(LT,"jobOptsTags");function fx(t){return{"job.id":t.id,"job.attemptsMade":t.attemptsMade,"job.timestamp":t.timestamp,"job.data.sizeBytes":(0,Hs.default)(t.data),...LT(t.opts||{})}}s(fx,"jobTags");var ht=class{static{s(this,"BudibaseQueue")}constructor(e,r={}){this.opts=r,this.jobQueue=e,this.queue=this.initQueue()}get name(){return this.queue.name}initQueue(){let r={redis:Jr(),settings:{maxStalledCount:this.opts.maxStalledCount?this.opts.maxStalledCount:0,lockDuration:cx,lockRenewTime:lx}};this.opts.jobOptions&&(r.defaultJobOptions=this.opts.jobOptions);let n;return E.isTest()?process.env.BULL_TEST_REDIS_PORT&&!isNaN(+process.env.BULL_TEST_REDIS_PORT)?n=new Nf.default(this.jobQueue,{...r,redis:{host:"localhost",port:+process.env.BULL_TEST_REDIS_PORT}}):n=new PT(this.jobQueue,r):n=new Nf.default(this.jobQueue,r),NT(n,this.jobQueue,this.opts.removeStalledCb),zs.push(n),!lu&&!E.isTest()&&(lu=vf(UT,Uf),UT().catch(i=>{console.error(`Unable to cleanup ${this.jobQueue} initially - ${i}`)})),n}getBullQueue(){return this.queue}process(...e){let r,n;e.length===2?(r=e[0],n=e[1]):n=e[0];let i=s(async(a,u)=>{await qt.default.trace("queue.process",async c=>{if(a.data._parentSpanContext){let l=a.data._parentSpanContext,d={traceId:l.traceId,spanId:l.spanId,toTraceId:()=>l.traceId,toSpanId:()=>l.spanId,toTraceparent:()=>""};c.addLink(d)}c.addTags({"queue.name":this.jobQueue,...fx(a)}),this.opts.jobTags&&c.addTags(this.opts.jobTags(a.data)),qt.default.dogstatsd.distribution("queue.process.sizeBytes",(0,Hs.default)(a.data),this.metricTags()),await this.withMetrics("queue.process",()=>u?n(a,u):n(a))})},"processCallback"),o;return n.length===1?o=s(a=>i(a),"wrappedCb"):o=i,r?this.queue.process(r,o):this.queue.process(o)}async add(e,r){return await qt.default.trace("queue.add",async n=>(n.addTags({"queue.name":this.jobQueue,"job.data.sizeBytes":(0,Hs.default)(e),...LT(r||{})}),this.opts.jobTags&&n.addTags(this.opts.jobTags(e)),e._parentSpanContext={traceId:n.context().toTraceId(),spanId:n.context().toSpanId()},qt.default.dogstatsd.distribution("queue.add.sizeBytes",(0,Hs.default)(e),this.metricTags()),await this.withMetrics("queue.add",()=>this.queue.add(e,r))))}withMetrics(e,r){return dx(e,r,this.metricTags())}metricTags(){return{queueName:this.jobQueue}}close(e){return this.queue.close(e)}whenCurrentJobsFinished(){return this.queue.whenCurrentJobsFinished()}};async function px(){lu&&Pf(lu),console.log("Waiting for current queue jobs to finish...");for(let t of zs)await t.whenCurrentJobsFinished();console.log("Closing queue Redis connections...");for(let t of zs)await t.close();zs=[],console.log("Queues shutdown")}s(px,"shutdown");var no={};N(no,{correlation:()=>Js,logAlert:()=>cn,logAlertWithInfo:()=>iv,logWarn:()=>si,logger:()=>Iu,system:()=>Zf});var Js={};N(Js,{getId:()=>Lf,setHeader:()=>mx});var kT=require("correlation-id"),mx=s(t=>{let e=kT.getId();e&&(t["x-budibase-correlation-id"]=e)},"setHeader");function Lf(){return kT.getId()}s(Lf,"getId");var Ou=F(require("pino")),hS=F(require("pino-pretty")),Xf=F(require("dd-trace")),ES=require("dd-trace/ext");var Zf={};N(Zf,{getLogReadStream:()=>Zx,getSingleFileMaxSizeInfo:()=>mS,localFileDestination:()=>Jf});var ro=F(require("fs")),zf=F(require("path")),lS=F(require("rotating-file-stream"));var Hf={};N(Hf,{ObjectStore:()=>tt,ObjectStoreBuckets:()=>Ex,SIGNED_FILE_PREFIX:()=>Vf,bucketTTLConfig:()=>du,budibaseTempDir:()=>an,client3rdPartyLibrary:()=>Kx,clientLibraryPath:()=>qx,clientLibraryUrl:()=>Qx,createBucketIfNotExists:()=>to,deleteFile:()=>Cx,deleteFiles:()=>bx,deleteFolder:()=>jT,downloadTarball:()=>vx,downloadTarballDirect:()=>xx,enrichPWAImages:()=>jx,enrichPluginURLs:()=>Hx,extractBucketAndPath:()=>kf,getAllFiles:()=>wx,getAppFileUrl:()=>rS,getClientCacheKey:()=>tS,getGlobalFileS3Key:()=>nS,getGlobalFileUrl:()=>Yx,getObjectMetadata:()=>Px,getPluginIconKey:()=>oS,getPluginJSKey:()=>sS,getPluginS3Dir:()=>uS,getPresignedUrl:()=>un,getReadStream:()=>fu,listAllObjects:()=>Gf,objectExists:()=>Kf,processAutomationAttachment:()=>yx,processObjectStoreAttachment:()=>$T,retrieve:()=>QT,retrieveDirectory:()=>Rx,retrieveToTmp:()=>Dx,sanitizeBucket:()=>be,sanitizeKey:()=>pe,streamUpload:()=>KT,streamUploadMany:()=>Ix,upload:()=>Ox,uploadDirectory:()=>qf});var mu=require("@aws-sdk/client-s3"),Mf=require("@aws-sdk/lib-storage"),VT=require("@aws-sdk/s3-request-presigner");var Kt=F(require("dd-trace")),ri=F(require("fs")),Xs=F(require("fs/promises")),Ff=F(require("node-fetch")),Tr=require("path"),hu=F(require("stream")),eo=require("stream/promises"),Bf=F(require("tar-fs")),Wf=require("uuid"),$f=F(require("zlib"));var MT=F(require("fs")),FT=require("os"),Zs=F(require("path")),BT=F(require("stream"));var Ex={BACKUPS:E.BACKUPS_BUCKET_NAME,APPS:E.APPS_BUCKET_NAME,TEMPLATES:E.TEMPLATES_BUCKET_NAME,GLOBAL:E.GLOBAL_BUCKET_NAME,PLUGINS:E.PLUGIN_BUCKET_NAME,TEMP:E.TEMP_BUCKET_NAME},WT=(0,Zs.join)((0,FT.tmpdir)(),".budibase");try{MT.default.mkdirSync(WT)}catch(t){if(t.code!=="EEXIST")throw t}function an(){return WT}s(an,"budibaseTempDir");var du=s((t,e)=>{let n={Rules:[{ID:`${t}-ExpireAfter${e}days`,Prefix:"",Status:"Enabled",Expiration:{Days:e}}]};return{Bucket:t,LifecycleConfiguration:n}},"bucketTTLConfig");async function gx(t){let e=await fetch(t.url);if(!e.ok||!e.body)throw new Error(`Unexpected response ${e.statusText}`);let r=Zs.default.basename(new URL(t.url).pathname);if(!e.body)throw new Error("No response received for attachment");return{filename:t.filename||r,content:BT.default.Readable.fromWeb(e.body)}}s(gx,"processUrlAttachment");async function $T(t){let e=kf(t.url);if(e===null)throw new Error("Invalid signed URL");let{bucket:r,path:n}=e,{stream:i}=await fu(r,n),o=Zs.default.basename(n);return{bucket:r,path:n,filename:t.filename||o,content:i}}s($T,"processObjectStoreAttachment");async function yx(t){return t.url?.startsWith("http://")||t.url?.startsWith("https://")?await gx(t):await $T(t)}s(yx,"processAutomationAttachment");var Tx=require("sanitize-s3-objectkey"),Sx={bucketCreationPromises:{}},Vf="/files/signed",yr={txt:"text/plain",html:"text/html",css:"text/css",js:"application/javascript",json:"application/json",gz:"application/gzip",svg:"image/svg+xml",form:"multipart/form-data"},Ax=[yr.html,yr.css,yr.js,yr.json];function pe(t){return Tx(be(t)).replace(/\\/g,"/")}s(pe,"sanitizeKey");function be(t){return t.replace(new RegExp(Ze,"g"),Je)}s(be,"sanitizeBucket");function tt(t={presigning:!1}){let e={forcePathStyle:!0,credentials:{accessKeyId:E.MINIO_ACCESS_KEY,secretAccessKey:E.MINIO_SECRET_KEY},region:E.AWS_REGION};return!E.MINIO_ENABLED&&E.AWS_SESSION_TOKEN&&(e.credentials={accessKeyId:E.MINIO_ACCESS_KEY,secretAccessKey:E.MINIO_SECRET_KEY,sessionToken:E.AWS_SESSION_TOKEN}),E.MINIO_URL&&(t.presigning&&E.MINIO_ENABLED?e.endpoint="http://minio-service":e.endpoint=E.MINIO_URL),new mu.S3(e)}s(tt,"ObjectStore");async function to(t,e){e=be(e);try{return await t.headBucket({Bucket:e}),{created:!1,exists:!0}}catch(r){let n=r.statusCode||r.$response?.statusCode,i=Sx.bucketCreationPromises,o=n===404,a=n===403;if(i[e])return await i[e],{created:!1,exists:!0};if(o||a){if(o)return i[e]=t.createBucket({Bucket:e}).catch(u=>{if(u.Code!=="BucketAlreadyOwnedByYou")throw u}),await i[e],delete i[e],{created:!0,exists:!1};throw new Error("Access denied to object store bucket."+r)}else throw new Error("Unable to write to object store bucket.")}}s(to,"createBucketIfNotExists");var _x=s((t,e)=>{if(e)return e;let r=t.split(".").pop();return r?yr[r.toLowerCase()]:yr.txt},"resolveContentType"),GT=s(async(t,e,r)=>{let n=be(t),i=tt(),o=await to(i,n);if(r.addTags({bucketCreated:o.created,bucketExists:o.exists}),e&&o.created){let a=du(n,e);await i.putBucketLifecycleConfiguration(a)}return{bucket:n,client:i,bucketCreated:o}},"initialiseBucket"),qT=s(async({client:t,bucket:e,filename:r,stream:n,type:i,extra:o})=>{if(!n)throw new Error("Stream to upload is invalid/undefined");let a=_x(r,i),u=pe(r),c={Bucket:e,Key:u,Body:n,ContentType:a,...o??{}};return{details:await new Mf.Upload({client:t,params:c}).done(),contentType:a}},"streamUploadInternal");async function Ox({bucket:t,filename:e,path:r,type:n,metadata:i,body:o,ttl:a}){let u=e.split(".").pop(),c=r?(await Xs.default.open(r)).createReadStream():o,l=tt(),d=await to(l,t);if(a&&d.created){let g=du(t,a);await l.putBucketLifecycleConfiguration(g)}let f=n,p=f||(u?yr[u.toLowerCase()]:yr.txt),m={Bucket:be(t),Key:pe(e),Body:c,ContentType:p};if(i&&typeof i=="object"){for(let g of Object.keys(i))(!i[g]||typeof i[g]!="string")&&delete i[g];m.Metadata=i}return new Mf.Upload({client:l,params:m}).done()}s(Ox,"upload");async function KT({bucket:t,stream:e,filename:r,type:n,extra:i,ttl:o}){return await Kt.default.trace("streamUpload",async a=>{a.addTags({bucketName:t,filename:r,type:n,ttl:o});let u=r.split(".").pop();a.addTags({extension:u});let{bucket:c,client:l}=await GT(t,o,a),{details:d,contentType:f}=await qT({client:l,bucket:c,filename:r,stream:e,type:n,extra:i}),p=await l.headObject({Bucket:c,Key:pe(r)});return a.addTags({contentType:f,contentLength:p.ContentLength}),{...d,ContentLength:p.ContentLength}})}s(KT,"streamUpload");async function Ix({bucket:t,files:e,ttl:r}){return await Kt.default.trace("streamUploadMany",async i=>{if(i.addTags({bucketName:t,ttl:r,fileCount:e.length}),!e.length)return[];let{bucket:o,client:a}=await GT(t,r,i),u=e.map((l,d)=>({...l,index:d})),c=new Array(e.length);return await St.parallelForeach(u,async l=>{let{details:d}=await qT({client:a,bucket:o,filename:l.filename,stream:l.stream,type:l.type,extra:l.extra});c[l.index]=d},10),c})}s(Ix,"streamUploadMany");async function QT(t,e){return await Kt.default.trace("retrieve",async r=>{r.addTags({bucketName:t,filepath:e});let n=tt(),i={Bucket:be(t),Key:pe(e)},o=await n.getObject(i);if(!o.Body)throw new Error("Unable to retrieve object");if(r.addTags({contentLength:o.ContentLength,contentType:o.ContentType}),Ax.includes(o.ContentType))return r.addTags({string:!0}),o.Body.transformToString();{r.addTags({string:!1});let a=o.Body.transformToWebStream();return hu.default.Readable.fromWeb(a)}})}s(QT,"retrieve");async function*Gf(t,e){let r=tt(),n=s((a={})=>r.listObjectsV2({...a,Bucket:be(t),Prefix:pe(e)}),"list"),i=!1,o;do{let a={};o&&(a.ContinuationToken=o);let u=await n(a);if(u.Contents)for(let c of u.Contents)yield c;i=!!u.IsTruncated,o=u.NextContinuationToken}while(i&&o)}s(Gf,"listAllObjects");async function wx(t,e){let r={};return await St.parallelForeach(Gf(t,e),async n=>{if(!n.Key)throw new Error("file.Key must be defined");r[n.Key]=n},5),r}s(wx,"getAllFiles");async function un(t,e,r=3600){let n=tt({presigning:!0}),i={Bucket:be(t),Key:pe(e)},o=await(0,VT.getSignedUrl)(n,new mu.GetObjectCommand(i),{expiresIn:r});if(E.MINIO_ENABLED){let a=new URL(o),u=a.pathname,c=a.search;return`${Vf}${u}${c}`}else return o}s(un,"getPresignedUrl");async function Dx(t,e){return await Kt.default.trace("retrieveToTmp",async r=>{r.addTags({bucketName:t,filepath:e}),t=be(t),e=pe(e);let n=await QT(t,e),i=(0,Tr.join)(an(),(0,Wf.v4)());return r.addTags({outputPath:i}),n instanceof hu.default.Readable?(r.addTags({stream:!0}),await(0,eo.pipeline)(n,ri.default.createWriteStream(i))):(r.addTags({stream:!1}),ri.default.writeFileSync(i,n)),i})}s(Dx,"retrieveToTmp");async function Rx(t,e,r){return await Kt.default.trace("retrieveDirectory",async n=>{n.addTags({bucketName:t,path:e});let i=(0,Tr.join)(an(),(0,Wf.v4)());await Xs.default.mkdir(i,{recursive:!0});let o=0;return await St.parallelForeach(Gf(t,e),async a=>{let{Key:u}=a;!u||r?.some(c=>c.test(u))||(o++,await Kt.default.trace("retrieveDirectory.object",async c=>{let l=a.Key;c.addTags({filename:l});let{stream:d}=await fu(t,l),f=l.split("/"),p=f.slice(0,f.length-1),m=(0,Tr.join)(i,...p);f.length>1&&!ri.default.existsSync(m)&&await Xs.default.mkdir(m,{recursive:!0}),await(0,eo.pipeline)(d,ri.default.createWriteStream((0,Tr.join)(i,...f),{mode:420}))}))},5),n.addTags({numObjects:o}),i})}s(Rx,"retrieveDirectory");async function Cx(t,e){let r=tt();await to(r,t);let n={Bucket:t,Key:pe(e)};return r.deleteObject(n)}s(Cx,"deleteFile");async function bx(t,e){let r=tt();await to(r,t);let n={Bucket:t,Delete:{Objects:e.map(i=>({Key:pe(i)}))}};return r.deleteObjects(n)}s(bx,"deleteFiles");async function jT(t,e){t=be(t),e=pe(e);let r=tt(),n={Bucket:t,Prefix:e},i=await r.listObjects(n);if(i.Contents?.length===0)return;let o={Bucket:t,Delete:{Objects:[]}};if(i.Contents?.forEach(a=>{o.Delete.Objects.push({Key:a.Key})}),o.Delete.Objects.length&&(await r.deleteObjects(o)).Deleted?.length===1e3)return jT(t,e)}s(jT,"deleteFolder");async function qf(t,e,r){return await Kt.default.trace("uploadDirectory",async n=>{n.addTags({bucketName:t,localPath:e,bucketPath:r}),t=be(t);let i=await Xs.default.readdir(e,{withFileTypes:!0});n.addTags({numFiles:i.length});for(let o of i){let a=pe((0,Tr.join)(r,o.name)),u=(0,Tr.join)(e,o.name);o.isDirectory()?await qf(t,u,a):await KT({bucket:t,filename:a,stream:ri.default.createReadStream(u)})}return i})}s(qf,"uploadDirectory");async function xx(t,e,r={}){e=pe(e);let n=await(0,Ff.default)(t,{headers:r});if(!n.ok)throw new Error(`unexpected response ${n.statusText}`);await(0,eo.pipeline)(n.body,$f.default.createUnzip(),Bf.default.extract(e))}s(xx,"downloadTarballDirect");async function vx(t,e,r){e=be(e),r=pe(r);let n=await(0,Ff.default)(t);if(!n.ok)throw new Error(`unexpected response ${n.statusText}`);let i=(0,Tr.join)(an(),r);return await(0,eo.pipeline)(n.body,$f.default.createUnzip(),Bf.default.extract(i)),!E.isTest()&&E.SELF_HOSTED&&await qf(e,i,r),i}s(vx,"downloadTarball");async function fu(t,e){return await Kt.default.trace("getReadStream",async r=>{t=be(t),e=pe(e),r.addTags({bucketName:t,path:e});let n=tt(),i={Bucket:t,Key:e},o=await n.getObject(i);if(!o.Body||!(o.Body instanceof hu.default.Readable))throw new Error("Unable to retrieve stream - invalid response");return r.addTags({contentLength:o.ContentLength,contentType:o.ContentType}),{stream:o.Body,contentLength:o.ContentLength,contentType:o.ContentType}})}s(fu,"getReadStream");async function Px(t,e){t=be(t),e=pe(e);let r=tt(),n={Bucket:t,Key:e};try{return await r.headObject(n)}catch{throw new Error("Unable to retrieve metadata from object")}}s(Px,"getObjectMetadata");async function Kf(t,e){t=be(t),e=pe(e);let r=tt(),n={Bucket:t,Key:e};try{return await r.headObject(n),!0}catch(i){if((i.statusCode||i.$response?.statusCode)===404)return!1;throw i}}s(Kf,"objectExists");function kf(t){let e=t.split("?")[0],r=new RegExp(`^${Vf}/(?<bucket>[^/]+)/(?<path>.+)$`),n=e.match(r);if(n&&n.groups){let{bucket:i,path:o}=n.groups;return{bucket:i,path:o}}return null}s(kf,"extractBucketAndPath");var eS=F(require("querystring"));var Au={};N(Au,{FlagSet:()=>gu,all:()=>Mx,flags:()=>Qf,getEnvFlags:()=>JT,init:()=>Ux,isEnabled:()=>Su,parseEnvFlags:()=>Tu,shutdown:()=>Lx,testutils:()=>jf});var yu=F(require("crypto")),YT=F(require("dd-trace")),HT=require("lodash"),zT=require("posthog-node");var Eu;function Ux(t){E.POSTHOG_TOKEN&&E.POSTHOG_API_HOST&&!E.SELF_HOSTED&&E.POSTHOG_FEATURE_FLAGS_ENABLED?(console.log("initializing posthog client..."),Eu=new zT.PostHog(E.POSTHOG_TOKEN,{host:E.POSTHOG_API_HOST,personalApiKey:E.POSTHOG_PERSONAL_TOKEN,featureFlagsPollingInterval:Ee.fromMinutes(3).toMs(),...t})):console.log("posthog disabled")}s(Ux,"init");function Lx(){Eu?.shutdown()}s(Lx,"shutdown");function Tu(t){let e=t.split(",").map(n=>n.split(":")),r=[];for(let[n,...i]of e)for(let o of i){let a=!0;o.startsWith("!")&&(o=o.slice(1),a=!1),r.push({tenantId:n,key:o,value:a})}return r}s(Tu,"parseEnvFlags");function JT(){return Tu(E.TENANT_FEATURE_FLAGS||"")}s(JT,"getEnvFlags");var gu=class{constructor(e){this.flagSchema=e;this.setId=yu.randomUUID()}static{s(this,"FlagSet")}defaults(){return(0,HT.cloneDeep)(this.flagSchema)}isFlagName(e){return this.flagSchema[e]!==void 0}async isEnabled(e){return(await this.fetch())[e]}async fetch(){return await YT.default.trace("features.fetch",async e=>{let r=sf(this.setId);if(r)return e?.addTags({fromCache:!0}),r;let n={},i=this.defaults(),o=G(),a=new Set;if(za())return i;for(let{tenantId:f,key:p,value:m}of JT())if(!(!f||f!=="*"&&f!==o)&&(n.readFromEnvironmentVars=!0,m===!1&&a.add(p),!!this.isFlagName(p))){if(typeof i[p]!="boolean")throw new Error(`Feature: ${p} is not a boolean`);i[p]=m,n[`flags.${p}.source`]="environment"}let u=Ft(),c=u?._id;if(!c){let f=rf();f&&(c=yu.createHash("sha512").update(f).digest("hex"))}let l=u?.tenantId;if(l||(l=o),n["identity.type"]=u?.type,n["identity._id"]=u?._id,n.tenantId=l,n.userId=c,Eu&&c){n.readFromPostHog=!0;let f=await ni(),p={tenantId:l},m={tenant:{id:l}};f.config.createdVersion&&(m.tenant.createdVersion=f.config.createdVersion),f.createdAt&&(m.tenant.createdAt=`${f.createdAt}`);let h=await Eu.getAllFlags(c,{personProperties:p,onlyEvaluateLocally:!0,groups:{tenant:l},groupProperties:m});for(let[g,y]of Object.entries(h))if(this.isFlagName(g)){if(typeof y!="boolean"){console.warn(`Invalid value for posthog flag "${g}": ${y}`);continue}if(!(i[g]===!0||a.has(g)))try{i[g]=y,n[`flags.${g}.source`]="posthog"}catch(S){console.warn(`Error parsing posthog flag "${g}": ${y}`,S)}}}let d=af();for(let[f,p]of Object.entries(d))this.isFlagName(f)&&typeof p=="boolean"&&(i[f]=p,n[`flags.${f}.source`]="override");of(this.setId,i);for(let[f,p]of Object.entries(i))n[`flags.${f}.value`]=p;return e?.addTags(n),i})}},kx={USE_ZOD_VALIDATOR:!1,AI_AGENTS:!1,ESM_CLIENT:!1,DEBUG_UI:E.isDev(),DEV_USE_CLIENT_FROM_STORAGE:!1,DUPLICATE_APP:!1,COPY_RESOURCES_BETWEEN_WORKSPACES:!1},Qf=new gu(kx);async function Su(t){return await Qf.isEnabled(t)}s(Su,"isEnabled");async function Mx(){return await Qf.fetch()}s(Mx,"all");var jf={};N(jf,{setFeatureFlags:()=>ZT,withFeatureFlags:()=>Wx});function Fx(){let t={};for(let{tenantId:e,key:r,value:n}of Tu(process.env.TENANT_FEATURE_FLAGS||"")){let i=t[e]||{};i[r]!==!1&&(i[r]=n,t[e]=i)}return t}s(Fx,"getCurrentFlags");function Bx(t){let e=[];for(let[r,n]of Object.entries(t))for(let[i,o]of Object.entries(n))o===!1?e.push(`${r}:!${i}`):e.push(`${r}:${i}`);return e.join(",")}s(Bx,"buildFlagString");function ZT(t,e){let r=Fx();for(let[i,o]of Object.entries(e)){let a=r[t]||{};a[i]=o,r[t]=a}let n=Bx(r);return As({TENANT_FEATURE_FLAGS:n})}s(ZT,"setFeatureFlags");function Wx(t,e,r){let n=ZT(t,e),i=r();return i instanceof Promise?i.finally(n):(n(),i)}s(Wx,"withFeatureFlags");var XT=F(require("aws-cloudfront-sign"));var _u;function $x(){if(!E.CLOUDFRONT_PRIVATE_KEY_64)throw new Error("CLOUDFRONT_PRIVATE_KEY_64 is not set");return _u||(_u=Buffer.from(E.CLOUDFRONT_PRIVATE_KEY_64,"base64").toString("utf-8"),_u)}s($x,"getPrivateKey");var Vx=s(()=>({keypairId:E.CLOUDFRONT_PUBLIC_KEY_ID,privateKeyString:$x(),expireTime:new Date().getTime()+1e3*60*60*24}),"getCloudfrontSignParams"),ii=s(t=>{let e=Gx(t);return XT.getSignedUrl(e,Vx())},"getPresignedUrl"),Gx=s(t=>{let e="/";return t.startsWith("/")&&(e=""),`${E.CLOUDFRONT_CDN}${e}${t}`},"getUrl");async function qx(t){let e=`${pe(t)}/budibase-client.js`,r=`${pe(t)}/budibase-client.esm.js`;return await Su("ESM_CLIENT")&&await Kf(E.APPS_BUCKET_NAME,r)?r:e}s(qx,"clientLibraryPath");function Kx(t,e){return`${pe(t)}/${e}`}s(Kx,"client3rdPartyLibrary");async function Qx(t,e){return`/api/assets/${t}/client?${await tS(e)}`}s(Qx,"clientLibraryUrl");async function tS(t){let e,r;try{e=G()}finally{r={version:t}}return e&&e!==ae&&(r.tenantId=e),r.dynamic=await Su("ESM_CLIENT"),eS.default.encode(r)}s(tS,"getClientCacheKey");async function rS(t){return E.CLOUDFRONT_CDN?ii(t):await un(E.APPS_BUCKET_NAME,t)}s(rS,"getAppFileUrl");async function jx(t){if(t.length===0)return[];try{return await Promise.all(t.map(async e=>({...e,src:await rS(e.src),type:e.type||"image/png"})))}catch(e){return console.error("Error enriching PWA images:",e),t}}s(jx,"enrichPWAImages");var Yx=s(async(t,e,r)=>{let n=nS(t,e);return E.CLOUDFRONT_CDN?(r&&(n=`${n}?etag=${r}`),ii(n)):await un(E.GLOBAL_BUCKET_NAME,n)},"getGlobalFileUrl"),nS=s((t,e)=>{let r=`${t}/${e}`;return E.MULTI_TENANCY&&(r=`${G()}/${r}`),r},"getGlobalFileS3Key");async function Hx(t){return!t||!t.length?[]:await Promise.all(t.map(async e=>{let r=await zx(e),n=await Jx(e);return{...e,jsUrl:r,iconUrl:n}}))}s(Hx,"enrichPluginURLs");async function zx(t){let e=sS(t);return iS(e)}s(zx,"getPluginJSUrl");async function Jx(t){let e=oS(t);if(e)return iS(e)}s(Jx,"getPluginIconUrl");async function iS(t){return E.CLOUDFRONT_CDN?ii(t):await un(E.PLUGIN_BUCKET_NAME,t)}s(iS,"getPluginUrl");function sS(t){return aS(t,"plugin.min.js")}s(sS,"getPluginJSKey");function oS(t){let e=t.iconUrl?"icon.svg":t.iconFileName;if(e)return aS(t,e)}s(oS,"getPluginIconKey");function aS(t,e){return`${uS(t.name)}/${e}`}s(aS,"getPluginS3Key");function uS(t){let e=`${t}`;return E.MULTI_TENANCY&&(e=`${G()}/${e}`),E.CLOUDFRONT_CDN&&(e=`plugins/${e}`),e}s(uS,"getPluginS3Dir");var dS="budibase.log",fS="budibase-logs-history.txt",pS=zf.default.join(an(),"systemlogs");function cS(t){return zf.default.join(pS,t)}s(cS,"getFullPath");function mS(t){let e=/(\d+)([A-Za-z])/,r=t?.match(e);if(!r){console.warn("totalMaxSize does not have a valid value",{totalMaxSize:t});return}let n=+r[1],i=r[2];if(n===1)switch(i){case"B":return{size:`${n}B`,totalHistoryFiles:1};case"K":return{size:`${n*1e3/2}B`,totalHistoryFiles:1};case"M":return{size:`${n*1e3/2}K`,totalHistoryFiles:1};case"G":return{size:`${n*1e3/2}M`,totalHistoryFiles:1};default:return}return n%2===0?{size:`${n/2}${i}`,totalHistoryFiles:1}:{size:`1${i}`,totalHistoryFiles:n-1}}s(mS,"getSingleFileMaxSizeInfo");function Jf(){let t=mS(E.ROLLING_LOG_MAX_SIZE);return lS.createStream(dS,{size:t?.size,path:pS,maxFiles:t?.totalHistoryFiles||1,immutable:!0,history:fS,initialRotation:!1})}s(Jf,"localFileDestination");function Zx(){let t=[],e=cS(fS);if(ro.default.existsSync(e)){let i=ro.default.readFileSync(e,"utf-8").split(`
|
|
37
|
-
`);for(let o of i.filter(a=>a))t.push(ro.default.readFileSync(o))}return t.push(ro.default.readFileSync(cS(dS))),Buffer.concat(t.map(n=>new Uint8Array(n)))}s(Zx,"getLogReadStream");function Xx(t){return typeof t=="object"&&t!==null&&!(t instanceof Error)}s(Xx,"isPlainObject");function ev(t){return t instanceof Error}s(ev,"isError");function tv(t){return typeof t=="string"}s(tv,"isMessage");var Sr;if(!E.DISABLE_PINO_LOGGER){let t=E.LOG_LEVEL,e={level:t,formatters:{level:c=>({level:c.toUpperCase()}),bindings:()=>E.SELF_HOSTED?{service:E.SERVICE_NAME}:{}},timestamp:()=>`,"timestamp":"${new Date(Date.now()).toISOString()}"`},r=[];r.push(E.isDev()?{stream:(0,hS.default)({singleLine:!0}),level:t}:{stream:process.stdout,level:t}),E.SELF_HOSTED&&r.push({stream:Jf(),level:t}),Sr=r.length?(0,Ou.default)(e,Ou.default.multistream(r)):(0,Ou.default)(e);let n=s(c=>{let l,d=[],f="";c.forEach(y=>{tv(y)&&(f=`${f} ${y}`.trimStart()),Xx(y)&&d.push(y),ev(y)&&(l=y)});let p=u(),m={};m={tenantId:i(),appId:o(),automationId:a(),identityId:p?._id,identityType:p?.type,correlationId:Lf()};let h=Xf.default.scope().active();h&&Xf.default.inject(h.context(),ES.formats.LOG,m);let g={err:l,pid:process.pid,...m};if(d.length){let y={},S=0;for(let O=0;O<d.length;O++){let _=d[O],D=_._logKey;D?(delete _._logKey,g[D]=_):(y[S]=_,S++)}Object.keys(y).length&&(g.data=y)}return[g,f]},"getLogParams");console.log=(...c)=>{let[l,d]=n(c);Sr?.info(l,d)},console.info=(...c)=>{let[l,d]=n(c);Sr?.info(l,d)},console.warn=(...c)=>{let[l,d]=n(c);Sr?.warn(l,d)},console.error=(...c)=>{let[l,d]=n(c);Sr?.error(l,d)},console.trace=(...c)=>{let[l,d]=n(c);l.err||(l.err=new Error),Sr?.trace(l,d)},console.debug=(...c)=>{let[l,d]=n(c);Sr?.debug(l,d)};let i=s(()=>{let c;try{c=G()}catch{}return c},"getTenantId"),o=s(()=>{let c;try{c=Le()}catch{}return c},"getAppId"),a=s(()=>{let c;try{c=tf()}catch{}return c},"getAutomationId"),u=s(()=>{let c;try{c=Ft()}catch{}return c},"getIdentity")}var Iu=Sr;var rv=["AccountError"];function nv(t){return t&&t.suppressAlert}s(nv,"isSuppressed");function cn(t,e){e&&rv.includes(e.name)&&nv(e)||console.error(`bb-alert: ${t}`,e)}s(cn,"logAlert");function iv(t,e,r,n){t=`${t} - db: ${e} - doc: ${r} - error: `,cn(t,n)}s(iv,"logAlertWithInfo");function si(t,e){console.warn(`bb-warn: ${t}`,e)}s(si,"logWarn");var wu=class extends Error{static{s(this,"UnretriableError")}constructor(e){super(e),this.name="PermanentError"}},ep=class{static{s(this,"QueuedProcessor")}constructor(e,r={}){let{maxAttempts:n=3,removeOnFail:i=!0,removeOnComplete:o=!0,maxStalledCount:a=3}=r;this.waitForCompletionMs=r.waitForCompletionMs||1e4,this._queue=new ht(e,{maxStalledCount:a,jobOptions:{attempts:n,removeOnFail:i,removeOnComplete:o}}),this._queue.process(async(u,c)=>{try{let l=await this.processFn(u.data);c?.(null,l)}catch(l){l instanceof wu&&await u.discard(),cn(`Failed to process job in ${this._queue.name}`,l),c?.(l)}})}async close(e){await this._queue.close(e)}async execute(e){try{let r=await this._queue.add(e);return{success:!0,result:await Ne.withTimeout(this.waitForCompletionMs,()=>r.finished())}}catch(r){if(r.errno!=="ETIME")throw r;return{success:!1,reason:"timeout"}}}};var sv=100,Du,io=class t{static{s(this,"DocWritethroughProcessor")}static get queue(){return t._queue||(t._queue=new ht("docWritethroughQueue",{jobOptions:{attempts:sv}})),t._queue}init(){return t.queue.process(async e=>{try{await this.persistToDb(e.data)}catch(r){throw r.status===409?new Error(`Conflict persisting message ${e.id}. Attempt ${e.attemptsMade}`):r}}),this}async persistToDb({dbName:e,docId:r,data:n}){if(r.startsWith("scimlog"))return;let i=De(e),o;try{o=await i.get(r)}catch{o={_id:r}}o={...o,...n},await i.put(o)}},rp=class{static{s(this,"DocWritethrough")}constructor(e,r){this.db=e,this._docId=r}get docId(){return this._docId}async patch(e){await io.queue.add({dbName:this.db.name,docId:this.docId,data:e})}};function gS(){return Du=new io().init(),Du}s(gS,"init");function ov(){return Du||gS()}s(ov,"getProcessor");var oo={};N(oo,{CacheKey:()=>ye,TTL:()=>fn,bustCache:()=>oi,destroy:()=>so,get:()=>pn,keys:()=>Ru,store:()=>jt,withCache:()=>Ar,withCacheWithDynamicTTL:()=>yS});function Dt(t){let e=G();return`${t}:${e}`}s(Dt,"generateTenantKey");var ln=class{static{s(this,"BaseCache")}constructor(e=void 0){this.client=e}async getClient(){return this.client?this.client:await df()}async keys(e){return(await this.getClient()).keys(e)}async exists(e,r={useTenancy:!0}){return e=r.useTenancy?Dt(e):e,(await this.getClient()).exists(e)}async scan(e,r={useTenancy:!0}){return e=r.useTenancy?Dt(e):e,(await this.getClient()).scan(e)}async get(e,r={useTenancy:!0}){return e=r.useTenancy?Dt(e):e,(await this.getClient()).get(e)}async bulkGet(e,r={useTenancy:!0}){return e=r.useTenancy?e.map(i=>Dt(i)):e,(await this.getClient()).bulkGet(e)}async store(e,r,n=null,i={useTenancy:!0}){e=i.useTenancy?Dt(e):e,await(await this.getClient()).store(e,r,n)}async bulkStore(e,r=null,n={useTenancy:!0}){n.useTenancy&&(e=Object.entries(e).reduce((o,[a,u])=>(o[Dt(a)]=u,o),{})),await(await this.getClient()).bulkStore(e,r)}async delete(e,r={useTenancy:!0}){return e=r.useTenancy?Dt(e):e,(await this.getClient()).delete(e)}async bulkDelete(e,r={useTenancy:!0}){return e=r.useTenancy?e.map(i=>Dt(i)):e,(await this.getClient()).bulkDelete(e)}async withCache(e,r=null,n,i={useTenancy:!0}){let o=await this.get(e,i);if(o)return o;try{let a=await n();return await this.store(e,a,r,i),a}catch(a){throw console.error("Error fetching before cache - ",a),a}}async withCacheWithDynamicTTL(e,r,n={useTenancy:!0}){let i=await this.get(e,n);if(i)return i;try{let o=await r(),{value:a,ttl:u}=o;return await this.store(e,a,u,{useTenancy:n.useTenancy}),a}catch(o){throw console.error("Error fetching before cache - ",o),o}}async bustCache(e){let r=await this.getClient();try{await r.delete(Dt(e))}catch(n){throw console.error("Error busting cache - ",n),n}}async deleteIfValue(e,r,n={useTenancy:!0}){e=n.useTenancy?Dt(e):e,await(await this.getClient()).deleteIfValue(e,r)}};var dn=new ln,ye={CHECKLIST:"checklist",INSTALLATION:"installation",ANALYTICS_ENABLED:"analyticsEnabled",UNIQUE_TENANT_ID:"uniqueTenantId",EVENTS:"events",BACKFILL_METADATA:"backfillMetadata",EVENTS_RATE_LIMIT:"eventsRateLimit",OAUTH2_TOKEN:t=>`oauth2Token_${t}`},fn=(n=>(n[n.ONE_MINUTE=600]="ONE_MINUTE",n[n.ONE_HOUR=3600]="ONE_HOUR",n[n.ONE_DAY=86400]="ONE_DAY",n))(fn||{}),Ru=s((...t)=>dn.keys(...t),"keys"),pn=s((...t)=>dn.get(...t),"get"),jt=s((...t)=>dn.store(...t),"store"),so=s((...t)=>dn.delete(...t),"destroy"),Ar=s((...t)=>dn.withCache(...t),"withCache"),yS=s((...t)=>dn.withCacheWithDynamicTTL(...t),"withCacheWithDynamicTTL"),oi=s((...t)=>dn.bustCache(...t),"bustCache");var sp={};N(sp,{createCode:()=>uv,deleteCode:()=>lv,getCode:()=>cv,getExistingInvites:()=>ip,getInviteCodes:()=>SS,updateCode:()=>av});var TS=Ee.fromDays(7).toSeconds();async function av(t,e){await(await rn()).store(t,e,TS)}s(av,"updateCode");async function uv(t,e){let r=ne();return await(await rn()).store(r,{email:t,info:e},TS),r}s(uv,"createCode");async function cv(t){let r=await(await rn()).get(t);if(!r)throw"Invitation is not valid or has expired, please request a new one.";return r}s(cv,"getCode");async function lv(t){await(await rn()).delete(t)}s(lv,"deleteCode");async function SS(){let r=(await(await rn()).scan()).map(i=>({...i.value,code:i.key}));if(!E.MULTI_TENANCY)return r;let n=G();return r.filter(i=>n===i.info.tenantId)}s(SS,"getInviteCodes");async function ip(t){return(await SS()).filter(e=>t.includes(e.email))}s(ip,"getExistingInvites");var op={};N(op,{createCode:()=>fv,getCode:()=>pv,invalidateCode:()=>mv});var dv=Ee.fromHours(1).toSeconds();async function fv(t,e){let r=ne();return await(await Fs()).store(r,{userId:t,info:e},dv),r}s(fv,"createCode");async function pv(t){let r=await(await Fs()).get(t);if(!r)throw new Error("Provided information is not valid, cannot reset password - please try again.");return r}s(pv,"getCode");async function mv(t){await(await Fs()).delete(t)}s(mv,"invalidateCode");var wr={};N(wr,{getUser:()=>Do,getUsers:()=>qU,invalidateUser:()=>Ro});var ao={};N(ao,{getPlatformDB:()=>_r,users:()=>Et});var Et={};N(Et,{addSsoUser:()=>_S,addUser:()=>Sv,getUserDoc:()=>AS,lookupTenantId:()=>hv,removeUser:()=>Av,updateUserDoc:()=>Ev});function _r(){return De(fe.PLATFORM_INFO.name)}s(_r,"getPlatformDB");async function hv(t){return E.MULTI_TENANCY?(await AS(t)).tenantId:ae}s(hv,"lookupTenantId");async function AS(t){return _r().get(t)}s(AS,"getUserDoc");async function Ev(t){await _r().put(t)}s(Ev,"updateUserDoc");function gv(t,e){return{_id:t,tenantId:e}}s(gv,"newUserIdDoc");function yv(t,e,r){return{_id:e,userId:t,tenantId:r}}s(yv,"newUserEmailDoc");function Tv(t,e,r,n){return{_id:t,userId:r,email:e,tenantId:n}}s(Tv,"newUserSsoIdDoc");async function ap(t,e){let r=_r(),n;try{await r.get(t)}catch(i){if(i.status===404)n=e(),await r.put(n);else throw i}}s(ap,"addUserDoc");async function _S(t,e,r,n){return ap(t,()=>Tv(t,e,r,n))}s(_S,"addSsoUser");async function Sv(t,e,r,n){let i=[ap(e,()=>gv(e,t)),ap(r,()=>yv(e,r,t))];n&&i.push(_S(n,r,e,t)),await Promise.all(i)}s(Sv,"addUser");async function Av(t){let e=_r(),r=[t._id,t.email],n=await e.allDocs({keys:r,include_docs:!0});await e.bulkRemove(n.rows.map(i=>i.doc),{silenceErrors:!0})}s(Av,"removeUser");var mn={};N(mn,{getAccount:()=>Or,getAccountByTenantId:()=>ai,getStatus:()=>_v});var OS=F(require("node-fetch"));var uo=class{static{s(this,"API")}constructor(e){this.host=e}async apiCall(e,r,n){n.headers||(n.headers={}),n.headers["Content-Type"]||(n.headers={"Content-Type":"application/json",Accept:"application/json",...n.headers});let i=n.headers["Content-Type"]==="application/json";Js.setHeader(n.headers);let o={method:e,body:i?JSON.stringify(n.body):n.body,headers:n.headers,credentials:"include"};return await(0,OS.default)(`${this.host}${r}`,o)}async post(e,r){return this.apiCall("POST",e,r)}async get(e,r){return this.apiCall("GET",e,r)}async patch(e,r){return this.apiCall("PATCH",e,r)}async del(e,r){return this.apiCall("DELETE",e,r)}async put(e,r){return this.apiCall("PUT",e,r)}};var up=new uo(E.INTERNAL_ACCOUNT_PORTAL_URL),cp=E.SELF_HOSTED||E.DISABLE_ACCOUNT_PORTAL,Or=s(async t=>{if(cp)return;let e={email:t},r=await up.post("/api/accounts/search",{body:e,headers:{"x-budibase-api-key":E.ACCOUNT_PORTAL_API_KEY}});if(r.status!==200)throw new Error(`Error getting account by email ${t}`);return(await r.json())[0]},"getAccount"),ai=s(async t=>{if(cp)return;let e={tenantId:t},r=await up.post("/api/accounts/search",{body:e,headers:{"x-budibase-api-key":E.ACCOUNT_PORTAL_API_KEY}});if(r.status!==200)throw new Error(`Error getting account by tenantId ${t}`);return(await r.json())[0]},"getAccountByTenantId"),_v=s(async()=>{if(cp)return;let t=await up.get("/api/status",{headers:{"x-budibase-api-key":E.ACCOUNT_PORTAL_API_KEY}}),e=await t.json();if(t.status!==200)throw new Error("Error getting status");return e},"getStatus");var mi={};N(mi,{UserDB:()=>Ct,addAppBuilder:()=>WU,bulkGetGlobalUsersById:()=>Ju,bulkUpdateGlobalUsers:()=>Oo,cleanseUserObject:()=>vp,creatorsInList:()=>gn,doesUserExist:()=>LU,getAccountHolderFromUsers:()=>zu,getAllUserIds:()=>NU,getAllUsers:()=>UU,getById:()=>yn,getCreatorCount:()=>FU,getExistingAccounts:()=>pi,getExistingPlatformUsers:()=>lA,getExistingTenantUsers:()=>cA,getFirstPlatformUser:()=>Ao,getGlobalUserByAppPage:()=>EA,getGlobalUserByEmail:()=>Tt,getPlatformUsers:()=>Qu,getUserCount:()=>MU,hasAdminPermissions:()=>Ir,hasAppBuilderPermissions:()=>pA,hasBuilderPermissions:()=>ke,isAdmin:()=>Rt,isAdminOrBuilder:()=>fA,isAdminOrWorkspaceBuilder:()=>ju,isBuilder:()=>Ei,isCreatorAsync:()=>_o,isCreatorSync:()=>Yu,isGlobalBuilder:()=>dA,paginatedUsers:()=>yA,removeAppBuilder:()=>$U,removePortalUserPermissions:()=>BU,searchExistingEmails:()=>Dp,searchGlobalUsersByApp:()=>Zu,searchGlobalUsersByAppAccess:()=>xp,searchGlobalUsersByEmail:()=>gA,validateUniqueUser:()=>Hu});var ku={};N(ku,{BadRequestError:()=>xu,BudibaseError:()=>ui,EmailUnavailableError:()=>Yt,FeatureDisabledError:()=>Uu,ForbiddenError:()=>vu,HTTPError:()=>we,InvalidAPIKeyError:()=>ci,NotFoundError:()=>bu,NotImplementedError:()=>Pu,UnexpectedError:()=>Cu,UsageLimitError:()=>Nu,getPublicError:()=>Lu});var ui=class extends Error{constructor(r,n){super(r);this.code=n}static{s(this,"BudibaseError")}},Lu=s(t=>{let e;return t.code&&(e={code:t.code},t.getPublicError&&(e={...e,...t.getPublicError()})),e},"getPublicError"),we=class t extends ui{constructor(r,n,i="http"){super(r,i);this.status=n}static{s(this,"HTTPError")}static async fromResponse(r){let n=await r.text(),i=n,o=r.status,a="http";try{let u=JSON.parse(n);i=u.message,o=u.status,a=u.error?.code}catch{}return new t(i,o,a)}},Cu=class extends we{static{s(this,"UnexpectedError")}constructor(e){super(e,500)}},bu=class extends we{static{s(this,"NotFoundError")}constructor(e){super(e,404)}},xu=class extends we{static{s(this,"BadRequestError")}constructor(e){super(e,400)}},vu=class extends we{static{s(this,"ForbiddenError")}constructor(e){super(e,403)}},Pu=class extends we{static{s(this,"NotImplementedError")}constructor(e){super(e,501)}},Nu=class extends we{constructor(r,n){super(r,400,"usage_limit_exceeded");this.limitName=n}static{s(this,"UsageLimitError")}getPublicError(){return{limitName:this.limitName}}},Uu=class extends we{constructor(r,n){super(r,400,"feature_disabled");this.featureName=n}static{s(this,"FeatureDisabledError")}getPublicError(){return{featureName:this.featureName}}},ci=class extends ui{static{s(this,"InvalidAPIKeyError")}constructor(){super("Invalid API key - may need re-generated, or user doesn't exist","invalid_api_key")}},Yt=class extends Error{static{s(this,"EmailUnavailableError")}constructor(e){super(`Email already in use: '${e}'`)}};var pp={};N(pp,{PASSWORD_MAX_LENGTH:()=>dp,PASSWORD_MIN_LENGTH:()=>lp,validatePassword:()=>fp});var lp=+(E.PASSWORD_MIN_LENGTH||12),dp=+(E.PASSWORD_MAX_LENGTH||512);function fp(t){return!t||t.length<lp?{valid:!1,error:`Password invalid. Minimum ${lp} characters.`}:t.length>dp?{valid:!1,error:`Password invalid. Maximum ${dp} characters.`}:{valid:!0}}s(fp,"validatePassword");var Mu={};N(Mu,{createASession:()=>Iv,endSession:()=>wv,getSession:()=>hp,getSessionsForUser:()=>co,invalidateSessions:()=>hn,updateSessionTTL:()=>mp});var wS=require("uuid");var DS=E.SESSION_EXPIRY_SECONDS?parseInt(E.SESSION_EXPIRY_SECONDS):Ee.fromDays(7).toSeconds();function li(t,e){return`${t}/${e}`}s(li,"makeSessionID");async function co(t){return t?(await(await mr()).scan(t)).map(n=>n.value):(console.trace("Cannot get sessions for undefined userId"),[])}s(co,"getSessionsForUser");async function hn(t,e={}){try{let r=e?.reason||"unknown",n=e.sessionIds||[],i;if(n.length===0?i=(await co(t)).map(a=>({key:li(a.userId,a.sessionId)})):(n=Array.isArray(n)?n:[n],i=n.map(o=>({key:li(t,o)}))),i&&i.length>0){let o=await mr(),a=[];for(let u of i)a.push(o.delete(u.key));E.isTest()||si(`Invalidating sessions for ${t} (reason: ${r}) - ${i.map(u=>u.key).join(", ")}`),await Promise.all(a)}}catch(r){console.error(`Error invalidating sessions: ${r}`)}}s(hn,"invalidateSessions");async function Iv(t,e){let r=await co(t),n=0;if(r.length>=3){let l=r.sort((p,m)=>new Date(p.createdAt).getTime()-new Date(m.createdAt).getTime()),d=r.length-3+1,f=l.slice(0,d).map(p=>p.sessionId);n=f.length,await hn(t,{sessionIds:f,reason:"session limit exceeded"})}let i=await mr(),o=e.sessionId,a=e.csrfToken?e.csrfToken:(0,wS.v4)(),u=li(t,o),c={...e,csrfToken:a,createdAt:new Date().toISOString(),lastAccessedAt:new Date().toISOString(),userId:t};return await i.store(u,c,DS),{session:c,invalidatedSessionCount:n}}s(Iv,"createASession");async function mp(t){let e=await mr(),r=li(t.userId,t.sessionId);t.lastAccessedAt=new Date().toISOString(),await e.store(r,t,DS)}s(mp,"updateSessionTTL");async function wv(t,e){await(await mr()).delete(li(t,e))}s(wv,"endSession");async function hp(t,e){if(!t||!e)throw new Error(`Invalid session details - ${t} - ${e}`);let n=await(await mr()).get(li(t,e));if(!n)throw new Error(`Session not found - ${t} - ${e}`);return n}s(hp,"getSession");var fi={};N(fi,{account:()=>FS,action:()=>BS,ai:()=>WS,analytics:()=>Bu,app:()=>$S,asyncEventQueue:()=>gt,auditLog:()=>VS,auth:()=>Ku,automation:()=>GS,backfill:()=>qS,backfillCache:()=>Vu,backup:()=>KS,datasource:()=>QS,email:()=>jS,environmentVariable:()=>YS,group:()=>HS,identification:()=>yt,initAsyncEvents:()=>SU,installation:()=>ho,layout:()=>zS,license:()=>JS,org:()=>ZS,plugin:()=>XS,processors:()=>Ap,publishEvent:()=>A,query:()=>eA,resource:()=>tA,role:()=>So,rowAction:()=>rA,rows:()=>nA,screen:()=>iA,serve:()=>sA,shutdown:()=>AU,table:()=>oA,user:()=>Me,view:()=>aA,workspace:()=>uA});var Bu={};N(Bu,{enabled:()=>Fu});var Fu=s(async()=>Wu(),"enabled");var gt;function $u(){gt=new ht("systemEventQueue",{jobTags:t=>({"event.name":t.event})})}s($u,"init");async function RS(){gt&&await gt.close()}s(RS,"shutdown");async function CS(t){gt||$u();let{event:e,identity:r}=t;bm.indexOf(e)!==-1&&r.tenantId&&await gt.add(t)}s(CS,"publishAsyncEvent");var Vu={};N(Vu,{end:()=>Rv,isAlreadySent:()=>yp,isBackfillingEvent:()=>gp,recordEvent:()=>Ep,start:()=>Dv});var Dv=s(async t=>bv({eventWhitelist:t}),"start"),Ep=s(async(t,e)=>{let r=Tp(t,e);await jt(r,e,void 0,{useTenancy:!1})},"recordEvent"),Rv=s(async()=>{await xv(),await vv()},"end"),Cv=s(async()=>pn(ye.BACKFILL_METADATA),"getBackfillMetadata"),bv=s(async t=>jt(ye.BACKFILL_METADATA,t),"saveBackfillMetadata"),xv=s(async()=>{await so(ye.BACKFILL_METADATA)},"deleteBackfillMetadata"),vv=s(async()=>{let t=Tp(),e=await Ru(t);for(let r of e)await so(r,{useTenancy:!1})},"clearEvents"),gp=s(async t=>{let r=(await Cv())?.eventWhitelist;return!!(r&&r.includes(t))},"isBackfillingEvent"),yp=s(async(t,e)=>{let r=Tp(t,e);return!!await pn(r,{useTenancy:!1})},"isAlreadySent"),Pv={"automation:created":t=>t.automationId,"automation:step:created":t=>t.stepId,"datasource:created":t=>t.datasourceId,"layout:created":t=>t.layoutId,"query:created":t=>t.queryId,"role:created":t=>t.roleId,"screen:created":t=>t.screenId,"table:created":t=>t.tableId,"view:created":t=>t.tableId,"view:calculation:created":t=>t.tableId,"view:filter:created":t=>t.tableId,"app:created":t=>t.appId,"app:published":t=>t.appId,"auth:sso:created":t=>t.type,"auth:sso:activated":t=>t.type,"user:created":t=>t.userId,"user:admin:assigned":t=>t.userId,"user:builder:assigned":t=>t.userId,"role:assigned":t=>`${t.roleId}-${t.userId}`},Tp=s((t,e)=>{let r,n=G();if(t){r=`${ye.EVENTS}:${n}:${t}`;let i=Pv[t],o=i?i(e):void 0;o&&(r=`${r}:${o}`)}else r=`${ye.EVENTS}:${n}:*`;return r},"getEventKey");var Ap={};N(Ap,{analyticsProcessor:()=>LS,init:()=>Vv,processors:()=>Ht});var NS=require("posthog-node");var Nv=s(t=>t==="served:builder"||t==="served:app:preview"||t==="served:app","isRateLimited"),Uv=s(t=>t==="served:app:preview"||t==="served:app","isPerApp");var xS={"served:app":"calendarDay","served:app:preview":"calendarDay","served:builder":"calendarDay"},vS=s(async t=>{if(!Nv(t))return!1;let e=await Lv(t);if(e){let r=new Date(e.timestamp);switch(xS[t]){case"calendarDay":return r.setDate(r.getDate()+1),r.setHours(0,0,0,0),Date.now()>r.getTime()?(await bS(t,{timestamp:Date.now()}),!1):!0}}else return await bS(t,{timestamp:Date.now()}),!1},"limited"),PS=s(t=>{let e=`${ye.EVENTS_RATE_LIMIT}:${t}`;return Uv(t)&&(e=e+":"+Le()),e},"eventKey"),Lv=s(async t=>{let e=PS(t);return await pn(e)},"readEvent"),bS=s(async(t,e)=>{let r=PS(t),n=xS[t],i;switch(n){case"calendarDay":i=86400}await jt(r,e,i)},"recordEvent");var Mv=["user:updated","email:smtp:updated","auth:sso:updated","app:updated","role:updated","datasource:updated","query:updated","view:updated","view:calculation:updated","automation:trigger:updated","user_group:updated"],lo=class{static{s(this,"PosthogProcessor")}constructor(e){if(!e)throw new Error("Posthog token is not defined");this.posthog=new NS.PostHog(e)}async processEvent(e,r,n,i){if(Mv.includes(e)||await vS(e))return;n=this.clearPIIProperties(n),n.version=E.VERSION,n.service=E.SERVICE,n.environment=r.environment,n.hosting=r.hosting;let o=Le();o&&(n.appId=o);let a={distinctId:r.id,event:e,properties:n};i&&(a.timestamp=new Date(i)),(r.installationId||r.tenantId)&&(a.groups={},r.installationId&&(a.groups.installation=r.installationId,a.properties.installationId=r.installationId),r.tenantId&&(a.groups.tenant=r.tenantId,a.properties.tenantId=r.tenantId)),this.posthog.capture(a)}clearPIIProperties(e){return e.email&&delete e.email,e.audited&&delete e.audited,e}async identify(e,r){let n={distinctId:e.id,properties:e};r&&(n.timestamp=new Date(r)),this.posthog.identify(n)}async identifyGroup(e,r){let n={distinctId:e.id,groupType:e.type,groupKey:e.id,properties:e};r&&(n.timestamp=new Date(r)),this.posthog.groupIdentify(n)}async shutdown(){await this.posthog.shutdown()}};var US=lo;var Fv=["installation:version:upgraded","installation:version:downgraded"],Bv=["installation","tenant"],fo=class{static{s(this,"AnalyticsProcessor")}constructor(){E.POSTHOG_TOKEN&&!E.isTest()&&(this.posthog=new US(E.POSTHOG_TOKEN))}async processEvent(e,r,n,i){!Fv.includes(e)&&!await Fu()||this.posthog&&await this.posthog.processEvent(e,r,n,i)}async identify(e,r){!Bv.includes(e.type)&&!await Fu()||this.posthog&&await this.posthog.identify(e,r)}async identifyGroup(e,r){this.posthog&&await this.posthog.identifyGroup(e,r)}async shutdown(){this.posthog&&await this.posthog.shutdown()}};var Sp=E.SELF_HOSTED&&!E.isDev(),po=class{static{s(this,"LoggingProcessor")}async processEvent(e,r,n){Sp||console.log(`[audit] [identityType=${r.type}] ${e}`,n)}async identify(e){Sp||console.log("[audit] identified",e)}async identifyGroup(e){Sp||console.log("[audit] group identified",e)}async shutdown(){}};var di=class t{static{s(this,"AuditLogsProcessor")}static{this.auditLogsEnabled=!1}static init(e){t.auditLogsEnabled=!0;let r=e;return t.auditLogQueue=new ht("auditLogQueue",{jobTags:n=>({"event.name":n.event})}),t.auditLogQueue.process(async n=>{await Re(n.data.tenantId,async()=>{let i=n.data.properties;i.audited&&(i={...i,...i.audited},delete i.audited);let o={};E.ENABLE_AUDIT_LOG_IP_ADDR&&(o=n.data.opts.hostInfo),await r(n.data.event,i,{userId:n.data.opts.userId,timestamp:n.data.opts.timestamp,appId:n.data.opts.appId,hostInfo:o})})})}async processEvent(e,r,n,i){if(t.auditLogsEnabled&&Cf(e)){let o=r.type==="user"?r.id:void 0;await t.auditLogQueue.add({event:e,properties:n,opts:{userId:o,timestamp:i,appId:Le(),hostInfo:r.hostInfo},tenantId:G()})}}async identify(){}async identifyGroup(){}async shutdown(){await t.auditLogQueue?.close()}};var mo=class{constructor(e){this.initialised=!1;this.processors=[];this.processors=e}static{s(this,"Processor")}async processEvent(e,r,n,i){for(let o of this.processors)await o.processEvent(e,r,n,i)}async identify(e,r){for(let n of this.processors)n.identify&&await n.identify(e,r)}async identifyGroup(e,r){for(let n of this.processors)n.identifyGroup&&await n.identifyGroup(e,r)}async shutdown(){for(let e of this.processors)e.shutdown&&await e.shutdown()}};var LS=new fo,Wv=new po,$v=new di;function Vv(t){return di.init(t)}s(Vv,"init");var Ht=new mo([LS,Wv,$v]);var Gu={};N(Gu,{checkInstallVersion:()=>Kv,getInstall:()=>Eo,getInstallFromDB:()=>Op});var _p=F(require("semver"));var Eo=s(async()=>Ar(ye.INSTALLATION,86400,Op,{useTenancy:!1}),"getInstall");async function Gv(t){let e={_id:fe.PLATFORM_INFO.docs.install,installId:ne(),version:E.VERSION};try{let r=await t.put(e);return e._rev=r.rev,e}catch(r){if(r.status===409)return Op();throw r}}s(Gv,"createInstallDoc");var Op=s(async()=>Ke(fe.PLATFORM_INFO.name,async t=>{let e;try{e=await t.get(fe.PLATFORM_INFO.docs.install)}catch(r){if(r.status===404)e=await Gv(t);else throw r}return e}),"getInstallFromDB"),qv=s(async t=>{try{await Ke(fe.PLATFORM_INFO.name,async e=>{let r=await Eo();r.version=t,await e.put(r),await oi(ye.INSTALLATION)})}catch(e){if(e.status===409)return!1;throw e}return!0},"updateVersion"),Kv=s(async()=>{let t=await Eo(),e=t.version,r=E.VERSION;try{if(e!==r){let n=_p.default.gt(r,e),i=_p.default.lt(r,e);await qv(r)&&(await Os({_id:t.installId,type:"installation"},async()=>{n?await ho.upgraded(e,r):i&&await ho.downgraded(e,r)}),await yt.identifyInstallationGroup(t.installId))}}catch(n){n?.message?.includes("Invalid Version")?cn(`Invalid version "${r}" - is it semver?`):cn("Failed to retrieve version",n)}},"checkInstallVersion");var Qv=s(async()=>{let t=Md(),e=To(),r;if(t?r=t.type:r="tenant",r==="installation"){let n=await En(),i=go();return{id:kS(n,r),hosting:i,type:r,installationId:n,environment:e}}else if(r==="tenant"){let n=await En(),i=await qu(G()),o=go();return{id:kS(i,r),type:r,hosting:o,installationId:n,tenantId:i,realTenantId:G(),environment:e}}else if(r==="user"){let n=t,i=await qu(G()),o=await En(),a=n.account,u;return a?u=a.hosting:u=go(),{id:n._id,type:r,hosting:u,installationId:o,tenantId:i,environment:e,realTenantId:G(),hostInfo:n.hostInfo}}else throw new Error("Unknown identity type")},"getCurrentIdentity"),jv=s(async(t,e)=>{let r=t,n="installation",i=go(),o=E.VERSION,a=To(),u={id:r,type:n,hosting:i,version:o,environment:a};await Ip(u,e),await yo({...u,id:`$${n}_${r}`},e)},"identifyInstallationGroup"),Yv=s(async(t,e,r,n=E.VERSION)=>{let i=await qu(t),o="tenant",a=await En(),u=To(),c={id:i,type:o,hosting:e,environment:u,installationId:a,createdAt:r,createdVersion:n};await Ip(c,r),await yo({...c,id:`$${o}_${i}`},r)},"identifyTenantGroup"),Hv=s(async(t,e,r)=>{let n=t._id,i=await qu(t.tenantId),o="user",a=ke(t),u=Ir(t),c;Go(t)&&(c=t.providerType);let d=(await pi([t.email])).length>0,f=!!e&&d&&e.verified,p=await En(),m=e?e.hosting:go(),h=To();await yo({id:n,type:o,hosting:m,installationId:p,tenantId:i,verified:f,accountHolder:d,providerType:c,builder:a,admin:u,environment:h},r)},"identifyUser"),zv=s(async t=>{let e=t.accountId,r=t.tenantId,n="user",i=Vo(t)?t.providerType:void 0,o=t.verified,a=!0,u=t.hosting,c=await En(),l=To();if($o(t)){let f=await Tt(t.email);f?._id&&(e=f._id)}await yo({id:e,type:n,hosting:u,installationId:c,tenantId:r,providerType:i,verified:o,accountHolder:a,environment:l})},"identifyAccount"),yo=s(async(t,e)=>{await Ht.identify(t,e)},"identify"),Ip=s(async(t,e)=>{await Ht.identifyGroup(t,e)},"identifyGroup"),To=s(()=>E.isDev()?"development":E.DEPLOYMENT_ENVIRONMENT,"getDeploymentEnvironment"),go=s(()=>E.SELF_HOSTED?"self":"cloud","getHostingFromEnv"),En=s(async()=>Jv()?"account-portal":(await Eo()).installId,"getInstallationId"),qu=s(async t=>E.SELF_HOSTED?MS(t):t,"getEventTenantId"),MS=s(async t=>Re(t,()=>Ar(ye.UNIQUE_TENANT_ID,86400,async()=>{let e=H(),r=await ni(),n;return r.config.uniqueTenantId?r.config.uniqueTenantId:(n=`${ne()}_${t}`,r.config.uniqueTenantId=n,r.config.createdVersion=E.VERSION,await e.put(r),n)})),"getUniqueTenantId"),Jv=s(()=>E.SERVICE==="account-portal","isAccountPortal"),kS=s((t,e)=>e==="installation"||e==="tenant"?`$${e}_${t}`:t,"formatDistinctId"),yt={getCurrentIdentity:Qv,identifyInstallationGroup:jv,identifyTenantGroup:Yv,identifyUser:Hv,identifyAccount:zv,identify:yo,identifyGroup:Ip,getInstallationId:En,getUniqueTenantId:MS};var A=s(async(t,e,r,n)=>{let i=n||await yt.getCurrentIdentity();if(!(n?!1:await gp(t))){await CS({event:t,identity:i,properties:e,timestamp:r}),await Ht.processEvent(t,i,e,r);return}await yp(t,e)||(await Ht.processEvent(t,i,e,r),await Ep(t,e))},"publishEvent");async function Zv(t,e){let r={tenantId:t.tenantId};await A("account:created",r,void 0,e)}s(Zv,"created");async function Xv(t){let e={tenantId:t.tenantId};await A("account:deleted",e)}s(Xv,"deleted");async function eP(t){let e={tenantId:t.tenantId};await A("account:verified",e)}s(eP,"verified");var FS={created:Zv,deleted:Xv,verified:eP};async function tP(t,e){await A("action:automation_step:executed",t,e)}s(tP,"automationStepExecuted");async function rP(t,e){await A("action:crud:executed",t,e)}s(rP,"crudExecuted");async function nP(t,e){await A("action:ai_agent:executed",t,e)}s(nP,"aiAgentExecuted");var BS={aiAgentExecuted:nP,automationStepExecuted:tP,crudExecuted:rP};async function iP(t){let e={};await A("ai:config:created",e,t)}s(iP,"AIConfigCreated");async function sP(){let t={};await A("ai:config:updated",t)}s(sP,"AIConfigUpdated");var WS={AIConfigCreated:iP,AIConfigUpdated:sP};var oP=s(async(t,e)=>{let r={appId:t.appId,version:t.version,audited:{name:t.name}};await A("app:created",r,e)},"created");async function aP(t){let e={appId:t.appId,version:t.version,audited:{name:t.name}};await A("app:updated",e)}s(aP,"updated");async function uP(t){let e={appId:t.appId,audited:{name:t.name}};await A("app:deleted",e)}s(uP,"deleted");async function cP(t,e){let r={appId:t.appId,audited:{name:t.name}};await A("app:published",r,e)}s(cP,"published");async function lP(t){let e={appId:t.appId,audited:{name:t.name}};await A("app:unpublished",e)}s(lP,"unpublished");async function dP(t){let e={appId:t.appId,audited:{name:t.name}};await A("app:file:imported",e)}s(dP,"fileImported");async function fP(t,e){let r={duplicateAppId:e,appId:t.appId,audited:{name:t.name}};await A("app:duplicated",r)}s(fP,"duplicated");async function pP(t,e){let r={appId:t.appId,templateKey:e,audited:{name:t.name}};await A("app:template:imported",r)}s(pP,"templateImported");async function mP(t,e,r){let n={appId:t.appId,currentVersion:e,updatedToVersion:r,audited:{name:t.name}};await A("app:version:updated",n)}s(mP,"versionUpdated");async function hP(t,e,r){let n={appId:t.appId,currentVersion:e,revertedToVersion:r,audited:{name:t.name}};await A("app:version:reverted",n)}s(hP,"versionReverted");async function EP(t){let e={appId:t.appId,audited:{name:t.name}};await A("app:reverted",e)}s(EP,"reverted");async function gP(t){let e={appId:t.appId,audited:{name:t.name}};await A("app:exported",e)}s(gP,"exported");var $S={created:oP,updated:aP,deleted:uP,published:cP,unpublished:lP,fileImported:dP,duplicated:fP,templateImported:pP,versionUpdated:mP,versionReverted:hP,reverted:EP,exported:gP};async function yP(t){let e={filters:t};await A("audit_log:filtered",e)}s(yP,"filtered");async function TP(t){let e={filters:t};await A("audit_log:downloaded",e)}s(TP,"downloaded");var VS={filtered:yP,downloaded:TP};async function SP(t,e){let n={userId:(await yt.getCurrentIdentity()).id,source:t,audited:{email:e}};await A("auth:login",n)}s(SP,"login");async function AP(t){let r={userId:(await yt.getCurrentIdentity()).id,audited:{email:t}};await A("auth:logout",r)}s(AP,"logout");async function _P(t,e){let r={type:t};await A("auth:sso:created",r,e)}s(_P,"SSOCreated");async function OP(t){let e={type:t};await A("auth:sso:updated",e)}s(OP,"SSOUpdated");async function IP(t,e){let r={type:t};await A("auth:sso:activated",r,e)}s(IP,"SSOActivated");async function wP(t){let e={type:t};await A("auth:sso:deactivated",e)}s(wP,"SSODeactivated");var Ku={login:SP,logout:AP,SSOCreated:_P,SSOUpdated:OP,SSOActivated:IP,SSODeactivated:wP};async function DP(t,e){let r={appId:t.appId,automationId:t._id,triggerId:t.definition?.trigger?.id,triggerType:t.definition?.trigger?.stepId,audited:{name:t.name}};await A("automation:created",r,e)}s(DP,"created");async function RP(t){let e={appId:t.appId,automationId:t._id,triggerId:t.definition?.trigger?.id,triggerType:t.definition?.trigger?.stepId};await A("automation:trigger:updated",e)}s(RP,"triggerUpdated");async function CP(t){let e={appId:t.appId,automationId:t._id,triggerId:t.definition?.trigger?.id,triggerType:t.definition?.trigger?.stepId,audited:{name:t.name}};await A("automation:deleted",e)}s(CP,"deleted");async function bP(t){let e={appId:t.appId,automationId:t._id,triggerId:t.definition?.trigger?.id,triggerType:t.definition?.trigger?.stepId};await A("automation:tested",e)}s(bP,"tested");var xP=s(async(t,e)=>{let r={count:t};await A("automations:run",r,e)},"run");async function vP(t,e,r){let n={appId:t.appId,automationId:t._id,triggerId:t.definition?.trigger?.id,triggerType:t.definition?.trigger?.stepId,stepId:e.id,stepType:e.stepId,audited:{name:t.name}};await A("automation:step:created",n,r)}s(vP,"stepCreated");async function PP(t,e){let r={appId:t.appId,automationId:t._id,triggerId:t.definition?.trigger?.id,triggerType:t.definition?.trigger?.stepId,stepId:e.id,stepType:e.stepId,audited:{name:t.name}};await A("automation:step:deleted",r)}s(PP,"stepDeleted");var GS={created:DP,triggerUpdated:RP,deleted:CP,tested:bP,run:xP,stepCreated:vP,stepDeleted:PP};var hi=!E.SELF_HOSTED&&!E.isDev();async function NP(t){hi||await A("app:backfill:succeeded",t)}s(NP,"appSucceeded");async function UP(t){if(hi)return;let e={error:JSON.stringify(t,Object.getOwnPropertyNames(t))};await A("app:backfill:failed",e)}s(UP,"appFailed");async function LP(t){hi||await A("tenant:backfill:succeeded",t)}s(LP,"tenantSucceeded");async function kP(t){if(hi)return;let e={error:JSON.stringify(t,Object.getOwnPropertyNames(t))};await A("tenant:backfill:failed",e)}s(kP,"tenantFailed");async function MP(){if(hi)return;let t={};await A("installation:backfill:succeeded",t)}s(MP,"installationSucceeded");async function FP(t){if(hi)return;let e={error:JSON.stringify(t,Object.getOwnPropertyNames(t))};await A("installation:backfill:failed",e)}s(FP,"installationFailed");var qS={appSucceeded:NP,appFailed:UP,tenantSucceeded:LP,tenantFailed:kP,installationSucceeded:MP,installationFailed:FP};async function BP(t){let e={appId:t.appId,restoreId:t._id,backupCreatedAt:t.timestamp,name:t.name};await A("app:backup:restored",e)}s(BP,"appBackupRestored");async function WP(t,e,r,n,i){let o={appId:t,backupId:e,type:r,trigger:n,name:i};await A("app:backup:triggered",o)}s(WP,"appBackupTriggered");var KS={appBackupRestored:BP,appBackupTriggered:WP};function wp(t){return!Object.values(Mo).includes(t.source)}s(wp,"isCustom");async function $P(t,e){let r={datasourceId:t._id,source:t.source,custom:wp(t)};await A("datasource:created",r,e)}s($P,"created");async function VP(t){let e={datasourceId:t._id,source:t.source,custom:wp(t)};await A("datasource:updated",e)}s(VP,"updated");async function GP(t){let e={datasourceId:t._id,source:t.source,custom:wp(t)};await A("datasource:deleted",e)}s(GP,"deleted");var QS={created:$P,updated:VP,deleted:GP};async function qP(t){let e={};await A("email:smtp:created",e,t)}s(qP,"SMTPCreated");async function KP(){let t={};await A("email:smtp:updated",t)}s(KP,"SMTPUpdated");var jS={SMTPCreated:qP,SMTPUpdated:KP};async function QP(t,e){let r={name:t,environments:e};await A("environment_variable:created",r)}s(QP,"created");async function jP(t){let e={name:t};await A("environment_variable:deleted",e)}s(jP,"deleted");async function YP(t){let e={userId:t};await A("environment_variable:upgrade_panel_opened",e)}s(YP,"upgradePanelOpened");var YS={created:QP,deleted:jP,upgradePanelOpened:YP};async function HP(t,e){let r={groupId:t._id,viaScim:pt(),audited:{name:t.name}};await A("user_group:created",r,e)}s(HP,"created");async function zP(t){let e={groupId:t._id,viaScim:pt(),audited:{name:t.name}};await A("user_group:updated",e)}s(zP,"updated");async function JP(t){let e={groupId:t._id,viaScim:pt(),audited:{name:t.name}};await A("user_group:deleted",e)}s(JP,"deleted");async function ZP(t,e,r){let n={count:t,groupId:e._id,userIds:r,viaScim:pt(),audited:{name:e.name}};await A("user_group:user_added",n)}s(ZP,"usersAdded");async function XP(t,e,r){let n={count:t,groupId:e._id,userIds:r,viaScim:pt(),audited:{name:e.name}};await A("user_group:users_deleted",n)}s(XP,"usersDeleted");async function eN(t){let e={groupId:t,onboarding:!0};await A("user_group:onboarding_added",e)}s(eN,"createdOnboarding");async function tN(t){let e={permissions:t.roles,groupId:t._id,audited:{name:t.name}};await A("user_group:permissions_edited",e)}s(tN,"permissionsEdited");var HS={created:HP,updated:zP,deleted:JP,usersAdded:ZP,usersDeleted:XP,createdOnboarding:eN,permissionsEdited:tN};async function rN(t){let e={currentVersion:t};await A("installation:version:checked",e)}s(rN,"versionChecked");async function nN(t,e){let r={from:t,to:e};await A("installation:version:upgraded",r)}s(nN,"upgraded");async function iN(t,e){let r={from:t,to:e};await A("installation:version:downgraded",r)}s(iN,"downgraded");async function sN(){let t={};await A("installation:firstStartup",t)}s(sN,"firstStartup");var ho={versionChecked:rN,upgraded:nN,downgraded:iN,firstStartup:sN};async function oN(t,e){let r={layoutId:t._id};await A("layout:created",r,e)}s(oN,"created");async function aN(t){let e={layoutId:t};await A("layout:deleted",e)}s(aN,"deleted");var zS={created:oN,deleted:aN};async function uN(t,e){let r={accountId:t.accountId,...e};await A("license:plan:changed",r)}s(uN,"planChanged");async function cN(t){let e={accountId:t.accountId};await A("license:activated",e)}s(cN,"activated");async function lN(t){let e={accountId:t.accountId};await A("license:checkout:opened",e)}s(lN,"checkoutOpened");async function dN(t){let e={accountId:t.accountId};await A("license:checkout:success",e)}s(dN,"checkoutSuccess");async function fN(t){let e={accountId:t.accountId};await A("license:portal:opened",e)}s(fN,"portalOpened");async function pN(t){let e={accountId:t.accountId};await A("license:payment:failed",e)}s(pN,"paymentFailed");async function mN(t){let e={accountId:t.accountId};await A("license:payment:recovered",e)}s(mN,"paymentRecovered");var JS={planChanged:uN,activated:cN,checkoutOpened:lN,checkoutSuccess:dN,portalOpened:fN,paymentFailed:pN,paymentRecovered:mN};async function hN(t){let e={};await A("org:info:name:updated",e,t)}s(hN,"nameUpdated");async function EN(t){let e={};await A("org:info:logo:updated",e,t)}s(EN,"logoUpdated");async function gN(t){let e={};await A("org:platformurl:updated",e,t)}s(gN,"platformURLUpdated");async function yN(){let t={};await A("analytics:opt:out",t)}s(yN,"analyticsOptOut");async function TN(){let t={};await A("analytics:opt:out",t)}s(TN,"analyticsOptIn");var ZS={nameUpdated:hN,logoUpdated:EN,platformURLUpdated:gN,analyticsOptOut:yN,analyticsOptIn:TN};async function SN(t){let e={type:t.schema.type,name:t.name,description:t.description,version:t.version};await A("plugin:init",e)}s(SN,"init");async function AN(t){let e={pluginId:t._id,type:t.schema.type,source:t.source,name:t.name,description:t.description,version:t.version};await A("plugin:imported",e)}s(AN,"imported");async function _N(t){let e={pluginId:t._id,type:t.schema.type,name:t.name,description:t.description,version:t.version};await A("plugin:deleted",e)}s(_N,"deleted");var XS={init:SN,imported:AN,deleted:_N};var ON=s(async(t,e,r)=>{let n={queryId:e._id,datasourceId:t._id,source:t.source,queryVerb:e.queryVerb};await A("query:created",n,r)},"created"),IN=s(async(t,e)=>{let r={queryId:e._id,datasourceId:t._id,source:t.source,queryVerb:e.queryVerb};await A("query:updated",r)},"updated"),wN=s(async(t,e,r)=>{let n={queryId:e._id,datasourceId:t._id,source:t.source,queryVerb:e.queryVerb,appId:r};await A("query:deleted",n)},"deleted"),DN=s(async(t,e,r)=>{let n={datasourceId:t._id,source:t.source,count:r,importSource:e};await A("query:import",n)},"imported"),RN=s(async(t,e)=>{let r={count:t};await A("queries:run",r,e)},"run"),CN=s(async(t,e)=>{let r={queryId:e.queryId,datasourceId:t._id,source:t.source,queryVerb:e.queryVerb};await A("query:previewed",r)},"previewed"),eA={created:ON,updated:IN,deleted:wN,imported:DN,run:RN,previewed:CN};async function bN({resource:t,fromWorkspace:e,toWorkspace:r},n){let i={resource:t,fromWorkspace:e,toWorkspace:r};await A("resource:copied_to_workspace",i,n)}s(bN,"duplicatedToWorkspace");var tA={duplicatedToWorkspace:bN};async function xN(t,e){let r={roleId:t._id,permissionId:t.permissionId,inherits:t.inherits};await A("role:created",r,e)}s(xN,"created");async function vN(t){let e={roleId:t._id,permissionId:t.permissionId,inherits:t.inherits};await A("role:updated",e)}s(vN,"updated");async function PN(t){let e={roleId:t._id,permissionId:t.permissionId,inherits:t.inherits};await A("role:deleted",e)}s(PN,"deleted");async function NN(t,e,r){let n={userId:t._id,roleId:e};await A("role:assigned",n,r)}s(NN,"assigned");async function UN(t,e){let r={userId:t._id,roleId:e};await A("role:unassigned",r)}s(UN,"unassigned");var So={created:xN,updated:vN,deleted:PN,assigned:NN,unassigned:UN};async function LN(t,e){await A("row_action:created",t,e)}s(LN,"created");var rA={created:LN};var kN=s(async(t,e)=>{let r={count:t};await A("rows:created",r,e)},"created"),MN=s(async(t,e)=>{let r={tableId:t._id,count:e};await A("rows:imported",r)},"imported"),nA={created:kN,imported:MN};async function FN(t,e){let r={layoutId:t.layoutId,screenId:t._id,roleId:t.routing.roleId,audited:{name:t.routing?.route}};await A("screen:created",r,e)}s(FN,"created");async function BN(t){let e={layoutId:t.layoutId,screenId:t._id,roleId:t.routing.roleId,audited:{name:t.routing?.route}};await A("screen:deleted",e)}s(BN,"deleted");var iA={created:FN,deleted:BN};async function WN(t){let e={timezone:t};await A("served:builder",e)}s(WN,"servedBuilder");async function $N(t,e,r){let n={appVersion:t.version,timezone:e,embed:r===!0};await A("served:app",n)}s($N,"servedApp");async function VN(t,e){let r={appId:t.appId,appVersion:t.version,timezone:e};await A("served:app:preview",r)}s(VN,"servedAppPreview");var sA={servedBuilder:WN,servedApp:$N,servedAppPreview:VN};async function GN(t,e){let r={tableId:t._id,audited:{name:t.name}};await A("table:created",r,e)}s(GN,"created");async function qN(t,e){let r,n;for(let o in e.schema)if(!t.schema[o]){let a=e.schema[o];"default"in a&&a.default!=null&&(r=!0),a.type==="ai"&&(n=a.operation)}let i={tableId:e._id,defaultValues:r,aiColumn:n,audited:{name:e.name}};(r||n)&&await A("table:updated",i)}s(qN,"updated");async function KN(t,e){let r={tableId:t._id,audited:{name:t.name},appId:e};await A("table:deleted",r)}s(KN,"deleted");async function QN(t,e){let r={tableId:t._id,format:e,audited:{name:t.name}};await A("table:exported",r)}s(QN,"exported");async function jN(t){let e={tableId:t._id,audited:{name:t.name}};await A("table:imported",e)}s(jN,"imported");var oA={created:GN,updated:qN,deleted:KN,exported:QN,imported:jN};async function YN(t,e){let r={userId:t._id,viaScim:pt(),audited:{email:t.email}};await A("user:created",r,e)}s(YN,"created");async function HN(t){let e={userId:t._id,viaScim:pt(),audited:{email:t.email}};await A("user:updated",e)}s(HN,"updated");async function zN(t){let e={userId:t._id,viaScim:pt(),audited:{email:t.email}};await A("user:deleted",e)}s(zN,"deleted");async function JN(t,e){let r={userId:t._id,audited:{email:t.email}};await A("user:admin:assigned",r,e)}s(JN,"permissionAdminAssigned");async function ZN(t){let e={userId:t._id,audited:{email:t.email}};await A("user:admin:removed",e)}s(ZN,"permissionAdminRemoved");async function XN(t,e){let r={userId:t._id,audited:{email:t.email}};await A("user:builder:assigned",r,e)}s(XN,"permissionBuilderAssigned");async function eU(t){let e={userId:t._id,audited:{email:t.email}};await A("user:builder:removed",e)}s(eU,"permissionBuilderRemoved");async function tU(t){let e={audited:{email:t}};await A("user:invited",e)}s(tU,"invited");async function rU(t){let e={userId:t._id,audited:{email:t.email}};await A("user:invite:accepted",e)}s(rU,"inviteAccepted");async function nU(t){let e={userId:t._id,audited:{email:t.email}};await A("user:password:force:reset",e)}s(nU,"passwordForceReset");async function iU(t){let e={userId:t._id,audited:{email:t.email}};await A("user:password:updated",e)}s(iU,"passwordUpdated");async function sU(t){let e={userId:t._id,audited:{email:t.email}};await A("user:password:reset:requested",e)}s(sU,"passwordResetRequested");async function oU(t){let e={userId:t._id,audited:{email:t.email}};await A("user:password:reset",e)}s(oU,"passwordReset");async function aU(t){let e={users:t};await A("user:data:collaboration",e)}s(aU,"dataCollaboration");var Me={created:YN,updated:HN,deleted:zN,permissionAdminAssigned:JN,permissionAdminRemoved:ZN,permissionBuilderAssigned:XN,permissionBuilderRemoved:eU,invited:tU,inviteAccepted:rU,passwordForceReset:nU,passwordUpdated:iU,passwordResetRequested:sU,passwordReset:oU,dataCollaboration:aU};async function uU(t,e){let r={name:t.name,type:t.type,tableId:t.tableId};await A("view:created",r,e)}s(uU,"created");async function cU(t){let e={tableId:t.tableId};await A("view:updated",e)}s(cU,"updated");async function lU(t,e){let r={...Ne.views.isV2(t)?{id:t.id,tableId:t.tableId,appId:e}:{}};await A("view:deleted",r)}s(lU,"deleted");async function dU(t,e){let r={tableId:t._id,format:e};await A("view:exported",r)}s(dU,"exported");async function fU({tableId:t,filterGroups:e},r){let n={tableId:t,filterGroups:e};await A("view:filter:created",n,r)}s(fU,"filterCreated");async function pU({tableId:t,filterGroups:e}){let r={tableId:t,filterGroups:e};await A("view:filter:updated",r)}s(pU,"filterUpdated");async function mU(t){let e={tableId:t.tableId};await A("view:filter:deleted",e)}s(mU,"filterDeleted");async function hU({tableId:t,calculationType:e},r){let n={tableId:t,calculation:e};await A("view:calculation:created",n,r)}s(hU,"calculationCreated");async function EU(t){let e={tableId:t.tableId,calculation:t.calculation};await A("view:calculation:updated",e)}s(EU,"calculationUpdated");async function gU(t){let e={tableId:t.tableId,calculation:t.calculation};await A("view:calculation:deleted",e)}s(gU,"calculationDeleted");async function yU(t,e){let r={tableId:t};await A("view:join:created",r,e)}s(yU,"viewJoinCreated");var aA={created:uU,updated:cU,deleted:lU,exported:dU,filterCreated:fU,filterUpdated:pU,filterDeleted:mU,calculationCreated:hU,calculationUpdated:EU,calculationDeleted:gU,viewJoinCreated:yU};async function TU(t,e){let r={workspaceAppId:t._id,audited:{name:t.name},appId:e};await A("workspace_app:deleted",r)}s(TU,"deleted");var uA={deleted:TU};function SU(){}s(SU,"initAsyncEvents");var AU=s(async()=>{await Ht.shutdown(),console.log("Events shutdown")},"shutdown");var Rp={};N(Rp,{creatorsInList:()=>gn,getAccountHolderFromUsers:()=>zu,hasAdminPermissions:()=>Ir,hasAppBuilderPermissions:()=>pA,hasBuilderPermissions:()=>ke,isAdmin:()=>Rt,isAdminOrBuilder:()=>fA,isAdminOrWorkspaceBuilder:()=>ju,isBuilder:()=>Ei,isCreatorAsync:()=>_o,isCreatorSync:()=>Yu,isGlobalBuilder:()=>dA,validateUniqueUser:()=>Hu});async function Dp(t){let e=[],r=await cA(t);e.push(...r.map(a=>a.email));let n=await lA(t);e.push(...n.map(a=>a._id));let i=await pi(t);e.push(...i.map(a=>a.email));let o=await ip(t);return e.push(...o.map(a=>a.email)),[...new Set(e.map(a=>a.toLowerCase()))]}s(Dp,"searchExistingEmails");async function Qu(t){return await Gs("platform_users_lowercase_2",{keys:[t.toLowerCase()],include_docs:!0})}s(Qu,"getPlatformUsers");async function Ao(t){return(await Qu(t))[0]??null}s(Ao,"getFirstPlatformUser");async function cA(t){let r={keys:t.map(i=>i.toLowerCase()),include_docs:!0},n={arrayResponse:!0};return await $t("by_email2",r,void 0,n)}s(cA,"getExistingTenantUsers");async function lA(t){let r={keys:t.map(n=>n.toLowerCase()),include_docs:!0};return await Gs("platform_users_lowercase_2",r)}s(lA,"getExistingPlatformUsers");async function pi(t){let r={keys:t.map(n=>n.toLowerCase()),include_docs:!0};return await Gs("account_by_email",r)}s(pi,"getExistingAccounts");var Ei=Ue.users.isBuilder,Rt=Ue.users.isAdmin,dA=Ue.users.isGlobalBuilder,fA=Ue.users.isAdminOrBuilder,Ir=Ue.users.hasAdminPermissions,ke=Ue.users.hasBuilderPermissions,pA=Ue.users.hasAppBuilderPermissions,ju=Ue.users.isAdminOrWorkspaceBuilder;async function gn(t,e){let r=[...new Set(t.filter(i=>i.userGroups).flatMap(i=>i.userGroups))];return e=await H().getMultiple(r,{allowMissing:!0}),t.map(i=>Yu(i,e))}s(gn,"creatorsInList");async function _o(t){let e=[];return t.userGroups&&(e=await H().getMultiple(t.userGroups)),Yu(t,e)}s(_o,"isCreatorAsync");function Yu(t,e){let r=Ue.users.isCreator(t);return!r&&t?_U(t,e):r}s(Yu,"isCreatorSync");function _U(t,e){let r=e?.filter(n=>t.userGroups?.indexOf(n._id)!==-1);return r&&r.length>0?r.some(n=>Object.values(n.roles||{}).includes("CREATOR")):!1}s(_U,"isCreatorByGroupMembership");async function Hu(t,e){if(E.MULTI_TENANCY){let r=await Ao(t);if(r!=null&&r.tenantId!==e)throw new Yt(t)}if(!E.SELF_HOSTED&&!E.DISABLE_ACCOUNT_PORTAL){let r=await Or(t);if(r&&r.verified&&r.tenantId!==e)throw new Yt(t)}}s(Hu,"validateUniqueUser");async function zu(t){if(!E.SELF_HOSTED&&!E.DISABLE_ACCOUNT_PORTAL){let e=await pi(t.map(r=>r.email));return t.find(r=>e.map(n=>n.email).includes(r.email))}}s(zu,"getAccountHolderFromUsers");var Cp=s(async t=>{await Me.deleted(t),ke(t)&&await Me.permissionBuilderRemoved(t),Ir(t)&&await Me.permissionAdminRemoved(t)},"handleDeleteEvents"),OU=s(async(t,e,r)=>{for(let[n,i]of Object.entries(e))(!r||r[n]!==i)&&await So.assigned(t,i)},"assignAppRoleEvents"),IU=s(async(t,e,r)=>{if(r)for(let[n,i]of Object.entries(r))(!e||e[n]!==i)&&await So.unassigned(t,i)},"unassignAppRoleEvents"),wU=s(async(t,e)=>{let r=t.roles,n=e?.roles;await OU(t,r,n),await IU(t,r,n)},"handleAppRoleEvents"),bp=s(async(t,e)=>{let r=G(),n;!E.SELF_HOSTED&&!E.DISABLE_ACCOUNT_PORTAL&&(n=await ai(r)),await yt.identifyUser(t,n),e?(await Me.updated(t),RU(t,e)&&await Me.permissionBuilderRemoved(t),bU(t,e)&&await Me.permissionAdminRemoved(t),!e.forceResetPassword&&t.forceResetPassword&&t.password&&await Me.passwordForceReset(t),t.password!==e.password&&await Me.passwordUpdated(t)):await Me.created(t),DU(t,e)&&await Me.permissionBuilderAssigned(t),CU(t,e)&&await Me.permissionAdminAssigned(t),await wU(t,e)},"handleSaveEvents"),DU=s((t,e)=>mA(t,e,ke),"isAddingBuilder"),RU=s((t,e)=>hA(t,e,ke),"isRemovingBuilder"),CU=s((t,e)=>mA(t,e,Ir),"isAddingAdmin"),bU=s((t,e)=>hA(t,e,Ir),"isRemovingAdmin"),mA=s((t,e,r)=>!(!r(t)||e&&r(e)),"isAddingPermission"),hA=s((t,e,r)=>!(r(t)||!e||!r(e)),"isRemovingPermission");var vU=s(async t=>{let e=t._id;await Et.removeUser(t),await Cp(t),await wr.invalidateUser(e),await hn(e,{reason:"bulk-deletion"})},"bulkDeleteProcessing"),Ct=class t{static{s(this,"UserDB")}static init(e,r,n){t.quotas=e,t.groups=r,t.features=n}static async isPreventPasswordActions(e,r){return E.ENABLE_SSO_MAINTENANCE_MODE&&Rt(e)?!1:await t.features.isSSOEnforced()||Go(e)?!0:(r||(r=await ai(G())),!!(r&&r.email===e.email&&Vo(r)))}static async buildUser(e,r={hashPassword:!0,requirePassword:!0},n,i,o){let{password:a,_id:u}=e;i&&!i.password&&(r.requirePassword=!1);let c;if(a&&a!==i?.password){if(await t.isPreventPasswordActions(e,o))throw new we("Password change is disabled for this user",400);if(!r.skipPasswordValidation){let f=fp(a);if(!f.valid)throw new we(f.error,400)}c=r.hashPassword?await Ld(a):a}else i&&(c=i.password);let l=r.requirePassword&&!await t.features.isSSOEnforced();if(!c&&l)throw"Password must be specified.";u=u||Zn();let d={createdAt:Date.now(),...i,...e,_id:u,password:c,tenantId:n};return d.roles||(d.roles={}),d.status==null&&(d.status="active"),d}static async allUsers(){return(await H().allDocs(nn(null,{include_docs:!0}))).rows.map(n=>n.doc)}static async countUsersByApp(e){return{userCount:(await Zu(e,{})).length}}static async getUsersByAppAccess(e){return await xp(e.appId,{limit:e.limit||50})}static async getUserByEmail(e){return Tt(e)}static async getUser(e){let r=await yn(e);return r&&delete r.password,r}static async bulkGet(e){return await Ju(e)}static async bulkUpdate(e){return await Oo(e)}static async save(e,r={}){r.hashPassword==null&&(r.hashPassword=!0),r.requirePassword==null&&(r.requirePassword=!0);let n=G(),i=H(),{email:o,_id:a,userGroups:u=[],roles:c}=e;if(!o&&!a)throw new Error("_id or email is required");let l;if(a)try{if(l=await yn(a),o&&l.email!==o&&!r.allowChangingEmail)throw new Error("Email address cannot be changed")}catch(p){if(p.status!==404)throw p}if(!l&&o&&(l=await Tt(o),l&&l._id!==a))throw new Yt(o);let d=1,f=0;if((r.isAccountHolder||l)&&(d=0,f=1),l){let[p,m]=await gn([l,e]);f=p!==m?1:0}return t.quotas.addUsers(d,f,async()=>{r.isAccountHolder||await Hu(o,n);let p=await t.buildUser(e,r,n,l);r.currentUserId&&r.currentUserId===l?._id&&(p=vp(p,l)),!l&&c?.length&&(p.roles={...c});let m=[];if(!a&&u.length>0)for(let h of u)m.push(t.groups.addUsers(h,[p._id]));try{let h=await i.put(p);return p._rev=h.rev,await bp(p,l),l&&p.email!==l.email&&await Et.removeUser({email:l.email}),await Et.addUser(n,p._id,p.email,p.ssoId),await wr.invalidateUser(h.id),await Promise.all(m),i.get(p._id)}catch(h){throw h.status===409?"User exists already":h}})}static async bulkCreate(e,r){let n=G(),i=[],o=[],a=[],u=e.map(p=>p.email),c=await Dp(u),l=[];for(let p of e){let m=o.find(g=>g.email.toLowerCase()===p.email.toLowerCase()),h=c.includes(p.email.toLowerCase());if(m||h){l.push({email:p.email,reason:"Unavailable"});continue}p.userGroups=r||[],o.push(p),await _o(p)&&a.push(p)}let d=await ai(n),f=await t.features.isSSOEnforced();return t.quotas.addUsers(o.length,a.length,async()=>{for(let h of o)f&&delete h.password,i.push(t.buildUser(h,{hashPassword:!0,requirePassword:!f},n,void 0,d));let p=await Promise.all(i);await Oo(p);for(let h of p)await Et.addUser(n,h._id,h.email),await bp(h,void 0);let m=p.map(h=>({_id:h._id,email:h.email}));if(Array.isArray(m)&&r){let h=[],g=m.map(y=>y._id);for(let y of r)h.push(t.groups.addUsers(y,g));await Promise.all(h)}return{successful:m,unsuccessful:l}})}static async bulkDelete(e){let r=H(),n={successful:[],unsuccessful:[]},i=await zu(e);i&&(e=e.filter(m=>m.userId!==i.userId),n.unsuccessful.push({_id:i.userId,email:i.email,reason:"Account holder cannot be deleted"}));let a=(await r.allDocs({include_docs:!0,keys:e.map(m=>m.userId)})).rows.map(m=>m.doc),u=a.map(m=>({...m,_deleted:!0})),c=await Oo(u),d=(await gn(a)).filter(m=>m).length,f=[];for(let m of a){let g=(await Ao(m._id)).ssoId;g&&(await Qu(g)).filter(S=>S.ssoId==null).forEach(S=>{f.push({...S,_deleted:!0})}),await vU(m)}await _r().bulkDocs(f),await t.quotas.removeUsers(u.length,d);let p={};return a.reduce((m,h)=>(m[h._id]=h,m),p),c.forEach(m=>{let h=p[m.id].email;m.ok?n.successful.push({_id:m.id,email:h}):n.unsuccessful.push({_id:m.id,email:h,reason:"Database error"})}),n}static async destroy(e){let r=H(),n=await r.get(e),i=n._id;if(!E.SELF_HOSTED&&!E.DISABLE_ACCOUNT_PORTAL){let a=n.email;if(await Or(a))throw n.userId===Ft()._id?new we('Please visit "Account" to delete this user',400):new we("Account holder cannot be deleted",400)}await Et.removeUser(n),await r.remove(i,n._rev);let o=await _o(n)?1:0;await t.quotas.removeUsers(1,o),await Cp(n),await wr.invalidateUser(i),await hn(i,{reason:"deletion"})}static async createAdminUser(e,r,n){let i=n?.password,o={email:e,password:i,createdAt:Date.now(),roles:{},builder:{global:!0},admin:{global:!0},tenantId:r,firstName:n?.firstName,lastName:n?.lastName};return n?.ssoId&&(o.ssoId=n.ssoId),await oi(ye.CHECKLIST),await t.save(o,{hashPassword:n?.hashPassword,requirePassword:n?.requirePassword,skipPasswordValidation:n?.skipPasswordValidation,isAccountHolder:!0})}static async getGroups(e){return await this.groups.getBulk(e)}static async getGroupBuilderAppIds(e){return await this.groups.getGroupBuilderAppIds(e)}};function wo(t){return Array.isArray(t)?t.map(e=>{if(e)return delete e.password,e}):t&&(delete t.password,t)}s(wo,"removeUserPassword");async function Ju(t,e){let n=(await H().allDocs({keys:t,include_docs:!0})).rows.map(i=>i.doc);return e?.cleanup&&(n=wo(n)),n}s(Ju,"bulkGetGlobalUsersById");async function NU(){let t=H(),e=`us${b}`;return(await t.allDocs({startkey:e,endkey:`${e}${ve}`})).rows.map(n=>n.id)}s(NU,"getAllUserIds");async function UU(){let t=H(),e=`us${b}`;return(await t.allDocs({startkey:e,endkey:`${e}${ve}`,include_docs:!0})).rows.map(n=>n.doc)}s(UU,"getAllUsers");async function Oo(t){return await H().bulkDocs(t)}s(Oo,"bulkUpdateGlobalUsers");async function yn(t,e){let n=await H().get(t);return e?.cleanup&&(n=wo(n)),n}s(yn,"getById");async function Tt(t,e){if(t==null)throw"Must supply an email address to view";let r=await $t("by_email2",{key:t.toLowerCase(),include_docs:!0});if(Array.isArray(r))throw new Error(`Multiple users found with email address: ${t}`);let n=r;return e?.cleanup&&(n=wo(n)),n}s(Tt,"getGlobalUserByEmail");async function LU(t){try{let e=await Tt(t);if(Array.isArray(e)||e!=null)return!0}catch{return!1}return!1}s(LU,"doesUserExist");async function Zu(t,e,r){if(typeof t!="string")throw new Error("Must provide a string based workspace ID");let n=ru(t,{include_docs:!0});n.startkey=e&&e.startkey?e.startkey:n.startkey;let i=await $t("by_app",n);i||(i=[]);let o=Array.isArray(i)?i:[i];return r?.cleanup&&(o=wo(o)),o}s(Zu,"searchGlobalUsersByApp");async function xp(t,e){let r=`roles.${t}`,n=[{"builder.global":!0},{"admin.global":!0}];if(t){let a={[r]:{$exists:!0}};n.push(a)}return(await H().find({selector:{$or:n,_id:{$regex:"^us_"}},limit:e?.limit||50})).docs}s(xp,"searchGlobalUsersByAppAccess");function EA(t,e){if(e)return tu(Qe(t),e._id)}s(EA,"getGlobalUserByAppPage");async function gA(t,e,r){if(typeof t!="string")throw new Error("Must provide a string to search by");let n=t.toLowerCase(),i=e&&e.startkey?e.startkey:n,o=await $t("by_email2",{...e,startkey:i,endkey:`${n}${ve}`});o||(o=[]);let a=Array.isArray(o)?o:[o];return r?.cleanup&&(a=wo(a)),a}s(gA,"searchGlobalUsersByEmail");var kU=8;async function yA({bookmark:t,query:e,appId:r,limit:n}={}){let i=H(),o=n??kU,u={include_docs:!0,limit:o+1};t&&(u.startkey=t);let c,l="_id",d;return e?.equal?._id?c=[await yn(e.equal._id)]:r?(c=await Zu(r,u),d=s(f=>EA(r,f),"getKey")):e?.string?.email?(c=await gA(e?.string?.email,u),l="email"):e?.oneOf?._id?c=await Ju(e?.oneOf?._id,{cleanup:!0}):e?(c=(await i.allDocs(nn(null,{...u,limit:void 0}))).rows.map(p=>p.doc),c=cr.search(c,{query:e,limit:u.limit}).rows):c=(await i.allDocs(nn(null,u))).rows.map(p=>p.doc),Tf(c,o,{paginate:!0,property:l,getKey:d})}s(yA,"paginatedUsers");async function MU(){return(await _f("by_email2",{limit:0,include_docs:!1})).total_rows}s(MU,"getUserCount");async function FU(){let t=0;async function e(r){let n=await yA({bookmark:r}),i=await gn(n.data);t+=i.filter(o=>o).length,n.hasNextPage&&await e(n.nextPage)}return s(e,"iterate"),await e(),t}s(FU,"getCreatorCount");function BU(t){return delete t.admin,delete t.builder,t}s(BU,"removePortalUserPermissions");function vp(t,e){return delete t.admin,delete t.builder,delete t.roles,e&&(t.admin=e.admin,t.builder=e.builder,t.roles=e.roles),t}s(vp,"cleanseUserObject");async function WU(t,e){let r=Qe(e);t.builder??={},t.builder.creator=!0,t.builder.apps??=[],t.builder.apps.push(r),await Ct.save(t,{hashPassword:!1})}s(WU,"addAppBuilder");async function $U(t,e){let r=Qe(e);t.builder&&t.builder.apps?.includes(r)&&(t.builder.apps=t.builder.apps.filter(n=>n!==r)),await Ct.save(t,{hashPassword:!1})}s($U,"removeAppBuilder");var TA=3600;async function VU(t,e){let n=await wf(e).get(t);if(n.budibaseAccess=!0,!E.SELF_HOSTED&&!E.DISABLE_ACCOUNT_PORTAL){let i=await Or(n.email);i&&(n.account=i,n.accountPortalAccess=!0)}return n}s(VU,"populateFromDB");async function GU(t){let e=await Ct.bulkGet(t),r=t.filter((i,o)=>!e[o]),n=e.filter(i=>i);return await Promise.all(n.map(async i=>{if(i.budibaseAccess=!0,!E.SELF_HOSTED&&!E.DISABLE_ACCOUNT_PORTAL){let o=await Or(i.email);o&&(i.account=o,i.accountPortalAccess=!0)}})),r.length?{users:n,notFoundIds:r}:{users:n}}s(GU,"populateUsersFromDB");async function Do({userId:t,tenantId:e,email:r,populateUser:n}){if(n||(n=VU),!e)try{e=G()}catch{e=await Et.lookupTenantId(t)}let i=await Ms(),o=await i.get(t);return o||(o=await n(t,e,r),await i.store(t,o,TA)),o&&!o.tenantId&&e&&(o.tenantId=e),o.userGroups&&!Ue.users.isGlobalBuilder(o)&&await Re(e,async()=>{let a=await Ct.getGroupBuilderAppIds(o);if(a.length){let u=o.builder?.apps||[];o.builder={apps:[...new Set(u.concat(a))]}}}),o}s(Do,"getUser");async function qU(t){let e=await Ms(),r=await e.bulkGet(t),n=t.filter(a=>!r[a]),i=Object.values(r).filter(a=>!!a),o;if(n.length){let a=await GU(n);o=a.notFoundIds;for(let u of a.users)await e.store(u._id,u,TA);i.push(...a.users)}return{users:i,notFoundIds:o}}s(qU,"getUsers");async function Ro(t){await(await Ms()).delete(t)}s(Ro,"invalidateUser");var kp={};N(kp,{Writethrough:()=>Up});var yi={};N(yi,{AUTO_EXTEND_POLLING_MS:()=>AA,doWithLock:()=>Pp,newRedlock:()=>Tn});var SA=F(require("redlock"));async function QU(t,e){if(t==="custom")return Tn(e);switch(t){case"try_once":return Tn(gi.TRY_ONCE);case"try_twice":return Tn(gi.TRY_TWICE);case"default":return Tn(gi.DEFAULT);case"delay_500":return Tn(gi.DELAY_500);case"auto_extend":return Tn(gi.AUTO_EXTEND);default:throw St.unreachable(t)}}s(QU,"getClient");var gi={TRY_ONCE:{retryCount:0},TRY_TWICE:{retryCount:1},DEFAULT:{driftFactor:.01,retryCount:10,retryDelay:200,retryJitter:100},DELAY_500:{retryDelay:500},CUSTOM:{},AUTO_EXTEND:{retryCount:-1}};async function Tn(t={}){let e={...gi.DEFAULT,...t},n=(await pf()).client;return new SA.default([n],e)}s(Tn,"newRedlock");function jU(t){let r=`lock:${t.systemLock?"system":G()}_${t.name}`;return t.resource&&(r=r+`_${t.resource}`),r}s(jU,"getLockName");var AA=Ee.fromSeconds(10).toMs();async function Pp(t,e){let r=await QU(t.type,t.customOptions),n,i;try{let o=jU(t),a=t.type==="auto_extend"?AA:t.ttl;if(n=await r.lock(o,a),t.type==="auto_extend"){let c=s(()=>{i=setTimeout(async()=>{n=await n.extend(a,()=>t.onExtend&&t.onExtend()),c()},a/2)},"extendInIntervals");c()}return{executed:!0,result:await e()}}catch(o){if(o.name==="LockError"){if(t.type==="try_once")return{executed:!1};throw o}else throw o}finally{clearTimeout(i),await n?.unlock()}}s(Pp,"doWithLock");var _A=1e4,Np=null;async function Xu(){if(!Np){let t=await ff();Np=new ln(t)}return Np}s(Xu,"getCache");function Co(t,e){return t.name+e}s(Co,"makeCacheKey");function Lp(t,e=null){return{doc:t,lastWrite:e||Date.now()}}s(Lp,"makeCacheItem");async function YU(t,e,r=_A){let n=await Xu(),i=e._id,o;i&&(o=await n.get(Co(t,i)));let a=!o||o.lastWrite<Date.now()-r,u=e;return a&&((await Pp({type:"try_once",name:"persist_writethrough",resource:i,ttl:15e3},async()=>{let l=s(async d=>{let f=await t.put(d,{force:!0});u._id=f.id,u._rev=f.rev},"writeDb");try{await l(e)}catch(d){if(d.status!==409)throw d;si("Ignoring conflict in write-through cache")}})).executed||si("Ignoring redlock conflict in write-through cache")),o=Lp(u,a?null:o?.lastWrite),u._id&&await n.store(Co(t,u._id),o),{ok:!0,id:u._id,rev:u._rev}}s(YU,"put");async function HU(t,e){let r=await Xu(),n=Co(t,e),i=await r.get(n);if(!i){let o=await t.get(e);i=Lp(o),await r.store(n,i)}return i.doc}s(HU,"get");async function zU(t,e){let r=await Xu(),n=Co(t,e),i=await r.get(n);if(!i){let o=await t.tryGet(e);if(!o)return null;i=Lp(o),await r.store(n,i)}return i.doc}s(zU,"tryGet");async function JU(t,e,r){let n=await Xu();if(!e)throw new Error("No ID/Rev provided.");let i=typeof e=="string"?e:e._id;r=typeof e=="string"?r:e._rev;try{await n.delete(Co(t,i))}finally{await t.remove(i,r)}}s(JU,"remove");var Up=class{static{s(this,"Writethrough")}constructor(e,r=_A){this.db=e,this.writeRateMs=r}async put(e,r=this.writeRateMs){return YU(this.db,e,r)}async get(e){return HU(this.db,e)}async tryGet(e){return zU(this.db,e)}async remove(e,r){return JU(this.db,e,r)}};function ec(t){return`config${b}${t}`}s(ec,"generateConfigID");async function rt(t){let e=H();try{return await e.get(ec(t))}catch(r){if(r.status===404)return;throw r}}s(rt,"getConfig");async function ZU(t){return t._id||(t._id=ec(t.type)),H().put(t)}s(ZU,"save");async function ni(){let t=await rt("settings");return t||(t={_id:ec("settings"),type:"settings",config:{}}),t.config.platformUrl=await bo({tenantAware:!0,config:t.config}),t.config.analyticsEnabled=await Wu({config:t.config}),t}s(ni,"getSettingsConfigDoc");async function Bp(){return(await ni()).config}s(Bp,"getSettingsConfig");async function bo(t={tenantAware:!0}){let e=E.PLATFORM_URL||"http://localhost:10000";if(!E.SELF_HOSTED&&E.MULTI_TENANCY&&t.tenantAware){let r=G();e.includes("localhost:")||(e=e.replace("://",`://${r}.`))}else if(E.SELF_HOSTED){let r=t?.config?t.config:(await rt("settings"))?.config;r?.platformUrl&&(e=r.platformUrl)}return e}s(bo,"getPlatformUrl");var Wu=s(async t=>{if(!E.SELF_HOSTED)return!!E.ENABLE_ANALYTICS;let e=await Ar(ye.ANALYTICS_ENABLED,86400,async()=>{let n=t?.config?t.config:(await rt("settings"))?.config;if(n?.analyticsEnabled===!1)return!1;if(n?.analyticsEnabled===!0)return!0});if(e!==void 0)return e;let r=E.ENABLE_ANALYTICS;return!(r===0||r===!1)},"analyticsEnabled");async function XU(){return await rt("google")}s(XU,"getGoogleConfigDoc");async function tc(){return(await XU())?.config}s(tc,"getGoogleConfig");async function Wp(){if(!E.SELF_HOSTED)return Mp();let t=await tc();return(!t||!t.activated)&&(t=Mp()),t}s(Wp,"getGoogleDatasourceConfig");function Mp(){if(E.GOOGLE_CLIENT_ID&&E.GOOGLE_CLIENT_SECRET)return{clientID:E.GOOGLE_CLIENT_ID,clientSecret:E.GOOGLE_CLIENT_SECRET,activated:!0}}s(Mp,"getDefaultGoogleConfig");async function eL(){return rt("logos_oidc")}s(eL,"getOIDCLogosDoc");async function tL(){return rt("oidc")}s(tL,"getOIDCConfigDoc");async function rL(){let t=(await tL())?.config;return t?.configs&&t.configs[0]}s(rL,"getOIDCConfig");async function $p(t){let e=(await rt("oidc"))?.config;return e&&e.configs.filter(r=>r.uuid===t)[0]}s($p,"getOIDCConfigById");async function OA(){return rt("smtp")}s(OA,"getSMTPConfigDoc");async function nL(t){let e=await OA();if(e)return e.config;let r=E.SELF_HOSTED||!t;if(E.SMTP_FALLBACK_ENABLED&&r)return{port:E.SMTP_PORT,host:E.SMTP_HOST,secure:!1,from:E.SMTP_FROM_ADDRESS,auth:{user:E.SMTP_USER,pass:E.SMTP_PASSWORD},fallback:!0}}s(nL,"getSMTPConfig");async function iL(){return(await rt("scim"))?.config}s(iL,"getSCIMConfig");async function sL(){return rt("ai")}s(sL,"getAIConfig");async function oL(){return rt("recaptcha")}s(oL,"getRecaptchaConfig");var Jp={};N(Jp,{AccessController:()=>qp,BUILTIN_ROLE_IDS:()=>Kp,Role:()=>Dr,RoleHierarchyTraversal:()=>rc,RoleIDVersion:()=>Qp,builtinRoleToNumber:()=>xo,checkForRoleResourceArray:()=>RA,externalRole:()=>fL,findRole:()=>vo,getAllRoleIds:()=>EL,getAllRoles:()=>zp,getBuiltinRole:()=>wA,getBuiltinRoles:()=>Yp,getDBRoleID:()=>CA,getExternalRoleID:()=>Rr,getExternalRoleIDs:()=>bA,getRole:()=>pL,getUserRoleHierarchy:()=>Hp,getUserRoleIdHierarchy:()=>DA,isBuiltin:()=>Sn,lowerBuiltinRoleID:()=>dL,prefixRoleIDNoBuiltin:()=>Gp,roleIDsAreEqual:()=>nt,roleToNumber:()=>lL,saveRoles:()=>mL,validInherits:()=>cL});var IA=require("lodash"),nc=F(require("lodash/fp/cloneDeep")),Vp=F(require("semver"));var Kp={ADMIN:"ADMIN",POWER:"POWER",BASIC:"BASIC",PUBLIC:"PUBLIC"},ie={...Kp,BUILDER:"BUILDER"},Qp={UUID:void 0,NAME:"name"};function uL(t,e){return Array.isArray(e)?e.filter(r=>t.includes(r)).length===e.length:t.includes(e)}s(uL,"rolesInList");var Dr=class{constructor(e,r,n,i){this.permissions={};this._id=e,this.name=r,this.uiMetadata=i,this.permissionId=n,this.version=Qp.NAME}static{s(this,"Role")}addInheritance(e){return e&&typeof e=="string"?e=Gp(e):e&&Array.isArray(e)&&(e=e.map(Gp)),this.inherits=e,this}},rc=class{static{s(this,"RoleHierarchyTraversal")}constructor(e,r){this.allRoles=e,this.opts=r}walk(e){let r=this.opts,n=this.allRoles,i=[];if(!e||!e._id)return i;if(i.push(e),Array.isArray(e.inherits))for(let o of e.inherits){let a=vo(o,n,r);a&&(i=i.concat(this.walk(a)))}else{let o=[],a=e;for(;a&&a.inherits&&!uL(o,a.inherits);){if(Array.isArray(a.inherits))return i.concat(this.walk(a));if(o.push(a.inherits),a=vo(a.inherits,n,r),a&&i.push(a),Ne.roles.checkForRoleInheritanceLoops(i))break}}return(0,IA.uniqBy)(i,o=>o._id)}},jp={ADMIN:new Dr(ie.ADMIN,ie.ADMIN,"admin",{displayName:"App admin",description:"Can do everything",color:"var(--spectrum-global-color-static-red-400)"}).addInheritance(ie.POWER),POWER:new Dr(ie.POWER,ie.POWER,"power",{displayName:"App power user",description:"An app user with more access",color:"var(--spectrum-global-color-static-orange-400)"}).addInheritance(ie.BASIC),BASIC:new Dr(ie.BASIC,ie.BASIC,"write",{displayName:"App user",description:"Any logged in user",color:"var(--spectrum-global-color-static-green-400)"}).addInheritance(ie.PUBLIC),PUBLIC:new Dr(ie.PUBLIC,ie.PUBLIC,"public",{displayName:"Public user",description:"Accessible to anyone",color:"var(--spectrum-global-color-static-blue-400)"}),BUILDER:new Dr(ie.BUILDER,ie.BUILDER,"admin",{displayName:"Builder user",description:"Users that can edit this app",color:"var(--spectrum-global-color-static-magenta-600)"})};function Yp(){return(0,nc.default)(jp)}s(Yp,"getBuiltinRoles");function Sn(t){return Object.values(Kp).includes(t)}s(Sn,"isBuiltin");function Gp(t){return Sn(t)?t:Bt(t)}s(Gp,"prefixRoleIDNoBuiltin");function wA(t){let e=Object.values(jp).find(r=>t.includes(r._id));if(e)return(0,nc.default)(e)}s(wA,"getBuiltinRole");function cL(t,e){if(!e)return!1;let r=s(n=>t.find(i=>nt(i._id,n)),"find");if(Array.isArray(e)){let n=e.filter(i=>r(i));return e.length!==0&&n.length===e.length}else return!!r(e)}s(cL,"validInherits");function xo(t){let e=Yp(),r=Object.values(e).length+1;if(nt(t,ie.ADMIN)||nt(t,ie.BUILDER))return r;let n=e[t],i=0;do{if(!n)break;if(Array.isArray(n.inherits))throw new Error("Built-in roles don't support multi-inheritance");n=e[n.inherits],i++}while(n!==null);return i}s(xo,"builtinRoleToNumber");async function lL(t){if(Sn(t))return xo(t);let e=await Hp(t,{defaultPublic:!0}),r=s(n=>{if(!n.inherits)return 0;if(Array.isArray(n.inherits)){let i=n.inherits.map(o=>{let a=e.find(u=>nt(u._id,o));if(a)return r(a)+1}).filter(o=>o).sort().pop();if(i!=null)return i}else if(Sn(n.inherits))return xo(n.inherits)+1;return 0},"findNumber");return Math.max(...e.map(r))}s(lL,"roleToNumber");function dL(t,e){return t?e&&xo(t)>xo(e)?e:t:e}s(dL,"lowerBuiltinRoleID");function nt(t,e){return Bt(t)===Bt(e)}s(nt,"roleIDsAreEqual");function fL(t){let e;return t._id&&(e=Rr(t._id)),{...t,_id:e,inherits:bA(t.inherits,t.version)}}s(fL,"externalRole");function vo(t,e,r){let n=wA(t);n||(t=Bt(t));let i=e.find(o=>o._id&&nt(o._id,t));return!i&&!Sn(t)&&r?.defaultPublic?(0,nc.default)(jp.PUBLIC):(n=Object.assign(n||{},i),n?._id&&(n._id=Rr(n._id,n.version)),Object.keys(n).length===0?void 0:n)}s(vo,"findRole");async function pL(t,e){let r=Jn(),n=[];if(!Sn(t)){let i=await r.tryGet(CA(t));i&&n.push(i)}return vo(t,n,e)}s(pL,"getRole");async function mL(t){await Jn().bulkDocs(t.filter(r=>r._id).map(r=>({...r,_id:Bt(r._id)})))}s(mL,"saveRoles");async function hL(t,e){let r=await zp();if(nt(t,ie.ADMIN))return r;let n=vo(t,r,e),i=[];return n&&(i=new rc(r,e).walk(n)),i}s(hL,"getAllUserRoles");async function DA(t){return(await Hp(t)).map(r=>r._id)}s(DA,"getUserRoleIdHierarchy");async function Hp(t,e){return hL(t,e)}s(Hp,"getUserRoleHierarchy");function RA(t,e){if(t&&!Array.isArray(t[e])){let r=t[e];t[e]=[r],r==="write"&&t[e].push("read")}return t}s(RA,"checkForRoleResourceArray");async function EL(t){return(await zp(t)).map(r=>r._id)}s(EL,"getAllRoleIds");async function zp(t){if(t)return Ke(t,e);{let r;try{r=Jn()}catch{}return e(r)}async function e(r){let n=[];r&&(n=(await r.allDocs(nu(null,{include_docs:!0}))).rows.map(u=>u.doc),n.forEach(u=>u._id=Rr(u._id,u.version)));let i=Yp(),o=[];!r||await gL(r)?o=[ie.ADMIN,ie.POWER,ie.BASIC,ie.PUBLIC]:o=[ie.ADMIN,ie.BASIC,ie.PUBLIC];for(let a of o){let u=i[a],c=n.filter(l=>nt(l._id,a))[0];c==null?n.push(u||i.BASIC):(n=n.filter(l=>l._id!==c._id),c._id=Rr(u._id,c.version),n.push({...u,...c,name:u.name,_id:Rr(u._id,u.version)}))}for(let a of n)if(a.permissions)for(let u of Object.keys(a.permissions))a.permissions=RA(a.permissions,u);return n}s(e,"internal")}s(zp,"getAllRoles");async function gL(t){let r=(await t.tryGet("app_metadata"))?.creationVersion;return!r||!Vp.default.valid(r)?!0:!Vp.default.gte(r,E.MIN_VERSION_WITHOUT_POWER_ROLE)}s(gL,"shouldIncludePowerRole");var qp=class{static{s(this,"AccessController")}constructor(){this.userHierarchies={}}async hasAccess(e,r){if(e==null||e===""||nt(e,ie.BUILDER)||nt(r,e)||nt(r,ie.BUILDER))return!0;let n=r?this.userHierarchies[r]:null;return!n&&r&&(n=await DA(r),this.userHierarchies[r]=n),n?.find(i=>nt(i,e))!==void 0}async checkScreensAccess(e,r){let n=[];for(let i of e){let o=await this.checkScreenAccess(i,r);o&&n.push(o)}return n}async checkScreenAccess(e,r){let n=e&&e.routing?e.routing.roleId:void 0;return await this.hasAccess(n,r)?e:null}};function CA(t){return t?.startsWith("role")?t:Bt(t)}s(CA,"getDBRoleID");function Rr(t,e){if(t.startsWith(`role${b}`)&&(Sn(t)||e===Qp.NAME)){let r=t.split(b);return r.shift(),r.join(b)}return t}s(Rr,"getExternalRoleID");function bA(t,e){return t&&(typeof t=="string"?Rr(t,e):t.map(r=>Rr(r,e)))}s(bA,"getExternalRoleIDs");var Zp={};N(Zp,{BUILDER:()=>_L,BUILTIN_PERMISSIONS:()=>ic,CREATOR:()=>OL,GLOBAL_BUILDER:()=>IL,PermissionImpl:()=>se,PermissionLevel:()=>wi,PermissionType:()=>Wo,doesHaveBasePermission:()=>SL,getAllowedLevels:()=>NA,getBuiltinPermissionByID:()=>TL,getBuiltinPermissions:()=>yL,isPermissionLevelHigherThanRead:()=>AL,levelToNumber:()=>PA});var xA=F(require("lodash/flatten")),vA=F(require("lodash/fp/cloneDeep"));var se=class{static{s(this,"PermissionImpl")}constructor(e,r){this.type=e,this.level=r}};function PA(t){switch(t){case"execute":return 0;case"read":return 1;case"write":return 2;case"admin":return 3;default:return-1}}s(PA,"levelToNumber");function NA(t){switch(t){case"execute":return["execute"];case"read":return["execute","read"];case"write":case"admin":return["execute","read","write"];default:return[]}}s(NA,"getAllowedLevels");var ic={PUBLIC:{_id:"public",name:"Public",permissions:[new se("webhook","execute")]},READ_ONLY:{_id:"read_only",name:"Read only",permissions:[new se("query","read"),new se("table","read"),new se("app","read")]},WRITE:{_id:"write",name:"Read/Write",permissions:[new se("query","write"),new se("table","write"),new se("automation","execute"),new se("legacy_view","read"),new se("app","read")]},POWER:{_id:"power",name:"Power",permissions:[new se("table","write"),new se("user","read"),new se("automation","execute"),new se("webhook","read"),new se("legacy_view","read"),new se("app","read")]},ADMIN:{_id:"admin",name:"Admin",permissions:[new se("table","admin"),new se("user","admin"),new se("automation","admin"),new se("webhook","read"),new se("query","admin"),new se("legacy_view","read"),new se("app","read")]}};function yL(){return(0,vA.default)(ic)}s(yL,"getBuiltinPermissions");function TL(t){return Object.values(ic).find(r=>r._id===t)}s(TL,"getBuiltinPermissionByID");function SL(t,e,r){let n=[...new Set(r.map(a=>a.permissionId))],i=Object.values(ic),o=(0,xA.default)(i.filter(a=>n.indexOf(a._id)!==-1).map(a=>a.permissions));for(let a of o)if(a.type===t&&NA(a.level).indexOf(e)!==-1)return!0;return!1}s(SL,"doesHaveBasePermission");function AL(t){return PA(t)>1}s(AL,"isPermissionLevelHigherThanRead");var _L="builder",OL="creator",IL="globalBuilder";var lm={};N(lm,{adminOnly:()=>sc,auditLog:()=>oc,authError:()=>Oe,buildAuthMiddleware:()=>a0,buildCsrfMiddleware:()=>c0,buildTenancyMiddleware:()=>u0,builderOnly:()=>fc,builderOrAdmin:()=>pc,google:()=>Jt,internalApi:()=>hc,joiValidator:()=>Po,oidc:()=>Zt,passport:()=>l0,platformLogout:()=>h0,refreshOAuthToken:()=>p0,ssoCallbackUrl:()=>br,updateUserOAuth:()=>m0,workspaceBuilderOrAdmin:()=>yc});var cm={};N(cm,{adminOnly:()=>sc,auditLog:()=>oc,authError:()=>Oe,authenticated:()=>dc,builderOnly:()=>fc,builderOrAdmin:()=>pc,correlation:()=>LA,csp:()=>qA,csrf:()=>mc,datasource:()=>s0,errorHandling:()=>QA,featureFlagCookie:()=>jA,google:()=>Jt,internalApi:()=>hc,ip:()=>YA,joiValidator:()=>Po,local:()=>Ti,oidc:()=>Zt,pino:()=>kA,querystringToBody:()=>t_,ssoCallbackUrl:()=>br,tenancy:()=>gc,workspaceBuilderOrAdmin:()=>yc});var UA=require("uuid");var wL=require("correlation-id"),LA=s((t,e)=>{let r=t.headers["x-budibase-correlation-id"];return r||(r=(0,UA.v4)()),wL.withId(r,()=>e())},"correlationMiddleware");var DL=require("koa-pino-logger"),RL=require("correlation-id");function CL(){return{logger:Iu,genReqId:RL.getId,autoLogging:{ignore:t=>!!t.url?.includes("/health")},serializers:{req:t=>({method:t.method,url:t.url,correlationId:t.id}),res:t=>({status:t.statusCode})}}}s(CL,"pinoSettings");function bL(){return E.HTTP_LOGGING?DL(CL()):(t,e)=>e()}s(bL,"getMiddleware");var kA=bL();var sc=s(async(t,e)=>(!t.internal&&!Rt(t.user)&&t.throw(403,"Admin user only endpoint."),e()),"adminOnly");var oc=s(async(t,e)=>e(),"auditLog");var xL=/\/:(.*?)(\/.*)?$/g,An=s(t=>t?t.map(e=>{let r=e.route,n=e.method,i=r.match(xL);if(i)for(let o of i){let u="/.*"+(o.endsWith("/")?"/":"");r=r.replace(o,u)}return{regex:new RegExp(r),method:n,route:r}}):[],"buildMatcherRegex"),_n=s((t,e)=>e.find(({regex:r,method:n})=>{let i=r.test(t.request.url),o=n==="ALL"?!0:t.request.method.toLowerCase()===n.toLowerCase();return i&&o}),"matches");var im={};N(im,{SecretOption:()=>BA,decrypt:()=>nm,decryptFile:()=>kL,encrypt:()=>NL,encryptFile:()=>UL,getSecret:()=>rm});var zt=F(require("crypto")),Cr=F(require("fs")),Xp=require("path"),em=F(require("zlib"));var ac="aes-256-ctr",FA="-",vL=1e4,PL=32,uc=16,tm=16,BA=(r=>(r.API="api",r.ENCRYPTION="encryption",r))(BA||{});function rm(t){let e,r;switch(t){case"encryption":e=E.ENCRYPTION_KEY,r="ENCRYPTION_KEY";break;case"api":default:e=E.API_ENCRYPTION_KEY,r="API_ENCRYPTION_KEY";break}if(!e)throw new Error(`Secret "${r}" has not been set in environment.`);return e}s(rm,"getSecret");function cc(t,e){return zt.default.pbkdf2Sync(t,new Uint8Array(e),vL,PL,"sha512")}s(cc,"stretchString");function NL(t,e="api"){let r=zt.default.randomBytes(uc),n=cc(rm(e),r),i=zt.default.createCipheriv(ac,new Uint8Array(n),new Uint8Array(r)),o=i.update(t,"utf8"),a=i.final(),u=Buffer.concat([new Uint8Array(o),new Uint8Array(a)]).toString("hex");return`${r.toString("hex")}${FA}${u}`}s(NL,"encrypt");function nm(t,e="api"){let[r,n]=t.split(FA),i=Buffer.from(r,"hex"),o=cc(rm(e),i),a=zt.default.createDecipheriv(ac,new Uint8Array(o),new Uint8Array(i)),u=a.update(n,"hex"),c=a.final();return Buffer.concat([new Uint8Array(u),new Uint8Array(c)]).toString()}s(nm,"decrypt");async function UL({dir:t,filename:e},r){let n=`${e}.enc`,i=(0,Xp.join)(t,e);if(Cr.default.lstatSync(i).isDirectory())throw new Error("Unable to encrypt directory");let o=Cr.default.createReadStream(i),a=Cr.default.createWriteStream((0,Xp.join)(t,n)),u=zt.default.randomBytes(uc),c=zt.default.randomBytes(tm),l=cc(r,u),d=zt.default.createCipheriv(ac,new Uint8Array(l),new Uint8Array(c));return a.write(u),a.write(c),o.pipe(em.default.createGzip()).pipe(d).pipe(a),new Promise(f=>{a.on("finish",()=>{f({filename:n,dir:t})})})}s(UL,"encryptFile");async function LL(t){let e=Cr.default.createReadStream(t),r=await MA(e,uc),n=await MA(e,tm);return e.close(),{salt:r,iv:n}}s(LL,"getSaltAndIV");async function kL(t,e,r){if(Cr.default.lstatSync(t).isDirectory())throw new Error("Unable to decrypt directory");let{salt:n,iv:i}=await LL(t),o=Cr.default.createReadStream(t,{start:uc+tm}),a=Cr.default.createWriteStream(e),u=cc(r,n),c=zt.default.createDecipheriv(ac,new Uint8Array(u),new Uint8Array(i)),l=em.default.createGunzip();return o.pipe(c).pipe(l).pipe(a),new Promise((d,f)=>{a.on("finish",()=>{a.close(),d()}),o.on("error",p=>{a.close(),f(p)}),c.on("error",p=>{a.close(),f(p)}),l.on("error",p=>{a.close(),f(p)}),a.on("error",p=>{a.close(),f(p)})})}s(kL,"decryptFile");function MA(t,e){return new Promise((r,n)=>{let i=0,o=[];t.on("readable",()=>{let a;for(;(a=t.read(e-i))!==null;)o.push(a),i+=a.length;r(Buffer.concat(o.map(u=>new Uint8Array(u))))}),t.on("end",()=>{n(new Error("Insufficient data in the stream."))}),t.on("error",a=>{n(a)})})}s(MA,"readBytes");var $A=F(require("dd-trace"));var ML=E.SESSION_UPDATE_PERIOD?parseInt(E.SESSION_UPDATE_PERIOD):60*1e3;function FL(){return new Date(Date.now()-ML).toISOString()}s(FL,"timeMinusOneMinute");function WA(t,e={}){t.publicEndpoint=e.publicEndpoint||!1,t.isAuthenticated=e.authenticated||!1,t.loginMethod=e.loginMethod,t.user=e.user,t.internal=e.internal||!1,t.version=e.version}s(WA,"finalise");async function BL(t,e){if(js(t))return{valid:!0,user:void 0};let n=nm(t).split(b)[0];return Re(n,async()=>{let i;try{let o=H();i=await $t("by_api_key",{key:t},o)}catch{i=void 0}if(i)return{valid:!0,user:await Do({userId:i,tenantId:n,populateUser:e})};throw new ci})}s(BL,"checkApiKey");function lc(t,e){let r=t.request.headers[e];if(Array.isArray(r))throw new Error("Unexpected header format");return r}s(lc,"getHeader");function dc(t=[],e={publicAllowed:!1}){let r=t?An(t):[];return async(n,i)=>{let o=!1,a=lc(n,"x-budibase-api-version");_n(n,r)&&(o=!0);try{let c=lc(n,"x-budibase-token"),l=Gt(n,"budibase:auth")||su(c),d=lc(n,"x-budibase-api-key");!d&&n.request.headers.authorization&&(d=n.request.headers.authorization.split(" ")[1]);let f=lc(n,"x-budibase-tenant-id"),p=!1,m,h=!1,g;if(l&&!d){let S=l.sessionId,O=l.userId,_;try{_=await hp(O,S),e&&e.populateUser?m=await Do({userId:O,tenantId:_.tenantId,email:_.email,populateUser:e.populateUser(n)}):m=await Do({userId:O,tenantId:_.tenantId,email:_.email}),m.csrfToken=_.csrfToken,g="cookie",_?.lastAccessedAt<FL()&&await mp(_),p=!0}catch(D){p=!1,console.error(`Auth Error: ${D.message}`),gr(n,"budibase:auth")}}if(!p&&d){let S=e.populateUser?e.populateUser(n):null,{valid:O,user:_}=await BL(d,S);O&&(p=!0,g="api_key",m=_,h=!_)}!m&&f?m={tenantId:f}:m&&"password"in m&&delete m.password,p||(p=!1);let y=s(S=>S&&S.email,"isUser");return y(m)&&$A.default.setUser({id:m._id,tenantId:m.tenantId,budibaseAccess:m.budibaseAccess,status:m.status}),WA(n,{authenticated:p,user:m,internal:h,version:a,publicEndpoint:o,loginMethod:g}),y(m)?Bd(m,n,i):i()}catch(c){if(console.error(`Auth Error: ${c.message}`),c?.name==="JsonWebTokenError"?gr(n,"budibase:auth"):c?.code==="invalid_api_key"&&n.throw(403,c.message),e&&e.publicAllowed||o)return WA(n,{authenticated:!1,version:a,publicEndpoint:o}),i();n.throw(c.status||403,c)}}}s(dc,"authenticated");async function fc(t,e){if(t.internal)return e();let r=await on(t);return!r&&!E.isWorker()?t.throw(403,"This request required a workspace id."):!r&&!ke(t.user)?t.throw(403,"Builder user only endpoint."):r&&!Ei(t.user,r)&&t.throw(403,"Workspace builder user only endpoint."),e()}s(fc,"builderOnly");async function pc(t,e){if(t.internal||Rt(t.user))return e();let r=await on(t);return!r&&!E.isWorker()?t.throw(403,"This request required a workspace id."):!r&&!ke(t.user)?t.throw(403,"Admin/Builder user only endpoint."):r&&!Ei(t.user,r)&&t.throw(403,"Workspace Admin/Builder user only endpoint."),e()}s(pc,"builderOrAdmin");var GA=F(require("crypto"));var VA={"default-src":["'self'"],"script-src":["'self'","'unsafe-eval'","https://*.budibase.net","https://cdn.budi.live","https://js.intercomcdn.com","https://widget.intercom.io","https://d2l5prqdbvm3op.cloudfront.net","https://us-assets.i.posthog.com","https://www.google.com/recaptcha/api.js"],"style-src":["'self'","'unsafe-inline'","https://cdn.jsdelivr.net","https://fonts.googleapis.com","https://rsms.me","https://maxcdn.bootstrapcdn.com"],"object-src":["'none'"],"base-uri":["'self'"],"connect-src":["'self'","https://*.budibase.app","https://*.budibaseqa.app","https://*.budibase.net","https://api-iam.intercom.io","https://api-ping.intercom.io","https://app.posthog.com","https://us.i.posthog.com","wss://nexus-websocket-a.intercom.io","wss://nexus-websocket-b.intercom.io","https://nexus-websocket-a.intercom.io","https://nexus-websocket-b.intercom.io","https://uploads.intercomcdn.com","https://uploads.intercomusercontent.com","https://*.amazonaws.com","https://*.s3.amazonaws.com","https://*.s3.us-east-2.amazonaws.com","https://*.s3.us-east-1.amazonaws.com","https://*.s3.us-west-1.amazonaws.com","https://*.s3.us-west-2.amazonaws.com","https://*.s3.af-south-1.amazonaws.com","https://*.s3.ap-east-1.amazonaws.com","https://*.s3.ap-south-1.amazonaws.com","https://*.s3.ap-northeast-2.amazonaws.com","https://*.s3.ap-southeast-1.amazonaws.com","https://*.s3.ap-southeast-2.amazonaws.com","https://*.s3.ap-northeast-1.amazonaws.com","https://*.s3.ca-central-1.amazonaws.com","https://*.s3.cn-north-1.amazonaws.com","https://*.s3.cn-northwest-1.amazonaws.com","https://*.s3.eu-central-1.amazonaws.com","https://*.s3.eu-west-1.amazonaws.com","https://*.s3.eu-west-2.amazonaws.com","https://*.s3.eu-south-1.amazonaws.com","https://*.s3.eu-west-3.amazonaws.com","https://*.s3.eu-north-1.amazonaws.com","https://*.s3.sa-east-1.amazonaws.com","https://*.s3.me-south-1.amazonaws.com","https://*.s3.us-gov-east-1.amazonaws.com","https://*.s3.us-gov-west-1.amazonaws.com","https://api.github.com"],"font-src":["'self'","data:","https://cdn.jsdelivr.net","https://fonts.gstatic.com","https://rsms.me","https://maxcdn.bootstrapcdn.com","https://js.intercomcdn.com","https://fonts.intercomcdn.com"],"frame-src":["'self'","https:"],"img-src":["http:","https:","data:","blob:"],"manifest-src":["'self'"],"media-src":["'self'","https://js.intercomcdn.com","https://cdn.budi.live"],"worker-src":["blob:","'self'"]},WL=/^[A-Za-z0-9-*:/.]+$/,qA=s(async(t,e)=>{let r=GA.default.randomBytes(16).toString("base64");t.state.nonce=r;let n={...VA};if(n["script-src"]=[...VA["script-src"],`'nonce-${r}'`],t.user?.license?.features.includes("customAppScripts")&&t.appId)try{let a=await Bs.getWorkspaceMetadata(t.appId);if("name"in a)for(let u of a.scripts||[]){let c=(u.cspWhitelist||"").split(`
|
|
36
|
+
}`,"platform_users_lowercase_2")},"createPlatformUserView"),Gs=s(async(t,e)=>{let r={account_by_email:yT,platform_users_lowercase_2:TT};return Ke(fe.PLATFORM_INFO.name,async n=>{let i=r[t];return Af(t,e,n,i,{arrayResponse:!0})})},"queryPlatformView"),ST={by_email2:mT,by_api_key:ET,by_app:hT},$t=s(async(t,e,r,n)=>{r||(r=H());let i=ST[t];return Af(t,e,r,i,n)},"queryGlobalView");async function _f(t,e,r){let n=H(),i=ST[t];return Vs(t,e,n,i,r)}s(_f,"queryGlobalViewRaw");var Lb=F(require("pouchdb"));var Of=class{static{s(this,"Replication")}constructor({source:e,target:r}){this.source=Xe(e),this.target=Xe(r),e.startsWith("app_dev")&&r.startsWith("app")?this.direction="toProduction":e.startsWith("app")&&r.startsWith("app_dev")&&(this.direction="toDev")}async close(){await Promise.all([ws(this.source),ws(this.target)])}replicate(e={}){return new Promise(r=>{this.source.replicate.to(this.target,e).on("denied",function(n){throw new Error(`Denied: Document failed to replicate ${n}`)}).on("complete",function(n){return r(n)}).on("error",function(n){throw n})})}async resolveInconsistencies(e){let r=[];for(let n of e)try{let[i,o]=await Promise.all([this.source.get(n),this.target.get(n)]);this.haveReplicationInconsistencies(i,o)&&(await this.target.remove({_id:o._id,_rev:o._rev}),r.push(i._id))}catch{console.warn("Cannot resolve inconsistencies for document",n)}r.length>0&&await this.replicate({doc_ids:r})}haveReplicationInconsistencies(e,r){let n=this.getRevisionNumber(e);return this.getRevisionNumber(r)>n}getRevisionNumber(e){return parseInt(e._rev?.split("-")[0]||"0")}appReplicateOpts(e={}){if(typeof e.filter=="string")return e;let r=e.filter,i=this.direction==="toDev";delete e.filter;let o=e.isCreation,a=e.tablesToSync;delete e.isCreation,delete e.tablesToSync;let u=!1,c;typeof a=="string"&&a==="all"?u=!0:a&&(c=a);let l=s((f,p)=>f?.startsWith(p+b),"startsWithID"),d=s(f=>l(f,"ro")||l(f,"li"),"isData");return{...e,filter:(f,p)=>!o&&f._id==="_design/migrations"||i&&f._id.startsWith("_design")?!1:f._deleted||l(f._id,ys)?!0:d(f._id)?!!c?.find(m=>f._id.includes(m))||u:l(f._id,"log_au")||f._id==="app_metadata"?!1:r?r(f,p):!0}}async rollback(){await this.target.destroy(),this.target=Xe(this.target.name),await this.replicate()}},AT=Of;var OT=F(require("node-fetch"));var qs=cr.removeKeyNumbering;function sn(t){return t==null||t===""}s(sn,"isEmpty");var Vt=class t{static{s(this,"QueryBuilder")}#l;#d;#e;#r;#n;#i;#s;#o;#t;#f;#a;#u=!1;#c;static{this.maxLimit=200}constructor(e,r,n){this.#l=e,this.#d=r,this.#e={allOr:!1,onEmptyFilter:"all",string:{},fuzzy:{},range:{},equal:{},notEqual:{},empty:{},notEmpty:{},oneOf:{},contains:{},notContains:{},containsAny:{},...n},this.#r=50,this.#s="ascending",this.#o="string",this.#t=!0}disableEscaping(){return this.#u=!0,this}setIndexBuilder(e){return this.#a=e,this}setVersion(e){return e!=null&&(this.#f=e),this}setTable(e){return this.#e.equal.tableId=e,this}setLimit(e){return e!=null&&(this.#r=e),this}setSort(e){return e!=null&&(this.#n=e),this}setSortOrder(e){return e!=null&&(this.#s=e),this}setSortType(e){return e!=null&&(this.#o=e),this}setBookmark(e){return e!=null&&(this.#i=e),this}setSkip(e){return this.#c=e,this}excludeDocs(){return this.#t=!1,this}includeDocs(){return this.#t=!0,this}addString(e,r){return this.#e.string[e]=r,this}addFuzzy(e,r){return this.#e.fuzzy[e]=r,this}addRange(e,r,n){return this.#e.range[e]={low:r,high:n},this}addEqual(e,r){return this.#e.equal[e]=r,this}addNotEqual(e,r){return this.#e.notEqual[e]=r,this}addEmpty(e,r){return this.#e.empty[e]=r,this}addNotEmpty(e,r){return this.#e.notEmpty[e]=r,this}addOneOf(e,r){return this.#e.oneOf[e]=r,this}addContains(e,r){return this.#e.contains[e]=r,this}addNotContains(e,r){return this.#e.notContains[e]=r,this}addContainsAny(e,r){return this.#e.containsAny[e]=r,this}setAllOr(){this.#e.allOr=!0}setOnEmptyFilter(e){this.#e.onEmptyFilter=e}handleSpaces(e){return this.#u?e:e.replace(/ /g,"_")}preprocess(e,{escape:r,lowercase:n,wrap:i,type:o}={}){let a=!!this.#f,u=typeof e;return e&&n&&(e=e.toLowerCase?e.toLowerCase():e),!this.#u&&r&&u==="string"&&(e=`${e}`.replace(/[ /#+\-&|!(){}\]^"~*?:\\]/g,"\\$&")),u==="string"&&!isNaN(e)&&!o?e=`"${e}"`:a&&i&&(e=u==="number"?e:`"${e}"`),e}isMultiCondition(){let e=0;for(let r of Object.values(this.#e))typeof r=="object"&&(e+=Object.keys(r).length);return e>1}compressFilters(e){let r={};for(let o of Object.keys(e)){let a=qs(o);r[a]?r[a]=r[a].concat(e[o]):r[a]=e[o]}let n={},i=1;for(let[o,a]of Object.entries(r))n[`${i++}:${o}`]=a;return n}buildSearchQuery(){let e=this,r=this.#e&&this.#e.allOr,n=r?"":"*:*",i=!0,o={escape:!0,lowercase:!0,wrap:!0},a="";this.#e.equal.tableId&&(a=this.#e.equal.tableId,delete this.#e.equal.tableId);let u=s((h,g)=>sn(g)?null:`${h}:${e.preprocess(g,o)}`,"equal"),c=s((h,g,y="AND")=>{if(sn(g))return null;if(!Array.isArray(g))return`${h}:${g}`;let S=`${e.preprocess(g[0],{escape:!0})}`;for(let O=1;O<g.length;O++)S+=` ${y} ${e.preprocess(g[O],{escape:!0})}`;return`${h}:(${S})`},"contains"),l=s((h,g)=>sn(g)?null:(g=e.preprocess(g,{escape:!0,lowercase:!0,type:"fuzzy"}),`${h}:/.*${g}.*/`),"fuzzy"),d=s((h,g)=>{let y=r?"*:* AND ":"",S=r?"AND":void 0;return y+"NOT "+c(h,g,S)},"notContains"),f=s((h,g)=>c(h,g,"OR"),"containsAny"),p=s((h,g)=>{if(sn(g))return"*:*";if(!Array.isArray(g))if(typeof g=="string")g=g.split(",");else return"";let y=`${e.preprocess(g[0],o)}`;for(let S=1;S<g.length;S++)y+=` OR ${e.preprocess(g[S],o)}`;return`${h}:(${y})`},"oneOf");function m(h,g,y){let S="";for(let[O,_]of Object.entries(h)){O=qs(O),O=e.preprocess(e.handleSpaces(O),{escape:!0});let D=g(O,_);if(D!=null){if(S.length>0||n.length>0){let T=y?.mode?y.mode:r?"OR":"AND";S+=` ${T} `}S+=D,(typeof _!="string"&&_!=null||typeof _=="string"&&_!==a&&_!=="")&&(i=!1)}}if(y?.returnBuilt)return S;n+=S}if(s(m,"build"),this.#e.string&&m(this.#e.string,(h,g)=>sn(g)?null:(g=e.preprocess(g,{escape:!0,lowercase:!0,type:"string"}),`${h}:${g}*`)),this.#e.range&&m(this.#e.range,(h,g)=>{if(sn(g)||g.low==null||g.low===""||g.high==null||g.high==="")return null;let y=e.preprocess(g.low,o),S=e.preprocess(g.high,o);return`${h}:[${y} TO ${S}]`}),this.#e.fuzzy&&m(this.#e.fuzzy,l),this.#e.equal&&m(this.#e.equal,u),this.#e.notEqual&&m(this.#e.notEqual,(h,g)=>sn(g)?null:typeof g=="boolean"?`(*:* AND !${h}:${g})`:`!${h}:${e.preprocess(g,o)}`),this.#e.empty&&m(this.#e.empty,h=>(i=!1,`(*:* -${h}:["" TO *])`)),this.#e.notEmpty&&m(this.#e.notEmpty,h=>(i=!1,`${h}:["" TO *]`)),this.#e.oneOf&&m(this.#e.oneOf,p),this.#e.contains&&m(this.#e.contains,c),this.#e.notContains&&m(this.compressFilters(this.#e.notContains),d),this.#e.containsAny&&m(this.#e.containsAny,f),a&&(n=this.isMultiCondition()?`(${n})`:n,r=!1,m({tableId:a},u)),i){if(this.#e.onEmptyFilter==="none")return"";if(this.#e?.allOr)return n.replace("()","(*:*)")}return n}buildSearchBody(){let e={q:this.buildSearchQuery(),limit:Math.min(this.#r,t.maxLimit),include_docs:this.#t};if(this.#i&&(e.bookmark=this.#i),this.#n){let r=this.#s==="descending"?"-":"",n=`<${this.#o}>`;e.sort=`${r}${this.handleSpaces(this.#n)}${n}`}return e}async run(){return this.#c&&await this.#m(this.#c),await this.#p()}async#m(e){let r=this.#t,n=this.#r;this.excludeDocs();let i=e,o=0;do{let a=Math.min(t.maxLimit,i);this.setLimit(a);let{bookmark:u,rows:c}=await this.#p();this.setBookmark(u),o=c.length,i-=c.length}while(i>0&&o>0);this.#t=r,this.#r=n}async#p(){let{url:e,cookie:r}=dt(),n=`${e}/${this.#l}/_design/database/_search/${this.#d}`,i=this.buildSearchBody();try{return await _T(n,i,r)}catch(o){if(o.status===404&&this.#a)return await this.#a(),await _T(n,i,r);throw o}}};async function _T(t,e,r){let n=await(0,OT.default)(t,{body:JSON.stringify(e),method:"POST",headers:{Authorization:r}});if(n.status===404)throw n;let i=await n.json(),o={rows:[],totalRows:0};return i.rows!=null&&i.rows.length>0&&(o.rows=i.rows.map(a=>a.doc)),i.bookmark&&(o.bookmark=i.bookmark),i.total_rows&&(o.totalRows=i.total_rows),o}s(_T,"runQuery");async function IT(t,e,r,n){let i=n.bookmark,o=n.rows||[];if(n.limit&&o.length>=n.limit)return o;let a=Vt.maxLimit;n.limit&&o.length>n.limit-Vt.maxLimit&&(a=n.limit-o.length);let u=new Vt(t,e,r);u.setVersion(n.version).setBookmark(i).setLimit(a).setSort(n.sort).setSortOrder(n.sortOrder).setSortType(n.sortType),n.tableId&&u.setTable(n.tableId);let c=await u.run();if(!c.rows.length)return o;if(c.rows.length<Vt.maxLimit)return[...o,...c.rows];let l={...n,bookmark:c.bookmark,rows:[...o,...c.rows]};return await IT(t,e,r,l)}s(IT,"recursiveSearch");async function kb(t,e,r,n){let i=n.limit;(i==null||isNaN(i)||i<0)&&(i=50),i=Math.min(i,Vt.maxLimit);let o=new Vt(t,e,r);n.version&&o.setVersion(n.version),n.tableId&&o.setTable(n.tableId),n.sort&&o.setSort(n.sort).setSortOrder(n.sortOrder).setSortType(n.sortType),n.indexer&&o.setIndexBuilder(n.indexer),n.disableEscaping&&o.disableEscaping();let a=await o.setBookmark(n.bookmark).setLimit(i).run();o.setBookmark(a.bookmark).setLimit(1),n.tableId&&o.setTable(n.tableId);let u=await o.run();return{...a,hasNextPage:u.rows&&u.rows.length>0}}s(kb,"paginatedSearch");async function Mb(t,e,r,n){let i=n.limit;return(i==null||isNaN(i)||i<0)&&(i=1e3),n.limit=Math.min(i,1e3),{rows:await IT(t,e,r,n)}}s(Mb,"fullSearch");var If={};N(If,{createUserIndex:()=>Fb});async function Fb(){let t=H(),e;try{e=await t.get("_design/database")}catch(n){n.status===404&&(e={_id:"_design/database"})}let r=s(function(n){if(n._id&&!n._id.startsWith("us_"))return;let i=["_id","_rev","password","account","license","budibaseAccess","accountPortalAccess","csrfToken"];function o(a,u){for(let c of Object.keys(a)){if(i.includes(c))continue;let l=u!=null?`${u}.${c}`:c;typeof a[c]=="string"?index(l,a[c].toLowerCase(),{facet:!0}):typeof a[c]!="object"?index(l,a[c],{facet:!0}):o(a[c],l)}}s(o,"idx"),o(n)},"fn");e.indexes={user:{index:r.toString(),analyzer:{default:"keyword",name:"perfield"}}},await t.put(e)}s(Fb,"createUserIndex");function wT(t,e){let r=e.toString();if(typeof t=="object")return t.status===e||t.message?.includes(r);if(typeof t=="number")return t===e;if(typeof t=="string")return t.includes(r)}s(wT,"checkErrorCode");function Bb(t){return wT(t,409)}s(Bb,"isDocumentConflictError");var Qs={};N(Qs,{addTenantToUrl:()=>Wb,getTenantDB:()=>wf,getTenantIDFromCtx:()=>Ks,isUserInAppTenant:()=>$b});function wf(t){return De(Xr(t))}s(wf,"getTenantDB");function Wb(t){let e=G();if(pr()){let r=t.indexOf("?")===-1?"?":"&";t+=`${r}tenantId=${e}`}return t}s(Wb,"addTenantToUrl");var $b=s((t,e)=>{let r;return e?r=e.tenantId||ae:r=G(),(zn(t)||ae)===r},"isUserInAppTenant"),Vb=Object.values(Ii),Ks=s((t,e)=>{if(!pr())return ae;e.allowNoTenant===void 0&&(e.allowNoTenant=!1),e.includeStrategies||(e.includeStrategies=Vb),e.excludeStrategies||(e.excludeStrategies=[]);let r=s(n=>{if(e.excludeStrategies?.includes(n))return!1;if(e.includeStrategies?.includes(n))return!0},"isAllowed");if(r("user")){let n=t.user?.tenantId;if(n)return n}if(r("header")){let n=t.request.headers["x-budibase-tenant-id"];if(n)return n}if(r("query")){let n=t.request.query.tenantId;if(n)return n}if(r("subdomain")){let n;try{n=new URL(Xd()).host.split(":")[0]}catch(o){if(o.code!=="ERR_INVALID_URL")throw o}let i=t.host;if(n&&i.includes(n)){let o=i.substring(0,i.indexOf(`.${n}`));if(o)return o}}if(r("path")){let n=t.matched.find(a=>!!a.paramNames.find(u=>u.name==="tenantId")),i=t.originalUrl,o;if(i.includes("?")?o=i.split("?")[0]:o=i,n){let a=n.params(o,n.captures(o),{});if(a.tenantId)return a.tenantId}}e.allowNoTenant||t.throw(403,"Tenant id not set")},"getTenantIDFromCtx");var Df="app"+b,DT="/app/",Gb="/builder",qb=`${Gb}/workspace/`,Kb="/api/public/v";async function Qb(t){let r=`/${t.path.split("/")[2].toLowerCase()}`,n=G();!E.isDev()&&E.MULTI_TENANCY&&(n=Ks(t,{includeStrategies:["subdomain"]}));let o=(await Re(n,()=>$s({dev:!1}))).filter(a=>a.url&&a.url.toLowerCase()===r)[0];return o&&o.appId?o.appId:void 0}s(Qb,"resolveAppUrl");function jb(t){return t.path.startsWith(`/${Df}`)?!0:t.path.startsWith(DT)}s(jb,"isServingApp");function Yb(t){return t.path.startsWith(qb)}s(Yb,"isServingBuilder");function Hb(t){return RT(t.path)}s(Hb,"isServingBuilderPreview");function RT(t){return new RegExp(/^\/app\/app_\w+\/preview$/).test(t)}s(RT,"isBuilderPreviewUrl");function zb(t){return t.path.startsWith(Kb)}s(zb,"isPublicApiRequest");async function on(t){let e;function r(u){return!u||!u.startsWith(Df)?e:(e&&e!==u&&t.throw("App id conflict",403),e??u)}s(r,"confirmAppId");let n=t.request.headers["x-budibase-app-id"]||[];typeof n=="string"&&(n=[n]);for(let u of n)e=r(u);t.request.body&&t.request.body.appId&&(e=r(t.request.body.appId));let i=Jb(t.path);i&&(e=r(i)),t.query?.appId&&(e=r(t.query?.appId));let o=RT(t.path);return t.path.startsWith(DT)&&!o&&(e=r(await Qb(t))),e}s(on,"getAppIdFromCtx");function Jb(t){if(t)return t.split("?")[0].split("/").find(e=>e.startsWith(Df))}s(Jb,"parseAppIdFromUrlPath");function su(t){if(t)try{return iu.default.verify(t,E.JWT_SECRET)}catch(e){if(E.JWT_SECRET_FALLBACK)return iu.default.verify(t,E.JWT_SECRET_FALLBACK);throw e}}s(su,"openJwt");function js(t){return E.INTERNAL_API_KEY&&E.INTERNAL_API_KEY===t?!0:!!(E.INTERNAL_API_KEY_FALLBACK&&E.INTERNAL_API_KEY_FALLBACK===t)}s(js,"isValidInternalAPIKey");function Gt(t,e){let r=t.cookies.get(e);if(r)return su(r)}s(Gt,"getCookie");function CT(t,e,r="builder",n={sign:!0}){e&&n&&n.sign&&(e=iu.default.sign(e,E.JWT_SECRET));let i={expires:Ma,path:"/",httpOnly:!1,overwrite:!0};E.COOKIE_DOMAIN&&(i.domain=E.COOKIE_DOMAIN),t.cookies.set(r,e,i)}s(CT,"setCookie");function gr(t,e){CT(t,null,e)}s(gr,"clearCookie");function Zb(t){return t.headers["x-budibase-type"]==="client"}s(Zb,"isClient");function Rf(t){return new Promise(e=>setTimeout(e,t))}s(Rf,"timeout");function Cf(t){return!!xm[t]}s(Cf,"isAudited");function Xb(t){if(typeof t!="object")return!1;try{JSON.stringify(t)}catch(e){if(e instanceof Error&&e?.message.includes("circular structure"))return!0}return!1}s(Xb,"hasCircularStructure");function ex(t){return!!t.match(/^.+:\/\/.+$/)}s(ex,"urlHasProtocol");function bf(t){return t&&!!t.match(/^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/)}s(bf,"validEmail");var xf=(o=>(o.MILLISECONDS="milliseconds",o.SECONDS="seconds",o.MINUTES="minutes",o.HOURS="hours",o.DAYS="days",o))(xf||{}),ou={milliseconds:1,seconds:1e3,minutes:6e4,hours:36e5,days:864e5},Ee=class t{constructor(e){this.ms=e}static{s(this,"Duration")}to(e){return this.ms/ou[e]}toMs(){return this.ms}toSeconds(){return this.to("seconds")}static convert(e,r,n){return n*ou[e]/ou[r]}static from(e,r){return new t(r*ou[e])}static fromSeconds(e){return t.from("seconds",e)}static fromMinutes(e){return t.from("minutes",e)}static fromHours(e){return t.from("hours",e)}static fromDays(e){return t.from("days",e)}static fromMilliseconds(e){return t.from("milliseconds",e)}};async function tx(t){let e=performance.now();return[await t(),Ee.fromMilliseconds(performance.now()-e)]}s(tx,"time");var xT=require("undici");function bT(t){let e=process.env.GLOBAL_AGENT_HTTP_PROXY||process.env.HTTP_PROXY,n=process.env.GLOBAL_AGENT_HTTPS_PROXY||process.env.HTTPS_PROXY||e;if(!n||!n.trim())return!1;let i=n.trim();try{new URL(i)}catch{return console.log("[fetch] Invalid proxy URL format:",n),!1}let o=t?.rejectUnauthorized!==void 0?t?.rejectUnauthorized:!0;console.log("[fetch] Creating ProxyAgent",{proxyUrl:i,rejectUnauthorized:o});let a={uri:i,requestTls:{rejectUnauthorized:o}};i.startsWith("https://")&&(a.proxyTls={rejectUnauthorized:o});try{return new xT.ProxyAgent(a)}catch(u){return console.log("[fetch] Failed to create ProxyAgent:",u),!1}}s(bT,"createProxyDispatcher");var au=null;function rx(t){return t?bT(t)||!1:(au===null&&(au=bT()),au||!1)}s(rx,"getProxyDispatcher");function nx(){au=null}s(nx,"resetProxyDispatcherCache");function ix(t){let e="",r=-1,n,i,o=t.opts?.repeat;return o&&(i=o.endDate?new Date(o.endDate).getTime():Date.now(),n=o.tz,"cron"in o?e=o.cron:r=o.every),{id:t.id.toString(),name:"",key:t.id.toString(),tz:n,endDate:i,cron:e,every:r,next:0}}s(ix,"jobToJobInformation");var uu=class{static{s(this,"InMemoryQueue")}constructor(e,r){this._name=e,this._opts=r,this._messages=[],this._emitter=new vT.default.EventEmitter,this._runCount=0,this._addCount=0,this._queuedJobIds=new Set,this._attempts=r?.defaultJobOptions?.attempts||1}async process(e,r){r=typeof e=="number"?r:e,this._emitter.on("message",async n=>{if(!n.manualTrigger&&n.opts?.repeat!=null)return;function i(){return r.length===1?r(n):new Promise((c,l)=>{r(n,s((f,p)=>{f?l(f):c(p)},"done"))})}s(i,"execute");let o=this._attempts;async function a(c,l=0){try{return await c}catch(d){if(l++,l<o&&!n._isDiscarded)return await Ne.wait(100*l),await a(i(),l);throw d}}s(a,"retryFunc");try{let c=await a(i());this._emitter.emit("completed",n,c);let l=this._messages.indexOf(n);if(l===-1)throw"Failed deleting a processed message";this._messages.splice(l,1)}catch(c){console.error(c),this._emitter.emit("error",n,c)}this._runCount++;let u=n.opts?.jobId?.toString();u&&n.opts?.removeOnComplete&&this._queuedJobIds.delete(u)})}async isReady(){return this}async add(e,r){if(typeof e=="string")throw new Error("doesn't support named jobs");let n=r,i=n?.jobId?.toString();if(i&&this._queuedJobIds.has(i)){console.log(`Ignoring already queued job ${i}`);return}if(typeof e!="object")throw"Queue only supports carrying JSON.";i&&this._queuedJobIds.add(i);let o=ne(),a=s(()=>{let c={id:o,timestamp:Date.now(),queue:this,data:e,opts:n,discard:async()=>{c._isDiscarded=!0}};this._messages.push(c),this._messages.length>1e3&&this._messages.shift(),this._addCount++,this._emitter.emit("message",c)},"pushMessage"),u=n?.delay;return u?setTimeout(a,u):a(),{id:i,finished:()=>new Promise((c,l)=>{let d=s((p,m)=>{p.id===o&&(this._emitter.off("error",d),this._emitter.off("completed",f),l(m))},"errorHandler"),f=s((p,m)=>{p.id===o&&(this._emitter.off("error",d),this._emitter.off("completed",f),c(m))},"completedHandler");this._emitter.on("error",d),this._emitter.on("completed",f)})}}async close(){}async removeRepeatableByKey(e){for(let[r,n]of this._messages.entries())if(n.id===e){this._messages.splice(r,1),this._emitter.emit("removed",n);return}}async removeJobs(e){}async clean(){return[]}async getJob(e){for(let r of this._messages)if(r.id===e)return r;return null}manualTrigger(e){for(let r of this._messages)if(r.id===e){this._emitter.emit("message",{...r,manualTrigger:!0});return}throw new Error(`Job with id ${e} not found`)}on(e,r){return this._emitter.on(e,r),this}off(e,r){return this._emitter.off(e,r),this}async count(){return this._messages.length}async getCompletedCount(){return this._runCount}async getRepeatableJobs(){return this._messages.filter(e=>e.opts?.repeat!=null).map(e=>ix(e))}async whenCurrentJobsFinished(){do await Rf(50);while(this.hasRunningJobs())}hasRunningJobs(){return this._addCount>this._runCount}},PT=uu;var Nf=F(require("bull"));var ti=(c=>(c.AUTOMATION="automationQueue",c.APP_BACKUP="appBackupQueue",c.AUDIT_LOG="auditLogQueue",c.SYSTEM_EVENT_QUEUE="systemEventQueue",c.APP_MIGRATION="appMigration",c.DOC_WRITETHROUGH_QUEUE="docWritethroughQueue",c.DEV_REVERT_PROCESSOR="devRevertProcessorQueue",c.BATCH_USER_SYNC_PROCESSOR="batchUserSyncProcessorQueue",c))(ti||{});function NT(t,e,r){ax(t,e),r&&sx(t,r)}s(NT,"addListeners");function sx(t,e){t.on("stalled",async r=>{if(e)await e(r);else if(r.opts.repeat){let n=r.id,i=await t.getRepeatableJobs();for(let o of i)o.id===n&&await t.removeRepeatableByKey(o.key);console.log(`jobId=${n} disabled`)}})}s(sx,"handleStalled");function et(t,e,r={},n={}){let i=`[BULL] ${t}=${e}`,o=r.error,a={_logKey:"bull",eventType:t,event:e,job:r.job,jobId:r.jobId||r.job?.id,...n},u;return r.job?.data?.automation&&(u={_logKey:"automation",trigger:r.job?r.job.data.automation.definition.trigger.event:void 0}),[i,o,a,u]}s(et,"getLogParams");var ox={automationQueue:"automation-event",appBackupQueue:"app-backup-event",auditLogQueue:"audit-log-event",systemEventQueue:"system-event",appMigration:"app-migration",docWritethroughQueue:"doc-writethrough",devRevertProcessorQueue:"dev-revert-event",batchUserSyncProcessorQueue:"batch-user-sync-processor"};function ax(t,e){let r=ox[e];function n(i,o){let a=i.data.event?.appId;if(a)return ef(a,o);o()}s(n,"doInJobContext"),t.on("stalled",async i=>{await n(i,()=>{console.error(...et(r,"stalled",{job:i}))})}).on("error",i=>{console.error(...et(r,"error",{error:i}))}),process.env.NODE_DEBUG?.includes("bull")&&t.on("waiting",i=>{console.info(...et(r,"waiting",{jobId:i}))}).on("active",async i=>{await n(i,()=>{console.info(...et(r,"active",{job:i}))})}).on("progress",async(i,o)=>{await n(i,()=>{console.info(...et(r,"progress",{job:i},{progress:o}))})}).on("completed",async(i,o)=>{await n(i,()=>{console.info(...et(r,"completed",{job:i},{result:o}))})}).on("failed",async(i,o)=>{await n(i,()=>{console.error(...et(r,"failed",{job:i,error:o}))})}).on("paused",()=>{console.info(...et(r,"paused"))}).on("resumed",()=>{console.info(...et(r,"resumed"))}).on("cleaned",(i,o)=>{console.info(...et(r,"cleaned",{},{length:i.length,type:o}))}).on("drained",()=>{console.info(...et(r,"drained"))}).on("removed",i=>{console.info(...et(r,"removed",{job:i}))})}s(ax,"logging");var cu={};N(cu,{cleanup:()=>ux,clear:()=>Pf,set:()=>vf});var Ys=[];function vf(t,e){let r=setInterval(t,e);return Ys.push(r),r}s(vf,"set");function Pf(t){let e=Ys.indexOf(t);e!==-1&&Ys.splice(e,1),clearInterval(t)}s(Pf,"clear");function ux(){for(let t of Ys)clearInterval(t);Ys=[]}s(ux,"cleanup");var qt=F(require("dd-trace")),Hs=F(require("object-sizeof"));var cx=Ee.fromMinutes(5).toMs(),lx=Ee.fromSeconds(30).toMs(),Uf=Ee.fromSeconds(60).toMs(),zs=[],lu;async function UT(){for(let t of zs)await t.clean(Uf,"completed"),await t.clean(Uf,"failed")}s(UT,"cleanup");async function dx(t,e,r){let n=performance.now();try{let i=await e();return qt.default.dogstatsd.increment(`${t}.success`,1,r),i}catch(i){throw qt.default.dogstatsd.increment(`${t}.error`,1,r),i}finally{let i=performance.now()-n;qt.default.dogstatsd.distribution(`${t}.duration.ms`,i,r),qt.default.dogstatsd.increment(t,1,r)}}s(dx,"withMetrics");function LT(t){return{"job.opts.attempts":t.attempts,"job.opts.backoff":t.backoff,"job.opts.delay":t.delay,"job.opts.jobId":t.jobId,"job.opts.lifo":t.lifo,"job.opts.preventParsingData":t.preventParsingData,"job.opts.priority":t.priority,"job.opts.removeOnComplete":t.removeOnComplete,"job.opts.removeOnFail":t.removeOnFail,"job.opts.repeat":t.repeat,"job.opts.stackTraceLimit":t.stackTraceLimit,"job.opts.timeout":t.timeout}}s(LT,"jobOptsTags");function fx(t){return{"job.id":t.id,"job.attemptsMade":t.attemptsMade,"job.timestamp":t.timestamp,"job.data.sizeBytes":(0,Hs.default)(t.data),...LT(t.opts||{})}}s(fx,"jobTags");var ht=class{static{s(this,"BudibaseQueue")}constructor(e,r={}){this.opts=r,this.jobQueue=e,this.queue=this.initQueue()}get name(){return this.queue.name}initQueue(){let r={redis:Jr(),settings:{maxStalledCount:this.opts.maxStalledCount?this.opts.maxStalledCount:0,lockDuration:cx,lockRenewTime:lx}};this.opts.jobOptions&&(r.defaultJobOptions=this.opts.jobOptions);let n;return E.isTest()?process.env.BULL_TEST_REDIS_PORT&&!isNaN(+process.env.BULL_TEST_REDIS_PORT)?n=new Nf.default(this.jobQueue,{...r,redis:{host:"localhost",port:+process.env.BULL_TEST_REDIS_PORT}}):n=new PT(this.jobQueue,r):n=new Nf.default(this.jobQueue,r),NT(n,this.jobQueue,this.opts.removeStalledCb),zs.push(n),!lu&&!E.isTest()&&(lu=vf(UT,Uf),UT().catch(i=>{console.error(`Unable to cleanup ${this.jobQueue} initially - ${i}`)})),n}getBullQueue(){return this.queue}process(...e){let r,n;e.length===2?(r=e[0],n=e[1]):n=e[0];let i=s(async(a,u)=>{await qt.default.trace("queue.process",async c=>{if(a.data._parentSpanContext){let l=a.data._parentSpanContext,d={traceId:l.traceId,spanId:l.spanId,toTraceId:()=>l.traceId,toSpanId:()=>l.spanId,toTraceparent:()=>""};c.addLink(d)}c.addTags({"queue.name":this.jobQueue,...fx(a)}),this.opts.jobTags&&c.addTags(this.opts.jobTags(a.data)),qt.default.dogstatsd.distribution("queue.process.sizeBytes",(0,Hs.default)(a.data),this.metricTags()),await this.withMetrics("queue.process",()=>u?n(a,u):n(a))})},"processCallback"),o;return n.length===1?o=s(a=>i(a),"wrappedCb"):o=i,r?this.queue.process(r,o):this.queue.process(o)}async add(e,r){return await qt.default.trace("queue.add",async n=>(n.addTags({"queue.name":this.jobQueue,"job.data.sizeBytes":(0,Hs.default)(e),...LT(r||{})}),this.opts.jobTags&&n.addTags(this.opts.jobTags(e)),e._parentSpanContext={traceId:n.context().toTraceId(),spanId:n.context().toSpanId()},qt.default.dogstatsd.distribution("queue.add.sizeBytes",(0,Hs.default)(e),this.metricTags()),await this.withMetrics("queue.add",()=>this.queue.add(e,r))))}withMetrics(e,r){return dx(e,r,this.metricTags())}metricTags(){return{queueName:this.jobQueue}}close(e){return this.queue.close(e)}whenCurrentJobsFinished(){return this.queue.whenCurrentJobsFinished()}};async function px(){lu&&Pf(lu),console.log("Waiting for current queue jobs to finish...");for(let t of zs)await t.whenCurrentJobsFinished();console.log("Closing queue Redis connections...");for(let t of zs)await t.close();zs=[],console.log("Queues shutdown")}s(px,"shutdown");var no={};N(no,{correlation:()=>Js,logAlert:()=>cn,logAlertWithInfo:()=>iv,logWarn:()=>si,logger:()=>Iu,system:()=>Zf});var Js={};N(Js,{getId:()=>Lf,setHeader:()=>mx});var kT=require("correlation-id"),mx=s(t=>{let e=kT.getId();e&&(t["x-budibase-correlation-id"]=e)},"setHeader");function Lf(){return kT.getId()}s(Lf,"getId");var Ou=F(require("pino")),hS=F(require("pino-pretty")),Xf=F(require("dd-trace")),ES=require("dd-trace/ext");var Zf={};N(Zf,{getLogReadStream:()=>Zx,getSingleFileMaxSizeInfo:()=>mS,localFileDestination:()=>Jf});var ro=F(require("fs")),zf=F(require("path")),lS=F(require("rotating-file-stream"));var Hf={};N(Hf,{ObjectStore:()=>tt,ObjectStoreBuckets:()=>Ex,SIGNED_FILE_PREFIX:()=>Vf,bucketTTLConfig:()=>du,budibaseTempDir:()=>an,client3rdPartyLibrary:()=>Kx,clientLibraryPath:()=>qx,clientLibraryUrl:()=>Qx,createBucketIfNotExists:()=>to,deleteFile:()=>Cx,deleteFiles:()=>bx,deleteFolder:()=>jT,downloadTarball:()=>vx,downloadTarballDirect:()=>xx,enrichPWAImages:()=>jx,enrichPluginURLs:()=>Hx,extractBucketAndPath:()=>kf,getAllFiles:()=>wx,getAppFileUrl:()=>rS,getClientCacheKey:()=>tS,getGlobalFileS3Key:()=>nS,getGlobalFileUrl:()=>Yx,getObjectMetadata:()=>Px,getPluginIconKey:()=>oS,getPluginJSKey:()=>sS,getPluginS3Dir:()=>uS,getPresignedUrl:()=>un,getReadStream:()=>fu,listAllObjects:()=>Gf,objectExists:()=>Kf,processAutomationAttachment:()=>yx,processObjectStoreAttachment:()=>$T,retrieve:()=>QT,retrieveDirectory:()=>Rx,retrieveToTmp:()=>Dx,sanitizeBucket:()=>be,sanitizeKey:()=>pe,streamUpload:()=>KT,streamUploadMany:()=>Ix,upload:()=>Ox,uploadDirectory:()=>qf});var mu=require("@aws-sdk/client-s3"),Mf=require("@aws-sdk/lib-storage"),VT=require("@aws-sdk/s3-request-presigner");var Kt=F(require("dd-trace")),ri=F(require("fs")),Xs=F(require("fs/promises")),Ff=F(require("node-fetch")),Tr=require("path"),hu=F(require("stream")),eo=require("stream/promises"),Bf=F(require("tar-fs")),Wf=require("uuid"),$f=F(require("zlib"));var MT=F(require("fs")),FT=require("os"),Zs=F(require("path")),BT=F(require("stream"));var Ex={BACKUPS:E.BACKUPS_BUCKET_NAME,APPS:E.APPS_BUCKET_NAME,TEMPLATES:E.TEMPLATES_BUCKET_NAME,GLOBAL:E.GLOBAL_BUCKET_NAME,PLUGINS:E.PLUGIN_BUCKET_NAME,TEMP:E.TEMP_BUCKET_NAME},WT=(0,Zs.join)((0,FT.tmpdir)(),".budibase");try{MT.default.mkdirSync(WT)}catch(t){if(t.code!=="EEXIST")throw t}function an(){return WT}s(an,"budibaseTempDir");var du=s((t,e)=>{let n={Rules:[{ID:`${t}-ExpireAfter${e}days`,Prefix:"",Status:"Enabled",Expiration:{Days:e}}]};return{Bucket:t,LifecycleConfiguration:n}},"bucketTTLConfig");async function gx(t){let e=await fetch(t.url);if(!e.ok||!e.body)throw new Error(`Unexpected response ${e.statusText}`);let r=Zs.default.basename(new URL(t.url).pathname);if(!e.body)throw new Error("No response received for attachment");return{filename:t.filename||r,content:BT.default.Readable.fromWeb(e.body)}}s(gx,"processUrlAttachment");async function $T(t){let e=kf(t.url);if(e===null)throw new Error("Invalid signed URL");let{bucket:r,path:n}=e,{stream:i}=await fu(r,n),o=Zs.default.basename(n);return{bucket:r,path:n,filename:t.filename||o,content:i}}s($T,"processObjectStoreAttachment");async function yx(t){return t.url?.startsWith("http://")||t.url?.startsWith("https://")?await gx(t):await $T(t)}s(yx,"processAutomationAttachment");var Tx=require("sanitize-s3-objectkey"),Sx={bucketCreationPromises:{}},Vf="/files/signed",yr={txt:"text/plain",html:"text/html",css:"text/css",js:"application/javascript",json:"application/json",gz:"application/gzip",svg:"image/svg+xml",form:"multipart/form-data"},Ax=[yr.html,yr.css,yr.js,yr.json];function pe(t){return Tx(be(t)).replace(/\\/g,"/")}s(pe,"sanitizeKey");function be(t){return t.replace(new RegExp(Ze,"g"),Je)}s(be,"sanitizeBucket");function tt(t={presigning:!1}){let e={forcePathStyle:!0,credentials:{accessKeyId:E.MINIO_ACCESS_KEY,secretAccessKey:E.MINIO_SECRET_KEY},region:E.AWS_REGION};return!E.MINIO_ENABLED&&E.AWS_SESSION_TOKEN&&(e.credentials={accessKeyId:E.MINIO_ACCESS_KEY,secretAccessKey:E.MINIO_SECRET_KEY,sessionToken:E.AWS_SESSION_TOKEN}),E.MINIO_URL&&(t.presigning&&E.MINIO_ENABLED?e.endpoint="http://minio-service":e.endpoint=E.MINIO_URL),new mu.S3(e)}s(tt,"ObjectStore");async function to(t,e){e=be(e);try{return await t.headBucket({Bucket:e}),{created:!1,exists:!0}}catch(r){let n=r.statusCode||r.$response?.statusCode,i=Sx.bucketCreationPromises,o=n===404,a=n===403;if(i[e])return await i[e],{created:!1,exists:!0};if(o||a){if(o)return i[e]=t.createBucket({Bucket:e}).catch(u=>{if(u.Code!=="BucketAlreadyOwnedByYou")throw u}),await i[e],delete i[e],{created:!0,exists:!1};throw new Error("Access denied to object store bucket."+r)}else throw new Error("Unable to write to object store bucket.")}}s(to,"createBucketIfNotExists");var _x=s((t,e)=>{if(e)return e;let r=t.split(".").pop();return r?yr[r.toLowerCase()]:yr.txt},"resolveContentType"),GT=s(async(t,e,r)=>{let n=be(t),i=tt(),o=await to(i,n);if(r.addTags({bucketCreated:o.created,bucketExists:o.exists}),e&&o.created){let a=du(n,e);await i.putBucketLifecycleConfiguration(a)}return{bucket:n,client:i,bucketCreated:o}},"initialiseBucket"),qT=s(async({client:t,bucket:e,filename:r,stream:n,type:i,extra:o})=>{if(!n)throw new Error("Stream to upload is invalid/undefined");let a=_x(r,i),u=pe(r),c={Bucket:e,Key:u,Body:n,ContentType:a,...o??{}};return{details:await new Mf.Upload({client:t,params:c}).done(),contentType:a}},"streamUploadInternal");async function Ox({bucket:t,filename:e,path:r,type:n,metadata:i,body:o,ttl:a}){let u=e.split(".").pop(),c=r?(await Xs.default.open(r)).createReadStream():o,l=tt(),d=await to(l,t);if(a&&d.created){let g=du(t,a);await l.putBucketLifecycleConfiguration(g)}let f=n,p=f||(u?yr[u.toLowerCase()]:yr.txt),m={Bucket:be(t),Key:pe(e),Body:c,ContentType:p};if(i&&typeof i=="object"){for(let g of Object.keys(i))(!i[g]||typeof i[g]!="string")&&delete i[g];m.Metadata=i}return new Mf.Upload({client:l,params:m}).done()}s(Ox,"upload");async function KT({bucket:t,stream:e,filename:r,type:n,extra:i,ttl:o}){return await Kt.default.trace("streamUpload",async a=>{a.addTags({bucketName:t,filename:r,type:n,ttl:o});let u=r.split(".").pop();a.addTags({extension:u});let{bucket:c,client:l}=await GT(t,o,a),{details:d,contentType:f}=await qT({client:l,bucket:c,filename:r,stream:e,type:n,extra:i}),p=await l.headObject({Bucket:c,Key:pe(r)});return a.addTags({contentType:f,contentLength:p.ContentLength}),{...d,ContentLength:p.ContentLength}})}s(KT,"streamUpload");async function Ix({bucket:t,files:e,ttl:r}){return await Kt.default.trace("streamUploadMany",async i=>{if(i.addTags({bucketName:t,ttl:r,fileCount:e.length}),!e.length)return[];let{bucket:o,client:a}=await GT(t,r,i),u=e.map((l,d)=>({...l,index:d})),c=new Array(e.length);return await St.parallelForeach(u,async l=>{let{details:d}=await qT({client:a,bucket:o,filename:l.filename,stream:l.stream,type:l.type,extra:l.extra});c[l.index]=d},10),c})}s(Ix,"streamUploadMany");async function QT(t,e){return await Kt.default.trace("retrieve",async r=>{r.addTags({bucketName:t,filepath:e});let n=tt(),i={Bucket:be(t),Key:pe(e)},o=await n.getObject(i);if(!o.Body)throw new Error("Unable to retrieve object");if(r.addTags({contentLength:o.ContentLength,contentType:o.ContentType}),Ax.includes(o.ContentType))return r.addTags({string:!0}),o.Body.transformToString();{r.addTags({string:!1});let a=o.Body.transformToWebStream();return hu.default.Readable.fromWeb(a)}})}s(QT,"retrieve");async function*Gf(t,e){let r=tt(),n=s((a={})=>r.listObjectsV2({...a,Bucket:be(t),Prefix:pe(e)}),"list"),i=!1,o;do{let a={};o&&(a.ContinuationToken=o);let u=await n(a);if(u.Contents)for(let c of u.Contents)yield c;i=!!u.IsTruncated,o=u.NextContinuationToken}while(i&&o)}s(Gf,"listAllObjects");async function wx(t,e){let r={};return await St.parallelForeach(Gf(t,e),async n=>{if(!n.Key)throw new Error("file.Key must be defined");r[n.Key]=n},5),r}s(wx,"getAllFiles");async function un(t,e,r=3600){let n=tt({presigning:!0}),i={Bucket:be(t),Key:pe(e)},o=await(0,VT.getSignedUrl)(n,new mu.GetObjectCommand(i),{expiresIn:r});if(E.MINIO_ENABLED){let a=new URL(o),u=a.pathname,c=a.search;return`${Vf}${u}${c}`}else return o}s(un,"getPresignedUrl");async function Dx(t,e){return await Kt.default.trace("retrieveToTmp",async r=>{r.addTags({bucketName:t,filepath:e}),t=be(t),e=pe(e);let n=await QT(t,e),i=(0,Tr.join)(an(),(0,Wf.v4)());return r.addTags({outputPath:i}),n instanceof hu.default.Readable?(r.addTags({stream:!0}),await(0,eo.pipeline)(n,ri.default.createWriteStream(i))):(r.addTags({stream:!1}),ri.default.writeFileSync(i,n)),i})}s(Dx,"retrieveToTmp");async function Rx(t,e,r){return await Kt.default.trace("retrieveDirectory",async n=>{n.addTags({bucketName:t,path:e});let i=(0,Tr.join)(an(),(0,Wf.v4)());await Xs.default.mkdir(i,{recursive:!0});let o=0;return await St.parallelForeach(Gf(t,e),async a=>{let{Key:u}=a;!u||r?.some(c=>c.test(u))||(o++,await Kt.default.trace("retrieveDirectory.object",async c=>{let l=a.Key;c.addTags({filename:l});let{stream:d}=await fu(t,l),f=l.split("/"),p=f.slice(0,f.length-1),m=(0,Tr.join)(i,...p);f.length>1&&!ri.default.existsSync(m)&&await Xs.default.mkdir(m,{recursive:!0}),await(0,eo.pipeline)(d,ri.default.createWriteStream((0,Tr.join)(i,...f),{mode:420}))}))},5),n.addTags({numObjects:o}),i})}s(Rx,"retrieveDirectory");async function Cx(t,e){let r=tt();await to(r,t);let n={Bucket:t,Key:pe(e)};return r.deleteObject(n)}s(Cx,"deleteFile");async function bx(t,e){let r=tt();await to(r,t);let n={Bucket:t,Delete:{Objects:e.map(i=>({Key:pe(i)}))}};return r.deleteObjects(n)}s(bx,"deleteFiles");async function jT(t,e){t=be(t),e=pe(e);let r=tt(),n={Bucket:t,Prefix:e},i=await r.listObjects(n);if(i.Contents?.length===0)return;let o={Bucket:t,Delete:{Objects:[]}};if(i.Contents?.forEach(a=>{o.Delete.Objects.push({Key:a.Key})}),o.Delete.Objects.length&&(await r.deleteObjects(o)).Deleted?.length===1e3)return jT(t,e)}s(jT,"deleteFolder");async function qf(t,e,r){return await Kt.default.trace("uploadDirectory",async n=>{n.addTags({bucketName:t,localPath:e,bucketPath:r}),t=be(t);let i=await Xs.default.readdir(e,{withFileTypes:!0});n.addTags({numFiles:i.length});for(let o of i){let a=pe((0,Tr.join)(r,o.name)),u=(0,Tr.join)(e,o.name);o.isDirectory()?await qf(t,u,a):await KT({bucket:t,filename:a,stream:ri.default.createReadStream(u)})}return i})}s(qf,"uploadDirectory");async function xx(t,e,r={}){e=pe(e);let n=await(0,Ff.default)(t,{headers:r});if(!n.ok)throw new Error(`unexpected response ${n.statusText}`);await(0,eo.pipeline)(n.body,$f.default.createUnzip(),Bf.default.extract(e))}s(xx,"downloadTarballDirect");async function vx(t,e,r){e=be(e),r=pe(r);let n=await(0,Ff.default)(t);if(!n.ok)throw new Error(`unexpected response ${n.statusText}`);let i=(0,Tr.join)(an(),r);return await(0,eo.pipeline)(n.body,$f.default.createUnzip(),Bf.default.extract(i)),!E.isTest()&&E.SELF_HOSTED&&await qf(e,i,r),i}s(vx,"downloadTarball");async function fu(t,e){return await Kt.default.trace("getReadStream",async r=>{t=be(t),e=pe(e),r.addTags({bucketName:t,path:e});let n=tt(),i={Bucket:t,Key:e},o=await n.getObject(i);if(!o.Body||!(o.Body instanceof hu.default.Readable))throw new Error("Unable to retrieve stream - invalid response");return r.addTags({contentLength:o.ContentLength,contentType:o.ContentType}),{stream:o.Body,contentLength:o.ContentLength,contentType:o.ContentType}})}s(fu,"getReadStream");async function Px(t,e){t=be(t),e=pe(e);let r=tt(),n={Bucket:t,Key:e};try{return await r.headObject(n)}catch{throw new Error("Unable to retrieve metadata from object")}}s(Px,"getObjectMetadata");async function Kf(t,e){t=be(t),e=pe(e);let r=tt(),n={Bucket:t,Key:e};try{return await r.headObject(n),!0}catch(i){if((i.statusCode||i.$response?.statusCode)===404)return!1;throw i}}s(Kf,"objectExists");function kf(t){let e=t.split("?")[0],r=new RegExp(`^${Vf}/(?<bucket>[^/]+)/(?<path>.+)$`),n=e.match(r);if(n&&n.groups){let{bucket:i,path:o}=n.groups;return{bucket:i,path:o}}return null}s(kf,"extractBucketAndPath");var eS=F(require("querystring"));var Au={};N(Au,{FlagSet:()=>gu,all:()=>Mx,flags:()=>Qf,getEnvFlags:()=>JT,init:()=>Ux,isEnabled:()=>Su,parseEnvFlags:()=>Tu,shutdown:()=>Lx,testutils:()=>jf});var yu=F(require("crypto")),YT=F(require("dd-trace")),HT=require("lodash"),zT=require("posthog-node");var Eu;function Ux(t){E.POSTHOG_TOKEN&&E.POSTHOG_API_HOST&&!E.SELF_HOSTED&&E.POSTHOG_FEATURE_FLAGS_ENABLED?(console.log("initializing posthog client..."),Eu=new zT.PostHog(E.POSTHOG_TOKEN,{host:E.POSTHOG_API_HOST,personalApiKey:E.POSTHOG_PERSONAL_TOKEN,featureFlagsPollingInterval:Ee.fromMinutes(3).toMs(),...t})):console.log("posthog disabled")}s(Ux,"init");function Lx(){Eu?.shutdown()}s(Lx,"shutdown");function Tu(t){let e=t.split(",").map(n=>n.split(":")),r=[];for(let[n,...i]of e)for(let o of i){let a=!0;o.startsWith("!")&&(o=o.slice(1),a=!1),r.push({tenantId:n,key:o,value:a})}return r}s(Tu,"parseEnvFlags");function JT(){return Tu(E.TENANT_FEATURE_FLAGS||"")}s(JT,"getEnvFlags");var gu=class{constructor(e){this.flagSchema=e;this.setId=yu.randomUUID()}static{s(this,"FlagSet")}defaults(){return(0,HT.cloneDeep)(this.flagSchema)}isFlagName(e){return this.flagSchema[e]!==void 0}async isEnabled(e){return(await this.fetch())[e]}async fetch(){return await YT.default.trace("features.fetch",async e=>{let r=sf(this.setId);if(r)return e?.addTags({fromCache:!0}),r;let n={},i=this.defaults(),o=G(),a=new Set;if(za())return i;for(let{tenantId:f,key:p,value:m}of JT())if(!(!f||f!=="*"&&f!==o)&&(n.readFromEnvironmentVars=!0,m===!1&&a.add(p),!!this.isFlagName(p))){if(typeof i[p]!="boolean")throw new Error(`Feature: ${p} is not a boolean`);i[p]=m,n[`flags.${p}.source`]="environment"}let u=Ft(),c=u?._id;if(!c){let f=rf();f&&(c=yu.createHash("sha512").update(f).digest("hex"))}let l=u?.tenantId;if(l||(l=o),n["identity.type"]=u?.type,n["identity._id"]=u?._id,n.tenantId=l,n.userId=c,Eu&&c){n.readFromPostHog=!0;let f=await ni(),p={tenantId:l},m={tenant:{id:l}};f.config.createdVersion&&(m.tenant.createdVersion=f.config.createdVersion),f.createdAt&&(m.tenant.createdAt=`${f.createdAt}`);let h=await Eu.getAllFlags(c,{personProperties:p,onlyEvaluateLocally:!0,groups:{tenant:l},groupProperties:m});for(let[g,y]of Object.entries(h))if(this.isFlagName(g)){if(typeof y!="boolean"){console.warn(`Invalid value for posthog flag "${g}": ${y}`);continue}if(!(i[g]===!0||a.has(g)))try{i[g]=y,n[`flags.${g}.source`]="posthog"}catch(S){console.warn(`Error parsing posthog flag "${g}": ${y}`,S)}}}let d=af();for(let[f,p]of Object.entries(d))this.isFlagName(f)&&typeof p=="boolean"&&(i[f]=p,n[`flags.${f}.source`]="override");of(this.setId,i);for(let[f,p]of Object.entries(i))n[`flags.${f}.value`]=p;return e?.addTags(n),i})}},kx={USE_ZOD_VALIDATOR:!1,AI_AGENTS:!1,ESM_CLIENT:!1,DEBUG_UI:E.isDev(),DEV_USE_CLIENT_FROM_STORAGE:!1,DUPLICATE_APP:!1,COPY_RESOURCES_BETWEEN_WORKSPACES:!1},Qf=new gu(kx);async function Su(t){return await Qf.isEnabled(t)}s(Su,"isEnabled");async function Mx(){return await Qf.fetch()}s(Mx,"all");var jf={};N(jf,{setFeatureFlags:()=>ZT,withFeatureFlags:()=>Wx});function Fx(){let t={};for(let{tenantId:e,key:r,value:n}of Tu(process.env.TENANT_FEATURE_FLAGS||"")){let i=t[e]||{};i[r]!==!1&&(i[r]=n,t[e]=i)}return t}s(Fx,"getCurrentFlags");function Bx(t){let e=[];for(let[r,n]of Object.entries(t))for(let[i,o]of Object.entries(n))o===!1?e.push(`${r}:!${i}`):e.push(`${r}:${i}`);return e.join(",")}s(Bx,"buildFlagString");function ZT(t,e){let r=Fx();for(let[i,o]of Object.entries(e)){let a=r[t]||{};a[i]=o,r[t]=a}let n=Bx(r);return As({TENANT_FEATURE_FLAGS:n})}s(ZT,"setFeatureFlags");function Wx(t,e,r){let n=ZT(t,e),i=r();return i instanceof Promise?i.finally(n):(n(),i)}s(Wx,"withFeatureFlags");var XT=F(require("aws-cloudfront-sign"));var _u;function $x(){if(!E.CLOUDFRONT_PRIVATE_KEY_64)throw new Error("CLOUDFRONT_PRIVATE_KEY_64 is not set");return _u||(_u=Buffer.from(E.CLOUDFRONT_PRIVATE_KEY_64,"base64").toString("utf-8"),_u)}s($x,"getPrivateKey");var Vx=s(()=>({keypairId:E.CLOUDFRONT_PUBLIC_KEY_ID,privateKeyString:$x(),expireTime:new Date().getTime()+1e3*60*60*24}),"getCloudfrontSignParams"),ii=s(t=>{let e=Gx(t);return XT.getSignedUrl(e,Vx())},"getPresignedUrl"),Gx=s(t=>{let e="/";return t.startsWith("/")&&(e=""),`${E.CLOUDFRONT_CDN}${e}${t}`},"getUrl");async function qx(t){let e=`${pe(t)}/budibase-client.js`,r=`${pe(t)}/budibase-client.esm.js`;return await Su("ESM_CLIENT")&&await Kf(E.APPS_BUCKET_NAME,r)?r:e}s(qx,"clientLibraryPath");function Kx(t,e){return`${pe(t)}/${e}`}s(Kx,"client3rdPartyLibrary");async function Qx(t,e){return`/api/assets/${t}/client?${await tS(e)}`}s(Qx,"clientLibraryUrl");async function tS(t){let e,r;try{e=G()}finally{r={version:t}}return e&&e!==ae&&(r.tenantId=e),r.dynamic=await Su("ESM_CLIENT"),eS.default.encode(r)}s(tS,"getClientCacheKey");async function rS(t){return E.CLOUDFRONT_CDN?ii(t):await un(E.APPS_BUCKET_NAME,t)}s(rS,"getAppFileUrl");async function jx(t){if(t.length===0)return[];try{return await Promise.all(t.map(async e=>({...e,src:await rS(e.src),type:e.type||"image/png"})))}catch(e){return console.error("Error enriching PWA images:",e),t}}s(jx,"enrichPWAImages");var Yx=s(async(t,e,r)=>{let n=nS(t,e);return E.CLOUDFRONT_CDN?(r&&(n=`${n}?etag=${r}`),ii(n)):await un(E.GLOBAL_BUCKET_NAME,n)},"getGlobalFileUrl"),nS=s((t,e)=>{let r=`${t}/${e}`;return E.MULTI_TENANCY&&(r=`${G()}/${r}`),r},"getGlobalFileS3Key");async function Hx(t){return!t||!t.length?[]:await Promise.all(t.map(async e=>{let r=await zx(e),n=await Jx(e);return{...e,jsUrl:r,iconUrl:n}}))}s(Hx,"enrichPluginURLs");async function zx(t){let e=sS(t);return iS(e)}s(zx,"getPluginJSUrl");async function Jx(t){let e=oS(t);if(e)return iS(e)}s(Jx,"getPluginIconUrl");async function iS(t){return E.CLOUDFRONT_CDN?ii(t):await un(E.PLUGIN_BUCKET_NAME,t)}s(iS,"getPluginUrl");function sS(t){return aS(t,"plugin.min.js")}s(sS,"getPluginJSKey");function oS(t){let e=t.iconUrl?"icon.svg":t.iconFileName;if(e)return aS(t,e)}s(oS,"getPluginIconKey");function aS(t,e){return`${uS(t.name)}/${e}`}s(aS,"getPluginS3Key");function uS(t){let e=`${t}`;return E.MULTI_TENANCY&&(e=`${G()}/${e}`),E.CLOUDFRONT_CDN&&(e=`plugins/${e}`),e}s(uS,"getPluginS3Dir");var dS="budibase.log",fS="budibase-logs-history.txt",pS=zf.default.join(an(),"systemlogs");function cS(t){return zf.default.join(pS,t)}s(cS,"getFullPath");function mS(t){let e=/(\d+)([A-Za-z])/,r=t?.match(e);if(!r){console.warn("totalMaxSize does not have a valid value",{totalMaxSize:t});return}let n=+r[1],i=r[2];if(n===1)switch(i){case"B":return{size:`${n}B`,totalHistoryFiles:1};case"K":return{size:`${n*1e3/2}B`,totalHistoryFiles:1};case"M":return{size:`${n*1e3/2}K`,totalHistoryFiles:1};case"G":return{size:`${n*1e3/2}M`,totalHistoryFiles:1};default:return}return n%2===0?{size:`${n/2}${i}`,totalHistoryFiles:1}:{size:`1${i}`,totalHistoryFiles:n-1}}s(mS,"getSingleFileMaxSizeInfo");function Jf(){let t=mS(E.ROLLING_LOG_MAX_SIZE);return lS.createStream(dS,{size:t?.size,path:pS,maxFiles:t?.totalHistoryFiles||1,immutable:!0,history:fS,initialRotation:!1})}s(Jf,"localFileDestination");function Zx(){let t=[],e=cS(fS);if(ro.default.existsSync(e)){let i=ro.default.readFileSync(e,"utf-8").split(`
|
|
37
|
+
`);for(let o of i.filter(a=>a))t.push(ro.default.readFileSync(o))}return t.push(ro.default.readFileSync(cS(dS))),Buffer.concat(t.map(n=>new Uint8Array(n)))}s(Zx,"getLogReadStream");function Xx(t){return typeof t=="object"&&t!==null&&!(t instanceof Error)}s(Xx,"isPlainObject");function ev(t){return t instanceof Error}s(ev,"isError");function tv(t){return typeof t=="string"}s(tv,"isMessage");var Sr;if(!E.DISABLE_PINO_LOGGER){let t=E.LOG_LEVEL,e={level:t,formatters:{level:c=>({level:c.toUpperCase()}),bindings:()=>E.SELF_HOSTED?{service:E.SERVICE_NAME}:{}},timestamp:()=>`,"timestamp":"${new Date(Date.now()).toISOString()}"`},r=[];r.push(E.isDev()?{stream:(0,hS.default)({singleLine:!0}),level:t}:{stream:process.stdout,level:t}),E.SELF_HOSTED&&r.push({stream:Jf(),level:t}),Sr=r.length?(0,Ou.default)(e,Ou.default.multistream(r)):(0,Ou.default)(e);let n=s(c=>{let l,d=[],f="";c.forEach(y=>{tv(y)&&(f=`${f} ${y}`.trimStart()),Xx(y)&&d.push(y),ev(y)&&(l=y)});let p=u(),m={};m={tenantId:i(),appId:o(),automationId:a(),identityId:p?._id,identityType:p?.type,correlationId:Lf()};let h=Xf.default.scope().active();h&&Xf.default.inject(h.context(),ES.formats.LOG,m);let g={err:l,pid:process.pid,...m};if(d.length){let y={},S=0;for(let O=0;O<d.length;O++){let _=d[O],D=_._logKey;D?(delete _._logKey,g[D]=_):(y[S]=_,S++)}Object.keys(y).length&&(g.data=y)}return[g,f]},"getLogParams");console.log=(...c)=>{let[l,d]=n(c);Sr?.info(l,d)},console.info=(...c)=>{let[l,d]=n(c);Sr?.info(l,d)},console.warn=(...c)=>{let[l,d]=n(c);Sr?.warn(l,d)},console.error=(...c)=>{let[l,d]=n(c);Sr?.error(l,d)},console.trace=(...c)=>{let[l,d]=n(c);l.err||(l.err=new Error),Sr?.trace(l,d)},console.debug=(...c)=>{let[l,d]=n(c);Sr?.debug(l,d)};let i=s(()=>{let c;try{c=G()}catch{}return c},"getTenantId"),o=s(()=>{let c;try{c=Le()}catch{}return c},"getAppId"),a=s(()=>{let c;try{c=tf()}catch{}return c},"getAutomationId"),u=s(()=>{let c;try{c=Ft()}catch{}return c},"getIdentity")}var Iu=Sr;var rv=["AccountError"];function nv(t){return t&&t.suppressAlert}s(nv,"isSuppressed");function cn(t,e){e&&rv.includes(e.name)&&nv(e)||console.error(`bb-alert: ${t}`,e)}s(cn,"logAlert");function iv(t,e,r,n){t=`${t} - db: ${e} - doc: ${r} - error: `,cn(t,n)}s(iv,"logAlertWithInfo");function si(t,e){console.warn(`bb-warn: ${t}`,e)}s(si,"logWarn");var wu=class extends Error{static{s(this,"UnretriableError")}constructor(e){super(e),this.name="PermanentError"}},ep=class{static{s(this,"QueuedProcessor")}constructor(e,r={}){let{maxAttempts:n=3,removeOnFail:i=!0,removeOnComplete:o=!0,maxStalledCount:a=3}=r;this.waitForCompletionMs=r.waitForCompletionMs||1e4,this._queue=new ht(e,{maxStalledCount:a,jobOptions:{attempts:n,removeOnFail:i,removeOnComplete:o}}),this._queue.process(async(u,c)=>{try{let l=await this.processFn(u.data);c?.(null,l)}catch(l){l instanceof wu&&await u.discard(),cn(`Failed to process job in ${this._queue.name}`,l),c?.(l)}})}async close(e){await this._queue.close(e)}async execute(e){try{let r=await this._queue.add(e);return{success:!0,result:await Ne.withTimeout(this.waitForCompletionMs,()=>r.finished())}}catch(r){if(r.errno!=="ETIME")throw r;return{success:!1,reason:"timeout"}}}};var sv=100,Du,io=class t{static{s(this,"DocWritethroughProcessor")}static get queue(){return t._queue||(t._queue=new ht("docWritethroughQueue",{jobOptions:{attempts:sv}})),t._queue}init(){return t.queue.process(async e=>{try{await this.persistToDb(e.data)}catch(r){throw r.status===409?new Error(`Conflict persisting message ${e.id}. Attempt ${e.attemptsMade}`):r}}),this}async persistToDb({dbName:e,docId:r,data:n}){if(r.startsWith("scimlog"))return;let i=De(e),o;try{o=await i.get(r)}catch{o={_id:r}}o={...o,...n},await i.put(o)}},rp=class{static{s(this,"DocWritethrough")}constructor(e,r){this.db=e,this._docId=r}get docId(){return this._docId}async patch(e){await io.queue.add({dbName:this.db.name,docId:this.docId,data:e})}};function gS(){return Du=new io().init(),Du}s(gS,"init");function ov(){return Du||gS()}s(ov,"getProcessor");var oo={};N(oo,{CacheKey:()=>ye,TTL:()=>fn,bustCache:()=>oi,destroy:()=>so,get:()=>pn,keys:()=>Ru,store:()=>jt,withCache:()=>Ar,withCacheWithDynamicTTL:()=>yS});function Dt(t){let e=G();return`${t}:${e}`}s(Dt,"generateTenantKey");var ln=class{static{s(this,"BaseCache")}constructor(e=void 0){this.client=e}async getClient(){return this.client?this.client:await df()}async keys(e){return(await this.getClient()).keys(e)}async exists(e,r={useTenancy:!0}){return e=r.useTenancy?Dt(e):e,(await this.getClient()).exists(e)}async scan(e,r={useTenancy:!0}){return e=r.useTenancy?Dt(e):e,(await this.getClient()).scan(e)}async get(e,r={useTenancy:!0}){return e=r.useTenancy?Dt(e):e,(await this.getClient()).get(e)}async bulkGet(e,r={useTenancy:!0}){return e=r.useTenancy?e.map(i=>Dt(i)):e,(await this.getClient()).bulkGet(e)}async store(e,r,n=null,i={useTenancy:!0}){e=i.useTenancy?Dt(e):e,await(await this.getClient()).store(e,r,n)}async bulkStore(e,r=null,n={useTenancy:!0}){n.useTenancy&&(e=Object.entries(e).reduce((o,[a,u])=>(o[Dt(a)]=u,o),{})),await(await this.getClient()).bulkStore(e,r)}async delete(e,r={useTenancy:!0}){return e=r.useTenancy?Dt(e):e,(await this.getClient()).delete(e)}async bulkDelete(e,r={useTenancy:!0}){return e=r.useTenancy?e.map(i=>Dt(i)):e,(await this.getClient()).bulkDelete(e)}async withCache(e,r=null,n,i={useTenancy:!0}){let o=await this.get(e,i);if(o)return o;try{let a=await n();return await this.store(e,a,r,i),a}catch(a){throw console.error("Error fetching before cache - ",a),a}}async withCacheWithDynamicTTL(e,r,n={useTenancy:!0}){let i=await this.get(e,n);if(i)return i;try{let o=await r(),{value:a,ttl:u}=o;return await this.store(e,a,u,{useTenancy:n.useTenancy}),a}catch(o){throw console.error("Error fetching before cache - ",o),o}}async bustCache(e){let r=await this.getClient();try{await r.delete(Dt(e))}catch(n){throw console.error("Error busting cache - ",n),n}}async deleteIfValue(e,r,n={useTenancy:!0}){e=n.useTenancy?Dt(e):e,await(await this.getClient()).deleteIfValue(e,r)}};var dn=new ln,ye={CHECKLIST:"checklist",INSTALLATION:"installation",ANALYTICS_ENABLED:"analyticsEnabled",UNIQUE_TENANT_ID:"uniqueTenantId",EVENTS:"events",BACKFILL_METADATA:"backfillMetadata",EVENTS_RATE_LIMIT:"eventsRateLimit",OAUTH2_TOKEN:t=>`oauth2Token_${t}`},fn=(n=>(n[n.ONE_MINUTE=600]="ONE_MINUTE",n[n.ONE_HOUR=3600]="ONE_HOUR",n[n.ONE_DAY=86400]="ONE_DAY",n))(fn||{}),Ru=s((...t)=>dn.keys(...t),"keys"),pn=s((...t)=>dn.get(...t),"get"),jt=s((...t)=>dn.store(...t),"store"),so=s((...t)=>dn.delete(...t),"destroy"),Ar=s((...t)=>dn.withCache(...t),"withCache"),yS=s((...t)=>dn.withCacheWithDynamicTTL(...t),"withCacheWithDynamicTTL"),oi=s((...t)=>dn.bustCache(...t),"bustCache");var sp={};N(sp,{createCode:()=>uv,deleteCode:()=>lv,getCode:()=>cv,getExistingInvites:()=>ip,getInviteCodes:()=>SS,updateCode:()=>av});var TS=Ee.fromDays(7).toSeconds();async function av(t,e){await(await rn()).store(t,e,TS)}s(av,"updateCode");async function uv(t,e){let r=ne();return await(await rn()).store(r,{email:t,info:e},TS),r}s(uv,"createCode");async function cv(t){let r=await(await rn()).get(t);if(!r)throw"Invitation is not valid or has expired, please request a new one.";return r}s(cv,"getCode");async function lv(t){await(await rn()).delete(t)}s(lv,"deleteCode");async function SS(){let r=(await(await rn()).scan()).map(i=>({...i.value,code:i.key}));if(!E.MULTI_TENANCY)return r;let n=G();return r.filter(i=>n===i.info.tenantId)}s(SS,"getInviteCodes");async function ip(t){return(await SS()).filter(e=>t.includes(e.email))}s(ip,"getExistingInvites");var op={};N(op,{createCode:()=>fv,getCode:()=>pv,invalidateCode:()=>mv});var dv=Ee.fromHours(1).toSeconds();async function fv(t,e){let r=ne();return await(await Fs()).store(r,{userId:t,info:e},dv),r}s(fv,"createCode");async function pv(t){let r=await(await Fs()).get(t);if(!r)throw new Error("Provided information is not valid, cannot reset password - please try again.");return r}s(pv,"getCode");async function mv(t){await(await Fs()).delete(t)}s(mv,"invalidateCode");var wr={};N(wr,{getUser:()=>Do,getUsers:()=>qU,invalidateUser:()=>Ro});var ao={};N(ao,{getPlatformDB:()=>_r,users:()=>Et});var Et={};N(Et,{addSsoUser:()=>_S,addUser:()=>Sv,getUserDoc:()=>AS,lookupTenantId:()=>hv,removeUser:()=>Av,updateUserDoc:()=>Ev});function _r(){return De(fe.PLATFORM_INFO.name)}s(_r,"getPlatformDB");async function hv(t){return E.MULTI_TENANCY?(await AS(t)).tenantId:ae}s(hv,"lookupTenantId");async function AS(t){return _r().get(t)}s(AS,"getUserDoc");async function Ev(t){await _r().put(t)}s(Ev,"updateUserDoc");function gv(t,e){return{_id:t,tenantId:e}}s(gv,"newUserIdDoc");function yv(t,e,r){return{_id:e,userId:t,tenantId:r}}s(yv,"newUserEmailDoc");function Tv(t,e,r,n){return{_id:t,userId:r,email:e,tenantId:n}}s(Tv,"newUserSsoIdDoc");async function ap(t,e){let r=_r(),n;try{await r.get(t)}catch(i){if(i.status===404)n=e(),await r.put(n);else throw i}}s(ap,"addUserDoc");async function _S(t,e,r,n){return ap(t,()=>Tv(t,e,r,n))}s(_S,"addSsoUser");async function Sv(t,e,r,n){let i=[ap(e,()=>gv(e,t)),ap(r,()=>yv(e,r,t))];n&&i.push(_S(n,r,e,t)),await Promise.all(i)}s(Sv,"addUser");async function Av(t){let e=_r(),r=[t._id,t.email],n=await e.allDocs({keys:r,include_docs:!0});await e.bulkRemove(n.rows.map(i=>i.doc),{silenceErrors:!0})}s(Av,"removeUser");var mn={};N(mn,{getAccount:()=>Or,getAccountByTenantId:()=>ai,getStatus:()=>_v});var OS=F(require("node-fetch"));var uo=class{static{s(this,"API")}constructor(e){this.host=e}async apiCall(e,r,n){n.headers||(n.headers={}),n.headers["Content-Type"]||(n.headers={"Content-Type":"application/json",Accept:"application/json",...n.headers});let i=n.headers["Content-Type"]==="application/json";Js.setHeader(n.headers);let o={method:e,body:i?JSON.stringify(n.body):n.body,headers:n.headers,credentials:"include"};return await(0,OS.default)(`${this.host}${r}`,o)}async post(e,r){return this.apiCall("POST",e,r)}async get(e,r){return this.apiCall("GET",e,r)}async patch(e,r){return this.apiCall("PATCH",e,r)}async del(e,r){return this.apiCall("DELETE",e,r)}async put(e,r){return this.apiCall("PUT",e,r)}};var up=new uo(E.INTERNAL_ACCOUNT_PORTAL_URL),cp=E.SELF_HOSTED||E.DISABLE_ACCOUNT_PORTAL,Or=s(async t=>{if(cp)return;let e={email:t},r=await up.post("/api/accounts/search",{body:e,headers:{"x-budibase-api-key":E.ACCOUNT_PORTAL_API_KEY}});if(r.status!==200)throw new Error(`Error getting account by email ${t}`);return(await r.json())[0]},"getAccount"),ai=s(async t=>{if(cp)return;let e={tenantId:t},r=await up.post("/api/accounts/search",{body:e,headers:{"x-budibase-api-key":E.ACCOUNT_PORTAL_API_KEY}});if(r.status!==200)throw new Error(`Error getting account by tenantId ${t}`);return(await r.json())[0]},"getAccountByTenantId"),_v=s(async()=>{if(cp)return;let t=await up.get("/api/status",{headers:{"x-budibase-api-key":E.ACCOUNT_PORTAL_API_KEY}}),e=await t.json();if(t.status!==200)throw new Error("Error getting status");return e},"getStatus");var mi={};N(mi,{UserDB:()=>Ct,addAppBuilder:()=>WU,bulkGetGlobalUsersById:()=>Ju,bulkUpdateGlobalUsers:()=>Oo,cleanseUserObject:()=>vp,creatorsInList:()=>gn,doesUserExist:()=>LU,getAccountHolderFromUsers:()=>zu,getAllUserIds:()=>NU,getAllUsers:()=>UU,getById:()=>yn,getCreatorCount:()=>FU,getExistingAccounts:()=>pi,getExistingPlatformUsers:()=>lA,getExistingTenantUsers:()=>cA,getFirstPlatformUser:()=>Ao,getGlobalUserByAppPage:()=>EA,getGlobalUserByEmail:()=>Tt,getPlatformUsers:()=>Qu,getUserCount:()=>MU,hasAdminPermissions:()=>Ir,hasAppBuilderPermissions:()=>pA,hasBuilderPermissions:()=>ke,isAdmin:()=>Rt,isAdminOrBuilder:()=>fA,isAdminOrWorkspaceBuilder:()=>ju,isBuilder:()=>Ei,isCreatorAsync:()=>_o,isCreatorSync:()=>Yu,isGlobalBuilder:()=>dA,paginatedUsers:()=>yA,removeAppBuilder:()=>$U,removePortalUserPermissions:()=>BU,searchExistingEmails:()=>Dp,searchGlobalUsersByApp:()=>Zu,searchGlobalUsersByAppAccess:()=>xp,searchGlobalUsersByEmail:()=>gA,validateUniqueUser:()=>Hu});var ku={};N(ku,{BadRequestError:()=>xu,BudibaseError:()=>ui,EmailUnavailableError:()=>Yt,FeatureDisabledError:()=>Uu,ForbiddenError:()=>vu,HTTPError:()=>we,InvalidAPIKeyError:()=>ci,NotFoundError:()=>bu,NotImplementedError:()=>Pu,UnexpectedError:()=>Cu,UsageLimitError:()=>Nu,getPublicError:()=>Lu});var ui=class extends Error{constructor(r,n){super(r);this.code=n}static{s(this,"BudibaseError")}},Lu=s(t=>{let e;return t.code&&(e={code:t.code},t.getPublicError&&(e={...e,...t.getPublicError()})),e},"getPublicError"),we=class t extends ui{constructor(r,n,i="http"){super(r,i);this.status=n}static{s(this,"HTTPError")}static async fromResponse(r){let n=await r.text(),i=n,o=r.status,a="http";try{let u=JSON.parse(n);i=u.message,o=u.status,a=u.error?.code}catch{}return new t(i,o,a)}},Cu=class extends we{static{s(this,"UnexpectedError")}constructor(e){super(e,500)}},bu=class extends we{static{s(this,"NotFoundError")}constructor(e){super(e,404)}},xu=class extends we{static{s(this,"BadRequestError")}constructor(e){super(e,400)}},vu=class extends we{static{s(this,"ForbiddenError")}constructor(e){super(e,403)}},Pu=class extends we{static{s(this,"NotImplementedError")}constructor(e){super(e,501)}},Nu=class extends we{constructor(r,n){super(r,400,"usage_limit_exceeded");this.limitName=n}static{s(this,"UsageLimitError")}getPublicError(){return{limitName:this.limitName}}},Uu=class extends we{constructor(r,n){super(r,400,"feature_disabled");this.featureName=n}static{s(this,"FeatureDisabledError")}getPublicError(){return{featureName:this.featureName}}},ci=class extends ui{static{s(this,"InvalidAPIKeyError")}constructor(){super("Invalid API key - may need re-generated, or user doesn't exist","invalid_api_key")}},Yt=class extends Error{static{s(this,"EmailUnavailableError")}constructor(e){super(`Email already in use: '${e}'`)}};var pp={};N(pp,{PASSWORD_MAX_LENGTH:()=>dp,PASSWORD_MIN_LENGTH:()=>lp,validatePassword:()=>fp});var lp=+(E.PASSWORD_MIN_LENGTH||12),dp=+(E.PASSWORD_MAX_LENGTH||512);function fp(t){return!t||t.length<lp?{valid:!1,error:`Password invalid. Minimum ${lp} characters.`}:t.length>dp?{valid:!1,error:`Password invalid. Maximum ${dp} characters.`}:{valid:!0}}s(fp,"validatePassword");var Mu={};N(Mu,{createASession:()=>Iv,endSession:()=>wv,getSession:()=>hp,getSessionsForUser:()=>co,invalidateSessions:()=>hn,updateSessionTTL:()=>mp});var wS=require("uuid");var DS=E.SESSION_EXPIRY_SECONDS?parseInt(E.SESSION_EXPIRY_SECONDS):Ee.fromDays(7).toSeconds();function li(t,e){return`${t}/${e}`}s(li,"makeSessionID");async function co(t){return t?(await(await mr()).scan(t)).map(n=>n.value):(console.trace("Cannot get sessions for undefined userId"),[])}s(co,"getSessionsForUser");async function hn(t,e={}){try{let r=e?.reason||"unknown",n=e.sessionIds||[],i;if(n.length===0?i=(await co(t)).map(a=>({key:li(a.userId,a.sessionId)})):(n=Array.isArray(n)?n:[n],i=n.map(o=>({key:li(t,o)}))),i&&i.length>0){let o=await mr(),a=[];for(let u of i)a.push(o.delete(u.key));E.isTest()||si(`Invalidating sessions for ${t} (reason: ${r}) - ${i.map(u=>u.key).join(", ")}`),await Promise.all(a)}}catch(r){console.error(`Error invalidating sessions: ${r}`)}}s(hn,"invalidateSessions");async function Iv(t,e){let r=await co(t),n=0;if(r.length>=3){let l=r.sort((p,m)=>new Date(p.createdAt).getTime()-new Date(m.createdAt).getTime()),d=r.length-3+1,f=l.slice(0,d).map(p=>p.sessionId);n=f.length,await hn(t,{sessionIds:f,reason:"session limit exceeded"})}let i=await mr(),o=e.sessionId,a=e.csrfToken?e.csrfToken:(0,wS.v4)(),u=li(t,o),c={...e,csrfToken:a,createdAt:new Date().toISOString(),lastAccessedAt:new Date().toISOString(),userId:t};return await i.store(u,c,DS),{session:c,invalidatedSessionCount:n}}s(Iv,"createASession");async function mp(t){let e=await mr(),r=li(t.userId,t.sessionId);t.lastAccessedAt=new Date().toISOString(),await e.store(r,t,DS)}s(mp,"updateSessionTTL");async function wv(t,e){await(await mr()).delete(li(t,e))}s(wv,"endSession");async function hp(t,e){if(!t||!e)throw new Error(`Invalid session details - ${t} - ${e}`);let n=await(await mr()).get(li(t,e));if(!n)throw new Error(`Session not found - ${t} - ${e}`);return n}s(hp,"getSession");var fi={};N(fi,{account:()=>FS,action:()=>BS,ai:()=>WS,analytics:()=>Bu,app:()=>$S,asyncEventQueue:()=>gt,auditLog:()=>VS,auth:()=>Ku,automation:()=>GS,backfill:()=>qS,backfillCache:()=>Vu,backup:()=>KS,datasource:()=>QS,email:()=>jS,environmentVariable:()=>YS,group:()=>HS,identification:()=>yt,initAsyncEvents:()=>SU,installation:()=>ho,layout:()=>zS,license:()=>JS,org:()=>ZS,plugin:()=>XS,processors:()=>Ap,publishEvent:()=>A,query:()=>eA,resource:()=>tA,role:()=>So,rowAction:()=>rA,rows:()=>nA,screen:()=>iA,serve:()=>sA,shutdown:()=>AU,table:()=>oA,user:()=>Me,view:()=>aA,workspace:()=>uA});var Bu={};N(Bu,{enabled:()=>Fu});var Fu=s(async()=>Wu(),"enabled");var gt;function $u(){gt=new ht("systemEventQueue",{jobTags:t=>({"event.name":t.event})})}s($u,"init");async function RS(){gt&&await gt.close()}s(RS,"shutdown");async function CS(t){gt||$u();let{event:e,identity:r}=t;bm.indexOf(e)!==-1&&r.tenantId&&await gt.add(t)}s(CS,"publishAsyncEvent");var Vu={};N(Vu,{end:()=>Rv,isAlreadySent:()=>yp,isBackfillingEvent:()=>gp,recordEvent:()=>Ep,start:()=>Dv});var Dv=s(async t=>bv({eventWhitelist:t}),"start"),Ep=s(async(t,e)=>{let r=Tp(t,e);await jt(r,e,void 0,{useTenancy:!1})},"recordEvent"),Rv=s(async()=>{await xv(),await vv()},"end"),Cv=s(async()=>pn(ye.BACKFILL_METADATA),"getBackfillMetadata"),bv=s(async t=>jt(ye.BACKFILL_METADATA,t),"saveBackfillMetadata"),xv=s(async()=>{await so(ye.BACKFILL_METADATA)},"deleteBackfillMetadata"),vv=s(async()=>{let t=Tp(),e=await Ru(t);for(let r of e)await so(r,{useTenancy:!1})},"clearEvents"),gp=s(async t=>{let r=(await Cv())?.eventWhitelist;return!!(r&&r.includes(t))},"isBackfillingEvent"),yp=s(async(t,e)=>{let r=Tp(t,e);return!!await pn(r,{useTenancy:!1})},"isAlreadySent"),Pv={"automation:created":t=>t.automationId,"automation:step:created":t=>t.stepId,"datasource:created":t=>t.datasourceId,"layout:created":t=>t.layoutId,"query:created":t=>t.queryId,"role:created":t=>t.roleId,"screen:created":t=>t.screenId,"table:created":t=>t.tableId,"view:created":t=>t.tableId,"view:calculation:created":t=>t.tableId,"view:filter:created":t=>t.tableId,"app:created":t=>t.appId,"app:published":t=>t.appId,"auth:sso:created":t=>t.type,"auth:sso:activated":t=>t.type,"user:created":t=>t.userId,"user:admin:assigned":t=>t.userId,"user:builder:assigned":t=>t.userId,"role:assigned":t=>`${t.roleId}-${t.userId}`},Tp=s((t,e)=>{let r,n=G();if(t){r=`${ye.EVENTS}:${n}:${t}`;let i=Pv[t],o=i?i(e):void 0;o&&(r=`${r}:${o}`)}else r=`${ye.EVENTS}:${n}:*`;return r},"getEventKey");var Ap={};N(Ap,{analyticsProcessor:()=>LS,init:()=>Vv,processors:()=>Ht});var NS=require("posthog-node");var Nv=s(t=>t==="served:builder"||t==="served:app:preview"||t==="served:app","isRateLimited"),Uv=s(t=>t==="served:app:preview"||t==="served:app","isPerApp");var xS={"served:app":"calendarDay","served:app:preview":"calendarDay","served:builder":"calendarDay"},vS=s(async t=>{if(!Nv(t))return!1;let e=await Lv(t);if(e){let r=new Date(e.timestamp);switch(xS[t]){case"calendarDay":return r.setDate(r.getDate()+1),r.setHours(0,0,0,0),Date.now()>r.getTime()?(await bS(t,{timestamp:Date.now()}),!1):!0}}else return await bS(t,{timestamp:Date.now()}),!1},"limited"),PS=s(t=>{let e=`${ye.EVENTS_RATE_LIMIT}:${t}`;return Uv(t)&&(e=e+":"+Le()),e},"eventKey"),Lv=s(async t=>{let e=PS(t);return await pn(e)},"readEvent"),bS=s(async(t,e)=>{let r=PS(t),n=xS[t],i;switch(n){case"calendarDay":i=86400}await jt(r,e,i)},"recordEvent");var Mv=["user:updated","email:smtp:updated","auth:sso:updated","app:updated","role:updated","datasource:updated","query:updated","view:updated","view:calculation:updated","automation:trigger:updated","user_group:updated"],lo=class{static{s(this,"PosthogProcessor")}constructor(e){if(!e)throw new Error("Posthog token is not defined");this.posthog=new NS.PostHog(e)}async processEvent(e,r,n,i){if(Mv.includes(e)||await vS(e))return;n=this.clearPIIProperties(n),n.version=E.VERSION,n.service=E.SERVICE,n.environment=r.environment,n.hosting=r.hosting;let o=Le();o&&(n.appId=o);let a={distinctId:r.id,event:e,properties:n};i&&(a.timestamp=new Date(i)),(r.installationId||r.tenantId)&&(a.groups={},r.installationId&&(a.groups.installation=r.installationId,a.properties.installationId=r.installationId),r.tenantId&&(a.groups.tenant=r.tenantId,a.properties.tenantId=r.tenantId)),this.posthog.capture(a)}clearPIIProperties(e){return e.email&&delete e.email,e.audited&&delete e.audited,e}async identify(e,r){let n={distinctId:e.id,properties:e};r&&(n.timestamp=new Date(r)),this.posthog.identify(n)}async identifyGroup(e,r){let n={distinctId:e.id,groupType:e.type,groupKey:e.id,properties:e};r&&(n.timestamp=new Date(r)),this.posthog.groupIdentify(n)}async shutdown(){await this.posthog.shutdown()}};var US=lo;var Fv=["installation:version:upgraded","installation:version:downgraded"],Bv=["installation","tenant"],fo=class{static{s(this,"AnalyticsProcessor")}constructor(){E.POSTHOG_TOKEN&&!E.isTest()&&(this.posthog=new US(E.POSTHOG_TOKEN))}async processEvent(e,r,n,i){!Fv.includes(e)&&!await Fu()||this.posthog&&await this.posthog.processEvent(e,r,n,i)}async identify(e,r){!Bv.includes(e.type)&&!await Fu()||this.posthog&&await this.posthog.identify(e,r)}async identifyGroup(e,r){this.posthog&&await this.posthog.identifyGroup(e,r)}async shutdown(){this.posthog&&await this.posthog.shutdown()}};var Sp=E.SELF_HOSTED&&!E.isDev(),po=class{static{s(this,"LoggingProcessor")}async processEvent(e,r,n){Sp||console.log(`[audit] [identityType=${r.type}] ${e}`,n)}async identify(e){Sp||console.log("[audit] identified",e)}async identifyGroup(e){Sp||console.log("[audit] group identified",e)}async shutdown(){}};var di=class t{static{s(this,"AuditLogsProcessor")}static{this.auditLogsEnabled=!1}static init(e){t.auditLogsEnabled=!0;let r=e;return t.auditLogQueue=new ht("auditLogQueue",{jobTags:n=>({"event.name":n.event})}),t.auditLogQueue.process(async n=>{await Re(n.data.tenantId,async()=>{let i=n.data.properties;i.audited&&(i={...i,...i.audited},delete i.audited);let o={};E.ENABLE_AUDIT_LOG_IP_ADDR&&(o=n.data.opts.hostInfo),await r(n.data.event,i,{userId:n.data.opts.userId,timestamp:n.data.opts.timestamp,appId:n.data.opts.appId,hostInfo:o})})})}async processEvent(e,r,n,i){if(t.auditLogsEnabled&&Cf(e)){let o=r.type==="user"?r.id:void 0;await t.auditLogQueue.add({event:e,properties:n,opts:{userId:o,timestamp:i,appId:Le(),hostInfo:r.hostInfo},tenantId:G()})}}async identify(){}async identifyGroup(){}async shutdown(){await t.auditLogQueue?.close()}};var mo=class{constructor(e){this.initialised=!1;this.processors=[];this.processors=e}static{s(this,"Processor")}async processEvent(e,r,n,i){for(let o of this.processors)await o.processEvent(e,r,n,i)}async identify(e,r){for(let n of this.processors)n.identify&&await n.identify(e,r)}async identifyGroup(e,r){for(let n of this.processors)n.identifyGroup&&await n.identifyGroup(e,r)}async shutdown(){for(let e of this.processors)e.shutdown&&await e.shutdown()}};var LS=new fo,Wv=new po,$v=new di;function Vv(t){return di.init(t)}s(Vv,"init");var Ht=new mo([LS,Wv,$v]);var Gu={};N(Gu,{checkInstallVersion:()=>Kv,getInstall:()=>Eo,getInstallFromDB:()=>Op});var _p=F(require("semver"));var Eo=s(async()=>Ar(ye.INSTALLATION,86400,Op,{useTenancy:!1}),"getInstall");async function Gv(t){let e={_id:fe.PLATFORM_INFO.docs.install,installId:ne(),version:E.VERSION};try{let r=await t.put(e);return e._rev=r.rev,e}catch(r){if(r.status===409)return Op();throw r}}s(Gv,"createInstallDoc");var Op=s(async()=>Ke(fe.PLATFORM_INFO.name,async t=>{let e;try{e=await t.get(fe.PLATFORM_INFO.docs.install)}catch(r){if(r.status===404)e=await Gv(t);else throw r}return e}),"getInstallFromDB"),qv=s(async t=>{try{await Ke(fe.PLATFORM_INFO.name,async e=>{let r=await Eo();r.version=t,await e.put(r),await oi(ye.INSTALLATION)})}catch(e){if(e.status===409)return!1;throw e}return!0},"updateVersion"),Kv=s(async()=>{let t=await Eo(),e=t.version,r=E.VERSION;try{if(e!==r){let n=_p.default.gt(r,e),i=_p.default.lt(r,e);await qv(r)&&(await Os({_id:t.installId,type:"installation"},async()=>{n?await ho.upgraded(e,r):i&&await ho.downgraded(e,r)}),await yt.identifyInstallationGroup(t.installId))}}catch(n){n?.message?.includes("Invalid Version")?cn(`Invalid version "${r}" - is it semver?`):cn("Failed to retrieve version",n)}},"checkInstallVersion");var Qv=s(async()=>{let t=Md(),e=To(),r;if(t?r=t.type:r="tenant",r==="installation"){let n=await En(),i=go();return{id:kS(n,r),hosting:i,type:r,installationId:n,environment:e}}else if(r==="tenant"){let n=await En(),i=await qu(G()),o=go();return{id:kS(i,r),type:r,hosting:o,installationId:n,tenantId:i,realTenantId:G(),environment:e}}else if(r==="user"){let n=t,i=await qu(G()),o=await En(),a=n.account,u;return a?u=a.hosting:u=go(),{id:n._id,type:r,hosting:u,installationId:o,tenantId:i,environment:e,realTenantId:G(),hostInfo:n.hostInfo}}else throw new Error("Unknown identity type")},"getCurrentIdentity"),jv=s(async(t,e)=>{let r=t,n="installation",i=go(),o=E.VERSION,a=To(),u={id:r,type:n,hosting:i,version:o,environment:a};await Ip(u,e),await yo({...u,id:`$${n}_${r}`},e)},"identifyInstallationGroup"),Yv=s(async(t,e,r,n=E.VERSION)=>{let i=await qu(t),o="tenant",a=await En(),u=To(),c={id:i,type:o,hosting:e,environment:u,installationId:a,createdAt:r,createdVersion:n};await Ip(c,r),await yo({...c,id:`$${o}_${i}`},r)},"identifyTenantGroup"),Hv=s(async(t,e,r)=>{let n=t._id,i=await qu(t.tenantId),o="user",a=ke(t),u=Ir(t),c;Go(t)&&(c=t.providerType);let d=(await pi([t.email])).length>0,f=!!e&&d&&e.verified,p=await En(),m=e?e.hosting:go(),h=To();await yo({id:n,type:o,hosting:m,installationId:p,tenantId:i,verified:f,accountHolder:d,providerType:c,builder:a,admin:u,environment:h},r)},"identifyUser"),zv=s(async t=>{let e=t.accountId,r=t.tenantId,n="user",i=Vo(t)?t.providerType:void 0,o=t.verified,a=!0,u=t.hosting,c=await En(),l=To();if($o(t)){let f=await Tt(t.email);f?._id&&(e=f._id)}await yo({id:e,type:n,hosting:u,installationId:c,tenantId:r,providerType:i,verified:o,accountHolder:a,environment:l})},"identifyAccount"),yo=s(async(t,e)=>{await Ht.identify(t,e)},"identify"),Ip=s(async(t,e)=>{await Ht.identifyGroup(t,e)},"identifyGroup"),To=s(()=>E.isDev()?"development":E.DEPLOYMENT_ENVIRONMENT,"getDeploymentEnvironment"),go=s(()=>E.SELF_HOSTED?"self":"cloud","getHostingFromEnv"),En=s(async()=>Jv()?"account-portal":(await Eo()).installId,"getInstallationId"),qu=s(async t=>E.SELF_HOSTED?MS(t):t,"getEventTenantId"),MS=s(async t=>Re(t,()=>Ar(ye.UNIQUE_TENANT_ID,86400,async()=>{let e=H(),r=await ni(),n;return r.config.uniqueTenantId?r.config.uniqueTenantId:(n=`${ne()}_${t}`,r.config.uniqueTenantId=n,r.config.createdVersion=E.VERSION,await e.put(r),n)})),"getUniqueTenantId"),Jv=s(()=>E.SERVICE==="account-portal","isAccountPortal"),kS=s((t,e)=>e==="installation"||e==="tenant"?`$${e}_${t}`:t,"formatDistinctId"),yt={getCurrentIdentity:Qv,identifyInstallationGroup:jv,identifyTenantGroup:Yv,identifyUser:Hv,identifyAccount:zv,identify:yo,identifyGroup:Ip,getInstallationId:En,getUniqueTenantId:MS};var A=s(async(t,e,r,n)=>{let i=n||await yt.getCurrentIdentity();if(!(n?!1:await gp(t))){await CS({event:t,identity:i,properties:e,timestamp:r}),await Ht.processEvent(t,i,e,r);return}await yp(t,e)||(await Ht.processEvent(t,i,e,r),await Ep(t,e))},"publishEvent");async function Zv(t,e){let r={tenantId:t.tenantId};await A("account:created",r,void 0,e)}s(Zv,"created");async function Xv(t){let e={tenantId:t.tenantId};await A("account:deleted",e)}s(Xv,"deleted");async function eP(t){let e={tenantId:t.tenantId};await A("account:verified",e)}s(eP,"verified");var FS={created:Zv,deleted:Xv,verified:eP};async function tP(t,e){console.info("action:automation_step:executed",`disabled. Action step ${t.stepId} not published at ${e}`)}s(tP,"automationStepExecuted");async function rP(t,e){console.info("action:automation_step:executed",`disabled. Action type ${t.type} not published at ${e}`)}s(rP,"crudExecuted");async function nP(t,e){console.info("action:automation_step:executed",`disabled. Execution for ai agent ${t.agentId} not published at ${e}`)}s(nP,"aiAgentExecuted");var BS={aiAgentExecuted:nP,automationStepExecuted:tP,crudExecuted:rP};async function iP(t){let e={};await A("ai:config:created",e,t)}s(iP,"AIConfigCreated");async function sP(){let t={};await A("ai:config:updated",t)}s(sP,"AIConfigUpdated");var WS={AIConfigCreated:iP,AIConfigUpdated:sP};var oP=s(async(t,e)=>{let r={appId:t.appId,version:t.version,audited:{name:t.name}};await A("app:created",r,e)},"created");async function aP(t){let e={appId:t.appId,version:t.version,audited:{name:t.name}};await A("app:updated",e)}s(aP,"updated");async function uP(t){let e={appId:t.appId,audited:{name:t.name}};await A("app:deleted",e)}s(uP,"deleted");async function cP(t,e){let r={appId:t.appId,audited:{name:t.name}};await A("app:published",r,e)}s(cP,"published");async function lP(t){let e={appId:t.appId,audited:{name:t.name}};await A("app:unpublished",e)}s(lP,"unpublished");async function dP(t){let e={appId:t.appId,audited:{name:t.name}};await A("app:file:imported",e)}s(dP,"fileImported");async function fP(t,e){let r={duplicateAppId:e,appId:t.appId,audited:{name:t.name}};await A("app:duplicated",r)}s(fP,"duplicated");async function pP(t,e){let r={appId:t.appId,templateKey:e,audited:{name:t.name}};await A("app:template:imported",r)}s(pP,"templateImported");async function mP(t,e,r){let n={appId:t.appId,currentVersion:e,updatedToVersion:r,audited:{name:t.name}};await A("app:version:updated",n)}s(mP,"versionUpdated");async function hP(t,e,r){let n={appId:t.appId,currentVersion:e,revertedToVersion:r,audited:{name:t.name}};await A("app:version:reverted",n)}s(hP,"versionReverted");async function EP(t){let e={appId:t.appId,audited:{name:t.name}};await A("app:reverted",e)}s(EP,"reverted");async function gP(t){let e={appId:t.appId,audited:{name:t.name}};await A("app:exported",e)}s(gP,"exported");var $S={created:oP,updated:aP,deleted:uP,published:cP,unpublished:lP,fileImported:dP,duplicated:fP,templateImported:pP,versionUpdated:mP,versionReverted:hP,reverted:EP,exported:gP};async function yP(t){let e={filters:t};await A("audit_log:filtered",e)}s(yP,"filtered");async function TP(t){let e={filters:t};await A("audit_log:downloaded",e)}s(TP,"downloaded");var VS={filtered:yP,downloaded:TP};async function SP(t,e){let n={userId:(await yt.getCurrentIdentity()).id,source:t,audited:{email:e}};await A("auth:login",n)}s(SP,"login");async function AP(t){let r={userId:(await yt.getCurrentIdentity()).id,audited:{email:t}};await A("auth:logout",r)}s(AP,"logout");async function _P(t,e){let r={type:t};await A("auth:sso:created",r,e)}s(_P,"SSOCreated");async function OP(t){let e={type:t};await A("auth:sso:updated",e)}s(OP,"SSOUpdated");async function IP(t,e){let r={type:t};await A("auth:sso:activated",r,e)}s(IP,"SSOActivated");async function wP(t){let e={type:t};await A("auth:sso:deactivated",e)}s(wP,"SSODeactivated");var Ku={login:SP,logout:AP,SSOCreated:_P,SSOUpdated:OP,SSOActivated:IP,SSODeactivated:wP};async function DP(t,e){let r={appId:t.appId,automationId:t._id,triggerId:t.definition?.trigger?.id,triggerType:t.definition?.trigger?.stepId,audited:{name:t.name}};await A("automation:created",r,e)}s(DP,"created");async function RP(t){let e={appId:t.appId,automationId:t._id,triggerId:t.definition?.trigger?.id,triggerType:t.definition?.trigger?.stepId};await A("automation:trigger:updated",e)}s(RP,"triggerUpdated");async function CP(t){let e={appId:t.appId,automationId:t._id,triggerId:t.definition?.trigger?.id,triggerType:t.definition?.trigger?.stepId,audited:{name:t.name}};await A("automation:deleted",e)}s(CP,"deleted");async function bP(t){let e={appId:t.appId,automationId:t._id,triggerId:t.definition?.trigger?.id,triggerType:t.definition?.trigger?.stepId};await A("automation:tested",e)}s(bP,"tested");var xP=s(async(t,e)=>{let r={count:t};await A("automations:run",r,e)},"run");async function vP(t,e,r){let n={appId:t.appId,automationId:t._id,triggerId:t.definition?.trigger?.id,triggerType:t.definition?.trigger?.stepId,stepId:e.id,stepType:e.stepId,audited:{name:t.name}};await A("automation:step:created",n,r)}s(vP,"stepCreated");async function PP(t,e){let r={appId:t.appId,automationId:t._id,triggerId:t.definition?.trigger?.id,triggerType:t.definition?.trigger?.stepId,stepId:e.id,stepType:e.stepId,audited:{name:t.name}};await A("automation:step:deleted",r)}s(PP,"stepDeleted");var GS={created:DP,triggerUpdated:RP,deleted:CP,tested:bP,run:xP,stepCreated:vP,stepDeleted:PP};var hi=!E.SELF_HOSTED&&!E.isDev();async function NP(t){hi||await A("app:backfill:succeeded",t)}s(NP,"appSucceeded");async function UP(t){if(hi)return;let e={error:JSON.stringify(t,Object.getOwnPropertyNames(t))};await A("app:backfill:failed",e)}s(UP,"appFailed");async function LP(t){hi||await A("tenant:backfill:succeeded",t)}s(LP,"tenantSucceeded");async function kP(t){if(hi)return;let e={error:JSON.stringify(t,Object.getOwnPropertyNames(t))};await A("tenant:backfill:failed",e)}s(kP,"tenantFailed");async function MP(){if(hi)return;let t={};await A("installation:backfill:succeeded",t)}s(MP,"installationSucceeded");async function FP(t){if(hi)return;let e={error:JSON.stringify(t,Object.getOwnPropertyNames(t))};await A("installation:backfill:failed",e)}s(FP,"installationFailed");var qS={appSucceeded:NP,appFailed:UP,tenantSucceeded:LP,tenantFailed:kP,installationSucceeded:MP,installationFailed:FP};async function BP(t){let e={appId:t.appId,restoreId:t._id,backupCreatedAt:t.timestamp,name:t.name};await A("app:backup:restored",e)}s(BP,"appBackupRestored");async function WP(t,e,r,n,i){let o={appId:t,backupId:e,type:r,trigger:n,name:i};await A("app:backup:triggered",o)}s(WP,"appBackupTriggered");var KS={appBackupRestored:BP,appBackupTriggered:WP};function wp(t){return!Object.values(Mo).includes(t.source)}s(wp,"isCustom");async function $P(t,e){let r={datasourceId:t._id,source:t.source,custom:wp(t)};await A("datasource:created",r,e)}s($P,"created");async function VP(t){let e={datasourceId:t._id,source:t.source,custom:wp(t)};await A("datasource:updated",e)}s(VP,"updated");async function GP(t){let e={datasourceId:t._id,source:t.source,custom:wp(t)};await A("datasource:deleted",e)}s(GP,"deleted");var QS={created:$P,updated:VP,deleted:GP};async function qP(t){let e={};await A("email:smtp:created",e,t)}s(qP,"SMTPCreated");async function KP(){let t={};await A("email:smtp:updated",t)}s(KP,"SMTPUpdated");var jS={SMTPCreated:qP,SMTPUpdated:KP};async function QP(t,e){let r={name:t,environments:e};await A("environment_variable:created",r)}s(QP,"created");async function jP(t){let e={name:t};await A("environment_variable:deleted",e)}s(jP,"deleted");async function YP(t){let e={userId:t};await A("environment_variable:upgrade_panel_opened",e)}s(YP,"upgradePanelOpened");var YS={created:QP,deleted:jP,upgradePanelOpened:YP};async function HP(t,e){let r={groupId:t._id,viaScim:pt(),audited:{name:t.name}};await A("user_group:created",r,e)}s(HP,"created");async function zP(t){let e={groupId:t._id,viaScim:pt(),audited:{name:t.name}};await A("user_group:updated",e)}s(zP,"updated");async function JP(t){let e={groupId:t._id,viaScim:pt(),audited:{name:t.name}};await A("user_group:deleted",e)}s(JP,"deleted");async function ZP(t,e,r){let n={count:t,groupId:e._id,userIds:r,viaScim:pt(),audited:{name:e.name}};await A("user_group:user_added",n)}s(ZP,"usersAdded");async function XP(t,e,r){let n={count:t,groupId:e._id,userIds:r,viaScim:pt(),audited:{name:e.name}};await A("user_group:users_deleted",n)}s(XP,"usersDeleted");async function eN(t){let e={groupId:t,onboarding:!0};await A("user_group:onboarding_added",e)}s(eN,"createdOnboarding");async function tN(t){let e={permissions:t.roles,groupId:t._id,audited:{name:t.name}};await A("user_group:permissions_edited",e)}s(tN,"permissionsEdited");var HS={created:HP,updated:zP,deleted:JP,usersAdded:ZP,usersDeleted:XP,createdOnboarding:eN,permissionsEdited:tN};async function rN(t){let e={currentVersion:t};await A("installation:version:checked",e)}s(rN,"versionChecked");async function nN(t,e){let r={from:t,to:e};await A("installation:version:upgraded",r)}s(nN,"upgraded");async function iN(t,e){let r={from:t,to:e};await A("installation:version:downgraded",r)}s(iN,"downgraded");async function sN(){let t={};await A("installation:firstStartup",t)}s(sN,"firstStartup");var ho={versionChecked:rN,upgraded:nN,downgraded:iN,firstStartup:sN};async function oN(t,e){let r={layoutId:t._id};await A("layout:created",r,e)}s(oN,"created");async function aN(t){let e={layoutId:t};await A("layout:deleted",e)}s(aN,"deleted");var zS={created:oN,deleted:aN};async function uN(t,e){let r={accountId:t.accountId,...e};await A("license:plan:changed",r)}s(uN,"planChanged");async function cN(t){let e={accountId:t.accountId};await A("license:activated",e)}s(cN,"activated");async function lN(t){let e={accountId:t.accountId};await A("license:checkout:opened",e)}s(lN,"checkoutOpened");async function dN(t){let e={accountId:t.accountId};await A("license:checkout:success",e)}s(dN,"checkoutSuccess");async function fN(t){let e={accountId:t.accountId};await A("license:portal:opened",e)}s(fN,"portalOpened");async function pN(t){let e={accountId:t.accountId};await A("license:payment:failed",e)}s(pN,"paymentFailed");async function mN(t){let e={accountId:t.accountId};await A("license:payment:recovered",e)}s(mN,"paymentRecovered");var JS={planChanged:uN,activated:cN,checkoutOpened:lN,checkoutSuccess:dN,portalOpened:fN,paymentFailed:pN,paymentRecovered:mN};async function hN(t){let e={};await A("org:info:name:updated",e,t)}s(hN,"nameUpdated");async function EN(t){let e={};await A("org:info:logo:updated",e,t)}s(EN,"logoUpdated");async function gN(t){let e={};await A("org:platformurl:updated",e,t)}s(gN,"platformURLUpdated");async function yN(){let t={};await A("analytics:opt:out",t)}s(yN,"analyticsOptOut");async function TN(){let t={};await A("analytics:opt:out",t)}s(TN,"analyticsOptIn");var ZS={nameUpdated:hN,logoUpdated:EN,platformURLUpdated:gN,analyticsOptOut:yN,analyticsOptIn:TN};async function SN(t){let e={type:t.schema.type,name:t.name,description:t.description,version:t.version};await A("plugin:init",e)}s(SN,"init");async function AN(t){let e={pluginId:t._id,type:t.schema.type,source:t.source,name:t.name,description:t.description,version:t.version};await A("plugin:imported",e)}s(AN,"imported");async function _N(t){let e={pluginId:t._id,type:t.schema.type,name:t.name,description:t.description,version:t.version};await A("plugin:deleted",e)}s(_N,"deleted");var XS={init:SN,imported:AN,deleted:_N};var ON=s(async(t,e,r)=>{let n={queryId:e._id,datasourceId:t._id,source:t.source,queryVerb:e.queryVerb};await A("query:created",n,r)},"created"),IN=s(async(t,e)=>{let r={queryId:e._id,datasourceId:t._id,source:t.source,queryVerb:e.queryVerb};await A("query:updated",r)},"updated"),wN=s(async(t,e,r)=>{let n={queryId:e._id,datasourceId:t._id,source:t.source,queryVerb:e.queryVerb,appId:r};await A("query:deleted",n)},"deleted"),DN=s(async(t,e,r)=>{let n={datasourceId:t._id,source:t.source,count:r,importSource:e};await A("query:import",n)},"imported"),RN=s(async(t,e)=>{let r={count:t};await A("queries:run",r,e)},"run"),CN=s(async(t,e)=>{let r={queryId:e.queryId,datasourceId:t._id,source:t.source,queryVerb:e.queryVerb};await A("query:previewed",r)},"previewed"),eA={created:ON,updated:IN,deleted:wN,imported:DN,run:RN,previewed:CN};async function bN({resource:t,fromWorkspace:e,toWorkspace:r},n){let i={resource:t,fromWorkspace:e,toWorkspace:r};await A("resource:copied_to_workspace",i,n)}s(bN,"duplicatedToWorkspace");var tA={duplicatedToWorkspace:bN};async function xN(t,e){let r={roleId:t._id,permissionId:t.permissionId,inherits:t.inherits};await A("role:created",r,e)}s(xN,"created");async function vN(t){let e={roleId:t._id,permissionId:t.permissionId,inherits:t.inherits};await A("role:updated",e)}s(vN,"updated");async function PN(t){let e={roleId:t._id,permissionId:t.permissionId,inherits:t.inherits};await A("role:deleted",e)}s(PN,"deleted");async function NN(t,e,r){let n={userId:t._id,roleId:e};await A("role:assigned",n,r)}s(NN,"assigned");async function UN(t,e){let r={userId:t._id,roleId:e};await A("role:unassigned",r)}s(UN,"unassigned");var So={created:xN,updated:vN,deleted:PN,assigned:NN,unassigned:UN};async function LN(t,e){await A("row_action:created",t,e)}s(LN,"created");var rA={created:LN};var kN=s(async(t,e)=>{let r={count:t};await A("rows:created",r,e)},"created"),MN=s(async(t,e)=>{let r={tableId:t._id,count:e};await A("rows:imported",r)},"imported"),nA={created:kN,imported:MN};async function FN(t,e){let r={layoutId:t.layoutId,screenId:t._id,roleId:t.routing.roleId,audited:{name:t.routing?.route}};await A("screen:created",r,e)}s(FN,"created");async function BN(t){let e={layoutId:t.layoutId,screenId:t._id,roleId:t.routing.roleId,audited:{name:t.routing?.route}};await A("screen:deleted",e)}s(BN,"deleted");var iA={created:FN,deleted:BN};async function WN(t){let e={timezone:t};await A("served:builder",e)}s(WN,"servedBuilder");async function $N(t,e,r){let n={appVersion:t.version,timezone:e,embed:r===!0};await A("served:app",n)}s($N,"servedApp");async function VN(t,e){let r={appId:t.appId,appVersion:t.version,timezone:e};await A("served:app:preview",r)}s(VN,"servedAppPreview");var sA={servedBuilder:WN,servedApp:$N,servedAppPreview:VN};async function GN(t,e){let r={tableId:t._id,audited:{name:t.name}};await A("table:created",r,e)}s(GN,"created");async function qN(t,e){let r,n;for(let o in e.schema)if(!t.schema[o]){let a=e.schema[o];"default"in a&&a.default!=null&&(r=!0),a.type==="ai"&&(n=a.operation)}let i={tableId:e._id,defaultValues:r,aiColumn:n,audited:{name:e.name}};(r||n)&&await A("table:updated",i)}s(qN,"updated");async function KN(t,e){let r={tableId:t._id,audited:{name:t.name},appId:e};await A("table:deleted",r)}s(KN,"deleted");async function QN(t,e){let r={tableId:t._id,format:e,audited:{name:t.name}};await A("table:exported",r)}s(QN,"exported");async function jN(t){let e={tableId:t._id,audited:{name:t.name}};await A("table:imported",e)}s(jN,"imported");var oA={created:GN,updated:qN,deleted:KN,exported:QN,imported:jN};async function YN(t,e){let r={userId:t._id,viaScim:pt(),audited:{email:t.email}};await A("user:created",r,e)}s(YN,"created");async function HN(t){let e={userId:t._id,viaScim:pt(),audited:{email:t.email}};await A("user:updated",e)}s(HN,"updated");async function zN(t){let e={userId:t._id,viaScim:pt(),audited:{email:t.email}};await A("user:deleted",e)}s(zN,"deleted");async function JN(t,e){let r={userId:t._id,audited:{email:t.email}};await A("user:admin:assigned",r,e)}s(JN,"permissionAdminAssigned");async function ZN(t){let e={userId:t._id,audited:{email:t.email}};await A("user:admin:removed",e)}s(ZN,"permissionAdminRemoved");async function XN(t,e){let r={userId:t._id,audited:{email:t.email}};await A("user:builder:assigned",r,e)}s(XN,"permissionBuilderAssigned");async function eU(t){let e={userId:t._id,audited:{email:t.email}};await A("user:builder:removed",e)}s(eU,"permissionBuilderRemoved");async function tU(t){let e={audited:{email:t}};await A("user:invited",e)}s(tU,"invited");async function rU(t){let e={userId:t._id,audited:{email:t.email}};await A("user:invite:accepted",e)}s(rU,"inviteAccepted");async function nU(t){let e={userId:t._id,audited:{email:t.email}};await A("user:password:force:reset",e)}s(nU,"passwordForceReset");async function iU(t){let e={userId:t._id,audited:{email:t.email}};await A("user:password:updated",e)}s(iU,"passwordUpdated");async function sU(t){let e={userId:t._id,audited:{email:t.email}};await A("user:password:reset:requested",e)}s(sU,"passwordResetRequested");async function oU(t){let e={userId:t._id,audited:{email:t.email}};await A("user:password:reset",e)}s(oU,"passwordReset");async function aU(t){let e={users:t};await A("user:data:collaboration",e)}s(aU,"dataCollaboration");var Me={created:YN,updated:HN,deleted:zN,permissionAdminAssigned:JN,permissionAdminRemoved:ZN,permissionBuilderAssigned:XN,permissionBuilderRemoved:eU,invited:tU,inviteAccepted:rU,passwordForceReset:nU,passwordUpdated:iU,passwordResetRequested:sU,passwordReset:oU,dataCollaboration:aU};async function uU(t,e){let r={name:t.name,type:t.type,tableId:t.tableId};await A("view:created",r,e)}s(uU,"created");async function cU(t){let e={tableId:t.tableId};await A("view:updated",e)}s(cU,"updated");async function lU(t,e){let r={...Ne.views.isV2(t)?{id:t.id,tableId:t.tableId,appId:e}:{}};await A("view:deleted",r)}s(lU,"deleted");async function dU(t,e){let r={tableId:t._id,format:e};await A("view:exported",r)}s(dU,"exported");async function fU({tableId:t,filterGroups:e},r){let n={tableId:t,filterGroups:e};await A("view:filter:created",n,r)}s(fU,"filterCreated");async function pU({tableId:t,filterGroups:e}){let r={tableId:t,filterGroups:e};await A("view:filter:updated",r)}s(pU,"filterUpdated");async function mU(t){let e={tableId:t.tableId};await A("view:filter:deleted",e)}s(mU,"filterDeleted");async function hU({tableId:t,calculationType:e},r){let n={tableId:t,calculation:e};await A("view:calculation:created",n,r)}s(hU,"calculationCreated");async function EU(t){let e={tableId:t.tableId,calculation:t.calculation};await A("view:calculation:updated",e)}s(EU,"calculationUpdated");async function gU(t){let e={tableId:t.tableId,calculation:t.calculation};await A("view:calculation:deleted",e)}s(gU,"calculationDeleted");async function yU(t,e){let r={tableId:t};await A("view:join:created",r,e)}s(yU,"viewJoinCreated");var aA={created:uU,updated:cU,deleted:lU,exported:dU,filterCreated:fU,filterUpdated:pU,filterDeleted:mU,calculationCreated:hU,calculationUpdated:EU,calculationDeleted:gU,viewJoinCreated:yU};async function TU(t,e){let r={workspaceAppId:t._id,audited:{name:t.name},appId:e};await A("workspace_app:deleted",r)}s(TU,"deleted");var uA={deleted:TU};function SU(){}s(SU,"initAsyncEvents");var AU=s(async()=>{await Ht.shutdown(),console.log("Events shutdown")},"shutdown");var Rp={};N(Rp,{creatorsInList:()=>gn,getAccountHolderFromUsers:()=>zu,hasAdminPermissions:()=>Ir,hasAppBuilderPermissions:()=>pA,hasBuilderPermissions:()=>ke,isAdmin:()=>Rt,isAdminOrBuilder:()=>fA,isAdminOrWorkspaceBuilder:()=>ju,isBuilder:()=>Ei,isCreatorAsync:()=>_o,isCreatorSync:()=>Yu,isGlobalBuilder:()=>dA,validateUniqueUser:()=>Hu});async function Dp(t){let e=[],r=await cA(t);e.push(...r.map(a=>a.email));let n=await lA(t);e.push(...n.map(a=>a._id));let i=await pi(t);e.push(...i.map(a=>a.email));let o=await ip(t);return e.push(...o.map(a=>a.email)),[...new Set(e.map(a=>a.toLowerCase()))]}s(Dp,"searchExistingEmails");async function Qu(t){return await Gs("platform_users_lowercase_2",{keys:[t.toLowerCase()],include_docs:!0})}s(Qu,"getPlatformUsers");async function Ao(t){return(await Qu(t))[0]??null}s(Ao,"getFirstPlatformUser");async function cA(t){let r={keys:t.map(i=>i.toLowerCase()),include_docs:!0},n={arrayResponse:!0};return await $t("by_email2",r,void 0,n)}s(cA,"getExistingTenantUsers");async function lA(t){let r={keys:t.map(n=>n.toLowerCase()),include_docs:!0};return await Gs("platform_users_lowercase_2",r)}s(lA,"getExistingPlatformUsers");async function pi(t){let r={keys:t.map(n=>n.toLowerCase()),include_docs:!0};return await Gs("account_by_email",r)}s(pi,"getExistingAccounts");var Ei=Ue.users.isBuilder,Rt=Ue.users.isAdmin,dA=Ue.users.isGlobalBuilder,fA=Ue.users.isAdminOrBuilder,Ir=Ue.users.hasAdminPermissions,ke=Ue.users.hasBuilderPermissions,pA=Ue.users.hasAppBuilderPermissions,ju=Ue.users.isAdminOrWorkspaceBuilder;async function gn(t,e){let r=[...new Set(t.filter(i=>i.userGroups).flatMap(i=>i.userGroups))];return e=await H().getMultiple(r,{allowMissing:!0}),t.map(i=>Yu(i,e))}s(gn,"creatorsInList");async function _o(t){let e=[];return t.userGroups&&(e=await H().getMultiple(t.userGroups)),Yu(t,e)}s(_o,"isCreatorAsync");function Yu(t,e){let r=Ue.users.isCreator(t);return!r&&t?_U(t,e):r}s(Yu,"isCreatorSync");function _U(t,e){let r=e?.filter(n=>t.userGroups?.indexOf(n._id)!==-1);return r&&r.length>0?r.some(n=>Object.values(n.roles||{}).includes("CREATOR")):!1}s(_U,"isCreatorByGroupMembership");async function Hu(t,e){if(E.MULTI_TENANCY){let r=await Ao(t);if(r!=null&&r.tenantId!==e)throw new Yt(t)}if(!E.SELF_HOSTED&&!E.DISABLE_ACCOUNT_PORTAL){let r=await Or(t);if(r&&r.verified&&r.tenantId!==e)throw new Yt(t)}}s(Hu,"validateUniqueUser");async function zu(t){if(!E.SELF_HOSTED&&!E.DISABLE_ACCOUNT_PORTAL){let e=await pi(t.map(r=>r.email));return t.find(r=>e.map(n=>n.email).includes(r.email))}}s(zu,"getAccountHolderFromUsers");var Cp=s(async t=>{await Me.deleted(t),ke(t)&&await Me.permissionBuilderRemoved(t),Ir(t)&&await Me.permissionAdminRemoved(t)},"handleDeleteEvents"),OU=s(async(t,e,r)=>{for(let[n,i]of Object.entries(e))(!r||r[n]!==i)&&await So.assigned(t,i)},"assignAppRoleEvents"),IU=s(async(t,e,r)=>{if(r)for(let[n,i]of Object.entries(r))(!e||e[n]!==i)&&await So.unassigned(t,i)},"unassignAppRoleEvents"),wU=s(async(t,e)=>{let r=t.roles,n=e?.roles;await OU(t,r,n),await IU(t,r,n)},"handleAppRoleEvents"),bp=s(async(t,e)=>{let r=G(),n;!E.SELF_HOSTED&&!E.DISABLE_ACCOUNT_PORTAL&&(n=await ai(r)),await yt.identifyUser(t,n),e?(await Me.updated(t),RU(t,e)&&await Me.permissionBuilderRemoved(t),bU(t,e)&&await Me.permissionAdminRemoved(t),!e.forceResetPassword&&t.forceResetPassword&&t.password&&await Me.passwordForceReset(t),t.password!==e.password&&await Me.passwordUpdated(t)):await Me.created(t),DU(t,e)&&await Me.permissionBuilderAssigned(t),CU(t,e)&&await Me.permissionAdminAssigned(t),await wU(t,e)},"handleSaveEvents"),DU=s((t,e)=>mA(t,e,ke),"isAddingBuilder"),RU=s((t,e)=>hA(t,e,ke),"isRemovingBuilder"),CU=s((t,e)=>mA(t,e,Ir),"isAddingAdmin"),bU=s((t,e)=>hA(t,e,Ir),"isRemovingAdmin"),mA=s((t,e,r)=>!(!r(t)||e&&r(e)),"isAddingPermission"),hA=s((t,e,r)=>!(r(t)||!e||!r(e)),"isRemovingPermission");var vU=s(async t=>{let e=t._id;await Et.removeUser(t),await Cp(t),await wr.invalidateUser(e),await hn(e,{reason:"bulk-deletion"})},"bulkDeleteProcessing"),Ct=class t{static{s(this,"UserDB")}static init(e,r,n){t.quotas=e,t.groups=r,t.features=n}static async isPreventPasswordActions(e,r){return E.ENABLE_SSO_MAINTENANCE_MODE&&Rt(e)?!1:await t.features.isSSOEnforced()||Go(e)?!0:(r||(r=await ai(G())),!!(r&&r.email===e.email&&Vo(r)))}static async buildUser(e,r={hashPassword:!0,requirePassword:!0},n,i,o){let{password:a,_id:u}=e;i&&!i.password&&(r.requirePassword=!1);let c;if(a&&a!==i?.password){if(await t.isPreventPasswordActions(e,o))throw new we("Password change is disabled for this user",400);if(!r.skipPasswordValidation){let f=fp(a);if(!f.valid)throw new we(f.error,400)}c=r.hashPassword?await Ld(a):a}else i&&(c=i.password);let l=r.requirePassword&&!await t.features.isSSOEnforced();if(!c&&l)throw"Password must be specified.";u=u||Zn();let d={createdAt:Date.now(),...i,...e,_id:u,password:c,tenantId:n};return d.roles||(d.roles={}),d.status==null&&(d.status="active"),d}static async allUsers(){return(await H().allDocs(nn(null,{include_docs:!0}))).rows.map(n=>n.doc)}static async countUsersByApp(e){return{userCount:(await Zu(e,{})).length}}static async getUsersByAppAccess(e){return await xp(e.appId,{limit:e.limit||50})}static async getUserByEmail(e){return Tt(e)}static async getUser(e){let r=await yn(e);return r&&delete r.password,r}static async bulkGet(e){return await Ju(e)}static async bulkUpdate(e){return await Oo(e)}static async save(e,r={}){r.hashPassword==null&&(r.hashPassword=!0),r.requirePassword==null&&(r.requirePassword=!0);let n=G(),i=H(),{email:o,_id:a,userGroups:u=[],roles:c}=e;if(!o&&!a)throw new Error("_id or email is required");let l;if(a)try{if(l=await yn(a),o&&l.email!==o&&!r.allowChangingEmail)throw new Error("Email address cannot be changed")}catch(p){if(p.status!==404)throw p}if(!l&&o&&(l=await Tt(o),l&&l._id!==a))throw new Yt(o);let d=1,f=0;if((r.isAccountHolder||l)&&(d=0,f=1),l){let[p,m]=await gn([l,e]);f=p!==m?1:0}return t.quotas.addUsers(d,f,async()=>{r.isAccountHolder||await Hu(o,n);let p=await t.buildUser(e,r,n,l);r.currentUserId&&r.currentUserId===l?._id&&(p=vp(p,l)),!l&&c?.length&&(p.roles={...c});let m=[];if(!a&&u.length>0)for(let h of u)m.push(t.groups.addUsers(h,[p._id]));try{let h=await i.put(p);return p._rev=h.rev,await bp(p,l),l&&p.email!==l.email&&await Et.removeUser({email:l.email}),await Et.addUser(n,p._id,p.email,p.ssoId),await wr.invalidateUser(h.id),await Promise.all(m),i.get(p._id)}catch(h){throw h.status===409?"User exists already":h}})}static async bulkCreate(e,r){let n=G(),i=[],o=[],a=[],u=e.map(p=>p.email),c=await Dp(u),l=[];for(let p of e){let m=o.find(g=>g.email.toLowerCase()===p.email.toLowerCase()),h=c.includes(p.email.toLowerCase());if(m||h){l.push({email:p.email,reason:"Unavailable"});continue}p.userGroups=r||[],o.push(p),await _o(p)&&a.push(p)}let d=await ai(n),f=await t.features.isSSOEnforced();return t.quotas.addUsers(o.length,a.length,async()=>{for(let h of o)f&&delete h.password,i.push(t.buildUser(h,{hashPassword:!0,requirePassword:!f},n,void 0,d));let p=await Promise.all(i);await Oo(p);for(let h of p)await Et.addUser(n,h._id,h.email),await bp(h,void 0);let m=p.map(h=>({_id:h._id,email:h.email}));if(Array.isArray(m)&&r){let h=[],g=m.map(y=>y._id);for(let y of r)h.push(t.groups.addUsers(y,g));await Promise.all(h)}return{successful:m,unsuccessful:l}})}static async bulkDelete(e){let r=H(),n={successful:[],unsuccessful:[]},i=await zu(e);i&&(e=e.filter(m=>m.userId!==i.userId),n.unsuccessful.push({_id:i.userId,email:i.email,reason:"Account holder cannot be deleted"}));let a=(await r.allDocs({include_docs:!0,keys:e.map(m=>m.userId)})).rows.map(m=>m.doc),u=a.map(m=>({...m,_deleted:!0})),c=await Oo(u),d=(await gn(a)).filter(m=>m).length,f=[];for(let m of a){let g=(await Ao(m._id)).ssoId;g&&(await Qu(g)).filter(S=>S.ssoId==null).forEach(S=>{f.push({...S,_deleted:!0})}),await vU(m)}await _r().bulkDocs(f),await t.quotas.removeUsers(u.length,d);let p={};return a.reduce((m,h)=>(m[h._id]=h,m),p),c.forEach(m=>{let h=p[m.id].email;m.ok?n.successful.push({_id:m.id,email:h}):n.unsuccessful.push({_id:m.id,email:h,reason:"Database error"})}),n}static async destroy(e){let r=H(),n=await r.get(e),i=n._id;if(!E.SELF_HOSTED&&!E.DISABLE_ACCOUNT_PORTAL){let a=n.email;if(await Or(a))throw n.userId===Ft()._id?new we('Please visit "Account" to delete this user',400):new we("Account holder cannot be deleted",400)}await Et.removeUser(n),await r.remove(i,n._rev);let o=await _o(n)?1:0;await t.quotas.removeUsers(1,o),await Cp(n),await wr.invalidateUser(i),await hn(i,{reason:"deletion"})}static async createAdminUser(e,r,n){let i=n?.password,o={email:e,password:i,createdAt:Date.now(),roles:{},builder:{global:!0},admin:{global:!0},tenantId:r,firstName:n?.firstName,lastName:n?.lastName};return n?.ssoId&&(o.ssoId=n.ssoId),await oi(ye.CHECKLIST),await t.save(o,{hashPassword:n?.hashPassword,requirePassword:n?.requirePassword,skipPasswordValidation:n?.skipPasswordValidation,isAccountHolder:!0})}static async getGroups(e){return await this.groups.getBulk(e)}static async getGroupBuilderAppIds(e){return await this.groups.getGroupBuilderAppIds(e)}};function wo(t){return Array.isArray(t)?t.map(e=>{if(e)return delete e.password,e}):t&&(delete t.password,t)}s(wo,"removeUserPassword");async function Ju(t,e){let n=(await H().allDocs({keys:t,include_docs:!0})).rows.map(i=>i.doc);return e?.cleanup&&(n=wo(n)),n}s(Ju,"bulkGetGlobalUsersById");async function NU(){let t=H(),e=`us${b}`;return(await t.allDocs({startkey:e,endkey:`${e}${ve}`})).rows.map(n=>n.id)}s(NU,"getAllUserIds");async function UU(){let t=H(),e=`us${b}`;return(await t.allDocs({startkey:e,endkey:`${e}${ve}`,include_docs:!0})).rows.map(n=>n.doc)}s(UU,"getAllUsers");async function Oo(t){return await H().bulkDocs(t)}s(Oo,"bulkUpdateGlobalUsers");async function yn(t,e){let n=await H().get(t);return e?.cleanup&&(n=wo(n)),n}s(yn,"getById");async function Tt(t,e){if(t==null)throw"Must supply an email address to view";let r=await $t("by_email2",{key:t.toLowerCase(),include_docs:!0});if(Array.isArray(r))throw new Error(`Multiple users found with email address: ${t}`);let n=r;return e?.cleanup&&(n=wo(n)),n}s(Tt,"getGlobalUserByEmail");async function LU(t){try{let e=await Tt(t);if(Array.isArray(e)||e!=null)return!0}catch{return!1}return!1}s(LU,"doesUserExist");async function Zu(t,e,r){if(typeof t!="string")throw new Error("Must provide a string based workspace ID");let n=ru(t,{include_docs:!0});n.startkey=e&&e.startkey?e.startkey:n.startkey;let i=await $t("by_app",n);i||(i=[]);let o=Array.isArray(i)?i:[i];return r?.cleanup&&(o=wo(o)),o}s(Zu,"searchGlobalUsersByApp");async function xp(t,e){let r=`roles.${t}`,n=[{"builder.global":!0},{"admin.global":!0}];if(t){let a={[r]:{$exists:!0}};n.push(a)}return(await H().find({selector:{$or:n,_id:{$regex:"^us_"}},limit:e?.limit||50})).docs}s(xp,"searchGlobalUsersByAppAccess");function EA(t,e){if(e)return tu(Qe(t),e._id)}s(EA,"getGlobalUserByAppPage");async function gA(t,e,r){if(typeof t!="string")throw new Error("Must provide a string to search by");let n=t.toLowerCase(),i=e&&e.startkey?e.startkey:n,o=await $t("by_email2",{...e,startkey:i,endkey:`${n}${ve}`});o||(o=[]);let a=Array.isArray(o)?o:[o];return r?.cleanup&&(a=wo(a)),a}s(gA,"searchGlobalUsersByEmail");var kU=8;async function yA({bookmark:t,query:e,appId:r,limit:n}={}){let i=H(),o=n??kU,u={include_docs:!0,limit:o+1};t&&(u.startkey=t);let c,l="_id",d;return e?.equal?._id?c=[await yn(e.equal._id)]:r?(c=await Zu(r,u),d=s(f=>EA(r,f),"getKey")):e?.string?.email?(c=await gA(e?.string?.email,u),l="email"):e?.oneOf?._id?c=await Ju(e?.oneOf?._id,{cleanup:!0}):e?(c=(await i.allDocs(nn(null,{...u,limit:void 0}))).rows.map(p=>p.doc),c=cr.search(c,{query:e,limit:u.limit}).rows):c=(await i.allDocs(nn(null,u))).rows.map(p=>p.doc),Tf(c,o,{paginate:!0,property:l,getKey:d})}s(yA,"paginatedUsers");async function MU(){return(await _f("by_email2",{limit:0,include_docs:!1})).total_rows}s(MU,"getUserCount");async function FU(){let t=0;async function e(r){let n=await yA({bookmark:r}),i=await gn(n.data);t+=i.filter(o=>o).length,n.hasNextPage&&await e(n.nextPage)}return s(e,"iterate"),await e(),t}s(FU,"getCreatorCount");function BU(t){return delete t.admin,delete t.builder,t}s(BU,"removePortalUserPermissions");function vp(t,e){return delete t.admin,delete t.builder,delete t.roles,e&&(t.admin=e.admin,t.builder=e.builder,t.roles=e.roles),t}s(vp,"cleanseUserObject");async function WU(t,e){let r=Qe(e);t.builder??={},t.builder.creator=!0,t.builder.apps??=[],t.builder.apps.push(r),await Ct.save(t,{hashPassword:!1})}s(WU,"addAppBuilder");async function $U(t,e){let r=Qe(e);t.builder&&t.builder.apps?.includes(r)&&(t.builder.apps=t.builder.apps.filter(n=>n!==r)),await Ct.save(t,{hashPassword:!1})}s($U,"removeAppBuilder");var TA=3600;async function VU(t,e){let n=await wf(e).get(t);if(n.budibaseAccess=!0,!E.SELF_HOSTED&&!E.DISABLE_ACCOUNT_PORTAL){let i=await Or(n.email);i&&(n.account=i,n.accountPortalAccess=!0)}return n}s(VU,"populateFromDB");async function GU(t){let e=await Ct.bulkGet(t),r=t.filter((i,o)=>!e[o]),n=e.filter(i=>i);return await Promise.all(n.map(async i=>{if(i.budibaseAccess=!0,!E.SELF_HOSTED&&!E.DISABLE_ACCOUNT_PORTAL){let o=await Or(i.email);o&&(i.account=o,i.accountPortalAccess=!0)}})),r.length?{users:n,notFoundIds:r}:{users:n}}s(GU,"populateUsersFromDB");async function Do({userId:t,tenantId:e,email:r,populateUser:n}){if(n||(n=VU),!e)try{e=G()}catch{e=await Et.lookupTenantId(t)}let i=await Ms(),o=await i.get(t);return o||(o=await n(t,e,r),await i.store(t,o,TA)),o&&!o.tenantId&&e&&(o.tenantId=e),o.userGroups&&!Ue.users.isGlobalBuilder(o)&&await Re(e,async()=>{let a=await Ct.getGroupBuilderAppIds(o);if(a.length){let u=o.builder?.apps||[];o.builder={apps:[...new Set(u.concat(a))]}}}),o}s(Do,"getUser");async function qU(t){let e=await Ms(),r=await e.bulkGet(t),n=t.filter(a=>!r[a]),i=Object.values(r).filter(a=>!!a),o;if(n.length){let a=await GU(n);o=a.notFoundIds;for(let u of a.users)await e.store(u._id,u,TA);i.push(...a.users)}return{users:i,notFoundIds:o}}s(qU,"getUsers");async function Ro(t){await(await Ms()).delete(t)}s(Ro,"invalidateUser");var kp={};N(kp,{Writethrough:()=>Up});var yi={};N(yi,{AUTO_EXTEND_POLLING_MS:()=>AA,doWithLock:()=>Pp,newRedlock:()=>Tn});var SA=F(require("redlock"));async function QU(t,e){if(t==="custom")return Tn(e);switch(t){case"try_once":return Tn(gi.TRY_ONCE);case"try_twice":return Tn(gi.TRY_TWICE);case"default":return Tn(gi.DEFAULT);case"delay_500":return Tn(gi.DELAY_500);case"auto_extend":return Tn(gi.AUTO_EXTEND);default:throw St.unreachable(t)}}s(QU,"getClient");var gi={TRY_ONCE:{retryCount:0},TRY_TWICE:{retryCount:1},DEFAULT:{driftFactor:.01,retryCount:10,retryDelay:200,retryJitter:100},DELAY_500:{retryDelay:500},CUSTOM:{},AUTO_EXTEND:{retryCount:-1}};async function Tn(t={}){let e={...gi.DEFAULT,...t},n=(await pf()).client;return new SA.default([n],e)}s(Tn,"newRedlock");function jU(t){let r=`lock:${t.systemLock?"system":G()}_${t.name}`;return t.resource&&(r=r+`_${t.resource}`),r}s(jU,"getLockName");var AA=Ee.fromSeconds(10).toMs();async function Pp(t,e){let r=await QU(t.type,t.customOptions),n,i;try{let o=jU(t),a=t.type==="auto_extend"?AA:t.ttl;if(n=await r.lock(o,a),t.type==="auto_extend"){let c=s(()=>{i=setTimeout(async()=>{n=await n.extend(a,()=>t.onExtend&&t.onExtend()),c()},a/2)},"extendInIntervals");c()}return{executed:!0,result:await e()}}catch(o){if(o.name==="LockError"){if(t.type==="try_once")return{executed:!1};throw o}else throw o}finally{clearTimeout(i),await n?.unlock()}}s(Pp,"doWithLock");var _A=1e4,Np=null;async function Xu(){if(!Np){let t=await ff();Np=new ln(t)}return Np}s(Xu,"getCache");function Co(t,e){return t.name+e}s(Co,"makeCacheKey");function Lp(t,e=null){return{doc:t,lastWrite:e||Date.now()}}s(Lp,"makeCacheItem");async function YU(t,e,r=_A){let n=await Xu(),i=e._id,o;i&&(o=await n.get(Co(t,i)));let a=!o||o.lastWrite<Date.now()-r,u=e;return a&&((await Pp({type:"try_once",name:"persist_writethrough",resource:i,ttl:15e3},async()=>{let l=s(async d=>{let f=await t.put(d,{force:!0});u._id=f.id,u._rev=f.rev},"writeDb");try{await l(e)}catch(d){if(d.status!==409)throw d;si("Ignoring conflict in write-through cache")}})).executed||si("Ignoring redlock conflict in write-through cache")),o=Lp(u,a?null:o?.lastWrite),u._id&&await n.store(Co(t,u._id),o),{ok:!0,id:u._id,rev:u._rev}}s(YU,"put");async function HU(t,e){let r=await Xu(),n=Co(t,e),i=await r.get(n);if(!i){let o=await t.get(e);i=Lp(o),await r.store(n,i)}return i.doc}s(HU,"get");async function zU(t,e){let r=await Xu(),n=Co(t,e),i=await r.get(n);if(!i){let o=await t.tryGet(e);if(!o)return null;i=Lp(o),await r.store(n,i)}return i.doc}s(zU,"tryGet");async function JU(t,e,r){let n=await Xu();if(!e)throw new Error("No ID/Rev provided.");let i=typeof e=="string"?e:e._id;r=typeof e=="string"?r:e._rev;try{await n.delete(Co(t,i))}finally{await t.remove(i,r)}}s(JU,"remove");var Up=class{static{s(this,"Writethrough")}constructor(e,r=_A){this.db=e,this.writeRateMs=r}async put(e,r=this.writeRateMs){return YU(this.db,e,r)}async get(e){return HU(this.db,e)}async tryGet(e){return zU(this.db,e)}async remove(e,r){return JU(this.db,e,r)}};function ec(t){return`config${b}${t}`}s(ec,"generateConfigID");async function rt(t){let e=H();try{return await e.get(ec(t))}catch(r){if(r.status===404)return;throw r}}s(rt,"getConfig");async function ZU(t){return t._id||(t._id=ec(t.type)),H().put(t)}s(ZU,"save");async function ni(){let t=await rt("settings");return t||(t={_id:ec("settings"),type:"settings",config:{}}),t.config.platformUrl=await bo({tenantAware:!0,config:t.config}),t.config.analyticsEnabled=await Wu({config:t.config}),t}s(ni,"getSettingsConfigDoc");async function Bp(){return(await ni()).config}s(Bp,"getSettingsConfig");async function bo(t={tenantAware:!0}){let e=E.PLATFORM_URL||"http://localhost:10000";if(!E.SELF_HOSTED&&E.MULTI_TENANCY&&t.tenantAware){let r=G();e.includes("localhost:")||(e=e.replace("://",`://${r}.`))}else if(E.SELF_HOSTED){let r=t?.config?t.config:(await rt("settings"))?.config;r?.platformUrl&&(e=r.platformUrl)}return e}s(bo,"getPlatformUrl");var Wu=s(async t=>{if(!E.SELF_HOSTED)return!!E.ENABLE_ANALYTICS;let e=await Ar(ye.ANALYTICS_ENABLED,86400,async()=>{let n=t?.config?t.config:(await rt("settings"))?.config;if(n?.analyticsEnabled===!1)return!1;if(n?.analyticsEnabled===!0)return!0});if(e!==void 0)return e;let r=E.ENABLE_ANALYTICS;return!(r===0||r===!1)},"analyticsEnabled");async function XU(){return await rt("google")}s(XU,"getGoogleConfigDoc");async function tc(){return(await XU())?.config}s(tc,"getGoogleConfig");async function Wp(){if(!E.SELF_HOSTED)return Mp();let t=await tc();return(!t||!t.activated)&&(t=Mp()),t}s(Wp,"getGoogleDatasourceConfig");function Mp(){if(E.GOOGLE_CLIENT_ID&&E.GOOGLE_CLIENT_SECRET)return{clientID:E.GOOGLE_CLIENT_ID,clientSecret:E.GOOGLE_CLIENT_SECRET,activated:!0}}s(Mp,"getDefaultGoogleConfig");async function eL(){return rt("logos_oidc")}s(eL,"getOIDCLogosDoc");async function tL(){return rt("oidc")}s(tL,"getOIDCConfigDoc");async function rL(){let t=(await tL())?.config;return t?.configs&&t.configs[0]}s(rL,"getOIDCConfig");async function $p(t){let e=(await rt("oidc"))?.config;return e&&e.configs.filter(r=>r.uuid===t)[0]}s($p,"getOIDCConfigById");async function OA(){return rt("smtp")}s(OA,"getSMTPConfigDoc");async function nL(t){let e=await OA();if(e)return e.config;let r=E.SELF_HOSTED||!t;if(E.SMTP_FALLBACK_ENABLED&&r)return{port:E.SMTP_PORT,host:E.SMTP_HOST,secure:!1,from:E.SMTP_FROM_ADDRESS,auth:{user:E.SMTP_USER,pass:E.SMTP_PASSWORD},fallback:!0}}s(nL,"getSMTPConfig");async function iL(){return(await rt("scim"))?.config}s(iL,"getSCIMConfig");async function sL(){return rt("ai")}s(sL,"getAIConfig");async function oL(){return rt("recaptcha")}s(oL,"getRecaptchaConfig");var Jp={};N(Jp,{AccessController:()=>qp,BUILTIN_ROLE_IDS:()=>Kp,Role:()=>Dr,RoleHierarchyTraversal:()=>rc,RoleIDVersion:()=>Qp,builtinRoleToNumber:()=>xo,checkForRoleResourceArray:()=>RA,externalRole:()=>fL,findRole:()=>vo,getAllRoleIds:()=>EL,getAllRoles:()=>zp,getBuiltinRole:()=>wA,getBuiltinRoles:()=>Yp,getDBRoleID:()=>CA,getExternalRoleID:()=>Rr,getExternalRoleIDs:()=>bA,getRole:()=>pL,getUserRoleHierarchy:()=>Hp,getUserRoleIdHierarchy:()=>DA,isBuiltin:()=>Sn,lowerBuiltinRoleID:()=>dL,prefixRoleIDNoBuiltin:()=>Gp,roleIDsAreEqual:()=>nt,roleToNumber:()=>lL,saveRoles:()=>mL,validInherits:()=>cL});var IA=require("lodash"),nc=F(require("lodash/fp/cloneDeep")),Vp=F(require("semver"));var Kp={ADMIN:"ADMIN",POWER:"POWER",BASIC:"BASIC",PUBLIC:"PUBLIC"},ie={...Kp,BUILDER:"BUILDER"},Qp={UUID:void 0,NAME:"name"};function uL(t,e){return Array.isArray(e)?e.filter(r=>t.includes(r)).length===e.length:t.includes(e)}s(uL,"rolesInList");var Dr=class{constructor(e,r,n,i){this.permissions={};this._id=e,this.name=r,this.uiMetadata=i,this.permissionId=n,this.version=Qp.NAME}static{s(this,"Role")}addInheritance(e){return e&&typeof e=="string"?e=Gp(e):e&&Array.isArray(e)&&(e=e.map(Gp)),this.inherits=e,this}},rc=class{static{s(this,"RoleHierarchyTraversal")}constructor(e,r){this.allRoles=e,this.opts=r}walk(e){let r=this.opts,n=this.allRoles,i=[];if(!e||!e._id)return i;if(i.push(e),Array.isArray(e.inherits))for(let o of e.inherits){let a=vo(o,n,r);a&&(i=i.concat(this.walk(a)))}else{let o=[],a=e;for(;a&&a.inherits&&!uL(o,a.inherits);){if(Array.isArray(a.inherits))return i.concat(this.walk(a));if(o.push(a.inherits),a=vo(a.inherits,n,r),a&&i.push(a),Ne.roles.checkForRoleInheritanceLoops(i))break}}return(0,IA.uniqBy)(i,o=>o._id)}},jp={ADMIN:new Dr(ie.ADMIN,ie.ADMIN,"admin",{displayName:"App admin",description:"Can do everything",color:"var(--spectrum-global-color-static-red-400)"}).addInheritance(ie.POWER),POWER:new Dr(ie.POWER,ie.POWER,"power",{displayName:"App power user",description:"An app user with more access",color:"var(--spectrum-global-color-static-orange-400)"}).addInheritance(ie.BASIC),BASIC:new Dr(ie.BASIC,ie.BASIC,"write",{displayName:"App user",description:"Any logged in user",color:"var(--spectrum-global-color-static-green-400)"}).addInheritance(ie.PUBLIC),PUBLIC:new Dr(ie.PUBLIC,ie.PUBLIC,"public",{displayName:"Public user",description:"Accessible to anyone",color:"var(--spectrum-global-color-static-blue-400)"}),BUILDER:new Dr(ie.BUILDER,ie.BUILDER,"admin",{displayName:"Builder user",description:"Users that can edit this app",color:"var(--spectrum-global-color-static-magenta-600)"})};function Yp(){return(0,nc.default)(jp)}s(Yp,"getBuiltinRoles");function Sn(t){return Object.values(Kp).includes(t)}s(Sn,"isBuiltin");function Gp(t){return Sn(t)?t:Bt(t)}s(Gp,"prefixRoleIDNoBuiltin");function wA(t){let e=Object.values(jp).find(r=>t.includes(r._id));if(e)return(0,nc.default)(e)}s(wA,"getBuiltinRole");function cL(t,e){if(!e)return!1;let r=s(n=>t.find(i=>nt(i._id,n)),"find");if(Array.isArray(e)){let n=e.filter(i=>r(i));return e.length!==0&&n.length===e.length}else return!!r(e)}s(cL,"validInherits");function xo(t){let e=Yp(),r=Object.values(e).length+1;if(nt(t,ie.ADMIN)||nt(t,ie.BUILDER))return r;let n=e[t],i=0;do{if(!n)break;if(Array.isArray(n.inherits))throw new Error("Built-in roles don't support multi-inheritance");n=e[n.inherits],i++}while(n!==null);return i}s(xo,"builtinRoleToNumber");async function lL(t){if(Sn(t))return xo(t);let e=await Hp(t,{defaultPublic:!0}),r=s(n=>{if(!n.inherits)return 0;if(Array.isArray(n.inherits)){let i=n.inherits.map(o=>{let a=e.find(u=>nt(u._id,o));if(a)return r(a)+1}).filter(o=>o).sort().pop();if(i!=null)return i}else if(Sn(n.inherits))return xo(n.inherits)+1;return 0},"findNumber");return Math.max(...e.map(r))}s(lL,"roleToNumber");function dL(t,e){return t?e&&xo(t)>xo(e)?e:t:e}s(dL,"lowerBuiltinRoleID");function nt(t,e){return Bt(t)===Bt(e)}s(nt,"roleIDsAreEqual");function fL(t){let e;return t._id&&(e=Rr(t._id)),{...t,_id:e,inherits:bA(t.inherits,t.version)}}s(fL,"externalRole");function vo(t,e,r){let n=wA(t);n||(t=Bt(t));let i=e.find(o=>o._id&&nt(o._id,t));return!i&&!Sn(t)&&r?.defaultPublic?(0,nc.default)(jp.PUBLIC):(n=Object.assign(n||{},i),n?._id&&(n._id=Rr(n._id,n.version)),Object.keys(n).length===0?void 0:n)}s(vo,"findRole");async function pL(t,e){let r=Jn(),n=[];if(!Sn(t)){let i=await r.tryGet(CA(t));i&&n.push(i)}return vo(t,n,e)}s(pL,"getRole");async function mL(t){await Jn().bulkDocs(t.filter(r=>r._id).map(r=>({...r,_id:Bt(r._id)})))}s(mL,"saveRoles");async function hL(t,e){let r=await zp();if(nt(t,ie.ADMIN))return r;let n=vo(t,r,e),i=[];return n&&(i=new rc(r,e).walk(n)),i}s(hL,"getAllUserRoles");async function DA(t){return(await Hp(t)).map(r=>r._id)}s(DA,"getUserRoleIdHierarchy");async function Hp(t,e){return hL(t,e)}s(Hp,"getUserRoleHierarchy");function RA(t,e){if(t&&!Array.isArray(t[e])){let r=t[e];t[e]=[r],r==="write"&&t[e].push("read")}return t}s(RA,"checkForRoleResourceArray");async function EL(t){return(await zp(t)).map(r=>r._id)}s(EL,"getAllRoleIds");async function zp(t){if(t)return Ke(t,e);{let r;try{r=Jn()}catch{}return e(r)}async function e(r){let n=[];r&&(n=(await r.allDocs(nu(null,{include_docs:!0}))).rows.map(u=>u.doc),n.forEach(u=>u._id=Rr(u._id,u.version)));let i=Yp(),o=[];!r||await gL(r)?o=[ie.ADMIN,ie.POWER,ie.BASIC,ie.PUBLIC]:o=[ie.ADMIN,ie.BASIC,ie.PUBLIC];for(let a of o){let u=i[a],c=n.filter(l=>nt(l._id,a))[0];c==null?n.push(u||i.BASIC):(n=n.filter(l=>l._id!==c._id),c._id=Rr(u._id,c.version),n.push({...u,...c,name:u.name,_id:Rr(u._id,u.version)}))}for(let a of n)if(a.permissions)for(let u of Object.keys(a.permissions))a.permissions=RA(a.permissions,u);return n}s(e,"internal")}s(zp,"getAllRoles");async function gL(t){let r=(await t.tryGet("app_metadata"))?.creationVersion;return!r||!Vp.default.valid(r)?!0:!Vp.default.gte(r,E.MIN_VERSION_WITHOUT_POWER_ROLE)}s(gL,"shouldIncludePowerRole");var qp=class{static{s(this,"AccessController")}constructor(){this.userHierarchies={}}async hasAccess(e,r){if(e==null||e===""||nt(e,ie.BUILDER)||nt(r,e)||nt(r,ie.BUILDER))return!0;let n=r?this.userHierarchies[r]:null;return!n&&r&&(n=await DA(r),this.userHierarchies[r]=n),n?.find(i=>nt(i,e))!==void 0}async checkScreensAccess(e,r){let n=[];for(let i of e){let o=await this.checkScreenAccess(i,r);o&&n.push(o)}return n}async checkScreenAccess(e,r){let n=e&&e.routing?e.routing.roleId:void 0;return await this.hasAccess(n,r)?e:null}};function CA(t){return t?.startsWith("role")?t:Bt(t)}s(CA,"getDBRoleID");function Rr(t,e){if(t.startsWith(`role${b}`)&&(Sn(t)||e===Qp.NAME)){let r=t.split(b);return r.shift(),r.join(b)}return t}s(Rr,"getExternalRoleID");function bA(t,e){return t&&(typeof t=="string"?Rr(t,e):t.map(r=>Rr(r,e)))}s(bA,"getExternalRoleIDs");var Zp={};N(Zp,{BUILDER:()=>_L,BUILTIN_PERMISSIONS:()=>ic,CREATOR:()=>OL,GLOBAL_BUILDER:()=>IL,PermissionImpl:()=>se,PermissionLevel:()=>wi,PermissionType:()=>Wo,doesHaveBasePermission:()=>SL,getAllowedLevels:()=>NA,getBuiltinPermissionByID:()=>TL,getBuiltinPermissions:()=>yL,isPermissionLevelHigherThanRead:()=>AL,levelToNumber:()=>PA});var xA=F(require("lodash/flatten")),vA=F(require("lodash/fp/cloneDeep"));var se=class{static{s(this,"PermissionImpl")}constructor(e,r){this.type=e,this.level=r}};function PA(t){switch(t){case"execute":return 0;case"read":return 1;case"write":return 2;case"admin":return 3;default:return-1}}s(PA,"levelToNumber");function NA(t){switch(t){case"execute":return["execute"];case"read":return["execute","read"];case"write":case"admin":return["execute","read","write"];default:return[]}}s(NA,"getAllowedLevels");var ic={PUBLIC:{_id:"public",name:"Public",permissions:[new se("webhook","execute")]},READ_ONLY:{_id:"read_only",name:"Read only",permissions:[new se("query","read"),new se("table","read"),new se("app","read")]},WRITE:{_id:"write",name:"Read/Write",permissions:[new se("query","write"),new se("table","write"),new se("automation","execute"),new se("legacy_view","read"),new se("app","read")]},POWER:{_id:"power",name:"Power",permissions:[new se("table","write"),new se("user","read"),new se("automation","execute"),new se("webhook","read"),new se("legacy_view","read"),new se("app","read")]},ADMIN:{_id:"admin",name:"Admin",permissions:[new se("table","admin"),new se("user","admin"),new se("automation","admin"),new se("webhook","read"),new se("query","admin"),new se("legacy_view","read"),new se("app","read")]}};function yL(){return(0,vA.default)(ic)}s(yL,"getBuiltinPermissions");function TL(t){return Object.values(ic).find(r=>r._id===t)}s(TL,"getBuiltinPermissionByID");function SL(t,e,r){let n=[...new Set(r.map(a=>a.permissionId))],i=Object.values(ic),o=(0,xA.default)(i.filter(a=>n.indexOf(a._id)!==-1).map(a=>a.permissions));for(let a of o)if(a.type===t&&NA(a.level).indexOf(e)!==-1)return!0;return!1}s(SL,"doesHaveBasePermission");function AL(t){return PA(t)>1}s(AL,"isPermissionLevelHigherThanRead");var _L="builder",OL="creator",IL="globalBuilder";var lm={};N(lm,{adminOnly:()=>sc,auditLog:()=>oc,authError:()=>Oe,buildAuthMiddleware:()=>a0,buildCsrfMiddleware:()=>c0,buildTenancyMiddleware:()=>u0,builderOnly:()=>fc,builderOrAdmin:()=>pc,google:()=>Jt,internalApi:()=>hc,joiValidator:()=>Po,oidc:()=>Zt,passport:()=>l0,platformLogout:()=>h0,refreshOAuthToken:()=>p0,ssoCallbackUrl:()=>br,updateUserOAuth:()=>m0,workspaceBuilderOrAdmin:()=>yc});var cm={};N(cm,{adminOnly:()=>sc,auditLog:()=>oc,authError:()=>Oe,authenticated:()=>dc,builderOnly:()=>fc,builderOrAdmin:()=>pc,correlation:()=>LA,csp:()=>qA,csrf:()=>mc,datasource:()=>s0,errorHandling:()=>QA,featureFlagCookie:()=>jA,google:()=>Jt,internalApi:()=>hc,ip:()=>YA,joiValidator:()=>Po,local:()=>Ti,oidc:()=>Zt,pino:()=>kA,querystringToBody:()=>t_,ssoCallbackUrl:()=>br,tenancy:()=>gc,workspaceBuilderOrAdmin:()=>yc});var UA=require("uuid");var wL=require("correlation-id"),LA=s((t,e)=>{let r=t.headers["x-budibase-correlation-id"];return r||(r=(0,UA.v4)()),wL.withId(r,()=>e())},"correlationMiddleware");var DL=require("koa-pino-logger"),RL=require("correlation-id");function CL(){return{logger:Iu,genReqId:RL.getId,autoLogging:{ignore:t=>!!t.url?.includes("/health")},serializers:{req:t=>({method:t.method,url:t.url,correlationId:t.id}),res:t=>({status:t.statusCode})}}}s(CL,"pinoSettings");function bL(){return E.HTTP_LOGGING?DL(CL()):(t,e)=>e()}s(bL,"getMiddleware");var kA=bL();var sc=s(async(t,e)=>(!t.internal&&!Rt(t.user)&&t.throw(403,"Admin user only endpoint."),e()),"adminOnly");var oc=s(async(t,e)=>e(),"auditLog");var xL=/\/:(.*?)(\/.*)?$/g,An=s(t=>t?t.map(e=>{let r=e.route,n=e.method,i=r.match(xL);if(i)for(let o of i){let u="/.*"+(o.endsWith("/")?"/":"");r=r.replace(o,u)}return{regex:new RegExp(r),method:n,route:r}}):[],"buildMatcherRegex"),_n=s((t,e)=>e.find(({regex:r,method:n})=>{let i=r.test(t.request.url),o=n==="ALL"?!0:t.request.method.toLowerCase()===n.toLowerCase();return i&&o}),"matches");var im={};N(im,{SecretOption:()=>BA,decrypt:()=>nm,decryptFile:()=>kL,encrypt:()=>NL,encryptFile:()=>UL,getSecret:()=>rm});var zt=F(require("crypto")),Cr=F(require("fs")),Xp=require("path"),em=F(require("zlib"));var ac="aes-256-ctr",FA="-",vL=1e4,PL=32,uc=16,tm=16,BA=(r=>(r.API="api",r.ENCRYPTION="encryption",r))(BA||{});function rm(t){let e,r;switch(t){case"encryption":e=E.ENCRYPTION_KEY,r="ENCRYPTION_KEY";break;case"api":default:e=E.API_ENCRYPTION_KEY,r="API_ENCRYPTION_KEY";break}if(!e)throw new Error(`Secret "${r}" has not been set in environment.`);return e}s(rm,"getSecret");function cc(t,e){return zt.default.pbkdf2Sync(t,new Uint8Array(e),vL,PL,"sha512")}s(cc,"stretchString");function NL(t,e="api"){let r=zt.default.randomBytes(uc),n=cc(rm(e),r),i=zt.default.createCipheriv(ac,new Uint8Array(n),new Uint8Array(r)),o=i.update(t,"utf8"),a=i.final(),u=Buffer.concat([new Uint8Array(o),new Uint8Array(a)]).toString("hex");return`${r.toString("hex")}${FA}${u}`}s(NL,"encrypt");function nm(t,e="api"){let[r,n]=t.split(FA),i=Buffer.from(r,"hex"),o=cc(rm(e),i),a=zt.default.createDecipheriv(ac,new Uint8Array(o),new Uint8Array(i)),u=a.update(n,"hex"),c=a.final();return Buffer.concat([new Uint8Array(u),new Uint8Array(c)]).toString()}s(nm,"decrypt");async function UL({dir:t,filename:e},r){let n=`${e}.enc`,i=(0,Xp.join)(t,e);if(Cr.default.lstatSync(i).isDirectory())throw new Error("Unable to encrypt directory");let o=Cr.default.createReadStream(i),a=Cr.default.createWriteStream((0,Xp.join)(t,n)),u=zt.default.randomBytes(uc),c=zt.default.randomBytes(tm),l=cc(r,u),d=zt.default.createCipheriv(ac,new Uint8Array(l),new Uint8Array(c));return a.write(u),a.write(c),o.pipe(em.default.createGzip()).pipe(d).pipe(a),new Promise(f=>{a.on("finish",()=>{f({filename:n,dir:t})})})}s(UL,"encryptFile");async function LL(t){let e=Cr.default.createReadStream(t),r=await MA(e,uc),n=await MA(e,tm);return e.close(),{salt:r,iv:n}}s(LL,"getSaltAndIV");async function kL(t,e,r){if(Cr.default.lstatSync(t).isDirectory())throw new Error("Unable to decrypt directory");let{salt:n,iv:i}=await LL(t),o=Cr.default.createReadStream(t,{start:uc+tm}),a=Cr.default.createWriteStream(e),u=cc(r,n),c=zt.default.createDecipheriv(ac,new Uint8Array(u),new Uint8Array(i)),l=em.default.createGunzip();return o.pipe(c).pipe(l).pipe(a),new Promise((d,f)=>{a.on("finish",()=>{a.close(),d()}),o.on("error",p=>{a.close(),f(p)}),c.on("error",p=>{a.close(),f(p)}),l.on("error",p=>{a.close(),f(p)}),a.on("error",p=>{a.close(),f(p)})})}s(kL,"decryptFile");function MA(t,e){return new Promise((r,n)=>{let i=0,o=[];t.on("readable",()=>{let a;for(;(a=t.read(e-i))!==null;)o.push(a),i+=a.length;r(Buffer.concat(o.map(u=>new Uint8Array(u))))}),t.on("end",()=>{n(new Error("Insufficient data in the stream."))}),t.on("error",a=>{n(a)})})}s(MA,"readBytes");var $A=F(require("dd-trace"));var ML=E.SESSION_UPDATE_PERIOD?parseInt(E.SESSION_UPDATE_PERIOD):60*1e3;function FL(){return new Date(Date.now()-ML).toISOString()}s(FL,"timeMinusOneMinute");function WA(t,e={}){t.publicEndpoint=e.publicEndpoint||!1,t.isAuthenticated=e.authenticated||!1,t.loginMethod=e.loginMethod,t.user=e.user,t.internal=e.internal||!1,t.version=e.version}s(WA,"finalise");async function BL(t,e){if(js(t))return{valid:!0,user:void 0};let n=nm(t).split(b)[0];return Re(n,async()=>{let i;try{let o=H();i=await $t("by_api_key",{key:t},o)}catch{i=void 0}if(i)return{valid:!0,user:await Do({userId:i,tenantId:n,populateUser:e})};throw new ci})}s(BL,"checkApiKey");function lc(t,e){let r=t.request.headers[e];if(Array.isArray(r))throw new Error("Unexpected header format");return r}s(lc,"getHeader");function dc(t=[],e={publicAllowed:!1}){let r=t?An(t):[];return async(n,i)=>{let o=!1,a=lc(n,"x-budibase-api-version");_n(n,r)&&(o=!0);try{let c=lc(n,"x-budibase-token"),l=Gt(n,"budibase:auth")||su(c),d=lc(n,"x-budibase-api-key");!d&&n.request.headers.authorization&&(d=n.request.headers.authorization.split(" ")[1]);let f=lc(n,"x-budibase-tenant-id"),p=!1,m,h=!1,g;if(l&&!d){let S=l.sessionId,O=l.userId,_;try{_=await hp(O,S),e&&e.populateUser?m=await Do({userId:O,tenantId:_.tenantId,email:_.email,populateUser:e.populateUser(n)}):m=await Do({userId:O,tenantId:_.tenantId,email:_.email}),m.csrfToken=_.csrfToken,g="cookie",_?.lastAccessedAt<FL()&&await mp(_),p=!0}catch(D){p=!1,console.error(`Auth Error: ${D.message}`),gr(n,"budibase:auth")}}if(!p&&d){let S=e.populateUser?e.populateUser(n):null,{valid:O,user:_}=await BL(d,S);O&&(p=!0,g="api_key",m=_,h=!_)}!m&&f?m={tenantId:f}:m&&"password"in m&&delete m.password,p||(p=!1);let y=s(S=>S&&S.email,"isUser");return y(m)&&$A.default.setUser({id:m._id,tenantId:m.tenantId,budibaseAccess:m.budibaseAccess,status:m.status}),WA(n,{authenticated:p,user:m,internal:h,version:a,publicEndpoint:o,loginMethod:g}),y(m)?Bd(m,n,i):i()}catch(c){if(console.error(`Auth Error: ${c.message}`),c?.name==="JsonWebTokenError"?gr(n,"budibase:auth"):c?.code==="invalid_api_key"&&n.throw(403,c.message),e&&e.publicAllowed||o)return WA(n,{authenticated:!1,version:a,publicEndpoint:o}),i();n.throw(c.status||403,c)}}}s(dc,"authenticated");async function fc(t,e){if(t.internal)return e();let r=await on(t);return!r&&!E.isWorker()?t.throw(403,"This request required a workspace id."):!r&&!ke(t.user)?t.throw(403,"Builder user only endpoint."):r&&!Ei(t.user,r)&&t.throw(403,"Workspace builder user only endpoint."),e()}s(fc,"builderOnly");async function pc(t,e){if(t.internal||Rt(t.user))return e();let r=await on(t);return!r&&!E.isWorker()?t.throw(403,"This request required a workspace id."):!r&&!ke(t.user)?t.throw(403,"Admin/Builder user only endpoint."):r&&!Ei(t.user,r)&&t.throw(403,"Workspace Admin/Builder user only endpoint."),e()}s(pc,"builderOrAdmin");var GA=F(require("crypto"));var VA={"default-src":["'self'"],"script-src":["'self'","'unsafe-eval'","https://*.budibase.net","https://cdn.budi.live","https://js.intercomcdn.com","https://widget.intercom.io","https://d2l5prqdbvm3op.cloudfront.net","https://us-assets.i.posthog.com","https://www.google.com/recaptcha/api.js"],"style-src":["'self'","'unsafe-inline'","https://cdn.jsdelivr.net","https://fonts.googleapis.com","https://rsms.me","https://maxcdn.bootstrapcdn.com"],"object-src":["'none'"],"base-uri":["'self'"],"connect-src":["'self'","https://*.budibase.app","https://*.budibaseqa.app","https://*.budibase.net","https://api-iam.intercom.io","https://api-ping.intercom.io","https://app.posthog.com","https://us.i.posthog.com","wss://nexus-websocket-a.intercom.io","wss://nexus-websocket-b.intercom.io","https://nexus-websocket-a.intercom.io","https://nexus-websocket-b.intercom.io","https://uploads.intercomcdn.com","https://uploads.intercomusercontent.com","https://*.amazonaws.com","https://*.s3.amazonaws.com","https://*.s3.us-east-2.amazonaws.com","https://*.s3.us-east-1.amazonaws.com","https://*.s3.us-west-1.amazonaws.com","https://*.s3.us-west-2.amazonaws.com","https://*.s3.af-south-1.amazonaws.com","https://*.s3.ap-east-1.amazonaws.com","https://*.s3.ap-south-1.amazonaws.com","https://*.s3.ap-northeast-2.amazonaws.com","https://*.s3.ap-southeast-1.amazonaws.com","https://*.s3.ap-southeast-2.amazonaws.com","https://*.s3.ap-northeast-1.amazonaws.com","https://*.s3.ca-central-1.amazonaws.com","https://*.s3.cn-north-1.amazonaws.com","https://*.s3.cn-northwest-1.amazonaws.com","https://*.s3.eu-central-1.amazonaws.com","https://*.s3.eu-west-1.amazonaws.com","https://*.s3.eu-west-2.amazonaws.com","https://*.s3.eu-south-1.amazonaws.com","https://*.s3.eu-west-3.amazonaws.com","https://*.s3.eu-north-1.amazonaws.com","https://*.s3.sa-east-1.amazonaws.com","https://*.s3.me-south-1.amazonaws.com","https://*.s3.us-gov-east-1.amazonaws.com","https://*.s3.us-gov-west-1.amazonaws.com","https://api.github.com"],"font-src":["'self'","data:","https://cdn.jsdelivr.net","https://fonts.gstatic.com","https://rsms.me","https://maxcdn.bootstrapcdn.com","https://js.intercomcdn.com","https://fonts.intercomcdn.com"],"frame-src":["'self'","https:"],"img-src":["http:","https:","data:","blob:"],"manifest-src":["'self'"],"media-src":["'self'","https://js.intercomcdn.com","https://cdn.budi.live"],"worker-src":["blob:","'self'"]},WL=/^[A-Za-z0-9-*:/.]+$/,qA=s(async(t,e)=>{let r=GA.default.randomBytes(16).toString("base64");t.state.nonce=r;let n={...VA};if(n["script-src"]=[...VA["script-src"],`'nonce-${r}'`],t.user?.license?.features.includes("customAppScripts")&&t.appId)try{let a=await Bs.getWorkspaceMetadata(t.appId);if("name"in a)for(let u of a.scripts||[]){let c=(u.cspWhitelist||"").split(`
|
|
38
38
|
`).filter(l=>WL.test(l));n["default-src"]=[...n["default-src"],...c]}}catch(a){console.error(`Error occurred in Content-Security-Policy middleware: ${a}`)}let o=Object.entries(n).map(([a,u])=>`${a} ${u.join(" ")}`).join("; ");t.set("Content-Security-Policy",o),await e()},"contentSecurityPolicy");var $L=["GET","HEAD","OPTIONS"],VL=["application/x-www-form-urlencoded","multipart/form-data","text/plain"];function mc(t={noCsrfPatterns:[]}){let e=An(t.noCsrfPatterns);return async(r,n)=>{if(_n(r,e)||$L.indexOf(r.method)!==-1)return n();let o=r.get("content-type")?r.get("content-type").toLowerCase():"";if(!VL.filter(c=>o.includes(c)).length||r.internal)return n();let a=r.user?.csrfToken;if(!a)return n();let u=r.get("x-csrf-token");return(!u||u!==a)&&r.throw(403,"Invalid CSRF token"),n()}}s(mc,"csrf");function KA(t){if(t.includes("-----BEGIN PRIVATE KEY-----"))return!0;for(let e of wy){let r=E[e];if(!(typeof r!="string"||r==="")&&t.includes(r))return!0}return!1}s(KA,"stringContainsSecret");async function QA(t,e){try{await e()}catch(r){let n=r.status||r.statusCode||500;t.status=n,n>=400&&n<500?console.warn(r):console.error("Got 400 response code",r);let i={message:r.message,status:n,validationErrors:r.validation,error:Lu(r)};if(KA(JSON.stringify(i))&&(i={message:"Unexpected error",status:n,error:"Unexpected error"}),E.isTest()&&t.headers["x-budibase-include-stacktrace"]){let o=r;for(;o.cause;)o=o.cause;i.stack=o.stack}t.body=i}}s(QA,"errorHandling");var jA=s(async(t,e)=>{let n=Gt(t,"budibase:featureflags")?.flags||{};await uf(n,async()=>{await e()})},"featureFlagCookie");async function hc(t,e){let r=t.request.headers["x-budibase-api-key"];return r||t.throw(403,"Unauthorized"),Array.isArray(r)&&t.throw(403,"Unauthorized"),js(r)||t.throw(403,"Unauthorized"),e()}s(hc,"internalApi");async function YA(t,e){return t.ip?await nf(t.ip,()=>e()):e()}s(YA,"ip");var Po={};N(Po,{body:()=>GL,params:()=>qL});var sm=F(require("joi"));function HA(t,e,r){let n=r?.errorPrefix??`Invalid ${e}`;return(i,o)=>{if(!t)return o();let a=null,u=i.request?.[e];i[e]!=null?a=i[e]:u!=null&&(a=u),t.append&&(t=t.append({createdAt:sm.default.any().optional(),updatedAt:sm.default.any().optional()}));let{error:c}=t.validate(a,{allowUnknown:r?.allowUnknown});if(c){let l=c.message;n&&(l=`Invalid ${e} - ${l}`),i.throw(400,l)}return o()}}s(HA,"validate");function GL(t,e){return HA(t,"body",e)}s(GL,"body");function qL(t,e){return HA(t,"params",e)}s(qL,"params");var Ti={};N(Ti,{authenticate:()=>jL,options:()=>QL});function Oe(t,e,r){return t(r,null,{message:e})}s(Oe,"authError");async function br(t,e){if(e&&e.callbackURL)return e.callbackURL;let r=await Bp(),n="/api/global/auth";return pr()&&(n+=`/${G()}`),n+=`/${t}/callback`,`${r.platformUrl}${n}`}s(br,"ssoCallbackUrl");var om="Invalid credentials",KL="This account has expired. Please reset your password",QL={passReqToCallback:!0};async function jL(t,e,r,n){if(!e)return Oe(n,"Email Required");if(!r)return Oe(n,"Password Required");let i=await Tt(e);return i==null?(console.info(`user=${e} could not be found`),Oe(n,om)):i.status==="inactive"?(console.info(`user=${e} is inactive`,i),Oe(n,om)):i.password?await kd(r,i.password)?(delete i.password,n(null,i)):Oe(n,om):(console.info(`user=${e} has no password set`,i),Oe(n,KL))}s(jL,"authenticate");var Jt={};N(Jt,{buildVerifyFn:()=>ZA,getCallbackUrl:()=>zL,strategyFactory:()=>am});var No=s(t=>Promise.resolve(t),"ssoSaveUserNoOp");async function Ec(t,e=!0,r,n){if(!n)throw new Error("Save user function must be provided");if(!t.userId)return Oe(r,"sso user id required");if(!t.email)return Oe(r,"sso user email required");let i=Zn(t.userId),o;try{o=await yn(i)}catch(u){if(!u.status||u.status!==404)return Oe(r,"Unexpected error when retrieving existing user",u)}if(o||(o=await Tt(t.email)),!o&&e)return Oe(r,"Email does not yet exist. You must set up your local budibase account first.");o||(o={_id:i,email:t.email,roles:{},tenantId:G()});let a=await YL(o,t);a.forceResetPassword=!1;try{delete a.password,a=await n(a,{hashPassword:!1,requirePassword:!1})}catch(u){return Oe(r,"Error saving user",u)}return r(null,a)}s(Ec,"authenticate");async function YL(t,e){let r,n,i;if(e.profile){let o=e.profile;if(o.name){let a=o.name;a.givenName&&(r=a.givenName),a.familyName&&(n=a.familyName)}}return e.oauth2&&(i={...e.oauth2}),{...t,provider:e.provider,providerType:e.providerType,firstName:r,lastName:n,oauth2:i}}s(YL,"syncUser");var HL=require("passport-google-oauth").OAuth2Strategy;function ZA(t){return(e,r,n,i)=>{let o={provider:"google",providerType:"google",userId:n.id,profile:n,email:n._json.email,oauth2:{accessToken:e,refreshToken:r}};return Ec(o,!0,i,t)}}s(ZA,"buildVerifyFn");async function am(t,e,r){try{let{clientID:n,clientSecret:i}=t;if(!n||!i)throw new Error("Configuration invalid. Must contain google clientID and clientSecret");let o=ZA(r);return new HL({clientID:t.clientID,clientSecret:t.clientSecret,callbackURL:e},o)}catch(n){throw new Error(`Error constructing google authentication strategy: ${n}`)}}s(am,"strategyFactory");async function zL(t){return br("google",t)}s(zL,"getCallbackUrl");var Zt={};N(Zt,{buildVerifyFn:()=>e_,fetchStrategyConfig:()=>e0,getCallbackUrl:()=>t0,strategyFactory:()=>XL});var XA=F(require("node-fetch"));var JL=require("@techpass/passport-openidconnect").Strategy;function e_(t){return async(e,r,n,i,o,a,u,c,l)=>{let d={provider:e,providerType:"oidc",userId:n.id,profile:n,email:ZL(n,i),oauth2:{accessToken:o,refreshToken:a}};return Ec(d,!1,l,t)}}s(e_,"buildVerifyFn");function ZL(t,e){if(t._json.email)return t._json.email;if(e.email)return e.email;let r=e.preferred_username;if(r&&bf(r))return r;throw new Error(`Could not determine user email from profile ${JSON.stringify(t)} and claims ${JSON.stringify(e)}`)}s(ZL,"getEmail");async function XL(t,e){try{let r=e_(e),n=new JL(t,r);return n.name="oidc",n}catch(r){throw new Error(`Error constructing OIDC authentication strategy - ${r}`)}}s(XL,"strategyFactory");async function e0(t,e){try{let{clientID:r,clientSecret:n,configUrl:i,pkce:o}=t;if(!r||!n||!e||!i)throw new Error("Configuration invalid. Must contain clientID, clientSecret, callbackUrl and configUrl");let a=await(0,XA.default)(i);if(!a.ok)throw new Error(`Unexpected response when fetching openid-configuration: ${a.statusText}`);let u=await a.json();return{issuer:u.issuer,authorizationURL:u.authorization_endpoint,tokenURL:u.token_endpoint,userInfoURL:u.userinfo_endpoint,clientID:r,clientSecret:n,callbackURL:e,pkce:o}}catch(r){throw new Error(`Error constructing OIDC authentication configuration - ${r}`)}}s(e0,"fetchStrategyConfig");async function t0(){return br("oidc")}s(t0,"getCallbackUrl");function t_(t,e){let r=t.request.query?.query;if(t.request.method.toLowerCase()!=="get"&&t.throw(500,"Query to download middleware can only be used for get requests."),!r)return e();let n=decodeURIComponent(r),i;try{i=JSON.parse(n)}catch{return e()}return t.request.body=i,e()}s(t_,"querystringToBody");function gc(t,e,r={noTenancyRequired:!1}){let n=An(t),i=An(e);return async function(o,a){let c={allowNoTenant:r.noTenancyRequired||!!_n(o,i)};!!_n(o,n)||(c.excludeStrategies=["query"]);let d=Ks(o,c);return o.set("x-budibase-tenant-id",d),Re(d,a)}}s(gc,"tenancy");async function yc(t,e){if(t.internal||Rt(t.user))return e();let r=await on(t);return r&&!ju(t.user,r)?t.throw(403,"Workspace Admin/Builder user only endpoint."):!r&&!E.isWorker()?t.throw(403,"This request required a workspace id."):!r&&!ke(t.user)&&t.throw(403,"Admin/Builder user only endpoint."),e()}s(yc,"workspaceBuilderOrAdmin");var um={};N(um,{postAuth:()=>i0,preAuth:()=>n0});var r0=require("passport-google-oauth").OAuth2Strategy;async function r_(){let t=await Wp();if(!t)throw new Error("No google configuration found");return t}s(r_,"fetchGoogleCreds");async function n0(t,e,r){let n=await r_(),o=`${await bo({tenantAware:!1})}/api/global/auth/datasource/google/callback`,a=await am(n,o,No);return e.query.appId||e.throw(400,"appId query param not present."),t.authenticate(a,{scope:["profile","email","https://www.googleapis.com/auth/spreadsheets"],accessType:"offline",prompt:"consent"})(e,r)}s(n0,"preAuth");async function i0(t,e,r){let n=await r_(),o=`${await bo({tenantAware:!1})}/api/global/auth/datasource/google/callback`,a=Gt(e,"budibase:datasourceauth");if(!a)throw new Error("Unable to fetch datasource auth cookie");return t.authenticate(new r0({clientID:n.clientID,clientSecret:n.clientSecret,callbackURL:o},(u,c,l,d)=>{gr(e,"budibase:datasourceauth"),d(null,{accessToken:u,refreshToken:c})}),{successRedirect:"/",failureRedirect:"/error"},async(u,c)=>{let l=`/builder/workspace/${a.appId}/data`,d=ne();await jt(`datasource:creation:${a.appId}:google:${d}`,{tokens:c}),e.redirect(`${l}/new?continue_google_setup=${d}`)})(e,r)}s(i0,"postAuth");var s0={google:um};var n_=require("koa-passport"),o0=require("passport-local").Strategy,Tc=require("passport-oauth2-refresh"),a0=dc,u0=gc,c0=mc,l0=n_;n_.use(new o0(Ti.options,Ti.authenticate));async function d0(t,e){let r=await Zt.getCallbackUrl(),n,i;try{if(n=await Zt.fetchStrategyConfig(t,r),!n)throw new Error("OIDC Config contents invalid");i=await Zt.strategyFactory(n,No)}catch{throw new Error("Could not refresh OAuth Token")}return Tc.use(i,{setRefreshOAuth2(){return i._getOAuth2Client(n)}}),new Promise(o=>{Tc.requestNewAccessToken("oidc",e,(a,u,c,l)=>{o({err:a,accessToken:u,refreshToken:c,params:l})})})}s(d0,"refreshOIDCAccessToken");async function f0(t,e){let r=await Jt.getCallbackUrl(t),n;try{n=await Jt.strategyFactory(t,r,No)}catch(i){throw new Error(`Error constructing OIDC refresh strategy: message=${i.message}`)}return Tc.use(n),new Promise(i=>{Tc.requestNewAccessToken("google",e,(o,a,u,c)=>{i({err:o,accessToken:a,refreshToken:u,params:c})})})}s(f0,"refreshGoogleAccessToken");async function p0(t,e,r){switch(e){case"oidc":{if(!r)return{err:{data:"OIDC config id not provided"}};let n=await $p(r);return n?d0(n,t):{err:{data:"OIDC configuration not found"}}}case"google":{let n=await tc();return n?f0(n,t):{err:{data:"Google configuration not found"}}}}}s(p0,"refreshOAuthToken");async function m0(t,e){let r={accessToken:e.accessToken,refreshToken:e.refreshToken};try{let n=H(),i=await n.get(t);typeof r.refreshToken!="string"&&delete r.refreshToken,i.oauth2={...i.oauth2,...r},await n.put(i),await Ro(t)}catch(n){console.error("Could not update OAuth details for current user",n)}}s(m0,"updateUserOAuth");async function h0(t){let e=t.ctx,r=t.userId,n=t.keepActiveSession;if(!e)throw new Error("Koa context must be supplied to logout.");let i=Gt(e,"budibase:auth"),o=await co(r);i&&n?o=o.filter(u=>u.sessionId!==i.sessionId):gr(e,"budibase:auth");let a=o.map(({sessionId:u})=>u);await hn(r,{sessionIds:a,reason:"logout"}),await Ku.logout(e.user?.email),await Ro(r)}s(h0,"platformLogout");var fm={};N(fm,{validate:()=>S0});var C=F(require("joi"));var E0=["Relational","Non-relational","Spreadsheet","Object store","Graph","API"];function dm(t,e){let{error:r}=t.validate(e);if(r)throw r}s(dm,"runJoi");function g0(t){let e=C.default.object({type:C.default.string().allow("component").required(),metadata:C.default.object().unknown(!0).required(),hash:C.default.string().optional(),version:C.default.string().optional(),schema:C.default.object({name:C.default.string().required(),settings:C.default.array().items(C.default.object().unknown(!0)).required()}).unknown(!0)});dm(e,t)}s(g0,"validateComponent");function y0(t){let e=C.default.object({type:C.default.string().allow(...Object.values(wc)).required(),required:C.default.boolean().required(),default:C.default.any(),display:C.default.string()}),r=C.default.object({type:C.default.string().allow(...Object.values(Ic)),readable:C.default.boolean(),displayName:C.default.string(),fields:C.default.object().pattern(C.default.string(),e)}).required(),n=C.default.object({type:C.default.string().allow("datasource").required(),metadata:C.default.object().unknown(!0).required(),hash:C.default.string().optional(),version:C.default.string().optional(),schema:C.default.object({docs:C.default.string(),plus:C.default.boolean().optional(),isSQL:C.default.boolean().optional(),auth:C.default.object({type:C.default.string().required()}).optional(),features:C.default.object(Object.fromEntries(Object.values(Dc).map(i=>[i,C.default.boolean().optional()]))).optional(),relationships:C.default.boolean().optional(),description:C.default.string().required(),friendlyName:C.default.string().required(),type:C.default.string().allow(...E0),datasource:C.default.object().pattern(C.default.string(),e).required(),query:C.default.object().pattern(C.default.string(),r).unknown(!0).required(),extra:C.default.object().pattern(C.default.string(),C.default.object({type:C.default.string().required(),displayName:C.default.string().required(),required:C.default.boolean(),data:C.default.object()}))})});dm(n,t)}s(y0,"validateDatasource");function T0(t){let e=C.default.object().pattern(C.default.string(),{type:C.default.string().allow(...Object.values(Rc)).required(),customType:C.default.string().allow(...Object.values(Cc)),title:C.default.string(),description:C.default.string(),enum:C.default.array().items(C.default.string()),pretty:C.default.array().items(C.default.string())}),r=C.default.object({properties:e,required:C.default.array().items(C.default.string())}).concat(e).required(),n=C.default.object({type:C.default.string().allow("automation").required(),metadata:C.default.object().unknown(!0).required(),hash:C.default.string().optional(),version:C.default.string().optional(),schema:C.default.object({name:C.default.string().required(),tagline:C.default.string().required(),icon:C.default.string().required(),description:C.default.string().required(),type:C.default.string().allow("ACTION","LOGIC").required(),stepId:C.default.string().disallow(...Um).required(),inputs:C.default.object().optional(),schema:C.default.object({inputs:r,outputs:r}).required()})});dm(n,t)}s(T0,"validateAutomation");function S0(t){switch(t?.type){case"component":g0(t);break;case"datasource":y0(t);break;case"automation":T0(t);break;default:throw new Error(`Unknown plugin type - check schema.json: ${t.type}`)}}s(S0,"validate");var pm={};N(pm,{Client:()=>Ce,clients:()=>hr,locks:()=>yi,utils:()=>Va});var mm={};N(mm,{isBlacklisted:()=>_0,refreshBlacklist:()=>a_});var i_=F(require("dns")),Ac=F(require("net"));var s_=require("util");var Sc,A0=(0,s_.promisify)(i_.default.lookup);async function o_(t){return Ac.default.isIP(t)||(t.startsWith("http")||(t=`https://${t}`),t=new URL(t).hostname),(await A0(t,{all:!0})).map(r=>r.address)}s(o_,"lookup");async function a_(){let e=E.BLACKLIST_IPS?.split(",")||[],r=[];for(let n of e){let i=n.trim();if(Ac.default.isIP(i))r.push(i);else{let o=await o_(i);r=r.concat(o)}}Sc=r}s(a_,"refreshBlacklist");async function _0(t){if(Sc||await a_(),Sc?.length===0)return!1;let e;return Ac.default.isIP(t)?e=[t]:e=await o_(t),!!Sc?.find(r=>e.includes(r))}s(_0,"isBlacklisted");var Em={};N(Em,{init:()=>I0});var O0={"user:created":t=>t.userId,"user:updated":t=>t.userId,"user:deleted":t=>t.userId,"user:admin:assigned":t=>t.userId,"user:admin:removed":t=>t.userId,"user:builder:assigned":t=>t.userId,"user:builder:removed":t=>t.userId,"user_group:created":t=>t.groupId,"user_group:updated":t=>t.groupId,"user_group:deleted":t=>t.groupId,"user_group:user_added":t=>t.groupId,"user_group:users_deleted":t=>t.groupId,"user_group:permissions_edited":t=>t.groupId,"automation:deleted":t=>t.automationId,"datasource:deleted":t=>t.datasourceId,"table:deleted":t=>t.tableId,"query:deleted":t=>t.queryId,"workspace_app:deleted":t=>t.workspaceAppId,"view:deleted":t=>t.id};function u_(t,e){let r=O0[t];if(!r)throw new Error("Event does not have a method of document ID extraction");return r(e)}s(u_,"getDocumentId");var Uo=class{constructor(e){this.processors=[];this.processors=e}static{s(this,"DocumentUpdateProcessor")}async processEvent(e,r,n){let i=r.realTenantId,o=u_(e,n);if(!(!i||!o))for(let{events:a,processor:u}of this.processors)a.includes(e)&&await Re(i,async()=>{await u({id:o,tenantId:i,appId:n.appId,properties:n})})}shutdown(){return RS()}};var c_,hm;function I0(t){gt||$u(),hm||(hm=new Uo(t)),c_||(c_=gt.process(async e=>{let{event:r,identity:n,properties:i}=e.data;await hm.processEvent(r,n,i)}))}s(I0,"init");var wm={};N(wm,{COUNT_FIELD_NAME:()=>Om,Sql:()=>y_,SqlTable:()=>_c,designDoc:()=>Im,utils:()=>zd});var p_=require("knex");var w0=require("knex");function gm(t){return["link","formula","ai"].indexOf(t)!==-1}s(gm,"isIgnoredType");function l_(t,e,r,n,i){let o=e&&e.primary?e.primary:[],a=Object.values(e.schema),u=a.filter(p=>p.meta),c=u.length===a.length,l=[];n||(c?t.primary(u.map(p=>p.name)):o.length===1?(t.increments(o[0]).primary(),l.push(o[0])):t.primary(o));let d=Object.values(e.schema).map(p=>p.foreignKey);for(let[p,m]of Object.entries(e.schema)){let h=n?.schema[p];if(h&&h.type||l.includes(p)||i?.updated===p)continue;let g=m.type;switch(g){case"string":case"options":case"longform":case"barcodeqr":case"bb_reference_single":o.includes(p)?t.string(p,255):t.text(p);break;case"number":if(m.meta&&m.meta.toKey&&m.meta.toTable){let{toKey:y,toTable:S}=m.meta;t.integer(p).unsigned(),t.foreign(p).references(`${S}.${y}`)}else d.indexOf(p)===-1&&t.float(p);break;case"bigint":t.bigint(p);break;case"boolean":t.boolean(p);break;case"datetime":m.timeOnly?t.time(p):t.datetime(p,{useTz:!m.ignoreTimezones});break;case"array":case"bb_reference":Ne.schema.isDeprecatedSingleUserColumn(m)?t.text(p):t.json(p);break;case"link":if(m.relationshipType!=="many-to-one"&&m.relationshipType!=="many-to-many"){if(!m.foreignKey||!m.tableId)throw new Error("Invalid relationship schema");let{tableName:y}=Kd(m.tableId),S=r[y];if(!S||!S.primary)throw new Error("Referenced table doesn't exist or has no primary keys");let O=S.primary[0],_=S.schema[O].externalType;_?t.specificType(m.foreignKey,_):t.integer(m.foreignKey).unsigned(),t.foreign(m.foreignKey).references(`${y}.${O}`)}break;case"signature_single":case"attachment":case"attachment_single":t.json(p);break;case"formula":break;case"ai":break;case"auto":case"json":case"internal":throw new Error(`${m.type} is not a valid SQL type`);default:St.unreachable(g)}}let f=i?n?.schema[i.old].type:void 0;return i&&f&&!gm(f)&&t.renameColumn(i.old,i.updated),n&&Object.entries(n.schema).filter(([m,h])=>!gm(h.type)&&e.schema[m]==null).forEach(([m,h])=>{i?.old===m||gm(h.type)||(n.constrained&&n.constrained.indexOf(m)!==-1&&t.dropForeign(m),t.dropColumn(m))}),t}s(l_,"generateSchema");function R0(t,e,r){return t.createTable(e.name,n=>{l_(n,e,r)})}s(R0,"buildCreateTable");function C0(t,e,r,n,i){return t.alterTable(e.name,o=>{l_(o,e,r,n,i)})}s(C0,"buildUpdateTable");function b0(t,e){return t.dropTable(e.name)}s(b0,"buildDeleteTable");var ym=class{static{s(this,"SqlTableQueryBuilder")}constructor(e){this.sqlClient=e}getBaseSqlClient(){return this.sqlClient}getSqlClient(){return this.extendedSqlClient||this.sqlClient}setExtendedSqlClient(e){this.extendedSqlClient=e}_operation(e){return e.operation}_tableQuery(e){let r=(0,w0.knex)({client:this.sqlClient}).schema;e?.schema&&(r=r.withSchema(e.schema));let n;if(!e.table||!e.tables)throw new Error("Cannot execute without table being specified");if(e.table.sourceType==="internal")throw new Error("Cannot perform table actions for SQS.");switch(this._operation(e)){case"CREATE_TABLE":n=R0(r,e.table,e.tables);break;case"UPDATE_TABLE":if(!e.table)throw new Error("Must specify old table for update");if(this.sqlClient==="mysql2"&&e.meta?.renamed){let i=e.meta.renamed.updated;return{sql:`alter table ${e?.schema?`\`${e.schema}\`.\`${e.table.name}\``:`\`${e.table.name}\``} rename column \`${e.meta.renamed.old}\` to \`${i}\`;`,bindings:[]}}if(n=C0(r,e.table,e.tables,e.meta?.oldTable,e.meta?.renamed),this.sqlClient==="mssql"&&e.meta?.renamed){let i=e.meta.renamed.old,o=e.meta.renamed.updated,a=e?.schema?`${e.schema}.${e.table.name}`:`${e.table.name}`,u=Yn(n);if(Array.isArray(u))for(let c of u)c.sql.startsWith("exec sp_rename")&&(c.sql=`exec sp_rename '${a}.${i}', '${o}', 'COLUMN'`,c.bindings=[]);return u}break;case"DELETE_TABLE":n=b0(r,e.table);break;default:throw new Error("Table operation is of unknown type")}return Yn(n)}},_c=ym;var m_=require("lodash");var Om="__bb_total";function d_(){return(E.SQL_MAX_ROWS?parseInt(E.SQL_MAX_ROWS):null)||5e3}s(d_,"getBaseLimit");function Tm(){return(E.SQL_MAX_RELATED_ROWS?parseInt(E.SQL_MAX_RELATED_ROWS):null)||500}s(Tm,"getRelationshipLimit");function x0(t,e){return t.sort((r,n)=>{let i=e.find(a=>a&&r.endsWith(a)),o=e.find(a=>a&&n.endsWith(a));return i&&!o?-1:!i&&o?1:r.localeCompare(n)})}s(x0,"prioritisedArraySort");function h_(t){return Array.isArray(t)?t.map(e=>h_(e)):(t.bindings&&(t.bindings=t.bindings.map(e=>typeof e=="boolean"?e?1:0:e)),t)}s(h_,"convertBooleans");function f_(t){return t.sourceType==="internal"||t.sourceId===vc}s(f_,"isSqs");function v0(t,e='"'){return t.replace(new RegExp(e,"g"),`${e}${e}`)}s(v0,"escapeQuotes");function E_(t,e='"'){return`${e}${v0(t,e)}${e}`}s(E_,"wrap");function Sm(t,e='"'){for(let r in t)typeof t[r]=="string"&&(t[r]=E_(t[r],e));return`[${t.join(",")}]`}s(Sm,"stringifyArray");function g_(t){return km.includes(t.type)&&!Ne.schema.isDeprecatedSingleUserColumn(t)}s(g_,"isJsonColumn");var P0={equal:!1,notEqual:!0,empty:!1,notEmpty:!0,fuzzy:!1,string:!1,range:!1,contains:!1,notContains:!0,containsAny:!1,oneOf:!1,$and:!1,$or:!1},Am=class{constructor(e,r,n){this.SPECIAL_SELECT_CASES={POSTGRES_ARRAY:e=>this.client==="pg"&&e?.externalType?.toLowerCase()==="array",POSTGRES_MONEY:e=>this.client==="pg"&&e?.externalType?.includes("money"),POSTGRES_ENUM:e=>this.client==="pg"&&e?.externalType?.toLowerCase()==="user-defined"&&e?.type==="options",MSSQL_DATES:e=>this.client==="mssql"&&e?.type==="datetime"&&e.timeOnly};this.client=e,this.query=n,this.knex=r,this.splitter=new cr.ColumnSplitter([this.table],{aliases:this.query.tableAliases,columnPrefix:this.query.meta?.columnPrefix})}static{s(this,"InternalBuilder")}get table(){return this.query.table}get knexClient(){return this.knex.client}getFieldSchema(e){let{column:r}=this.splitter.run(e);return this.table.schema[r]}requiresJsonAsStringClient(){return["mssql","mysql2","mariadb","oracledb"].includes(this.client)}quoteChars(){let e=this.knexClient.wrapIdentifier("foo",{});return[e[0],e[e.length-1]]}quote(e){return this.knexClient.wrapIdentifier(e,{})}isQuoted(e){let[r,n]=this.quoteChars();return e.startsWith(r)&&e.endsWith(n)}quotedIdentifier(e){return Array.isArray(e)||(e=this.splitIdentifier(e)),e.map(r=>this.quote(r)).join(".")}castIntToString(e){switch(this.client){case"oracledb":return this.knex.raw("to_char(??)",[e]);case"pg":return this.knex.raw("??::TEXT",[e]);case"mysql2":case"mariadb":return this.knex.raw("CAST(?? AS CHAR)",[e]);case"sqlite3":return this.knex.raw("printf('%d', ??)",[e]);case"mssql":return this.knex.raw("CONVERT(NVARCHAR, ??)",[e])}}rawQuotedIdentifier(e){return this.knex.raw(this.quotedIdentifier(e))}splitIdentifier(e){let[r,n]=this.quoteChars();return this.isQuoted(e)?e.slice(1,-1).split(`${n}.${r}`):e.split(".")}qualifyIdentifier(e){let r=this.getTableName(),n=this.splitIdentifier(e);return n[0]!==r&&n.unshift(r),this.isQuoted(e)?this.quotedIdentifier(n):n.join(".")}generateSelectStatement(){let{table:e,resource:r}=this.query;if(!r||!r.fields||r.fields.length===0)return"*";let n=this.getTableName(e),i=this.table.schema;return r.fields.map(a=>{let u=a.split(/\./g),c,l=u[0];return u.length>1&&(c=u[0],l=u.slice(1).join(".")),{table:c,column:l,field:a}}).filter(({table:a})=>!a||a===n).map(({table:a,column:u,field:c})=>{let l=i[u];return this.SPECIAL_SELECT_CASES.POSTGRES_MONEY(l)?this.knex.raw("??::money::numeric as ??",[this.rawQuotedIdentifier([a,u].join(".")),this.knex.raw(this.quote(c))]):this.SPECIAL_SELECT_CASES.MSSQL_DATES(l)?this.knex.raw("CONVERT(varchar, ??, 108) as ??",[this.rawQuotedIdentifier(c),this.knex.raw(this.quote(c))]):a?this.rawQuotedIdentifier(`${a}.${u}`):this.rawQuotedIdentifier(c)})}convertClobs(e,r){if(this.client!=="oracledb")throw new Error("you've called convertClobs on a DB that's not Oracle, this is a mistake");let i=this.splitIdentifier(e).pop(),o=this.table.schema[i],a=this.rawQuotedIdentifier(e);return(o.type==="string"||o.type==="longform"||o.type==="bb_reference_single"||o.type==="bb_reference"||o.type==="options"||o.type==="barcodeqr")&&(r?.forSelect?a=this.knex.raw("to_char(??) as ??",[a,this.rawQuotedIdentifier(i)]):a=this.knex.raw("to_char(??)",[a])),a}parse(e,r){if(Array.isArray(e))return JSON.stringify(e);if(e==null)return null;if(this.requiresJsonAsStringClient()&&g_(r)&&typeof e=="object")return JSON.stringify(e);if(this.SPECIAL_SELECT_CASES.POSTGRES_ARRAY(r))return`{${e}}`;if(this.client==="oracledb"&&r.type==="datetime"&&r.timeOnly){if(e instanceof Date){let n=e.getHours().toString().padStart(2,"0"),i=e.getMinutes().toString().padStart(2,"0"),o=e.getSeconds().toString().padStart(2,"0");return`${n}:${i}:${o}`}if(typeof e=="string")return new Date(`1970-01-01T${e}Z`)}if(typeof e=="string"&&r.type==="datetime")if(r.timeOnly){if(!Yd(e))return null}else if(r.dateOnly){let n=jd(e);return n?new Date(n):null}else return r.ignoreTimezones?ja(e)?new Date(e):Qd(e)?new Date(e+"Z"):null:ja(e)?new Date(e.trim()):null;return e}parseBody(e){for(let[r,n]of Object.entries(e)){let{column:i}=this.splitter.run(r),o=this.table.schema[i];o&&(e[r]=this.parse(n,o))}return e}parseFilters(e){e=(0,m_.cloneDeep)(e);for(let r of Object.values(Pr)){let n=e[r];if(n)for(let i of Object.keys(n)){if(Array.isArray(n[i])){n[i]=JSON.stringify(n[i]);continue}let{column:o}=this.splitter.run(i),a=this.table.schema[o];a&&(n[i]=this.parse(n[i],a))}}for(let r of Object.values(er)){let n=e[r];if(n)for(let i of Object.keys(n)){let{column:o}=this.splitter.run(i),a=this.table.schema[o];a&&(n[i]=n[i].map(u=>this.parse(u,a)))}}for(let r of Object.values(wn)){let n=e[r];if(n)for(let i of Object.keys(n)){let{column:o}=this.splitter.run(i),a=this.table.schema[o];if(!a)continue;let u=n[i];"low"in u&&(u.low=this.parse(u.low,a)),"high"in u&&(u.high=this.parse(u.high,a))}}return e}addJoinFieldCheck(e,r){let n=r.from?.split(".")[0]||"";return e.andWhere(`${n}.fieldName`,"=",r.column)}addRelationshipForFilter(e,r,n,i){let{relationships:o,schema:a,tableAliases:u,table:c}=this.query,l=u?.[c.name]||c.name,d=s(f=>n.match(new RegExp(`^${f}\\.`)),"matches");if(!o)return e;for(let f of o){let p=f.tableName,m=u?.[p]||p,h=d(p)||d(m),g=d(f.column);if((h||g)&&f.to&&f.tableName){let y=this.knex.select(this.knex.raw(1)).from({[m]:p}),S=y.clone(),O=Hd(f),_;if(h?_=n:_=n.replace(new RegExp(`^${f.column}.`),`${u?.[f.tableName]||f.tableName}.`),O){let D=u?.[O.through]||f.through,T=this.tableNameWithSchema(O.through,{alias:D,schema:a});S=S.innerJoin(T,function(){this.on(`${m}.${O.toPrimary}`,"=",`${D}.${O.to}`)}).where(`${D}.${O.from}`,"=",this.rawQuotedIdentifier(`${l}.${O.fromPrimary}`)),this.client==="sqlite3"&&(S=this.addJoinFieldCheck(S,O)),e=e.where(I=>{I.whereExists(i(_,S)),r&&I.orWhereNotExists(y.clone().innerJoin(T,function(){this.on(`${l}.${O.fromPrimary}`,"=",`${D}.${O.from}`)}))})}else{let D=`${m}.${f.to}`,T=`${l}.${f.from}`;S=S.where(D,"=",this.rawQuotedIdentifier(T)),e=e.where(I=>{I.whereExists(i(_,S.clone())),r&&I.orWhereNotExists(S)})}}}return e}addFilters(e,r,n){if(!r)return e;let i=this;r=this.parseFilters({...r});let o=this.query.tableAliases,a=r.allOr,c=this.client==="sqlite3"?this.table._id:this.table.name;function l(h){return o?.[h]||h}s(l,"getTableAlias");function d(h,g,y,S){let O=s((_,D,T)=>{let[I,...M]=D.split("."),P=M.join("."),k=l(I);return _.andWhere(Y=>y(Y,k?`${k}.${P}`:P,T))},"handleRelationship");for(let _ in h){let D=h[_],T=qs(_),I=T.includes("."),M=n?.relationship&&I,P;if(_==="_complexIdOperator"&&(P=h[_])&&S){let k=l(c);e=S(e,P.id.map(Y=>k?`${k}.${Y}`:Y),P.values)}else if(I)M&&(a&&(e=e.or),e=i.addRelationshipForFilter(e,P0[g],T,(k,Y)=>O(Y,k,D)));else{let k=l(c);e=y(e,k?`${k}.${T}`:T,D)}}}s(d,"iterate");let f=s((h,g,y)=>((r?.fuzzyOr||a)&&(h=h.or),this.client==="oracledb"||this.client==="sqlite3"?h.whereRaw("LOWER(??) LIKE ?",[this.rawQuotedIdentifier(g),`%${y.toLowerCase()}%`]):h.whereILike(this.rawQuotedIdentifier(g),this.knex.raw("?",[`%${y}%`]))),"like"),p=s((h,g=!1)=>{function y(S){return(a||h===r?.containsAny)&&(S=S.or),h===r?.notContains&&(S=S.not),S}s(y,"addModifiers"),this.client==="pg"?d(h,"contains",(S,O,_)=>{S=y(S);let D=this.getFieldSchema(O),T="::jsonb";return this.SPECIAL_SELECT_CASES.POSTGRES_ARRAY(D)&&(T="",_=`{${_.map(M=>M.substring(1,M.length-1))}}`),g?S.whereRaw(T?"COALESCE(??::jsonb \\?| array??, FALSE)":"COALESCE(?? && '??', FALSE)",[this.rawQuotedIdentifier(O),T?this.knex.raw(Sm(_,"'")):this.knex.raw(_)]):S.whereRaw(`COALESCE(??${T} @> '??', FALSE)`,[this.rawQuotedIdentifier(O),T?this.knex.raw(Sm(_)):this.knex.raw(_)])}):this.client==="mysql2"||this.client==="mariadb"?d(h,"contains",(S,O,_)=>y(S).whereRaw("COALESCE(?(??, ?), FALSE)",[this.knex.raw(g?"JSON_OVERLAPS":"JSON_CONTAINS"),this.rawQuotedIdentifier(O),this.knex.raw(E_(Sm(_)))])):d(h,"contains",(S,O,_)=>(_.length===0||(S=S.where(D=>(h===r?.notContains&&(D=D.not),D=D.where(T=>{for(let I of _){h===r?.containsAny?T=T.or:T=T.and;let M=typeof I=="string"?`"${I.toLowerCase()}"`:I;T=T.whereLike(this.knex.raw("COALESCE(LOWER(??), '')",[this.rawQuotedIdentifier(O)]),`%${M}%`)}}),h===r?.notContains&&(D=D.or.whereNull(this.rawQuotedIdentifier(O))),D))),S))},"contains");if(r.$and){let{$and:h}=r;for(let g of h.conditions)e=e.where(y=>{this.addFilters(y,g,n)})}if(r.$or){let{$or:h}=r;e=e.where(g=>{for(let y of h.conditions)g.orWhere(S=>this.addFilters(S,{...y,allOr:!0},n))})}r.oneOf&&d(r.oneOf,"oneOf",(h,g,y)=>{let S=this.getFieldSchema(g),O=Array.isArray(y)?y:[y];if(a&&(h=h.or),this.client==="oracledb")g=this.convertClobs(g);else if(this.client==="sqlite3"&&S?.type==="datetime"&&S.dateOnly){for(let _ of O)_!=null?h=h.or.whereLike(g,`${_.toISOString().slice(0,10)}%`):h=h.or.whereNull(g);return h}return h.whereIn(g,O)},(h,g,y)=>(a&&(h=h.or),this.client==="oracledb"&&(g=g.map(S=>this.convertClobs(S))),h.whereIn(g,Array.isArray(y)?y:[y]))),r.string&&d(r.string,"string",(h,g,y)=>{if(a&&(h=h.or),this.client==="oracledb"||this.client==="sqlite3")return h.whereRaw("LOWER(??) LIKE ?",[this.rawQuotedIdentifier(g),`${y.toLowerCase()}%`]);{let S=this.getFieldSchema(g);return this.SPECIAL_SELECT_CASES.POSTGRES_ENUM(S)?h.whereRaw(`??::text ilike '${y}%'`,[this.knex.raw(this.quote(S.name))]):h.whereILike(g,`${y}%`)}}),r.fuzzy&&d(r.fuzzy,"fuzzy",f),r.range&&d(r.range,"range",(h,g,y)=>{let S=s(P=>P&&Object.keys(P).length===0&&Object.getPrototypeOf(P)===Object.prototype,"isEmptyObject");S(y.low)&&(y.low=""),S(y.high)&&(y.high="");let O=Ya(y.low),_=Ya(y.high),D=this.getFieldSchema(g),T=g,I=y.high,M=y.low;return this.client==="sqlite3"&&D?.type==="datetime"&&D.dateOnly&&(I!=null&&(I=`${I.toISOString().slice(0,10)}T23:59:59.999Z`),M!=null&&(M=M.toISOString().slice(0,10))),this.client==="oracledb"?T=this.convertClobs(g):this.client==="sqlite3"&&D?.type==="bigint"&&(T=this.knex.raw("CAST(?? AS INTEGER)",[this.rawQuotedIdentifier(g)]),I=this.knex.raw("CAST(? AS INTEGER)",[y.high]),M=this.knex.raw("CAST(? AS INTEGER)",[y.low])),a&&(h=h.or),O&&_?h.whereBetween(T,[M,I]):O?h.where(T,">=",M):_?h.where(T,"<=",I):h}),r.equal&&d(r.equal,"equal",(h,g,y)=>{let S=this.getFieldSchema(g);if(a&&(h=h.or),this.client==="mssql")return h.whereRaw("CASE WHEN ?? = ? THEN 1 ELSE 0 END = 1",[this.rawQuotedIdentifier(g),y]);if(this.client==="oracledb"){let O=this.convertClobs(g);return h.where(_=>_.whereNotNull(O).andWhere(O,y))}else return this.client==="sqlite3"&&S?.type==="datetime"&&S.dateOnly?y!=null?h.whereLike(g,`${y.toISOString().slice(0,10)}%`):h.whereNull(g):h.whereRaw("COALESCE(?? = ?, FALSE)",[this.rawQuotedIdentifier(g),y])}),r.notEqual&&d(r.notEqual,"notEqual",(h,g,y)=>{let S=this.getFieldSchema(g);if(a&&(h=h.or),this.client==="mssql")return h.whereRaw("CASE WHEN ?? = ? THEN 1 ELSE 0 END = 0",[this.rawQuotedIdentifier(g),y]);if(this.client==="oracledb"){let O=this.convertClobs(g);return h.where(_=>_.not.whereNull(O).and.where(O,"!=",y)).or.whereNull(O)}else return this.client==="sqlite3"&&S?.type==="datetime"&&S.dateOnly?y!=null?h.not.whereLike(g,`${y.toISOString().slice(0,10)}%`).or.whereNull(g):h.not.whereNull(g):h.whereRaw("COALESCE(?? != ?, TRUE)",[this.rawQuotedIdentifier(g),y])}),r.empty&&d(r.empty,"empty",(h,g)=>(a&&(h=h.or),h.whereNull(g))),r.notEmpty&&d(r.notEmpty,"notEmpty",(h,g)=>(a&&(h=h.or),h.whereNotNull(g))),r.contains&&p(r.contains),r.notContains&&p(r.notContains),r.containsAny&&p(r.containsAny,!0);let m=o?.[this.table._id]||this.table._id;return r.documentType&&!qd(this.table)&&m&&e.andWhereLike(`${m}._id`,`${tr(r.documentType)}%`),e}isSqs(){return f_(this.table)}getTableName(e){e||(e=this.table);let r=e.name;f_(e)&&e._id&&(r=e._id);let n=this.query.tableAliases||{};return n[r]?n[r]:r}addDistinctCount(e){if(!this.table.primary)throw new Error("SQL counting requires primary key to be supplied");return e.countDistinct(`${this.getTableName()}.${this.table.primary[0]} as ${Om}`)}addAggregations(e,r){let n=this.query.resource?.fields||[],i=this.getTableName();if(n.length>0){let o=n.map(a=>this.qualifyIdentifier(a));if(this.client==="oracledb"){let a=o.map(c=>this.convertClobs(c)),u=o.map(c=>this.convertClobs(c,{forSelect:!0}));e=e.groupBy(a).select(u)}else e=e.groupBy(o).select(o)}for(let o of r){let a=o.calculationType;if(a==="count")if("distinct"in o&&o.distinct)if(this.client==="oracledb"){let u=this.convertClobs(`${i}.${o.field}`);e=e.select(this.knex.raw("COUNT(DISTINCT ??) as ??",[u,o.name]))}else e=e.countDistinct(`${i}.${o.field} as ${o.name}`);else if(this.client==="oracledb"){let u=this.convertClobs(`${i}.${o.field}`);e=e.select(this.knex.raw("COUNT(??) as ??",[u,o.name]))}else e=e.count(`${o.field} as ${o.name}`);else{let u=this.getFieldSchema(o.field);if(!u)throw new Error(`field schema missing for aggregation target: ${o.field}`);let c=this.knex.raw("??(??)",[this.knex.raw(a),this.rawQuotedIdentifier(`${i}.${o.field}`)]);u.type==="bigint"&&(c=this.castIntToString(c)),e=e.select(this.knex.raw("?? as ??",[c,o.name]))}}return e}isAggregateField(e){return!!this.query.resource?.aggregations?.find(n=>n.name===e)}addSorting(e){let{sort:r,resource:n}=this.query,i=this.table.primary,o=this.getTableName();if(!Array.isArray(i))throw new Error("Sorting requires primary key to be specified for table");if(r&&Object.keys(r||{}).length>0)for(let[u,c]of Object.entries(r)){let l=this.getFieldSchema(u);if(this.isUnsortableField(l))continue;let d=c.direction==="ascending"?"asc":"desc",f;(this.client==="pg"||this.client==="oracledb")&&(f=c.direction==="ascending"?"first":"last");let p=`${o}.${u}`,m;this.isAggregateField(u)?m=this.rawQuotedIdentifier(u):this.client==="oracledb"?m=this.convertClobs(p):m=this.rawQuotedIdentifier(p),e=e.orderByRaw(`?? ?? ${f?"nulls ??":""}`,[m,this.knex.raw(d),...f?[this.knex.raw(f)]:[]])}if(!((n?.aggregations?.length??0)>0)){let u=this.findSortablePrimaryKey(i);if(u&&(!r||r[u]===void 0))e=e.orderBy(`${o}.${u}`);else if(!u&&(!r||Object.keys(r).length===0))throw new Error(`Primary key not found for table ${this.table.name}`)}return e}isUnsortableField(e){return e?.type==="json"}findSortablePrimaryKey(e){return e.find(r=>{if(r==null)return!1;let n=this.getFieldSchema(r);return!this.isUnsortableField(n)})}tableNameWithSchema(e,r){let n=r?.schema?`${r.schema}.${e}`:e;return r?.alias&&(n+=` as ${r.alias}`),n}buildJsonField(e,r){let n=r.split("."),i=n[n.length-1],o,a;if(n.length>1){let l=n.shift();o=n.join("."),a=`${l}.${o}`}else o=n.join("."),a=o;this.query.meta?.columnPrefix&&(i=i.replace(this.query.meta.columnPrefix,""));let u=this.rawQuotedIdentifier(a),c=e.schema[i];return c&&c.type==="bigint"&&(u=this.castIntToString(u)),[o,u]}maxFunctionParameters(){switch(this.client){case"sqlite3":return 127;case"pg":return 100;default:return 200}}addJsonRelationships(e,r,n){let i=this.client,o=this.knex,{resource:a,tableAliases:u,schema:c,tables:l}=this.query,d=a?.fields||[];for(let f of n){let{tableName:p,through:m,to:h,from:g,fromPrimary:y,toPrimary:S}=f;if(!p||!r)continue;let O=l[p];if(!O)throw new Error(`related table "${p}" not found in datasource`);let _=u?.[p]||p,D=u?.[r]||r,T=m&&u?.[m]||m,I=this.tableNameWithSchema(p,{alias:_,schema:c}),M=[...O?.primary||[],O?.primaryDisplay].filter(W=>W),P=x0(d.filter(W=>W.split(".")[0]===_),M);P=P.slice(0,Math.floor(this.maxFunctionParameters()/2));let k=P.map(W=>this.buildJsonField(O,W));if(!k.length)continue;let Y=k.map(W=>{let J=this.client==="oracledb"?" VALUE ":",";return this.knex.raw(`?${J}??`,[W[0],W[1]]).toString()}).join(","),bt=`${_}.${S||h}`,B=o.from(I).orderBy(bt),L=m&&S&&y,v=L?`${T}.${g}`:`${_}.${h}`,$=L?`${D}.${y}`:`${D}.${g}`;if(L){let W=this.tableNameWithSchema(m,{alias:T,schema:c});B=B.join(W,function(){this.on(`${_}.${S}`,"=",`${T}.${h}`)})}B=B.where(this.rawQuotedIdentifier(v),"=",this.rawQuotedIdentifier($));let w=s(W=>(B=B.select(P.map(J=>this.rawQuotedIdentifier(J))).limit(Tm()),o.select(W).from({[_]:B})),"standardWrap"),K;switch(i){case"sqlite3":B=this.addJoinFieldCheck(B,f),K=w(this.knex.raw(`json_group_array(json_object(${Y}))`));break;case"pg":K=w(this.knex.raw(`json_agg(json_build_object(${Y}))`));break;case"mariadb":K=B.select(o.raw(`json_arrayagg(json_object(${Y}) LIMIT ${Tm()})`));break;case"mysql2":case"oracledb":K=w(this.knex.raw(`json_arrayagg(json_object(${Y}))`));break;case"mssql":{let W=o.select("*").from({[D]:B.select(k.map(J=>o.ref(J[1]).as(J[0]))).limit(Tm())});K=o.raw(`(SELECT ?? = (${W} FOR JSON PATH))`,[this.rawQuotedIdentifier(_)]);break}default:throw new Error(`JSON relationships not implement for ${i}`)}e=e.select({[f.column]:K})}return e}addJoin(e,r,n){let{tableAliases:i,schema:o}=this.query,a=r.to,u=r.from,c=r.through,l=i?.[a]||a,d=c&&i?.[c]||c,f=i?.[u]||u,p=this.tableNameWithSchema(a,{alias:l,schema:o}),m=c?this.tableNameWithSchema(c,{alias:d,schema:o}):void 0;return c?e=e.leftJoin(m,function(){for(let h of n){let g=h.fromPrimary,y=h.from;this.orOn(`${f}.${g}`,"=",`${d}.${y}`)}}).leftJoin(p,function(){for(let h of n){let g=h.toPrimary,y=h.to;this.orOn(`${l}.${g}`,`${d}.${y}`)}}):e=e.leftJoin(p,function(){for(let h of n){let g=h.from,y=h.to;this.orOn(`${f}.${g}`,"=",`${l}.${y}`)}}),e}qualifiedKnex(e){let r=this.query.tableAliases?.[this.query.table.name];return e?.alias===!1?r=void 0:typeof e?.alias=="string"&&(r=e.alias),this.knex(this.tableNameWithSchema(this.query.table.name,{alias:r,schema:this.query.schema}))}create(e){let{body:r}=this.query;if(!r)throw new Error("Cannot create without row body");let n=this.qualifiedKnex({alias:!1}),i=this.parseBody(r);if(this.client==="oracledb")for(let[o,a]of Object.entries(this.query.table.schema)){if(a.constraints?.presence===!0||a.type==="formula"||a.type==="auto"||a.type==="link"||a.type==="ai")continue;i[o]==null&&(i[o]=null)}else for(let[o,a]of Object.entries(i))a==null&&delete i[o];return e.disableReturning?n.insert(i):n.insert(i).returning("*")}bulkCreate(){let{body:e}=this.query,r=this.qualifiedKnex({alias:!1});if(!Array.isArray(e))return r;let n=e.map(i=>this.parseBody(i));return r.insert(n)}bulkUpsert(){let{body:e}=this.query,r=this.qualifiedKnex({alias:!1});if(!Array.isArray(e))return r;let n=e.map(i=>this.parseBody(i));if(this.client==="pg"||this.client==="sqlite3"||this.client==="mysql2"||this.client==="mariadb"){let i=this.table.primary;if(!i)throw new Error("Primary key is required for upsert");return r.insert(n).onConflict(i).merge()}else if(this.client==="mssql"||this.client==="oracledb")return r.insert(n);return r.upsert(n)}read(e={}){let{operation:r,filters:n,paginate:i,relationships:o,table:a}=this.query,{limits:u}=e,c=this.qualifiedKnex(),l=null,d=u?.query||u?.base;if(i&&i.page&&i.limit){let m=(i.page<=1?0:i.page-1)*i.limit;d=i.limit,l=m}else i&&i.offset&&i.limit?(d=i.limit,l=i.offset):i&&i.limit&&(d=i.limit);r!=="COUNT"&&(d!=null&&(c=c.limit(d)),l!=null&&(c=c.offset(l)));let f=this.query.resource?.aggregations||[];if(r==="COUNT"?c=this.addDistinctCount(c):f.length>0?c=this.addAggregations(c,f):c=c.select(this.generateSelectStatement()),r!=="COUNT"&&(c=this.addSorting(c)),c=this.addFilters(c,n,{relationship:!0}),o?.length&&f.length===0){let p=this.query.tableAliases?.[a.name]||a.name,m=this.addSorting(this.knex.with("paginated",c.clone().clearSelect().select("*")).select(this.generateSelectStatement()).from({[p]:"paginated"}));return this.addJsonRelationships(m,a.name,o)}return c}update(e){let{body:r,filters:n}=this.query;if(!r)throw new Error("Cannot update without row body");let i=this.qualifiedKnex(),o=this.parseBody(r);return i=this.addFilters(i,n),e.disableReturning?i.update(o):i.update(o).returning("*")}delete(e){let{filters:r}=this.query,n=this.qualifiedKnex();return n=this.addFilters(n,r),e.disableReturning?n.delete():n.delete().returning(this.generateSelectStatement())}},_m=class extends _c{constructor(r,n=d_()){super(r);this.limit=n}static{s(this,"SqlQueryBuilder")}convertToNative(r,n={}){let i=this.getSqlClient();if(n?.disableBindings)return{sql:r.toString()};{let o=Yn(r);return i==="sqlite3"&&(o=h_(o)),o}}_query(r,n={}){let i=this.getSqlClient(),o={client:this.getBaseSqlClient()};(i==="sqlite3"||i==="oracledb")&&(o.useNullAsDefault=!0);let a=(0,p_.knex)(o),u,c=new Am(i,a,r);switch(this._operation(r)){case"CREATE":u=c.create(n);break;case"READ":u=c.read({limits:{query:this.limit,base:d_()}});break;case"COUNT":u=c.read();break;case"UPDATE":u=c.update(n);break;case"DELETE":u=c.delete(n);break;case"BULK_CREATE":u=c.bulkCreate();break;case"BULK_UPSERT":u=c.bulkUpsert();break;case"CREATE_TABLE":case"UPDATE_TABLE":case"DELETE_TABLE":return this._tableQuery(r);default:throw"Operation type is not supported by SQL query builder"}return this.convertToNative(u,n)}async getReturningRow(r,n){if(!n.extra||!n.extra.idFilter)return{};let i=this._query({operation:"READ",datasource:n.datasource,schema:n.schema,table:n.table,tables:n.tables,resource:{fields:[]},filters:n.extra?.idFilter,paginate:{limit:1}});return r(i,"READ")}checkLookupKeys(r,n){if(!r||!n.table.primary)return n;let i=n.table.primary[0];return n.extra={idFilter:{equal:{[i]:r}}},n}async queryWithReturning(r,n,i=o=>o){let o=this.getSqlClient(),a=this._operation(r),u=this._query(r,{disableReturning:!0});if(Array.isArray(u)){let f=[];for(let p of u)f.push(await n(p,a));return f}let c;a==="DELETE"&&(c=i(await this.getReturningRow(n,r)));let l=await n(u,a),d=i(l);if(a==="CREATE"||a==="UPDATE"){let f;o==="mssql"?f=d?.[0].id:(o==="mysql2"||o==="mariadb")&&(f=d?.insertId),c=i(await this.getReturningRow(n,this.checkLookupKeys(f,r)))}return a==="COUNT"?d:a!=="READ"?c:d.length?d:[{[a.toLowerCase()]:!0}]}getTableName(r,n){let i=r.name;if(r.sourceType==="internal"||r.sourceId===vc){if(!r._id)return;i=r._id}return n?.[i]||i}convertJsonStringColumns(r,n,i){let o=this.getTableName(r,i);for(let[a,u]of Object.entries(r.schema)){if(!g_(u))continue;let c=`${o}.${a}`;for(let l of n)typeof l[c]=="string"&&(l[c]=JSON.parse(l[c])),typeof l[a]=="string"&&(l[a]=JSON.parse(l[a]))}return n}log(r,n){Ds(this.getSqlClient(),r,n)}},y_=_m;var Im={};N(Im,{base:()=>N0});function N0(t){return{_id:wt,language:"sqlite",sql:{tables:{},options:{table_name:t}}}}s(N0,"base");var Dm={};N(Dm,{jsonFromCsvString:()=>U0});var T_=F(require("csvtojson"));async function U0(t,e){let{ignoreEmpty:r=!1,allowSingleColumn:n=!1,possibleDelimiters:i=[",",";",":","|","~"," "," "]}=e||{};for(let o of i){let a,u=!1;try{let c=await(0,T_.default)({ignoreEmpty:r,delimiter:o}).fromString(t);for(let[,l]of c.entries()){let d=Object.keys(l);if(a==null&&(a=d),!n&&d.length===1){u=!0;break}if(a.length!==d.length){u=!0;break}for(let f of a)(l[f]===void 0||l[f]==="")&&(l[f]=null)}if(u)continue;return c}catch{continue}}throw new Error("Unable to determine delimiter")}s(U0,"jsonFromCsvString");var Rm=class{static{s(this,"Endpoint")}constructor(e,r,n){this.method=e,this.url=r,this.controller=n,this.middlewares=[],this.outputMiddlewares=[]}addMiddleware(e,r){return r?.first?this.middlewares.unshift(e):this.middlewares.push(e),this}addOutputMiddleware(e,r){return r?.first?this.outputMiddlewares.unshift(e):this.outputMiddlewares.push(e),this}apply(e){let r=this.method,n=this.url,i=this.middlewares,o=this.controller,a=this.outputMiddlewares,u=s(()=>{},"complete"),c=[n,...i,o,...a,u];e[r](...c)}},Oc=Rm;var S_=F(require("@koa/router"));var On=class{constructor(){this.endpoints=[];this.middlewares=[];this.outputMiddlewares=[];this.applied=!1;this.locked=!1}static{s(this,"EndpointGroup")}addGroupMiddleware(e,r={first:!0}){if(this.locked)throw new Error("Group locked, no more middleware can be added.");return this.middlewares.push({fn:e,first:r.first}),this}addGroupMiddlewareOutput(e,r={first:!1}){if(this.locked)throw new Error("Group locked, no more middleware can be added.");return this.outputMiddlewares.push({fn:e,first:r.first}),this}addEndpoint(e,r,...n){let i=n.pop(),o=new Oc(e,r,i);if(n.length!==0)for(let a of n)o.addMiddleware(a);return this.endpoints.push(o),this}lockMiddleware(){this.locked=!0}post(e,...r){return this.addEndpoint("post",e,...r)}patch(e,...r){return this.addEndpoint("patch",e,...r)}put(e,...r){return this.addEndpoint("put",e,...r)}get(e,...r){return this.addEndpoint("get",e,...r)}delete(e,...r){return this.addEndpoint("delete",e,...r)}head(e,...r){return this.addEndpoint("head",e,...r)}apply(e){let r=this.endpointList();e||(e=new S_.default);for(let n of r)n.apply(e);return e}endpointList(){if(this.applied)throw new Error("Already applied to router");this.applied=!0;for(let e of this.endpoints)this.middlewares.forEach(({fn:r,first:n})=>e.addMiddleware(r,{first:n})),this.outputMiddlewares.forEach(({fn:r,first:n})=>e.addOutputMiddleware(r,{first:n}));return this.endpoints}};var Lo=class{constructor(){this.groups=[]}static{s(this,"EndpointGroupList")}group(...e){let r=new On;return e.length&&e.forEach(n=>{"first"in n?r.addGroupMiddleware(n.middleware,{first:n.first}):r.addGroupMiddleware(n)}),this.groups.push(r),r}listAllEndpoints(){let e=this.groups.flatMap(i=>i.endpointList()),r=[],n=[];for(let i of e)i.url.includes(":")?n.push(i):r.push(i);return[...r,...n]}};var L0={...Qs,...ue},k0=s((t={})=>{Ka(t.db)},"init");0&&(module.exports={AutomationViewMode,BUDIBASE_DATASOURCE_TYPE,BadRequestError,BudibaseError,Config,Cookie,DEFAULT_BB_DATASOURCE_ID,DEFAULT_EMPLOYEE_TABLE_ID,DEFAULT_EXPENSES_TABLE_ID,DEFAULT_INVENTORY_TABLE_ID,DEFAULT_JOBS_TABLE_ID,DEFAULT_TENANT_ID,DeprecatedViews,DesignDocuments,DocumentType,Duration,DurationType,EmailUnavailableError,Endpoint,EndpointGroup,EndpointGroupList,FeatureDisabledError,ForbiddenError,GlobalRole,HTTPError,Header,InternalTable,InvalidAPIKeyError,MAX_VALID_DATE,MIN_VALID_DATE,NotFoundError,NotImplementedError,RedisClient,SEPARATOR,SQLITE_DESIGN_DOC_ID,SQS_DATASOURCE_INTERNAL,StaticDatabases,UNICODE_MAX,USER_METADATA_PREFIX,UnexpectedError,UsageLimitError,UserStatus,ViewName,WORKSPACE_DEV,WORKSPACE_DEV_PREFIX,WORKSPACE_PREFIX,accounts,auth,blacklist,cache,configs,constants,context,csv,db,docIds,docUpdates,encryption,env,errors,events,features,getPublicError,init,installation,locks,logging,middleware,objectStore,permissions,platform,plugins,queue,redis,roles,security,sessions,setEnv,sql,tenancy,timers,userUtils,users,utils,withEnv});
|
|
39
39
|
//# sourceMappingURL=index.js.map
|