@budibase/pro 3.5.0 → 3.5.2
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 +1 -1
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -34,7 +34,7 @@ l2HXiAD1Q2rlHNW9wDaYyKb1F5f+v4RyqCAyzlkwRdksmkLeECTboojNnmRCrE3C
|
|
|
34
34
|
d/o3ZWE1TTj1zYwlCLN5qRKr3hU8nC3xEYNEbkB9SfTRaOq9Q7P8WmfLkoCPm3pR
|
|
35
35
|
mwIDAQAB
|
|
36
36
|
-----END PUBLIC KEY-----
|
|
37
|
-
`;function Yr(e){return uo.default.verify(e,Rb,{algorithms:["RS256"]})}function xb(e,t){return uo.default.sign(t,e,{encoding:"utf-8",algorithm:"RS256"})}var jn={};R(jn,{getFeatures:()=>po});var l=require("@budibase/types");var Tb={[l.PlanType.FREE]:[...Ee.SELF_FREE_LICENSE.features],[l.PlanType.PREMIUM]:void 0,[l.PlanType.PREMIUM_PLUS]:[l.Feature.APP_BACKUPS,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.APP_BUILDERS,l.Feature.VIEW_PERMISSIONS,l.Feature.TRIGGER_AUTOMATION_RUN,l.Feature.VIEW_READONLY_COLUMNS,l.Feature.AI_CUSTOM_CONFIGS],[l.PlanType.PREMIUM_PLUS_TRIAL]:[l.Feature.APP_BACKUPS,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.APP_BUILDERS,l.Feature.VIEW_PERMISSIONS,l.Feature.TRIGGER_AUTOMATION_RUN,l.Feature.VIEW_READONLY_COLUMNS,l.Feature.AI_CUSTOM_CONFIGS],[l.PlanType.PRO]:[l.Feature.USER_GROUPS,l.Feature.APP_BACKUPS],[l.PlanType.TEAM]:[l.Feature.USER_GROUPS,l.Feature.APP_BACKUPS],[l.PlanType.BUSINESS]:[l.Feature.USER_GROUPS,l.Feature.APP_BACKUPS,l.Feature.ENVIRONMENT_VARIABLES,l.Feature.AUDIT_LOGS,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.APP_BUILDERS,l.Feature.EXPANDED_PUBLIC_API,l.Feature.VIEW_PERMISSIONS],[l.PlanType.ENTERPRISE_BASIC]:[l.Feature.USER_GROUPS,l.Feature.APP_BACKUPS,l.Feature.ENVIRONMENT_VARIABLES,l.Feature.ENFORCEABLE_SSO,l.Feature.AUDIT_LOGS,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.OFFLINE,l.Feature.APP_BUILDERS,l.Feature.EXPANDED_PUBLIC_API,l.Feature.VIEW_PERMISSIONS,l.Feature.TRIGGER_AUTOMATION_RUN,l.Feature.SCIM,l.Feature.VIEW_READONLY_COLUMNS,l.Feature.AI_CUSTOM_CONFIGS],[l.PlanType.ENTERPRISE_BASIC_TRIAL]:[l.Feature.USER_GROUPS,l.Feature.APP_BACKUPS,l.Feature.ENVIRONMENT_VARIABLES,l.Feature.ENFORCEABLE_SSO,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.APP_BUILDERS,l.Feature.EXPANDED_PUBLIC_API,l.Feature.VIEW_PERMISSIONS,l.Feature.TRIGGER_AUTOMATION_RUN,l.Feature.SCIM,l.Feature.VIEW_READONLY_COLUMNS,l.Feature.AI_CUSTOM_CONFIGS],[l.PlanType.ENTERPRISE]:[l.Feature.USER_GROUPS,l.Feature.APP_BACKUPS,l.Feature.ENVIRONMENT_VARIABLES,l.Feature.ENFORCEABLE_SSO,l.Feature.AUDIT_LOGS,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.OFFLINE,l.Feature.APP_BUILDERS,l.Feature.EXPANDED_PUBLIC_API,l.Feature.VIEW_PERMISSIONS,l.Feature.TRIGGER_AUTOMATION_RUN,l.Feature.SCIM,l.Feature.VIEW_READONLY_COLUMNS,l.Feature.AI_CUSTOM_CONFIGS]},Ob={[l.PlanType.FREE]:[...Ee.CLOUD_FREE_LICENSE.features],[l.PlanType.PREMIUM]:[l.Feature.APP_BACKUPS,l.Feature.BRANDING,l.Feature.APP_BUILDERS,l.Feature.VIEW_PERMISSIONS],[l.PlanType.PREMIUM_PLUS]:[l.Feature.APP_BACKUPS,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.APP_BUILDERS,l.Feature.VIEW_PERMISSIONS,l.Feature.TRIGGER_AUTOMATION_RUN,l.Feature.VIEW_READONLY_COLUMNS,l.Feature.BUDIBASE_AI],[l.PlanType.PREMIUM_PLUS_TRIAL]:[l.Feature.APP_BACKUPS,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.APP_BUILDERS,l.Feature.VIEW_PERMISSIONS,l.Feature.TRIGGER_AUTOMATION_RUN,l.Feature.VIEW_READONLY_COLUMNS,l.Feature.BUDIBASE_AI],[l.PlanType.PRO]:[l.Feature.USER_GROUPS,l.Feature.APP_BACKUPS,l.Feature.BRANDING],[l.PlanType.TEAM]:[l.Feature.USER_GROUPS,l.Feature.APP_BACKUPS,l.Feature.BRANDING],[l.PlanType.BUSINESS]:[l.Feature.USER_GROUPS,l.Feature.APP_BACKUPS,l.Feature.ENVIRONMENT_VARIABLES,l.Feature.AUDIT_LOGS,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.APP_BUILDERS,l.Feature.EXPANDED_PUBLIC_API,l.Feature.VIEW_PERMISSIONS,l.Feature.BUDIBASE_AI],[l.PlanType.ENTERPRISE_BASIC]:[l.Feature.USER_GROUPS,l.Feature.APP_BACKUPS,l.Feature.ENVIRONMENT_VARIABLES,l.Feature.ENFORCEABLE_SSO,l.Feature.AUDIT_LOGS,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.OFFLINE,l.Feature.APP_BUILDERS,l.Feature.EXPANDED_PUBLIC_API,l.Feature.VIEW_PERMISSIONS,l.Feature.TRIGGER_AUTOMATION_RUN,l.Feature.SCIM,l.Feature.VIEW_READONLY_COLUMNS,l.Feature.AI_CUSTOM_CONFIGS,l.Feature.BUDIBASE_AI],[l.PlanType.ENTERPRISE_BASIC_TRIAL]:[l.Feature.USER_GROUPS,l.Feature.APP_BACKUPS,l.Feature.ENVIRONMENT_VARIABLES,l.Feature.ENFORCEABLE_SSO,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.APP_BUILDERS,l.Feature.EXPANDED_PUBLIC_API,l.Feature.VIEW_PERMISSIONS,l.Feature.TRIGGER_AUTOMATION_RUN,l.Feature.SCIM,l.Feature.VIEW_READONLY_COLUMNS,l.Feature.AI_CUSTOM_CONFIGS,l.Feature.BUDIBASE_AI],[l.PlanType.ENTERPRISE]:[l.Feature.USER_GROUPS,l.Feature.APP_BACKUPS,l.Feature.ENVIRONMENT_VARIABLES,l.Feature.ENFORCEABLE_SSO,l.Feature.AUDIT_LOGS,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.APP_BUILDERS,l.Feature.EXPANDED_PUBLIC_API,l.Feature.VIEW_PERMISSIONS,l.Feature.TRIGGER_AUTOMATION_RUN,l.Feature.SCIM,l.Feature.VIEW_READONLY_COLUMNS,l.Feature.AI_CUSTOM_CONFIGS,l.Feature.BUDIBASE_AI]};function po(e,t){let r=[];function n(a){let o=a[t];if(!o)throw new Error(`Features do not exist for planType=${t} and hosting=${e}`);return o}switch(e){case l.Hosting.SELF:r=n(Tb);break;case l.Hosting.CLOUD:r=n(Ob);break}return r}var Wn={};R(Wn,{UNLIMITED:()=>g,getQuotas:()=>co});var K=require("@budibase/types");var p=ut,Cu=Ee,g=-1,zr=e=>e*1e6,Pb={[K.PlanType.FREE]:{...Cu.CLOUD_FREE_LICENSE.quotas},[K.PlanType.PREMIUM]:{usage:{monthly:{...p.queries(g),...p.automations(1e3),...p.budibaseAICredits(0)},static:{...p.rows(1e4),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(0),...p.plugins(g),...p.customAIConfigurations(0)}},constant:{...p.automationLogRetentionDays(7),...p.appBackupRetentionDays(7)}},[K.PlanType.PREMIUM_PLUS]:{usage:{monthly:{...p.queries(g),...p.automations(5e3),...p.budibaseAICredits(zr(2))},static:{...p.rows(25e3),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(0),...p.plugins(g),...p.customAIConfigurations(1)}},constant:{...p.automationLogRetentionDays(30),...p.appBackupRetentionDays(30)}},[K.PlanType.PREMIUM_PLUS_TRIAL]:{usage:{monthly:{...p.queries(g),...p.automations(5e3),...p.budibaseAICredits(zr(2))},static:{...p.rows(25e3),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(0),...p.plugins(g),...p.customAIConfigurations(1)}},constant:{...p.automationLogRetentionDays(30),...p.appBackupRetentionDays(30)}},[K.PlanType.PRO]:{usage:{monthly:{...p.queries(g),...p.automations(1e3),...p.budibaseAICredits(0)},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(5),...p.plugins(g),...p.customAIConfigurations(0)}},constant:{...p.automationLogRetentionDays(7),...p.appBackupRetentionDays(7)}},[K.PlanType.TEAM]:{usage:{monthly:{...p.queries(g),...p.automations(5e3),...p.budibaseAICredits(0)},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(10),...p.plugins(g),...p.customAIConfigurations(0)}},constant:{...p.automationLogRetentionDays(30),...p.appBackupRetentionDays(90)}},[K.PlanType.BUSINESS]:{usage:{monthly:{...p.queries(g),...p.automations(1e4),...p.budibaseAICredits(0)},static:{...p.rows(5e4),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(50),...p.plugins(g),...p.customAIConfigurations(0)}},constant:{...p.automationLogRetentionDays(365),...p.appBackupRetentionDays(365)}},[K.PlanType.ENTERPRISE_BASIC]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(zr(4))},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(g),...p.plugins(g),...p.customAIConfigurations(g)}},constant:{...p.automationLogRetentionDays(g),...p.appBackupRetentionDays(g)}},[K.PlanType.ENTERPRISE_BASIC_TRIAL]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(zr(4))},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(g),...p.plugins(g),...p.customAIConfigurations(g)}},constant:{...p.automationLogRetentionDays(15),...p.appBackupRetentionDays(15)}},[K.PlanType.ENTERPRISE]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(zr(4))},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(g),...p.plugins(g),...p.customAIConfigurations(g)}},constant:{...p.automationLogRetentionDays(g),...p.appBackupRetentionDays(g)}}},qb={[K.PlanType.FREE]:{...Cu.SELF_FREE_LICENSE.quotas},[K.PlanType.PREMIUM]:void 0,[K.PlanType.PREMIUM_PLUS]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(0)},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(0),...p.plugins(g),...p.customAIConfigurations(1)}},constant:{...p.automationLogRetentionDays(30),...p.appBackupRetentionDays(30)}},[K.PlanType.PREMIUM_PLUS_TRIAL]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(0)},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(0),...p.plugins(g),...p.customAIConfigurations(1)}},constant:{...p.automationLogRetentionDays(30),...p.appBackupRetentionDays(30)}},[K.PlanType.PRO]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(0)},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(5),...p.plugins(g),...p.customAIConfigurations(0)}},constant:{...p.automationLogRetentionDays(7),...p.appBackupRetentionDays(7)}},[K.PlanType.TEAM]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(0)},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(10),...p.plugins(g),...p.customAIConfigurations(0)}},constant:{...p.automationLogRetentionDays(30),...p.appBackupRetentionDays(90)}},[K.PlanType.BUSINESS]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(0)},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(50),...p.plugins(g),...p.customAIConfigurations(0)}},constant:{...p.automationLogRetentionDays(90),...p.appBackupRetentionDays(365)}},[K.PlanType.ENTERPRISE_BASIC]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(0)},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(g),...p.plugins(g),...p.customAIConfigurations(g)}},constant:{...p.automationLogRetentionDays(g),...p.appBackupRetentionDays(g)}},[K.PlanType.ENTERPRISE_BASIC_TRIAL]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(0)},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(g),...p.plugins(g),...p.customAIConfigurations(g)}},constant:{...p.automationLogRetentionDays(15),...p.appBackupRetentionDays(15)}},[K.PlanType.ENTERPRISE]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(0)},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(g),...p.plugins(g),...p.customAIConfigurations(g)}},constant:{...p.automationLogRetentionDays(g),...p.appBackupRetentionDays(g)}}};function co(e,t){let r;function n(a){let o=a[t];if(!o)throw new Error(`Quotas do not exist for planType=${t} and hosting=${e}`);return o}switch(e){case K.Hosting.SELF:r=n(qb);break;case K.Hosting.CLOUD:r=n(Pb);break}return JSON.parse(JSON.stringify(r))}var Zt={};R(Zt,{appExists:()=>Cb,encoding:()=>Xt});var Uu=require("@budibase/backend-core");async function Cb(e){return(await Uu.db.getAllApps({all:!0,idsOnly:!0})).includes(e)}var Xt={};R(Xt,{base64ToObject:()=>Lb,objectToBase64:()=>Ub});function Ub(e){let t=JSON.stringify(e);return Buffer.from(t).toString("base64")}function Lb(e){let t=Buffer.from(e,"base64").toString();return JSON.parse(t)}var yd=require("@budibase/types"),dr=require("@budibase/backend-core"),hd=N(Hc()),Ad=N(Go());async function px(e){await Ue.save({offlineLicenseToken:e}),await Lt()}async function cx(){await Ue.save({offlineLicenseToken:void 0}),await Lt()}async function Id(){return(await Ue.get()).offlineLicenseToken}async function ko(){let t=(await dr.installation.getInstall()).installId,r=dr.context.getTenantId(),n=await dr.events.identification.getUniqueTenantId(r);return{installId:t,tenantId:n}}async function lx(){let e=await ko();return Xt.objectToBase64(e)}function dx(e){return Xt.base64ToObject(e)}function bd(e){let t=Date.now(),r=new Date(e.expireAt).getTime();if(t>r)throw new Error(`Offline license has expired. expireAt=${e.expireAt}`)}async function Sd(e){let t=await ko();if(e.identifier.installId!==t.installId||e.identifier.tenantId!==t.tenantId)throw new Error("Invalid offline license")}function wd(e){let t=e.plan.type,r=yd.Hosting.SELF,n=po(r,t),a=co(r,t);return e.features=(0,hd.default)(e.features,n),e.quotas=(0,Ad.default)(e.quotas,a),e}async function Fo(){try{let e=await Id();if(e){let t=await Yr(e);return bd(t),await Sd(t),wd(t)}}catch(e){console.error("Error retrieving offline license",e)}}var yn={};R(yn,{deleteDevLicense:()=>hx,getOfflineLicense:()=>mx,writeDevLicenseToDisk:()=>yx});var vd=require("@budibase/backend-core"),$o=require("path"),Ed=require("os"),Dt=N(require("fs"));var fx=vd.env.isTest()?".budibase-test":".budibase",Qo=(0,$o.join)((0,Ed.tmpdir)(),fx),gx="dev_license.txt",mn=(0,$o.join)(Qo,gx);if(!Dt.default.existsSync(Qo))try{Dt.default.mkdirSync(Qo)}catch{}function mx(){try{if(Dt.default.existsSync(mn)){let e=Dt.default.readFileSync(mn,{encoding:"utf-8"});return Yr(e)}}catch(e){console.error("Error retrieving offline license from disk",e)}}function yx(e){console.log(`Writing license to: ${mn}`),Dt.default.writeFileSync(mn,e,{encoding:"utf-8"})}function hx(){Dt.default.rmSync(mn,{force:!0})}var Wo=async()=>{if(jo.env.OFFLINE_MODE)return Fo();let e=await Jt();return e||(e=yn.getOfflineLicense()),e},Vo=()=>jo.env.SELF_HOSTED?Ee.SELF_FREE_LICENSE:Ee.CLOUD_FREE_LICENSE;var Ko={};R(Ko,{activateLicenseKey:()=>Ax,deleteLicenseKey:()=>bx,getLicenseKey:()=>Ix});async function Ax(e){await io(e),await Ue.save({licenseKey:e}),await Lt()}async function Ix(){return(await Ue.get()).licenseKey}async function bx(){await Ue.save({licenseKey:void 0}),await Lt()}var hn=require("@budibase/backend-core"),ia=N(require("dd-trace")),_d=3600,Lt=async()=>{await Td(),await xd()},Rd=async(e,t)=>{let{populateLicense:r=Wo,populateFreeLicense:n=Vo}=t||{};return await ia.default.trace("getCachedLicense",async a=>{let o=hn.tenancy.getTenantId(),i=await Va(),s=await i.get(o);return a.addTags({tenantId:o,foundInCache:!!s}),s||(s=await ia.default.trace("populateLicense",async()=>await r(o)),a.addTags({populatedLicense:!!s}),s||(s=ia.default.trace("populateFreeLicense",()=>n(e,o)),a.addTags({populatedFreeLicense:!!s})),s.refreshedAt=new Date().toISOString(),a.addTags({refreshedAt:s.refreshedAt,expirySeconds:_d}),await i.store(o,s,_d),s)})};hn.env.isJest()&&(Rd=jest.fn());var xd=Rd,Td=async()=>{let e=hn.tenancy.getTenantId();await(await Va()).delete(e)};async function ge(e,t){Array.isArray(e)||(e=[e]),t||(t=await Qe.getCachedLicense());for(let r of e)if(!t?.features.includes(r))return!1;return!0}async function ua(e,t){if(!await ge(e,t))throw new pt.FeatureDisabledError(`${e} is not currently enabled`,e)}async function Yo(e,t){if(!await ge(e,t)){let r=e.join(", ");throw new pt.FeatureDisabledError(`${r} are not currently enabled`,r)}}function Re(e){return async(...t)=>(await ua(fe.Feature.APP_BACKUPS),e(...t))}async function Ho(){return ge(fe.Feature.APP_BACKUPS)}async function zo(){return ge(fe.Feature.BRANDING)}async function Od(){return ge(fe.Feature.ENFORCEABLE_SSO)}async function wx(){return ge(fe.Feature.SYNC_AUTOMATIONS)}async function vx(){return ge(fe.Feature.TRIGGER_AUTOMATION_RUN)}async function Bt(){return ge(fe.Feature.APP_BUILDERS)}async function pa(){return ge(fe.Feature.AUDIT_LOGS)}async function Jo(){return ge(fe.Feature.USER_GROUPS)}async function ct(){return ge(fe.Feature.EXPANDED_PUBLIC_API)}async function Ex(e){if(pt.env.ENABLE_SSO_MAINTENANCE_MODE||!await Od())return!1;let r;return e?.config?r=e.config:r=await pt.configs.getSettingsConfig(),!!r.isSSOEnforced}var Xo=async()=>{let e=fe.Feature.SCIM,t=await ge(e),r=await pt.configs.getSCIMConfig();if(!t||!r?.enabled)throw new pt.FeatureDisabledError(`${e} is not currently enabled`,e);return!0};async function _x(){return ge(fe.Feature.VIEW_PERMISSIONS)}async function Rx(){return ge(fe.Feature.VIEW_READONLY_COLUMNS)}async function An(){return ge(fe.Feature.BUDIBASE_AI)}async function xx(){return ge(fe.Feature.AI_CUSTOM_CONFIGS)}var Tx={faviconUrl:void 0,faviconUrlEtag:void 0,emailBrandingEnabled:!0,testimonialsEnabled:!0,platformTitle:void 0,loginHeading:void 0,loginButton:void 0,metaDescription:void 0,metaImageUrl:void 0,metaTitle:void 0};async function Ox(e){return await zo()?{faviconUrl:e.faviconUrl,faviconUrlEtag:e.faviconUrlEtag,emailBrandingEnabled:e.emailBrandingEnabled,testimonialsEnabled:e.testimonialsEnabled,platformTitle:e.platformTitle,loginHeading:e.loginHeading,loginButton:e.loginButton,metaDescription:e.metaDescription,metaImageUrl:e.metaImageUrl,metaTitle:e.metaTitle}:Tx}var la={};R(la,{enrichAIConfig:()=>Zo});var Px="budibase_ai";async function Zo(e){return await An()&&(e.config[Px]={provider:"OpenAI",active:!0,isDefault:Object.keys(e.config).every(t=>!e.config[t].isDefault),defaultModel:process.env.BUDIBASE_AI_DEFAULT_MODEL||"gpt-4o-mini",apiKey:process.env.OPENAI_API_KEY,name:"Budibase AI"}),e}var Ve={};R(Ve,{addApp:()=>Dx,addAutomation:()=>Fx,addCustomAIConfig:()=>Qx,addGroup:()=>ts,addPlugin:()=>ns,addRow:()=>Nx,addRows:()=>Gx,addUsers:()=>fa,bustCache:()=>ru,decrement:()=>je,decrementMany:()=>Mt,getCurrentUsageValues:()=>su,getLicensedQuota:()=>qd,getQuotaUsage:()=>Ot,increment:()=>Te,incrementBudibaseAICredits:()=>ss,incrementMany:()=>Nt,removeApp:()=>Bx,removeCustomAIConfig:()=>$x,removeCustomAIConfigs:()=>jx,removeGroup:()=>rs,removePlugin:()=>as,removeRow:()=>Mx,removeRows:()=>kx,removeUsers:()=>yr,set:()=>es,setAllUsage:()=>Za,setAppUsageValue:()=>Xa,setUsage:()=>nu,setUsagePerApp:()=>au,updatePluginCount:()=>os,updateUsage:()=>fr,usageLimitIsExceeded:()=>Lx,utils:()=>Pr});var ce=require("@budibase/types");var Be=require("@budibase/backend-core");var Te=(e,t,r)=>Pd({change:1,name:e,type:t,opts:r}),Nt=e=>Pd(e),Pd=async e=>{let t=Array.isArray(e)?e:[e];await fr(t.map(n=>({usageChange:n.change,name:n.name,type:n.type,opts:{dryRun:!0,suppressErrorLog:n.opts?.suppressErrorLog,id:n.opts?.id}})));let r=[];for(let n of t){let a=n.opts?.fn;a&&r.push(await a())}return await fr(t.map(n=>({usageChange:n.change,name:n.name,type:n.type,opts:{dryRun:!1,valueFn:n.opts?.valueFn,suppressErrorLog:n.opts?.suppressErrorLog,id:n.opts?.id}}))),r[0]},je=(e,t,r={})=>fr({usageChange:-1,name:e,type:t,opts:r}),Mt=e=>{let t=Array.isArray(e)?e:[e];return fr(t.map(r=>({usageChange:-r.change,name:r.name,type:r.type,opts:r.opts})))},es=async(e,t,r)=>Xe.setUsage(r,e,t),qx=(e,t,r)=>{if(e==ce.QuotaUsageType.STATIC){let n=r.usageQuota.triggers;return n?n[t]||{}:{}}else{let n=Xe.utils.getCurrentMonthString(),a=r.monthly[n].triggers;return a?a[t]||{}:{}}},Cx=async(e,t,r,n)=>{try{await Be.locks.doWithLock({type:ce.LockType.TRY_ONCE,name:ce.LockName.TRIGGER_QUOTA,resource:e,ttl:1e4},async()=>{let a={percentage:r,name:t.name};n&&(a.resetDate=n),await At.triggerQuota(a)})}catch(a){Be.logging.logAlert("Error triggering quota",a)}},Ux=async(e,t,r,n)=>{let a=await Ot(),o=e===ce.QuotaUsageType.MONTHLY?a.quotaReset:void 0,i=await qx(e,t,a),s=n.triggers,c=r/n.value*100;c>100&&(c=100);for(let[f,d]of s.entries())if(c>=d&&n.value!==ut.UNLIMITED){if(!i[d]){i[d]=new Date().toISOString();let y=s[f+1]||100;(!(c>=y)||c===d)&&await Cx(t,n,c,o)}}else i[d]=void 0;return i},fr=async e=>{let t=Array.isArray(e)?e:[e],r=null,n,a=[],o={},i={},s={},c={};for(let d of t){try{r=Be.context.getAppId()}catch{}if(ce.APP_QUOTA_NAMES.includes(d.name)&&!r)throw new Error("App context required for quota update");try{n=await qd(ce.QuotaType.USAGE,d.name,d.type),a.push(n);let{total:y,app:v,breakdown:C}=await Xe.getCurrentUsageValues(d.type,d.name,d.opts?.id);y+=d.usageChange,v!=null&&(v+=d.usageChange),C!=null&&(C+=d.usageChange);let D={};if(d.opts?.dryRun||(D=await Ux(d.type,d.name,y,n),c={...c,[d.name]:D}),n.value!==ut.UNLIMITED&&y>n.value&&d.usageChange>0)throw new Be.UsageLimitError(`Licensed ${n.name} of ${n.value} has been exceeded`,n.name);if(y=Math.max(0,y),v&&(v=Math.max(0,v)),C&&(C=Math.max(0,C),s={...s,[d.name]:C}),!d.opts?.dryRun){let L=d.opts?.valueFn;L&&(y=await L(),v=y),o={...o,[d.name]:y},i={...i,[d.name]:v}}}catch(y){throw d.opts?.suppressErrorLog||console.error(`Error updating usage quotas for ${d.name}`,y),y}}let f=t.filter(d=>!d.opts?.dryRun).map(d=>({name:d.name,type:d.type,values:{total:o[d.name],app:i[d.name],breakdown:s[d.name],triggers:c[d.name]},opts:d.opts}));f.length>0&&await Xe.setAllUsage(f)},qd=async(e,t,r)=>{let n=await Qe.getCachedLicense();if(!n){let a=Be.tenancy.getTenantId();throw new Error("License not found for tenant id "+a)}if(r&&(0,ce.isStaticQuota)(e,r,t))return n.quotas[e][r][t];if(r&&(0,ce.isMonthlyQuota)(e,r,t))return n.quotas[e][r][t];if((0,ce.isConstantQuota)(e,t))return n.quotas[e][t];throw new Error("Invalid quota type")},Lx=async(e,t)=>{try{return await fr({usageChange:1,name:e,type:t,opts:{dryRun:!0}}),!1}catch(r){if(r.code===Be.ErrorCode.USAGE_LIMIT_EXCEEDED)return!0;throw r}};var gr=require("@budibase/types"),Cd=require("@budibase/backend-core"),Ud=async()=>{let e=await Cd.db.getAllApps({dev:!0});return e?e.length:0},Dx=async(e,{appId:t}={})=>Te(gr.StaticQuotaName.APPS,gr.QuotaUsageType.STATIC,{fn:e,valueFn:Ud,id:t}),Bx=async({appId:e}={})=>je(gr.StaticQuotaName.APPS,gr.QuotaUsageType.STATIC,{valueFn:Ud,id:e});var rt=require("@budibase/types"),Nx=async(e,{tableId:t}={})=>Te(rt.StaticQuotaName.ROWS,rt.QuotaUsageType.STATIC,{fn:e,id:t}),Mx=async({tableId:e}={})=>je(rt.StaticQuotaName.ROWS,rt.QuotaUsageType.STATIC,{id:e}),Gx=async(e,t,{tableId:r}={})=>Nt({change:e,name:rt.StaticQuotaName.ROWS,type:rt.QuotaUsageType.STATIC,opts:{fn:t,id:r}}),kx=async(e,{tableId:t}={})=>Mt({change:e,name:rt.StaticQuotaName.ROWS,type:rt.QuotaUsageType.STATIC,opts:{id:t}});var da=require("@budibase/types"),Fx=async(e,{automationId:t}={})=>Te(da.MonthlyQuotaName.AUTOMATIONS,da.QuotaUsageType.MONTHLY,{fn:e,id:t});var mr=require("@budibase/types"),ts=async e=>Te(mr.StaticQuotaName.USER_GROUPS,mr.QuotaUsageType.STATIC,{fn:e}),rs=async()=>je(mr.StaticQuotaName.USER_GROUPS,mr.QuotaUsageType.STATIC);var St=require("@budibase/types"),ns=async e=>Te(St.StaticQuotaName.PLUGINS,St.QuotaUsageType.STATIC,{fn:e}),as=async()=>je(St.StaticQuotaName.PLUGINS,St.QuotaUsageType.STATIC),os=async e=>es(St.StaticQuotaName.PLUGINS,St.QuotaUsageType.STATIC,e);var nt=require("@budibase/types"),In=require("@budibase/backend-core");var fa=async(e,t,r)=>{let n=[{change:e,name:nt.StaticQuotaName.USERS,type:nt.QuotaUsageType.STATIC,opts:{fn:r,valueFn:In.users.getUserCount}}];t>0&&n.push({change:t,name:nt.StaticQuotaName.CREATORS,type:nt.QuotaUsageType.STATIC,opts:{valueFn:In.users.getCreatorCount}});let a=await Nt(n);return await Jt(),a},yr=async(e,t)=>{let r=[{change:e,name:nt.StaticQuotaName.USERS,type:nt.QuotaUsageType.STATIC,opts:{valueFn:In.users.getUserCount}}];t>0&&r.push({change:t,name:nt.StaticQuotaName.CREATORS,type:nt.QuotaUsageType.STATIC,opts:{valueFn:In.users.getCreatorCount}}),await Mt(r),await Jt()};var We=require("@budibase/types"),ss=async e=>Nt({change:e,name:We.MonthlyQuotaName.BUDIBASE_AI_CREDITS,type:We.QuotaUsageType.MONTHLY}),Qx=async()=>Te(We.StaticQuotaName.AI_CUSTOM_CONFIGS,We.QuotaUsageType.STATIC),$x=async()=>je(We.StaticQuotaName.AI_CUSTOM_CONFIGS,We.QuotaUsageType.STATIC),jx=async e=>Mt({change:e,name:We.StaticQuotaName.AI_CUSTOM_CONFIGS,type:We.QuotaUsageType.STATIC});var lt={};R(lt,{addAppBuilder:()=>Hx,db:()=>at,removeAppBuilder:()=>zx});var Sn=require("@budibase/backend-core");var J={};R(J,{addAppBuilder:()=>ls,addUsers:()=>us,adjustGroupCreatorsQuotas:()=>Yx,cleanupApp:()=>Kx,enrichUserRolesFromGroups:()=>Vx,fetch:()=>bn,get:()=>kt,getBulk:()=>kd,getGroupBuilderAppIds:()=>Gd,getGroupRoleId:()=>Wx,remove:()=>is,removeAppBuilder:()=>ds,removeUsers:()=>ps,save:()=>hr,updateGroupApps:()=>cs});var q=require("@budibase/backend-core");var Ld=require("@budibase/backend-core"),ga=class extends Ld.HTTPError{constructor(t){super(`Group name "${t}" is unavailable`,409)}};async function Nd(e,t){try{let r=[];for(let s of e)if(s.roles){let c=s.roles[q.db.getProdAppID(t)];c&&r.push(c)}let n=await Promise.all(r.map(async s=>({[s]:await q.roles.roleToNumber(s)}))),a,o,i={};n.forEach(s=>{let[c,f]=Object.entries(s)[0];i[c]={roleId:c,roleNum:f}});for(let{roleId:s,roleNum:c}of Object.values(i))(o===void 0||c>o)&&(o=c,a=s);return a}catch(r){throw q.logging.logAlert(`Error finding higest role for ${e.length} on app ${t}`,r),r}}async function Md(e,t){return t?t=t.filter(r=>e.includes(r._id)):t=await V.getBulk(e,{enriched:!1}),t}async function Gd(e,t){if(!e.userGroups)return[];let r=await Md(e.userGroups,t?.groups),n=t?.appId?q.db.getProdAppID(t?.appId):null,a=[];for(let o of r){let i=o.builder?.apps;n&&i?.includes(n)?a.push(n):n||(a=a.concat(i||[]))}return[...new Set(a)]}async function Wx(e,t,r){if(!e.userGroups)return null;let n=await Md(e.userGroups,r?.groups),a=q.db.getProdAppID(t);return e.roles?.[a]?e.roles[a]:(n=n.filter(o=>o?.roles?Object.keys(o.roles).includes(a):!1),await Nd(n,t))}async function Vx(e){if(!e||!e.userGroups)return e;let t=await kd(e.userGroups,{enriched:!1}),r=[];for(let a of t)a?.roles&&(r=r.concat(Object.keys(a.roles)));r=[...new Set(r)];for(let a of r)await q.context.doInAppContext(a,async()=>{if(e.roles[a])return;let o=await Nd(t,a);o&&(e.roles[a]=o)});let n=await Gd(e,{groups:t});if(n.length&&!e.builder?.global){let a=e.builder?.apps||[];e.builder={apps:a.concat(n)}}return e}async function bn(){return await V.fetch()}async function kt(e){return await V.get(e)}async function kd(e,t={enriched:!0}){return await V.getBulk(e,t)}async function Dd(e){if(await V.getByName(e))throw new ga(e)}async function Bd(e){let t=await V.getGroupUsers(e._id);if(!t.length)return 0;let r=q.tenancy.getGlobalDB(),n=await Promise.all(t.map(o=>r.get(o._id)));return(await Promise.all(n.map(q.userUtils.isCreator))).filter(o=>!!o).length}async function hr(e){let t=[],r=!e._id,n=0;if(delete e.users,!e._id)e._id=V.generateUserGroupID(),await Dd(e.name),t.push(q.events.group.created(e));else{let o=await V.get(e._id);if(o.name!==e.name&&await Dd(e.name),t.push(q.events.group.updated(e)),JSON.stringify(o.roles)!==JSON.stringify(e.roles)){let i=o.users?.length||0,s=0;i>0&&(s=await Bd(o)),Object.values(e.roles).includes(q.roles.BUILTIN_ROLE_IDS.ADMIN)?n=i-s:n=-i,t.push(q.events.group.permissionsEdited(e))}}await Promise.all(t);let a=()=>V.save(e);if(r)return await ts(a);{let o=await a();if(n>0)await fa(0,n);else if(n<0){let i=await Bd(e),s=Math.abs(n)-i;s>0&&await yr(0,s)}return o}}async function is(e,t){let r;try{r=await V.get(e)}catch{throw new Error("Group not found")}let n=Object.values(r.roles||{}).includes(q.roles.BUILTIN_ROLE_IDS.ADMIN),a=()=>{};if(n){let i=q.tenancy.getGlobalDB(),s=await V.getGroupUsers(e),f=(await Promise.all(s.map(v=>i.get(v._id)))).map(v=>({...v,userGroups:v.userGroups.filter(C=>C!==e)})),m=(await Promise.all(f.map(q.userUtils.isCreator))).filter(v=>!!v).length,y=s.length-m;y&&(a=()=>yr(0,y))}let o=await V.destroy(e,t);return await q.events.group.deleted(r),await rs(),await a(),o}async function us(e,t){let r=await V.get(e),n=await q.users.bulkGetGlobalUsersById(t),a=[];for(let c of n)c.userGroups||(c.userGroups=[]),c.userGroups.includes(e)||a.push(c);if(!a.length)return a;let o=a.map(c=>({...c,userGroups:[...c?.userGroups||[],e]}));if(await q.users.bulkUpdateGlobalUsers(o),Object.values(r.roles||{}).includes(q.roles.BUILTIN_ROLE_IDS.ADMIN)){let f=(await Promise.all(a.map(q.userUtils.isCreator))).filter(m=>!!m).length,d=a.length-f;d&&await fa(0,d)}let s=[];for(let c of t)s.push(q.cache.user.invalidateUser(c));return await Promise.all(s),await q.events.group.usersAdded(o.length,r),o}async function ps(e,t){let r=await V.get(e),n=await q.users.bulkGetGlobalUsersById(t),a=[];for(let s of n){if(!s.userGroups||!s.userGroups.includes(e))continue;let c=s.userGroups.indexOf(e);s.userGroups.splice(c,1),a.push(s)}if(await q.users.bulkUpdateGlobalUsers(a),Object.values(r.roles||{}).includes(q.roles.BUILTIN_ROLE_IDS.ADMIN)){let c=(await Promise.all(a.map(q.userUtils.isCreator))).filter(d=>!!d).length,f=a.length-c;f&&await yr(0,f)}let i=[];for(let s of t)i.push(q.cache.user.invalidateUser(s));return await Promise.all(i),a.length&&await q.events.group.usersDeleted(a.length,r),a}async function cs(e,t){let r=await kt(e);if(r.roles||(r.roles={}),t.appsToAdd)for(let n of t.appsToAdd)r.roles[n.appId]=n.roleId;if(t.appsToRemove)for(let n of t.appsToRemove)delete r.roles[n.appId];return await hr(r)}async function Kx(e){let t=await bn(),r=[];for(let n of t)!n.roles||!n.roles[e]||(delete n.roles[e],r.push(n));return await V.bulkSave(r)}async function ls(e,t){if(!await Bt())throw new Error("Feature not enabled, please check license");let r=q.db.getProdAppID(t),n=await kt(e);n.builder??={apps:[]},n.builder.apps.includes(t)||(n.builder.apps.push(r),await hr(n))}async function ds(e,t){if(!await Bt())throw new Error("Feature not enabled, please check license");let r=q.db.getProdAppID(t),n=await kt(e);n.builder?.apps.includes(t)&&(n.builder.apps=n.builder.apps.filter(a=>a!==r),await hr(n))}async function Yx(){if(!await Jo()){let e=q.tenancy.getGlobalDB(),r=(await bn()||[]).filter(n=>Object.values(n?.roles||{}).includes(q.roles.BUILTIN_ROLE_IDS.ADMIN));for(let n of r){let a=await V.getGroupUsers(n._id),i=(await Promise.all(a.map(d=>e.get(d._id)))).map(d=>({...d,userGroups:d.userGroups.filter(m=>m!==n._id)})),c=(await Promise.all(i.map(q.userUtils.isCreator))).filter(d=>!!d).length,f=a.length-c;await V.save({...n,roles:{}}),f&&await yr(0,f)}}}Sn.users.UserDB.init(Ve,J,xe);var at=Sn.users.UserDB;async function Hx(e,t){if(!await Bt())throw new Error("Feature not enabled, please check license");await Sn.users.addAppBuilder(e,t)}async function zx(e,t){if(!await Bt())throw new Error("Feature not enabled, please check license");await Sn.users.removeAppBuilder(e,t)}var ya={};R(ya,{logs:()=>bs});var bs={};R(bs,{logSearch:()=>oT,oldestLogDate:()=>Kd,storeLog:()=>sT});var Vd=require("@budibase/types"),ma=require("@budibase/backend-core");var wt=require("@budibase/types");var pe=require("@budibase/backend-core");var Fd=require("@budibase/backend-core");async function Qd(e,t){let r,n=5,a=!1,o,i=!0;for(;n>0;n--)try{i?o=await e():o=await exports.randomDelay(e),a=!0;break}catch(s){r=s}return a||Fd.logging.logWarn(`Failed to backoff: ${t}`,r),o}var{SEPARATOR:dt,UNICODE_MAX:Jx,DocumentType:$d,AutomationViewMode:fs,ViewName:Xx,getQueryIndex:Zx}=pe.db,eT=new Date(0).toISOString(),tT=100,gs=async()=>Fn(wt.ConstantQuotaName.AUTOMATION_LOG_RETENTION_DAYS);function jd(e,t,{status:r,automationId:n}={},a={}){let o=n?`${n}${dt}`:"",i=r?`${r}${dt}`:"",s;return r&&n?s=`${fs.ALL}${dt}${i}${o}`:r?s=`${fs.STATUS}${dt}${i}`:n?s=`${fs.AUTOMATION}${dt}${o}`:s=`${$d.AUTOMATION_LOG}${dt}`,{...a,descending:!0,startkey:`${s}${t}${Jx}`,endkey:`${s}${e}`}}function ms(e){let t=wt.AutomationStatus.SUCCESS,r=!0;for(let n of e.steps){let a=n.outputs?.status?.toLowerCase(),o=a==="stopped_error";if(r&&!o){r=!1;continue}if(o){t=wt.AutomationStatus.STOPPED_ERROR;break}else if(n.outputs?.success){if(a==="stopped"){t=wt.AutomationStatus.STOPPED;break}}else{t=wt.AutomationStatus.ERROR;break}}return t}function rT(e,t,r){return`${$d.AUTOMATION_LOG}${dt}${e}${dt}${r}${dt}${t}`}async function ys(e,t,r={docs:!0}){let n=pe.context.getProdAppDB();await n.exists()||(n=pe.context.getDevAppDB());let a={status:r.status},o=r?.limit?r.limit:r?.paginate?9+1:void 0,i=jd(e,t,a,{include_docs:r.docs,limit:o});r?.page&&(i.startkey=r.page);let s=await n.allDocs(i);return Cr(s,{paginate:r?.paginate,pageSize:9})}async function hs(e,t,r={}){let n=pe.context.getProdAppDB();await n.exists()||(n=pe.context.getDevAppDB());let a;try{let o={automationId:r?.automationId,status:r?.status},i=jd(e,t,o,{include_docs:!0,limit:9+1});r?.page&&(i.startkey=r.page),a=await n.query(Zx(Xx.AUTOMATION_LOGS),i)}catch(o){if(o!=null&&(o.name==="not_found"||o.error==="not_found"))return await hu(),hs(e,t,r);throw o}return Cr(a,{paginate:!0,pageSize:9})}async function Wd(e,t){let r=pe.context.getProdAppDB(),n=e._id,a=e.name,o=ms(t),i=new Date().toISOString(),s=rT(i,o,n),c={...t,automationId:n,status:o,automationName:a,createdAt:i,_id:s};return await r.put(c),s}async function As(e,{clearing:t}={clearing:!1}){let r=pe.context.getProdAppDB();await Qd(async()=>{let n=await r.get(pe.db.DocumentType.APP_METADATA);for(let a of e){let o=a.split(pe.db.SEPARATOR),i=`${o[o.length-3]}${pe.db.SEPARATOR}${o[o.length-2]}`,s={};n.automationErrors&&(s=n.automationErrors),Array.isArray(s[i])||(s[i]=[]);let c=s[i].indexOf(a);t&&c!==-1?s[i].splice(c,1):s[i].push(a),s[i].length===0&&delete s[i],n.automationErrors=s}await r.put(n),await pe.cache.app.invalidateAppMetadata(n.appId,n)},"Failed to update app metadata with automation log error")}async function nT(){let e=await gs();try{return await ys(eT,e,{docs:!1,paginate:!1,limit:tT})}catch{return{data:[],hasNextPage:!1}}}async function Is(){let e=pe.context.getProdAppDB();try{let t=await nT();if(!t.data||t.data.length===0)return;let r=t.data.map(a=>({_id:a.id,_rev:a.value.rev,_deleted:!0})),n=t.data.filter(a=>{let o=a.id.split(pe.db.SEPARATOR);return o[o.length-1]===wt.AutomationStatus.ERROR}).map(a=>a.id);await e.bulkDocs(r),n.length&&await As(n,{clearing:!0})}catch(t){pe.logging.logAlert(`Failed to cleanup automation log history - Database "${e.name}"`,t)}}var Kd=gs;async function aT(e,t,r,n){let a,o=new Date().toISOString(),i=await Kd();return(!e||e<i)&&(e=i),r||t?a=await hs(e,o,{automationId:r,status:t,page:n}):a=await ys(e,o,{status:t,page:n,docs:!0,paginate:!0}),a}async function oT(e){return await Is(),await aT(e.startDate,e.status,e.automationId,e.page)}async function sT(e,t){if(!ma.db.isProdAppID(ma.context.getAppId()))return;let r=ms(t),n=await Wd(e,t);r===Vd.AutomationStatus.ERROR&&await As([n]),await Is()}var ha={};R(ha,{checkPluginQuotas:()=>pT,deletePlugin:()=>uT,storePlugin:()=>iT});var Jd=require("@budibase/types"),oe=require("@budibase/backend-core");var Yd=N(require("fs")),Hd=require("path");function zd(e,t){return Yd.default.readFileSync((0,Hd.join)(e,t),"utf8")}async function iT(metadata,directory,source){let db=oe.tenancy.getGlobalDB(),version=metadata.package.version,name=metadata.package.name,description=metadata.package.description,hash=metadata.schema.hash,bucketPath=oe.objectStore.getPluginS3Dir(name),files=await oe.objectStore.uploadDirectory(oe.objectStore.ObjectStoreBuckets.PLUGINS,directory,bucketPath),jsFile=files.find(e=>e.name.endsWith(".js")),iconFile=files.find(e=>e.name.endsWith(".svg"));if(!jsFile)throw new Error("Plugin missing .js file.");if(metadata.schema.type===Jd.PluginType.DATASOURCE){let js=zd(directory,jsFile.name);try{eval(js)}catch(e){let t=e?.message?e.message:JSON.stringify(e);throw new Error(`JS invalid: ${t}`)}}let iconFileName=iconFile?iconFile.name:null,pluginId=oe.db.generatePluginID(name),rev;try{rev=(await db.get(pluginId))._rev}catch(e){rev=void 0}let doc={_id:pluginId,_rev:rev,...metadata,name,version,hash,description,source};iconFileName&&(doc.iconFileName=iconFileName),source&&(doc={...doc,source});let write=async()=>{let e=await db.put(doc);return await oe.events.plugin.imported(doc),{...doc,_rev:e.rev}};return rev?await write():await ns(write)}async function uT(e){let t=oe.tenancy.getGlobalDB();try{let r=await t.get(e),n=oe.objectStore.getPluginS3Dir(r.name);await oe.objectStore.deleteFolder(oe.objectStore.ObjectStoreBuckets.PLUGINS,n),await t.remove(e,r._rev),await oe.events.plugin.deleted(r),await as()}catch(r){let n=r?.message?r?.message:r;throw new Error(`Failed to delete plugin: ${n}`)}}async function pT(){let e=oe.tenancy.getGlobalDB();try{let r=(await e.allDocs(oe.db.getPluginParams())).rows.length;console.log(`Syncing plugin count: ${r}`),await os(r)}catch(t){oe.logging.logAlert("Unable to retrieve plugins for quota check",t)}}var ot={};R(ot,{fetch:()=>lT,fetchValues:()=>dT,isEncryptionKeyAvailable:()=>cT,isValid:()=>ef,remove:()=>gT,update:()=>fT});var wn=require("@budibase/types"),Xd=require("@budibase/backend-core");function cT(){return!!Xd.env.ENCRYPTION_KEY}async function lT(){let e=await Ct.get();return Object.keys(e.variables)}async function dT(e){let r=(await Ct.get()).variables,n={};for(let[a,o]of Object.entries(r))switch(e){case wn.AppEnvironment.DEVELOPMENT:n[a]=o.development;break;case wn.AppEnvironment.PRODUCTION:default:n[a]=o.production;break}return n}async function Zd(e){if(!(await tt.cache.getCachedLicense()).features.includes(wn.Feature.ENVIRONMENT_VARIABLES))throw new Error("User does not have access to environment variables feature.");let r=await Ct.get();r.variables=e(r.variables),await Ct.update(r)}async function fT(e,t){if(ef(e))await Zd(n=>(n[e]=t,n));else throw new Error("Variable name has characters that are not allowed")}async function gT(e){await Zd(t=>(delete t[e],t))}function ef(e){return/^[a-zA-Z0-9-_]+$/.test(e)}var vt={};R(vt,{definitions:()=>_T,download:()=>ET,fetch:()=>vT,write:()=>ST});var Ia=require("@budibase/types");var re=require("@budibase/backend-core"),Ke=require("@budibase/types");var tf=require("memorystream"),rf=new re.sql.Sql(Ke.SqlClient.SQL_LITE);async function mT(e,t,r){let n={operation:Ke.Operation.READ,table:zt.searchTable(),tables:{},paginate:{limit:r||9,page:t},filters:e,resource:{fields:[]},sort:{timestamp:{direction:Ke.SortOrder.DESCENDING,type:Ke.SortType.STRING}}},a=rf._query(n);if(Array.isArray(a))throw new Error("Cannot execute multiple queries for audit log search");return{sql:a.sql,bindings:a.bindings}}function yT(e){return`${re.DocumentType.AUDIT_LOG}${re.SEPARATOR}${e}${re.SEPARATOR}${re.utils.newid()}`}async function nf(e){e._id||(e._id=yT(e.timestamp)),e.type||(e.type=Ke.AUDIT_LOG_TYPE);try{let r=await re.context.getAuditLogsDB().put(e);return{...e,_rev:r.rev}}catch(t){re.logging.logAlert("Failed to write audit log",t)}}async function Ss(e,t,r){t||(t=1);let n=re.context.getAuditLogsDB();try{let a=9+1,o=await mT(e,t,a),i=zt.searchTable(),s=rf.convertJsonStringColumns(i,await n.sql(o.sql,o.bindings)),c;s.length>a&&(c=s.pop());let f={rows:s,hasNextPage:!!c};return f.hasNextPage&&(f.bookmark=t+1),f}catch(a){if(a.status===404&&!r?.isRetry)return await hT(),await iu(),await Ss(e,t,{isRetry:!0});throw a}}async function hT(){let e=re.context.getAuditLogsDB(),r=(await e.allDocs(re.db.getDocParams(re.DocumentType.AUDIT_LOG,null,{include_docs:!0}))).rows.map(n=>n.doc).filter(n=>n&&!n.type).map(n=>({...n,type:Ke.AUDIT_LOG_TYPE}));await e.bulkDocs(r)}function af(e){let t=re.context.getAuditLogsDB(),r=new tf,n=t.dump(r,{filter:o=>{let i=o;if(!i._id?.startsWith(re.DocumentType.AUDIT_LOG))return!1;let s=!0,c=(f,d)=>{!f||f.length===0||(s=!!(s&&d&&f.includes(d)))};if(c(e.userIds,i.userId),c(e.appIds,i.appId),c(e.events,i.event),(e.startDate||e.endDate)&&(s=s&&i.timestamp>=e.startDate&&i.timestamp<=e.endDate),e.fullSearch){let f=JSON.stringify(o);s=s&&f.includes(e.fullSearch)}return s}}),a=new tf;return r.on("data",o=>{let i=JSON.parse(Buffer.from(o).toString());if(Array.isArray(i.docs)){let s="";for(let c of i.docs)s+=JSON.stringify(c)+`
|
|
37
|
+
`;function Yr(e){return uo.default.verify(e,Rb,{algorithms:["RS256"]})}function xb(e,t){return uo.default.sign(t,e,{encoding:"utf-8",algorithm:"RS256"})}var jn={};R(jn,{getFeatures:()=>po});var l=require("@budibase/types");var Tb={[l.PlanType.FREE]:[...Ee.SELF_FREE_LICENSE.features],[l.PlanType.PREMIUM]:void 0,[l.PlanType.PREMIUM_PLUS]:[l.Feature.APP_BACKUPS,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.APP_BUILDERS,l.Feature.VIEW_PERMISSIONS,l.Feature.TRIGGER_AUTOMATION_RUN,l.Feature.VIEW_READONLY_COLUMNS,l.Feature.AI_CUSTOM_CONFIGS],[l.PlanType.PREMIUM_PLUS_TRIAL]:[l.Feature.APP_BACKUPS,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.APP_BUILDERS,l.Feature.VIEW_PERMISSIONS,l.Feature.TRIGGER_AUTOMATION_RUN,l.Feature.VIEW_READONLY_COLUMNS,l.Feature.AI_CUSTOM_CONFIGS],[l.PlanType.PRO]:[l.Feature.USER_GROUPS,l.Feature.APP_BACKUPS],[l.PlanType.TEAM]:[l.Feature.USER_GROUPS,l.Feature.APP_BACKUPS],[l.PlanType.BUSINESS]:[l.Feature.USER_GROUPS,l.Feature.APP_BACKUPS,l.Feature.ENVIRONMENT_VARIABLES,l.Feature.AUDIT_LOGS,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.APP_BUILDERS,l.Feature.EXPANDED_PUBLIC_API,l.Feature.VIEW_PERMISSIONS],[l.PlanType.ENTERPRISE_BASIC]:[l.Feature.USER_GROUPS,l.Feature.APP_BACKUPS,l.Feature.ENVIRONMENT_VARIABLES,l.Feature.ENFORCEABLE_SSO,l.Feature.AUDIT_LOGS,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.OFFLINE,l.Feature.APP_BUILDERS,l.Feature.EXPANDED_PUBLIC_API,l.Feature.VIEW_PERMISSIONS,l.Feature.TRIGGER_AUTOMATION_RUN,l.Feature.SCIM,l.Feature.VIEW_READONLY_COLUMNS,l.Feature.AI_CUSTOM_CONFIGS],[l.PlanType.ENTERPRISE_BASIC_TRIAL]:[l.Feature.USER_GROUPS,l.Feature.APP_BACKUPS,l.Feature.ENVIRONMENT_VARIABLES,l.Feature.ENFORCEABLE_SSO,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.APP_BUILDERS,l.Feature.EXPANDED_PUBLIC_API,l.Feature.VIEW_PERMISSIONS,l.Feature.TRIGGER_AUTOMATION_RUN,l.Feature.SCIM,l.Feature.VIEW_READONLY_COLUMNS,l.Feature.AI_CUSTOM_CONFIGS],[l.PlanType.ENTERPRISE]:[l.Feature.USER_GROUPS,l.Feature.APP_BACKUPS,l.Feature.ENVIRONMENT_VARIABLES,l.Feature.ENFORCEABLE_SSO,l.Feature.AUDIT_LOGS,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.OFFLINE,l.Feature.APP_BUILDERS,l.Feature.EXPANDED_PUBLIC_API,l.Feature.VIEW_PERMISSIONS,l.Feature.TRIGGER_AUTOMATION_RUN,l.Feature.SCIM,l.Feature.VIEW_READONLY_COLUMNS,l.Feature.AI_CUSTOM_CONFIGS]},Ob={[l.PlanType.FREE]:[...Ee.CLOUD_FREE_LICENSE.features],[l.PlanType.PREMIUM]:[l.Feature.APP_BACKUPS,l.Feature.BRANDING,l.Feature.APP_BUILDERS,l.Feature.VIEW_PERMISSIONS],[l.PlanType.PREMIUM_PLUS]:[l.Feature.APP_BACKUPS,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.APP_BUILDERS,l.Feature.VIEW_PERMISSIONS,l.Feature.TRIGGER_AUTOMATION_RUN,l.Feature.VIEW_READONLY_COLUMNS,l.Feature.BUDIBASE_AI],[l.PlanType.PREMIUM_PLUS_TRIAL]:[l.Feature.APP_BACKUPS,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.APP_BUILDERS,l.Feature.VIEW_PERMISSIONS,l.Feature.TRIGGER_AUTOMATION_RUN,l.Feature.VIEW_READONLY_COLUMNS,l.Feature.BUDIBASE_AI],[l.PlanType.PRO]:[l.Feature.USER_GROUPS,l.Feature.APP_BACKUPS,l.Feature.BRANDING],[l.PlanType.TEAM]:[l.Feature.USER_GROUPS,l.Feature.APP_BACKUPS,l.Feature.BRANDING],[l.PlanType.BUSINESS]:[l.Feature.USER_GROUPS,l.Feature.APP_BACKUPS,l.Feature.ENVIRONMENT_VARIABLES,l.Feature.AUDIT_LOGS,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.APP_BUILDERS,l.Feature.EXPANDED_PUBLIC_API,l.Feature.VIEW_PERMISSIONS,l.Feature.BUDIBASE_AI],[l.PlanType.ENTERPRISE_BASIC]:[l.Feature.USER_GROUPS,l.Feature.APP_BACKUPS,l.Feature.ENVIRONMENT_VARIABLES,l.Feature.ENFORCEABLE_SSO,l.Feature.AUDIT_LOGS,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.OFFLINE,l.Feature.APP_BUILDERS,l.Feature.EXPANDED_PUBLIC_API,l.Feature.VIEW_PERMISSIONS,l.Feature.TRIGGER_AUTOMATION_RUN,l.Feature.SCIM,l.Feature.VIEW_READONLY_COLUMNS,l.Feature.AI_CUSTOM_CONFIGS,l.Feature.BUDIBASE_AI],[l.PlanType.ENTERPRISE_BASIC_TRIAL]:[l.Feature.USER_GROUPS,l.Feature.APP_BACKUPS,l.Feature.ENVIRONMENT_VARIABLES,l.Feature.ENFORCEABLE_SSO,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.APP_BUILDERS,l.Feature.EXPANDED_PUBLIC_API,l.Feature.VIEW_PERMISSIONS,l.Feature.TRIGGER_AUTOMATION_RUN,l.Feature.SCIM,l.Feature.VIEW_READONLY_COLUMNS,l.Feature.AI_CUSTOM_CONFIGS,l.Feature.BUDIBASE_AI],[l.PlanType.ENTERPRISE]:[l.Feature.USER_GROUPS,l.Feature.APP_BACKUPS,l.Feature.ENVIRONMENT_VARIABLES,l.Feature.ENFORCEABLE_SSO,l.Feature.AUDIT_LOGS,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.APP_BUILDERS,l.Feature.EXPANDED_PUBLIC_API,l.Feature.VIEW_PERMISSIONS,l.Feature.TRIGGER_AUTOMATION_RUN,l.Feature.SCIM,l.Feature.VIEW_READONLY_COLUMNS,l.Feature.AI_CUSTOM_CONFIGS,l.Feature.BUDIBASE_AI]};function po(e,t){let r=[];function n(a){let o=a[t];if(!o)throw new Error(`Features do not exist for planType=${t} and hosting=${e}`);return o}switch(e){case l.Hosting.SELF:r=n(Tb);break;case l.Hosting.CLOUD:r=n(Ob);break}return r}var Wn={};R(Wn,{UNLIMITED:()=>g,getQuotas:()=>co});var K=require("@budibase/types");var p=ut,Cu=Ee,g=-1,zr=e=>e*1e6,Pb={[K.PlanType.FREE]:{...Cu.CLOUD_FREE_LICENSE.quotas},[K.PlanType.PREMIUM]:{usage:{monthly:{...p.queries(g),...p.automations(1e3),...p.budibaseAICredits(0)},static:{...p.rows(1e4),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(0),...p.plugins(g),...p.customAIConfigurations(0)}},constant:{...p.automationLogRetentionDays(7),...p.appBackupRetentionDays(7)}},[K.PlanType.PREMIUM_PLUS]:{usage:{monthly:{...p.queries(g),...p.automations(5e3),...p.budibaseAICredits(zr(2))},static:{...p.rows(25e3),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(0),...p.plugins(g),...p.customAIConfigurations(1)}},constant:{...p.automationLogRetentionDays(30),...p.appBackupRetentionDays(30)}},[K.PlanType.PREMIUM_PLUS_TRIAL]:{usage:{monthly:{...p.queries(g),...p.automations(5e3),...p.budibaseAICredits(zr(2))},static:{...p.rows(25e3),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(0),...p.plugins(g),...p.customAIConfigurations(1)}},constant:{...p.automationLogRetentionDays(30),...p.appBackupRetentionDays(30)}},[K.PlanType.PRO]:{usage:{monthly:{...p.queries(g),...p.automations(1e3),...p.budibaseAICredits(0)},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(5),...p.plugins(g),...p.customAIConfigurations(0)}},constant:{...p.automationLogRetentionDays(7),...p.appBackupRetentionDays(7)}},[K.PlanType.TEAM]:{usage:{monthly:{...p.queries(g),...p.automations(5e3),...p.budibaseAICredits(0)},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(10),...p.plugins(g),...p.customAIConfigurations(0)}},constant:{...p.automationLogRetentionDays(30),...p.appBackupRetentionDays(90)}},[K.PlanType.BUSINESS]:{usage:{monthly:{...p.queries(g),...p.automations(1e4),...p.budibaseAICredits(0)},static:{...p.rows(5e4),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(50),...p.plugins(g),...p.customAIConfigurations(0)}},constant:{...p.automationLogRetentionDays(365),...p.appBackupRetentionDays(365)}},[K.PlanType.ENTERPRISE_BASIC]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(zr(4))},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(g),...p.plugins(g),...p.customAIConfigurations(g)}},constant:{...p.automationLogRetentionDays(g),...p.appBackupRetentionDays(g)}},[K.PlanType.ENTERPRISE_BASIC_TRIAL]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(zr(4))},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(g),...p.plugins(g),...p.customAIConfigurations(g)}},constant:{...p.automationLogRetentionDays(15),...p.appBackupRetentionDays(15)}},[K.PlanType.ENTERPRISE]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(zr(4))},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(g),...p.plugins(g),...p.customAIConfigurations(g)}},constant:{...p.automationLogRetentionDays(g),...p.appBackupRetentionDays(g)}}},qb={[K.PlanType.FREE]:{...Cu.SELF_FREE_LICENSE.quotas},[K.PlanType.PREMIUM]:void 0,[K.PlanType.PREMIUM_PLUS]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(0)},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(0),...p.plugins(g),...p.customAIConfigurations(1)}},constant:{...p.automationLogRetentionDays(30),...p.appBackupRetentionDays(30)}},[K.PlanType.PREMIUM_PLUS_TRIAL]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(0)},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(0),...p.plugins(g),...p.customAIConfigurations(1)}},constant:{...p.automationLogRetentionDays(30),...p.appBackupRetentionDays(30)}},[K.PlanType.PRO]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(0)},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(5),...p.plugins(g),...p.customAIConfigurations(0)}},constant:{...p.automationLogRetentionDays(7),...p.appBackupRetentionDays(7)}},[K.PlanType.TEAM]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(0)},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(10),...p.plugins(g),...p.customAIConfigurations(0)}},constant:{...p.automationLogRetentionDays(30),...p.appBackupRetentionDays(90)}},[K.PlanType.BUSINESS]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(0)},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(50),...p.plugins(g),...p.customAIConfigurations(0)}},constant:{...p.automationLogRetentionDays(90),...p.appBackupRetentionDays(365)}},[K.PlanType.ENTERPRISE_BASIC]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(0)},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(g),...p.plugins(g),...p.customAIConfigurations(g)}},constant:{...p.automationLogRetentionDays(g),...p.appBackupRetentionDays(g)}},[K.PlanType.ENTERPRISE_BASIC_TRIAL]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(0)},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(g),...p.plugins(g),...p.customAIConfigurations(g)}},constant:{...p.automationLogRetentionDays(15),...p.appBackupRetentionDays(15)}},[K.PlanType.ENTERPRISE]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(0)},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(g),...p.plugins(g),...p.customAIConfigurations(g)}},constant:{...p.automationLogRetentionDays(g),...p.appBackupRetentionDays(g)}}};function co(e,t){let r;function n(a){let o=a[t];if(!o)throw new Error(`Quotas do not exist for planType=${t} and hosting=${e}`);return o}switch(e){case K.Hosting.SELF:r=n(qb);break;case K.Hosting.CLOUD:r=n(Pb);break}return JSON.parse(JSON.stringify(r))}var Zt={};R(Zt,{appExists:()=>Cb,encoding:()=>Xt});var Uu=require("@budibase/backend-core");async function Cb(e){return(await Uu.db.getAllApps({all:!0,idsOnly:!0})).includes(e)}var Xt={};R(Xt,{base64ToObject:()=>Lb,objectToBase64:()=>Ub});function Ub(e){let t=JSON.stringify(e);return Buffer.from(t).toString("base64")}function Lb(e){let t=Buffer.from(e,"base64").toString();return JSON.parse(t)}var yd=require("@budibase/types"),dr=require("@budibase/backend-core"),hd=N(Hc()),Ad=N(Go());async function px(e){await Ue.save({offlineLicenseToken:e}),await Lt()}async function cx(){await Ue.save({offlineLicenseToken:void 0}),await Lt()}async function Id(){return(await Ue.get()).offlineLicenseToken}async function ko(){let t=(await dr.installation.getInstall()).installId,r=dr.context.getTenantId(),n=await dr.events.identification.getUniqueTenantId(r);return{installId:t,tenantId:n}}async function lx(){let e=await ko();return Xt.objectToBase64(e)}function dx(e){return Xt.base64ToObject(e)}function bd(e){let t=Date.now(),r=new Date(e.expireAt).getTime();if(t>r)throw new Error(`Offline license has expired. expireAt=${e.expireAt}`)}async function Sd(e){let t=await ko();if(e.identifier.installId!==t.installId||e.identifier.tenantId!==t.tenantId)throw new Error("Invalid offline license")}function wd(e){let t=e.plan.type,r=yd.Hosting.SELF,n=po(r,t),a=co(r,t);return e.features=(0,hd.default)(e.features,n),e.quotas=(0,Ad.default)(e.quotas,a),e}async function Fo(){try{let e=await Id();if(e){let t=await Yr(e);return bd(t),await Sd(t),wd(t)}}catch(e){console.error("Error retrieving offline license",e)}}var yn={};R(yn,{deleteDevLicense:()=>hx,getOfflineLicense:()=>mx,writeDevLicenseToDisk:()=>yx});var vd=require("@budibase/backend-core"),$o=require("path"),Ed=require("os"),Dt=N(require("fs"));var fx=vd.env.isTest()?".budibase-test":".budibase",Qo=(0,$o.join)((0,Ed.tmpdir)(),fx),gx="dev_license.txt",mn=(0,$o.join)(Qo,gx);if(!Dt.default.existsSync(Qo))try{Dt.default.mkdirSync(Qo)}catch{}function mx(){try{if(Dt.default.existsSync(mn)){let e=Dt.default.readFileSync(mn,{encoding:"utf-8"});return Yr(e)}}catch(e){console.error("Error retrieving offline license from disk",e)}}function yx(e){console.log(`Writing license to: ${mn}`),Dt.default.writeFileSync(mn,e,{encoding:"utf-8"})}function hx(){Dt.default.rmSync(mn,{force:!0})}var Wo=async()=>{if(jo.env.OFFLINE_MODE)return Fo();let e=await Jt();return e||(e=yn.getOfflineLicense()),e},Vo=()=>jo.env.SELF_HOSTED?Ee.SELF_FREE_LICENSE:Ee.CLOUD_FREE_LICENSE;var Ko={};R(Ko,{activateLicenseKey:()=>Ax,deleteLicenseKey:()=>bx,getLicenseKey:()=>Ix});async function Ax(e){await io(e),await Ue.save({licenseKey:e}),await Lt()}async function Ix(){return(await Ue.get()).licenseKey}async function bx(){await Ue.save({licenseKey:void 0}),await Lt()}var hn=require("@budibase/backend-core"),ia=N(require("dd-trace")),_d=3600,Lt=async()=>{await Td(),await xd()},Rd=async(e,t)=>{let{populateLicense:r=Wo,populateFreeLicense:n=Vo}=t||{};return await ia.default.trace("getCachedLicense",async a=>{let o=hn.tenancy.getTenantId(),i=await Va(),s=await i.get(o);return a.addTags({tenantId:o,foundInCache:!!s}),s||(s=await ia.default.trace("populateLicense",async()=>await r(o)),a.addTags({populatedLicense:!!s}),s||(s=ia.default.trace("populateFreeLicense",()=>n(e,o)),a.addTags({populatedFreeLicense:!!s})),s.refreshedAt=new Date().toISOString(),a.addTags({refreshedAt:s.refreshedAt,expirySeconds:_d}),await i.store(o,s,_d),s)})};hn.env.isJest()&&(Rd=jest.fn());var xd=Rd,Td=async()=>{let e=hn.tenancy.getTenantId();await(await Va()).delete(e)};async function ge(e,t){Array.isArray(e)||(e=[e]),t||(t=await Qe.getCachedLicense());for(let r of e)if(!t?.features.includes(r))return!1;return!0}async function ua(e,t){if(!await ge(e,t))throw new pt.FeatureDisabledError(`${e} is not currently enabled`,e)}async function Yo(e,t){if(!await ge(e,t)){let r=e.join(", ");throw new pt.FeatureDisabledError(`${r} are not currently enabled`,r)}}function Re(e){return async(...t)=>(await ua(fe.Feature.APP_BACKUPS),e(...t))}async function Ho(){return ge(fe.Feature.APP_BACKUPS)}async function zo(){return ge(fe.Feature.BRANDING)}async function Od(){return ge(fe.Feature.ENFORCEABLE_SSO)}async function wx(){return ge(fe.Feature.SYNC_AUTOMATIONS)}async function vx(){return ge(fe.Feature.TRIGGER_AUTOMATION_RUN)}async function Bt(){return ge(fe.Feature.APP_BUILDERS)}async function pa(){return ge(fe.Feature.AUDIT_LOGS)}async function Jo(){return ge(fe.Feature.USER_GROUPS)}async function ct(){return ge(fe.Feature.EXPANDED_PUBLIC_API)}async function Ex(e){if(pt.env.ENABLE_SSO_MAINTENANCE_MODE||!await Od())return!1;let r;return e?.config?r=e.config:r=await pt.configs.getSettingsConfig(),!!r.isSSOEnforced}var Xo=async()=>{let e=fe.Feature.SCIM,t=await ge(e),r=await pt.configs.getSCIMConfig();if(!t||!r?.enabled)throw new pt.FeatureDisabledError(`${e} is not currently enabled`,e);return!0};async function _x(){return ge(fe.Feature.VIEW_PERMISSIONS)}async function Rx(){return ge(fe.Feature.VIEW_READONLY_COLUMNS)}async function An(){return ge(fe.Feature.BUDIBASE_AI)}async function xx(){return ge(fe.Feature.AI_CUSTOM_CONFIGS)}var Tx={faviconUrl:void 0,faviconUrlEtag:void 0,emailBrandingEnabled:!0,testimonialsEnabled:!0,platformTitle:void 0,loginHeading:void 0,loginButton:void 0,metaDescription:void 0,metaImageUrl:void 0,metaTitle:void 0};async function Ox(e){return await zo()?{faviconUrl:e.faviconUrl,faviconUrlEtag:e.faviconUrlEtag,emailBrandingEnabled:e.emailBrandingEnabled,testimonialsEnabled:e.testimonialsEnabled,platformTitle:e.platformTitle,loginHeading:e.loginHeading,loginButton:e.loginButton,metaDescription:e.metaDescription,metaImageUrl:e.metaImageUrl,metaTitle:e.metaTitle}:Tx}var la={};R(la,{enrichAIConfig:()=>Zo});var Px="budibase_ai";async function Zo(e){return await An()&&(e.config[Px]={provider:"OpenAI",active:!0,isDefault:Object.keys(e.config).every(t=>!e.config[t].isDefault),defaultModel:process.env.BUDIBASE_AI_DEFAULT_MODEL||"gpt-4o-mini",apiKey:process.env.OPENAI_API_KEY,name:"Budibase AI"}),e}var Ve={};R(Ve,{addApp:()=>Dx,addAutomation:()=>Fx,addCustomAIConfig:()=>Qx,addGroup:()=>ts,addPlugin:()=>ns,addRow:()=>Nx,addRows:()=>Gx,addUsers:()=>fa,bustCache:()=>ru,decrement:()=>je,decrementMany:()=>Mt,getCurrentUsageValues:()=>su,getLicensedQuota:()=>qd,getQuotaUsage:()=>Ot,increment:()=>Te,incrementBudibaseAICredits:()=>ss,incrementMany:()=>Nt,removeApp:()=>Bx,removeCustomAIConfig:()=>$x,removeCustomAIConfigs:()=>jx,removeGroup:()=>rs,removePlugin:()=>as,removeRow:()=>Mx,removeRows:()=>kx,removeUsers:()=>yr,set:()=>es,setAllUsage:()=>Za,setAppUsageValue:()=>Xa,setUsage:()=>nu,setUsagePerApp:()=>au,updatePluginCount:()=>os,updateUsage:()=>fr,usageLimitIsExceeded:()=>Lx,utils:()=>Pr});var ce=require("@budibase/types");var Be=require("@budibase/backend-core");var Te=(e,t,r)=>Pd({change:1,name:e,type:t,opts:r}),Nt=e=>Pd(e),Pd=async e=>{let t=Array.isArray(e)?e:[e];await fr(t.map(n=>({usageChange:n.change,name:n.name,type:n.type,opts:{dryRun:!0,suppressErrorLog:n.opts?.suppressErrorLog,id:n.opts?.id}})));let r=[];for(let n of t){let a=n.opts?.fn;a&&r.push(await a())}return await fr(t.map(n=>({usageChange:n.change,name:n.name,type:n.type,opts:{dryRun:!1,valueFn:n.opts?.valueFn,suppressErrorLog:n.opts?.suppressErrorLog,id:n.opts?.id}}))),r[0]},je=(e,t,r={})=>fr({usageChange:-1,name:e,type:t,opts:r}),Mt=e=>{let t=Array.isArray(e)?e:[e];return fr(t.map(r=>({usageChange:-r.change,name:r.name,type:r.type,opts:r.opts})))},es=async(e,t,r)=>Xe.setUsage(r,e,t),qx=(e,t,r)=>{if(e==ce.QuotaUsageType.STATIC){let n=r.usageQuota.triggers;return n?n[t]||{}:{}}else{let n=Xe.utils.getCurrentMonthString(),a=r.monthly[n].triggers;return a?a[t]||{}:{}}},Cx=async(e,t,r,n)=>{try{await Be.locks.doWithLock({type:ce.LockType.TRY_ONCE,name:ce.LockName.TRIGGER_QUOTA,resource:e,ttl:1e4},async()=>{let a={percentage:r,name:t.name};n&&(a.resetDate=n),await At.triggerQuota(a)})}catch(a){Be.logging.logAlert("Error triggering quota",a)}},Ux=async(e,t,r,n)=>{let a=await Ot(),o=e===ce.QuotaUsageType.MONTHLY?a.quotaReset:void 0,i=await qx(e,t,a),s=n.triggers,c=r/n.value*100;c>100&&(c=100);for(let[f,d]of s.entries())if(c>=d&&n.value!==ut.UNLIMITED){if(!i[d]){i[d]=new Date().toISOString();let y=s[f+1]||100;(!(c>=y)||c===d)&&await Cx(t,n,c,o)}}else i[d]=void 0;return i},fr=async e=>{let t=Array.isArray(e)?e:[e],r=null,n,a=[],o={},i={},s={},c={};for(let d of t){try{r=Be.context.getAppId()}catch{}if(ce.APP_QUOTA_NAMES.includes(d.name)&&!r)throw new Error("App context required for quota update");try{n=await qd(ce.QuotaType.USAGE,d.name,d.type),a.push(n);let{total:y,app:v,breakdown:C}=await Xe.getCurrentUsageValues(d.type,d.name,d.opts?.id);y+=d.usageChange,v!=null&&(v+=d.usageChange),C!=null&&(C+=d.usageChange);let D={};if(d.opts?.dryRun||(D=await Ux(d.type,d.name,y,n),c={...c,[d.name]:D}),n.value!==ut.UNLIMITED&&y>n.value&&d.usageChange>0)throw new Be.UsageLimitError(`Licensed ${n.name} of ${n.value} has been exceeded`,n.name);if(y=Math.max(0,y),v&&(v=Math.max(0,v)),C&&(C=Math.max(0,C),s={...s,[d.name]:C}),!d.opts?.dryRun){let L=d.opts?.valueFn;L&&(y=await L(),v=y),o={...o,[d.name]:y},i={...i,[d.name]:v}}}catch(y){throw d.opts?.suppressErrorLog||console.error(`Error updating usage quotas for ${d.name}`,y),y}}let f=t.filter(d=>!d.opts?.dryRun).map(d=>({name:d.name,type:d.type,values:{total:o[d.name],app:i[d.name],breakdown:s[d.name],triggers:c[d.name]},opts:d.opts}));f.length>0&&await Xe.setAllUsage(f)},qd=async(e,t,r)=>{let n=await Qe.getCachedLicense();if(!n){let a=Be.tenancy.getTenantId();throw new Error("License not found for tenant id "+a)}if(r&&(0,ce.isStaticQuota)(e,r,t))return n.quotas[e][r][t];if(r&&(0,ce.isMonthlyQuota)(e,r,t))return n.quotas[e][r][t];if((0,ce.isConstantQuota)(e,t))return n.quotas[e][t];throw new Error("Invalid quota type")},Lx=async(e,t)=>{try{return await fr({usageChange:1,name:e,type:t,opts:{dryRun:!0}}),!1}catch(r){if(r.code===Be.ErrorCode.USAGE_LIMIT_EXCEEDED)return!0;throw r}};var gr=require("@budibase/types"),Cd=require("@budibase/backend-core"),Ud=async()=>{let e=await Cd.db.getAllApps({dev:!0});return e?e.length:0},Dx=async(e,{appId:t}={})=>Te(gr.StaticQuotaName.APPS,gr.QuotaUsageType.STATIC,{fn:e,valueFn:Ud,id:t}),Bx=async({appId:e}={})=>je(gr.StaticQuotaName.APPS,gr.QuotaUsageType.STATIC,{valueFn:Ud,id:e});var rt=require("@budibase/types"),Nx=async(e,{tableId:t}={})=>Te(rt.StaticQuotaName.ROWS,rt.QuotaUsageType.STATIC,{fn:e,id:t}),Mx=async({tableId:e}={})=>je(rt.StaticQuotaName.ROWS,rt.QuotaUsageType.STATIC,{id:e}),Gx=async(e,t,{tableId:r}={})=>Nt({change:e,name:rt.StaticQuotaName.ROWS,type:rt.QuotaUsageType.STATIC,opts:{fn:t,id:r}}),kx=async(e,{tableId:t}={})=>Mt({change:e,name:rt.StaticQuotaName.ROWS,type:rt.QuotaUsageType.STATIC,opts:{id:t}});var da=require("@budibase/types"),Fx=async(e,{automationId:t}={})=>Te(da.MonthlyQuotaName.AUTOMATIONS,da.QuotaUsageType.MONTHLY,{fn:e,id:t});var mr=require("@budibase/types"),ts=async e=>Te(mr.StaticQuotaName.USER_GROUPS,mr.QuotaUsageType.STATIC,{fn:e}),rs=async()=>je(mr.StaticQuotaName.USER_GROUPS,mr.QuotaUsageType.STATIC);var St=require("@budibase/types"),ns=async e=>Te(St.StaticQuotaName.PLUGINS,St.QuotaUsageType.STATIC,{fn:e}),as=async()=>je(St.StaticQuotaName.PLUGINS,St.QuotaUsageType.STATIC),os=async e=>es(St.StaticQuotaName.PLUGINS,St.QuotaUsageType.STATIC,e);var nt=require("@budibase/types"),In=require("@budibase/backend-core");var fa=async(e,t,r)=>{let n=[{change:e,name:nt.StaticQuotaName.USERS,type:nt.QuotaUsageType.STATIC,opts:{fn:r,valueFn:In.users.getUserCount}}];t>0&&n.push({change:t,name:nt.StaticQuotaName.CREATORS,type:nt.QuotaUsageType.STATIC,opts:{valueFn:In.users.getCreatorCount}});let a=await Nt(n);return await Jt(),a},yr=async(e,t)=>{let r=[{change:e,name:nt.StaticQuotaName.USERS,type:nt.QuotaUsageType.STATIC,opts:{valueFn:In.users.getUserCount}}];t>0&&r.push({change:t,name:nt.StaticQuotaName.CREATORS,type:nt.QuotaUsageType.STATIC,opts:{valueFn:In.users.getCreatorCount}}),await Mt(r),await Jt()};var We=require("@budibase/types"),ss=async e=>Nt({change:e,name:We.MonthlyQuotaName.BUDIBASE_AI_CREDITS,type:We.QuotaUsageType.MONTHLY}),Qx=async()=>Te(We.StaticQuotaName.AI_CUSTOM_CONFIGS,We.QuotaUsageType.STATIC),$x=async()=>je(We.StaticQuotaName.AI_CUSTOM_CONFIGS,We.QuotaUsageType.STATIC),jx=async e=>Mt({change:e,name:We.StaticQuotaName.AI_CUSTOM_CONFIGS,type:We.QuotaUsageType.STATIC});var lt={};R(lt,{addAppBuilder:()=>Hx,db:()=>at,removeAppBuilder:()=>zx});var Sn=require("@budibase/backend-core");var J={};R(J,{addAppBuilder:()=>ls,addUsers:()=>us,adjustGroupCreatorsQuotas:()=>Yx,cleanupApp:()=>Kx,enrichUserRolesFromGroups:()=>Vx,fetch:()=>bn,get:()=>kt,getBulk:()=>kd,getGroupBuilderAppIds:()=>Gd,getGroupRoleId:()=>Wx,remove:()=>is,removeAppBuilder:()=>ds,removeUsers:()=>ps,save:()=>hr,updateGroupApps:()=>cs});var q=require("@budibase/backend-core");var Ld=require("@budibase/backend-core"),ga=class extends Ld.HTTPError{constructor(t){super(`Group name "${t}" is unavailable`,409)}};async function Nd(e,t){try{let r=[];for(let s of e)if(s.roles){let c=s.roles[q.db.getProdAppID(t)];c&&r.push(c)}let n=await Promise.all(r.map(async s=>({[s]:await q.roles.roleToNumber(s)}))),a,o,i={};n.forEach(s=>{let[c,f]=Object.entries(s)[0];i[c]={roleId:c,roleNum:f}});for(let{roleId:s,roleNum:c}of Object.values(i))(o===void 0||c>o)&&(o=c,a=s);return a}catch(r){throw q.logging.logAlert(`Error finding higest role for ${e.length} on app ${t}`,r),r}}async function Md(e,t){return t?t=t.filter(r=>e.includes(r._id)):t=await V.getBulk(e,{enriched:!1}),t}async function Gd(e,t){if(!e.userGroups)return[];let r=await Md(e.userGroups,t?.groups),n=t?.appId?q.db.getProdAppID(t?.appId):null,a=[];for(let o of r){let i=o.builder?.apps;n&&i?.includes(n)?a.push(n):n||(a=a.concat(i||[]))}return[...new Set(a)]}async function Wx(e,t,r){if(!e.userGroups)return null;let n=await Md(e.userGroups,r?.groups),a=q.db.getProdAppID(t);return e.roles?.[a]?e.roles[a]:(n=n.filter(o=>o?.roles?Object.keys(o.roles).includes(a):!1),await Nd(n,t))}async function Vx(e){if(!e||!e.userGroups)return e;let t=await kd(e.userGroups,{enriched:!1}),r=[];for(let a of t)a?.roles&&(r=r.concat(Object.keys(a.roles)));r=[...new Set(r)];for(let a of r)await q.context.doInAppContext(a,async()=>{if(e.roles[a])return;let o=await Nd(t,a);o&&(e.roles[a]=o)});let n=await Gd(e,{groups:t});if(n.length&&!e.builder?.global){let a=e.builder?.apps||[];e.builder={apps:a.concat(n)}}return e}async function bn(){return await V.fetch()}async function kt(e){return await V.get(e)}async function kd(e,t={enriched:!0}){return await V.getBulk(e,t)}async function Dd(e){if(await V.getByName(e))throw new ga(e)}async function Bd(e){let t=await V.getGroupUsers(e._id);if(!t.length)return 0;let n=await q.tenancy.getGlobalDB().getMultiple(t.map(o=>o._id));return(await q.userUtils.creatorsInList(n)).filter(o=>o).length}async function hr(e){let t=[],r=!e._id,n=0;if(delete e.users,!e._id)e._id=V.generateUserGroupID(),await Dd(e.name),t.push(q.events.group.created(e));else{let o=await V.get(e._id);if(o.name!==e.name&&await Dd(e.name),t.push(q.events.group.updated(e)),JSON.stringify(o.roles)!==JSON.stringify(e.roles)){let i=o.users?.length||0,s=0;i>0&&(s=await Bd(o)),Object.values(e.roles).includes(q.roles.BUILTIN_ROLE_IDS.ADMIN)?n=i-s:n=-i,t.push(q.events.group.permissionsEdited(e))}}await Promise.all(t);let a=()=>V.save(e);if(r)return await ts(a);{let o=await a();if(n>0)await fa(0,n);else if(n<0){let i=await Bd(e),s=Math.abs(n)-i;s>0&&await yr(0,s)}return o}}async function is(e,t){let r;try{r=await V.get(e)}catch{throw new Error("Group not found")}let n=Object.values(r.roles||{}).includes(q.roles.BUILTIN_ROLE_IDS.ADMIN),a=()=>{};if(n){let i=q.tenancy.getGlobalDB(),s=await V.getGroupUsers(e),f=(await Promise.all(s.map(v=>i.get(v._id)))).map(v=>({...v,userGroups:v.userGroups.filter(C=>C!==e)})),m=(await q.userUtils.creatorsInList(f)).filter(v=>v).length,y=s.length-m;y&&(a=()=>yr(0,y))}let o=await V.destroy(e,t);return await q.events.group.deleted(r),await rs(),await a(),o}async function us(e,t){let r=await V.get(e),n=await q.users.bulkGetGlobalUsersById(t),a=[];for(let c of n)c.userGroups||(c.userGroups=[]),c.userGroups.includes(e)||a.push(c);if(!a.length)return a;let o=a.map(c=>({...c,userGroups:[...c?.userGroups||[],e]}));if(await q.users.bulkUpdateGlobalUsers(o),Object.values(r.roles||{}).includes(q.roles.BUILTIN_ROLE_IDS.ADMIN)){let f=(await q.userUtils.creatorsInList(a)).filter(m=>m).length,d=a.length-f;d&&await fa(0,d)}let s=[];for(let c of t)s.push(q.cache.user.invalidateUser(c));return await Promise.all(s),await q.events.group.usersAdded(o.length,r),o}async function ps(e,t){let r=await V.get(e),n=await q.users.bulkGetGlobalUsersById(t),a=[];for(let s of n){if(!s.userGroups||!s.userGroups.includes(e))continue;let c=s.userGroups.indexOf(e);s.userGroups.splice(c,1),a.push(s)}if(await q.users.bulkUpdateGlobalUsers(a),Object.values(r.roles||{}).includes(q.roles.BUILTIN_ROLE_IDS.ADMIN)){let c=(await q.userUtils.creatorsInList(a)).filter(d=>d).length,f=a.length-c;f&&await yr(0,f)}let i=[];for(let s of t)i.push(q.cache.user.invalidateUser(s));return await Promise.all(i),a.length&&await q.events.group.usersDeleted(a.length,r),a}async function cs(e,t){let r=await kt(e);if(r.roles||(r.roles={}),t.appsToAdd)for(let n of t.appsToAdd)r.roles[n.appId]=n.roleId;if(t.appsToRemove)for(let n of t.appsToRemove)delete r.roles[n.appId];return await hr(r)}async function Kx(e){let t=await bn(),r=[];for(let n of t)!n.roles||!n.roles[e]||(delete n.roles[e],r.push(n));return await V.bulkSave(r)}async function ls(e,t){if(!await Bt())throw new Error("Feature not enabled, please check license");let r=q.db.getProdAppID(t),n=await kt(e);n.builder??={apps:[]},n.builder.apps.includes(t)||(n.builder.apps.push(r),await hr(n))}async function ds(e,t){if(!await Bt())throw new Error("Feature not enabled, please check license");let r=q.db.getProdAppID(t),n=await kt(e);n.builder?.apps.includes(t)&&(n.builder.apps=n.builder.apps.filter(a=>a!==r),await hr(n))}async function Yx(){if(!await Jo()){let e=q.tenancy.getGlobalDB(),r=(await bn()||[]).filter(n=>Object.values(n?.roles||{}).includes(q.roles.BUILTIN_ROLE_IDS.ADMIN));for(let n of r){let a=await V.getGroupUsers(n._id),i=(await Promise.all(a.map(d=>e.get(d._id)))).map(d=>({...d,userGroups:d.userGroups.filter(m=>m!==n._id)})),c=(await q.userUtils.creatorsInList(i)).filter(d=>d).length,f=a.length-c;await V.save({...n,roles:{}}),f&&await yr(0,f)}}}Sn.users.UserDB.init(Ve,J,xe);var at=Sn.users.UserDB;async function Hx(e,t){if(!await Bt())throw new Error("Feature not enabled, please check license");await Sn.users.addAppBuilder(e,t)}async function zx(e,t){if(!await Bt())throw new Error("Feature not enabled, please check license");await Sn.users.removeAppBuilder(e,t)}var ya={};R(ya,{logs:()=>bs});var bs={};R(bs,{logSearch:()=>oT,oldestLogDate:()=>Kd,storeLog:()=>sT});var Vd=require("@budibase/types"),ma=require("@budibase/backend-core");var wt=require("@budibase/types");var pe=require("@budibase/backend-core");var Fd=require("@budibase/backend-core");async function Qd(e,t){let r,n=5,a=!1,o,i=!0;for(;n>0;n--)try{i?o=await e():o=await exports.randomDelay(e),a=!0;break}catch(s){r=s}return a||Fd.logging.logWarn(`Failed to backoff: ${t}`,r),o}var{SEPARATOR:dt,UNICODE_MAX:Jx,DocumentType:$d,AutomationViewMode:fs,ViewName:Xx,getQueryIndex:Zx}=pe.db,eT=new Date(0).toISOString(),tT=100,gs=async()=>Fn(wt.ConstantQuotaName.AUTOMATION_LOG_RETENTION_DAYS);function jd(e,t,{status:r,automationId:n}={},a={}){let o=n?`${n}${dt}`:"",i=r?`${r}${dt}`:"",s;return r&&n?s=`${fs.ALL}${dt}${i}${o}`:r?s=`${fs.STATUS}${dt}${i}`:n?s=`${fs.AUTOMATION}${dt}${o}`:s=`${$d.AUTOMATION_LOG}${dt}`,{...a,descending:!0,startkey:`${s}${t}${Jx}`,endkey:`${s}${e}`}}function ms(e){let t=wt.AutomationStatus.SUCCESS,r=!0;for(let n of e.steps){let a=n.outputs?.status?.toLowerCase(),o=a==="stopped_error";if(r&&!o){r=!1;continue}if(o){t=wt.AutomationStatus.STOPPED_ERROR;break}else if(n.outputs?.success){if(a==="stopped"){t=wt.AutomationStatus.STOPPED;break}}else{t=wt.AutomationStatus.ERROR;break}}return t}function rT(e,t,r){return`${$d.AUTOMATION_LOG}${dt}${e}${dt}${r}${dt}${t}`}async function ys(e,t,r={docs:!0}){let n=pe.context.getProdAppDB();await n.exists()||(n=pe.context.getDevAppDB());let a={status:r.status},o=r?.limit?r.limit:r?.paginate?9+1:void 0,i=jd(e,t,a,{include_docs:r.docs,limit:o});r?.page&&(i.startkey=r.page);let s=await n.allDocs(i);return Cr(s,{paginate:r?.paginate,pageSize:9})}async function hs(e,t,r={}){let n=pe.context.getProdAppDB();await n.exists()||(n=pe.context.getDevAppDB());let a;try{let o={automationId:r?.automationId,status:r?.status},i=jd(e,t,o,{include_docs:!0,limit:9+1});r?.page&&(i.startkey=r.page),a=await n.query(Zx(Xx.AUTOMATION_LOGS),i)}catch(o){if(o!=null&&(o.name==="not_found"||o.error==="not_found"))return await hu(),hs(e,t,r);throw o}return Cr(a,{paginate:!0,pageSize:9})}async function Wd(e,t){let r=pe.context.getProdAppDB(),n=e._id,a=e.name,o=ms(t),i=new Date().toISOString(),s=rT(i,o,n),c={...t,automationId:n,status:o,automationName:a,createdAt:i,_id:s};return await r.put(c),s}async function As(e,{clearing:t}={clearing:!1}){let r=pe.context.getProdAppDB();await Qd(async()=>{let n=await r.get(pe.db.DocumentType.APP_METADATA);for(let a of e){let o=a.split(pe.db.SEPARATOR),i=`${o[o.length-3]}${pe.db.SEPARATOR}${o[o.length-2]}`,s={};n.automationErrors&&(s=n.automationErrors),Array.isArray(s[i])||(s[i]=[]);let c=s[i].indexOf(a);t&&c!==-1?s[i].splice(c,1):s[i].push(a),s[i].length===0&&delete s[i],n.automationErrors=s}await r.put(n),await pe.cache.app.invalidateAppMetadata(n.appId,n)},"Failed to update app metadata with automation log error")}async function nT(){let e=await gs();try{return await ys(eT,e,{docs:!1,paginate:!1,limit:tT})}catch{return{data:[],hasNextPage:!1}}}async function Is(){let e=pe.context.getProdAppDB();try{let t=await nT();if(!t.data||t.data.length===0)return;let r=t.data.map(a=>({_id:a.id,_rev:a.value.rev,_deleted:!0})),n=t.data.filter(a=>{let o=a.id.split(pe.db.SEPARATOR);return o[o.length-1]===wt.AutomationStatus.ERROR}).map(a=>a.id);await e.bulkDocs(r),n.length&&await As(n,{clearing:!0})}catch(t){pe.logging.logAlert(`Failed to cleanup automation log history - Database "${e.name}"`,t)}}var Kd=gs;async function aT(e,t,r,n){let a,o=new Date().toISOString(),i=await Kd();return(!e||e<i)&&(e=i),r||t?a=await hs(e,o,{automationId:r,status:t,page:n}):a=await ys(e,o,{status:t,page:n,docs:!0,paginate:!0}),a}async function oT(e){return await Is(),await aT(e.startDate,e.status,e.automationId,e.page)}async function sT(e,t){if(!ma.db.isProdAppID(ma.context.getAppId()))return;let r=ms(t),n=await Wd(e,t);r===Vd.AutomationStatus.ERROR&&await As([n]),await Is()}var ha={};R(ha,{checkPluginQuotas:()=>pT,deletePlugin:()=>uT,storePlugin:()=>iT});var Jd=require("@budibase/types"),oe=require("@budibase/backend-core");var Yd=N(require("fs")),Hd=require("path");function zd(e,t){return Yd.default.readFileSync((0,Hd.join)(e,t),"utf8")}async function iT(metadata,directory,source){let db=oe.tenancy.getGlobalDB(),version=metadata.package.version,name=metadata.package.name,description=metadata.package.description,hash=metadata.schema.hash,bucketPath=oe.objectStore.getPluginS3Dir(name),files=await oe.objectStore.uploadDirectory(oe.objectStore.ObjectStoreBuckets.PLUGINS,directory,bucketPath),jsFile=files.find(e=>e.name.endsWith(".js")),iconFile=files.find(e=>e.name.endsWith(".svg"));if(!jsFile)throw new Error("Plugin missing .js file.");if(metadata.schema.type===Jd.PluginType.DATASOURCE){let js=zd(directory,jsFile.name);try{eval(js)}catch(e){let t=e?.message?e.message:JSON.stringify(e);throw new Error(`JS invalid: ${t}`)}}let iconFileName=iconFile?iconFile.name:null,pluginId=oe.db.generatePluginID(name),rev;try{rev=(await db.get(pluginId))._rev}catch(e){rev=void 0}let doc={_id:pluginId,_rev:rev,...metadata,name,version,hash,description,source};iconFileName&&(doc.iconFileName=iconFileName),source&&(doc={...doc,source});let write=async()=>{let e=await db.put(doc);return await oe.events.plugin.imported(doc),{...doc,_rev:e.rev}};return rev?await write():await ns(write)}async function uT(e){let t=oe.tenancy.getGlobalDB();try{let r=await t.get(e),n=oe.objectStore.getPluginS3Dir(r.name);await oe.objectStore.deleteFolder(oe.objectStore.ObjectStoreBuckets.PLUGINS,n),await t.remove(e,r._rev),await oe.events.plugin.deleted(r),await as()}catch(r){let n=r?.message?r?.message:r;throw new Error(`Failed to delete plugin: ${n}`)}}async function pT(){let e=oe.tenancy.getGlobalDB();try{let r=(await e.allDocs(oe.db.getPluginParams())).rows.length;console.log(`Syncing plugin count: ${r}`),await os(r)}catch(t){oe.logging.logAlert("Unable to retrieve plugins for quota check",t)}}var ot={};R(ot,{fetch:()=>lT,fetchValues:()=>dT,isEncryptionKeyAvailable:()=>cT,isValid:()=>ef,remove:()=>gT,update:()=>fT});var wn=require("@budibase/types"),Xd=require("@budibase/backend-core");function cT(){return!!Xd.env.ENCRYPTION_KEY}async function lT(){let e=await Ct.get();return Object.keys(e.variables)}async function dT(e){let r=(await Ct.get()).variables,n={};for(let[a,o]of Object.entries(r))switch(e){case wn.AppEnvironment.DEVELOPMENT:n[a]=o.development;break;case wn.AppEnvironment.PRODUCTION:default:n[a]=o.production;break}return n}async function Zd(e){if(!(await tt.cache.getCachedLicense()).features.includes(wn.Feature.ENVIRONMENT_VARIABLES))throw new Error("User does not have access to environment variables feature.");let r=await Ct.get();r.variables=e(r.variables),await Ct.update(r)}async function fT(e,t){if(ef(e))await Zd(n=>(n[e]=t,n));else throw new Error("Variable name has characters that are not allowed")}async function gT(e){await Zd(t=>(delete t[e],t))}function ef(e){return/^[a-zA-Z0-9-_]+$/.test(e)}var vt={};R(vt,{definitions:()=>_T,download:()=>ET,fetch:()=>vT,write:()=>ST});var Ia=require("@budibase/types");var re=require("@budibase/backend-core"),Ke=require("@budibase/types");var tf=require("memorystream"),rf=new re.sql.Sql(Ke.SqlClient.SQL_LITE);async function mT(e,t,r){let n={operation:Ke.Operation.READ,table:zt.searchTable(),tables:{},paginate:{limit:r||9,page:t},filters:e,resource:{fields:[]},sort:{timestamp:{direction:Ke.SortOrder.DESCENDING,type:Ke.SortType.STRING}}},a=rf._query(n);if(Array.isArray(a))throw new Error("Cannot execute multiple queries for audit log search");return{sql:a.sql,bindings:a.bindings}}function yT(e){return`${re.DocumentType.AUDIT_LOG}${re.SEPARATOR}${e}${re.SEPARATOR}${re.utils.newid()}`}async function nf(e){e._id||(e._id=yT(e.timestamp)),e.type||(e.type=Ke.AUDIT_LOG_TYPE);try{let r=await re.context.getAuditLogsDB().put(e);return{...e,_rev:r.rev}}catch(t){re.logging.logAlert("Failed to write audit log",t)}}async function Ss(e,t,r){t||(t=1);let n=re.context.getAuditLogsDB();try{let a=9+1,o=await mT(e,t,a),i=zt.searchTable(),s=rf.convertJsonStringColumns(i,await n.sql(o.sql,o.bindings)),c;s.length>a&&(c=s.pop());let f={rows:s,hasNextPage:!!c};return f.hasNextPage&&(f.bookmark=t+1),f}catch(a){if(a.status===404&&!r?.isRetry)return await hT(),await iu(),await Ss(e,t,{isRetry:!0});throw a}}async function hT(){let e=re.context.getAuditLogsDB(),r=(await e.allDocs(re.db.getDocParams(re.DocumentType.AUDIT_LOG,null,{include_docs:!0}))).rows.map(n=>n.doc).filter(n=>n&&!n.type).map(n=>({...n,type:Ke.AUDIT_LOG_TYPE}));await e.bulkDocs(r)}function af(e){let t=re.context.getAuditLogsDB(),r=new tf,n=t.dump(r,{filter:o=>{let i=o;if(!i._id?.startsWith(re.DocumentType.AUDIT_LOG))return!1;let s=!0,c=(f,d)=>{!f||f.length===0||(s=!!(s&&d&&f.includes(d)))};if(c(e.userIds,i.userId),c(e.appIds,i.appId),c(e.events,i.event),(e.startDate||e.endDate)&&(s=s&&i.timestamp>=e.startDate&&i.timestamp<=e.endDate),e.fullSearch){let f=JSON.stringify(o);s=s&&f.includes(e.fullSearch)}return s}}),a=new tf;return r.on("data",o=>{let i=JSON.parse(Buffer.from(o).toString());if(Array.isArray(i.docs)){let s="";for(let c of i.docs)s+=JSON.stringify(c)+`
|
|
38
38
|
`;a.write(s)}}),r.on("end",()=>{a.end()}),{promise:n,stream:a}}var Se=require("@budibase/backend-core");var Aa=require("@budibase/types"),vn=require("@budibase/string-templates"),En=require("@budibase/backend-core"),IT=En.constants.MIN_VALID_DATE.toISOString(),bT=En.constants.MAX_VALID_DATE.toISOString();function ws(e){return(e.startDate||e.endDate)&&(e.startDate=e.startDate||IT,e.endDate=e.endDate||bT),e}async function of(e){Array.isArray(e.appIds)&&(e.appIds=e.appIds.map(n=>En.db.getProdAppID(n)));let t={};function r(n,a){a?.length&&(t.oneOf={...t.oneOf,[n]:a})}return r("userId",e.userIds),r("appId",e.appIds),r("event",e.events),e.fullSearch&&(t.fuzzyOr=!0,t.fuzzy={name:e.fullSearch,fallback:e.fullSearch}),(e.startDate||e.endDate)&&(e=ws(e),t.range={timestamp:{high:e.endDate,low:e.startDate}}),Object.keys(t).length===0&&(t.notEmpty={event:!0}),t}function vs(e,t,r){let n={_id:e,status:Aa.AuditLogResourceStatus.DELETED};switch(t){case"app":n.name=r?.appName;break;case"user":n.email=r?.email;break}return n}function Es(e){let t=(0,vn.findHBSBlocks)(e);for(let r of t){let n=` "${r}"`;e=e.replace(e.includes(n)?n:` ${r}`,""),e=(0,vn.processStringSync)(e,{})}return e}function sf(e,t){let r=Aa.AuditedEventFriendlyName[e];if(!r)throw new Error("No friendly name found.");let n=(0,vn.processStringSync)(r,t);return n.includes('""')&&(n=Es(r)),n}async function ST(e,t,r){if(!await pa()||!Se.utils.isAudited(e))return;let n=sf(e,t),a=new Date;r?.timestamp&&(a=new Date(r.timestamp));let o={timestamp:a.toISOString(),event:e,name:n,userId:r?.userId||Ia.AuditLogSystemUser,metadata:{...t,...r?.hostInfo}},i={};try{if(r?.appId){o.appId=Se.db.getProdAppID(r.appId);let s=await Se.cache.app.getAppMetadata(r.appId);"name"in s&&(i.appName=s.name)}if(r?.userId){let s=await Se.users.getById(r?.userId);i.email=s.email}}catch(s){Se.logging.logAlert("Failed to retrieve fallback information for audit log",s)}return o.fallback=i,await nf(o)}async function wT(e){let t=e.map(s=>s.userId),n=e.filter(s=>s.appId).map(s=>Se.db.getDevAppID(s.appId)),a=await Se.users.bulkGetGlobalUsersById([...new Set(t)],{cleanup:!0}),o=await Se.db.getAppsByIDs([...new Set(n)]),i=[];for(let s of e){let c=a.find(m=>m?._id===s.userId),f=o.find(m=>Se.db.isSameAppID(m?.appId,s.appId)),d={event:s.event,timestamp:s.timestamp,name:s.name,metadata:s.metadata,user:c||vs(s.userId,"user",s.fallback)};s.appId&&(d.app=f||vs(s.appId,"app",s.fallback)),i.push(d)}return i}async function vT(e){if(!await pa())throw new Error("Audit logs not available - license required.");let t=await of(e);if(typeof e.bookmark=="string")throw new Error("String based bookmark not supported.");let r=await Ss(t,e.bookmark);return{hasNextPage:r.hasNextPage,bookmark:r.bookmark,data:await wT(r.rows)}}function ET(e){return e=ws(e),af(e)}function _T(){let e=Object.entries(Ia.AuditedEventFriendlyName).filter(r=>r[1]!=null),t={};for(let r of e)t[r[0]]=Es(r[1]);return t}var ba={};R(ba,{applications:()=>Ts,roles:()=>Rs,users:()=>_s});var _s={};R(_s,{roleCheck:()=>xT});function RT(e,t){let r=e.request.body;return r.builder&&(r.builder=t?.builder||void 0),r.admin&&(r.admin=t?.admin||void 0),r.roles&&(r.roles=t?.roles||{}),e.request.body=r,e}async function xT(e,t){return await ct()||RT(e,t),e}var Rs={};R(Rs,{assign:()=>TT,unAssign:()=>OT});var _n=require("@budibase/backend-core");async function TT(e,t){if(!await ct())throw new Error("Unable to assign roles - license required.");let r=await at.bulkGet(e);for(let n of r){if(t.role&&t.role.roleId){let a=_n.db.getProdAppID(t.role.appId);n.roles[a]=t.role.roleId}if(t.appBuilder){let a=_n.db.getProdAppID(t.appBuilder.appId),o=n.builder?.apps||[];n.builder={apps:o.concat([a])}}t.builder&&(n.builder={global:!0}),t.admin&&(n.admin={global:!0}),n.roles}await at.bulkUpdate(r)}async function OT(e,t){if(!await ct())throw new Error("Unable to un-assign roles - license required.");let r=await at.bulkGet(e);for(let n of r){if(t.role){let a=_n.db.getProdAppID(t.role?.appId);n.roles[a]===t.role.roleId&&delete n.roles[a]}if(t.appBuilder&&n.builder?.apps){let a=_n.db.getProdAppID(t.appBuilder.appId);n.builder.apps=n.builder.apps.filter(o=>o!==a)}t.builder&&n.builder&&delete n.builder,t.admin&&n.admin&&delete n.admin}}var Ts={};R(Ts,{buildExportFn:()=>qT,buildImportFn:()=>PT});var xs=require("@budibase/backend-core");function PT(e){return async(t,r)=>{await ct()||t.throw(403,"Endpoint unavailable, license required."),t.request.files?.appExport||t.throw(400,"Must provide app export file for import."),await xs.context.doInAppContext(t.params.appId,async()=>{await e(t),t.body=void 0,t.status=204,await r()})}}function qT(e){return async(t,r)=>{await ct()||t.throw(403,"Endpoint unavailable, license required.");let{encryptPassword:n,excludeRows:a}=t.request.body;await xs.context.doInAppContext(t.params.appId,async()=>{t.request.body={encryptPassword:n,excludeRows:a},t.query.appId=t.params.appId,await e(t),await r()})}}var st=require("@budibase/backend-core"),Ie=require("@budibase/types");var Os=require("@budibase/backend-core"),uf;function pf(){uf=Os.queue.createQueue(Os.queue.JobQueue.APP_BACKUP,{maxStalledCount:3,jobOptions:{attempts:3,removeOnFail:!0,removeOnComplete:!0}})}function Ft(){return uf}var cf=require("path"),lf=N(require("fs"));async function Ps(e,t={}){return Le.storeAppBackupMetadata(e,t)}function df(e){let t=new Date().toISOString();switch(e){case Ie.AppBackupStatus.COMPLETE:case Ie.AppBackupStatus.FAILED:return{timestamp:t,finishedAt:t};case Ie.AppBackupStatus.STARTED:return{timestamp:t,startedAt:t};case Ie.AppBackupStatus.PENDING:return{timestamp:t,createdAt:t}}}async function CT(e,t,r,n){let a=await Sa(e);return await Le.storeAppBackupMetadata({...a,...df(t),contents:r,status:t,type:Ie.AppBackupType.BACKUP},{filename:n,docId:e})}async function UT(e,t,r){let n=await Sa(e);return await Le.storeAppBackupMetadata({...n,...df(r),status:r,type:Ie.AppBackupType.RESTORE,trigger:Ie.AppBackupTrigger.MANUAL},{docId:e,docRev:t})}async function Sa(e){return Le.getAppBackupMetadata(e)}async function LT(e,t){return Le.updateAppBackupMetadata(e,t)}async function DT(e){let t=await Le.getAppBackupMetadata(e);return t.filename&&await st.objectStore.deleteFile(st.objectStore.ObjectStoreBuckets.BACKUPS,t.filename),Le.deleteAppBackupMetadata(e)}async function BT(e,t){return Le.fetchAppBackups(e,t)}async function ff(e){let t=await Le.getAppBackupMetadata(e);if(!t.filename)throw new Error("Backup incomplete - cannot download.");let r=await st.objectStore.getReadStream(st.objectStore.ObjectStoreBuckets.BACKUPS,t.filename);return{metadata:t,stream:r}}async function NT(e){let{stream:t}=await ff(e),r=(0,cf.join)(st.objectStore.budibaseTempDir(),st.utils.newid()),n=lf.default.createWriteStream(r);return new Promise((a,o)=>{t.on("error",o),n.on("error",o),t.pipe(n).on("close",()=>a(r))})}async function MT(e,t,r={}){let n;try{n=await Ps({appId:e,trigger:t,timestamp:new Date().toISOString(),status:Ie.AppBackupStatus.PENDING,type:Ie.AppBackupType.BACKUP,...r})}catch(a){if(a.status===409)return;throw a}return await Ft().add({docId:n.id,docRev:n.rev,appId:e,export:{trigger:t,...r}}),await st.events.backup.appBackupTriggered(e,n.id,Ie.AppBackupType.BACKUP,t,r?.name),n.id}async function GT(e,t,r,n){let a=await Sa(t),o;try{o=await Ps({appId:e,timestamp:new Date().toISOString(),status:Ie.AppBackupStatus.PENDING,type:Ie.AppBackupType.RESTORE,createdBy:n})}catch(i){if(i?.status===409)return;throw i}return await Ft().add({appId:e,docId:o.id,docRev:o.rev,import:{nameForBackup:r,backupId:t,createdBy:n}}),{restoreId:o.id,metadata:a}}var kT={isEnabled:Ho,triggerAppRestore:Re(GT),triggerAppBackup:Re(MT),getBackupDownloadStream:Re(ff),downloadAppBackup:Re(NT),fetchAppBackups:Re(BT),storeAppBackupMetadata:Re(Ps),updateBackupStatus:Re(CT),updateRestoreStatus:Re(UT),getAppBackup:Re(Sa),updateAppBackup:Re(LT),deleteAppBackup:Re(DT)},ft=kT;var Cs={};R(Cs,{init:()=>qs});var se=require("@budibase/backend-core");var Ye=require("@budibase/types");var Ar=N(require("fs"));async function qs(e){Ft().process(async t=>{let r=t.data;try{if(r.export)return $T(t,e);if(r.import)return QT(t,e)}catch(n){se.logging.logAlert(`Failed to perform backup for app ID: ${r.appId}`,n)}})}async function FT(e){await se.db.getDB(e,{skip_setup:!0}).destroy()}async function gf(e,t,r,n){let a=se.db.getDevAppID(r),o=se.db.getProdAppID(r),i=new Date().toISOString(),s=async(c,f)=>{n?.doc?await ft.updateBackupStatus(n.doc.id,c,f?.contents,f?.filename):await ft.storeAppBackupMetadata({appId:o,timestamp:i,trigger:e,status:c,name:n?.name,type:Ye.AppBackupType.BACKUP,contents:f?.contents,createdBy:n?.createdBy},{filename:f?.filename})};try{let c=await n.processing.exportAppFn(a,{tar:!0}),f=await n.processing.statsFn(a),d=`${o}/backup-${i}.tar.gz`,m=se.objectStore.ObjectStoreBuckets.BACKUPS,y=Ar.default.createReadStream(c);await se.objectStore.streamUpload({bucket:m,filename:d,stream:y,extra:{type:"application/gzip",metadata:{name:n?.name,trigger:e,timestamp:i,appId:o}}}),await s(Ye.AppBackupStatus.COMPLETE,{filename:d,contents:f}),Ar.default.existsSync(c)&&Ar.default.rmSync(c)}catch(c){se.logging.logAlert("App backup error",c),await s(Ye.AppBackupStatus.FAILED)}}async function QT(e,t){let r=e.data,n=r.appId,a=r.import.backupId,o=r.import.nameForBackup,i=r.import.createdBy,s=se.tenancy.getTenantIDFromAppID(n);return se.tenancy.doInTenant(s,async()=>{let c=se.db.getDevAppID(n),{rev:f}=await ft.updateRestoreStatus(r.docId,r.docRev,Ye.AppBackupStatus.STARTED);await gf(Ye.AppBackupTrigger.RESTORING,s,n,{processing:t,createdBy:i,name:o});let d=await ft.downloadAppBackup(a);await FT(c);let m=Ye.AppBackupStatus.COMPLETE;try{await t.importAppFn(c,se.db.getDB(c),{file:{type:"application/gzip",path:d},key:d})}catch(y){se.logging.logAlert("App restore error",y),m=Ye.AppBackupStatus.FAILED}await ft.updateRestoreStatus(r.docId,f,m),Ar.default.existsSync(d)&&Ar.default.rmSync(d,{force:!0})})}async function $T(e,t){let r=e.data,n=r.appId,a=r.export.trigger,o=r.export.name,i=se.tenancy.getTenantIDFromAppID(n);await se.tenancy.doInTenant(i,async()=>{try{let{rev:s}=await ft.updateBackupStatus(r.docId,Ye.AppBackupStatus.STARTED);return gf(a,i,n,{processing:t,doc:{id:r.docId,rev:s},name:o})}catch(s){se.logging.logAlert("App backup error",s)}})}var jT=async e=>{pf(),await qs(e.processing)},Ne={...ft,processing:Cs,init:jT,getBackupQueue:Ft};var mf=async e=>{e.backups&&await Ne.init(e.backups)};var ve={};R(ve,{create:()=>NN,find:()=>BN,get:()=>DN,remove:()=>GN,update:()=>MN});var Nh=N(xi()),gt=require("@budibase/backend-core");var Mh=require("@budibase/types");async function DN(e){let t=gt.tenancy.getGlobalDB(),r=new gt.db.QueryBuilder(t.name,Mh.SearchIndex.USER);r.setIndexBuilder(gt.db.searchIndexes.createUserIndex),r.setLimit(e.pageSize),r.addEqual("scimInfo.isSync",!0);for(let[a,o]of Object.entries(e.filters?.equal??{}))r.addEqual(a,o);r.setSort("_id"),r.setSkip(e.skip);let n=await r.run();return{users:n.rows,total:n.totalRows}}async function BN(e){return await gt.users.getById(e)}async function NN(e){let t=await at.getUserByEmail(e.email);if(t){if(t.scimInfo?.isSync)throw new gt.HTTPError("User is already synched",409);e={...t,scimInfo:(0,Nh.default)(t.scimInfo,e.scimInfo),password:void 0,firstName:e.firstName,lastName:e.lastName,updatedAt:e.updatedAt}}return await at.save(e,{requirePassword:!1})}async function MN(e,t){return await at.save(e,{requirePassword:!1,allowChangingEmail:t?.allowChangingEmail})}async function GN(e){return await at.destroy(e)}var Er={};R(Er,{create:()=>kN});var Gh=N(xi());var kh=require("@budibase/backend-core");async function kN(e){let t=await to(e.name),r;if(!t)r=(await J.save(e)).id;else{if(t.scimInfo?.isSync)throw new kh.HTTPError("Group is already synched",409);r=t._id,t.users&&(await J.removeUsers(r,t.users.map(a=>a._id)),delete t.users),t.scimInfo=(0,Gh.default)(t.scimInfo,e.scimInfo),await J.save(t)}return await J.get(r)}var $t={};R($t,{logRequest:()=>$N,logResponse:()=>jN});var Qh=N(Fh()),Et=require("@budibase/backend-core"),{DocWritethrough:FN}=Et.cache.docWritethrough;function QN(){return`${Et.db.DocumentType.SCIM_LOG}${Et.db.SEPARATOR}${(0,Qh.default)().format("YYYYMMDD")}`}var $h=async()=>{let e=Et.context.getScimDBName();return new FN(Et.db.getDB(e),QN())};async function $N(e){let t=Date.now().toString();return await(await $h()).patch({[`${t}_request`]:{ts:new Date().toISOString(),...e}}),t}async function jN(e,t){await(await $h()).patch({[`${e}_response`]:{ts:new Date().toISOString(),...t}})}var Li={};R(Li,{doInScimContext:()=>qi,feature:()=>H,internalGroupOnly:()=>Ba,licensing:()=>jh,requireSCIM:()=>Ci,scimGroupOnly:()=>On,scimUserOnly:()=>Tn});var _t=require("@budibase/backend-core");var La=require("@budibase/types"),WN=(e={checkUsersLimit:!0})=>async(t,r)=>{if((e.licensingCheck?e.licensingCheck:()=>!!t.user)(t)){if(_t.env.SELF_HOSTED&&_t.env.DEFAULT_LICENSE)return t.user.license=no,r();t.user.license=await tt.cache.getCachedLicense(t,{populateLicense:e.populateLicense,populateFreeLicense:e.populateFreeLicense}),e.checkUsersLimit&&(_t.utils.isServingApp(t)||_t.utils.isServingBuilder(t)||_t.utils.isServingBuilderPreview(t)||_t.utils.isPublicApiRequest(t))&&await Ve.usageLimitIsExceeded(La.StaticQuotaName.USERS,La.QuotaUsageType.STATIC)}return r()},jh=WN;var H={};R(H,{requireFeature:()=>VN,requireFeatures:()=>KN});var VN=e=>async(t,r)=>{await ua(e),await r()},KN=(...e)=>async(t,r)=>{await Yo(e),await r()};var Da=require("@budibase/backend-core");var qi=async(e,t)=>{let r;return Da.env.DISABLE_SCIM_CALLS||(r=await $t.logRequest({...e.request.toJSON(),body:e.request.body})),await Da.context.doInScimContext(async()=>{let n=await t();return r&&await $t.logResponse(r,{...e.response.toJSON(),body:e.response.body}),n})};var Ci=async(e,t)=>{await Xo(),await t()};var Wh=require("@budibase/backend-core");var Tn=e=>Ui(Wh.users.getById,e,!0),On=e=>Ui(V.get,e,!0),Ba=e=>Ui(V.get,e,!1);function Ui(e,t,r){return async(n,a)=>{let o=n.params[t];return typeof o!="string"&&n.throw(404),!!(await e(o)).scimInfo?.isSync!==r&&n.throw(404),a()}}var Ki={};R(Ki,{ai:()=>oA,appBackups:()=>jA,auditLogs:()=>LA,environmentVariables:()=>RA,groups:()=>hA,scim:()=>bI,users:()=>_I});var Mi={};R(Mi,{LargeLanguageModel:()=>Rr});var Xh=require("@budibase/backend-core"),Rt=require("@budibase/types"),Zh=require("@budibase/shared-core");var Di=N(require("openai"));function _r(e){return`Summarize this text:
|
|
39
39
|
${e}.
|
|
40
40
|
Only return the summary.`}function Vh(e,t){return`Return the category of this text: "${e}". Based on these categories: ${t.join(", ")}. Only return the category.`}function Kh(e){return`Clean the following string: "${e}". Remove any spelling mistakes or data issues. Only return the cleaned string itself and nothing else.`}function Yh(e){return`Generate a node-cron compatible expression based on the following prompt. Return only the cron expression (without backticks), and if not possible return only 'Error generating cron' with a short explanation:
|
package/package.json
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"dist"
|
|
5
5
|
],
|
|
6
6
|
"license": "UNLICENSED",
|
|
7
|
-
"version": "3.5.
|
|
7
|
+
"version": "3.5.2",
|
|
8
8
|
"description": "Budibase Pro (Backend)",
|
|
9
9
|
"main": "dist/index.js",
|
|
10
10
|
"types": "dist/index.d.ts",
|
|
@@ -71,5 +71,5 @@
|
|
|
71
71
|
}
|
|
72
72
|
}
|
|
73
73
|
},
|
|
74
|
-
"gitHead": "
|
|
74
|
+
"gitHead": "2d3a130fceeb689d3013606dde57bab8db41c586"
|
|
75
75
|
}
|