@budibase/backend-core 3.40.0 → 3.40.1
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
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"),Vs=s(async(t,e)=>{let r={account_by_email:AS,platform_users_lowercase_2:_S};return je(pe.PLATFORM_INFO.name,async n=>{let i=r[t];return zf(t,e,n,i,{arrayResponse:!0})})},"queryPlatformView"),OS={by_email2:ES,by_api_key:TS,by_app:yS},Ht=s(async(t,e,r,n)=>{r||(r=z());let i=OS[t];return zf(t,e,r,i,n)},"queryGlobalView");async function qs(t,e,r){let n=z(),i=OS[t];return $s(t,e,n,i,r)}s(qs,"queryGlobalViewRaw");var mv=W(require("pouchdb"));var IS=require("dd-trace");var Jf=class{static{s(this,"Replication")}constructor({source:e,target:r}){this.source=it(e),this.target=it(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([Ps(this.source),Ps(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){for(let r of e)try{let[n,i]=await Promise.all([this.source.get(r),this.target.get(r)]),o=this.replicationDelta(n,i);if(o<0||o===0&&n._rev===i._rev)continue;let a=o+1;await IS.tracer.trace("Replication.resolveInconsistencies",async u=>{u.addTags({versionsToJump:a,toFix:!0,id:r,sourceRev:n._rev,targetRev:i._rev});for(let c=0;c<a;c++){let l=await this.source.get(i._id);await this.source.put(l)}})}catch{console.warn("Cannot resolve inconsistencies for document",r)}}replicationDelta(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,n=this.direction,i=n==="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,g)=>f?.startsWith(g+"_"),"startsWithID"),d=s(f=>l(f,"ro")||l(f,"li"),"isData");return{...e,filter:s((f,g)=>!o&&f._id==="_design/migrations"||i&&f._id.startsWith("_design")?!1:f._deleted||l(f._id,Rs)?!0:n==="toProduction"&&!o&&l(f._id,"autocolumn_state")?!1:d(f._id)?!!c?.find(m=>f._id.includes(m))||u:l(f._id,"log_au")||l(f._id,"agentlogsession")||f._id==="app_metadata"?!1:r?r(f,g):!0,"filter")}}async rollback(){await this.target.destroy(),this.target=it(this.target.name),await this.replicate()}},wS=Jf;var CS=W(require("node-fetch"));var Ks=Er.removeKeyNumbering;function Or(t){return t==null||t===""}s(Or,"isEmpty");var Yt=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:{},notOneOf:{},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}addNotOneOf(e,r){return this.#e.notOneOf[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=Ks(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,p)=>Or(p)?null:`${h}:${e.preprocess(p,o)}`,"equal"),c=s((h,p,T="AND")=>{if(Or(p))return null;if(!Array.isArray(p))return`${h}:${p}`;let A=`${e.preprocess(p[0],{escape:!0})}`;for(let _=1;_<p.length;_++)A+=` ${T} ${e.preprocess(p[_],{escape:!0})}`;return`${h}:(${A})`},"contains"),l=s((h,p)=>Or(p)?null:(p=e.preprocess(p,{escape:!0,lowercase:!0,type:"fuzzy"}),`${h}:/.*${p}.*/`),"fuzzy"),d=s((h,p)=>{let T=r?"*:* AND ":"",A=r?"AND":void 0;return T+"NOT "+c(h,p,A)},"notContains"),f=s((h,p)=>c(h,p,"OR"),"containsAny"),g=s((h,p)=>{if(Or(p))return"*:*";if(!Array.isArray(p))if(typeof p=="string")p=p.split(",");else return"";let T=`${e.preprocess(p[0],o)}`;for(let A=1;A<p.length;A++)T+=` OR ${e.preprocess(p[A],o)}`;return`${h}:(${T})`},"oneOf"),m=s((h,p)=>{if(Or(p))return null;if(!Array.isArray(p))if(typeof p=="string")p=p.split(",");else return"";let T=`${e.preprocess(p[0],o)}`;for(let A=1;A<p.length;A++)T+=` OR ${e.preprocess(p[A],o)}`;return`(*:* -${h}:(${T}))`},"notOneOf");function y(h,p,T){let A="";for(let[_,I]of Object.entries(h)){_=Ks(_),_=e.preprocess(e.handleSpaces(_),{escape:!0});let O=p(_,I);if(O!=null){if(A.length>0||n.length>0){let C=T?.mode?T.mode:r?"OR":"AND";A+=` ${C} `}A+=O,(typeof I!="string"&&I!=null||typeof I=="string"&&I!==a&&I!=="")&&(i=!1)}}if(T?.returnBuilt)return A;n+=A}if(s(y,"build"),this.#e.string&&y(this.#e.string,(h,p)=>Or(p)?null:(p=e.preprocess(p,{escape:!0,lowercase:!0,type:"string"}),`${h}:${p}*`)),this.#e.range&&y(this.#e.range,(h,p)=>{if(Or(p)||p.low==null||p.low===""||p.high==null||p.high==="")return null;let T=e.preprocess(p.low,o),A=e.preprocess(p.high,o);return`${h}:[${T} TO ${A}]`}),this.#e.fuzzy&&y(this.#e.fuzzy,l),this.#e.equal&&y(this.#e.equal,u),this.#e.notEqual&&y(this.#e.notEqual,(h,p)=>Or(p)?null:typeof p=="boolean"?`(*:* AND !${h}:${p})`:`!${h}:${e.preprocess(p,o)}`),this.#e.empty&&y(this.#e.empty,h=>(i=!1,`(*:* -${h}:["" TO *])`)),this.#e.notEmpty&&y(this.#e.notEmpty,h=>(i=!1,`${h}:["" TO *]`)),this.#e.oneOf&&y(this.#e.oneOf,g),this.#e.notOneOf&&y(this.#e.notOneOf,m),this.#e.contains&&y(this.#e.contains,c),this.#e.notContains&&y(this.compressFilters(this.#e.notContains),d),this.#e.containsAny&&y(this.#e.containsAny,f),a&&(n=this.isMultiCondition()?`(${n})`:n,r=!1,y({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}=vt(),n=`${e}/${this.#l}/_design/database/_search/${this.#d}`,i=this.buildSearchBody();try{return await RS(n,i,r)}catch(o){if(o.status===404&&this.#a)return await this.#a(),await RS(n,i,r);throw o}}};async function RS(t,e,r){let n=await(0,CS.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(RS,"runQuery");async function DS(t,e,r,n){let i=n.bookmark,o=n.rows||[];if(n.limit&&o.length>=n.limit)return o;let a=Yt.maxLimit;n.limit&&o.length>n.limit-Yt.maxLimit&&(a=n.limit-o.length);let u=new Yt(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<Yt.maxLimit)return[...o,...c.rows];let l={...n,bookmark:c.bookmark,rows:[...o,...c.rows]};return await DS(t,e,r,l)}s(DS,"recursiveSearch");async function hv(t,e,r,n){let i=n.limit;(i==null||isNaN(i)||i<0)&&(i=50),i=Math.min(i,Yt.maxLimit);let o=new Yt(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(hv,"paginatedSearch");async function gv(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 DS(t,e,r,n)}}s(gv,"fullSearch");var Xf={};P(Xf,{createUserIndex:()=>Ev});async function Ev(){let t=z(),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(Ev,"createUserIndex");function bS(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(bS,"checkErrorCode");function yv(t){return bS(t,409)}s(yv,"isDocumentConflictError");var js={};P(js,{addTenantToUrl:()=>Tv,getTenantDB:()=>Zf,getTenantIDFromCtx:()=>Qs,isUserInWorkspaceTenant:()=>Sv});function Zf(t){return Ce(un(t))}s(Zf,"getTenantDB");function Tv(t){let e=q();if(Sr()){let r=t.indexOf("?")===-1?"?":"&";t+=`${r}tenantId=${e}`}return t}s(Tv,"addTenantToUrl");var Sv=s((t,e)=>{let r;return e?r=e.tenantId||ce:r=q(),(Zn(t)||ce)===r},"isUserInWorkspaceTenant"),Av=Object.values(vi),Qs=s((t,e)=>{if(!Sr())return ce;e.allowNoTenant===void 0&&(e.allowNoTenant=!1),e.includeStrategies||(e.includeStrategies=Av),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(bf()).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 yu={milliseconds:1,seconds:1e3,minutes:60*1e3,hours:3600*1e3,days:1440*60*1e3},me=class t{constructor(e){this.ms=e}static{s(this,"Duration")}to(e){return this.ms/yu[e]}toMs(){return this.ms}toSeconds(){return this.to("seconds")}static convert(e,r,n){return n*yu[e]/yu[r]}static from(e,r){return new t(r*yu[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)}};function Tu(){let t=me.fromDays(7).toSeconds();if(!E.SESSION_EXPIRY_SECONDS)return t;let e=parseInt(E.SESSION_EXPIRY_SECONDS);return Number.isFinite(e)&&e>0?e:t}s(Tu,"getSessionExpirySeconds");function ep(){return new Date(Date.now()+Tu()*1e3)}s(ep,"getSessionExpiryDate");var tp="app_",xS="/app/",vS="/app-chat/";async function _v(t){let r=t.path.split("/")[2];if(!r)return;let n=`/${r.toLowerCase()}`,i=q();!E.isDev()&&E.MULTI_TENANCY&&(i=Qs(t,{includeStrategies:["subdomain"]}));let a=(await De(i,()=>Gs({dev:!1}))).filter(u=>u.url&&u.url.toLowerCase()===n)[0];return a&&a.appId?a.appId:void 0}s(_v,"resolveAppUrl");function Ov(t){return t.path.startsWith(`/${tp}`)?!0:t.path.startsWith(xS)||t.path.startsWith(vS)}s(Ov,"isServingApp");function Iv(t){return t.path.startsWith("/builder/workspace/")}s(Iv,"isServingBuilder");function wv(t){return NS(t.path)}s(wv,"isServingBuilderPreview");function NS(t){return new RegExp(/^\/app\/app_\w+\/preview$/).test(t)}s(NS,"isBuilderPreviewUrl");function Rv(t){return t.path.startsWith("/api/public/v")}s(Rv,"isPublicApiRequest");async function dn(t){let e;function r(u){u&&u.startsWith(tp)&&(e&&e!==u&&t.throw(403,"App id conflict"),e=u)}s(r,"setWorkspaceIdIfValid");function n(u){if(u){typeof u=="string"&&(u=[u]);for(let c of u)r(c)}}s(n,"checkPossibleValues"),n(t.request.headers["x-budibase-app-id"]),r(t.request.body?.appId);let i=Cv(t.path);r(i),n(t.query?.appId);let o=NS(t.path);return(t.path.startsWith(xS)||t.path.startsWith(vS))&&!o&&r(await _v(t)),e}s(dn,"getWorkspaceIdFromCtx");function Cv(t){if(t)return t.split("?")[0].split("/").find(e=>e.startsWith(tp))}s(Cv,"parseWorkspaceIdFromUrlPath");function Au(t){if(t)try{return Su.default.verify(t,E.JWT_SECRET)}catch(e){if(E.JWT_SECRET_FALLBACK)return Su.default.verify(t,E.JWT_SECRET_FALLBACK);throw e}}s(Au,"openJwt");function Hs(t){return E.INTERNAL_API_KEY&&E.INTERNAL_API_KEY===t?!0:!!(E.INTERNAL_API_KEY_FALLBACK&&E.INTERNAL_API_KEY_FALLBACK===t)}s(Hs,"isValidInternalAPIKey");function zt(t,e){let r=t.cookies.get(e);if(r)return Au(r)}s(zt,"getCookie");function rp(t,e,r="builder",n={sign:!0}){e&&n&&n.sign&&(e=Su.default.sign(e,E.JWT_SECRET));let i=n.sameSite,o=n.secure??t.secure;i==="none"&&(o?o=!0:i="lax");let a={expires:n.expires??Va,path:"/",httpOnly:n.httpOnly??!1,secure:o,overwrite:!0};i&&(a.sameSite=i),E.COOKIE_DOMAIN&&(a.domain=E.COOKIE_DOMAIN),t.cookies.set(r,e,a)}s(rp,"setCookie");function Dv(t,e){rp(t,e,"budibase:auth",{sign:!1,httpOnly:!0,expires:ep()})}s(Dv,"setAuthCookie");function Jt(t,e){rp(t,null,e)}s(Jt,"clearCookie");function bv(t){return t.headers["x-budibase-type"]==="client"}s(bv,"isClient");function np(t){return new Promise(e=>setTimeout(e,t))}s(np,"timeout");function ip(t){return!!fh[t]}s(ip,"isAudited");function xv(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(xv,"hasCircularStructure");function vv(t){return!!t.match(/^.+:\/\/.+$/)}s(vv,"urlHasProtocol");function sp(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(sp,"validEmail");async function Nv(t){let e=performance.now();return[await t(),me.fromMilliseconds(performance.now()-e)]}s(Nv,"time");var _u=require("undici");function Pv(t,e){let r,n=null;try{let o=new URL(t);r=o.hostname,n=o.port||null}catch{return!1}let i=e.split(/[\s,]+/).filter(o=>o.length>0);for(let o of i){let u=o.replace(/^\./,"*").match(/^(.+?)(?::(\d+))?$/);if(!u||!u[1])continue;let c=u[1].toLowerCase(),l=u[2]||null,d=!1;if(c==="*")d=!0;else if(c.startsWith("*")){let g=c.slice(1);d=r===g.slice(1)||r.endsWith(g)}else d=r===c;if(d&&(!l||n===l))return!0}return!1}s(Pv,"isUrlMatchingNoProxy");function Lv(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!0;try{new URL(n.trim())}catch{return console.log("[fetch] Invalid proxy URL format:",n),!0}if(t){let i=process.env.GLOBAL_AGENT_NO_PROXY||process.env.NO_PROXY||"";if(i&&Pv(t,i))return console.log("[fetch] URL matches NO_PROXY pattern, bypassing proxy",{url:t,noProxy:i}),!0}return!1}s(Lv,"shouldBypassProxy");function Uv(t,e){return new _u.Agent({connect:{rejectUnauthorized:t,...e?{lookup:e}:{}}})}s(Uv,"createDirectAgent");function kv(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).trim();console.log("[fetch] Creating ProxyAgent",{proxyUrl:n,rejectUnauthorized:t});let i={uri:n,requestTls:{rejectUnauthorized:t}};return n.startsWith("https://")&&(i.proxyTls={rejectUnauthorized:t}),new _u.ProxyAgent(i)}s(kv,"createProxyAgent");function Mv(t){let e=t?.rejectUnauthorized??!0;return Lv(t?.url)?Uv(e,t?.lookup):(t?.lookup&&console.log("[fetch] Proxy configured; IP pinning is not applied to proxied requests"),kv(e))}s(Mv,"createDispatcher");function Fv(t){return Mv(t)}s(Fv,"getDispatcher");var op=require("util"),ap=W(require("zlib"));var Bv=(0,op.promisify)(ap.default.gzip),Wv=(0,op.promisify)(ap.default.gunzip),Ou="gzip:",Gv=s(async t=>{let e=await Bv(t);return`${Ou}${e.toString("base64")}`},"gzipToBase64"),$v=s(async t=>{let e=t.startsWith(Ou)?t.slice(Ou.length):t,r=Buffer.from(e,"base64");return(await Wv(new Uint8Array(r))).toString("utf8")},"gunzipFromBase64");function Vv(t){let e=t.get("authorization");if(!e)return null;let r=e.match(/^Bearer\s+(.+)$/i);return r?r[1]:null}s(Vv,"getBearerToken");var BS=W(require("http")),WS=W(require("https"));var fp={};P(fp,{isBlacklisted:()=>dp,refreshBlacklist:()=>MS,resolveAddress:()=>Iu});var PS=W(require("dns")),wr=W(require("net"));var LS=require("util");var qv=["127.0.0.0/8","10.0.0.0/8","172.16.0.0/12","192.168.0.0/16","169.254.0.0/16","0.0.0.0/8","::1/128","fc00::/7","fe80::/10"],cp,Kv=(0,LS.promisify)(PS.default.lookup);function US(){return!(E.SELF_HOSTED&&E.BLACKLIST_IPS!==void 0)}s(US,"shouldApplyDefaultBlacklist");function lp(t){return wr.default.isIP(t)===6?"ipv6":"ipv4"}s(lp,"getIpVersion");function Qv(t){let e=wr.default.isIP(t);return e===4?32:e===6?128:null}s(Qv,"getMaxPrefixLength");function jv(t,e){if(!/^\d+$/.test(e))return null;let r=Number.parseInt(e,10),n=Qv(t);return n==null||r>n?null:r}s(jv,"getValidSubnetPrefix");function Hv(t){return wr.default.isIP(t)?t:(/^https?:\/\//.test(t)||(t=`https://${t}`),new URL(t).hostname.replace(/^\[|\]$/g,""))}s(Hv,"parseAddress");async function kS(t){return t=Hv(t),(await Kv(t,{all:!0})).map(r=>r.address)}s(kS,"lookup");async function Iu(t){return wr.default.isIP(t)?[t]:kS(t)}s(Iu,"resolveAddress");function up(t,e){let r=e.trim();if(!r)return;let n=r.split("/");if(n.length>2){console.log(`Ignoring invalid blacklist entry: ${r}`);return}let[i,o]=n,a=wr.default.isIP(i);if(n.length===2){let u=jv(i,o);if(a&&u!==null){t.addSubnet(i,u,lp(i));return}console.log(`Ignoring invalid blacklist entry: ${r}`);return}a&&t.addAddress(i,lp(i))}s(up,"addEntryToBlacklist");async function MS(){let t=new wr.default.BlockList;if(US())for(let r of qv)up(t,r);let e=E.BLACKLIST_IPS?.split(",")||[];for(let r of e){let n=r.trim();if(!n)continue;let[i]=n.split("/");if(wr.default.isIP(i)){up(t,n);continue}let o=await kS(n);for(let a of o)up(t,a)}cp=t}s(MS,"refreshBlacklist");async function dp(t){cp||await MS();let e;try{e=await Iu(t)}catch(r){return r instanceof TypeError?(console.error("Black list error: could not parse address: ",t),!0):US()}return e.some(r=>cp.check(r,lp(r)))}s(dp,"isBlacklisted");var wu=W(require("node-fetch"));var FS=5,Yv=new Set(["http:","https:"]),zv=["authorization","cookie","cookie2","proxy-authorization"];function pp(t){let e;try{e=new URL(t)}catch{throw new Error("Invalid URL.")}if(!Yv.has(e.protocol))throw new Error("Only HTTP(S) URLs are allowed.");if(e.username||e.password)throw new Error("URL must not include credentials.");return e}s(pp,"parseUrl");function Jv(t){return[301,302,303,307,308].includes(t)}s(Jv,"isRedirect");async function Xv(t){let e=pp(t),r=await Iu(e.hostname);if(r.length===0)throw new Error("URL is blocked or could not be resolved safely.");for(let n of r)if(await dp(n))throw new Error("URL is blocked or could not be resolved safely.");return r[0]}s(Xv,"resolveSafePinnedIp");function GS(t){let e=t.includes(":")?6:4;return(r,n,i)=>{if(typeof n=="object"&&n?.all){i(null,[{address:t,family:e}]);return}i(null,t,e)}}s(GS,"createPinnedLookup");function Zv(t,e){let r=new URL(t).protocol,n=GS(e);return r==="https:"?new WS.default.Agent({lookup:n}):new BS.default.Agent({lookup:n})}s(Zv,"makePinnedAgent");function eN(t,e){let r=t.method?.toUpperCase()||"GET";return e===303||(e===301||e===302)&&r==="POST"?{...t,body:void 0,method:"GET",redirect:"manual"}:t}s(eN,"nextRequestForRedirect");function tN(t,e){return new URL(t).origin!==new URL(e).origin}s(tN,"shouldStripSensitiveHeadersForRedirect");function rN(t){if(!t.headers)return t;let e=new wu.Headers(t.headers);return zv.forEach(r=>e.delete(r)),{...t,headers:e}}s(rN,"stripSensitiveHeadersForRedirect");function nN(t){return!t||typeof t!="object"||!("resume"in t)?!1:typeof t.resume=="function"}s(nN,"isResumableBody");function iN(t){let e=t.body;nN(e)&&e.resume()}s(iN,"releaseResponseBody");async function oi(t,e={},{followRedirects:r=!0,returnRedirectWithoutLocation:n=!1,fetchFn:i=wu.default}={}){let o=t,a={...e,redirect:"manual"};for(let u=0;u<=FS;u++){let c=await Xv(o),l;try{l=await i(o,{...a,agent:Zv(o,c)},c)}catch(g){let m=pp(o).hostname;throw g instanceof Error?(g.message=`Failed to connect to resolved IP for ${m}: ${g.message}`,g):new Error(`Failed to connect to resolved IP for ${m}: unknown network error`)}if(!Jv(l.status))return l;if(iN(l),!r)throw new Error("Redirects are not permitted.");if(u===FS)break;let d=l.headers.get("location");if(!d){if(n)return l;throw new Error("Maximum redirect reached.")}let f=pp(new URL(d,o).toString()).toString();a=eN(a,l.status),tN(o,f)&&(a=rN(a)),o=f}throw new Error("Maximum redirect reached.")}s(oi,"fetchWithBlacklist");var sN=s((t,e)=>`datasource:creation:${t}:microsoft:${e}`,"microsoftDatasourceCreationCacheKey");function oN(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(oN,"jobToJobInformation");var Ru=class{static{s(this,"InMemoryQueue")}constructor(e,r){this._name=e,this._opts=r,this._messages=[],this._emitter=new $S.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,g)=>{f?l(f):c(g)},"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 Ue.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=X(),a=s(()=>{let c={id:o,timestamp:Date.now(),queue:this,data:e,opts:n,discard:s(async()=>{c._isDiscarded=!0},"discard")};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:s(()=>new Promise((c,l)=>{let d=s((g,m)=>{g.id===o&&(this._emitter.off("error",d),this._emitter.off("completed",f),l(m))},"errorHandler"),f=s((g,m)=>{g.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)}),"finished")}}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}async getJobs(){return this._messages}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=>oN(e))}async whenCurrentJobsFinished(){do await np(50);while(this.hasRunningJobs())}hasRunningJobs(){return this._addCount>this._runCount}},VS=Ru;var gp=W(require("bull"));var ui=(y=>(y.AUTOMATION="automationQueue",y.APP_BACKUP="appBackupQueue",y.AUDIT_LOG="auditLogQueue",y.SYSTEM_EVENT_QUEUE="systemEventQueue",y.APP_MIGRATION="appMigration",y.DOC_WRITETHROUGH_QUEUE="docWritethroughQueue",y.DEV_REVERT_PROCESSOR="devRevertProcessorQueue",y.BATCH_USER_SYNC_PROCESSOR="batchUserSyncProcessorQueue",y.RAG_INGESTION="ragIngestionQueue",y.KNOWLEDGE_SOURCE_SYNC="knowledgeSourceSyncQueue",y.AGENT_LOG_INDEXING="agentLogIndexingQueue",y.ESCALATION="escalationQueue",y.AGENT_REQUEST_TRACKING="agentRequestTrackingQueue",y.AGENT_TEST_RUN="agentTestRunQueue",y))(ui||{});function qS(t,e,r){cN(t,e),r&&aN(t,r)}s(qS,"addListeners");function aN(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(aN,"handleStalled");function ot(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(ot,"getLogParams");var uN={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",ragIngestionQueue:"rag-ingestion-processor",agentLogIndexingQueue:"agent-log-indexing-processor",escalationQueue:"escalation-processor",agentRequestTrackingQueue:"agent-request-tracking-processor",agentTestRunQueue:"agent-test-run-processor",knowledgeSourceSyncQueue:"knowledge-source-sync-processor"};function cN(t,e){let r=uN[e];function n(i,o){let a=i.data.event?.appId;if(a)return xf(a,o);o()}s(n,"doInJobContext"),t.on("stalled",async i=>{await n(i,()=>{console.error(...ot(r,"stalled",{job:i}))})}).on("error",i=>{console.error(...ot(r,"error",{error:i}))}),process.env.NODE_DEBUG?.includes("bull")&&t.on("waiting",i=>{console.info(...ot(r,"waiting",{jobId:i}))}).on("active",async i=>{await n(i,()=>{console.info(...ot(r,"active",{job:i}))})}).on("progress",async(i,o)=>{await n(i,()=>{console.info(...ot(r,"progress",{job:i},{progress:o}))})}).on("completed",async(i,o)=>{await n(i,()=>{console.info(...ot(r,"completed",{job:i},{result:o}))})}).on("failed",async(i,o)=>{await n(i,()=>{console.error(...ot(r,"failed",{job:i,error:o}))})}).on("paused",()=>{console.info(...ot(r,"paused"))}).on("resumed",()=>{console.info(...ot(r,"resumed"))}).on("cleaned",(i,o)=>{console.info(...ot(r,"cleaned",{},{length:i.length,type:o}))}).on("drained",()=>{console.info(...ot(r,"drained"))}).on("removed",i=>{console.info(...ot(r,"removed",{job:i}))})}s(cN,"logging");var Cu={};P(Cu,{cleanup:()=>lN,clear:()=>hp,set:()=>mp});var Ys=[];function mp(t,e){let r=setInterval(t,e);return Ys.push(r),r}s(mp,"set");function hp(t){let e=Ys.indexOf(t);e!==-1&&Ys.splice(e,1),clearInterval(t)}s(hp,"clear");function lN(){for(let t of Ys)clearInterval(t);Ys=[]}s(lN,"cleanup");var Xt=W(require("dd-trace")),zs=W(require("object-sizeof"));var dN=me.fromMinutes(5).toMs(),fN=me.fromSeconds(30).toMs(),Ep=me.fromSeconds(60).toMs(),Js=[],Du;async function KS(){for(let t of Js)await t.clean(Ep,"completed"),await t.clean(Ep,"failed")}s(KS,"cleanup");async function pN(t,e,r){let n=performance.now();try{let i=await e();return Xt.default.dogstatsd.increment(`${t}.success`,1,r),i}catch(i){throw Xt.default.dogstatsd.increment(`${t}.error`,1,r),i}finally{let i=performance.now()-n;Xt.default.dogstatsd.distribution(`${t}.duration.ms`,i,r),Xt.default.dogstatsd.increment(t,1,r)}}s(pN,"withMetrics");function QS(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(QS,"jobOptsTags");function mN(t){return{"job.id":t.id,"job.attemptsMade":t.attemptsMade,"job.timestamp":t.timestamp,"job.data.sizeBytes":(0,zs.default)(t.data),...QS(t.opts||{})}}s(mN,"jobTags");var Et=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:on(),settings:{maxStalledCount:this.opts.maxStalledCount?this.opts.maxStalledCount:0,lockDuration:dN,lockRenewTime:fN}};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 gp.default(this.jobQueue,{...r,redis:{host:"localhost",port:+process.env.BULL_TEST_REDIS_PORT}}):n=new VS(this.jobQueue,r):n=new gp.default(this.jobQueue,r),qS(n,this.jobQueue,this.opts.removeStalledCb),Js.push(n),!Du&&!E.isTest()&&(Du=mp(KS,Ep),KS().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 Xt.default.trace("queue.process",async c=>{if(a.data._parentSpanContext){let l=a.data._parentSpanContext,d={traceId:l.traceId,spanId:l.spanId,toTraceId:s(()=>l.traceId,"toTraceId"),toSpanId:s(()=>l.spanId,"toSpanId"),toTraceparent:s(()=>"","toTraceparent")};c.addLink(d)}c.addTags({"queue.name":this.jobQueue,...mN(a)}),this.opts.jobTags&&c.addTags(this.opts.jobTags(a.data)),Xt.default.dogstatsd.distribution("queue.process.sizeBytes",(0,zs.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 Xt.default.trace("queue.add",async n=>(n.addTags({"queue.name":this.jobQueue,"job.data.sizeBytes":(0,zs.default)(e),...QS(r||{})}),this.opts.jobTags&&n.addTags(this.opts.jobTags(e)),e._parentSpanContext={traceId:n.context().toTraceId(),spanId:n.context().toSpanId()},Xt.default.dogstatsd.distribution("queue.add.sizeBytes",(0,zs.default)(e),this.metricTags()),await this.withMetrics("queue.add",()=>this.queue.add(e,r))))}withMetrics(e,r){return pN(e,r,this.metricTags())}metricTags(){return{queueName:this.jobQueue}}close(e){return this.queue.close(e)}whenCurrentJobsFinished(){return this.queue.whenCurrentJobsFinished()}};async function hN(){Du&&hp(Du),console.log("Waiting for current queue jobs to finish...");for(let t of Js)await t.whenCurrentJobsFinished();console.log("Closing queue Redis connections...");for(let t of Js)await t.close();Js=[],console.log("Queues shutdown")}s(hN,"shutdown");var io={};P(io,{correlation:()=>Xs,logAlert:()=>mn,logAlertWithInfo:()=>ZN,logWarn:()=>di,logger:()=>ku,system:()=>vp});var Xs={};P(Xs,{getId:()=>yp,setHeader:()=>gN});var jS=require("correlation-id"),gN=s(t=>{let e=jS.getId();e&&(t["x-budibase-correlation-id"]=e)},"setHeader");function yp(){return jS.getId()}s(yp,"getId");var Uu=W(require("pino")),IA=W(require("pino-pretty")),Np=W(require("dd-trace")),wA=require("dd-trace/ext");var vp={};P(vp,{getLogReadStream:()=>jN,getSingleFileMaxSizeInfo:()=>OA,localFileDestination:()=>xp});var no=W(require("fs")),bp=W(require("path")),TA=W(require("rotating-file-stream"));var Dp={};P(Dp,{ObjectStore:()=>at,ObjectStoreBuckets:()=>yN,SIGNED_FILE_PREFIX:()=>Ip,bucketTTLConfig:()=>bu,budibaseTempDir:()=>fn,client3rdPartyLibrary:()=>WN,clientLibraryPath:()=>BN,clientLibraryUrl:()=>GN,createBucketIfNotExists:()=>ro,deleteFile:()=>xN,deleteFiles:()=>vN,deleteFolder:()=>aA,downloadTarball:()=>PN,downloadTarballDirect:()=>NN,enrichPWAImages:()=>$N,enrichPluginURLs:()=>qN,extractBucketAndPath:()=>Tp,getAllFiles:()=>CN,getAppFileUrl:()=>dA,getClientCacheKey:()=>lA,getGlobalFileS3Key:()=>fA,getGlobalFileUrl:()=>VN,getObjectMetadata:()=>LN,getPluginIconKey:()=>hA,getPluginJSKey:()=>mA,getPluginS3Dir:()=>EA,getPresignedUrl:()=>pn,getReadStream:()=>xu,getSafeRetrieveDirectoryPath:()=>oA,listAllObjects:()=>wp,objectExists:()=>UN,processAutomationAttachment:()=>SN,processObjectStoreAttachment:()=>XS,retrieve:()=>sA,retrieveDirectory:()=>bN,retrieveToTmp:()=>DN,sanitizeBucket:()=>be,sanitizeKey:()=>Ee,streamUpload:()=>iA,streamUploadMany:()=>RN,upload:()=>wN,uploadDirectory:()=>Rp});var Nu=require("@aws-sdk/client-s3"),Sp=require("@aws-sdk/lib-storage"),ZS=require("@aws-sdk/s3-request-presigner"),eA=require("@smithy/node-http-handler");var Zt=W(require("dd-trace")),ci=W(require("fs")),eo=W(require("fs/promises")),tA=W(require("https")),Ye=require("path"),Pu=W(require("stream")),to=require("stream/promises"),Ap=W(require("tar-fs")),_p=require("uuid"),Op=W(require("zlib"));var HS=W(require("fs")),YS=require("os"),Zs=W(require("path")),zS=W(require("stream"));var yN={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},JS=(0,Zs.join)((0,YS.tmpdir)(),".budibase");try{HS.default.mkdirSync(JS)}catch(t){if(t.code!=="EEXIST")throw t}function fn(){return JS}s(fn,"budibaseTempDir");var bu=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 TN(t){let e=await oi(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");if(!(e.body instanceof zS.default.Readable))throw new Error("Unexpected response body stream type");return{filename:t.filename||r,content:e.body}}s(TN,"processUrlAttachment");async function XS(t){let e=Tp(t.url);if(e===null)throw new Error("Invalid signed URL");let{bucket:r,path:n}=e,{stream:i}=await xu(r,n),o=Zs.default.basename(n);return{bucket:r,path:n,filename:t.filename||o,content:i}}s(XS,"processObjectStoreAttachment");async function SN(t){return t.url?.startsWith("http://")||t.url?.startsWith("https://")?await TN(t):await XS(t)}s(SN,"processAutomationAttachment");var AN=require("sanitize-s3-objectkey"),_N={bucketCreationPromises:{}},Ip="/files/signed",Rr={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"},ON=[Rr.html,Rr.css,Rr.js,Rr.json];function Ee(t){let e=AN(be(t)).replace(/\\/g,"/");if(e.split("/").some(r=>r==="."||r===".."))throw new Error("Invalid object store key: path traversal is not allowed.");return e}s(Ee,"sanitizeKey");function be(t){return t.replace(new RegExp(nt,"g"),rt)}s(be,"sanitizeBucket");function at(t={presigning:!1}){let e={forcePathStyle:!0,credentials:{accessKeyId:E.MINIO_ACCESS_KEY,secretAccessKey:E.MINIO_SECRET_KEY},region:E.AWS_REGION};if(!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),E.S3_IGNORE_SELF_SIGNED==="true"){let r=new tA.default.Agent({rejectUnauthorized:!1});e.requestHandler=new eA.NodeHttpHandler({httpsAgent:r})}return new Nu.S3(e)}s(at,"ObjectStore");async function ro(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||r.$metadata?.httpStatusCode,i=_N.bucketCreationPromises;if(n===403)throw new Error("Access denied to object store bucket."+r);if(i[e])return await i[e],{created:!1,exists:!0};i[e]=t.createBucket({Bucket:e}).catch(o=>{if(o.Code!=="BucketAlreadyOwnedByYou"&&o.name!=="BucketAlreadyOwnedByYou")throw o});try{return await i[e],{created:!0,exists:!1}}finally{delete i[e]}}}s(ro,"createBucketIfNotExists");var IN=s((t,e)=>{if(e)return e;let r=t.split(".").pop();return r?Rr[r.toLowerCase()]:Rr.txt},"resolveContentType"),rA=s(async(t,e,r)=>{let n=be(t),i=at(),o=await ro(i,n);if(r.addTags({bucketCreated:o.created,bucketExists:o.exists}),e&&o.created){let a=bu(n,e);await i.putBucketLifecycleConfiguration(a)}return{bucket:n,client:i,bucketCreated:o}},"initialiseBucket"),nA=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=IN(r,i),u=Ee(r),c={Bucket:e,Key:u,Body:n,ContentType:a,...o??{}};return{details:await new Sp.Upload({client:t,params:c}).done(),contentType:a}},"streamUploadInternal");async function wN({bucket:t,filename:e,path:r,type:n,metadata:i,body:o,ttl:a}){let u=e.split(".").pop(),c=r?(await eo.default.open(r)).createReadStream():o,l=at(),d=await ro(l,t);if(a&&d.created){let h=bu(t,a);await l.putBucketLifecycleConfiguration(h)}let f=n,g=f||(u?Rr[u.toLowerCase()]:Rr.txt),m={Bucket:be(t),Key:Ee(e),Body:c,ContentType:g};if(i&&typeof i=="object"){for(let h of Object.keys(i))(!i[h]||typeof i[h]!="string")&&delete i[h];m.Metadata=i}return new Sp.Upload({client:l,params:m}).done()}s(wN,"upload");async function iA({bucket:t,stream:e,filename:r,type:n,extra:i,ttl:o}){return await Zt.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 rA(t,o,a),{details:d,contentType:f}=await nA({client:l,bucket:c,filename:r,stream:e,type:n,extra:i}),g=await l.headObject({Bucket:c,Key:Ee(r)});return a.addTags({contentType:f,contentLength:g.ContentLength}),{...d,ContentLength:g.ContentLength}})}s(iA,"streamUpload");async function RN({bucket:t,files:e,ttl:r}){return await Zt.default.trace("streamUploadMany",async i=>{if(i.addTags({bucketName:t,ttl:r,fileCount:e.length}),!e.length)return[];let{bucket:o,client:a}=await rA(t,r,i),u=e.map((l,d)=>({...l,index:d})),c=new Array(e.length);return await wt.parallelForeach(u,async l=>{let{details:d}=await nA({client:a,bucket:o,filename:l.filename,stream:l.stream,type:l.type,extra:l.extra});c[l.index]=d},10),c})}s(RN,"streamUploadMany");async function sA(t,e){return await Zt.default.trace("retrieve",async r=>{r.addTags({bucketName:t,filepath:e});let n=at(),i={Bucket:be(t),Key:Ee(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}),ON.includes(o.ContentType))return r.addTags({string:!0}),o.Body.transformToString();{r.addTags({string:!1});let a=o.Body.transformToWebStream();return Pu.default.Readable.fromWeb(a)}})}s(sA,"retrieve");async function*wp(t,e){let r=at(),n=s((a={})=>r.listObjectsV2({...a,Bucket:be(t),Prefix:Ee(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(wp,"listAllObjects");async function CN(t,e){let r={};return await wt.parallelForeach(wp(t,e),async n=>{if(!n.Key)throw new Error("file.Key must be defined");r[n.Key]=n},5),r}s(CN,"getAllFiles");async function pn(t,e,r=3600){let n=at({presigning:!0}),i={Bucket:be(t),Key:Ee(e)},o=await(0,ZS.getSignedUrl)(n,new Nu.GetObjectCommand(i),{expiresIn:r});if(E.MINIO_ENABLED){let a=new URL(o),u=a.pathname,c=a.search;return`${Ip}${u}${c}`}else return o}s(pn,"getPresignedUrl");async function DN(t,e){return await Zt.default.trace("retrieveToTmp",async r=>{r.addTags({bucketName:t,filepath:e}),t=be(t),e=Ee(e);let n=await sA(t,e),i=(0,Ye.join)(fn(),(0,_p.v4)());return r.addTags({outputPath:i}),n instanceof Pu.default.Readable?(r.addTags({stream:!0}),await(0,to.pipeline)(n,ci.default.createWriteStream(i))):(r.addTags({stream:!1}),ci.default.writeFileSync(i,n)),i})}s(DN,"retrieveToTmp");async function bN(t,e,r){return await Zt.default.trace("retrieveDirectory",async n=>{n.addTags({bucketName:t,path:e});let i=(0,Ye.join)(fn(),(0,_p.v4)());await eo.default.mkdir(i,{recursive:!0});let o=0;return await wt.parallelForeach(wp(t,e),async a=>{let{Key:u}=a;!u||r?.some(c=>c.test(u))||(o++,await Zt.default.trace("retrieveDirectory.object",async c=>{let l=a.Key;c.addTags({filename:l});let d=oA(i,l);if(!d){c.addTags({skippedUnsafePath:!0});return}let{stream:f}=await xu(t,l);ci.default.existsSync(d.dir)||await eo.default.mkdir(d.dir,{recursive:!0}),await(0,to.pipeline)(f,ci.default.createWriteStream(d.path,{mode:420}))}))},5),n.addTags({numObjects:o}),i})}s(bN,"retrieveDirectory");function oA(t,e){let r=(0,Ye.resolve)(t),n=(0,Ye.resolve)(r,...e.split("/"));if(n===r||n.startsWith(`${r}${Ye.sep}`))return{dir:(0,Ye.dirname)(n),path:n}}s(oA,"getSafeRetrieveDirectoryPath");async function xN(t,e){let r=at();await ro(r,t);let n={Bucket:t,Key:Ee(e)};return r.deleteObject(n)}s(xN,"deleteFile");async function vN(t,e){let r=at();await ro(r,t);let n={Bucket:t,Delete:{Objects:e.map(i=>({Key:Ee(i)}))}};return r.deleteObjects(n)}s(vN,"deleteFiles");async function aA(t,e){t=be(t),e=Ee(e);let r=at(),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 aA(t,e)}s(aA,"deleteFolder");async function Rp(t,e,r){return await Zt.default.trace("uploadDirectory",async n=>{n.addTags({bucketName:t,localPath:e,bucketPath:r}),t=be(t);let i=await eo.default.readdir(e,{withFileTypes:!0});n.addTags({numFiles:i.length});for(let o of i){let a=Ee((0,Ye.join)(r,o.name)),u=(0,Ye.join)(e,o.name);o.isDirectory()?await Rp(t,u,a):await iA({bucket:t,filename:a,stream:ci.default.createReadStream(u)})}return i})}s(Rp,"uploadDirectory");async function NN(t,e,r={},{followRedirects:n=!0}={}){e=Ee(e);let i=await oi(t,{headers:r},{followRedirects:n});if(!i.ok)throw new Error(`unexpected response ${i.statusText}`);await(0,to.pipeline)(i.body,Op.default.createUnzip(),Ap.default.extract(e))}s(NN,"downloadTarballDirect");async function PN(t,e,r){e=be(e),r=Ee(r);let n=await oi(t);if(!n.ok)throw new Error(`unexpected response ${n.statusText}`);let i=(0,Ye.join)(fn(),r);return await(0,to.pipeline)(n.body,Op.default.createUnzip(),Ap.default.extract(i)),!E.isTest()&&E.SELF_HOSTED&&await Rp(e,i,r),i}s(PN,"downloadTarball");async function xu(t,e){return await Zt.default.trace("getReadStream",async r=>{t=be(t),e=Ee(e),r.addTags({bucketName:t,path:e});let n=at(),i={Bucket:t,Key:e},o=await n.getObject(i);if(!o.Body||!(o.Body instanceof Pu.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(xu,"getReadStream");async function LN(t,e){t=be(t),e=Ee(e);let r=at(),n={Bucket:t,Key:e};try{return await r.headObject(n)}catch{throw new Error("Unable to retrieve metadata from object")}}s(LN,"getObjectMetadata");async function UN(t,e){t=be(t),e=Ee(e);let r=at(),n={Bucket:t,Key:e};try{return await r.headObject(n),!0}catch(i){if((i.statusCode||i.$response?.statusCode||i.$metadata?.httpStatusCode)===404)return!1;throw i}}s(UN,"objectExists");function Tp(t){let e=t.split("?")[0],r=new RegExp(`^${Ip}/(?<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(Tp,"extractBucketAndPath");var cA=W(require("querystring"));var uA=W(require("aws-cloudfront-sign"));var Lu;function kN(){if(!E.CLOUDFRONT_PRIVATE_KEY_64)throw new Error("CLOUDFRONT_PRIVATE_KEY_64 is not set");return Lu||(Lu=Buffer.from(E.CLOUDFRONT_PRIVATE_KEY_64,"base64").toString("utf-8"),Lu)}s(kN,"getPrivateKey");var MN=s(()=>({keypairId:E.CLOUDFRONT_PUBLIC_KEY_ID,privateKeyString:kN(),expireTime:new Date().getTime()+1e3*60*60*24}),"getCloudfrontSignParams"),li=s(t=>{let e=FN(t);return uA.getSignedUrl(e,MN())},"getPresignedUrl"),FN=s(t=>{let e="/";return t.startsWith("/")&&(e=""),`${E.CLOUDFRONT_CDN}${e}${t}`},"getUrl");function BN(t){return`${Ee(t)}/budibase-client.js`}s(BN,"clientLibraryPath");function WN(t,e){return`${Ee(t)}/${e}`}s(WN,"client3rdPartyLibrary");async function GN(t,e){return`/api/assets/${t}/client?${await lA(e)}`}s(GN,"clientLibraryUrl");async function lA(t){let e,r;try{e=q()}finally{r={version:t}}return e&&e!==ce&&(r.tenantId=e),cA.default.encode(r)}s(lA,"getClientCacheKey");async function dA(t){return E.CLOUDFRONT_CDN?li(t):await pn(E.APPS_BUCKET_NAME,t)}s(dA,"getAppFileUrl");async function $N(t){if(t.length===0)return[];try{return await Promise.all(t.map(async e=>({...e,src:await dA(e.src),type:e.type||"image/png"})))}catch(e){return console.error("Error enriching PWA images:",e),t}}s($N,"enrichPWAImages");var VN=s(async(t,e,r)=>{let n=fA(t,e);return E.CLOUDFRONT_CDN?(r&&(n=`${n}?etag=${r}`),li(n)):await pn(E.GLOBAL_BUCKET_NAME,n)},"getGlobalFileUrl"),fA=s((t,e)=>{let r=`${t}/${e}`;return E.MULTI_TENANCY&&(r=`${q()}/${r}`),r},"getGlobalFileS3Key");async function qN(t){return!t||!t.length?[]:await Promise.all(t.map(async e=>{let r=await KN(e),n=await QN(e);return{...e,jsUrl:r,iconUrl:n}}))}s(qN,"enrichPluginURLs");async function KN(t){let e=mA(t);return pA(e)}s(KN,"getPluginJSUrl");async function QN(t){let e=hA(t);if(e)return pA(e)}s(QN,"getPluginIconUrl");async function pA(t){return E.CLOUDFRONT_CDN?li(t):await pn(E.PLUGIN_BUCKET_NAME,t)}s(pA,"getPluginUrl");function mA(t){return gA(t,"plugin.min.js")}s(mA,"getPluginJSKey");function hA(t){let e=t.iconUrl?"icon.svg":t.iconFileName;if(e)return gA(t,e)}s(hA,"getPluginIconKey");function gA(t,e){return`${EA(t.name)}/${e}`}s(gA,"getPluginS3Key");function EA(t){let e=`${t}`;return E.MULTI_TENANCY&&(e=`${q()}/${e}`),E.CLOUDFRONT_CDN&&(e=`plugins/${e}`),e}s(EA,"getPluginS3Dir");var SA="budibase.log",AA="budibase-logs-history.txt",_A=bp.default.join(fn(),"systemlogs");function yA(t){return bp.default.join(_A,t)}s(yA,"getFullPath");function OA(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(OA,"getSingleFileMaxSizeInfo");function xp(){let t=OA(E.ROLLING_LOG_MAX_SIZE);return TA.createStream(SA,{size:t?.size,path:_A,maxFiles:t?.totalHistoryFiles||1,immutable:!0,history:AA,initialRotation:!1})}s(xp,"localFileDestination");function jN(){let t=[],e=yA(AA);if(no.default.existsSync(e)){let i=no.default.readFileSync(e,"utf-8").split(`
|
|
36
|
+
}`,"platform_users_lowercase_2")},"createPlatformUserView"),Vs=s(async(t,e)=>{let r={account_by_email:AS,platform_users_lowercase_2:_S};return je(pe.PLATFORM_INFO.name,async n=>{let i=r[t];return zf(t,e,n,i,{arrayResponse:!0})})},"queryPlatformView"),OS={by_email2:ES,by_api_key:TS,by_app:yS},Ht=s(async(t,e,r,n)=>{r||(r=z());let i=OS[t];return zf(t,e,r,i,n)},"queryGlobalView");async function qs(t,e,r){let n=z(),i=OS[t];return $s(t,e,n,i,r)}s(qs,"queryGlobalViewRaw");var mv=W(require("pouchdb"));var IS=require("dd-trace");var Jf=class{static{s(this,"Replication")}constructor({source:e,target:r}){this.source=it(e),this.target=it(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([Ps(this.source),Ps(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){for(let r of e)try{let[n,i]=await Promise.all([this.source.get(r),this.target.get(r)]),o=this.replicationDelta(n,i);if(o<0||o===0&&n._rev===i._rev)continue;let a=o+1;await IS.tracer.trace("Replication.resolveInconsistencies",async u=>{u.addTags({versionsToJump:a,toFix:!0,id:r,sourceRev:n._rev,targetRev:i._rev});for(let c=0;c<a;c++){let l=await this.source.get(i._id);await this.source.put(l)}})}catch{console.warn("Cannot resolve inconsistencies for document",r)}}replicationDelta(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,n=this.direction,i=n==="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,g)=>f?.startsWith(g+"_"),"startsWithID"),d=s(f=>l(f,"ro")||l(f,"li"),"isData");return{...e,filter:s((f,g)=>!o&&f._id==="_design/migrations"||i&&f._id.startsWith("_design")?!1:f._deleted||l(f._id,Rs)?!0:n==="toProduction"&&!o&&l(f._id,"autocolumn_state")?!1:d(f._id)?!!c?.find(m=>f._id.includes(m))||u:l(f._id,"log_au")||l(f._id,"agentlogsession")||f._id==="app_metadata"?!1:r?r(f,g):!0,"filter")}}async rollback(){await this.target.destroy(),this.target=it(this.target.name),await this.replicate()}},wS=Jf;var CS=W(require("node-fetch"));var Ks=Er.removeKeyNumbering;function Or(t){return t==null||t===""}s(Or,"isEmpty");var Yt=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:{},notOneOf:{},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}addNotOneOf(e,r){return this.#e.notOneOf[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=Ks(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,p)=>Or(p)?null:`${h}:${e.preprocess(p,o)}`,"equal"),c=s((h,p,T="AND")=>{if(Or(p))return null;if(!Array.isArray(p))return`${h}:${p}`;let A=`${e.preprocess(p[0],{escape:!0})}`;for(let _=1;_<p.length;_++)A+=` ${T} ${e.preprocess(p[_],{escape:!0})}`;return`${h}:(${A})`},"contains"),l=s((h,p)=>Or(p)?null:(p=e.preprocess(p,{escape:!0,lowercase:!0,type:"fuzzy"}),`${h}:/.*${p}.*/`),"fuzzy"),d=s((h,p)=>{let T=r?"*:* AND ":"",A=r?"AND":void 0;return T+"NOT "+c(h,p,A)},"notContains"),f=s((h,p)=>c(h,p,"OR"),"containsAny"),g=s((h,p)=>{if(Or(p))return"*:*";if(!Array.isArray(p))if(typeof p=="string")p=p.split(",");else return"";let T=`${e.preprocess(p[0],o)}`;for(let A=1;A<p.length;A++)T+=` OR ${e.preprocess(p[A],o)}`;return`${h}:(${T})`},"oneOf"),m=s((h,p)=>{if(Or(p))return null;if(!Array.isArray(p))if(typeof p=="string")p=p.split(",");else return"";let T=`${e.preprocess(p[0],o)}`;for(let A=1;A<p.length;A++)T+=` OR ${e.preprocess(p[A],o)}`;return`(*:* -${h}:(${T}))`},"notOneOf");function y(h,p,T){let A="";for(let[_,I]of Object.entries(h)){_=Ks(_),_=e.preprocess(e.handleSpaces(_),{escape:!0});let O=p(_,I);if(O!=null){if(A.length>0||n.length>0){let C=T?.mode?T.mode:r?"OR":"AND";A+=` ${C} `}A+=O,(typeof I!="string"&&I!=null||typeof I=="string"&&I!==a&&I!=="")&&(i=!1)}}if(T?.returnBuilt)return A;n+=A}if(s(y,"build"),this.#e.string&&y(this.#e.string,(h,p)=>Or(p)?null:(p=e.preprocess(p,{escape:!0,lowercase:!0,type:"string"}),`${h}:${p}*`)),this.#e.range&&y(this.#e.range,(h,p)=>{if(Or(p)||p.low==null||p.low===""||p.high==null||p.high==="")return null;let T=e.preprocess(p.low,o),A=e.preprocess(p.high,o);return`${h}:[${T} TO ${A}]`}),this.#e.fuzzy&&y(this.#e.fuzzy,l),this.#e.equal&&y(this.#e.equal,u),this.#e.notEqual&&y(this.#e.notEqual,(h,p)=>Or(p)?null:typeof p=="boolean"?`(*:* AND !${h}:${p})`:`!${h}:${e.preprocess(p,o)}`),this.#e.empty&&y(this.#e.empty,h=>(i=!1,`(*:* -${h}:["" TO *])`)),this.#e.notEmpty&&y(this.#e.notEmpty,h=>(i=!1,`${h}:["" TO *]`)),this.#e.oneOf&&y(this.#e.oneOf,g),this.#e.notOneOf&&y(this.#e.notOneOf,m),this.#e.contains&&y(this.#e.contains,c),this.#e.notContains&&y(this.compressFilters(this.#e.notContains),d),this.#e.containsAny&&y(this.#e.containsAny,f),a&&(n=this.isMultiCondition()?`(${n})`:n,r=!1,y({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}=vt(),n=`${e}/${this.#l}/_design/database/_search/${this.#d}`,i=this.buildSearchBody();try{return await RS(n,i,r)}catch(o){if(o.status===404&&this.#a)return await this.#a(),await RS(n,i,r);throw o}}};async function RS(t,e,r){let n=await(0,CS.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(RS,"runQuery");async function DS(t,e,r,n){let i=n.bookmark,o=n.rows||[];if(n.limit&&o.length>=n.limit)return o;let a=Yt.maxLimit;n.limit&&o.length>n.limit-Yt.maxLimit&&(a=n.limit-o.length);let u=new Yt(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<Yt.maxLimit)return[...o,...c.rows];let l={...n,bookmark:c.bookmark,rows:[...o,...c.rows]};return await DS(t,e,r,l)}s(DS,"recursiveSearch");async function hv(t,e,r,n){let i=n.limit;(i==null||isNaN(i)||i<0)&&(i=50),i=Math.min(i,Yt.maxLimit);let o=new Yt(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(hv,"paginatedSearch");async function gv(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 DS(t,e,r,n)}}s(gv,"fullSearch");var Xf={};P(Xf,{createUserIndex:()=>Ev});async function Ev(){let t=z(),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(Ev,"createUserIndex");function bS(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(bS,"checkErrorCode");function yv(t){return bS(t,409)}s(yv,"isDocumentConflictError");var js={};P(js,{addTenantToUrl:()=>Tv,getTenantDB:()=>Zf,getTenantIDFromCtx:()=>Qs,isUserInWorkspaceTenant:()=>Sv});function Zf(t){return Ce(un(t))}s(Zf,"getTenantDB");function Tv(t){let e=q();if(Sr()){let r=t.indexOf("?")===-1?"?":"&";t+=`${r}tenantId=${e}`}return t}s(Tv,"addTenantToUrl");var Sv=s((t,e)=>{let r;return e?r=e.tenantId||ce:r=q(),(Zn(t)||ce)===r},"isUserInWorkspaceTenant"),Av=Object.values(vi),Qs=s((t,e)=>{if(!Sr())return ce;e.allowNoTenant===void 0&&(e.allowNoTenant=!1),e.includeStrategies||(e.includeStrategies=Av),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(bf()).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 yu={milliseconds:1,seconds:1e3,minutes:60*1e3,hours:3600*1e3,days:1440*60*1e3},me=class t{constructor(e){this.ms=e}static{s(this,"Duration")}to(e){return this.ms/yu[e]}toMs(){return this.ms}toSeconds(){return this.to("seconds")}static convert(e,r,n){return n*yu[e]/yu[r]}static from(e,r){return new t(r*yu[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)}};function Tu(){let t=me.fromDays(7).toSeconds();if(!E.SESSION_EXPIRY_SECONDS)return t;let e=parseInt(E.SESSION_EXPIRY_SECONDS);return Number.isFinite(e)&&e>0?e:t}s(Tu,"getSessionExpirySeconds");function ep(){return new Date(Date.now()+Tu()*1e3)}s(ep,"getSessionExpiryDate");var tp="app_",xS="/app/",vS="/app-chat/";async function _v(t){let r=t.path.split("/")[2];if(!r)return;let n=`/${r.toLowerCase()}`,i=q();!E.isDev()&&E.MULTI_TENANCY&&(i=Qs(t,{includeStrategies:["subdomain"]}));let a=(await De(i,()=>Gs({dev:!1}))).filter(u=>u.url&&u.url.toLowerCase()===n)[0];return a&&a.appId?a.appId:void 0}s(_v,"resolveAppUrl");function Ov(t){return t.path.startsWith(`/${tp}`)?!0:t.path.startsWith(xS)||t.path.startsWith(vS)}s(Ov,"isServingApp");function Iv(t){return t.path.startsWith("/builder/workspace/")}s(Iv,"isServingBuilder");function wv(t){return NS(t.path)}s(wv,"isServingBuilderPreview");function NS(t){return new RegExp(/^\/app\/app_\w+\/preview$/).test(t)}s(NS,"isBuilderPreviewUrl");function Rv(t){return t.path.startsWith("/api/public/v")}s(Rv,"isPublicApiRequest");async function dn(t){let e;function r(u){u&&u.startsWith(tp)&&(e&&e!==u&&t.throw(403,"App id conflict"),e=u)}s(r,"setWorkspaceIdIfValid");function n(u){if(u){typeof u=="string"&&(u=[u]);for(let c of u)r(c)}}s(n,"checkPossibleValues"),n(t.request.headers["x-budibase-app-id"]),r(t.request.body?.appId);let i=Cv(t.path);r(i),n(t.query?.appId);let o=NS(t.path);return(t.path.startsWith(xS)||t.path.startsWith(vS))&&!o&&r(await _v(t)),e}s(dn,"getWorkspaceIdFromCtx");function Cv(t){if(t)return t.split("?")[0].split("/").find(e=>e.startsWith(tp))}s(Cv,"parseWorkspaceIdFromUrlPath");function Au(t){if(t)try{return Su.default.verify(t,E.JWT_SECRET)}catch(e){if(E.JWT_SECRET_FALLBACK)return Su.default.verify(t,E.JWT_SECRET_FALLBACK);throw e}}s(Au,"openJwt");function Hs(t){return E.INTERNAL_API_KEY&&E.INTERNAL_API_KEY===t?!0:!!(E.INTERNAL_API_KEY_FALLBACK&&E.INTERNAL_API_KEY_FALLBACK===t)}s(Hs,"isValidInternalAPIKey");function zt(t,e){let r=t.cookies.get(e);if(r)return Au(r)}s(zt,"getCookie");function rp(t,e,r="builder",n={sign:!0}){e&&n&&n.sign&&(e=Su.default.sign(e,E.JWT_SECRET));let i=n.sameSite,o=n.secure??t.secure;i==="none"&&(o?o=!0:i="lax");let a={expires:n.expires??Va,path:"/",httpOnly:n.httpOnly??!1,secure:o,overwrite:!0};i&&(a.sameSite=i),E.COOKIE_DOMAIN&&(a.domain=E.COOKIE_DOMAIN),t.cookies.set(r,e,a)}s(rp,"setCookie");function Dv(t,e){rp(t,e,"budibase:auth",{sign:!1,httpOnly:!0,expires:ep()})}s(Dv,"setAuthCookie");function Jt(t,e){rp(t,null,e)}s(Jt,"clearCookie");function bv(t){return t.headers["x-budibase-type"]==="client"}s(bv,"isClient");function np(t){return new Promise(e=>setTimeout(e,t))}s(np,"timeout");function ip(t){return!!fh[t]}s(ip,"isAudited");function xv(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(xv,"hasCircularStructure");function vv(t){return!!t.match(/^.+:\/\/.+$/)}s(vv,"urlHasProtocol");function sp(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(sp,"validEmail");async function Nv(t){let e=performance.now();return[await t(),me.fromMilliseconds(performance.now()-e)]}s(Nv,"time");var _u=require("undici");function Pv(t,e){let r,n=null;try{let o=new URL(t);r=o.hostname,n=o.port||null}catch{return!1}let i=e.split(/[\s,]+/).filter(o=>o.length>0);for(let o of i){let u=o.replace(/^\./,"*").match(/^(.+?)(?::(\d+))?$/);if(!u||!u[1])continue;let c=u[1].toLowerCase(),l=u[2]||null,d=!1;if(c==="*")d=!0;else if(c.startsWith("*")){let g=c.slice(1);d=r===g.slice(1)||r.endsWith(g)}else d=r===c;if(d&&(!l||n===l))return!0}return!1}s(Pv,"isUrlMatchingNoProxy");function Lv(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!0;try{new URL(n.trim())}catch{return console.log("[fetch] Invalid proxy URL format:",n),!0}if(t){let i=process.env.GLOBAL_AGENT_NO_PROXY||process.env.NO_PROXY||"";if(i&&Pv(t,i))return console.log("[fetch] URL matches NO_PROXY pattern, bypassing proxy",{url:t,noProxy:i}),!0}return!1}s(Lv,"shouldBypassProxy");function Uv(t,e){return new _u.Agent({connect:{rejectUnauthorized:t,...e?{lookup:e}:{}}})}s(Uv,"createDirectAgent");function kv(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).trim();console.log("[fetch] Creating ProxyAgent",{proxyUrl:n,rejectUnauthorized:t});let i={uri:n,requestTls:{rejectUnauthorized:t}};return n.startsWith("https://")&&(i.proxyTls={rejectUnauthorized:t}),new _u.ProxyAgent(i)}s(kv,"createProxyAgent");function Mv(t){let e=t?.rejectUnauthorized??!0;return Lv(t?.url)?Uv(e,t?.lookup):(t?.lookup&&console.log("[fetch] Proxy configured; IP pinning is not applied to proxied requests"),kv(e))}s(Mv,"createDispatcher");function Fv(t){return Mv(t)}s(Fv,"getDispatcher");var op=require("util"),ap=W(require("zlib"));var Bv=(0,op.promisify)(ap.default.gzip),Wv=(0,op.promisify)(ap.default.gunzip),Ou="gzip:",Gv=s(async t=>{let e=await Bv(t);return`${Ou}${e.toString("base64")}`},"gzipToBase64"),$v=s(async t=>{let e=t.startsWith(Ou)?t.slice(Ou.length):t,r=Buffer.from(e,"base64");return(await Wv(new Uint8Array(r))).toString("utf8")},"gunzipFromBase64");function Vv(t){let e=t.get("authorization");if(!e)return null;let r=e.match(/^Bearer\s+(.+)$/i);return r?r[1]:null}s(Vv,"getBearerToken");var BS=W(require("http")),WS=W(require("https"));var fp={};P(fp,{isBlacklisted:()=>dp,refreshBlacklist:()=>MS,resolveAddress:()=>Iu});var PS=W(require("dns")),wr=W(require("net"));var LS=require("util");var qv=["127.0.0.0/8","10.0.0.0/8","172.16.0.0/12","192.168.0.0/16","169.254.0.0/16","0.0.0.0/8","::1/128","fc00::/7","fe80::/10"],cp,Kv=(0,LS.promisify)(PS.default.lookup);function US(){return!(E.SELF_HOSTED&&E.BLACKLIST_IPS!==void 0)}s(US,"shouldApplyDefaultBlacklist");function lp(t){return wr.default.isIP(t)===6?"ipv6":"ipv4"}s(lp,"getIpVersion");function Qv(t){let e=wr.default.isIP(t);return e===4?32:e===6?128:null}s(Qv,"getMaxPrefixLength");function jv(t,e){if(!/^\d+$/.test(e))return null;let r=Number.parseInt(e,10),n=Qv(t);return n==null||r>n?null:r}s(jv,"getValidSubnetPrefix");function Hv(t){return wr.default.isIP(t)?t:(/^https?:\/\//.test(t)||(t=`https://${t}`),new URL(t).hostname.replace(/^\[|\]$/g,""))}s(Hv,"parseAddress");async function kS(t){return t=Hv(t),(await Kv(t,{all:!0})).map(r=>r.address)}s(kS,"lookup");async function Iu(t){return wr.default.isIP(t)?[t]:kS(t)}s(Iu,"resolveAddress");function up(t,e){let r=e.trim();if(!r)return;let n=r.split("/");if(n.length>2){console.log(`Ignoring invalid blacklist entry: ${r}`);return}let[i,o]=n,a=wr.default.isIP(i);if(n.length===2){let u=jv(i,o);if(a&&u!==null){t.addSubnet(i,u,lp(i));return}console.log(`Ignoring invalid blacklist entry: ${r}`);return}a&&t.addAddress(i,lp(i))}s(up,"addEntryToBlacklist");async function MS(){let t=new wr.default.BlockList;if(US())for(let r of qv)up(t,r);let e=E.BLACKLIST_IPS?.split(",")||[];for(let r of e){let n=r.trim();if(!n)continue;let[i]=n.split("/");if(wr.default.isIP(i)){up(t,n);continue}let o=await kS(n);for(let a of o)up(t,a)}cp=t}s(MS,"refreshBlacklist");async function dp(t){cp||await MS();let e;try{e=await Iu(t)}catch(r){return r instanceof TypeError?(console.error("Black list error: could not parse address: ",t),!0):US()}return e.some(r=>cp.check(r,lp(r)))}s(dp,"isBlacklisted");var wu=W(require("node-fetch"));var FS=5,Yv=new Set(["http:","https:"]),zv=["authorization","cookie","cookie2","proxy-authorization"];function pp(t){let e;try{e=new URL(t)}catch{throw new Error("Invalid URL.")}if(!Yv.has(e.protocol))throw new Error("Only HTTP(S) URLs are allowed.");if(e.username||e.password)throw new Error("URL must not include credentials.");return e}s(pp,"parseUrl");function Jv(t){return[301,302,303,307,308].includes(t)}s(Jv,"isRedirect");async function Xv(t){let e=pp(t),r=await Iu(e.hostname);if(r.length===0)throw new Error("URL is blocked or could not be resolved safely.");for(let n of r)if(await dp(n))throw new Error("URL is blocked or could not be resolved safely.");return r[0]}s(Xv,"resolveSafePinnedIp");function GS(t){let e=t.includes(":")?6:4;return(r,n,i)=>{if(typeof n=="object"&&n?.all){i(null,[{address:t,family:e}]);return}i(null,t,e)}}s(GS,"createPinnedLookup");function Zv(t,e){let r=new URL(t).protocol,n=GS(e);return r==="https:"?new WS.default.Agent({lookup:n}):new BS.default.Agent({lookup:n})}s(Zv,"makePinnedAgent");function eN(t,e){let r=t.method?.toUpperCase()||"GET";return e===303||(e===301||e===302)&&r==="POST"?{...t,body:void 0,method:"GET",redirect:"manual"}:t}s(eN,"nextRequestForRedirect");function tN(t,e){return new URL(t).origin!==new URL(e).origin}s(tN,"shouldStripSensitiveHeadersForRedirect");function rN(t){if(!t.headers)return t;let e=new wu.Headers(t.headers);return zv.forEach(r=>e.delete(r)),{...t,headers:e}}s(rN,"stripSensitiveHeadersForRedirect");function nN(t){return!t||typeof t!="object"||!("resume"in t)?!1:typeof t.resume=="function"}s(nN,"isResumableBody");function iN(t){let e=t.body;nN(e)&&e.resume()}s(iN,"releaseResponseBody");async function oi(t,e={},{followRedirects:r=!0,returnRedirectWithoutLocation:n=!1,rejectCrossOriginRedirects:i=!1,fetchFn:o=wu.default}={}){let a=t,u={...e,redirect:"manual"};for(let c=0;c<=FS;c++){let l=await Xv(a),d;try{d=await o(a,{...u,agent:Zv(a,l)},l)}catch(m){let y=pp(a).hostname;throw m instanceof Error?(m.message=`Failed to connect to resolved IP for ${y}: ${m.message}`,m):new Error(`Failed to connect to resolved IP for ${y}: unknown network error`)}if(!Jv(d.status))return d;if(iN(d),!r)throw new Error("Redirects are not permitted.");if(c===FS)break;let f=d.headers.get("location");if(!f){if(n)return d;throw new Error("Maximum redirect reached.")}let g=pp(new URL(f,a).toString()).toString();if(u=eN(u,d.status),tN(a,g)){if(i)throw new Error("Redirect to a different origin is not permitted.");u=rN(u)}a=g}throw new Error("Maximum redirect reached.")}s(oi,"fetchWithBlacklist");var sN=s((t,e)=>`datasource:creation:${t}:microsoft:${e}`,"microsoftDatasourceCreationCacheKey");function oN(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(oN,"jobToJobInformation");var Ru=class{static{s(this,"InMemoryQueue")}constructor(e,r){this._name=e,this._opts=r,this._messages=[],this._emitter=new $S.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,g)=>{f?l(f):c(g)},"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 Ue.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=X(),a=s(()=>{let c={id:o,timestamp:Date.now(),queue:this,data:e,opts:n,discard:s(async()=>{c._isDiscarded=!0},"discard")};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:s(()=>new Promise((c,l)=>{let d=s((g,m)=>{g.id===o&&(this._emitter.off("error",d),this._emitter.off("completed",f),l(m))},"errorHandler"),f=s((g,m)=>{g.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)}),"finished")}}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}async getJobs(){return this._messages}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=>oN(e))}async whenCurrentJobsFinished(){do await np(50);while(this.hasRunningJobs())}hasRunningJobs(){return this._addCount>this._runCount}},VS=Ru;var gp=W(require("bull"));var ui=(y=>(y.AUTOMATION="automationQueue",y.APP_BACKUP="appBackupQueue",y.AUDIT_LOG="auditLogQueue",y.SYSTEM_EVENT_QUEUE="systemEventQueue",y.APP_MIGRATION="appMigration",y.DOC_WRITETHROUGH_QUEUE="docWritethroughQueue",y.DEV_REVERT_PROCESSOR="devRevertProcessorQueue",y.BATCH_USER_SYNC_PROCESSOR="batchUserSyncProcessorQueue",y.RAG_INGESTION="ragIngestionQueue",y.KNOWLEDGE_SOURCE_SYNC="knowledgeSourceSyncQueue",y.AGENT_LOG_INDEXING="agentLogIndexingQueue",y.ESCALATION="escalationQueue",y.AGENT_REQUEST_TRACKING="agentRequestTrackingQueue",y.AGENT_TEST_RUN="agentTestRunQueue",y))(ui||{});function qS(t,e,r){cN(t,e),r&&aN(t,r)}s(qS,"addListeners");function aN(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(aN,"handleStalled");function ot(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(ot,"getLogParams");var uN={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",ragIngestionQueue:"rag-ingestion-processor",agentLogIndexingQueue:"agent-log-indexing-processor",escalationQueue:"escalation-processor",agentRequestTrackingQueue:"agent-request-tracking-processor",agentTestRunQueue:"agent-test-run-processor",knowledgeSourceSyncQueue:"knowledge-source-sync-processor"};function cN(t,e){let r=uN[e];function n(i,o){let a=i.data.event?.appId;if(a)return xf(a,o);o()}s(n,"doInJobContext"),t.on("stalled",async i=>{await n(i,()=>{console.error(...ot(r,"stalled",{job:i}))})}).on("error",i=>{console.error(...ot(r,"error",{error:i}))}),process.env.NODE_DEBUG?.includes("bull")&&t.on("waiting",i=>{console.info(...ot(r,"waiting",{jobId:i}))}).on("active",async i=>{await n(i,()=>{console.info(...ot(r,"active",{job:i}))})}).on("progress",async(i,o)=>{await n(i,()=>{console.info(...ot(r,"progress",{job:i},{progress:o}))})}).on("completed",async(i,o)=>{await n(i,()=>{console.info(...ot(r,"completed",{job:i},{result:o}))})}).on("failed",async(i,o)=>{await n(i,()=>{console.error(...ot(r,"failed",{job:i,error:o}))})}).on("paused",()=>{console.info(...ot(r,"paused"))}).on("resumed",()=>{console.info(...ot(r,"resumed"))}).on("cleaned",(i,o)=>{console.info(...ot(r,"cleaned",{},{length:i.length,type:o}))}).on("drained",()=>{console.info(...ot(r,"drained"))}).on("removed",i=>{console.info(...ot(r,"removed",{job:i}))})}s(cN,"logging");var Cu={};P(Cu,{cleanup:()=>lN,clear:()=>hp,set:()=>mp});var Ys=[];function mp(t,e){let r=setInterval(t,e);return Ys.push(r),r}s(mp,"set");function hp(t){let e=Ys.indexOf(t);e!==-1&&Ys.splice(e,1),clearInterval(t)}s(hp,"clear");function lN(){for(let t of Ys)clearInterval(t);Ys=[]}s(lN,"cleanup");var Xt=W(require("dd-trace")),zs=W(require("object-sizeof"));var dN=me.fromMinutes(5).toMs(),fN=me.fromSeconds(30).toMs(),Ep=me.fromSeconds(60).toMs(),Js=[],Du;async function KS(){for(let t of Js)await t.clean(Ep,"completed"),await t.clean(Ep,"failed")}s(KS,"cleanup");async function pN(t,e,r){let n=performance.now();try{let i=await e();return Xt.default.dogstatsd.increment(`${t}.success`,1,r),i}catch(i){throw Xt.default.dogstatsd.increment(`${t}.error`,1,r),i}finally{let i=performance.now()-n;Xt.default.dogstatsd.distribution(`${t}.duration.ms`,i,r),Xt.default.dogstatsd.increment(t,1,r)}}s(pN,"withMetrics");function QS(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(QS,"jobOptsTags");function mN(t){return{"job.id":t.id,"job.attemptsMade":t.attemptsMade,"job.timestamp":t.timestamp,"job.data.sizeBytes":(0,zs.default)(t.data),...QS(t.opts||{})}}s(mN,"jobTags");var Et=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:on(),settings:{maxStalledCount:this.opts.maxStalledCount?this.opts.maxStalledCount:0,lockDuration:dN,lockRenewTime:fN}};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 gp.default(this.jobQueue,{...r,redis:{host:"localhost",port:+process.env.BULL_TEST_REDIS_PORT}}):n=new VS(this.jobQueue,r):n=new gp.default(this.jobQueue,r),qS(n,this.jobQueue,this.opts.removeStalledCb),Js.push(n),!Du&&!E.isTest()&&(Du=mp(KS,Ep),KS().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 Xt.default.trace("queue.process",async c=>{if(a.data._parentSpanContext){let l=a.data._parentSpanContext,d={traceId:l.traceId,spanId:l.spanId,toTraceId:s(()=>l.traceId,"toTraceId"),toSpanId:s(()=>l.spanId,"toSpanId"),toTraceparent:s(()=>"","toTraceparent")};c.addLink(d)}c.addTags({"queue.name":this.jobQueue,...mN(a)}),this.opts.jobTags&&c.addTags(this.opts.jobTags(a.data)),Xt.default.dogstatsd.distribution("queue.process.sizeBytes",(0,zs.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 Xt.default.trace("queue.add",async n=>(n.addTags({"queue.name":this.jobQueue,"job.data.sizeBytes":(0,zs.default)(e),...QS(r||{})}),this.opts.jobTags&&n.addTags(this.opts.jobTags(e)),e._parentSpanContext={traceId:n.context().toTraceId(),spanId:n.context().toSpanId()},Xt.default.dogstatsd.distribution("queue.add.sizeBytes",(0,zs.default)(e),this.metricTags()),await this.withMetrics("queue.add",()=>this.queue.add(e,r))))}withMetrics(e,r){return pN(e,r,this.metricTags())}metricTags(){return{queueName:this.jobQueue}}close(e){return this.queue.close(e)}whenCurrentJobsFinished(){return this.queue.whenCurrentJobsFinished()}};async function hN(){Du&&hp(Du),console.log("Waiting for current queue jobs to finish...");for(let t of Js)await t.whenCurrentJobsFinished();console.log("Closing queue Redis connections...");for(let t of Js)await t.close();Js=[],console.log("Queues shutdown")}s(hN,"shutdown");var io={};P(io,{correlation:()=>Xs,logAlert:()=>mn,logAlertWithInfo:()=>ZN,logWarn:()=>di,logger:()=>ku,system:()=>vp});var Xs={};P(Xs,{getId:()=>yp,setHeader:()=>gN});var jS=require("correlation-id"),gN=s(t=>{let e=jS.getId();e&&(t["x-budibase-correlation-id"]=e)},"setHeader");function yp(){return jS.getId()}s(yp,"getId");var Uu=W(require("pino")),IA=W(require("pino-pretty")),Np=W(require("dd-trace")),wA=require("dd-trace/ext");var vp={};P(vp,{getLogReadStream:()=>jN,getSingleFileMaxSizeInfo:()=>OA,localFileDestination:()=>xp});var no=W(require("fs")),bp=W(require("path")),TA=W(require("rotating-file-stream"));var Dp={};P(Dp,{ObjectStore:()=>at,ObjectStoreBuckets:()=>yN,SIGNED_FILE_PREFIX:()=>Ip,bucketTTLConfig:()=>bu,budibaseTempDir:()=>fn,client3rdPartyLibrary:()=>WN,clientLibraryPath:()=>BN,clientLibraryUrl:()=>GN,createBucketIfNotExists:()=>ro,deleteFile:()=>xN,deleteFiles:()=>vN,deleteFolder:()=>aA,downloadTarball:()=>PN,downloadTarballDirect:()=>NN,enrichPWAImages:()=>$N,enrichPluginURLs:()=>qN,extractBucketAndPath:()=>Tp,getAllFiles:()=>CN,getAppFileUrl:()=>dA,getClientCacheKey:()=>lA,getGlobalFileS3Key:()=>fA,getGlobalFileUrl:()=>VN,getObjectMetadata:()=>LN,getPluginIconKey:()=>hA,getPluginJSKey:()=>mA,getPluginS3Dir:()=>EA,getPresignedUrl:()=>pn,getReadStream:()=>xu,getSafeRetrieveDirectoryPath:()=>oA,listAllObjects:()=>wp,objectExists:()=>UN,processAutomationAttachment:()=>SN,processObjectStoreAttachment:()=>XS,retrieve:()=>sA,retrieveDirectory:()=>bN,retrieveToTmp:()=>DN,sanitizeBucket:()=>be,sanitizeKey:()=>Ee,streamUpload:()=>iA,streamUploadMany:()=>RN,upload:()=>wN,uploadDirectory:()=>Rp});var Nu=require("@aws-sdk/client-s3"),Sp=require("@aws-sdk/lib-storage"),ZS=require("@aws-sdk/s3-request-presigner"),eA=require("@smithy/node-http-handler");var Zt=W(require("dd-trace")),ci=W(require("fs")),eo=W(require("fs/promises")),tA=W(require("https")),Ye=require("path"),Pu=W(require("stream")),to=require("stream/promises"),Ap=W(require("tar-fs")),_p=require("uuid"),Op=W(require("zlib"));var HS=W(require("fs")),YS=require("os"),Zs=W(require("path")),zS=W(require("stream"));var yN={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},JS=(0,Zs.join)((0,YS.tmpdir)(),".budibase");try{HS.default.mkdirSync(JS)}catch(t){if(t.code!=="EEXIST")throw t}function fn(){return JS}s(fn,"budibaseTempDir");var bu=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 TN(t){let e=await oi(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");if(!(e.body instanceof zS.default.Readable))throw new Error("Unexpected response body stream type");return{filename:t.filename||r,content:e.body}}s(TN,"processUrlAttachment");async function XS(t){let e=Tp(t.url);if(e===null)throw new Error("Invalid signed URL");let{bucket:r,path:n}=e,{stream:i}=await xu(r,n),o=Zs.default.basename(n);return{bucket:r,path:n,filename:t.filename||o,content:i}}s(XS,"processObjectStoreAttachment");async function SN(t){return t.url?.startsWith("http://")||t.url?.startsWith("https://")?await TN(t):await XS(t)}s(SN,"processAutomationAttachment");var AN=require("sanitize-s3-objectkey"),_N={bucketCreationPromises:{}},Ip="/files/signed",Rr={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"},ON=[Rr.html,Rr.css,Rr.js,Rr.json];function Ee(t){let e=AN(be(t)).replace(/\\/g,"/");if(e.split("/").some(r=>r==="."||r===".."))throw new Error("Invalid object store key: path traversal is not allowed.");return e}s(Ee,"sanitizeKey");function be(t){return t.replace(new RegExp(nt,"g"),rt)}s(be,"sanitizeBucket");function at(t={presigning:!1}){let e={forcePathStyle:!0,credentials:{accessKeyId:E.MINIO_ACCESS_KEY,secretAccessKey:E.MINIO_SECRET_KEY},region:E.AWS_REGION};if(!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),E.S3_IGNORE_SELF_SIGNED==="true"){let r=new tA.default.Agent({rejectUnauthorized:!1});e.requestHandler=new eA.NodeHttpHandler({httpsAgent:r})}return new Nu.S3(e)}s(at,"ObjectStore");async function ro(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||r.$metadata?.httpStatusCode,i=_N.bucketCreationPromises;if(n===403)throw new Error("Access denied to object store bucket."+r);if(i[e])return await i[e],{created:!1,exists:!0};i[e]=t.createBucket({Bucket:e}).catch(o=>{if(o.Code!=="BucketAlreadyOwnedByYou"&&o.name!=="BucketAlreadyOwnedByYou")throw o});try{return await i[e],{created:!0,exists:!1}}finally{delete i[e]}}}s(ro,"createBucketIfNotExists");var IN=s((t,e)=>{if(e)return e;let r=t.split(".").pop();return r?Rr[r.toLowerCase()]:Rr.txt},"resolveContentType"),rA=s(async(t,e,r)=>{let n=be(t),i=at(),o=await ro(i,n);if(r.addTags({bucketCreated:o.created,bucketExists:o.exists}),e&&o.created){let a=bu(n,e);await i.putBucketLifecycleConfiguration(a)}return{bucket:n,client:i,bucketCreated:o}},"initialiseBucket"),nA=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=IN(r,i),u=Ee(r),c={Bucket:e,Key:u,Body:n,ContentType:a,...o??{}};return{details:await new Sp.Upload({client:t,params:c}).done(),contentType:a}},"streamUploadInternal");async function wN({bucket:t,filename:e,path:r,type:n,metadata:i,body:o,ttl:a}){let u=e.split(".").pop(),c=r?(await eo.default.open(r)).createReadStream():o,l=at(),d=await ro(l,t);if(a&&d.created){let h=bu(t,a);await l.putBucketLifecycleConfiguration(h)}let f=n,g=f||(u?Rr[u.toLowerCase()]:Rr.txt),m={Bucket:be(t),Key:Ee(e),Body:c,ContentType:g};if(i&&typeof i=="object"){for(let h of Object.keys(i))(!i[h]||typeof i[h]!="string")&&delete i[h];m.Metadata=i}return new Sp.Upload({client:l,params:m}).done()}s(wN,"upload");async function iA({bucket:t,stream:e,filename:r,type:n,extra:i,ttl:o}){return await Zt.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 rA(t,o,a),{details:d,contentType:f}=await nA({client:l,bucket:c,filename:r,stream:e,type:n,extra:i}),g=await l.headObject({Bucket:c,Key:Ee(r)});return a.addTags({contentType:f,contentLength:g.ContentLength}),{...d,ContentLength:g.ContentLength}})}s(iA,"streamUpload");async function RN({bucket:t,files:e,ttl:r}){return await Zt.default.trace("streamUploadMany",async i=>{if(i.addTags({bucketName:t,ttl:r,fileCount:e.length}),!e.length)return[];let{bucket:o,client:a}=await rA(t,r,i),u=e.map((l,d)=>({...l,index:d})),c=new Array(e.length);return await wt.parallelForeach(u,async l=>{let{details:d}=await nA({client:a,bucket:o,filename:l.filename,stream:l.stream,type:l.type,extra:l.extra});c[l.index]=d},10),c})}s(RN,"streamUploadMany");async function sA(t,e){return await Zt.default.trace("retrieve",async r=>{r.addTags({bucketName:t,filepath:e});let n=at(),i={Bucket:be(t),Key:Ee(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}),ON.includes(o.ContentType))return r.addTags({string:!0}),o.Body.transformToString();{r.addTags({string:!1});let a=o.Body.transformToWebStream();return Pu.default.Readable.fromWeb(a)}})}s(sA,"retrieve");async function*wp(t,e){let r=at(),n=s((a={})=>r.listObjectsV2({...a,Bucket:be(t),Prefix:Ee(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(wp,"listAllObjects");async function CN(t,e){let r={};return await wt.parallelForeach(wp(t,e),async n=>{if(!n.Key)throw new Error("file.Key must be defined");r[n.Key]=n},5),r}s(CN,"getAllFiles");async function pn(t,e,r=3600){let n=at({presigning:!0}),i={Bucket:be(t),Key:Ee(e)},o=await(0,ZS.getSignedUrl)(n,new Nu.GetObjectCommand(i),{expiresIn:r});if(E.MINIO_ENABLED){let a=new URL(o),u=a.pathname,c=a.search;return`${Ip}${u}${c}`}else return o}s(pn,"getPresignedUrl");async function DN(t,e){return await Zt.default.trace("retrieveToTmp",async r=>{r.addTags({bucketName:t,filepath:e}),t=be(t),e=Ee(e);let n=await sA(t,e),i=(0,Ye.join)(fn(),(0,_p.v4)());return r.addTags({outputPath:i}),n instanceof Pu.default.Readable?(r.addTags({stream:!0}),await(0,to.pipeline)(n,ci.default.createWriteStream(i))):(r.addTags({stream:!1}),ci.default.writeFileSync(i,n)),i})}s(DN,"retrieveToTmp");async function bN(t,e,r){return await Zt.default.trace("retrieveDirectory",async n=>{n.addTags({bucketName:t,path:e});let i=(0,Ye.join)(fn(),(0,_p.v4)());await eo.default.mkdir(i,{recursive:!0});let o=0;return await wt.parallelForeach(wp(t,e),async a=>{let{Key:u}=a;!u||r?.some(c=>c.test(u))||(o++,await Zt.default.trace("retrieveDirectory.object",async c=>{let l=a.Key;c.addTags({filename:l});let d=oA(i,l);if(!d){c.addTags({skippedUnsafePath:!0});return}let{stream:f}=await xu(t,l);ci.default.existsSync(d.dir)||await eo.default.mkdir(d.dir,{recursive:!0}),await(0,to.pipeline)(f,ci.default.createWriteStream(d.path,{mode:420}))}))},5),n.addTags({numObjects:o}),i})}s(bN,"retrieveDirectory");function oA(t,e){let r=(0,Ye.resolve)(t),n=(0,Ye.resolve)(r,...e.split("/"));if(n===r||n.startsWith(`${r}${Ye.sep}`))return{dir:(0,Ye.dirname)(n),path:n}}s(oA,"getSafeRetrieveDirectoryPath");async function xN(t,e){let r=at();await ro(r,t);let n={Bucket:t,Key:Ee(e)};return r.deleteObject(n)}s(xN,"deleteFile");async function vN(t,e){let r=at();await ro(r,t);let n={Bucket:t,Delete:{Objects:e.map(i=>({Key:Ee(i)}))}};return r.deleteObjects(n)}s(vN,"deleteFiles");async function aA(t,e){t=be(t),e=Ee(e);let r=at(),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 aA(t,e)}s(aA,"deleteFolder");async function Rp(t,e,r){return await Zt.default.trace("uploadDirectory",async n=>{n.addTags({bucketName:t,localPath:e,bucketPath:r}),t=be(t);let i=await eo.default.readdir(e,{withFileTypes:!0});n.addTags({numFiles:i.length});for(let o of i){let a=Ee((0,Ye.join)(r,o.name)),u=(0,Ye.join)(e,o.name);o.isDirectory()?await Rp(t,u,a):await iA({bucket:t,filename:a,stream:ci.default.createReadStream(u)})}return i})}s(Rp,"uploadDirectory");async function NN(t,e,r={},{followRedirects:n=!0}={}){e=Ee(e);let i=await oi(t,{headers:r},{followRedirects:n});if(!i.ok)throw new Error(`unexpected response ${i.statusText}`);await(0,to.pipeline)(i.body,Op.default.createUnzip(),Ap.default.extract(e))}s(NN,"downloadTarballDirect");async function PN(t,e,r){e=be(e),r=Ee(r);let n=await oi(t);if(!n.ok)throw new Error(`unexpected response ${n.statusText}`);let i=(0,Ye.join)(fn(),r);return await(0,to.pipeline)(n.body,Op.default.createUnzip(),Ap.default.extract(i)),!E.isTest()&&E.SELF_HOSTED&&await Rp(e,i,r),i}s(PN,"downloadTarball");async function xu(t,e){return await Zt.default.trace("getReadStream",async r=>{t=be(t),e=Ee(e),r.addTags({bucketName:t,path:e});let n=at(),i={Bucket:t,Key:e},o=await n.getObject(i);if(!o.Body||!(o.Body instanceof Pu.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(xu,"getReadStream");async function LN(t,e){t=be(t),e=Ee(e);let r=at(),n={Bucket:t,Key:e};try{return await r.headObject(n)}catch{throw new Error("Unable to retrieve metadata from object")}}s(LN,"getObjectMetadata");async function UN(t,e){t=be(t),e=Ee(e);let r=at(),n={Bucket:t,Key:e};try{return await r.headObject(n),!0}catch(i){if((i.statusCode||i.$response?.statusCode||i.$metadata?.httpStatusCode)===404)return!1;throw i}}s(UN,"objectExists");function Tp(t){let e=t.split("?")[0],r=new RegExp(`^${Ip}/(?<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(Tp,"extractBucketAndPath");var cA=W(require("querystring"));var uA=W(require("aws-cloudfront-sign"));var Lu;function kN(){if(!E.CLOUDFRONT_PRIVATE_KEY_64)throw new Error("CLOUDFRONT_PRIVATE_KEY_64 is not set");return Lu||(Lu=Buffer.from(E.CLOUDFRONT_PRIVATE_KEY_64,"base64").toString("utf-8"),Lu)}s(kN,"getPrivateKey");var MN=s(()=>({keypairId:E.CLOUDFRONT_PUBLIC_KEY_ID,privateKeyString:kN(),expireTime:new Date().getTime()+1e3*60*60*24}),"getCloudfrontSignParams"),li=s(t=>{let e=FN(t);return uA.getSignedUrl(e,MN())},"getPresignedUrl"),FN=s(t=>{let e="/";return t.startsWith("/")&&(e=""),`${E.CLOUDFRONT_CDN}${e}${t}`},"getUrl");function BN(t){return`${Ee(t)}/budibase-client.js`}s(BN,"clientLibraryPath");function WN(t,e){return`${Ee(t)}/${e}`}s(WN,"client3rdPartyLibrary");async function GN(t,e){return`/api/assets/${t}/client?${await lA(e)}`}s(GN,"clientLibraryUrl");async function lA(t){let e,r;try{e=q()}finally{r={version:t}}return e&&e!==ce&&(r.tenantId=e),cA.default.encode(r)}s(lA,"getClientCacheKey");async function dA(t){return E.CLOUDFRONT_CDN?li(t):await pn(E.APPS_BUCKET_NAME,t)}s(dA,"getAppFileUrl");async function $N(t){if(t.length===0)return[];try{return await Promise.all(t.map(async e=>({...e,src:await dA(e.src),type:e.type||"image/png"})))}catch(e){return console.error("Error enriching PWA images:",e),t}}s($N,"enrichPWAImages");var VN=s(async(t,e,r)=>{let n=fA(t,e);return E.CLOUDFRONT_CDN?(r&&(n=`${n}?etag=${r}`),li(n)):await pn(E.GLOBAL_BUCKET_NAME,n)},"getGlobalFileUrl"),fA=s((t,e)=>{let r=`${t}/${e}`;return E.MULTI_TENANCY&&(r=`${q()}/${r}`),r},"getGlobalFileS3Key");async function qN(t){return!t||!t.length?[]:await Promise.all(t.map(async e=>{let r=await KN(e),n=await QN(e);return{...e,jsUrl:r,iconUrl:n}}))}s(qN,"enrichPluginURLs");async function KN(t){let e=mA(t);return pA(e)}s(KN,"getPluginJSUrl");async function QN(t){let e=hA(t);if(e)return pA(e)}s(QN,"getPluginIconUrl");async function pA(t){return E.CLOUDFRONT_CDN?li(t):await pn(E.PLUGIN_BUCKET_NAME,t)}s(pA,"getPluginUrl");function mA(t){return gA(t,"plugin.min.js")}s(mA,"getPluginJSKey");function hA(t){let e=t.iconUrl?"icon.svg":t.iconFileName;if(e)return gA(t,e)}s(hA,"getPluginIconKey");function gA(t,e){return`${EA(t.name)}/${e}`}s(gA,"getPluginS3Key");function EA(t){let e=`${t}`;return E.MULTI_TENANCY&&(e=`${q()}/${e}`),E.CLOUDFRONT_CDN&&(e=`plugins/${e}`),e}s(EA,"getPluginS3Dir");var SA="budibase.log",AA="budibase-logs-history.txt",_A=bp.default.join(fn(),"systemlogs");function yA(t){return bp.default.join(_A,t)}s(yA,"getFullPath");function OA(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(OA,"getSingleFileMaxSizeInfo");function xp(){let t=OA(E.ROLLING_LOG_MAX_SIZE);return TA.createStream(SA,{size:t?.size,path:_A,maxFiles:t?.totalHistoryFiles||1,immutable:!0,history:AA,initialRotation:!1})}s(xp,"localFileDestination");function jN(){let t=[],e=yA(AA);if(no.default.existsSync(e)){let i=no.default.readFileSync(e,"utf-8").split(`
|
|
37
37
|
`);for(let o of i.filter(a=>a))t.push(no.default.readFileSync(o))}return t.push(no.default.readFileSync(yA(SA))),Buffer.concat(t.map(n=>new Uint8Array(n)))}s(jN,"getLogReadStream");function HN(t){return typeof t=="object"&&t!==null&&!(t instanceof Error)}s(HN,"isPlainObject");function YN(t){return t instanceof Error}s(YN,"isError");function zN(t){return typeof t=="string"}s(zN,"isMessage");var Cr;if(!E.DISABLE_PINO_LOGGER){let t=E.LOG_LEVEL,e={level:t,formatters:{level:s(c=>({level:c.toUpperCase()}),"level"),bindings:s(()=>E.SELF_HOSTED?{service:E.SERVICE_NAME}:{},"bindings")},timestamp:s(()=>`,"timestamp":"${new Date(Date.now()).toISOString()}"`,"timestamp")},r=[];r.push(E.isDev()?{stream:(0,IA.default)({singleLine:!0}),level:t}:{stream:process.stdout,level:t}),E.SELF_HOSTED&&r.push({stream:xp(),level:t}),Cr=r.length?(0,Uu.default)(e,Uu.default.multistream(r)):(0,Uu.default)(e);let n=s(c=>{let l,d=[],f="";c.forEach(p=>{zN(p)&&(f=`${f} ${p}`.trimStart()),HN(p)&&d.push(p),YN(p)&&(l=p)});let g=u(),m={};m={tenantId:i(),appId:o(),automationId:a(),identityId:g?._id,identityType:g?.type,correlationId:yp()};let y=Np.default.scope().active();y&&Np.default.inject(y.context(),wA.formats.LOG,m);let h={err:l,pid:process.pid,...m};if(d.length){let p={},T=0;for(let A=0;A<d.length;A++){let _=d[A],I=_._logKey;I?(delete _._logKey,h[I]=_):(p[T]=_,T++)}Object.keys(p).length&&(h.data=p)}return[h,f]},"getLogParams");console.log=(...c)=>{let[l,d]=n(c);Cr?.info(l,d)},console.info=(...c)=>{let[l,d]=n(c);Cr?.info(l,d)},console.warn=(...c)=>{let[l,d]=n(c);Cr?.warn(l,d)},console.error=(...c)=>{let[l,d]=n(c);Cr?.error(l,d)},console.trace=(...c)=>{let[l,d]=n(c);l.err||(l.err=new Error),Cr?.trace(l,d)},console.debug=(...c)=>{let[l,d]=n(c);Cr?.debug(l,d)};let i=s(()=>{let c;try{c=q()}catch{}return c},"getTenantId"),o=s(()=>{let c;try{c=Me()}catch{}return c},"getAppId"),a=s(()=>{let c;try{c=vf()}catch{}return c},"getAutomationId"),u=s(()=>{let c;try{c=Qt()}catch{}return c},"getIdentity")}var ku=Cr;var JN=["AccountError"];function XN(t){return t&&t.suppressAlert}s(XN,"isSuppressed");function mn(t,e){e&&JN.includes(e.name)&&XN(e)||console.error(`bb-alert: ${t}`,e)}s(mn,"logAlert");function ZN(t,e,r,n){t=`${t} - db: ${e} - doc: ${r} - error: `,mn(t,n)}s(ZN,"logAlertWithInfo");function di(t,e){console.warn(`bb-warn: ${t}`,e)}s(di,"logWarn");var Mu=class extends Error{static{s(this,"UnretriableError")}constructor(e){super(e),this.name="PermanentError"}},Pp=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 Et(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 Mu&&await u.discard(),mn(`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 Ue.withTimeout(this.waitForCompletionMs,()=>r.finished())}}catch(r){if(r.errno!=="ETIME")throw r;return{success:!1,reason:"timeout"}}}};var eP=100,Fu,so=class t{static{s(this,"DocWritethroughProcessor")}static get queue(){return t._queue||(t._queue=new Et("docWritethroughQueue",{jobOptions:{attempts:eP}})),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=Ce(e),o;try{o=await i.get(r)}catch{o={_id:r}}o={...o,...n},await i.put(o)}},Up=class{static{s(this,"DocWritethrough")}constructor(e,r){this.db=e,this._docId=r}get docId(){return this._docId}async patch(e){await so.queue.add({dbName:this.db.name,docId:this.docId,data:e})}};function RA(){return Fu=new so().init(),Fu}s(RA,"init");function tP(){return Fu||RA()}s(tP,"getProcessor");var Wu={};P(Wu,{CacheKey:()=>Oe,TTL:()=>fi,bustCache:()=>pi,destroy:()=>ao,get:()=>oo,increment:()=>DA,keys:()=>Bu,store:()=>gn,withCache:()=>br,withCacheWithDynamicTTL:()=>CA});function yt(t){let e=q();return`${t}:${e}`}s(yt,"generateTenantKey");var hn=class{static{s(this,"BaseCache")}constructor(e=void 0){this.client=e}async getClient(){return this.client?this.client:await Bf()}async keys(e){return(await this.getClient()).keys(e)}async exists(e,r={useTenancy:!0}){return e=r.useTenancy?yt(e):e,(await this.getClient()).exists(e)}async scan(e,r={useTenancy:!0}){return e=r.useTenancy?yt(e):e,(await this.getClient()).scan(e)}async get(e,r={useTenancy:!0}){return e=r.useTenancy?yt(e):e,(await this.getClient()).get(e)}async bulkGet(e,r={useTenancy:!0}){return e=r.useTenancy?e.map(i=>yt(i)):e,(await this.getClient()).bulkGet(e)}async store(e,r,n=null,i={useTenancy:!0}){e=i.useTenancy?yt(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[yt(a)]=u,o),{})),await(await this.getClient()).bulkStore(e,r)}async delete(e,r={useTenancy:!0}){return e=r.useTenancy?yt(e):e,(await this.getClient()).delete(e)}async bulkDelete(e,r={useTenancy:!0}){return e=r.useTenancy?e.map(i=>yt(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(yt(e))}catch(n){throw console.error("Error busting cache - ",n),n}}async increment(e,r,n={useTenancy:!0}){e=n.useTenancy?yt(e):e;let i=await this.getClient(),o=await i.increment(e);return r&&await i.setExpiry(e,r),o}async deleteIfValue(e,r,n={useTenancy:!0}){e=n.useTenancy?yt(e):e,await(await this.getClient()).deleteIfValue(e,r)}};var Dr=new hn,Oe={CHECKLIST:"checklist",INSTALLATION:"installation",ANALYTICS_ENABLED:"analyticsEnabled",UNIQUE_TENANT_ID:"uniqueTenantId",EVENTS:"events",BACKFILL_METADATA:"backfillMetadata",EVENTS_RATE_LIMIT:"eventsRateLimit",OAUTH2_TOKEN:s(t=>`oauth2Token_${t}`,"OAUTH2_TOKEN")},fi=(n=>(n[n.ONE_MINUTE=600]="ONE_MINUTE",n[n.ONE_HOUR=3600]="ONE_HOUR",n[n.ONE_DAY=86400]="ONE_DAY",n))(fi||{}),Bu=s((...t)=>Dr.keys(...t),"keys"),oo=s((...t)=>Dr.get(...t),"get"),gn=s((...t)=>Dr.store(...t),"store"),ao=s((...t)=>Dr.delete(...t),"destroy"),br=s((...t)=>Dr.withCache(...t),"withCache"),CA=s((...t)=>Dr.withCacheWithDynamicTTL(...t),"withCacheWithDynamicTTL"),pi=s((...t)=>Dr.bustCache(...t),"bustCache"),DA=s((...t)=>Dr.increment(...t),"increment");var Bp={};P(Bp,{createCode:()=>cP,deleteCode:()=>dP,getCode:()=>lP,getExistingInvites:()=>Fp,getInviteCodes:()=>UA,updateCode:()=>uP});var yn={};P(yn,{AUTO_EXTEND_POLLING_MS:()=>vA,doWithLock:()=>uo,newRedlock:()=>En});var xA=W(require("redlock"));async function rP(t,e){if(t==="custom")return En(e);switch(t){case"try_once":return En(mi.TRY_ONCE);case"try_twice":return En(mi.TRY_TWICE);case"default":return En(mi.DEFAULT);case"delay_500":return En(mi.DELAY_500);case"auto_extend":return En(mi.AUTO_EXTEND);default:throw wt.unreachable(t)}}s(rP,"getClient");var mi={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 En(t={}){let e={...mi.DEFAULT,...t},n=(await Gf()).client;return new xA.default([n],e)}s(En,"newRedlock");function nP(t){let r=`lock:${t.systemLock?"system":q()}_${t.name}`;return t.resource&&(r=r+`_${t.resource}`),r}s(nP,"getLockName");var vA=me.fromSeconds(10).toMs();async function uo(t,e){let r=await rP(t.type,t.customOptions),n,i,o,a=!1;try{let u=nP(t),c=t.type==="auto_extend"?vA:t.ttl;if(n=await r.lock(u,c),t.type==="auto_extend"){let d=s(()=>{i=setTimeout(async()=>{a||(o=(async()=>{n=await n.extend(c,()=>t.onExtend&&t.onExtend())})(),await o,o=void 0,d())},c/2)},"extendInIntervals");d()}return{executed:!0,result:await e()}}catch(u){if(u.name==="LockError"){if(t.type==="try_once")return{executed:!1};throw u}else throw u}finally{a=!0,clearTimeout(i),await o?.catch(()=>{}),await n?.unlock()}}s(uo,"doWithLock");var NA=me.fromDays(7).toSeconds(),sP=me.fromSeconds(10).toMs(),Gu="Invitation is not valid or has expired, please request a new one.";function PA(t,e){if(!t)return null;let r=t.tenantId||e;return r?{tenantId:r,invites:t.invites||{}}:null}s(PA,"normaliseInviteList");function oP(t){let e=!1,r=Date.now();for(let[n,i]of Object.entries(t.invites))(!i?.expiresAt||i.expiresAt<=r)&&(delete t.invites[n],e=!0);return{list:t,changed:e}}s(oP,"pruneExpiredInvites");async function Mp(t){let r=await(await Ms()).get(t);return PA(r,t)}s(Mp,"loadInviteList");async function co(t,e){await(await Ms()).store(t,e)}s(co,"saveInviteList");async function lo(t,e){let{result:r}=await uo({type:"default",name:"process_user_invite",systemLock:!0,resource:t,ttl:sP},e);return r}s(lo,"withInviteListLock");function aP(t,e){return{code:t,email:e.email,info:e.info}}s(aP,"toInviteWithCode");async function LA(t,e){let r=await Ms(),n=PA(await r.get(e),e);if(!n)throw new Error(Gu);if(!Object.keys(n.invites).includes(t))throw new Error(Gu);return{list:n,invite:n.invites[t]}}s(LA,"findInviteInList");async function uP(t,e){let r={...e.info},n=r.tenantId||q();r.tenantId=n,await lo(n,async()=>{let i=await Mp(n)||{tenantId:n,invites:{}};i.invites[t]={email:e.email,info:r,expiresAt:Date.now()+NA*1e3},await co(n,i)})}s(uP,"updateCode");async function cP(t,e){let r=X(),n={...e||{}},i=n.tenantId||q();return n.tenantId=i,await lo(i,async()=>{let o=await Mp(i)||{tenantId:i,invites:{}};o.invites[r]={email:t,info:n,expiresAt:Date.now()+NA*1e3},await co(i,o)}),r}s(cP,"createCode");async function lP(t,e){let r=e||q();return await lo(r,async()=>{let n=await LA(t,r),{list:i,invite:o}=n;if(o.expiresAt<=Date.now())throw delete i.invites[t],await co(i.tenantId,i),new Error(Gu);return{email:o.email,info:o.info}})}s(lP,"getCode");async function dP(t,e){let r=e||q();try{await lo(r,async()=>{let n=await LA(t,r);delete n.list.invites[t],await co(n.list.tenantId,n.list)})}catch(n){if(n instanceof Error&&n.message===Gu)return;throw n}}s(dP,"deleteCode");async function UA(){let t=q(),e=await lo(t,async()=>{let n=await Mp(t)||{tenantId:t,invites:{}},i=oP(n);return n=i.list,i.changed&&await co(t,n),n}),r=new Map;for(let[n,i]of Object.entries(e.invites))r.set(n,aP(n,i));return Array.from(r.values())}s(UA,"getInviteCodes");async function Fp(t){let e=new Set(t.map(r=>r.toLowerCase()));return(await UA()).filter(r=>e.has(r.email.toLowerCase()))}s(Fp,"getExistingInvites");var Wp={};P(Wp,{createCode:()=>pP,getCode:()=>mP,invalidateCode:()=>hP});var fP=me.fromHours(1).toSeconds();async function pP(t,e){let r=X();return await(await Fs()).store(r,{userId:t,info:e},fP),r}s(pP,"createCode");async function mP(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(mP,"getCode");async function hP(t){await(await Fs()).delete(t)}s(hP,"invalidateCode");var nr={};P(nr,{getUser:()=>bo,getUsers:()=>tk,invalidateUser:()=>xo,invalidateUsers:()=>rk});var fo={};P(fo,{getPlatformDB:()=>xr,users:()=>Tt});var Tt={};P(Tt,{addSsoUser:()=>MA,addUser:()=>AP,getUserDoc:()=>kA,lookupTenantId:()=>gP,removeUser:()=>_P,updateUserDoc:()=>EP});function xr(){return Ce(pe.PLATFORM_INFO.name)}s(xr,"getPlatformDB");async function gP(t){return E.MULTI_TENANCY?(await kA(t)).tenantId:ce}s(gP,"lookupTenantId");async function kA(t){return xr().get(t)}s(kA,"getUserDoc");async function EP(t){await xr().put(t)}s(EP,"updateUserDoc");function yP(t,e){return{_id:t,tenantId:e}}s(yP,"newUserIdDoc");function TP(t,e,r){return{_id:e,userId:t,tenantId:r}}s(TP,"newUserEmailDoc");function SP(t,e,r,n){return{_id:t,userId:r,email:e,tenantId:n}}s(SP,"newUserSsoIdDoc");async function Gp(t,e){let r=xr(),n;try{await r.get(t)}catch(i){if(i.status===404)n=e(),await r.put(n);else throw i}}s(Gp,"addUserDoc");async function MA(t,e,r,n){return Gp(t,()=>SP(t,e,r,n))}s(MA,"addSsoUser");async function AP(t,e,r,n){let i=[Gp(e,()=>yP(e,t)),Gp(r,()=>TP(e,r,t))];n&&i.push(MA(n,r,e,t)),await Promise.all(i)}s(AP,"addUser");async function _P(t){let e=xr(),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(_P,"removeUser");var Sn={};P(Sn,{getAccount:()=>vr,getAccountByTenantId:()=>hi,getStatus:()=>OP});var FA=W(require("node-fetch"));var Tn=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";Xs.setHeader(n.headers);let o={method:e,body:i?JSON.stringify(n.body):n.body,headers:n.headers,credentials:"include"};return await(0,FA.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 $p=new Tn(E.INTERNAL_ACCOUNT_PORTAL_URL),Vp=E.SELF_HOSTED||E.DISABLE_ACCOUNT_PORTAL,vr=s(async t=>{if(Vp)return;let e={email:t},r=await $p.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"),hi=s(async t=>{if(Vp)return;let e={tenantId:t},r=await $p.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"),OP=s(async()=>{if(Vp)return;let t=await $p.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 Ai={};P(Ai,{UserDB:()=>Ut,addAppBuilder:()=>J0,bulkGetGlobalUsersById:()=>cc,bulkUpdateGlobalUsers:()=>Ro,cleanseUserObject:()=>fm,creatorsInList:()=>Pr,doesUserExist:()=>Q0,getAccountHolderFromUsers:()=>uc,getAllUserIds:()=>q0,getAllUsers:()=>K0,getById:()=>On,getCreatorCount:()=>Y0,getExistingAccounts:()=>Si,getExistingPlatformUsers:()=>S_,getExistingTenantUsers:()=>T_,getFirstPlatformUser:()=>Io,getGlobalUserByAppPage:()=>C_,getGlobalUserByEmail:()=>_t,getPlatformUsers:()=>ic,getUserCount:()=>H0,hasAdminPermissions:()=>Nr,hasAppBuilderPermissions:()=>O_,hasBuilderPermissions:()=>Be,isAdmin:()=>Lt,isAdminOrBuilder:()=>__,isAdminOrWorkspaceBuilder:()=>sc,isBuilder:()=>Ii,isCreatorAsync:()=>wo,isCreatorSync:()=>oc,isGlobalBuilder:()=>A_,paginatedUsers:()=>b_,removeAppBuilder:()=>X0,removePortalUserPermissions:()=>z0,searchExistingEmails:()=>am,searchGlobalUsersByApp:()=>R_,searchGlobalUsersByAppAccess:()=>dm,searchGlobalUsersByEmail:()=>D_,validateUniqueUser:()=>ac});var zu={};P(zu,{ActiveContentFileError:()=>qu,BadRequestError:()=>mo,BudibaseError:()=>po,EmailUnavailableError:()=>er,FeatureDisabledError:()=>ju,ForbiddenError:()=>Ku,HTTPError:()=>Fe,NotFoundError:()=>Vu,NotImplementedError:()=>Qu,UnexpectedError:()=>$u,UsageLimitError:()=>Hu,getErrorMessage:()=>BA,getPublicError:()=>Yu});var po=class extends Error{static{s(this,"BudibaseError")}constructor(e,r){super(e),this.code=r}};function BA(t){if(t==null)return"No error provided.";if(t instanceof Error)return t.message;if(typeof t=="string")return t;if(typeof t=="object"&&"message"in t)return String(t.message);try{let r=JSON.stringify(t);if(r!=="{}")return r}catch{}let e=String(t);return e!=="[object Object]"?e:"An unknown error occurred"}s(BA,"getErrorMessage");var Yu=s(t=>{let e;return t.code&&(e={code:t.code},t.getPublicError&&(e={...e,...t.getPublicError()})),e},"getPublicError"),Fe=class t extends po{static{s(this,"HTTPError")}constructor(e,r,n="http"){super(e,n),this.status=r}static async fromResponse(e){let r=await e.text(),n=r,i=e.status,o="http";try{let a=JSON.parse(r);n=a.error?.message||a.message,i=a.status??e.status,o=a.error?.code??e.statusText}catch{}return new t(n,i,o)}},$u=class extends Fe{static{s(this,"UnexpectedError")}constructor(e){super(e,500)}},Vu=class extends Fe{static{s(this,"NotFoundError")}constructor(e){super(e,404)}},mo=class extends Fe{static{s(this,"BadRequestError")}constructor(e){super(e,400)}},qu=class extends mo{static{s(this,"ActiveContentFileError")}constructor(e){super(`File "${e}" contains active content which is not permitted`)}},Ku=class extends Fe{static{s(this,"ForbiddenError")}constructor(e){super(e,403)}},Qu=class extends Fe{static{s(this,"NotImplementedError")}constructor(e){super(e,501)}},ju=class extends Error{static{s(this,"FeatureDisabledError")}constructor(e){super(`Feature disabled: '${e}'`)}},Hu=class extends Error{static{s(this,"UsageLimitError")}constructor(e){super(`Usage limit exceeded: '${e}'`)}},er=class extends Error{static{s(this,"EmailUnavailableError")}constructor(e){super(`Email already in use: '${e}'`)}};var jp={};P(jp,{PASSWORD_MAX_LENGTH:()=>Kp,PASSWORD_MIN_LENGTH:()=>qp,validatePassword:()=>Qp});var qp=+(E.PASSWORD_MIN_LENGTH||12),Kp=+(E.PASSWORD_MAX_LENGTH||512);function Qp(t){return!t||t.length<qp?{valid:!1,error:`Password invalid. Minimum ${qp} characters.`}:t.length>Kp?{valid:!1,error:`Password invalid. Maximum ${Kp} characters.`}:{valid:!0}}s(Qp,"validatePassword");var Ju={};P(Ju,{createASession:()=>IP,endSession:()=>wP,getSession:()=>Yp,getSessionsForUser:()=>ho,invalidateSessions:()=>An,updateSessionTTL:()=>Hp});var GA=require("uuid");var $A=Tu();function gi(t,e){return`${t}/${e}`}s(gi,"makeSessionID");async function ho(t){return t?(await(await Ar()).scan(t)).map(n=>n.value):(console.trace("Cannot get sessions for undefined userId"),[])}s(ho,"getSessionsForUser");async function An(t,e={}){try{let r=e?.reason||"unknown",n=e.sessionIds||[],i;if(n.length===0?i=(await ho(t)).map(a=>({key:gi(a.userId,a.sessionId)})):(n=Array.isArray(n)?n:[n],i=n.map(o=>({key:gi(t,o)}))),i&&i.length>0){let o=await Ar(),a=[];for(let u of i)a.push(o.delete(u.key));E.isTest()||di(`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(An,"invalidateSessions");async function IP(t,e){let r=await ho(t),n=0;if(r.length>=3){let l=r.sort((g,m)=>new Date(g.createdAt).getTime()-new Date(m.createdAt).getTime()),d=r.length-3+1,f=l.slice(0,d).map(g=>g.sessionId);n=f.length,await An(t,{sessionIds:f,reason:"session limit exceeded"})}let i=await Ar(),o=e.sessionId,a=e.csrfToken?e.csrfToken:(0,GA.v4)(),u=gi(t,o),c={...e,csrfToken:a,createdAt:new Date().toISOString(),lastAccessedAt:new Date().toISOString(),userId:t};return await i.store(u,c,$A),{session:c,invalidatedSessionCount:n}}s(IP,"createASession");async function Hp(t){let e=await Ar(),r=gi(t.userId,t.sessionId);t.lastAccessedAt=new Date().toISOString(),await e.store(r,t,$A)}s(Hp,"updateSessionTTL");async function wP(t,e){await(await Ar()).delete(gi(t,e))}s(wP,"endSession");async function Yp(t,e){if(!t||!e)throw new Error(`Invalid session details - ${t} - ${e}`);let n=await(await Ar()).get(gi(t,e));if(!n)throw new Error(`Session not found - ${t} - ${e}`);return n}s(Yp,"getSession");var Ti={};P(Ti,{account:()=>HA,action:()=>YA,ai:()=>zA,analytics:()=>zp,app:()=>JA,asyncEventQueue:()=>St,auditLog:()=>XA,auth:()=>nc,automation:()=>ZA,backfill:()=>e_,backfillCache:()=>ec,backup:()=>t_,datasource:()=>r_,email:()=>n_,environmentVariable:()=>i_,group:()=>s_,identification:()=>At,initAsyncEvents:()=>v0,installation:()=>yo,layout:()=>o_,license:()=>a_,org:()=>u_,plugin:()=>c_,processors:()=>rm,publishEvent:()=>S,query:()=>l_,resource:()=>d_,role:()=>Oo,rowAction:()=>f_,rows:()=>p_,screen:()=>m_,serve:()=>h_,shutdown:()=>N0,table:()=>g_,user:()=>We,view:()=>E_,workspace:()=>y_});var zp={};P(zp,{enabled:()=>RP});var RP=s(async()=>Xu(),"enabled");var St;function Zu(){St=new Et("systemEventQueue",{jobTags:s(t=>({"event.name":t.event}),"jobTags")})}s(Zu,"init");async function VA(){St&&await St.close()}s(VA,"shutdown");async function qA(t){St||Zu();let{event:e,identity:r}=t;dh.indexOf(e)!==-1&&r.tenantId&&await St.add(t)}s(qA,"publishAsyncEvent");var ec={};P(ec,{end:()=>DP,isAlreadySent:()=>Zp,isBackfillingEvent:()=>Xp,recordEvent:()=>Jp,start:()=>CP});var CP=s(async t=>xP({eventWhitelist:t}),"start"),Jp=s(async(t,e)=>{let r=em(t,e);await gn(r,e,void 0,{useTenancy:!1})},"recordEvent"),DP=s(async()=>{await vP(),await NP()},"end"),bP=s(async()=>oo(Oe.BACKFILL_METADATA),"getBackfillMetadata"),xP=s(async t=>gn(Oe.BACKFILL_METADATA,t),"saveBackfillMetadata"),vP=s(async()=>{await ao(Oe.BACKFILL_METADATA)},"deleteBackfillMetadata"),NP=s(async()=>{let t=em(),e=await Bu(t);for(let r of e)await ao(r,{useTenancy:!1})},"clearEvents"),Xp=s(async t=>{let r=(await bP())?.eventWhitelist;return!!(r&&r.includes(t))},"isBackfillingEvent"),Zp=s(async(t,e)=>{let r=em(t,e);return!!await oo(r,{useTenancy:!1})},"isAlreadySent"),PP={"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}`},em=s((t,e)=>{let r,n=q();if(t){r=`${Oe.EVENTS}:${n}:${t}`;let i=PP[t],o=i?i(e):void 0;o&&(r=`${r}:${o}`)}else r=`${Oe.EVENTS}:${n}:*`;return r},"getEventKey");var rm={};P(rm,{init:()=>FP,processors:()=>rr});var tm=E.SELF_HOSTED&&!E.isDev(),go=class{static{s(this,"LoggingProcessor")}async processEvent(e,r,n){tm||console.log(`[audit] [identityType=${r.type}] ${e}`,n)}async identify(e){tm||console.log("[audit] identified",e)}async identifyGroup(e){tm||console.log("[audit] group identified",e)}async shutdown(){}};var Ei=class t{static{s(this,"AuditLogsProcessor")}static{this.auditLogsEnabled=!1}static init(e){t.auditLogsEnabled=!0;let r=e;return t.auditLogQueue=new Et("auditLogQueue",{jobTags:s(n=>({"event.name":n.event}),"jobTags")}),t.auditLogQueue.process(async n=>{await De(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&&ip(e)){let o=r.type==="user"?r.id:void 0;await t.auditLogQueue.add({event:e,properties:n,opts:{userId:o,timestamp:i,appId:Me(),hostInfo:r.hostInfo},tenantId:q()})}}async identify(){}async identifyGroup(){}async shutdown(){await t.auditLogQueue?.close()}};var KA=require("uuid");var LP=new Tn(E.INTERNAL_ACCOUNT_PORTAL_URL),yi=class t{static{s(this,"EventBrokerProcessor")}static init(e){t.getLicenseKeyFn=e}async processEvent(e,r,n,i){if(E.DISABLE_ACCOUNT_PORTAL)return;let o;if(E.SELF_HOSTED){if(!t.getLicenseKeyFn)return;let c=await t.getLicenseKeyFn();if(!c)return;o={"x-budibase-license-key":c}}else o={"x-budibase-api-key":E.ACCOUNT_PORTAL_API_KEY},r.tenantId&&(o["x-budibase-tenant-id"]=r.tenantId);let a=Me(),u={id:(0,KA.v4)(),type:e,identity:r,properties:{...n,version:E.VERSION,service:E.SERVICE,environment:r.environment,hosting:r.hosting,...a&&{appId:a},...r.installationId&&{installationId:r.installationId},...r.tenantId&&{tenantId:r.tenantId}},timestamp:i===void 0?Date.now():new Date(i).getTime()};try{let c=await LP.post("/api/v2/analytics/event",{headers:o,body:u});c.ok||console.warn(`[EventBrokerProcessor] unexpected response status: ${c.status}`)}catch(c){console.error(`[EventBrokerProcessor] failed to send event: ${c}`)}}};var Eo=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 UP=new go,kP=new Ei,MP=new yi;function FP(t,e){return yi.init(e),Ei.init(t)}s(FP,"init");var rr=new Eo([UP,kP,MP]);var tc={};P(tc,{checkInstallVersion:()=>GP,getInstall:()=>To,getInstallFromDB:()=>im});var nm=W(require("semver"));var To=s(async()=>br(Oe.INSTALLATION,86400,im,{useTenancy:!1}),"getInstall");async function BP(t){let e={_id:pe.PLATFORM_INFO.docs.install,installId:X(),version:E.VERSION};try{let r=await t.put(e);return e._rev=r.rev,e}catch(r){if(r.status===409)return im();throw r}}s(BP,"createInstallDoc");var im=s(async()=>je(pe.PLATFORM_INFO.name,async t=>{let e;try{e=await t.get(pe.PLATFORM_INFO.docs.install)}catch(r){if(r.status===404)e=await BP(t);else throw r}return e}),"getInstallFromDB"),WP=s(async t=>{try{await je(pe.PLATFORM_INFO.name,async e=>{let r=await To();r.version=t,await e.put(r),await pi(Oe.INSTALLATION)})}catch(e){if(e.status===409)return!1;throw e}return!0},"updateVersion"),GP=s(async()=>{let t=await To(),e=t.version,r=E.VERSION;try{if(e!==r){let n=nm.default.gt(r,e),i=nm.default.lt(r,e);await WP(r)&&(await vs({_id:t.installId,type:"installation"},async()=>{n?await yo.upgraded(e,r):i&&await yo.downgraded(e,r)}),await At.identifyInstallationGroup(t.installId))}}catch(n){n?.message?.includes("Invalid Version")?mn(`Invalid version "${r}" - is it semver?`):mn("Failed to retrieve version",n)}},"checkInstallVersion");var $P=s(async()=>{let t=pf(),e=_o(),r;if(t?r=t.type:r="tenant",r==="installation"){let n=await _n(),i=So();return{id:QA(n,r),hosting:i,type:r,installationId:n,environment:e}}else if(r==="tenant"){let n=await _n(),i=await rc(q()),o=So();return{id:QA(i,r),type:r,hosting:o,installationId:n,tenantId:i,realTenantId:q(),environment:e}}else if(r==="user"){let n=t,i=await rc(q()),o=await _n(),a=n.account,u;return a?u=a.hosting:u=So(),{id:n._id,type:r,hosting:u,installationId:o,tenantId:i,environment:e,realTenantId:q(),hostInfo:n.hostInfo}}else throw new Error("Unknown identity type")},"getCurrentIdentity"),VP=s(async(t,e)=>{let r=t,n="installation",i=So(),o=E.VERSION,a=_o(),u={id:r,type:n,hosting:i,version:o,environment:a};await sm(u,e),await Ao({...u,id:`$${n}_${r}`},e)},"identifyInstallationGroup"),qP=s(async(t,e,r,n=E.VERSION)=>{let i=await rc(t),o="tenant",a=await _n(),u=_o(),c={id:i,type:o,hosting:e,environment:u,installationId:a,createdAt:r,createdVersion:n};await sm(c,r),await Ao({...c,id:`$${o}_${i}`},r)},"identifyTenantGroup"),KP=s(async(t,e,r)=>{let n=t._id,i=await rc(t.tenantId),o="user",a=Be(t),u=Nr(t),c;jo(t)&&(c=t.providerType);let d=(await Si([t.email])).length>0,f=!!e&&d&&e.verified,g=await _n(),m=e?e.hosting:So(),y=_o();await Ao({id:n,type:o,hosting:m,installationId:g,tenantId:i,verified:f,accountHolder:d,providerType:c,builder:a,admin:u,environment:y},r)},"identifyUser"),QP=s(async t=>{let e=t.accountId,r=t.tenantId,n="user",i=Qo(t)?t.providerType:void 0,o=t.verified,a=!0,u=t.hosting,c=await _n(),l=_o();if(Ko(t)){let f=await _t(t.email);f?._id&&(e=f._id)}await Ao({id:e,type:n,hosting:u,installationId:c,tenantId:r,providerType:i,verified:o,accountHolder:a,environment:l})},"identifyAccount"),Ao=s(async(t,e)=>{await rr.identify(t,e)},"identify"),sm=s(async(t,e)=>{await rr.identifyGroup(t,e)},"identifyGroup"),_o=s(()=>E.isDev()?"development":E.DEPLOYMENT_ENVIRONMENT,"getDeploymentEnvironment"),So=s(()=>E.SELF_HOSTED?"self":"cloud","getHostingFromEnv"),_n=s(async()=>jP()?"account-portal":(await To()).installId,"getInstallationId"),rc=s(async t=>E.SELF_HOSTED?jA(t):t,"getEventTenantId"),jA=s(async t=>De(t,()=>br(Oe.UNIQUE_TENANT_ID,86400,async()=>{let e=z(),r=await _i(),n;return r.config.uniqueTenantId?r.config.uniqueTenantId:(n=`${X()}_${t}`,r.config.uniqueTenantId=n,r.config.createdVersion=E.VERSION,await e.put(r),n)})),"getUniqueTenantId"),jP=s(()=>E.SERVICE==="account-portal","isAccountPortal"),QA=s((t,e)=>e==="installation"||e==="tenant"?`$${e}_${t}`:t,"formatDistinctId"),At={getCurrentIdentity:$P,identifyInstallationGroup:VP,identifyTenantGroup:qP,identifyUser:KP,identifyAccount:QP,identify:Ao,identifyGroup:sm,getInstallationId:_n,getUniqueTenantId:jA};var S=s(async(t,e,r,n)=>{let i=n||await At.getCurrentIdentity();if(!(n?!1:await Xp(t))){await qA({event:t,identity:i,properties:e,timestamp:r}),await rr.processEvent(t,i,e,r);return}await Zp(t,e)||(await rr.processEvent(t,i,e,r),await Jp(t,e))},"publishEvent");async function HP(t,e){let r={tenantId:t.tenantId};await S("account:created",r,void 0,e)}s(HP,"created");async function YP(t){let e={tenantId:t.tenantId};await S("account:deleted",e)}s(YP,"deleted");async function zP(t){let e={tenantId:t.tenantId};await S("account:verified",e)}s(zP,"verified");var HA={created:HP,deleted:YP,verified:zP};function JP(t,e){S("action:automation_step:executed",t,e).catch(r=>{console.error("automationStepExecuted telemetry failed",{action:t,err:r})})}s(JP,"automationStepExecuted");function XP(t){S("action:automation_step:failed",t).catch(e=>{console.error("automationStepFailed telemetry failed",{action:t,err:e})})}s(XP,"automationStepFailed");function ZP(t,e){S("action:crud:executed",t,e).catch(r=>{console.error("crudExecuted telemetry failed",{action:t,err:r})})}s(ZP,"crudExecuted");function eL(t){S("action:crud:failed",t).catch(e=>{console.error("crudFailed telemetry failed",{action:t,err:e})})}s(eL,"crudFailed");function tL(t,e){S("action:ai_agent:executed",t,e).catch(r=>{console.error("aiAgentExecuted telemetry failed",{action:t,err:r})})}s(tL,"aiAgentExecuted");function rL(t){S("action:ai_agent:failed",t).catch(e=>{console.error("aiAgentFailed telemetry failed",{action:t,err:e})})}s(rL,"aiAgentFailed");var YA={aiAgentExecuted:tL,aiAgentFailed:rL,automationStepExecuted:JP,automationStepFailed:XP,crudExecuted:ZP,crudFailed:eL};function nL(t,e){let r={configId:t._id,audited:{name:t.name}};S("ai:config:created",r,e).catch(n=>{console.error("configCreated telemetry failed",{configId:t._id,err:n})})}s(nL,"configCreated");function iL(t){let e={configId:t._id,audited:{name:t.name}};S("ai:config:updated",e).catch(r=>{console.error("configUpdated telemetry failed",{configId:t._id,err:r})})}s(iL,"configUpdated");function sL(t){let e={configId:t._id,audited:{name:t.name}};S("ai:config:deleted",e).catch(r=>{console.error("configDeleted telemetry failed",{configId:t._id,err:r})})}s(sL,"configDeleted");function oL(t){let e={agentId:t._id,audited:{name:t.name}};S("ai:agent:created",e).catch(r=>{console.error("agentCreated telemetry failed",{agentId:t._id,err:r})})}s(oL,"agentCreated");function aL(t){let e={agentId:t._id,audited:{name:t.name}};S("ai:agent:updated",e).catch(r=>{console.error("agentUpdated telemetry failed",{agentId:t._id,err:r})})}s(aL,"agentUpdated");function uL(t){let e={agentId:t._id,audited:{name:t.name}};S("ai:agent:deleted",e).catch(r=>{console.error("agentDeleted telemetry failed",{agentId:t._id,err:r})})}s(uL,"agentDeleted");function cL(t){S("rag:file:uploaded",t).catch(e=>{console.error("ragFileUploaded telemetry failed",{event:t,err:e})})}s(cL,"ragFileUploaded");function lL(t){S("rag:file:deleted",t).catch(e=>{console.error("ragFileDeleted telemetry failed",{event:t,err:e})})}s(lL,"ragFileDeleted");function dL(t){S("rag:file:sharepoint:connected",t).catch(e=>{console.error("ragFileSharePointConnected telemetry failed",{event:t,err:e})})}s(dL,"ragFileSharePointConnected");function fL(t){S("rag:file:sharepoint:disconnected",t).catch(e=>{console.error("ragFileSharePointDisconnected telemetry failed",{event:t,err:e})})}s(fL,"ragFileSharePointDisconnected");function pL(t){S("rag:file:processed",t).catch(e=>{console.error("ragFileProcessed telemetry failed",{event:t,err:e})})}s(pL,"ragFileProcessed");function mL(t){S("rag:file:sharepoint:sync",t).catch(e=>{console.error("ragFileSharePointSync telemetry failed",{event:t,err:e})})}s(mL,"ragFileSharePointSync");var zA={configCreated:nL,configUpdated:iL,configDeleted:sL,agentCreated:oL,agentUpdated:aL,agentDeleted:uL,ragFileUploaded:cL,ragFileDeleted:lL,ragFileSharePointConnected:dL,ragFileSharePointDisconnected:fL,ragFileSharePointSync:mL,ragFileProcessed:pL};var hL=s(async(t,e)=>{let r={appId:t.appId,version:t.version,audited:{name:t.name}};await S("app:created",r,e)},"created");async function gL(t){let e={appId:t.appId,version:t.version,audited:{name:t.name}};await S("app:updated",e)}s(gL,"updated");async function EL(t){let e={appId:t.appId,audited:{name:t.name}};await S("app:deleted",e)}s(EL,"deleted");async function yL(t,e){let r={appId:t.appId,audited:{name:t.name}};await S("app:published",r,e)}s(yL,"published");async function TL(t){let e={appId:t.appId,audited:{name:t.name}};await S("app:unpublished",e)}s(TL,"unpublished");async function SL(t){let e={appId:t.appId,audited:{name:t.name}};await S("app:file:imported",e)}s(SL,"fileImported");async function AL(t,e){let r={duplicateAppId:e,appId:t.appId,audited:{name:t.name}};await S("app:duplicated",r)}s(AL,"duplicated");async function _L(t,e){let r={appId:t.appId,templateKey:e,audited:{name:t.name}};await S("app:template:imported",r)}s(_L,"templateImported");async function OL(t,e,r){let n={appId:t.appId,currentVersion:e,updatedToVersion:r,audited:{name:t.name}};await S("app:version:updated",n)}s(OL,"versionUpdated");async function IL(t,e,r){let n={appId:t.appId,currentVersion:e,revertedToVersion:r,audited:{name:t.name}};await S("app:version:reverted",n)}s(IL,"versionReverted");async function wL(t){let e={appId:t.appId,audited:{name:t.name}};await S("app:reverted",e)}s(wL,"reverted");async function RL(t){let e={appId:t.appId,audited:{name:t.name}};await S("app:exported",e)}s(RL,"exported");var JA={created:hL,updated:gL,deleted:EL,published:yL,unpublished:TL,fileImported:SL,duplicated:AL,templateImported:_L,versionUpdated:OL,versionReverted:IL,reverted:wL,exported:RL};async function CL(t){let e={filters:t};await S("audit_log:filtered",e)}s(CL,"filtered");async function DL(t){let e={filters:t};await S("audit_log:downloaded",e)}s(DL,"downloaded");var XA={filtered:CL,downloaded:DL};async function bL(t,e){let n={userId:(await At.getCurrentIdentity()).id,source:t,audited:{email:e}};await S("auth:login",n)}s(bL,"login");async function xL(t){let r={userId:(await At.getCurrentIdentity()).id,audited:{email:t}};await S("auth:logout",r)}s(xL,"logout");async function vL(t,e){let r={type:t};await S("auth:sso:created",r,e)}s(vL,"SSOCreated");async function NL(t){let e={type:t};await S("auth:sso:updated",e)}s(NL,"SSOUpdated");async function PL(t,e){let r={type:t};await S("auth:sso:activated",r,e)}s(PL,"SSOActivated");async function LL(t){let e={type:t};await S("auth:sso:deactivated",e)}s(LL,"SSODeactivated");var nc={login:bL,logout:xL,SSOCreated:vL,SSOUpdated:NL,SSOActivated:PL,SSODeactivated:LL};async function UL(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 S("automation:created",r,e)}s(UL,"created");async function kL(t){let e={appId:t.appId,automationId:t._id,triggerId:t.definition?.trigger?.id,triggerType:t.definition?.trigger?.stepId};await S("automation:trigger:updated",e)}s(kL,"triggerUpdated");async function ML(t){let e={appId:t.appId,automationId:t._id,triggerId:t.definition?.trigger?.id,triggerType:t.definition?.trigger?.stepId,audited:{name:t.name}};await S("automation:deleted",e)}s(ML,"deleted");async function FL(t){let e={appId:t.appId,automationId:t._id,triggerId:t.definition?.trigger?.id,triggerType:t.definition?.trigger?.stepId};await S("automation:tested",e)}s(FL,"tested");var BL=s(async(t,e)=>{let r={count:t};await S("automations:run",r,e)},"run");async function WL(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 S("automation:step:created",n,r)}s(WL,"stepCreated");async function GL(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 S("automation:step:deleted",r)}s(GL,"stepDeleted");var ZA={created:UL,triggerUpdated:kL,deleted:ML,tested:FL,run:BL,stepCreated:WL,stepDeleted:GL};var Oi=!E.SELF_HOSTED&&!E.isDev();async function $L(t){Oi||await S("app:backfill:succeeded",t)}s($L,"appSucceeded");async function VL(t){if(Oi)return;let e={error:JSON.stringify(t,Object.getOwnPropertyNames(t))};await S("app:backfill:failed",e)}s(VL,"appFailed");async function qL(t){Oi||await S("tenant:backfill:succeeded",t)}s(qL,"tenantSucceeded");async function KL(t){if(Oi)return;let e={error:JSON.stringify(t,Object.getOwnPropertyNames(t))};await S("tenant:backfill:failed",e)}s(KL,"tenantFailed");async function QL(){if(Oi)return;let t={};await S("installation:backfill:succeeded",t)}s(QL,"installationSucceeded");async function jL(t){if(Oi)return;let e={error:JSON.stringify(t,Object.getOwnPropertyNames(t))};await S("installation:backfill:failed",e)}s(jL,"installationFailed");var e_={appSucceeded:$L,appFailed:VL,tenantSucceeded:qL,tenantFailed:KL,installationSucceeded:QL,installationFailed:jL};async function HL(t){let e={appId:t.appId,restoreId:t._id,backupCreatedAt:t.timestamp,name:t.name};await S("app:backup:restored",e)}s(HL,"workspaceBackupRestored");async function YL(t,e,r,n,i){let o={appId:t,backupId:e,type:r,trigger:n,name:i};await S("app:backup:triggered",o)}s(YL,"workspaceBackupTriggered");var t_={workspaceBackupRestored:HL,workspaceBackupTriggered:YL};function om(t){return!Object.values(Go).includes(t.source)}s(om,"isCustom");async function zL(t,e){let r={datasourceId:t._id,source:t.source,custom:om(t)};await S("datasource:created",r,e)}s(zL,"created");async function JL(t){let e={datasourceId:t._id,source:t.source,custom:om(t)};await S("datasource:updated",e)}s(JL,"updated");async function XL(t){let e={datasourceId:t._id,source:t.source,custom:om(t)};await S("datasource:deleted",e)}s(XL,"deleted");var r_={created:zL,updated:JL,deleted:XL};async function ZL(t){let e={};await S("email:smtp:created",e,t)}s(ZL,"SMTPCreated");async function eU(){let t={};await S("email:smtp:updated",t)}s(eU,"SMTPUpdated");var n_={SMTPCreated:ZL,SMTPUpdated:eU};async function tU(t,e){let r={name:t,environments:e};await S("environment_variable:created",r)}s(tU,"created");async function rU(t){let e={name:t};await S("environment_variable:deleted",e)}s(rU,"deleted");async function nU(t){let e={userId:t};await S("environment_variable:upgrade_panel_opened",e)}s(nU,"upgradePanelOpened");var i_={created:tU,deleted:rU,upgradePanelOpened:nU};async function iU(t,e){let r={groupId:t._id,viaScim:gt(),audited:{name:t.name}};await S("user_group:created",r,e)}s(iU,"created");async function sU(t){let e={groupId:t._id,viaScim:gt(),audited:{name:t.name}};await S("user_group:updated",e)}s(sU,"updated");async function oU(t){let e={groupId:t._id,viaScim:gt(),audited:{name:t.name}};await S("user_group:deleted",e)}s(oU,"deleted");async function aU(t,e,r){let n={count:t,groupId:e._id,userIds:r,viaScim:gt(),audited:{name:e.name}};await S("user_group:user_added",n)}s(aU,"usersAdded");async function uU(t,e,r){let n={count:t,groupId:e._id,userIds:r,viaScim:gt(),audited:{name:e.name}};await S("user_group:users_deleted",n)}s(uU,"usersDeleted");async function cU(t){let e={groupId:t,onboarding:!0};await S("user_group:onboarding_added",e)}s(cU,"createdOnboarding");async function lU(t){let e={permissions:t.roles,groupId:t._id,audited:{name:t.name}};await S("user_group:permissions_edited",e)}s(lU,"permissionsEdited");var s_={created:iU,updated:sU,deleted:oU,usersAdded:aU,usersDeleted:uU,createdOnboarding:cU,permissionsEdited:lU};async function dU(t){let e={currentVersion:t};await S("installation:version:checked",e)}s(dU,"versionChecked");async function fU(t,e){let r={from:t,to:e};await S("installation:version:upgraded",r)}s(fU,"upgraded");async function pU(t,e){let r={from:t,to:e};await S("installation:version:downgraded",r)}s(pU,"downgraded");async function mU(){let t={};await S("installation:firstStartup",t)}s(mU,"firstStartup");var yo={versionChecked:dU,upgraded:fU,downgraded:pU,firstStartup:mU};async function hU(t,e){let r={layoutId:t._id};await S("layout:created",r,e)}s(hU,"created");async function gU(t){let e={layoutId:t};await S("layout:deleted",e)}s(gU,"deleted");var o_={created:hU,deleted:gU};async function EU(t,e){let r={accountId:t.accountId,...e};await S("license:plan:changed",r)}s(EU,"planChanged");async function yU(t){let e={accountId:t.accountId};await S("license:activated",e)}s(yU,"activated");async function TU(t){let e={accountId:t.accountId};await S("license:checkout:opened",e)}s(TU,"checkoutOpened");async function SU(t){let e={accountId:t.accountId};await S("license:checkout:success",e)}s(SU,"checkoutSuccess");async function AU(t){let e={accountId:t.accountId};await S("license:portal:opened",e)}s(AU,"portalOpened");async function _U(t){let e={accountId:t.accountId};await S("license:payment:failed",e)}s(_U,"paymentFailed");async function OU(t){let e={accountId:t.accountId};await S("license:payment:recovered",e)}s(OU,"paymentRecovered");var a_={planChanged:EU,activated:yU,checkoutOpened:TU,checkoutSuccess:SU,portalOpened:AU,paymentFailed:_U,paymentRecovered:OU};async function IU(t){let e={};await S("org:info:name:updated",e,t)}s(IU,"nameUpdated");async function wU(t){let e={};await S("org:info:logo:updated",e,t)}s(wU,"logoUpdated");async function RU(t){let e={};await S("org:platformurl:updated",e,t)}s(RU,"platformURLUpdated");async function CU(){let t={};await S("analytics:opt:out",t)}s(CU,"analyticsOptOut");async function DU(){let t={};await S("analytics:opt:out",t)}s(DU,"analyticsOptIn");var u_={nameUpdated:IU,logoUpdated:wU,platformURLUpdated:RU,analyticsOptOut:CU,analyticsOptIn:DU};async function bU(t){let e={type:t.schema.type,name:t.name,description:t.description,version:t.version};await S("plugin:init",e)}s(bU,"init");async function xU(t){let e={pluginId:t._id,type:t.schema.type,source:t.source,name:t.name,description:t.description,version:t.version};await S("plugin:imported",e)}s(xU,"imported");async function vU(t){let e={pluginId:t._id,type:t.schema.type,name:t.name,description:t.description,version:t.version};await S("plugin:deleted",e)}s(vU,"deleted");var c_={init:bU,imported:xU,deleted:vU};var NU=s(async(t,e,r)=>{let n={queryId:e._id,datasourceId:t._id,source:t.source,queryVerb:e.queryVerb};await S("query:created",n,r)},"created"),PU=s(async(t,e)=>{let r={queryId:e._id,datasourceId:t._id,source:t.source,queryVerb:e.queryVerb};await S("query:updated",r)},"updated"),LU=s(async(t,e,r)=>{let n={queryId:e._id,datasourceId:t._id,source:t.source,queryVerb:e.queryVerb,appId:r};await S("query:deleted",n)},"deleted"),UU=s(async(t,e,r)=>{let n={datasourceId:t._id,source:t.source,count:r,importSource:e};await S("query:import",n)},"imported"),kU=s(async(t,e)=>{let r={count:t};await S("queries:run",r,e)},"run"),MU=s(async(t,e)=>{let r={queryId:e.queryId,datasourceId:t._id,source:t.source,queryVerb:e.queryVerb};await S("query:previewed",r)},"previewed"),l_={created:NU,updated:PU,deleted:LU,imported:UU,run:kU,previewed:MU};async function FU({resource:t,fromWorkspace:e,toWorkspace:r},n){let i={resource:t,fromWorkspace:e,toWorkspace:r};await S("resource:copied_to_workspace",i,n)}s(FU,"duplicatedToWorkspace");var d_={duplicatedToWorkspace:FU};async function BU(t,e){let r={roleId:t._id,permissionId:t.permissionId,inherits:t.inherits};await S("role:created",r,e)}s(BU,"created");async function WU(t){let e={roleId:t._id,permissionId:t.permissionId,inherits:t.inherits};await S("role:updated",e)}s(WU,"updated");async function GU(t){let e={roleId:t._id,permissionId:t.permissionId,inherits:t.inherits};await S("role:deleted",e)}s(GU,"deleted");async function $U(t,e,r){let n={userId:t._id,roleId:e};await S("role:assigned",n,r)}s($U,"assigned");async function VU(t,e){let r={userId:t._id,roleId:e};await S("role:unassigned",r)}s(VU,"unassigned");var Oo={created:BU,updated:WU,deleted:GU,assigned:$U,unassigned:VU};async function qU(t,e){await S("row_action:created",t,e)}s(qU,"created");var f_={created:qU};var KU=s(async(t,e)=>{let r={count:t};await S("rows:created",r,e)},"created"),QU=s(async(t,e)=>{let r={tableId:t._id,count:e};await S("rows:imported",r)},"imported"),p_={created:KU,imported:QU};async function jU(t,e){let r={layoutId:t.layoutId,screenId:t._id,roleId:t.routing.roleId,audited:{name:t.routing?.route}};await S("screen:created",r,e)}s(jU,"created");async function HU(t){let e={layoutId:t.layoutId,screenId:t._id,roleId:t.routing.roleId,audited:{name:t.routing?.route}};await S("screen:deleted",e)}s(HU,"deleted");var m_={created:jU,deleted:HU};async function YU(t){let e={timezone:t};await S("served:builder",e)}s(YU,"servedBuilder");async function zU(t,e,r){let n={appVersion:t.version,timezone:e,embed:r===!0};await S("served:app",n)}s(zU,"servedApp");async function JU(t,e){let r={appId:t.appId,appVersion:t.version,timezone:e};await S("served:app:preview",r)}s(JU,"servedAppPreview");var h_={servedBuilder:YU,servedApp:zU,servedAppPreview:JU};async function XU(t,e){let r={tableId:t._id,audited:{name:t.name}};await S("table:created",r,e)}s(XU,"created");async function ZU(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 S("table:updated",i)}s(ZU,"updated");async function e0(t,e){let r={tableId:t._id,audited:{name:t.name},appId:e};await S("table:deleted",r)}s(e0,"deleted");async function t0(t,e){let r={tableId:t._id,format:e,audited:{name:t.name}};await S("table:exported",r)}s(t0,"exported");async function r0(t){let e={tableId:t._id,audited:{name:t.name}};await S("table:imported",e)}s(r0,"imported");var g_={created:XU,updated:ZU,deleted:e0,exported:t0,imported:r0};async function n0(t,e){let r={userId:t._id,viaScim:gt(),audited:{email:t.email}};await S("user:created",r,e)}s(n0,"created");async function i0(t){let e={userId:t._id,viaScim:gt(),audited:{email:t.email}};await S("user:updated",e)}s(i0,"updated");async function s0(t){let e={userId:t._id,viaScim:gt(),audited:{email:t.email}};await S("user:deleted",e)}s(s0,"deleted");async function o0(t,e){let r={userId:t._id,audited:{email:t.email}};await S("user:admin:assigned",r,e)}s(o0,"permissionAdminAssigned");async function a0(t){let e={userId:t._id,audited:{email:t.email}};await S("user:admin:removed",e)}s(a0,"permissionAdminRemoved");async function u0(t,e){let r={userId:t._id,audited:{email:t.email}};await S("user:builder:assigned",r,e)}s(u0,"permissionBuilderAssigned");async function c0(t){let e={userId:t._id,audited:{email:t.email}};await S("user:builder:removed",e)}s(c0,"permissionBuilderRemoved");async function l0(t){let e={audited:{email:t}};await S("user:invited",e)}s(l0,"invited");async function d0(t){let e={userId:t._id,audited:{email:t.email}};await S("user:invite:accepted",e)}s(d0,"inviteAccepted");async function f0(t){let e={userId:t._id,audited:{email:t.email}};await S("user:password:force:reset",e)}s(f0,"passwordForceReset");async function p0(t){let e={userId:t._id,audited:{email:t.email}};await S("user:password:updated",e)}s(p0,"passwordUpdated");async function m0(t){let e={userId:t._id,audited:{email:t.email}};await S("user:password:reset:requested",e)}s(m0,"passwordResetRequested");async function h0(t){let e={userId:t._id,audited:{email:t.email}};await S("user:password:reset",e)}s(h0,"passwordReset");async function g0(t){let e={users:t};await S("user:data:collaboration",e)}s(g0,"dataCollaboration");var We={created:n0,updated:i0,deleted:s0,permissionAdminAssigned:o0,permissionAdminRemoved:a0,permissionBuilderAssigned:u0,permissionBuilderRemoved:c0,invited:l0,inviteAccepted:d0,passwordForceReset:f0,passwordUpdated:p0,passwordResetRequested:m0,passwordReset:h0,dataCollaboration:g0};async function E0(t,e){let r={name:t.name,type:t.type,tableId:t.tableId};await S("view:created",r,e)}s(E0,"created");async function y0(t){let e={tableId:t.tableId};await S("view:updated",e)}s(y0,"updated");async function T0(t,e){let r={...Ue.views.isV2(t)?{id:t.id,tableId:t.tableId,appId:e}:{}};await S("view:deleted",r)}s(T0,"deleted");async function S0(t,e){let r={tableId:t._id,format:e};await S("view:exported",r)}s(S0,"exported");async function A0({tableId:t,filterGroups:e},r){let n={tableId:t,filterGroups:e};await S("view:filter:created",n,r)}s(A0,"filterCreated");async function _0({tableId:t,filterGroups:e}){let r={tableId:t,filterGroups:e};await S("view:filter:updated",r)}s(_0,"filterUpdated");async function O0(t){let e={tableId:t.tableId};await S("view:filter:deleted",e)}s(O0,"filterDeleted");async function I0({tableId:t,calculationType:e},r){let n={tableId:t,calculation:e};await S("view:calculation:created",n,r)}s(I0,"calculationCreated");async function w0(t){let e={tableId:t.tableId,calculation:t.calculation};await S("view:calculation:updated",e)}s(w0,"calculationUpdated");async function R0(t){let e={tableId:t.tableId,calculation:t.calculation};await S("view:calculation:deleted",e)}s(R0,"calculationDeleted");async function C0(t,e){let r={tableId:t};await S("view:join:created",r,e)}s(C0,"viewJoinCreated");var E_={created:E0,updated:y0,deleted:T0,exported:S0,filterCreated:A0,filterUpdated:_0,filterDeleted:O0,calculationCreated:I0,calculationUpdated:w0,calculationDeleted:R0,viewJoinCreated:C0};async function D0(t,e){let r={workspaceAppId:t._id,audited:{name:t.name},appId:e};S("workspace_app:created",r).catch(n=>{console.error("appCreated telemetry failed",{workspaceAppId:t._id,err:n})})}s(D0,"appCreated");async function b0(t,e){let r={workspaceAppId:t._id,audited:{name:t.name},appId:e};S("workspace_app:updated",r).catch(n=>{console.error("appUpdated telemetry failed",{workspaceAppId:t._id,err:n})})}s(b0,"appUpdated");async function x0(t,e){let r={workspaceAppId:t._id,audited:{name:t.name},appId:e};S("workspace_app:deleted",r).catch(n=>{console.error("appDeleted telemetry failed",{workspaceAppId:t._id,err:n})})}s(x0,"appDeleted");var y_={appCreated:D0,appUpdated:b0,appDeleted:x0};function v0(){}s(v0,"initAsyncEvents");var N0=s(async()=>{await rr.shutdown(),console.log("Events shutdown")},"shutdown");var um={};P(um,{creatorsInList:()=>Pr,getAccountHolderFromUsers:()=>uc,hasAdminPermissions:()=>Nr,hasAppBuilderPermissions:()=>O_,hasBuilderPermissions:()=>Be,isAdmin:()=>Lt,isAdminOrBuilder:()=>__,isAdminOrWorkspaceBuilder:()=>sc,isBuilder:()=>Ii,isCreatorAsync:()=>wo,isCreatorSync:()=>oc,isGlobalBuilder:()=>A_,validateUniqueUser:()=>ac});async function am(t){let e=[],r=await T_(t);e.push(...r.map(a=>a.email));let n=await S_(t);e.push(...n.map(a=>a._id));let i=await Si(t);e.push(...i.map(a=>a.email));let o=await Fp(t);return e.push(...o.map(a=>a.email)),[...new Set(e.map(a=>a.toLowerCase()))]}s(am,"searchExistingEmails");async function ic(t){return await Vs("platform_users_lowercase_2",{keys:[t.toLowerCase()],include_docs:!0})}s(ic,"getPlatformUsers");async function Io(t){return(await ic(t))[0]??null}s(Io,"getFirstPlatformUser");async function T_(t){let r={keys:t.map(i=>i.toLowerCase()),include_docs:!0},n={arrayResponse:!0};return await Ht("by_email2",r,void 0,n)}s(T_,"getExistingTenantUsers");async function S_(t){let r={keys:t.map(n=>n.toLowerCase()),include_docs:!0};return await Vs("platform_users_lowercase_2",r)}s(S_,"getExistingPlatformUsers");async function Si(t){let r={keys:t.map(n=>n.toLowerCase()),include_docs:!0};return await Vs("account_by_email",r)}s(Si,"getExistingAccounts");var Ii=ke.users.isBuilder,Lt=ke.users.isAdmin,A_=ke.users.isGlobalBuilder,__=ke.users.isAdminOrBuilder,Nr=ke.users.hasAdminPermissions,Be=ke.users.hasBuilderPermissions,O_=ke.users.hasAppBuilderPermissions,sc=ke.users.isAdminOrWorkspaceBuilder;async function Pr(t,e){let r=[...new Set(t.filter(i=>i.userGroups).flatMap(i=>i.userGroups))];return e=await z().getMultiple(r,{allowMissing:!0}),t.map(i=>oc(i,e))}s(Pr,"creatorsInList");async function wo(t){let e=[];return t.userGroups&&(e=await z().getMultiple(t.userGroups)),oc(t,e)}s(wo,"isCreatorAsync");function oc(t,e){let r=ke.users.isCreator(t);return!r&&t?P0(t,e):r}s(oc,"isCreatorSync");function P0(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(P0,"isCreatorByGroupMembership");async function ac(t,e){if(E.MULTI_TENANCY){let r=await Io(t);if(r!=null&&r.tenantId!==e)throw new er(t)}if(!E.SELF_HOSTED&&!E.DISABLE_ACCOUNT_PORTAL){let r=await vr(t);if(r&&r.verified&&r.tenantId!==e)throw new er(t)}}s(ac,"validateUniqueUser");async function uc(t){if(!E.SELF_HOSTED&&!E.DISABLE_ACCOUNT_PORTAL){let e=await Si(t.map(r=>r.email));return t.find(r=>e.map(n=>n.email).includes(r.email))}}s(uc,"getAccountHolderFromUsers");var cm=s(async t=>{await We.deleted(t),Be(t)&&await We.permissionBuilderRemoved(t),Nr(t)&&await We.permissionAdminRemoved(t)},"handleDeleteEvents"),L0=s(async(t,e,r)=>{for(let[n,i]of Object.entries(e))(!r||r[n]!==i)&&await Oo.assigned(t,i)},"assignAppRoleEvents"),U0=s(async(t,e,r)=>{if(r)for(let[n,i]of Object.entries(r))(!e||e[n]!==i)&&await Oo.unassigned(t,i)},"unassignAppRoleEvents"),k0=s(async(t,e)=>{let r=t.roles,n=e?.roles;await L0(t,r,n),await U0(t,r,n)},"handleAppRoleEvents"),lm=s(async(t,e,r)=>{let n=r;!n&&!E.SELF_HOSTED&&!E.DISABLE_ACCOUNT_PORTAL&&(n=await hi(q())),await At.identifyUser(t,n),e?(await We.updated(t),F0(t,e)&&await We.permissionBuilderRemoved(t),W0(t,e)&&await We.permissionAdminRemoved(t),!e.forceResetPassword&&t.forceResetPassword&&t.password&&await We.passwordForceReset(t),t.password!==e.password&&await We.passwordUpdated(t)):await We.created(t),M0(t,e)&&await We.permissionBuilderAssigned(t),B0(t,e)&&await We.permissionAdminAssigned(t),await k0(t,e)},"handleSaveEvents"),M0=s((t,e)=>I_(t,e,Be),"isAddingBuilder"),F0=s((t,e)=>w_(t,e,Be),"isRemovingBuilder"),B0=s((t,e)=>I_(t,e,Nr),"isAddingAdmin"),W0=s((t,e)=>w_(t,e,Nr),"isRemovingAdmin"),I_=s((t,e,r)=>!(!r(t)||e&&r(e)),"isAddingPermission"),w_=s((t,e,r)=>!(r(t)||!e||!r(e)),"isRemovingPermission");var $0=s(async t=>{let e=t._id;await Tt.removeUser(t),await cm(t),await nr.invalidateUser(e),await An(e,{reason:"bulk-deletion"})},"bulkDeleteProcessing"),Ut=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&&Lt(e)?!1:await t.features.isSSOEnforced()||jo(e)?!0:(r||(r=await hi(q())),!!(r&&r.email===e.email&&Qo(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 Fe("Password change is disabled for this user",400);if(!r.skipPasswordValidation){let f=Qp(a);if(!f.valid)throw new Fe(f.error,400)}c=r.hashPassword?await lf(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||ni();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 z().allDocs(ln(null,{include_docs:!0}))).rows.map(n=>n.doc)}static async countUsersByWorkspace(e){if(typeof e!="string"||!e)throw new Error("Must provide a string based workspace ID");return{userCount:(await qs("by_app",ii(e,{include_docs:!1}))).rows.length}}static async getUsersByAppAccess(e){return await dm(e.appId,{limit:e.limit||50})}static async getUserByEmail(e){return _t(e)}static async getUser(e){let r=await On(e);return r&&delete r.password,r}static async bulkGet(e){return await cc(e)}static async bulkUpdate(e){let r=await Ro(e);return await nr.invalidateUsers(e.map(n=>n._id)),r}static async save(e,r={}){r.hashPassword==null&&(r.hashPassword=!0),r.requirePassword==null&&(r.requirePassword=!0);let n=q(),i=z(),{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 On(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 _t(o),l&&l._id!==a))throw new er(o);let d=!l,f=!!l&&!!o&&l.email!==o,g=!r.isAccountHolder&&!!o&&(d||f),m=[...u];if(d&&m.length===0){let p=await t.groups.getDefaultGroup?.();p?._id&&(m=[p._id])}let y=1,h=0;if((r.isAccountHolder||l)&&(y=0,h=1),l){let[p,T]=await Pr([l,e]);h=p!==T?1:0}else if(!r.isAccountHolder){let p=m.length>0?{...e,userGroups:m}:e;h=(await Pr([p]))[0]?1:0}return t.quotas.addUsers(y,h,async()=>{g&&await ac(o,n);let p=await t.buildUser(e,r,n,l);r.currentUserId&&r.currentUserId===l?._id&&(p=fm(p,l)),!l&&c?.length&&(p.roles={...c});let T=[];if(d){m.length>0&&(p.userGroups=m);for(let A of m)T.push(t.groups.addUsers(A,[p._id]))}try{let A=await i.put(p);return p._rev=A.rev,await lm(p,l),l&&p.email!==l.email&&await Tt.removeUser({email:l.email}),await Tt.addUser(n,p._id,p.email,p.ssoId),await nr.invalidateUser(A.id),await Promise.all(T),i.get(p._id)}catch(A){throw A.status===409?"User exists already":A}})}static async bulkCreate(e,r){let n=q(),i=[],o=[],a=[],u=e.map(y=>y.email),c=await am(u),l=[],d=!!r?.length,f=d?[...r]:[];if(!d){let y=await t.groups.getDefaultGroup?.();y?._id&&(f=[y._id])}for(let y of e){let h=o.find(T=>T.email.toLowerCase()===y.email.toLowerCase()),p=c.includes(y.email.toLowerCase());if(h||p){l.push({email:y.email,reason:"Unavailable"});continue}y.userGroups=[...f],o.push(y),await wo(y)&&a.push(y)}let g=await hi(n),m=await t.features.isSSOEnforced();return t.quotas.addUsers(o.length,a.length,async()=>{for(let p of o)m&&delete p.password,i.push(t.buildUser(p,{hashPassword:!0,requirePassword:!m},n,void 0,g));let y=await Promise.all(i);await Ro(y);for(let p of y)await Tt.addUser(n,p._id,p.email),await lm(p,void 0,g);let h=y.map(p=>({_id:p._id,email:p.email}));if(Array.isArray(h)&&f.length){let p=[],T=h.map(A=>A._id);for(let A of f)p.push(t.groups.addUsers(A,T));await Promise.all(p)}return{successful:h,unsuccessful:l}})}static async bulkDelete(e){let r=z(),n={successful:[],unsuccessful:[]},i=await uc(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 Ro(u),d=(await Pr(a)).filter(m=>m).length,f=[];for(let m of a){let h=(await Io(m._id)).ssoId;h&&(await ic(h)).filter(T=>T.ssoId==null).forEach(T=>{f.push({...T,_deleted:!0})}),await $0(m)}await xr().bulkDocs(f),await t.quotas.removeUsers(u.length,d);let g={};return a.reduce((m,y)=>(m[y._id]=y,m),g),c.forEach(m=>{let y=g[m.id].email;m.ok?n.successful.push({_id:m.id,email:y}):n.unsuccessful.push({_id:m.id,email:y,reason:"Database error"})}),n}static async destroy(e){let r=z(),n=await r.get(e),i=n._id;if(!E.SELF_HOSTED&&!E.DISABLE_ACCOUNT_PORTAL){let a=n.email;if(await vr(a))throw n.userId===Qt()._id?new Fe('Please visit "Account" to delete this user',400):new Fe("Account holder cannot be deleted",400)}await Tt.removeUser(n),await r.remove(i,n._rev);let o=await wo(n)?1:0;await t.quotas.removeUsers(1,o),await cm(n),await nr.invalidateUser(i),await An(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 pi(Oe.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 Do(t){return Array.isArray(t)?t.map(e=>{if(e)return delete e.password,e}):t&&(delete t.password,t)}s(Do,"removeUserPassword");async function cc(t,e){let n=(await z().allDocs({keys:t,include_docs:!0})).rows.map(i=>i.doc);return e?.cleanup&&(n=Do(n)),n}s(cc,"bulkGetGlobalUsersById");async function q0(){let t=z(),e=`us${"_"}`;return(await t.allDocs({startkey:e,endkey:`${e}${"\uFFF0"}`})).rows.map(n=>n.id)}s(q0,"getAllUserIds");async function K0(){let t=z(),e=`us${"_"}`;return(await t.allDocs({startkey:e,endkey:`${e}${"\uFFF0"}`,include_docs:!0})).rows.map(n=>n.doc)}s(K0,"getAllUsers");async function Ro(t){return await z().bulkDocs(t)}s(Ro,"bulkUpdateGlobalUsers");async function On(t,e){let n=await z().get(t);return e?.cleanup&&(n=Do(n)),n}s(On,"getById");async function _t(t,e){if(t==null)throw"Must supply an email address to view";let r=await Ht("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=Do(n)),n}s(_t,"getGlobalUserByEmail");async function Q0(t){try{let e=await _t(t);if(Array.isArray(e)||e!=null)return!0}catch{return!1}return!1}s(Q0,"doesUserExist");async function R_(t,e,r){if(typeof t!="string")throw new Error("Must provide a string based workspace ID");let n=ii(t,{include_docs:!0});n.startkey=e&&e.startkey?e.startkey:n.startkey;let i=await Ht("by_app",n);i||(i=[]);let o=Array.isArray(i)?i:[i];return r?.cleanup&&(o=Do(o)),o}s(R_,"searchGlobalUsersByApp");async function dm(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 z().find({selector:{$or:n,_id:{$regex:"^us_"}},limit:e?.limit||50})).docs}s(dm,"searchGlobalUsersByAppAccess");function C_(t,e){if(e)return gu(He(t),e._id)}s(C_,"getGlobalUserByAppPage");async function D_(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 Ht("by_email2",{...e,startkey:i,endkey:`${n}${"\uFFF0"}`});o||(o=[]);let a=Array.isArray(o)?o:[o];return r?.cleanup&&(a=Do(a)),a}s(D_,"searchGlobalUsersByEmail");var j0=8;async function b_({bookmark:t,query:e,appId:r,limit:n}={}){let i=z(),o=n??j0,u={include_docs:!0,limit:o+1};t&&(u.startkey=t);let c,l="_id",d;return e?.equal?._id?c=[await On(e.equal._id)]:r?(c=await R_(r,u),d=s(f=>C_(r,f),"getKey")):e?.string?.email?(c=await D_(e?.string?.email,u),l="email"):e?.oneOf?._id?c=await cc(e?.oneOf?._id,{cleanup:!0}):e?(c=(await i.allDocs(ln(null,{...u,limit:void 0}))).rows.map(g=>g.doc),c=Er.search(c,{query:e,limit:u.limit}).rows):c=(await i.allDocs(ln(null,u))).rows.map(g=>g.doc),Hf(c,o,{paginate:!0,property:l,getKey:d})}s(b_,"paginatedUsers");async function H0(){return(await qs("by_email2",{limit:0,include_docs:!1})).total_rows}s(H0,"getUserCount");async function Y0(){let t=0;async function e(r){let n=await b_({bookmark:r}),i=await Pr(n.data);t+=i.filter(o=>o).length,n.hasNextPage&&await e(n.nextPage)}return s(e,"iterate"),await e(),t}s(Y0,"getCreatorCount");function z0(t){return delete t.admin,delete t.builder,t}s(z0,"removePortalUserPermissions");function fm(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(fm,"cleanseUserObject");async function J0(t,e){let r=He(e);t.builder??={},t.builder.creator=!0,t.builder.apps??=[],t.builder.apps.push(r),await Ut.save(t,{hashPassword:!1})}s(J0,"addAppBuilder");async function X0(t,e){let r=He(e);t.builder&&t.builder.apps?.includes(r)&&(t.builder.apps=t.builder.apps.filter(n=>n!==r)),await Ut.save(t,{hashPassword:!1})}s(X0,"removeAppBuilder");var x_=3600;async function Z0(t,e){let n=await Zf(e).get(t);if(n.budibaseAccess=!0,!E.SELF_HOSTED&&!E.DISABLE_ACCOUNT_PORTAL){let i=await vr(n.email);i&&(n.account=i,n.accountPortalAccess=!0)}return n}s(Z0,"populateFromDB");async function ek(t){let e=await Ut.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 vr(i.email);o&&(i.account=o,i.accountPortalAccess=!0)}})),r.length?{users:n,notFoundIds:r}:{users:n}}s(ek,"populateUsersFromDB");async function bo({userId:t,tenantId:e,email:r,populateUser:n}){if(n||(n=Z0),!e)try{e=q()}catch{e=await Tt.lookupTenantId(t)}let i=await ri(),o=await i.get(t);return o||(o=await n(t,e,r),await i.store(t,o,x_)),o&&!o.tenantId&&e&&(o.tenantId=e),o.userGroups&&!ke.users.isGlobalBuilder(o)&&await De(e,async()=>{let a=await Ut.getGroupBuilderAppIds(o);if(a.length){let u=o.builder?.apps||[];o.builder={apps:[...new Set(u.concat(a))]}}}),o}s(bo,"getUser");async function tk(t){let e=await ri(),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 ek(n);o=a.notFoundIds;for(let u of a.users)await e.store(u._id,u,x_);i.push(...a.users)}return{users:i,notFoundIds:o}}s(tk,"getUsers");async function xo(t){await(await ri()).delete(t)}s(xo,"invalidateUser");async function rk(t){if(t.length===0)return;await(await ri()).bulkDelete(t)}s(rk,"invalidateUsers");var gm={};P(gm,{Writethrough:()=>mm});var v_=1e4,pm=null;async function lc(){if(!pm){let t=await Wf();pm=new hn(t)}return pm}s(lc,"getCache");function vo(t,e){return t.name+e}s(vo,"makeCacheKey");function hm(t,e=null){return{doc:t,lastWrite:e||Date.now()}}s(hm,"makeCacheItem");async function nk(t,e,r=v_){let n=await lc(),i=e._id,o;i&&(o=await n.get(vo(t,i)));let a=!o||o.lastWrite<Date.now()-r,u=e;return a&&((await uo({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;di("Ignoring conflict in write-through cache")}})).executed||di("Ignoring redlock conflict in write-through cache")),o=hm(u,a?null:o?.lastWrite),u._id&&await n.store(vo(t,u._id),o),{ok:!0,id:u._id,rev:u._rev}}s(nk,"put");async function ik(t,e){let r=await lc(),n=vo(t,e),i=await r.get(n);if(!i){let o=await t.get(e);i=hm(o),await r.store(n,i)}return i.doc}s(ik,"get");async function sk(t,e){let r=await lc(),n=vo(t,e),i=await r.get(n);if(!i){let o=await t.tryGet(e);if(!o)return null;i=hm(o),await r.store(n,i)}return i.doc}s(sk,"tryGet");async function ok(t,e,r){let n=await lc();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(vo(t,i))}finally{await t.remove(i,r)}}s(ok,"remove");var mm=class{static{s(this,"Writethrough")}constructor(e,r=v_){this.db=e,this.writeRateMs=r}async put(e,r=this.writeRateMs){return nk(this.db,e,r)}async get(e){return ik(this.db,e)}async tryGet(e){return sk(this.db,e)}async remove(e,r){return ok(this.db,e,r)}};function No(t){return`config${"_"}${t}`}s(No,"generateConfigID");var dc="en";function ak(){return{_id:No("translations"),type:"translations",config:{defaultLocale:dc,locales:{[dc]:{label:"English",overrides:{}}}}}}s(ak,"createDefaultTranslationsConfig");function uk(t){let e=t?.defaultLocale||dc,r={...t?.locales??{}};r[e]||(r[e]={label:e===dc?"English":e,overrides:{}});for(let n of Object.keys(r))r[n].overrides||(r[n]={...r[n],overrides:{}});return{defaultLocale:e,locales:r}}s(uk,"prepareTranslationsConfig");async function Ge(t){let e=z();try{return await e.get(No(t))}catch(r){if(r.status===404)return;throw r}}s(Ge,"getConfig");async function ck(t){return t._id||(t._id=No(t.type)),z().put(t)}s(ck,"save");async function N_(){let t=await Ge("translations");return t?(t.config=uk(t.config),t):ak()}s(N_,"getTranslationsConfigDoc");async function lk(){return(await N_()).config}s(lk,"getTranslationsConfig");async function _i(){let t=await Ge("settings");return t||(t={_id:No("settings"),type:"settings",config:{}}),t.config.platformUrl=await Po({tenantAware:!0,config:t.config}),t.config.analyticsEnabled=await Xu({config:t.config}),t}s(_i,"getSettingsConfigDoc");async function ym(){return(await _i()).config}s(ym,"getSettingsConfig");async function Po(t={tenantAware:!0}){let e=E.PLATFORM_URL||"http://localhost:10000";if(!E.SELF_HOSTED&&E.MULTI_TENANCY&&t.tenantAware){let r=q();e.includes("localhost:")||(e=e.replace("://",`://${r}.`))}else if(E.SELF_HOSTED){let r=t?.config?t.config:(await Ge("settings"))?.config;r?.platformUrl&&(e=r.platformUrl)}return e}s(Po,"getPlatformUrl");var Xu=s(async t=>{if(!E.SELF_HOSTED)return!!E.ENABLE_ANALYTICS;let e=await br(Oe.ANALYTICS_ENABLED,86400,async()=>{let n=t?.config?t.config:(await Ge("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 dk(){return await Ge("google")}s(dk,"getGoogleConfigDoc");async function pc(){return(await dk())?.config}s(pc,"getGoogleConfig");async function Tm(){if(!E.SELF_HOSTED)return Em();let t=await pc();return(!t||!t.activated)&&(t=Em()),t}s(Tm,"getGoogleDatasourceConfig");function Em(){if(E.GOOGLE_CLIENT_ID&&E.GOOGLE_CLIENT_SECRET)return{clientID:E.GOOGLE_CLIENT_ID,clientSecret:E.GOOGLE_CLIENT_SECRET,activated:!0}}s(Em,"getDefaultGoogleConfig");async function fk(){return Ge("logos_oidc")}s(fk,"getOIDCLogosDoc");async function pk(){return Ge("oidc")}s(pk,"getOIDCConfigDoc");async function mk(){let t=(await pk())?.config;return t?.configs&&t.configs[0]}s(mk,"getOIDCConfig");async function Sm(t){let e=(await Ge("oidc"))?.config;return e&&e.configs.filter(r=>r.uuid===t)[0]}s(Sm,"getOIDCConfigById");async function P_(){return Ge("smtp")}s(P_,"getSMTPConfigDoc");async function hk(t){let e=await P_();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(hk,"getSMTPConfig");async function gk(){return(await Ge("scim"))?.config}s(gk,"getSCIMConfig");async function Ek(){return Ge("recaptcha")}s(Ek,"getRecaptchaConfig");var xm={};P(xm,{AccessController:()=>Om,BUILTIN_ROLE_IDS:()=>Im,Role:()=>Lr,RoleHierarchyTraversal:()=>mc,RoleIDVersion:()=>wm,builtinRoleToNumber:()=>Lo,checkForRoleResourceArray:()=>M_,externalRole:()=>Ok,findRole:()=>Uo,getAllRoleIds:()=>Ck,getAllRoles:()=>bm,getBuiltinRole:()=>U_,getBuiltinRoles:()=>Cm,getDBRoleID:()=>F_,getExternalRoleID:()=>Ur,getExternalRoleIDs:()=>B_,getRole:()=>Ik,getUserRoleHierarchy:()=>Dm,getUserRoleIdHierarchy:()=>k_,isBuiltin:()=>kr,lowerBuiltinRoleID:()=>_k,prefixRoleIDNoBuiltin:()=>_m,roleIDsAreEqual:()=>ze,roleToNumber:()=>Ak,saveRoles:()=>wk,validInherits:()=>Sk});var L_=require("lodash"),hc=W(require("lodash/fp/cloneDeep")),Am=W(require("semver"));var Im={ADMIN:"ADMIN",POWER:"POWER",BASIC:"BASIC",PUBLIC:"PUBLIC"},ne={...Im,BUILDER:"BUILDER"},wm={UUID:void 0,NAME:"name"};function Tk(t,e){return Array.isArray(e)?e.filter(r=>t.includes(r)).length===e.length:t.includes(e)}s(Tk,"rolesInList");var Lr=class{constructor(e,r,n,i){this.permissions={};this._id=e,this.name=r,this.uiMetadata=i,this.permissionId=n,this.version=wm.NAME}static{s(this,"Role")}addInheritance(e){return e&&typeof e=="string"?e=_m(e):e&&Array.isArray(e)&&(e=e.map(_m)),this.inherits=e,this}},mc=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=Uo(o,n,r);a&&(i=i.concat(this.walk(a)))}else{let o=[],a=e;for(;a&&a.inherits&&!Tk(o,a.inherits);){if(Array.isArray(a.inherits))return i.concat(this.walk(a));if(o.push(a.inherits),a=Uo(a.inherits,n,r),a&&i.push(a),Ue.roles.checkForRoleInheritanceLoops(i))break}}return(0,L_.uniqBy)(i,o=>o._id)}},Rm={ADMIN:new Lr(ne.ADMIN,ne.ADMIN,"admin",{displayName:"Admin user",description:"Can do everything",color:"var(--spectrum-global-color-static-red-400)"}).addInheritance(ne.POWER),POWER:new Lr(ne.POWER,ne.POWER,"power",{displayName:"App power user",description:"An app user with more access",color:"var(--spectrum-global-color-static-orange-400)"}).addInheritance(ne.BASIC),BASIC:new Lr(ne.BASIC,ne.BASIC,"write",{displayName:"Basic user",description:"Any logged in user",color:"var(--spectrum-global-color-static-green-400)"}).addInheritance(ne.PUBLIC),PUBLIC:new Lr(ne.PUBLIC,ne.PUBLIC,"public",{displayName:"Public user",description:"Accessible to anyone",color:"var(--spectrum-global-color-static-blue-400)"}),BUILDER:new Lr(ne.BUILDER,ne.BUILDER,"admin",{displayName:"Builder user",description:"Users that can edit this app",color:"var(--spectrum-global-color-static-magenta-600)"})};function Cm(){return(0,hc.default)(Rm)}s(Cm,"getBuiltinRoles");function kr(t){return Object.values(Im).includes(t)}s(kr,"isBuiltin");function _m(t){return kr(t)?t:jt(t)}s(_m,"prefixRoleIDNoBuiltin");function U_(t){let e=Object.values(Rm).find(r=>t.includes(r._id));if(e)return(0,hc.default)(e)}s(U_,"getBuiltinRole");function Sk(t,e){if(!e)return!1;let r=s(n=>t.find(i=>ze(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(Sk,"validInherits");function Lo(t){let e=Cm(),r=Object.values(e).length+1;if(ze(t,ne.ADMIN)||ze(t,ne.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(Lo,"builtinRoleToNumber");async function Ak(t){if(kr(t))return Lo(t);let e=await Dm(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=>ze(u._id,o));if(a)return r(a)+1}).filter(o=>o).sort().pop();if(i!=null)return i}else if(kr(n.inherits))return Lo(n.inherits)+1;return 0},"findNumber");return Math.max(...e.map(r))}s(Ak,"roleToNumber");function _k(t,e){return t?e&&Lo(t)>Lo(e)?e:t:e}s(_k,"lowerBuiltinRoleID");function ze(t,e){return jt(t)===jt(e)}s(ze,"roleIDsAreEqual");function Ok(t){let e;return t._id&&(e=Ur(t._id)),{...t,_id:e,inherits:B_(t.inherits,t.version)}}s(Ok,"externalRole");function Uo(t,e,r){let n=U_(t);n||(t=jt(t));let i=e.find(o=>o._id&&ze(o._id,t));return!i&&!kr(t)&&r?.defaultPublic?(0,hc.default)(Rm.PUBLIC):(n=Object.assign(n||{},i),n?._id&&(n._id=Ur(n._id,n.version)),Object.keys(n).length===0?void 0:n)}s(Uo,"findRole");async function Ik(t,e){let r=ei(),n=[];if(!kr(t)){let i=await r.tryGet(F_(t));i&&n.push(i)}return Uo(t,n,e)}s(Ik,"getRole");async function wk(t){await ei().bulkDocs(t.filter(r=>r._id).map(r=>({...r,_id:jt(r._id)})))}s(wk,"saveRoles");async function Rk(t,e){let r=await bm();if(ze(t,ne.ADMIN))return r;let n=Uo(t,r,e),i=[];return n&&(i=new mc(r,e).walk(n)),i}s(Rk,"getAllUserRoles");async function k_(t){return(await Dm(t)).map(r=>r._id)}s(k_,"getUserRoleIdHierarchy");async function Dm(t,e){return Rk(t,e)}s(Dm,"getUserRoleHierarchy");function M_(t,e){if(t&&!Array.isArray(t[e])){let r=t[e];t[e]=[r],r==="write"&&t[e].push("read")}return t}s(M_,"checkForRoleResourceArray");async function Ck(t){return(await bm(t)).map(r=>r._id)}s(Ck,"getAllRoleIds");async function bm(t){if(t)return je(t,e);{let r;try{r=ei()}catch{}return e(r)}async function e(r){let n=[];r&&(n=(await r.allDocs(Eu(null,{include_docs:!0}))).rows.map(u=>u.doc),n.forEach(u=>u._id=Ur(u._id,u.version)));let i=Cm(),o=[];!r||await Dk(r)?o=[ne.ADMIN,ne.POWER,ne.BASIC,ne.PUBLIC]:o=[ne.ADMIN,ne.BASIC,ne.PUBLIC];for(let a of o){let u=i[a],c=n.filter(l=>ze(l._id,a))[0];c==null?n.push(u||i.BASIC):(n=n.filter(l=>l._id!==c._id),c._id=Ur(u._id,c.version),n.push({...u,...c,name:u.name,_id:Ur(u._id,u.version),uiMetadata:{...c.uiMetadata,...u.uiMetadata}}))}for(let a of n)if(a.permissions)for(let u of Object.keys(a.permissions))a.permissions=M_(a.permissions,u);return n}s(e,"internal")}s(bm,"getAllRoles");async function Dk(t){if(await bk(t))return!0;let r=(await t.tryGet("app_metadata"))?.creationVersion;return!r||!Am.default.valid(r)?!0:!Am.default.gte(r,E.MIN_VERSION_WITHOUT_POWER_ROLE)}s(Dk,"shouldIncludePowerRole");async function bk(t){let r=(await t.tryGet("ta_users"))?.schema?.roleId?.constraints?.inclusion;return!Array.isArray(r)||!r.some(i=>ze(i,ne.POWER))?!1:r.some(i=>!kr(i))}s(bk,"hasLegacyPowerRole");var Om=class{static{s(this,"AccessController")}constructor(){this.userHierarchies={}}async hasAccess(e,r){if(e==null||e===""||ze(e,ne.BUILDER)||ze(r,e)||ze(r,ne.BUILDER))return!0;let n=r?this.userHierarchies[r]:null;return!n&&r&&(n=await k_(r),this.userHierarchies[r]=n),n?.find(i=>ze(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 F_(t){return t?.startsWith("role")?t:jt(t)}s(F_,"getDBRoleID");function Ur(t,e){if(t.startsWith(`role${"_"}`)&&(kr(t)||e===wm.NAME)){let r=t.split("_");return r.shift(),r.join("_")}return t}s(Ur,"getExternalRoleID");function B_(t,e){return t&&(typeof t=="string"?Ur(t,e):t.map(r=>Ur(r,e)))}s(B_,"getExternalRoleIDs");var vm={};P(vm,{BUILDER:()=>Lk,BUILTIN_PERMISSIONS:()=>gc,CREATOR:()=>Uk,GLOBAL_BUILDER:()=>kk,PermissionImpl:()=>oe,PermissionLevel:()=>Ni,PermissionType:()=>qo,doesHaveBasePermission:()=>Nk,getAllowedLevels:()=>V_,getBuiltinPermissionByID:()=>vk,getBuiltinPermissions:()=>xk,isPermissionLevelHigherThanRead:()=>Pk,levelToNumber:()=>$_});var W_=W(require("lodash/flatten")),G_=W(require("lodash/fp/cloneDeep"));var oe=class{static{s(this,"PermissionImpl")}constructor(e,r){this.type=e,this.level=r}};function $_(t){switch(t){case"execute":return 0;case"read":return 1;case"write":return 2;case"admin":return 3;default:return-1}}s($_,"levelToNumber");function V_(t){switch(t){case"execute":return["execute"];case"read":return["execute","read"];case"write":case"admin":return["execute","read","write"];default:return[]}}s(V_,"getAllowedLevels");var gc={PUBLIC:{_id:"public",name:"Public",permissions:[new oe("webhook","execute")]},READ_ONLY:{_id:"read_only",name:"Read only",permissions:[new oe("query","read"),new oe("table","read"),new oe("app","read")]},WRITE:{_id:"write",name:"Read/Write",permissions:[new oe("query","write"),new oe("table","write"),new oe("automation","execute"),new oe("legacy_view","read"),new oe("app","read")]},POWER:{_id:"power",name:"Power",permissions:[new oe("table","write"),new oe("user","read"),new oe("automation","execute"),new oe("webhook","read"),new oe("legacy_view","read"),new oe("app","read")]},ADMIN:{_id:"admin",name:"Admin",permissions:[new oe("table","admin"),new oe("user","admin"),new oe("automation","admin"),new oe("webhook","read"),new oe("query","admin"),new oe("legacy_view","read"),new oe("app","read")]}};function xk(){return(0,G_.default)(gc)}s(xk,"getBuiltinPermissions");function vk(t){return Object.values(gc).find(r=>r._id===t)}s(vk,"getBuiltinPermissionByID");function Nk(t,e,r){let n=[...new Set(r.map(a=>a.permissionId))],i=Object.values(gc),o=(0,W_.default)(i.filter(a=>n.indexOf(a._id)!==-1).map(a=>a.permissions));for(let a of o)if(a.type===t&&V_(a.level).indexOf(e)!==-1)return!0;return!1}s(Nk,"doesHaveBasePermission");function Pk(t){return $_(t)>1}s(Pk,"isPermissionLevelHigherThanRead");var Lk="builder",Uk="creator",kk="globalBuilder";var Lm={};P(Lm,{FlagSet:()=>yc,all:()=>$k,flags:()=>Nm,getEnvFlags:()=>j_,init:()=>Fk,isEnabled:()=>Gk,parseEnvFlags:()=>Sc,shutdown:()=>Bk,testutils:()=>Pm});var Tc=W(require("crypto")),q_=W(require("dd-trace")),K_=require("lodash"),Q_=require("posthog-node");var Ec,Mk=s(()=>{let t=E.POSTHOG_FEATURE_FLAGS_POLLING_INTERVAL_MS;if(t){let e=parseInt(t,10);if(!Number.isNaN(e)&&e>0)return e}return me.fromDays(1).toMs()},"getFeatureFlagsPollingInterval");function Fk(t){E.POSTHOG_TOKEN&&E.POSTHOG_API_HOST&&!E.SELF_HOSTED&&E.POSTHOG_FEATURE_FLAGS_ENABLED?(console.log("initializing posthog client..."),Ec=new Q_.PostHog(E.POSTHOG_TOKEN,{host:E.POSTHOG_API_HOST,personalApiKey:E.POSTHOG_PERSONAL_TOKEN,featureFlagsPollingInterval:Mk(),...t})):console.log("posthog disabled")}s(Fk,"init");function Bk(){Ec?.shutdown()}s(Bk,"shutdown");function Sc(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(Sc,"parseEnvFlags");function j_(){return Sc(E.TENANT_FEATURE_FLAGS||"")}s(j_,"getEnvFlags");var yc=class{constructor(e){this.flagSchema=e;this.setId=Tc.randomUUID()}static{s(this,"FlagSet")}defaults(){return(0,K_.cloneDeep)(this.flagSchema)}isFlagName(e){return this.flagSchema[e]!==void 0}async isEnabled(e){return(await this.fetch())[e]}async fetch(){return await q_.default.trace("features.fetch",async e=>{let r=Lf(this.setId);if(r)return e?.addTags({fromCache:!0}),r;let n={},i=this.defaults(),o=q(),a=new Set;if(ru())return i;for(let{tenantId:f,key:g,value:m}of j_())if(!(!f||f!=="*"&&f!==o)&&(n.readFromEnvironmentVars=!0,m===!1&&a.add(g),!!this.isFlagName(g))){if(typeof i[g]!="boolean")throw new Error(`Feature: ${g} is not a boolean`);i[g]=m,n[`flags.${g}.source`]="environment"}let u=Qt(),c=u?._id;if(!c){let f=Nf();f&&(c=Tc.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,Ec&&c){n.readFromPostHog=!0;let f=await _i(),g={tenantId:l},m={tenant:{id:l}};f.config.createdVersion&&(m.tenant.createdVersion=f.config.createdVersion),f.createdAt&&(m.tenant.createdAt=`${f.createdAt}`);let y=await Ec.getAllFlags(c,{personProperties:g,onlyEvaluateLocally:!0,groups:{tenant:l},groupProperties:m});for(let[h,p]of Object.entries(y))if(this.isFlagName(h)){if(typeof p!="boolean"){console.warn(`Invalid value for posthog flag "${h}": ${p}`);continue}if(!(i[h]===!0||a.has(h)))try{i[h]=p,n[`flags.${h}.source`]="posthog"}catch(T){console.warn(`Error parsing posthog flag "${h}": ${p}`,T)}}}let d=kf();for(let[f,g]of Object.entries(d))this.isFlagName(f)&&typeof g=="boolean"&&(i[f]=g,n[`flags.${f}.source`]="override");Uf(this.setId,i);for(let[f,g]of Object.entries(i))n[`flags.${f}.value`]=g;return e?.addTags(n),i})}},Wk={USE_ZOD_VALIDATOR:!1,AI_TESTS:!1,ESCALATION:!1,FRONT_COMPANION:!1,PROJECTS:!1,DEBUG_UI:E.isDev(),DEV_USE_CLIENT_FROM_STORAGE:!1,AI_AGENT_ACTIVITY:!1},Nm=new yc(Wk);async function Gk(t){return await Nm.isEnabled(t)}s(Gk,"isEnabled");async function $k(){return await Nm.fetch()}s($k,"all");var Pm={};P(Pm,{setFeatureFlags:()=>H_,withFeatureFlags:()=>Kk});function Vk(){let t={};for(let{tenantId:e,key:r,value:n}of Sc(process.env.TENANT_FEATURE_FLAGS||"")){let i=t[e]||{};i[r]!==!1&&(i[r]=n,t[e]=i)}return t}s(Vk,"getCurrentFlags");function qk(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(qk,"buildFlagString");function H_(t,e){let r=Vk();for(let[i,o]of Object.entries(e)){let a=r[t]||{};a[i]=o,r[t]=a}let n=qk(r);return bs({TENANT_FEATURE_FLAGS:n})}s(H_,"setFeatureFlags");function Kk(t,e,r){let n=H_(t,e),i=r();return i instanceof Promise?i.finally(n):(n(),i)}s(Kk,"withFeatureFlags");var jm={};P(jm,{adminOnly:()=>Ac,auditLog:()=>_c,authError:()=>Ie,buildAuthMiddleware:()=>NM,buildCsrfMiddleware:()=>LM,buildTenancyMiddleware:()=>PM,builderOnly:()=>vc,builderOrAdmin:()=>Nc,google:()=>or,internalApi:()=>Lc,joiValidator:()=>ko,oidc:()=>ar,passport:()=>UM,platformLogout:()=>WM,refreshOAuthToken:()=>FM,ssoCallbackUrl:()=>Fr,updateUserOAuth:()=>BM,workspaceBuilderOrAdmin:()=>Mc});var Qm={};P(Qm,{activeTenant:()=>TO,adminOnly:()=>Ac,auditLog:()=>_c,authError:()=>Ie,authenticated:()=>xc,builderOnly:()=>vc,builderOrAdmin:()=>Nc,correlation:()=>z_,csp:()=>oO,csrf:()=>Pc,datasource:()=>xM,errorHandling:()=>uO,featureFlagCookie:()=>cO,google:()=>or,internalApi:()=>Lc,ip:()=>lO,joiValidator:()=>ko,local:()=>Ri,oidc:()=>ar,pino:()=>J_,querystringToBody:()=>yO,ssoCallbackUrl:()=>Fr,tenancy:()=>kc,workspaceBuilderOrAdmin:()=>Mc});var Y_=require("uuid");var Qk=require("correlation-id"),z_=s((t,e)=>{let r=t.headers["x-budibase-correlation-id"];return r||(r=(0,Y_.v4)()),Qk.withId(r,()=>e())},"correlationMiddleware");var jk=require("koa-pino-logger"),Hk=require("correlation-id");function Yk(){return{logger:ku,genReqId:Hk.getId,autoLogging:{ignore:s(t=>!!t.url?.includes("/health"),"ignore")},serializers:{req:s(t=>({method:t.method,url:t.url,correlationId:t.id}),"req"),res:s(t=>({status:t.statusCode}),"res")}}}s(Yk,"pinoSettings");function zk(){return E.HTTP_LOGGING?jk(Yk()):(t,e)=>e()}s(zk,"getMiddleware");var J_=zk();var Ac=s(async(t,e)=>(!t.internal&&!Lt(t.user)&&t.throw(403,"Admin user only endpoint."),e()),"adminOnly");var _c=s((async(t,e)=>e()),"auditLog");var rO=require("jsonwebtoken");var Jk=/\/:(.*?)(\/.*)?$/g,ir=s(t=>t?t.map(e=>{let r=e.route,n=e.method,i=r.match(Jk);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"),sr=s((t,e)=>e.find(({regex:r,method:n})=>{let i=r.test(t.path),o=n==="ALL"?!0:t.request.method.toLowerCase()===n.toLowerCase();return i&&o}),"matches");var Bm={};P(Bm,{SecretOption:()=>eO,compare:()=>tM,decrypt:()=>Rc,decryptFile:()=>iM,encrypt:()=>eM,encryptFile:()=>rM,getSecret:()=>Fm});var kt=W(require("crypto")),Mr=W(require("fs")),Um=require("path"),km=W(require("zlib"));var Oc="aes-256-ctr",Z_="-",Xk=1e4,Zk=32,Ic=16,Mm=16,eO=(r=>(r.API="api",r.ENCRYPTION="encryption",r))(eO||{});function Fm(t){let e,r;if(t==="encryption"?(e=E.ENCRYPTION_KEY,r="ENCRYPTION_KEY"):(e=E.API_ENCRYPTION_KEY,r="API_ENCRYPTION_KEY"),!e)throw new Error(`Secret "${r}" has not been set in environment.`);return e}s(Fm,"getSecret");function wc(t,e){return kt.default.pbkdf2Sync(t,new Uint8Array(e),Xk,Zk,"sha512")}s(wc,"stretchString");function eM(t,e="api"){let r=kt.default.randomBytes(Ic),n=wc(Fm(e),r),i=kt.default.createCipheriv(Oc,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")}${Z_}${u}`}s(eM,"encrypt");function Rc(t,e="api"){let[r,n]=t.split(Z_),i=Buffer.from(r,"hex"),o=wc(Fm(e),i),a=kt.default.createDecipheriv(Oc,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(Rc,"decrypt");function tM(t,e,r="api"){try{let n=new TextEncoder,i=n.encode(Rc(e,r)),o=n.encode(t);return i.length!==o.length?!1:kt.default.timingSafeEqual(i,o)}catch{return!1}}s(tM,"compare");async function rM({dir:t,filename:e},r){let n=`${e}.enc`,i=(0,Um.join)(t,e);if(Mr.default.lstatSync(i).isDirectory())throw new Error("Unable to encrypt directory");let o=Mr.default.createReadStream(i),a=Mr.default.createWriteStream((0,Um.join)(t,n)),u=kt.default.randomBytes(Ic),c=kt.default.randomBytes(Mm),l=wc(r,u),d=kt.default.createCipheriv(Oc,new Uint8Array(l),new Uint8Array(c));return a.write(u),a.write(c),o.pipe(km.default.createGzip()).pipe(d).pipe(a),new Promise(f=>{a.on("finish",()=>{f({filename:n,dir:t})})})}s(rM,"encryptFile");async function nM(t){let e=Mr.default.createReadStream(t),r=await X_(e,Ic),n=await X_(e,Mm);return e.close(),{salt:r,iv:n}}s(nM,"getSaltAndIV");async function iM(t,e,r){if(Mr.default.lstatSync(t).isDirectory())throw new Error("Unable to decrypt directory");let{salt:n,iv:i}=await nM(t),o=Mr.default.createReadStream(t,{start:Ic+Mm}),a=Mr.default.createWriteStream(e),u=wc(r,n),c=kt.default.createDecipheriv(Oc,new Uint8Array(u),new Uint8Array(i)),l=km.default.createGunzip();return o.pipe(c).pipe(l).pipe(a),new Promise((d,f)=>{a.on("finish",()=>{a.close(),d()}),o.on("error",g=>{a.close(),f(g)}),c.on("error",g=>{a.close(),f(g)}),l.on("error",g=>{a.close(),f(g)}),a.on("error",g=>{a.close(),f(g)})})}s(iM,"decryptFile");function X_(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(X_,"readBytes");var Wm={};P(Wm,{APIWarning:()=>In,FeatureDisabledWarning:()=>Dc,InvalidAPIKeyWarning:()=>wi,UsageLimitWarning:()=>Cc});var In=class extends Error{static{s(this,"APIWarning")}constructor(e,r){super(e),this.code=r}},wi=class extends In{static{s(this,"InvalidAPIKeyWarning")}constructor(){super("Invalid API key","invalid_api_key")}},Cc=class extends In{static{s(this,"UsageLimitWarning")}constructor(e){super(`Usage limit exceeded: '${e}'`,"usage_limit_exceeded"),this.limitName=e}getPublicWarning(){return{limitName:this.limitName}}},Dc=class extends In{static{s(this,"FeatureDisabledWarning")}constructor(e){super(`Feature disabled: '${e}'`,"feature_disabled"),this.featureName=e,this.status=400}getPublicWarning(){return{featureName:this.featureName}}getPublicError(){return{featureName:this.featureName}}};var nO=W(require("dd-trace"));var oM=E.SESSION_UPDATE_PERIOD?parseInt(E.SESSION_UPDATE_PERIOD):60*1e3;function aM(){return new Date(Date.now()-oM).toISOString()}s(aM,"timeMinusOneMinute");function tO(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(tO,"finalise");async function uM(t,e){if(Hs(t))return{valid:!0,user:void 0};let n=Rc(t).split("_")[0];return De(n,async()=>{let i;try{let o=z();i=await Ht("by_api_key",{key:t},o)}catch{i=void 0}if(i)return{valid:!0,user:await bo({userId:i,tenantId:n,populateUser:e})};throw new wi})}s(uM,"checkApiKey");function bc(t,e){let r=t.request.headers[e];if(Array.isArray(r))throw new Error("Unexpected header format");return r}s(bc,"getHeader");function xc(t=[],e={publicAllowed:!1}){let r=t?ir(t):[];return(async(n,i)=>{let o=!1,a=bc(n,"x-budibase-api-version");sr(n,r)&&(o=!0);try{let c=bc(n,"x-budibase-token"),l=zt(n,"budibase:auth"),d=l||Au(c);d&&!d.exp&&(l&&Jt(n,"budibase:auth"),n.throw(401,"Session token missing expiration, please log in again"));let f=bc(n,"x-budibase-api-key");!f&&n.request.headers.authorization&&(f=n.request.headers.authorization.split(" ")[1]);let g=bc(n,"x-budibase-tenant-id"),m=!1,y,h=!1,p;if(d&&!f){let A=d.sessionId,_=d.userId,I;try{I=await Yp(_,A),e&&e.populateUser?y=await bo({userId:_,tenantId:I.tenantId,email:I.email,populateUser:e.populateUser(n)}):y=await bo({userId:_,tenantId:I.tenantId,email:I.email}),y.csrfToken=I.csrfToken,p="cookie",I?.lastAccessedAt<aM()&&await Hp(I),m=!0}catch(O){m=!1,console.warn(`Auth Error: ${O.message}`),Jt(n,"budibase:auth")}}if(!m&&f){let A=e.populateUser?e.populateUser(n):null,{valid:_,user:I}=await uM(f,A);_&&(m=!0,p="api_key",y=I,h=!I)}!y&&g?y={tenantId:g}:y&&"password"in y&&delete y.password,m||(m=!1);let T=s(A=>A&&A.email,"isUser");return T(y)&&nO.default.setUser({id:y._id,tenantId:y.tenantId,budibaseAccess:y.budibaseAccess,status:y.status}),tO(n,{authenticated:m,user:y,internal:h,version:a,publicEndpoint:o,loginMethod:p}),T(y)?hf(y,n,i):i()}catch(c){if(console.warn(`Auth Error: ${c.message}`),c instanceof rO.JsonWebTokenError?Jt(n,"budibase:auth"):c?.code==="invalid_api_key"&&n.throw(403,c.message),e&&e.publicAllowed||o)return tO(n,{authenticated:!1,version:a,publicEndpoint:o}),i();n.throw(c.status||403,c.message||"Authentication failed")}})}s(xc,"authenticated");async function vc(t,e){if(t.internal)return e();let r=await dn(t);return!r&&!E.isWorker()?t.throw(403,"This request required a workspace id."):!r&&!Be(t.user)?t.throw(403,"Builder user only endpoint."):r&&!Ii(t.user,r)&&t.throw(403,"Workspace builder user only endpoint."),e()}s(vc,"builderOnly");async function Nc(t,e){if(t.internal||Lt(t.user))return e();let r=await dn(t);return!r&&!E.isWorker()?t.throw(403,"This request required a workspace id."):!r&&!Be(t.user)?t.throw(403,"Admin/Builder user only endpoint."):r&&!Ii(t.user,r)&&t.throw(403,"Workspace Admin/Builder user only endpoint."),e()}s(Nc,"builderOrAdmin");var sO=W(require("crypto"));var iO={"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","https://companion.frontapp.com"],"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","https://d2l5prqdbvm3op.cloudfront.net","https://companion.frontapp.com","https://*.frontapp.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'"]},Gm=/^[A-Za-z0-9-*:/.]+$/,oO=s((async(t,e)=>{let r=sO.default.randomBytes(16).toString("base64");t.state.nonce=r;let n={...iO};n["script-src"]=[...iO["script-src"],`'nonce-${r}'`];let i={"media-src":E.CUSTOM_CSP_MEDIA_SRC,"script-src":E.CUSTOM_CSP_SCRIPT_SRC,"connect-src":E.CUSTOM_CSP_CONNECT_SRC,"img-src":E.CUSTOM_CSP_IMG_SRC,"font-src":E.CUSTOM_CSP_FONT_SRC,"frame-src":E.CUSTOM_CSP_FRAME_SRC};for(let[c,l]of Object.entries(i))if(l){let d=l.split(",").map(f=>f.trim()).filter(f=>Gm.test(f));n[c]=[...n[c]||[],...d]}let o=t.request?.get("x-budibase-embed")?.toLowerCase()==="true",a=t.user?.license?.features.includes("customAppScripts");if(o&&(n["frame-ancestors"]=["*"]),t.appId&&(o||a))try{let c=await Bs.getWorkspaceMetadata(t.appId);if("name"in c){if(a)for(let l of c.scripts||[]){let d=(l.cspWhitelist||"").split(`
|
|
38
38
|
`).filter(g=>Gm.test(g)),f=["default-src","script-src","connect-src","media-src","img-src","font-src","frame-src"];for(let g of f)n[g]=[...n[g]||[],...d]}if(o){let l=(c.embedAllowedOrigins||[]).map(d=>d.trim()).filter(d=>Gm.test(d));n["frame-ancestors"]=l.length?l:["*"]}}}catch(c){console.error(`Error occurred in Content-Security-Policy middleware: ${c}`)}let u=Object.entries(n).map(([c,l])=>`${c} ${l.join(" ")}`).join("; ");t.set("Content-Security-Policy",u),await e()}),"contentSecurityPolicy");var cM=["GET","HEAD","OPTIONS"],lM=["application/x-www-form-urlencoded","multipart/form-data","text/plain"];function Pc(t={noCsrfPatterns:[]}){let e=ir(t.noCsrfPatterns);return(async(r,n)=>{if(sr(r,e)||cM.indexOf(r.method)!==-1)return n();let o=r.get("content-type")?r.get("content-type").toLowerCase():"";if(!lM.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(Pc,"csrf");function aO(t){if(t.includes("-----BEGIN PRIVATE KEY-----"))return!0;for(let e of fT){let r=E[e];if(!(typeof r!="string"||r==="")&&t.includes(r))return!0}return!1}s(aO,"stringContainsSecret");async function uO(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 5xx response code",r);let i={message:r.message,status:n,validationErrors:r.validation,error:Yu(r)};if(aO(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(uO,"errorHandling");var cO=s((async(t,e)=>{let n=zt(t,"budibase:featureflags")?.flags||{};await Mf(n,async()=>{await e()})}),"featureFlagCookie");async function Lc(t,e){let r=t.request.headers["x-budibase-api-key"];return r||t.throw(403,"Unauthorized"),Array.isArray(r)&&t.throw(403,"Unauthorized"),Hs(r)||t.throw(403,"Unauthorized"),e()}s(Lc,"internalApi");async function lO(t,e){return t.ip?await Pf(t.ip,()=>e()):e()}s(lO,"ip");var ko={};P(ko,{body:()=>dM,params:()=>fM});var $m=W(require("joi"));function dO(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:$m.default.any().optional(),updatedAt:$m.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(dO,"validate");function dM(t,e){return dO(t,"body",e)}s(dM,"body");function fM(t,e){return dO(t,"params",e)}s(fM,"params");var Ri={};P(Ri,{authenticate:()=>hM,options:()=>mM});function Ie(t,e,r){return t(r,null,{message:e})}s(Ie,"authError");async function Fr(t,e){if(e&&e.callbackURL)return e.callbackURL;let r=await ym(),n="/api/global/auth";return Sr()&&(n+=`/${q()}`),n+=`/${t}/callback`,`${r.platformUrl}${n}`}s(Fr,"ssoCallbackUrl");var Vm="Invalid credentials",pM="This account has expired. Please reset your password",mM={passReqToCallback:!0};async function hM(t,e,r,n){if(!e)return Ie(n,"Email Required");if(!r)return Ie(n,"Password Required");let i=await _t(e);return i==null?(console.info(`user=${e} could not be found`),Ie(n,Vm)):i.status==="inactive"?(console.info(`user=${e} is inactive`,i),Ie(n,Vm)):i.password?await df(r,i.password)?(delete i.password,n(null,i)):Ie(n,Vm):(console.info(`user=${e} has no password set`,i),Ie(n,pM))}s(hM,"authenticate");var or={};P(or,{buildVerifyFn:()=>mO,getCallbackUrl:()=>yM,strategyFactory:()=>qm});var Mo=s(t=>Promise.resolve(t),"ssoSaveUserNoOp");async function Uc(t,e=!0,r,n,i=!1){if(!n)throw new Error("Save user function must be provided");if(!t.userId)return Ie(r,"sso user id required");if(!t.email)return Ie(r,"sso user email required");let o=ni(t.userId),a;try{a=await On(o)}catch(c){if(!c.status||c.status!==404)return Ie(r,"Unexpected error when retrieving existing user",c)}if(!a&&(t.emailVerified||i)&&(a=await _t(t.email)),!a&&e)return Ie(r,"Email does not yet exist. You must set up your local budibase account first.");a||(a={_id:o,email:t.email,roles:{},tenantId:q()});let u=await gM(a,t);u.forceResetPassword=!1;try{delete u.password,u=await n(u,{hashPassword:!1,requirePassword:!1})}catch(c){return Ie(r,"Error saving user",c)}return r(null,u)}s(Uc,"authenticate");async function gM(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(gM,"syncUser");var EM=require("passport-google-oauth").OAuth2Strategy;function mO(t){return(e,r,n,i)=>{let o={provider:"google",providerType:"google",userId:n.id,profile:n,email:n._json.email,emailVerified:n._json.email_verified===!0,oauth2:{accessToken:e,refreshToken:r}};return Uc(o,!0,i,t)}}s(mO,"buildVerifyFn");async function qm(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=mO(r);return new EM({clientID:t.clientID,clientSecret:t.clientSecret,callbackURL:e},o)}catch(n){throw new Error(`Error constructing google authentication strategy: ${n}`)}}s(qm,"strategyFactory");async function yM(t){return Fr("google",t)}s(yM,"getCallbackUrl");var ar={};P(ar,{buildVerifyFn:()=>EO,fetchStrategyConfig:()=>wM,getCallbackUrl:()=>RM,strategyFactory:()=>OM});var hO=W(require("node-fetch"));var gO=require("@govtechsg/passport-openidconnect");function EO(t,e=!1){return async(r,n,i,o,a,u,c,l,d)=>{let f=TM(n,i),g=SM(n,i),m={provider:r,providerType:"oidc",userId:f.id,profile:f,email:AM(f,g),emailVerified:_M(f,g),oauth2:{accessToken:u,refreshToken:c}};return Uc(m,!1,d,t,e)}}s(EO,"buildVerifyFn");function TM(t,e){let r={...t?._json||{}};!r.email&&e.emails?.length&&(r.email=e.emails[0].value,r.email_verified=e._json?.email_verified);let n=t?.displayName||e.displayName;return{id:t?.id||e.id,name:t?.name||e.name||!!n&&{givenName:n,familyName:""}||void 0,_json:r,provider:t?.provider}}s(TM,"normalizeProfile");function SM(t,e){return{email:t?._json?.email||e.emails?.[0]?.value,email_verified:e._json?.email_verified,preferred_username:e.username}}s(SM,"buildJwtClaims");function AM(t,e){if(t._json.email)return t._json.email.toLowerCase();if(e.email)return e.email.toLowerCase();let r=e.preferred_username;if(r&&sp(r))return r.toLowerCase();throw new Error(`Could not determine user email from profile ${JSON.stringify(t)} and claims ${JSON.stringify(e)}`)}s(AM,"getEmail");function _M(t,e){return t._json.email?t._json.email_verified===!0:e.email?e.email_verified===!0:!1}s(_M,"getEmailVerified");async function OM(t,e){try{let r=EO(e,t.allowUnverifiedEmailLinking),n=new gO.Strategy(t,r);return n.name="oidc",n}catch(r){throw new Error(`Error constructing OIDC authentication strategy - ${r}`)}}s(OM,"strategyFactory");function IM(t){let e=E.OIDC_ALLOW_UNVERIFIED_EMAIL_LINKING;if(e===void 0)return t;let r=`${e}`.toLowerCase();return r!==""&&r!=="false"&&r!=="0"}s(IM,"resolveAllowUnverifiedEmailLinking");async function wM(t,e){try{let{clientID:r,clientSecret:n,configUrl:i,pkce:o,allowUnverifiedEmailLinking:a}=t;if(!r||!n||!e||!i)throw new Error("Configuration invalid. Must contain clientID, clientSecret, callbackUrl and configUrl");let u=await(0,hO.default)(i);if(!u.ok)throw new Error(`Unexpected response when fetching openid-configuration: ${u.statusText}`);let c=await u.json();return{issuer:c.issuer,authorizationURL:c.authorization_endpoint,tokenURL:c.token_endpoint,userInfoURL:c.userinfo_endpoint,clientID:r,clientSecret:n,callbackURL:e,pkce:o,allowUnverifiedEmailLinking:IM(a)}}catch(r){throw new Error(`Error constructing OIDC authentication configuration - ${r}`)}}s(wM,"fetchStrategyConfig");async function RM(){return Fr("oidc")}s(RM,"getCallbackUrl");function yO(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(yO,"querystringToBody");function kc(t,e,r={noTenancyRequired:!1}){let n=ir(t),i=ir(e);return async function(o,a){let c={allowNoTenant:r.noTenancyRequired||!!sr(o,i)};sr(o,n)||(c.excludeStrategies=["query"]);let d=Qs(o,c);return d&&o.set("x-budibase-tenant-id",d),De(d,a)}}s(kc,"tenancy");function TO(t=[]){let e=ir(t);return async function(r,n){if(sr(r,e))return n();try{if((await Ge("settings"))?.config?.active===!1){r.status=404,r.body={message:"Tenant not found"};return}}catch(i){if(i.message==="Global DB not found")return n();throw i}return n()}}s(TO,"activeTenant");async function Mc(t,e){if(t.internal||Lt(t.user))return e();let r=await dn(t);return r&&!sc(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&&!Be(t.user)&&t.throw(403,"Admin/Builder user only endpoint."),e()}s(Mc,"workspaceBuilderOrAdmin");var Km={};P(Km,{postAuth:()=>bM,preAuth:()=>DM});var CM=require("passport-google-oauth").OAuth2Strategy;async function SO(){let t=await Tm();if(!t)throw new Error("No google configuration found");return t}s(SO,"fetchGoogleCreds");async function DM(t,e,r){let n=await SO(),o=`${await Po({tenantAware:!1})}/api/global/auth/datasource/google/callback`,a=await qm(n,o,Mo);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(DM,"preAuth");async function bM(t,e,r){let n=await SO(),o=`${await Po({tenantAware:!1})}/api/global/auth/datasource/google/callback`,a=zt(e,"budibase:datasourceauth");if(!a)throw new Error("Unable to fetch datasource auth cookie");return t.authenticate(new CM({clientID:n.clientID,clientSecret:n.clientSecret,callbackURL:o},(u,c,l,d)=>{Jt(e,"budibase:datasourceauth"),d(null,{accessToken:u,refreshToken:c})}),{successRedirect:"/",failureRedirect:"/error"},async(u,c)=>{let l=`/builder/workspace/${a.appId}/data`,d=X();await gn(`datasource:creation:${a.appId}:google:${d}`,{tokens:c}),e.redirect(`${l}/new?continue_google_setup=${d}`)})(e,r)}s(bM,"postAuth");var xM={google:Km};var AO=require("koa-passport"),vM=require("passport-local").Strategy,Fc=require("passport-oauth2-refresh"),NM=xc,PM=kc,LM=Pc,UM=AO;AO.use(new vM(Ri.options,Ri.authenticate));async function kM(t,e){let r=await ar.getCallbackUrl(),n,i;try{if(n=await ar.fetchStrategyConfig(t,r),!n)throw new Error("OIDC Config contents invalid");i=await ar.strategyFactory(n,Mo)}catch{throw new Error("Could not refresh OAuth Token")}return Fc.use(i),new Promise(o=>{Fc.requestNewAccessToken("oidc",e,(a,u,c,l)=>{o({err:a,accessToken:u,refreshToken:c,params:l})})})}s(kM,"refreshOIDCAccessToken");async function MM(t,e){let r=await or.getCallbackUrl(t),n;try{n=await or.strategyFactory(t,r,Mo)}catch(i){throw new Error(`Error constructing OIDC refresh strategy: message=${i.message}`)}return Fc.use(n),new Promise(i=>{Fc.requestNewAccessToken("google",e,(o,a,u,c)=>{i({err:o,accessToken:a,refreshToken:u,params:c})})})}s(MM,"refreshGoogleAccessToken");async function FM(t,e,r){switch(e){case"oidc":{if(!r)return{err:{data:"OIDC config id not provided"}};let n=await Sm(r);return n?kM(n,t):{err:{data:"OIDC configuration not found"}}}case"google":{let n=await pc();return n?MM(n,t):{err:{data:"Google configuration not found"}}}}}s(FM,"refreshOAuthToken");async function BM(t,e){let r={accessToken:e.accessToken,refreshToken:e.refreshToken};try{let n=z(),i=await n.get(t);typeof r.refreshToken!="string"&&delete r.refreshToken,i.oauth2={...i.oauth2,...r},await n.put(i),await xo(t)}catch(n){console.error("Could not update OAuth details for current user",n)}}s(BM,"updateUserOAuth");async function WM(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=zt(e,"budibase:auth"),o=await ho(r);i&&n?o=o.filter(u=>u.sessionId!==i.sessionId):Jt(e,"budibase:auth");let a=o.map(({sessionId:u})=>u);await An(r,{sessionIds:a,reason:"logout"}),await nc.logout(e.user?.email),await xo(r)}s(WM,"platformLogout");var Ym={};P(Ym,{validate:()=>KM});var v=W(require("joi"));var GM=["Relational","Non-relational","Spreadsheet","Object store","Graph","API"];function Hm(t,e){let{error:r}=t.validate(e);if(r)throw r}s(Hm,"runJoi");function $M(t){let e=v.default.object({type:v.default.string().allow("component").required(),metadata:v.default.object().unknown(!0).required(),hash:v.default.string().optional(),version:v.default.string().optional(),schema:v.default.object({name:v.default.string().required(),settings:v.default.array().items(v.default.object().unknown(!0)).required()}).unknown(!0)});Hm(e,t)}s($M,"validateComponent");function VM(t){let e=v.default.object({type:v.default.string().allow(...Object.values($c)).required(),required:v.default.boolean().required(),default:v.default.any(),display:v.default.string()}),r=v.default.object({type:v.default.string().allow(...Object.values(Gc)),readable:v.default.boolean(),displayName:v.default.string(),fields:v.default.object().pattern(v.default.string(),e)}).required(),n=v.default.object({type:v.default.string().allow("datasource").required(),metadata:v.default.object().unknown(!0).required(),hash:v.default.string().optional(),version:v.default.string().optional(),schema:v.default.object({docs:v.default.string(),plus:v.default.boolean().optional(),isSQL:v.default.boolean().optional(),auth:v.default.object({type:v.default.string().required()}).optional(),features:v.default.object(Object.fromEntries(Object.values(Vc).map(i=>[i,v.default.boolean().optional()]))).optional(),relationships:v.default.boolean().optional(),description:v.default.string().required(),friendlyName:v.default.string().required(),type:v.default.string().allow(...GM),datasource:v.default.object().pattern(v.default.string(),e).required(),query:v.default.object().pattern(v.default.string(),r).unknown(!0).required(),extra:v.default.object().pattern(v.default.string(),v.default.object({type:v.default.string().required(),displayName:v.default.string().required(),required:v.default.boolean(),data:v.default.object()}))})});Hm(n,t)}s(VM,"validateDatasource");function qM(t){let e=v.default.object().pattern(v.default.string(),{type:v.default.string().allow(...Object.values(qc)).required(),customType:v.default.string().allow(...Object.values(Kc)),title:v.default.string(),description:v.default.string(),enum:v.default.array().items(v.default.string()),pretty:v.default.array().items(v.default.string())}),r=v.default.object({properties:e,required:v.default.array().items(v.default.string())}).concat(e).required(),n=v.default.object({type:v.default.string().allow("automation").required(),metadata:v.default.object().unknown(!0).required(),hash:v.default.string().optional(),version:v.default.string().optional(),schema:v.default.object({name:v.default.string().required(),tagline:v.default.string().required(),icon:v.default.string().required(),description:v.default.string().required(),type:v.default.string().allow("ACTION","LOGIC").required(),stepId:v.default.string().disallow(...gh).required(),inputs:v.default.object().optional(),schema:v.default.object({inputs:r,outputs:r}).required()})});Hm(n,t)}s(qM,"validateAutomation");function KM(t){switch(t?.type){case"component":$M(t);break;case"datasource":VM(t);break;case"automation":qM(t);break;default:throw new Error(`Unknown plugin type - check schema.json: ${t.type}`)}}s(KM,"validate");var zm={};P(zm,{Client:()=>Re,clients:()=>_r,locks:()=>yn,utils:()=>Ha});var Xm={};P(Xm,{init:()=>jM});var QM={"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 _O(t,e){let r=QM[t];if(!r)throw new Error("Event does not have a method of document ID extraction");return r(e)}s(_O,"getDocumentId");var Fo=class{constructor(e){this.processors=[];this.processors=e}static{s(this,"DocumentUpdateProcessor")}async processEvent(e,r,n){let i=r.realTenantId,o=_O(e,n);if(!(!i||!o))for(let{events:a,processor:u}of this.processors)a.includes(e)&&await De(i,async()=>{await u({id:o,tenantId:i,appId:n.appId,properties:n})})}shutdown(){return VA()}};var OO,Jm;function jM(t){St||Zu(),Jm||(Jm=new Fo(t)),OO||(OO=St.process(async e=>{let{event:r,identity:n,properties:i}=e.data;await Jm.processEvent(r,n,i)}))}s(jM,"init");var ah={};P(ah,{COUNT_FIELD_NAME:()=>sh,Sql:()=>vO,SqlTable:()=>Bc,designDoc:()=>oh,utils:()=>Rf});var CO=require("knex");var HM=require("knex");function Zm(t){return["link","formula","ai"].indexOf(t)!==-1}s(Zm,"isIgnoredType");function IO(t,e,r,n,i){let o=e&&e.primary?e.primary:[],a=Object.values(e.schema),u=a.filter(g=>g.meta),c=u.length===a.length,l=[];n||(c?t.primary(u.map(g=>g.name)):o.length===1?(t.increments(o[0]).primary(),l.push(o[0])):t.primary(o));let d=Object.values(e.schema).map(g=>g.foreignKey);for(let[g,m]of Object.entries(e.schema)){let y=n?.schema[g];if(y&&y.type||l.includes(g)||i?.updated===g)continue;let h=m.type;switch(h){case"string":case"options":case"longform":case"barcodeqr":case"bb_reference_single":o.includes(g)?t.string(g,255):t.text(g);break;case"number":if(m.meta&&m.meta.toKey&&m.meta.toTable){let{toKey:p,toTable:T}=m.meta;t.integer(g).unsigned(),t.foreign(g).references(`${T}.${p}`)}else d.indexOf(g)===-1&&t.float(g);break;case"bigint":t.bigint(g);break;case"boolean":t.boolean(g);break;case"datetime":m.timeOnly?t.time(g):t.datetime(g,{useTz:!m.ignoreTimezones});break;case"array":case"bb_reference":Ue.schema.isDeprecatedSingleUserColumn(m)?t.text(g):t.json(g);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:p}=Af(m.tableId),T=r[p];if(!T||!T.primary)throw new Error("Referenced table doesn't exist or has no primary keys");let A=T.primary[0],_=T.schema[A].externalType;_?t.specificType(m.foreignKey,_):t.integer(m.foreignKey).unsigned(),t.foreign(m.foreignKey).references(`${p}.${A}`)}break;case"signature_single":case"attachment":case"attachment_single":t.json(g);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:wt.unreachable(h)}}let f=i?n?.schema[i.old].type:void 0;return i&&f&&!Zm(f)&&t.renameColumn(i.old,i.updated),n&&Object.entries(n.schema).filter(([m,y])=>!Zm(y.type)&&e.schema[m]==null).forEach(([m,y])=>{i?.old===m||Zm(y.type)||(n.constrained&&n.constrained.indexOf(m)!==-1&&t.dropForeign(m),t.dropColumn(m))}),t}s(IO,"generateSchema");function zM(t,e,r){return t.createTable(e.name,n=>{IO(n,e,r)})}s(zM,"buildCreateTable");function JM(t,e,r,n,i){return t.alterTable(e.name,o=>{IO(o,e,r,n,i)})}s(JM,"buildUpdateTable");function XM(t,e){return t.dropTable(e.name)}s(XM,"buildDeleteTable");var eh=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,HM.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=zM(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=JM(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=Jn(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=XM(r,e.table);break;default:throw new Error("Table operation is of unknown type")}return Jn(n)}},Bc=eh;var DO=require("lodash");var sh="__bb_total";function wO(){return(E.SQL_MAX_ROWS?parseInt(E.SQL_MAX_ROWS):null)||5e3}s(wO,"getBaseLimit");function th(){return(E.SQL_MAX_RELATED_ROWS?parseInt(E.SQL_MAX_RELATED_ROWS):null)||500}s(th,"getRelationshipLimit");function ZM(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(ZM,"prioritisedArraySort");function bO(t){return Array.isArray(t)?t.map(e=>bO(e)):(t.bindings&&(t.bindings=t.bindings.map(e=>typeof e=="boolean"?e?1:0:e)),t)}s(bO,"convertBooleans");function RO(t){return t.sourceType==="internal"||t.sourceId===Hc}s(RO,"isSqs");function eF(t,e='"'){return t.replace(new RegExp(e,"g"),`${e}${e}`)}s(eF,"escapeQuotes");function tF(t,e='"'){return`${e}${eF(t,e)}${e}`}s(tF,"wrap");function rF(t,e='"'){for(let r in t)typeof t[r]=="string"&&(t[r]=tF(t[r],e));return`[${t.join(",")}]`}s(rF,"stringifyArray");function rh(t){return`{${(Array.isArray(t)?t:t==null?[]:[t]).map(n=>{if(typeof n=="string"&&n.length>1){let i=n[0],o=n[n.length-1];if(i==='"'&&o==='"'||i==="'"&&o==="'")return n.substring(1,n.length-1)}return`${n}`}).join(",")}}`}s(rh,"toPgArrayLiteral");function xO(t){return yh.includes(t.type)&&!Ue.schema.isDeprecatedSingleUserColumn(t)}s(xO,"isJsonColumn");var nF={equal:!1,notEqual:!0,empty:!1,notEmpty:!0,fuzzy:!1,string:!1,range:!1,contains:!1,notContains:!0,containsAny:!1,oneOf:!1,notOneOf:!0,$and:!1,$or:!1},nh=class{constructor(e,r,n){this.SPECIAL_SELECT_CASES={POSTGRES_ARRAY:s(e=>this.client==="pg"&&e?.externalType?.toLowerCase()==="array","POSTGRES_ARRAY"),POSTGRES_MONEY:s(e=>this.client==="pg"&&e?.externalType?.includes("money"),"POSTGRES_MONEY"),POSTGRES_ENUM:s(e=>this.client==="pg"&&e?.externalType?.toLowerCase()==="user-defined"&&e?.type==="options","POSTGRES_ENUM"),MSSQL_DATES:s(e=>this.client==="mssql"&&e?.type==="datetime"&&e.timeOnly,"MSSQL_DATES")};this.client=e,this.query=n,this.knex=r,this.splitter=new Er.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()&&xO(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(!If(e))return null}else if(r.dateOnly){let n=Of(e);return n?new Date(n):null}else return r.ignoreTimezones?Za(e)?new Date(e):_f(e)?new Date(e+"Z"):null:Za(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,DO.cloneDeep)(e);for(let r of Object.values(Gr)){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(cr)){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(Cn)){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,o){let{relationships:a,schema:u,tableAliases:c,table:l}=this.query,d=c?.[l.name]||l.name,f=s(g=>n.match(new RegExp(`^${g}\\.`)),"matches");if(!a)return e;for(let g of a){let m=g.tableName,y=c?.[m]||m,h=f(m)||f(y),p=f(g.column),T=g.column===this.splitter.run(n).column&&!this.splitter.run(n).tableName;if((h||p||T)&&g.to&&g.tableName){let A=this.knex.select(this.knex.raw(1)).from({[y]:m}),_=A.clone(),I=wf(g),O;if(h?O=n:O=n.replace(new RegExp(`^${g.column}.`),`${c?.[g.tableName]||g.tableName}.`),I){let C=c?.[I.through]||g.through,R=this.tableNameWithSchema(I.through,{alias:C,schema:u});_=_.innerJoin(R,function(){this.on(`${y}.${I.toPrimary}`,"=",`${C}.${I.to}`)}).where(`${C}.${I.from}`,"=",this.rawQuotedIdentifier(`${d}.${I.fromPrimary}`)),this.client==="sqlite3"&&(_=this.addJoinFieldCheck(_,I)),T&&i==="empty"?e=e.whereNotExists(_):T&&i==="notEmpty"?e=e.whereExists(_):e=e.where(w=>{w.whereExists(o(O,_)),r&&w.orWhereNotExists(A.clone().innerJoin(R,function(){this.on(`${d}.${I.fromPrimary}`,"=",`${C}.${I.from}`)}))})}else{let C=`${y}.${g.to}`,R=`${d}.${g.from}`;_=_.where(C,"=",this.rawQuotedIdentifier(R)),T&&i==="empty"?e=e.whereNotExists(_):T&&i==="notEmpty"?e=e.whereExists(_):e=e.where(w=>{w.whereExists(o(O,_.clone())),r&&w.orWhereNotExists(_)})}}}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,p,T,A){let _=s((I,O,C)=>{let[R,...w]=O.split("."),b=w.join("."),G=l(R);return I.andWhere(ee=>T(ee,G?`${G}.${b}`:b,C))},"handleRelationship");for(let I in h){let O=h[I],C=Ks(I),R=C.includes(".")||i.getFieldSchema(C)?.type==="link",w=n?.relationship&&R,b;if(I==="_complexIdOperator"&&(b=h[I])&&A){let G=l(c);e=A(e,b.id.map(ee=>G?`${G}.${ee}`:ee),b.values)}else if(R)w&&(a&&(e=e.or),e=i.addRelationshipForFilter(e,nF[p],C,p,(G,ee)=>_(ee,G,O)));else{let G=l(c);e=T(e,G?`${G}.${C}`:C,O)}}}s(d,"iterate");let f=this.client==="sqlite3"&&this.query.meta?.sqliteUseLikeWithoutLower,g=s((h,p,T)=>((r?.fuzzyOr||a)&&(h=h.or),f?h.whereRaw("?? LIKE ?",[this.rawQuotedIdentifier(p),`%${T}%`]):this.client==="oracledb"||this.client==="sqlite3"?h.whereRaw("LOWER(??) LIKE ?",[this.rawQuotedIdentifier(p),`%${T.toLowerCase()}%`]):h.whereILike(this.rawQuotedIdentifier(p),this.knex.raw("?",[`%${T}%`]))),"like"),m=s((h,p=!1)=>{function T(A){return(a||h===r?.containsAny)&&(A=A.or),h===r?.notContains&&(A=A.not),A}s(T,"addModifiers"),this.client==="pg"?d(h,"contains",(A,_,I)=>{A=T(A);let O=this.getFieldSchema(_),C=this.rawQuotedIdentifier(_),R=Array.isArray(I)?[...I]:[I],w=this.SPECIAL_SELECT_CASES.POSTGRES_ARRAY(O);return p?w?A.whereRaw("COALESCE(?? && ?::text[], FALSE)",[C,rh(R)]):A.whereRaw("COALESCE(??::jsonb \\?| ?::text[], FALSE)",[C,rh(R)]):w?A.whereRaw("COALESCE(?? @> ?::text[], FALSE)",[C,rh(R)]):A.whereRaw("COALESCE(??::jsonb @> ?::jsonb, FALSE)",[C,rF(R)])}):this.client==="mysql2"||this.client==="mariadb"?d(h,"contains",(A,_,I)=>{let O=Array.isArray(I)?I:[I];return T(A).whereRaw("COALESCE(?(??, ?), FALSE)",[this.knex.raw(p?"JSON_OVERLAPS":"JSON_CONTAINS"),this.rawQuotedIdentifier(_),JSON.stringify(O)])}):d(h,"contains",(A,_,I)=>(I.length===0||(A=A.where(O=>(h===r?.notContains&&(O=O.not),O=O.where(C=>{for(let R of I){h===r?.containsAny?C=C.or:C=C.and;let w=!f,b=typeof R=="string"?`"${w?R.toLowerCase():R}"`:R,G=w?"COALESCE(LOWER(??), '')":"COALESCE(??, '')";C=C.whereLike(this.knex.raw(G,[this.rawQuotedIdentifier(_)]),`%${b}%`)}}),h===r?.notContains&&(O=O.or.whereNull(this.rawQuotedIdentifier(_))),O))),A))},"contains");if(r.$and){let{$and:h}=r;for(let p of h.conditions)e=e.where(T=>{this.addFilters(T,p,n)})}if(r.$or){let{$or:h}=r;e=e.where(p=>{for(let T of h.conditions)p.orWhere(A=>this.addFilters(A,{...T,allOr:!0},n))})}r.oneOf&&d(r.oneOf,"oneOf",(h,p,T)=>{let A=this.getFieldSchema(p),_=Array.isArray(T)?T:[T];if(a&&(h=h.or),this.client==="oracledb")p=this.convertClobs(p);else if(this.client==="sqlite3"&&A?.type==="datetime"&&A.dateOnly){for(let I of _)I!=null?h=h.or.whereLike(p,`${I.toISOString().slice(0,10)}%`):h=h.or.whereNull(p);return h}return h.whereIn(p,_)},(h,p,T)=>(a&&(h=h.or),this.client==="oracledb"&&(p=p.map(A=>this.convertClobs(A))),h.whereIn(p,Array.isArray(T)?T:[T]))),r.notOneOf&&d(r.notOneOf,"notOneOf",(h,p,T)=>{let A=this.getFieldSchema(p),_=Array.isArray(T)?T:[T];if(a&&(h=h.or),this.client==="oracledb")p=this.convertClobs(p);else if(this.client==="sqlite3"&&A?.type==="datetime"&&A.dateOnly)return h.where(I=>{I.whereNot(O=>{for(let C of _)C!=null&&O.orWhereLike(p,`${C.toISOString().slice(0,10)}%`)}).orWhereNull(p)});return h.where(I=>{I.whereNotIn(p,_).orWhereNull(p)})},(h,p,T)=>(a&&(h=h.or),this.client==="oracledb"&&(p=p.map(A=>this.convertClobs(A))),h.whereNotIn(p,Array.isArray(T)?T:[T]))),r.string&&d(r.string,"string",(h,p,T)=>{if(a&&(h=h.or),f)return h.whereRaw("?? LIKE ?",[this.rawQuotedIdentifier(p),`${T}%`]);if(this.client==="oracledb"||this.client==="sqlite3")return h.whereRaw("LOWER(??) LIKE ?",[this.rawQuotedIdentifier(p),`${T.toLowerCase()}%`]);{let A=this.getFieldSchema(p);return this.SPECIAL_SELECT_CASES.POSTGRES_ENUM(A)?h.whereRaw("??::text ilike ?",[this.knex.raw(this.quote(A.name)),`${T}%`]):h.whereILike(p,`${T}%`)}}),r.fuzzy&&d(r.fuzzy,"fuzzy",g),r.range&&d(r.range,"range",(h,p,T)=>{let A=s(b=>b&&Object.keys(b).length===0&&Object.getPrototypeOf(b)===Object.prototype,"isEmptyObject");A(T.low)&&(T.low=""),A(T.high)&&(T.high="");let _=eu(T.low),I=eu(T.high),O=this.getFieldSchema(p),C=p,R=T.high,w=T.low;return this.client==="sqlite3"&&O?.type==="datetime"&&O.dateOnly&&(R!=null&&(R=`${R.toISOString().slice(0,10)}T23:59:59.999Z`),w!=null&&(w=w.toISOString().slice(0,10))),this.client==="oracledb"?C=this.convertClobs(p):this.client==="sqlite3"&&O?.type==="bigint"&&(C=this.knex.raw("CAST(?? AS INTEGER)",[this.rawQuotedIdentifier(p)]),R=this.knex.raw("CAST(? AS INTEGER)",[T.high]),w=this.knex.raw("CAST(? AS INTEGER)",[T.low])),a&&(h=h.or),_&&I?h.whereBetween(C,[w,R]):_?h.where(C,">=",w):I?h.where(C,"<=",R):h}),r.equal&&d(r.equal,"equal",(h,p,T)=>{let A=this.getFieldSchema(p);if(a&&(h=h.or),this.client==="mssql")return h.whereRaw("CASE WHEN ?? = ? THEN 1 ELSE 0 END = 1",[this.rawQuotedIdentifier(p),T]);if(this.client==="oracledb"){let _=this.convertClobs(p);return h.where(I=>I.whereNotNull(_).andWhere(_,T))}else return this.client==="sqlite3"&&A?.type==="datetime"&&A.dateOnly?T!=null?h.whereLike(p,`${T.toISOString().slice(0,10)}%`):h.whereNull(p):h.whereRaw("COALESCE(?? = ?, FALSE)",[this.rawQuotedIdentifier(p),T])}),r.notEqual&&d(r.notEqual,"notEqual",(h,p,T)=>{let A=this.getFieldSchema(p);if(a&&(h=h.or),this.client==="mssql")return h.whereRaw("CASE WHEN ?? = ? THEN 1 ELSE 0 END = 0",[this.rawQuotedIdentifier(p),T]);if(this.client==="oracledb"){let _=this.convertClobs(p);return h.where(I=>I.not.whereNull(_).and.where(_,"!=",T)).or.whereNull(_)}else return this.client==="sqlite3"&&A?.type==="datetime"&&A.dateOnly?T!=null?h.not.whereLike(p,`${T.toISOString().slice(0,10)}%`).or.whereNull(p):h.not.whereNull(p):h.whereRaw("COALESCE(?? != ?, TRUE)",[this.rawQuotedIdentifier(p),T])}),r.empty&&d(r.empty,"empty",(h,p)=>(a&&(h=h.or),h.whereNull(p))),r.notEmpty&&d(r.notEmpty,"notEmpty",(h,p)=>(a&&(h=h.or),h.whereNotNull(p))),r.contains&&m(r.contains),r.notContains&&m(r.notContains),r.containsAny&&m(r.containsAny,!0);let y=o?.[this.table._id]||this.table._id;return r.documentType&&!Sf(this.table)&&y&&e.andWhereLike(`${y}._id`,`${Ot(r.documentType)}%`),e}isSqs(){return RO(this.table)}getTableName(e){e||(e=this.table);let r=e.name;RO(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 ${sh}`)}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 g=`${o}.${u}`,m;this.isAggregateField(u)?m=this.rawQuotedIdentifier(u):this.client==="oracledb"?m=this.convertClobs(g):m=this.rawQuotedIdentifier(g),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:g,through:m,to:y,from:h,fromPrimary:p,toPrimary:T}=f;if(!g||!r)continue;let A=l[g];if(!A)throw new Error(`related table "${g}" not found in datasource`);let _=u?.[g]||g,I=u?.[r]||r,O=m&&u?.[m]||m,C=this.tableNameWithSchema(g,{alias:_,schema:c}),R=[...A?.primary||[],A?.primaryDisplay].filter(V=>V),w=ZM(d.filter(V=>V.split(".")[0]===_),R);w=w.slice(0,Math.floor(this.maxFunctionParameters()/2));let b=w.map(V=>this.buildJsonField(A,V));if(!b.length)continue;let G=b.map(V=>{let B=this.client==="oracledb"?" VALUE ":",";return this.knex.raw(`?${B}??`,[V[0],V[1]]).toString()}).join(","),ee=`${_}.${T||y}`,M=o.from(C).orderBy(ee),U=m&&T&&p,L=U?`${O}.${h}`:`${_}.${y}`,K=U?`${I}.${p}`:`${I}.${h}`;if(U){let V=this.tableNameWithSchema(m,{alias:O,schema:c});M=M.join(V,function(){this.on(`${_}.${T}`,"=",`${O}.${y}`)})}M=M.where(this.rawQuotedIdentifier(L),"=",this.rawQuotedIdentifier(K));let F=s(V=>(M=M.select(w.map(B=>this.rawQuotedIdentifier(B))).limit(th()),o.select(V).from({[_]:M})),"standardWrap"),j;switch(i){case"sqlite3":M=this.addJoinFieldCheck(M,f),j=F(this.knex.raw(`json_group_array(json_object(${G}))`));break;case"pg":j=F(this.knex.raw(`json_agg(json_build_object(${G}))`));break;case"mariadb":j=M.select(o.raw(`json_arrayagg(json_object(${G}) LIMIT ${th()})`));break;case"mysql2":case"oracledb":j=F(this.knex.raw(`json_arrayagg(json_object(${G}))`));break;case"mssql":{let V=o.select("*").from({[I]:M.select(b.map(B=>o.ref(B[1]).as(B[0]))).limit(th())});j=o.raw(`(SELECT ?? = (${V} FOR JSON PATH))`,[this.rawQuotedIdentifier(_)]);break}default:throw new Error(`JSON relationships not implement for ${i}`)}e=e.select({[f.column]:j})}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,g=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 y of n){let h=y.fromPrimary,p=y.from;this.orOn(`${f}.${h}`,"=",`${d}.${p}`)}}).leftJoin(g,function(){for(let y of n){let h=y.toPrimary,p=y.to;this.orOn(`${l}.${h}`,`${d}.${p}`)}}):e=e.leftJoin(g,function(){for(let y of n){let h=y.from,p=y.to;this.orOn(`${f}.${h}`,"=",`${l}.${p}`)}}),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 g=this.query.tableAliases?.[a.name]||a.name,m=this.addSorting(this.knex.with("paginated",c.clone().clearSelect().select("*")).select(this.generateSelectStatement()).from({[g]:"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,{relationship:!0}),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,{relationship:!0}),e.disableReturning?n.delete():n.delete().returning(this.generateSelectStatement())}},ih=class extends Bc{static{s(this,"SqlQueryBuilder")}constructor(e,r=wO()){super(e),this.limit=r}convertToNative(e,r={}){let n=this.getSqlClient();if(r?.disableBindings)return{sql:e.toString()};{let i=Jn(e);return n==="sqlite3"&&(i=bO(i)),i}}_query(e,r={}){let n=this.getSqlClient(),i={client:this.getBaseSqlClient()};(n==="sqlite3"||n==="oracledb")&&(i.useNullAsDefault=!0);let o=(0,CO.knex)(i),a,u=new nh(n,o,e);switch(this._operation(e)){case"CREATE":a=u.create(r);break;case"READ":a=u.read({limits:{query:this.limit,base:wO()}});break;case"COUNT":a=u.read();break;case"UPDATE":a=u.update(r);break;case"DELETE":a=u.delete(r);break;case"BULK_CREATE":a=u.bulkCreate();break;case"BULK_UPSERT":a=u.bulkUpsert();break;case"CREATE_TABLE":case"UPDATE_TABLE":case"DELETE_TABLE":return this._tableQuery(e);default:throw"Operation type is not supported by SQL query builder"}return this.convertToNative(a,r)}async getReturningRow(e,r){if(!r.extra||!r.extra.idFilter)return{};let n=this._query({operation:"READ",datasource:r.datasource,schema:r.schema,table:r.table,tables:r.tables,resource:{fields:[]},filters:r.extra?.idFilter,paginate:{limit:1}});return e(n,"READ")}checkLookupKeys(e,r){if(!e||!r.table.primary)return r;let n=r.table.primary[0];return r.extra={idFilter:{equal:{[n]:e}}},r}async queryWithReturning(e,r,n=i=>i){let i=this.getSqlClient(),o=this._operation(e),a=this._query(e,{disableReturning:!0});if(Array.isArray(a)){let d=[];for(let f of a)d.push(await r(f,o));return d}let u;o==="DELETE"&&(u=n(await this.getReturningRow(r,e)));let c=await r(a,o),l=n(c);if(o==="CREATE"||o==="UPDATE"){let d;i==="mssql"?d=l?.[0].id:(i==="mysql2"||i==="mariadb")&&(d=l?.insertId),u=n(await this.getReturningRow(r,this.checkLookupKeys(d,e)))}return o==="COUNT"?l:o!=="READ"?u:l.length?l:[{[o.toLowerCase()]:!0}]}getTableName(e,r){let n=e.name;if(e.sourceType==="internal"||e.sourceId===Hc){if(!e._id)return;n=e._id}return r?.[n]||n}convertJsonStringColumns(e,r,n){let i=this.getTableName(e,n);for(let[o,a]of Object.entries(e.schema)){if(!xO(a))continue;let u=`${i}.${o}`;for(let c of r)typeof c[u]=="string"&&(c[u]=JSON.parse(c[u])),typeof c[o]=="string"&&(c[o]=JSON.parse(c[o]))}return r}log(e,r){Ls(this.getSqlClient(),e,r)}},vO=ih;var oh={};P(oh,{base:()=>iF});function iF(t){return{_id:xt,language:"sqlite",sql:{tables:{},options:{table_name:t}}}}s(iF,"base");var uh={};P(uh,{jsonFromCsvString:()=>sF});var NO=W(require("csvtojson"));async function sF(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,NO.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(sF,"jsonFromCsvString");var ch=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)}},Wc=ch;var PO=W(require("@koa/router"));var wn=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 Wc(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 PO.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 Bo=class{constructor(){this.groups=[]}static{s(this,"EndpointGroupList")}group(...e){let r=new wn;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 oF={...js,...le},aF=s((t={})=>{Ja(t.db)},"init");0&&(module.exports={APIWarning,ActiveContentFileError,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,EmailUnavailableError,Endpoint,EndpointGroup,EndpointGroupList,FeatureDisabledError,FeatureDisabledWarning,ForbiddenError,GlobalRole,HTTPError,Header,InternalTable,InvalidAPIKeyWarning,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,UsageLimitWarning,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,getErrorMessage,getPublicError,init,installation,locks,logging,middleware,objectStore,permissions,platform,plugins,queue,redis,roles,security,sessions,setEnv,sql,tenancy,timers,userUtils,users,utils,warnings,withEnv});
|
|
39
39
|
//# sourceMappingURL=index.js.map
|