@budibase/backend-core 3.37.5 → 3.38.0

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