@budibase/server 3.31.6 → 3.31.8
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/automation.js +1 -1
- package/dist/automation.js.map +1 -1
- package/dist/index.js +229 -229
- package/dist/index.js.map +2 -2
- package/dist/query.js +1 -1
- package/dist/query.js.map +1 -1
- package/package.json +2 -2
- package/src/api/controllers/static/index.ts +9 -2
- package/src/middleware/utils.ts +7 -12
package/dist/query.js
CHANGED
|
@@ -722,7 +722,7 @@ ${e}
|
|
|
722
722
|
t.is_ms_shipped = 0
|
|
723
723
|
ORDER BY
|
|
724
724
|
t.name, c.column_id
|
|
725
|
-
`;return await this.connect(),(await this.internalQuery({sql:r})).recordset}getDataType(r){let{DataType:n,MaxLength:i,Precision:s,Scale:a}=r,{usesMaxLength:u=!1,usesPrecision:c=!1}=Z5t[n]||{},l=n;return u&&(i===-1?l+="(MAX)":l+=`(${i})`),c&&(l+=`(${s}, ${a})`),l}},Cz={schema:X5t,integration:Iz};var Iqe=require("@aws-sdk/client-s3"),Cqe=W(require("csvtojson")),xqe=W(require("stream"));var eYt={docs:"https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html",description:"Amazon Simple Storage Service (Amazon S3) is an object storage service that offers industry-leading scalability, data availability, security, and performance.",friendlyName:"Amazon S3",type:"Object store",features:{connection:!0},datasource:{region:{type:"string",required:!1,default:"us-east-1"},accessKeyId:{type:"password",required:!0},secretAccessKey:{type:"password",required:!0},endpoint:{type:"string",required:!1},signatureVersion:{type:"string",required:!1,default:"v4"}},query:{create:{type:"fields",fields:{bucket:{display:"New Bucket",type:"string",required:!0},location:{required:!0,default:"us-east-1",type:"string"},grantFullControl:{display:"Grant full control",type:"string"},grantRead:{display:"Grant read",type:"string"},grantReadAcp:{display:"Grant read ACP",type:"string"},grantWrite:{display:"Grant write",type:"string"},grantWriteAcp:{display:"Grant write ACP",type:"string"}}},read:{type:"fields",fields:{bucket:{type:"string",required:!0},delimiter:{type:"string"},marker:{type:"string"},maxKeys:{type:"number",display:"Max Keys"},prefix:{type:"string"}}},readCsv:{displayName:"Read CSV",type:"fields",readable:!0,fields:{bucket:{type:"string",required:!0},key:{type:"string",required:!0}}},delete:{type:"fields",fields:{bucket:{type:"string",required:!0},delete:{type:"json",required:!0}}}},extra:{acl:{required:!1,displayName:"ACL",type:"list",data:{create:["private","public-read","public-read-write","authenticated-read"]}}}},xz=class{static{o(this,"S3Integration")}constructor(t){this.config={forcePathStyle:t.s3ForcePathStyle||!0,credentials:{accessKeyId:t.accessKeyId,secretAccessKey:t.secretAccessKey},region:t.region,endpoint:t.endpoint},t.endpoint?(this.config.requestChecksumCalculation="WHEN_REQUIRED",this.config.responseChecksumValidation="WHEN_REQUIRED",this.config.forcePathStyle=!0):delete this.config.endpoint,this.client=new Iqe.S3(this.config)}async testConnection(){let t={connected:!1};try{await this.client.listBuckets({MaxBuckets:1}),t.connected=!0}catch(r){t.error=r.message}return t}async create(t){let r={Bucket:t.bucket,ACL:t.extra?.acl,GrantFullControl:t.grantFullControl,GrantRead:t.grantRead,GrantReadACP:t.grantReadAcp,GrantWrite:t.grantWrite,GrantWriteACP:t.grantWriteAcp};return t.location&&(r.CreateBucketConfiguration={LocationConstraint:t.location}),await this.client.createBucket(r)}async read(t){return(await this.client.listObjects({Bucket:t.bucket,Delimiter:t.delimiter,Marker:t.marker,MaxKeys:t.maxKeys,Prefix:t.prefix})).Contents}async readCsv(t){let n=(await this.client.getObject({Bucket:t.bucket,Key:t.key})).Body?.transformToWebStream();if(!n||!(n instanceof xqe.default.Readable))throw new Error("Unable to retrieve CSV - invalid stream");let i=!1;return new Promise((s,a)=>{n.on("error",c=>{a(c)});let u=(0,Cqe.default)().fromStream(n).on("error",()=>{i=!0});n.on("end",()=>{s(u)})}).catch(s=>{throw i?new Error("Could not read CSV"):s})}async delete(t){return await this.client.deleteObjects({Bucket:t.bucket,Delete:JSON.parse(t.delete)})}},Dz={schema:eYt,integration:xz};var Dqe=W(require("airtable"));var tYt={docs:"https://airtable.com/api",description:"Airtable is a spreadsheet-database hybrid, with the features of a database but applied to a spreadsheet.",friendlyName:"Airtable",type:"Spreadsheet",features:{connection:!0},datasource:{apiKey:{type:"password",default:"enter api key",required:!0},base:{type:"string",default:"mybase",required:!0}},query:{create:{type:"fields",customisable:!0,fields:{table:{type:"string",required:!0}}},read:{type:"fields",fields:{table:{type:"string",required:!0},view:{type:"string",required:!0},numRecords:{type:"number",default:10}}},update:{type:"fields",customisable:!0,fields:{id:{display:"Record ID",type:"string",required:!0},table:{type:"string",required:!0}}},delete:{type:"json"}}},Pz=class{static{o(this,"AirtableIntegration")}constructor(t){this.config=t,this.client=new Dqe.default(t).base(t.base)}async testConnection(){let t=Date.now().toString();try{return await this.client.makeRequest({path:`/${t}`}),{connected:!0}}catch(r){return r.message===`Could not find table ${t} in application ${this.config.base}`?{connected:!0}:{connected:!1,error:r.message}}}async create(t){let{table:r,json:n}=t;try{return await this.client(r).create([{fields:n}])}catch(i){throw console.error("Error writing to airtable",i),i}}async read(t){try{return(await this.client(t.table).select({maxRecords:t.numRecords||10,view:t.view}).firstPage()).map(({fields:n})=>n)}catch(r){return console.error("Error writing to airtable",r),[]}}async update(t){let{table:r,id:n,json:i}=t;try{return await this.client(r).update([{id:n,fields:i}])}catch(s){throw console.error("Error writing to airtable",s),s}}async delete(t){try{return await this.client(t.table).destroy(t.ids)}catch(r){throw console.error("Error writing to airtable",r),r}}},Nz={schema:tYt,integration:Pz};var Pqe=W(require("mysql2/promise"));var rYt=He.Sql,nYt={docs:"https://github.com/sidorares/node-mysql2",plus:!0,friendlyName:"MySQL",type:"Relational",description:"MySQL Database Service is a fully managed database service to deploy cloud-native applications. ",features:{connection:!0,fetch_table_names:!0},datasource:{host:{type:"string",default:li,required:!0},port:{type:"number",default:3306,required:!1},user:{type:"string",default:"root",required:!0},password:{type:"password",default:"root",required:!0},database:{type:"string",required:!0},ssl:{type:"object",required:!1},rejectUnauthorized:{type:"boolean",default:!0,required:!1}},query:{create:{type:"sql"},read:{type:"sql"},update:{type:"sql"},delete:{type:"sql"}}},iYt=o(function(e,t){return e.type=="DATETIME"||e.type==="DATE"||e.type==="TIMESTAMP"||e.type==="LONGLONG"?e.string():e.type==="BIT"&&e.length===1?e.buffer()?.[0]:t()},"defaultTypeCasting");function oYt(e){for(let t=0;t<e.length;t++){let r=e[t];if(typeof r!="string")continue;let n=r.match(_qe);if(n&&n[0]!==""&&!isNaN(Number(n[0])))e[t]=parseFloat(r);else if(wqe(r)){let i;i=new Date(r),isNaN(i)&&(i=r),e[t]=i}}return e}o(oYt,"bindingTypeCoerce");var Lz=class extends rYt{constructor(r){super("mysql2");this.config=r,r.ssl&&Object.keys(r.ssl).length===0&&delete r.ssl,r.rejectUnauthorized!=null&&!r.rejectUnauthorized&&r.ssl&&typeof r.ssl!="string"&&(r.ssl.rejectUnauthorized=r.rejectUnauthorized),delete r.rejectUnauthorized,this.config={...r,typeCast:iYt,multipleStatements:!0,timezone:"Z"}}static{o(this,"MySQLIntegration")}async testConnection(){let r={connected:!1};try{let[n]=await this.internalQuery({sql:"SELECT 1+1 AS checkRes"},{connect:!0});r.connected=n?.checkRes==2}catch(n){let i=ch("MYSQL",n.errno);i?r.error=i:r.error=n.message}return r}getBindingIdentifier(){return"?"}getStringConcat(r){return`concat(${r.join(", ")})`}defineTypeCastingFromSchema(r){r&&(this.config.typeCast=function(n,i){if(r[n.name]?.name===n.name&&["LONGLONG","NEWDECIMAL","DECIMAL"].includes(n.type))if(r[n.name]?.type==="number"){let s=n.string();return s?Number(s):null}else return n.string();return n.type=="DATETIME"||n.type==="DATE"||n.type==="TIMESTAMP"?n.string():n.type==="BIT"&&n.length===1?n.buffer()?.[0]:i()})}async connect(){this.client=await Pqe.default.createConnection(this.config),(await this.internalQuery({sql:"SELECT VERSION();"},{connect:!1}))?.[0]?.["VERSION()"]?.toLowerCase().includes("mariadb")&&this.setExtendedSqlClient("mariadb")}async disconnect(){await this.client.end()}async internalQuery(r,n={connect:!0,disableCoercion:!1}){try{n?.connect&&await this.connect();let i=r.bindings||[],s=n?.disableCoercion?i:oYt(i);return this.log(r.sql,s),(await this.client.query(r.sql,s))[0]}catch(i){let s=ch("MYSQL",i.errno);throw s?new Error(s,{cause:i}):i}finally{n?.connect&&this.client&&await this.disconnect()}}async buildSchema(r,n){let i={};await this.connect();try{let u=await this.queryTableNames();for(let c of u){let l=[],f={},d=await this.internalQuery({sql:`DESCRIBE \`${c}\`;`},{connect:!1});for(let p of d){let h=p.Field;p.Key==="PRI"&&l.indexOf(p.Key)===-1&&l.push(h);let m=p.Default!=null,g=typeof p.Extra=="string"&&(p.Extra==="auto_increment"||p.Extra.toLowerCase().includes("generated")),y=p.Null!=="YES";f[h]=Sf({name:h,autocolumn:g,presence:y&&!g&&!m,externalType:p.Type,options:p.Type.startsWith("enum")?p.Type.substring(6,p.Type.length-2).split("','"):void 0})}i[c]||(i[c]={type:"table",_id:Ji(r,c),sourceId:r,sourceType:"external",primary:l,name:c,schema:f})}}finally{await this.disconnect()}let s=ru(i,n),a=nu(i);return{tables:s,errors:a}}async queryTableNames(){return(await this.internalQuery({sql:"SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_TYPE = 'BASE TABLE'"},{connect:!1})).map(n=>n.TABLE_NAME)}async getTableNames(){await this.connect();try{return this.queryTableNames()}finally{await this.disconnect()}}async queryViewNames(){return(await this.internalQuery({sql:"SELECT TABLE_NAME FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_SCHEMA = DATABASE()"},{connect:!1})).map(n=>n.TABLE_NAME)}async getViewNames(){await this.connect();try{return this.queryViewNames()}finally{await this.disconnect()}}async create(r){let n=await this.internalQuery(Br(r));return n.length?n:[{created:!0}]}async read(r){return this.internalQuery(Br(r))}async update(r){let n=await this.internalQuery(Br(r));return n.length?n:[{updated:!0}]}async delete(r){let n=await this.internalQuery(Br(r));return n.length?n:[{deleted:!0}]}async query(r){await this.connect();try{let n=o(s=>this.internalQuery(s,{connect:!1,disableCoercion:!0}),"queryFn"),i=o(s=>Array.isArray(s)?this.convertJsonStringColumns(r.table,s,r.tableAliases):s,"processFn");return await this.queryWithReturning(r,n,i)}finally{await this.disconnect()}}},kz={schema:nYt,integration:Lz};var nL=require("arangojs");var sYt={docs:"https://github.com/arangodb/arangojs",friendlyName:"ArangoDB",type:"Non-relational",description:"ArangoDB is a scalable open-source multi-model database natively supporting graph, document and search. All supported data models & access patterns can be combined in queries allowing for maximal flexibility. ",features:{connection:!0},datasource:{url:{type:"string",default:"http://localhost:8529",required:!0},username:{type:"string",default:"root",required:!0},password:{type:"password",required:!0},databaseName:{type:"string",default:"_system",required:!0},collection:{type:"string",required:!0}},query:{read:{type:"sql"},create:{type:"json"}}},Mz=class{static{o(this,"ArangoDBIntegration")}constructor(t){let r={url:t.url,databaseName:t.databaseName,auth:{username:t.username,password:t.password}};this.config=t,this.client=new nL.Database(r)}async testConnection(){let t={connected:!1};try{await this.client.get(),t.connected=!0}catch(r){t.error=r.message}return t}async read(t){try{return(await this.client.query(t.sql)).all()}catch(r){throw console.error("Error querying arangodb",r.message),r}finally{this.client.close()}}async create(t){let r=this.client.collection(this.config.collection);try{return(await this.client.query(nL.aql`INSERT ${t.json} INTO ${r} RETURN NEW`)).all()}catch(n){throw console.error("Error querying arangodb",n.message),n}finally{this.client.close()}}},Uz={schema:sYt,integration:Mz};var NQe=W(require("lodash/get")),oX=W(require("querystring")),dM=require("perf_hooks"),sX=require("url");var LQe=require("content-disposition"),kQe=W(require("path")),MQe=require("xml2js");function Nqe(e,t){let r=e.get("content-type")||"",n=e.get("content-disposition")||"";if(n){let i=/"(?:[^"\\]|\\.)*"|[;=]/g,s=null,a=!1,u=!1;for(;(s=i.exec(n))!==null;){if(s[0]===";"){a=!0;break}s[0]==="="&&(u=!0)}if(!a&&u)return{contentDisposition:`attachment; ${n}`,contentType:r}}else if(t?.downloadImages&&r.startsWith("image/"))return{contentDisposition:`attachment; filename="image.${r.split("/")[1]}"`,contentType:r};return{contentDisposition:n,contentType:r}}o(Nqe,"getAttachmentHeaders");var $z={};$($z,{init:()=>cYt,revertDevChanges:()=>Lqe});var Bz={};$(Bz,{getAppUrl:()=>uYt,isWorkspacePublished:()=>Fz});var aYt=/\/|\\/g;function uYt(e){let t;return e?.url?t=encodeURI(e?.url):e?.name&&(t=encodeURI(`${e?.name}`)),t&&(t=`/${t.replace(aYt,"")}`.toLowerCase()),t}o(uYt,"getAppUrl");async function Fz(e){return F.isDevWorkspaceID(e)&&(e=F.getProdWorkspaceID(e)),!!(await F.getWorkspacesByIDs([e])).length}o(Fz,"isWorkspacePublished");var qz,jz=class extends Xr.QueuedProcessor{constructor(){super(Xr.JobQueue.DEV_REVERT_PROCESSOR,{maxAttempts:3,removeOnFail:!1,removeOnComplete:!1,maxStalledCount:3,waitForCompletionMs:1e4});this.processFn=async r=>await C.doInWorkspaceContext(r.appId,()=>this.revertApp(r))}static{o(this,"DevRevertProcessor")}async revertApp(r){let{appId:n}=r,i=F.getProdWorkspaceID(n),s=C.getProdWorkspaceDB({skip_setup:!0});if(!await Fz(i))throw new Xr.UnretriableError("App must be deployed to be reverted.");let u=await s.get("deployments");if(!u.history||Object.keys(u.history).length===0)throw new Xr.UnretriableError("No deployments for app");let c=new F.Replication({source:i,target:n});try{await c.rollback();let l=C.getWorkspaceDB(),f=await l.get("app_metadata");return f.appId=n,f.instance._id=n,await l.put(f),await Ue.workspace.invalidateWorkspaceMetadata(n),await Le.app.reverted(f),{message:"Reverted changes successfully."}}catch(l){throw new Error(`Unable to revert. ${l}`,{cause:l})}finally{await c.close()}}};function Wz(){return qz||(qz=new jz),qz}o(Wz,"devRevertProcessor");async function Lqe(e){return await Wz().execute(e)}o(Lqe,"revertDevChanges");var cYt=o(async()=>{Wz()},"init");var MY={};$(MY,{backfillPluginOrigins:()=>BXt,enrichUsedPluginSvelteMajors:()=>jXt,fetch:()=>MXt,normaliseGithubUrl:()=>C$e,parseGithubRepo:()=>UXt,processUploaded:()=>qXt});var Bqe=require("path");var iu=ge.budibaseTempDir;var XT=W(require("fs"));var Gz=require("path");var kqe=W(require("tar")),lYt=require("uuid");var iL=ne.TOP_LEVEL_PATH,O7r=(0,Gz.join)(iL,"packages","server");var Mqe=o(e=>XT.default.createReadStream(e),"streamFile"),Uqe=o(e=>{let t=(0,Gz.join)(iu(),e);try{XT.default.existsSync(t)&&XT.default.rmSync(t,{recursive:!0,force:!0}),XT.default.mkdirSync(t)}catch(r){throw new Error(`Path cannot be created: ${r.message}`)}return t},"createTempFolder"),Fqe=o(async(e,t)=>{await kqe.extract({file:e,C:t})},"extractTarball");var K7r=(0,Bqe.join)(iL,"node_modules");var sa=W(require("fs")),Vy=require("path");var qqe=W(require("stream"));var fYt=(0,Vy.join)(iu(),"datasource"),dYt=(0,Vy.join)(iu(),"automation"),jqe=o(async e=>{let t,r;try{if(t=JSON.parse(sa.default.readFileSync((0,Vy.join)(e,"package.json"),"utf8")),r=JSON.parse(sa.default.readFileSync((0,Vy.join)(e,"schema.json"),"utf8")),!t.name)throw new Error("package.json is missing 'name'.");if(!t.version)throw new Error("package.json is missing 'version'.");if(!t.description)throw new Error("package.json is missing 'description'.")}catch(n){throw new Error(`Unable to process schema.json/package.json in plugin. ${n.message}`,{cause:n})}return{metadata:{package:t,schema:r},directory:e}},"getPluginMetadata");async function Wqe(e,t){let r=t.schema?.hash;sa.default.existsSync(e)||sa.default.mkdirSync(e);let n=(0,Vy.join)(e,t.name),i=`${n}.bbmetadata`;if(sa.default.existsSync(n)){if(sa.default.readFileSync(i,"utf8")===r)return require(n);console.log(`Updating plugin: ${t.name}`),delete require.cache[require.resolve(n)],sa.default.unlinkSync(n)}let s=ge.getPluginJSKey(t),a=await ge.retrieve(ge.ObjectStoreBuckets.PLUGINS,s);return a instanceof qqe.default.Readable?a.pipe(sa.default.createWriteStream(n)):sa.default.writeFileSync(n,a),sa.default.writeFileSync(i,r),require(n)}o(Wqe,"getPluginImpl");var $qe=o(async e=>Wqe(fYt,e),"getDatasourcePlugin"),Gqe=o(async e=>Wqe(dYt,e),"getAutomationPlugin");var Vqe=o(async(e,t)=>{let n=`https://prod-budi-templates.s3-eu-west-1.amazonaws.com/templates/${e}/${t}.tar.gz`;return ge.downloadTarball(n,mr.TEMPLATES,e)},"downloadTemplate");async function Hqe(e){if(!e.name||!e.path)throw new Error("File is not valid - cannot upload.");if(!e.name.endsWith(".tar.gz"))throw new Error("Plugin must be compressed into a gzipped tarball.");let t=Uqe(e.name.split(".tar.gz")[0]);return await Fqe(e.path,t),await jqe(t)}o(Hqe,"fileUpload");var bYt=require("socket.io"),_Yt=require("koa-useragent");var wYt=require("@socket.io/redis-adapter");var b9r=typeof ne.RECAPTCHA_SESSION_SECONDS=="string"?parseInt(ne.RECAPTCHA_SESSION_SECONDS):ne.RECAPTCHA_SESSION_SECONDS,pYt;var hYt;async function Qqe(e){return await pYt.bulkGet(e)}o(Qqe,"getLocksById");async function Vz(e){let t=await hYt?.get(e);return!!(t&&t.testing)}o(Vz,"checkTestFlag");var EYt=require("uuid");var mYt=W(require("cookies"));var z9r=new RegExp(["webhooks/trigger","webhooks/schema","webhooks/discord","webhooks/ms-teams","webhooks/slack"].join("|"));var aXr=ra.buildCsrfMiddleware();var LXt=require("koa-useragent");function ZT({row:e,tableName:t,fieldName:r,isLinked:n}){let i=e[`${t}.${r}`];return i==null&&!n&&(i=e[r]),i}o(ZT,"extractFieldValue");function Yqe(e,t){return ZT({row:e,tableName:t._id,fieldName:"_id",isLinked:!1})}o(Yqe,"getInternalRowId");function Ac(e,t,r=!1){let n=t.primary;if(!e||!n)return"";let i=[];for(let s of n){let a=ZT({row:e,tableName:t.name,fieldName:s,isLinked:r});a!=null&&i.push(a)}return i.length===0?"":ZN(i)}o(Ac,"generateIdForRow");function vYt(e,t){for(let[r,n]of Object.entries(t.schema))if(UA.includes(n.type)&&typeof e[r]=="string")try{e[r]=JSON.parse(e[r])}catch{fe.schema.isDeprecatedSingleUserColumn(n)||delete e[r]}return e}o(vYt,"fixJsonTypes");async function Hz({row:e,source:t,tables:r,isLinked:n,sqs:i}){let s,a=!1;x.views.isView(t)?(s=await x.views.getTable(t.id),a=fe.views.isCalculationView(t)):s=t;let u={};for(let l of Object.keys(s.schema)){let f=ZT({row:e,tableName:s.name,fieldName:l,isLinked:n});f instanceof Buffer?f=f.toString():f!=null&&(u[l]=f)}if(x.views.isView(t))for(let l of Object.keys(fe.views.calculationFields(t)))u[l]=e[l];let c=Object.keys(s.schema);if(!i&&!a)u._id=Ac(e,s,n),u.tableId=s._id,u._rev=qX,c=c.concat(io);else if(!a){c=c.concat(io);for(let l of[...Hr,...c])u[l]=ZT({row:e,tableName:s._id,fieldName:l,isLinked:n})}for(let l of c){let f=s.schema[l];if(f?.type!=="link")continue;let d=r.find(m=>m._id===f.tableId);if(!d)continue;let p=ZT({row:e,tableName:s._id,fieldName:l,isLinked:n}),h=Array.isArray(p)?p:typeof p=="string"?JSON.parse(p):void 0;if(h&&Array.isArray(h)){u[l]=h;let m=d.primaryDisplay||d.primary[0];u[l]=(await Promise.all(u[l].map(g=>Hz({row:g,source:d,tables:r,isLinked:!1,sqs:i})))).sort((g,y)=>{let b=g?.[m],w=y?.[m];if(b){if(!w)return-1}else return 1;return b.localeCompare?b.localeCompare(w):b-w})}}return vYt(u,s)}o(Hz,"basicProcessing");function ev(e){return!!e.through}o(ev,"isManyToMany");function Jqe(e,t){let r=[];for(let[n,i]of Object.entries(e.schema)){if(i.type!=="link"||!i.tableId)continue;let{tableName:s}=gr(i.tableId);if(!t[s])continue;let a=t[s];if(!e.primary||!a.primary)continue;let u={tableName:s,column:n};if(ev(i)&&i.through){let{tableName:c}=gr(i.through);u.through=c,u.from=i.throughTo||e.primary[0],u.to=i.throughFrom||a.primary[0],u.fromPrimary=e.primary[0],u.toPrimary=a.primary[0]}else(MA(i)||kA(i))&&(u.from=i.foreignKey||e.primary[0],u.to=i.fieldName);r.push(u)}return r}o(Jqe,"buildExternalRelationships");function Xqe(e,t){let r=[],n=Object.values(e.schema).filter(s=>s.type==="link"),i=e._id;for(let s of n){if(s.type!=="link")continue;let a=s.tableId,u=wf(i,a),c=i>a;t.find(l=>l._id===a)&&r.push({through:u,column:s.name,tableName:a,fromPrimary:"_id",to:c?"doc2.rowId":"doc1.rowId",from:c?"doc1.rowId":"doc2.rowId",toPrimary:"_id"})}return r}o(Xqe,"buildInternalRelationships");async function Zqe(e,t,r){let{relationships:n}=r||{},i=["link","formula","ai"];function s(d,p=[]){return Object.entries(d.schema).filter(([h,m])=>!i.includes(m.type)&&!p.find(g=>g===h)).map(([h])=>h)}o(s,"extractRealFields");function a(d,p=[]){let h=[];return d.primary&&h.push(...d.primary),d.primaryDisplay&&h.push(d.primaryDisplay),He.utils.isExternalTable(d)||h.push(...Hr),h.filter(m=>!p.find(g=>g===m)&&d.schema[m]&&!i.includes(d.schema[m].type))}o(a,"getRequiredFields");let u=[],c=x.views.isView(e),l;c?(l=await x.views.getTable(e.id),u=Object.keys(fe.views.basicFields(e)).filter(d=>l.schema[d].type!=="link")):(l=e,u=s(e).filter(d=>l.schema[d].visible!==!1));let f=(c?u:Object.keys(l.schema)).some(d=>l.schema[d]?.type==="formula");f&&(u=s(l)),(!c||!fe.views.isCalculationView(e))&&u.push(...a({...l,primaryDisplay:e.primaryDisplay||l.primaryDisplay},u)),u=u.map(d=>`${l.name}.${d}`);for(let d of Object.values(l.schema)){if(d.type!=="link"||!n||!d.tableId||c&&(!e.schema?.[d.name]||!fe.views.isVisible(e.schema[d.name]))&&!f)continue;let{tableName:p}=gr(d.tableId),h=t[p];if(!h)continue;let m=new Set;f?s(h).forEach(y=>m.add(y)):(h.primary?.forEach(y=>m.add(y)),h.primaryDisplay&&m.add(h.primaryDisplay),c&&Object.entries(e.schema?.[d.name]?.columns||{}).filter(([y,b])=>h.schema[y]&&fe.views.isVisible(b)&&!["link","formula"].includes(h.schema[y].type)).forEach(([y])=>m.add(y)));let g=Array.from(m).filter(y=>!i.includes(h.schema[y].type)).map(y=>`${h.name}.${y}`).filter(y=>!u.includes(y));u.push(...g)}return[...new Set(u)]}o(Zqe,"buildSqlFieldList");function Qz(e){return!Array.isArray(e)||e.length===0||"read"in e[0]&&e[0].read===!0}o(Qz,"isKnexEmptyReadResponse");function eje(e){return!Qz(e)}o(eje,"isKnexRows");var A$e=require("lodash/fp");var p$e=W(require("lodash/flatten")),h$e=W(require("lodash/partition"));var bh={};$(bh,{auditLogs:()=>tY,automations:()=>eb,backups:()=>rb,branding:()=>N5,environmentVariables:()=>Dv,features:()=>Xi,groups:()=>Kn,init:()=>b9t,licensing:()=>Qn,logger:()=>DL,plugins:()=>Y5,publicApi:()=>oY,quotas:()=>Et,scimGroups:()=>lY,scimUsers:()=>cY,users:()=>W5,utils:()=>b5});var N5={};$(N5,{getBrandingConfig:()=>YJt});var Xi={};$(Xi,{checkBackups:()=>Ii,checkFeature:()=>C5,checkFeatures:()=>iWe,checkSCIM:()=>sWe,isAuditLogsEnabled:()=>TL,isBackupsEnabled:()=>x5,isBrandingEnabled:()=>D5,isEnforceableSSO:()=>oWe,isExpandedPublicApiEnabled:()=>Jy,isPWAEnabled:()=>jJt,isPkceOidcEnabled:()=>$Jt,isRecaptchaEnabled:()=>WJt,isSSOEnforced:()=>HJt,isSyncAutomationsEnabled:()=>BJt,isTranslationsEnabled:()=>GJt,isTriggerAutomationRunEnabled:()=>qJt,isUserGroupsEnabled:()=>P5,isViewPermissionEnabled:()=>QJt,isViewReadonlyColumnsEnabled:()=>KJt,isWorkspaceImportExportEnabled:()=>VJt,isWorkspaceImportExportPublicApiEnabled:()=>vL});var Qn={};$(Qn,{cache:()=>la,client:()=>Of,features:()=>bL,getFreeLicense:()=>v5,getLicense:()=>T5,getLicenseFromKey:()=>Xje,keys:()=>R5,offline:()=>wL,quotas:()=>_L});var la={};$(la,{getCachedLicense:()=>rWe,invalidate:()=>nWe,refresh:()=>ph});var SL=W(require("dd-trace"));var Of={};$(Of,{activateLicenseKey:()=>h5,getLicense:()=>zy,getLicenseFromKey:()=>p5,triggerQuota:()=>pJt});var tje=W(require("node-fetch"));var Kz=require("dd-trace"),rje=require("dd-trace/ext/formats");var zz=class{constructor(t){this.apiCall=t=>async(r="",n={})=>await Kz.tracer.trace(`api.${t}`,async i=>{i.setTag("url",r);let s={...n.headers};s["Content-Type"]||(s["Content-Type"]="application/json",s.Accept="application/json");let a=s["Content-Type"]==="application/json";Ne.correlation.setHeader(s),Kz.tracer.inject(i,rje.HTTP_HEADERS,s);let u={method:t,body:a?JSON.stringify(n.body):n.body,headers:s,credentials:"include"};return(0,tje.default)(`${this.host}${r}`,u)});this.post=this.apiCall("POST");this.get=this.apiCall("GET");this.patch=this.apiCall("PATCH");this.del=this.apiCall("DELETE");this.put=this.apiCall("PUT");this.host=t}static{o(this,"API")}},Yz=zz;var{getDispatcher:rZr}=Je;var ua={};$(ua,{bustCache:()=>Zz,getCurrentUsageValues:()=>lje,getQuotaUsage:()=>fh,setAllUsage:()=>t5,setAppUsageValue:()=>e5,setUsage:()=>aje,setUsagePerApp:()=>uje,utils:()=>iv});var iv={};$(iv,{generateBaseQuotaUsage:()=>oL,generateNewMonthlyQuotas:()=>nv,generateNewQuotaUsage:()=>Xz,getBreakdownName:()=>aL,getCurrentMonthString:()=>vf,getQuotaDocId:()=>rv,setCurrentMonth:()=>sL,setQuotaReset:()=>Jz});var rv=o(()=>C.isSelfHostUsingCloud()?`quota_usage_${C.getTenantId()}`:F.StaticDatabases.GLOBAL.docs.usageQuota,"getQuotaDocId"),nje=o(()=>{let e=new Date;return new Date(e.getFullYear(),e.getMonth()+1,1).toISOString()},"getNextQuotaReset"),Jz=o(e=>{e.quotaReset=nje()},"setQuotaReset"),vf=o(()=>{let e=new Date,t=e.getMonth()+1,r=e.getFullYear();return`${t}-${r}`},"getCurrentMonthString"),oL=o(()=>({usageQuota:{apps:0,rows:0,plugins:0,users:0,creators:0,userGroups:0,aiCustomConfigs:0,triggers:{}},monthly:{[vf()]:nv()}}),"generateBaseQuotaUsage"),Xz=o(()=>{let e={_id:rv(),quotaReset:nje(),...oL(),apps:{}};return sL(e),e},"generateNewQuotaUsage"),nv=o(()=>({queries:0,automations:0,budibaseAICredits:0,actions:0,triggers:{}}),"generateNewMonthlyQuotas"),sL=o(e=>{let t=vf();e.monthly||(e.monthly={}),e.monthly[t]||(e.monthly[t]=nv()),e.monthly.current=e.monthly[t]},"setCurrentMonth"),aL=o((e,t)=>{if(!(!t||!e))switch(e){case"automations":return"automations";case"queries":return Os(t)?"rowQueries":im(t)?"datasourceQueries":void 0}},"getBreakdownName");var ije=jt.fromSeconds(60).toMs(),{Writethrough:oje}=Ue.writethrough;function AYt(e){return delete e.usageLimits,delete e.usageQuota.automationRuns,delete e.usageQuota.emails,delete e.usageQuota.storage,delete e.usageQuota.views,delete e.usageQuota.publishedApps,delete e.usageQuota.developers,e}o(AYt,"clearDeprecated");var uL=o(()=>Ee.isSelfHostUsingCloud()?new oje(Ee.getSelfHostCloudDB(),ije):new oje(Ee.getGlobalDB(),ije),"getDB");async function Zz(e=0){let r=uL(),n=rv(),i=await r.tryGet(n);i&&i._rev&&await r.remove(n,i._rev).catch(async s=>{if(e<1)return await Zz(e+1);throw s})}o(Zz,"bustCache");var fh=o(async()=>{let e=uL(),t=await e.tryGet(rv());if(!t){t=Xz();let{rev:r}=await e.put(t);t._rev=r}return sL(t),Jz(t),AYt(t)},"getQuotaUsage"),aje=o(async(e,t,r)=>t5({name:t,type:r,values:{total:e}}),"setUsage"),uje=o(async(e,t,r)=>{let n=uL(),i=await fh(),s=Object.values(e).reduce((u,c)=>u+c,0);for(let[u,c]of Object.entries(e))i=cje(i,t,r,{total:s,app:c},{appId:u});let a=await n.put(i);return i._rev=a.rev,i},"setUsagePerApp"),RYt=o((e,t,r,n)=>{let i=aL(t,r);if(!i||!n?.breakdown)return e;e.breakdown||(e.breakdown={}),e.breakdown[i]||(e.breakdown[i]={parent:t,values:{}});let s=e.breakdown[i];return s.values[r]=n.breakdown,e},"setBreakdown"),e5=o((e,t,r,n={},i)=>{let s;try{s=F.getProdWorkspaceID(n?.appId||C.getWorkspaceId())}catch{}if(!s||!i.app||!Uh.includes(t))return e;e.apps?.[s]||(e.apps={...e.apps,[s]:oL()});let a=e.apps[s];switch(r){case"static":a.usageQuota[t]=i.app;break;case"monthly":{let u=vf(),c=t,l=a.monthly[u];l||(a.monthly[u]=nv(),l=a.monthly[u]),l[c]=i.app,LX.includes(c)&&n?.id&&(l=RYt(l,c,n.id,i));break}}return e},"setAppUsageValue"),sje=o((e,t,r,n)=>{if(!Uh.includes(r))return{};let i;try{i=F.getProdWorkspaceID(C.getWorkspaceId())}catch{}if(!i||!e.apps||!e.apps[i])return{app:0};let s=e.apps[i];switch(t){case"static":if(s.usageQuota?.[r])return{app:s.usageQuota[r]};break;case"monthly":{let a=vf(),u=r;if(!s.monthly?.[a]?.[u])break;let c=s.monthly[a],l=c[u],f,d=aL(u,n);return d&&n&&c.breakdown?.[d]&&(f=c.breakdown[d]?.values[n]),{app:l,breakdown:f||0}}}return{app:0}},"getAppUsageValue"),OYt=o((e,t,r)=>{t.usageQuota.triggers||(t.usageQuota.triggers={}),r&&(t.usageQuota.triggers[e]=r)},"setStaticTriggers"),IYt=o((e,t,r,n)=>{r.monthly[t].triggers||(r.monthly[t].triggers={}),n&&(r.monthly[t].triggers[e]=n)},"setMonthlyTriggers"),cje=o((e,t,r,n,i={})=>{if(r==="static")t=t,e.usageQuota[t]=n.total,OYt(t,e,n.triggers);else if(r==="monthly"){t=t;let s=vf();e.monthly[s][t]=n.total,IYt(t,s,e,n.triggers)}else throw new Error(`Invalid usage type: ${r}`);return e5(e,t,r,i,n)},"coreUsageUpdate"),t5=o(async e=>{let t=Array.isArray(e)?e:[e],r=uL(),n=await fh();for(let s of t)n=cje(n,s.name,s.type,s.values,s.opts);let i=await r.put(n,0);return n._rev=i.rev,n},"setAllUsage"),lje=o(async(e,t,r)=>{let n=await fh(),i=0,s={};switch(e){case"static":if(n.usageQuota[t]){let a=t;i=n.usageQuota[a],s=sje(n,e,t,r)}break;case"monthly":{let a=vf(),u=t;n.monthly[a][u]&&(i=n.monthly[a][u],s=sje(n,e,t,r));break}default:throw new Error(`Invalid usage type: ${e}`)}return Uh.includes(t)&&!(s.app||s.breakdown)&&(s.app=s.app||0,s.breakdown=s.breakdown||0),{total:i,app:s.app,breakdown:s.breakdown}},"getCurrentUsageValues");var ms={};$(ms,{destroy:()=>DYt,get:()=>r5,save:()=>xYt});var CYt=o(()=>({_id:Zt.GLOBAL.docs.licenseInfo}),"newLicenseInfo"),xYt=o(async e=>{let t=await r5();t={...t,...e};let n=await Ee.getGlobalDB().put(t);return t._rev=n.rev,t},"save"),r5=o(async()=>{let e=Ee.getGlobalDB();try{return await e.get(Zt.GLOBAL.docs.licenseInfo)}catch(t){if(t.status===404)return CYt();throw t}},"get"),DYt=o(async()=>{let e=Ee.getGlobalDB(),t=await r5();t&&t._rev&&await e.remove(Zt.GLOBAL.docs.licenseInfo,t._rev)},"destroy");var Pr={};$(Pr,{bulkSave:()=>GYt,destroy:()=>VYt,fetch:()=>qYt,generateUserGroupID:()=>FYt,get:()=>jYt,getBulk:()=>WYt,getByName:()=>n5,getGroupUsers:()=>gje,getGroupUsersParams:()=>mje,getUserGroupsParams:()=>hje,save:()=>$Yt});async function fje(){let e=He.designDoc.base("type");e.sql.tables={[qf]:{fields:{appId:"VARCHAR",event:"VARCHAR",userId:"VARCHAR",timestamp:"VARCHAR",metadata:"VARCHAR",name:"VARCHAR",type:"VARCHAR",fallback:"VARCHAR"}}};let t=C.getAuditLogsDB(),r;try{r=await t.get(Nn),r={...r,...e}}catch(n){if(n.status===404)r=e;else throw n}await t.put(r)}o(fje,"createAuditLogDesignDocSQL");var{ViewName:NYt,SEPARATOR:LYt,DocumentType:kYt,createView:MYt}=F,UYt=kYt.USER+LYt;async function dje(){let e=Ee.getGlobalDB(),t=`function(doc) {
|
|
725
|
+
`;return await this.connect(),(await this.internalQuery({sql:r})).recordset}getDataType(r){let{DataType:n,MaxLength:i,Precision:s,Scale:a}=r,{usesMaxLength:u=!1,usesPrecision:c=!1}=Z5t[n]||{},l=n;return u&&(i===-1?l+="(MAX)":l+=`(${i})`),c&&(l+=`(${s}, ${a})`),l}},Cz={schema:X5t,integration:Iz};var Iqe=require("@aws-sdk/client-s3"),Cqe=W(require("csvtojson")),xqe=W(require("stream"));var eYt={docs:"https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html",description:"Amazon Simple Storage Service (Amazon S3) is an object storage service that offers industry-leading scalability, data availability, security, and performance.",friendlyName:"Amazon S3",type:"Object store",features:{connection:!0},datasource:{region:{type:"string",required:!1,default:"us-east-1"},accessKeyId:{type:"password",required:!0},secretAccessKey:{type:"password",required:!0},endpoint:{type:"string",required:!1},signatureVersion:{type:"string",required:!1,default:"v4"}},query:{create:{type:"fields",fields:{bucket:{display:"New Bucket",type:"string",required:!0},location:{required:!0,default:"us-east-1",type:"string"},grantFullControl:{display:"Grant full control",type:"string"},grantRead:{display:"Grant read",type:"string"},grantReadAcp:{display:"Grant read ACP",type:"string"},grantWrite:{display:"Grant write",type:"string"},grantWriteAcp:{display:"Grant write ACP",type:"string"}}},read:{type:"fields",fields:{bucket:{type:"string",required:!0},delimiter:{type:"string"},marker:{type:"string"},maxKeys:{type:"number",display:"Max Keys"},prefix:{type:"string"}}},readCsv:{displayName:"Read CSV",type:"fields",readable:!0,fields:{bucket:{type:"string",required:!0},key:{type:"string",required:!0}}},delete:{type:"fields",fields:{bucket:{type:"string",required:!0},delete:{type:"json",required:!0}}}},extra:{acl:{required:!1,displayName:"ACL",type:"list",data:{create:["private","public-read","public-read-write","authenticated-read"]}}}},xz=class{static{o(this,"S3Integration")}constructor(t){this.config={forcePathStyle:t.s3ForcePathStyle||!0,credentials:{accessKeyId:t.accessKeyId,secretAccessKey:t.secretAccessKey},region:t.region,endpoint:t.endpoint},t.endpoint?(this.config.requestChecksumCalculation="WHEN_REQUIRED",this.config.responseChecksumValidation="WHEN_REQUIRED",this.config.forcePathStyle=!0):delete this.config.endpoint,this.client=new Iqe.S3(this.config)}async testConnection(){let t={connected:!1};try{await this.client.listBuckets({MaxBuckets:1}),t.connected=!0}catch(r){t.error=r.message}return t}async create(t){let r={Bucket:t.bucket,ACL:t.extra?.acl,GrantFullControl:t.grantFullControl,GrantRead:t.grantRead,GrantReadACP:t.grantReadAcp,GrantWrite:t.grantWrite,GrantWriteACP:t.grantWriteAcp};return t.location&&(r.CreateBucketConfiguration={LocationConstraint:t.location}),await this.client.createBucket(r)}async read(t){return(await this.client.listObjects({Bucket:t.bucket,Delimiter:t.delimiter,Marker:t.marker,MaxKeys:t.maxKeys,Prefix:t.prefix})).Contents}async readCsv(t){let n=(await this.client.getObject({Bucket:t.bucket,Key:t.key})).Body?.transformToWebStream();if(!n||!(n instanceof xqe.default.Readable))throw new Error("Unable to retrieve CSV - invalid stream");let i=!1;return new Promise((s,a)=>{n.on("error",c=>{a(c)});let u=(0,Cqe.default)().fromStream(n).on("error",()=>{i=!0});n.on("end",()=>{s(u)})}).catch(s=>{throw i?new Error("Could not read CSV"):s})}async delete(t){return await this.client.deleteObjects({Bucket:t.bucket,Delete:JSON.parse(t.delete)})}},Dz={schema:eYt,integration:xz};var Dqe=W(require("airtable"));var tYt={docs:"https://airtable.com/api",description:"Airtable is a spreadsheet-database hybrid, with the features of a database but applied to a spreadsheet.",friendlyName:"Airtable",type:"Spreadsheet",features:{connection:!0},datasource:{apiKey:{type:"password",default:"enter api key",required:!0},base:{type:"string",default:"mybase",required:!0}},query:{create:{type:"fields",customisable:!0,fields:{table:{type:"string",required:!0}}},read:{type:"fields",fields:{table:{type:"string",required:!0},view:{type:"string",required:!0},numRecords:{type:"number",default:10}}},update:{type:"fields",customisable:!0,fields:{id:{display:"Record ID",type:"string",required:!0},table:{type:"string",required:!0}}},delete:{type:"json"}}},Pz=class{static{o(this,"AirtableIntegration")}constructor(t){this.config=t,this.client=new Dqe.default(t).base(t.base)}async testConnection(){let t=Date.now().toString();try{return await this.client.makeRequest({path:`/${t}`}),{connected:!0}}catch(r){return r.message===`Could not find table ${t} in application ${this.config.base}`?{connected:!0}:{connected:!1,error:r.message}}}async create(t){let{table:r,json:n}=t;try{return await this.client(r).create([{fields:n}])}catch(i){throw console.error("Error writing to airtable",i),i}}async read(t){try{return(await this.client(t.table).select({maxRecords:t.numRecords||10,view:t.view}).firstPage()).map(({fields:n})=>n)}catch(r){return console.error("Error writing to airtable",r),[]}}async update(t){let{table:r,id:n,json:i}=t;try{return await this.client(r).update([{id:n,fields:i}])}catch(s){throw console.error("Error writing to airtable",s),s}}async delete(t){try{return await this.client(t.table).destroy(t.ids)}catch(r){throw console.error("Error writing to airtable",r),r}}},Nz={schema:tYt,integration:Pz};var Pqe=W(require("mysql2/promise"));var rYt=He.Sql,nYt={docs:"https://github.com/sidorares/node-mysql2",plus:!0,friendlyName:"MySQL",type:"Relational",description:"MySQL Database Service is a fully managed database service to deploy cloud-native applications. ",features:{connection:!0,fetch_table_names:!0},datasource:{host:{type:"string",default:li,required:!0},port:{type:"number",default:3306,required:!1},user:{type:"string",default:"root",required:!0},password:{type:"password",default:"root",required:!0},database:{type:"string",required:!0},ssl:{type:"object",required:!1},rejectUnauthorized:{type:"boolean",default:!0,required:!1}},query:{create:{type:"sql"},read:{type:"sql"},update:{type:"sql"},delete:{type:"sql"}}},iYt=o(function(e,t){return e.type=="DATETIME"||e.type==="DATE"||e.type==="TIMESTAMP"||e.type==="LONGLONG"?e.string():e.type==="BIT"&&e.length===1?e.buffer()?.[0]:t()},"defaultTypeCasting");function oYt(e){for(let t=0;t<e.length;t++){let r=e[t];if(typeof r!="string")continue;let n=r.match(_qe);if(n&&n[0]!==""&&!isNaN(Number(n[0])))e[t]=parseFloat(r);else if(wqe(r)){let i;i=new Date(r),isNaN(i)&&(i=r),e[t]=i}}return e}o(oYt,"bindingTypeCoerce");var Lz=class extends rYt{constructor(r){super("mysql2");this.config=r,r.ssl&&Object.keys(r.ssl).length===0&&delete r.ssl,r.rejectUnauthorized!=null&&!r.rejectUnauthorized&&r.ssl&&typeof r.ssl!="string"&&(r.ssl.rejectUnauthorized=r.rejectUnauthorized),delete r.rejectUnauthorized,this.config={...r,typeCast:iYt,multipleStatements:!0,timezone:"Z"}}static{o(this,"MySQLIntegration")}async testConnection(){let r={connected:!1};try{let[n]=await this.internalQuery({sql:"SELECT 1+1 AS checkRes"},{connect:!0});r.connected=n?.checkRes==2}catch(n){let i=ch("MYSQL",n.errno);i?r.error=i:r.error=n.message}return r}getBindingIdentifier(){return"?"}getStringConcat(r){return`concat(${r.join(", ")})`}defineTypeCastingFromSchema(r){r&&(this.config.typeCast=function(n,i){if(r[n.name]?.name===n.name&&["LONGLONG","NEWDECIMAL","DECIMAL"].includes(n.type))if(r[n.name]?.type==="number"){let s=n.string();return s?Number(s):null}else return n.string();return n.type=="DATETIME"||n.type==="DATE"||n.type==="TIMESTAMP"?n.string():n.type==="BIT"&&n.length===1?n.buffer()?.[0]:i()})}async connect(){this.client=await Pqe.default.createConnection(this.config),(await this.internalQuery({sql:"SELECT VERSION();"},{connect:!1}))?.[0]?.["VERSION()"]?.toLowerCase().includes("mariadb")&&this.setExtendedSqlClient("mariadb")}async disconnect(){await this.client.end()}async internalQuery(r,n={connect:!0,disableCoercion:!1}){try{n?.connect&&await this.connect();let i=r.bindings||[],s=n?.disableCoercion?i:oYt(i);return this.log(r.sql,s),(await this.client.query(r.sql,s))[0]}catch(i){let s=ch("MYSQL",i.errno);throw s?new Error(s,{cause:i}):i}finally{n?.connect&&this.client&&await this.disconnect()}}async buildSchema(r,n){let i={};await this.connect();try{let u=await this.queryTableNames();for(let c of u){let l=[],f={},d=await this.internalQuery({sql:`DESCRIBE \`${c}\`;`},{connect:!1});for(let p of d){let h=p.Field;p.Key==="PRI"&&l.indexOf(p.Key)===-1&&l.push(h);let m=p.Default!=null,g=typeof p.Extra=="string"&&(p.Extra==="auto_increment"||p.Extra.toLowerCase().includes("generated")),y=p.Null!=="YES";f[h]=Sf({name:h,autocolumn:g,presence:y&&!g&&!m,externalType:p.Type,options:p.Type.startsWith("enum")?p.Type.substring(6,p.Type.length-2).split("','"):void 0})}i[c]||(i[c]={type:"table",_id:Ji(r,c),sourceId:r,sourceType:"external",primary:l,name:c,schema:f})}}finally{await this.disconnect()}let s=ru(i,n),a=nu(i);return{tables:s,errors:a}}async queryTableNames(){return(await this.internalQuery({sql:"SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_TYPE = 'BASE TABLE'"},{connect:!1})).map(n=>n.TABLE_NAME)}async getTableNames(){await this.connect();try{return this.queryTableNames()}finally{await this.disconnect()}}async queryViewNames(){return(await this.internalQuery({sql:"SELECT TABLE_NAME FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_SCHEMA = DATABASE()"},{connect:!1})).map(n=>n.TABLE_NAME)}async getViewNames(){await this.connect();try{return this.queryViewNames()}finally{await this.disconnect()}}async create(r){let n=await this.internalQuery(Br(r));return n.length?n:[{created:!0}]}async read(r){return this.internalQuery(Br(r))}async update(r){let n=await this.internalQuery(Br(r));return n.length?n:[{updated:!0}]}async delete(r){let n=await this.internalQuery(Br(r));return n.length?n:[{deleted:!0}]}async query(r){await this.connect();try{let n=o(s=>this.internalQuery(s,{connect:!1,disableCoercion:!0}),"queryFn"),i=o(s=>Array.isArray(s)?this.convertJsonStringColumns(r.table,s,r.tableAliases):s,"processFn");return await this.queryWithReturning(r,n,i)}finally{await this.disconnect()}}},kz={schema:nYt,integration:Lz};var nL=require("arangojs");var sYt={docs:"https://github.com/arangodb/arangojs",friendlyName:"ArangoDB",type:"Non-relational",description:"ArangoDB is a scalable open-source multi-model database natively supporting graph, document and search. All supported data models & access patterns can be combined in queries allowing for maximal flexibility. ",features:{connection:!0},datasource:{url:{type:"string",default:"http://localhost:8529",required:!0},username:{type:"string",default:"root",required:!0},password:{type:"password",required:!0},databaseName:{type:"string",default:"_system",required:!0},collection:{type:"string",required:!0}},query:{read:{type:"sql"},create:{type:"json"}}},Mz=class{static{o(this,"ArangoDBIntegration")}constructor(t){let r={url:t.url,databaseName:t.databaseName,auth:{username:t.username,password:t.password}};this.config=t,this.client=new nL.Database(r)}async testConnection(){let t={connected:!1};try{await this.client.get(),t.connected=!0}catch(r){t.error=r.message}return t}async read(t){try{return(await this.client.query(t.sql)).all()}catch(r){throw console.error("Error querying arangodb",r.message),r}finally{this.client.close()}}async create(t){let r=this.client.collection(this.config.collection);try{return(await this.client.query(nL.aql`INSERT ${t.json} INTO ${r} RETURN NEW`)).all()}catch(n){throw console.error("Error querying arangodb",n.message),n}finally{this.client.close()}}},Uz={schema:sYt,integration:Mz};var NQe=W(require("lodash/get")),oX=W(require("querystring")),dM=require("perf_hooks"),sX=require("url");var LQe=require("content-disposition"),kQe=W(require("path")),MQe=require("xml2js");function Nqe(e,t){let r=e.get("content-type")||"",n=e.get("content-disposition")||"";if(n){let i=/"(?:[^"\\]|\\.)*"|[;=]/g,s=null,a=!1,u=!1;for(;(s=i.exec(n))!==null;){if(s[0]===";"){a=!0;break}s[0]==="="&&(u=!0)}if(!a&&u)return{contentDisposition:`attachment; ${n}`,contentType:r}}else if(t?.downloadImages&&r.startsWith("image/"))return{contentDisposition:`attachment; filename="image.${r.split("/")[1]}"`,contentType:r};return{contentDisposition:n,contentType:r}}o(Nqe,"getAttachmentHeaders");var $z={};$($z,{init:()=>cYt,revertDevChanges:()=>Lqe});var Bz={};$(Bz,{getAppUrl:()=>uYt,isWorkspacePublished:()=>Fz});var aYt=/\/|\\/g;function uYt(e){let t;return e?.url?t=encodeURI(e?.url):e?.name&&(t=encodeURI(`${e?.name}`)),t&&(t=`/${t.replace(aYt,"")}`.toLowerCase()),t}o(uYt,"getAppUrl");async function Fz(e){return F.isDevWorkspaceID(e)&&(e=F.getProdWorkspaceID(e)),!!(await F.getWorkspacesByIDs([e])).length}o(Fz,"isWorkspacePublished");var qz,jz=class extends Xr.QueuedProcessor{constructor(){super(Xr.JobQueue.DEV_REVERT_PROCESSOR,{maxAttempts:3,removeOnFail:!1,removeOnComplete:!1,maxStalledCount:3,waitForCompletionMs:1e4});this.processFn=async r=>await C.doInWorkspaceContext(r.appId,()=>this.revertApp(r))}static{o(this,"DevRevertProcessor")}async revertApp(r){let{appId:n}=r,i=F.getProdWorkspaceID(n),s=C.getProdWorkspaceDB({skip_setup:!0});if(!await Fz(i))throw new Xr.UnretriableError("App must be deployed to be reverted.");let u=await s.get("deployments");if(!u.history||Object.keys(u.history).length===0)throw new Xr.UnretriableError("No deployments for app");let c=new F.Replication({source:i,target:n});try{await c.rollback();let l=C.getWorkspaceDB(),f=await l.get("app_metadata");return f.appId=n,f.instance._id=n,await l.put(f),await Ue.workspace.invalidateWorkspaceMetadata(n),await Le.app.reverted(f),{message:"Reverted changes successfully."}}catch(l){throw new Error(`Unable to revert. ${l}`,{cause:l})}finally{await c.close()}}};function Wz(){return qz||(qz=new jz),qz}o(Wz,"devRevertProcessor");async function Lqe(e){return await Wz().execute(e)}o(Lqe,"revertDevChanges");var cYt=o(async()=>{Wz()},"init");var MY={};$(MY,{backfillPluginOrigins:()=>BXt,enrichUsedPluginSvelteMajors:()=>jXt,fetch:()=>MXt,normaliseGithubUrl:()=>C$e,parseGithubRepo:()=>UXt,processUploaded:()=>qXt});var Bqe=require("path");var iu=ge.budibaseTempDir;var XT=W(require("fs"));var Gz=require("path");var kqe=W(require("tar")),lYt=require("uuid");var iL=ne.TOP_LEVEL_PATH,O7r=(0,Gz.join)(iL,"packages","server");var Mqe=o(e=>XT.default.createReadStream(e),"streamFile"),Uqe=o(e=>{let t=(0,Gz.join)(iu(),e);try{XT.default.existsSync(t)&&XT.default.rmSync(t,{recursive:!0,force:!0}),XT.default.mkdirSync(t)}catch(r){throw new Error(`Path cannot be created: ${r.message}`)}return t},"createTempFolder"),Fqe=o(async(e,t)=>{await kqe.extract({file:e,C:t})},"extractTarball");var K7r=(0,Bqe.join)(iL,"node_modules");var sa=W(require("fs")),Vy=require("path");var qqe=W(require("stream"));var fYt=(0,Vy.join)(iu(),"datasource"),dYt=(0,Vy.join)(iu(),"automation"),jqe=o(async e=>{let t,r;try{if(t=JSON.parse(sa.default.readFileSync((0,Vy.join)(e,"package.json"),"utf8")),r=JSON.parse(sa.default.readFileSync((0,Vy.join)(e,"schema.json"),"utf8")),!t.name)throw new Error("package.json is missing 'name'.");if(!t.version)throw new Error("package.json is missing 'version'.");if(!t.description)throw new Error("package.json is missing 'description'.")}catch(n){throw new Error(`Unable to process schema.json/package.json in plugin. ${n.message}`,{cause:n})}return{metadata:{package:t,schema:r},directory:e}},"getPluginMetadata");async function Wqe(e,t){let r=t.schema?.hash;sa.default.existsSync(e)||sa.default.mkdirSync(e);let n=(0,Vy.join)(e,t.name),i=`${n}.bbmetadata`;if(sa.default.existsSync(n)){if(sa.default.readFileSync(i,"utf8")===r)return require(n);console.log(`Updating plugin: ${t.name}`),delete require.cache[require.resolve(n)],sa.default.unlinkSync(n)}let s=ge.getPluginJSKey(t),a=await ge.retrieve(ge.ObjectStoreBuckets.PLUGINS,s);return a instanceof qqe.default.Readable?a.pipe(sa.default.createWriteStream(n)):sa.default.writeFileSync(n,a),sa.default.writeFileSync(i,r),require(n)}o(Wqe,"getPluginImpl");var $qe=o(async e=>Wqe(fYt,e),"getDatasourcePlugin"),Gqe=o(async e=>Wqe(dYt,e),"getAutomationPlugin");var Vqe=o(async(e,t)=>{let n=`https://prod-budi-templates.s3-eu-west-1.amazonaws.com/templates/${e}/${t}.tar.gz`;return ge.downloadTarball(n,mr.TEMPLATES,e)},"downloadTemplate");async function Hqe(e){if(!e.name||!e.path)throw new Error("File is not valid - cannot upload.");if(!e.name.endsWith(".tar.gz"))throw new Error("Plugin must be compressed into a gzipped tarball.");let t=Uqe(e.name.split(".tar.gz")[0]);return await Fqe(e.path,t),await jqe(t)}o(Hqe,"fileUpload");var bYt=require("socket.io"),_Yt=require("koa-useragent");var wYt=require("@socket.io/redis-adapter");var b9r=typeof ne.RECAPTCHA_SESSION_SECONDS=="string"?parseInt(ne.RECAPTCHA_SESSION_SECONDS):ne.RECAPTCHA_SESSION_SECONDS,pYt;var hYt;async function Qqe(e){return await pYt.bulkGet(e)}o(Qqe,"getLocksById");async function Vz(e){let t=await hYt?.get(e);return!!(t&&t.testing)}o(Vz,"checkTestFlag");var EYt=require("uuid");var mYt=W(require("cookies"));var z9r=new RegExp("^/api/webhooks/(trigger|schema|discord|ms-teams|slack)(/|$)");var aXr=ra.buildCsrfMiddleware();var LXt=require("koa-useragent");function ZT({row:e,tableName:t,fieldName:r,isLinked:n}){let i=e[`${t}.${r}`];return i==null&&!n&&(i=e[r]),i}o(ZT,"extractFieldValue");function Yqe(e,t){return ZT({row:e,tableName:t._id,fieldName:"_id",isLinked:!1})}o(Yqe,"getInternalRowId");function Ac(e,t,r=!1){let n=t.primary;if(!e||!n)return"";let i=[];for(let s of n){let a=ZT({row:e,tableName:t.name,fieldName:s,isLinked:r});a!=null&&i.push(a)}return i.length===0?"":ZN(i)}o(Ac,"generateIdForRow");function vYt(e,t){for(let[r,n]of Object.entries(t.schema))if(UA.includes(n.type)&&typeof e[r]=="string")try{e[r]=JSON.parse(e[r])}catch{fe.schema.isDeprecatedSingleUserColumn(n)||delete e[r]}return e}o(vYt,"fixJsonTypes");async function Hz({row:e,source:t,tables:r,isLinked:n,sqs:i}){let s,a=!1;x.views.isView(t)?(s=await x.views.getTable(t.id),a=fe.views.isCalculationView(t)):s=t;let u={};for(let l of Object.keys(s.schema)){let f=ZT({row:e,tableName:s.name,fieldName:l,isLinked:n});f instanceof Buffer?f=f.toString():f!=null&&(u[l]=f)}if(x.views.isView(t))for(let l of Object.keys(fe.views.calculationFields(t)))u[l]=e[l];let c=Object.keys(s.schema);if(!i&&!a)u._id=Ac(e,s,n),u.tableId=s._id,u._rev=qX,c=c.concat(io);else if(!a){c=c.concat(io);for(let l of[...Hr,...c])u[l]=ZT({row:e,tableName:s._id,fieldName:l,isLinked:n})}for(let l of c){let f=s.schema[l];if(f?.type!=="link")continue;let d=r.find(m=>m._id===f.tableId);if(!d)continue;let p=ZT({row:e,tableName:s._id,fieldName:l,isLinked:n}),h=Array.isArray(p)?p:typeof p=="string"?JSON.parse(p):void 0;if(h&&Array.isArray(h)){u[l]=h;let m=d.primaryDisplay||d.primary[0];u[l]=(await Promise.all(u[l].map(g=>Hz({row:g,source:d,tables:r,isLinked:!1,sqs:i})))).sort((g,y)=>{let b=g?.[m],w=y?.[m];if(b){if(!w)return-1}else return 1;return b.localeCompare?b.localeCompare(w):b-w})}}return vYt(u,s)}o(Hz,"basicProcessing");function ev(e){return!!e.through}o(ev,"isManyToMany");function Jqe(e,t){let r=[];for(let[n,i]of Object.entries(e.schema)){if(i.type!=="link"||!i.tableId)continue;let{tableName:s}=gr(i.tableId);if(!t[s])continue;let a=t[s];if(!e.primary||!a.primary)continue;let u={tableName:s,column:n};if(ev(i)&&i.through){let{tableName:c}=gr(i.through);u.through=c,u.from=i.throughTo||e.primary[0],u.to=i.throughFrom||a.primary[0],u.fromPrimary=e.primary[0],u.toPrimary=a.primary[0]}else(MA(i)||kA(i))&&(u.from=i.foreignKey||e.primary[0],u.to=i.fieldName);r.push(u)}return r}o(Jqe,"buildExternalRelationships");function Xqe(e,t){let r=[],n=Object.values(e.schema).filter(s=>s.type==="link"),i=e._id;for(let s of n){if(s.type!=="link")continue;let a=s.tableId,u=wf(i,a),c=i>a;t.find(l=>l._id===a)&&r.push({through:u,column:s.name,tableName:a,fromPrimary:"_id",to:c?"doc2.rowId":"doc1.rowId",from:c?"doc1.rowId":"doc2.rowId",toPrimary:"_id"})}return r}o(Xqe,"buildInternalRelationships");async function Zqe(e,t,r){let{relationships:n}=r||{},i=["link","formula","ai"];function s(d,p=[]){return Object.entries(d.schema).filter(([h,m])=>!i.includes(m.type)&&!p.find(g=>g===h)).map(([h])=>h)}o(s,"extractRealFields");function a(d,p=[]){let h=[];return d.primary&&h.push(...d.primary),d.primaryDisplay&&h.push(d.primaryDisplay),He.utils.isExternalTable(d)||h.push(...Hr),h.filter(m=>!p.find(g=>g===m)&&d.schema[m]&&!i.includes(d.schema[m].type))}o(a,"getRequiredFields");let u=[],c=x.views.isView(e),l;c?(l=await x.views.getTable(e.id),u=Object.keys(fe.views.basicFields(e)).filter(d=>l.schema[d].type!=="link")):(l=e,u=s(e).filter(d=>l.schema[d].visible!==!1));let f=(c?u:Object.keys(l.schema)).some(d=>l.schema[d]?.type==="formula");f&&(u=s(l)),(!c||!fe.views.isCalculationView(e))&&u.push(...a({...l,primaryDisplay:e.primaryDisplay||l.primaryDisplay},u)),u=u.map(d=>`${l.name}.${d}`);for(let d of Object.values(l.schema)){if(d.type!=="link"||!n||!d.tableId||c&&(!e.schema?.[d.name]||!fe.views.isVisible(e.schema[d.name]))&&!f)continue;let{tableName:p}=gr(d.tableId),h=t[p];if(!h)continue;let m=new Set;f?s(h).forEach(y=>m.add(y)):(h.primary?.forEach(y=>m.add(y)),h.primaryDisplay&&m.add(h.primaryDisplay),c&&Object.entries(e.schema?.[d.name]?.columns||{}).filter(([y,b])=>h.schema[y]&&fe.views.isVisible(b)&&!["link","formula"].includes(h.schema[y].type)).forEach(([y])=>m.add(y)));let g=Array.from(m).filter(y=>!i.includes(h.schema[y].type)).map(y=>`${h.name}.${y}`).filter(y=>!u.includes(y));u.push(...g)}return[...new Set(u)]}o(Zqe,"buildSqlFieldList");function Qz(e){return!Array.isArray(e)||e.length===0||"read"in e[0]&&e[0].read===!0}o(Qz,"isKnexEmptyReadResponse");function eje(e){return!Qz(e)}o(eje,"isKnexRows");var A$e=require("lodash/fp");var p$e=W(require("lodash/flatten")),h$e=W(require("lodash/partition"));var bh={};$(bh,{auditLogs:()=>tY,automations:()=>eb,backups:()=>rb,branding:()=>N5,environmentVariables:()=>Dv,features:()=>Xi,groups:()=>Kn,init:()=>b9t,licensing:()=>Qn,logger:()=>DL,plugins:()=>Y5,publicApi:()=>oY,quotas:()=>Et,scimGroups:()=>lY,scimUsers:()=>cY,users:()=>W5,utils:()=>b5});var N5={};$(N5,{getBrandingConfig:()=>YJt});var Xi={};$(Xi,{checkBackups:()=>Ii,checkFeature:()=>C5,checkFeatures:()=>iWe,checkSCIM:()=>sWe,isAuditLogsEnabled:()=>TL,isBackupsEnabled:()=>x5,isBrandingEnabled:()=>D5,isEnforceableSSO:()=>oWe,isExpandedPublicApiEnabled:()=>Jy,isPWAEnabled:()=>jJt,isPkceOidcEnabled:()=>$Jt,isRecaptchaEnabled:()=>WJt,isSSOEnforced:()=>HJt,isSyncAutomationsEnabled:()=>BJt,isTranslationsEnabled:()=>GJt,isTriggerAutomationRunEnabled:()=>qJt,isUserGroupsEnabled:()=>P5,isViewPermissionEnabled:()=>QJt,isViewReadonlyColumnsEnabled:()=>KJt,isWorkspaceImportExportEnabled:()=>VJt,isWorkspaceImportExportPublicApiEnabled:()=>vL});var Qn={};$(Qn,{cache:()=>la,client:()=>Of,features:()=>bL,getFreeLicense:()=>v5,getLicense:()=>T5,getLicenseFromKey:()=>Xje,keys:()=>R5,offline:()=>wL,quotas:()=>_L});var la={};$(la,{getCachedLicense:()=>rWe,invalidate:()=>nWe,refresh:()=>ph});var SL=W(require("dd-trace"));var Of={};$(Of,{activateLicenseKey:()=>h5,getLicense:()=>zy,getLicenseFromKey:()=>p5,triggerQuota:()=>pJt});var tje=W(require("node-fetch"));var Kz=require("dd-trace"),rje=require("dd-trace/ext/formats");var zz=class{constructor(t){this.apiCall=t=>async(r="",n={})=>await Kz.tracer.trace(`api.${t}`,async i=>{i.setTag("url",r);let s={...n.headers};s["Content-Type"]||(s["Content-Type"]="application/json",s.Accept="application/json");let a=s["Content-Type"]==="application/json";Ne.correlation.setHeader(s),Kz.tracer.inject(i,rje.HTTP_HEADERS,s);let u={method:t,body:a?JSON.stringify(n.body):n.body,headers:s,credentials:"include"};return(0,tje.default)(`${this.host}${r}`,u)});this.post=this.apiCall("POST");this.get=this.apiCall("GET");this.patch=this.apiCall("PATCH");this.del=this.apiCall("DELETE");this.put=this.apiCall("PUT");this.host=t}static{o(this,"API")}},Yz=zz;var{getDispatcher:rZr}=Je;var ua={};$(ua,{bustCache:()=>Zz,getCurrentUsageValues:()=>lje,getQuotaUsage:()=>fh,setAllUsage:()=>t5,setAppUsageValue:()=>e5,setUsage:()=>aje,setUsagePerApp:()=>uje,utils:()=>iv});var iv={};$(iv,{generateBaseQuotaUsage:()=>oL,generateNewMonthlyQuotas:()=>nv,generateNewQuotaUsage:()=>Xz,getBreakdownName:()=>aL,getCurrentMonthString:()=>vf,getQuotaDocId:()=>rv,setCurrentMonth:()=>sL,setQuotaReset:()=>Jz});var rv=o(()=>C.isSelfHostUsingCloud()?`quota_usage_${C.getTenantId()}`:F.StaticDatabases.GLOBAL.docs.usageQuota,"getQuotaDocId"),nje=o(()=>{let e=new Date;return new Date(e.getFullYear(),e.getMonth()+1,1).toISOString()},"getNextQuotaReset"),Jz=o(e=>{e.quotaReset=nje()},"setQuotaReset"),vf=o(()=>{let e=new Date,t=e.getMonth()+1,r=e.getFullYear();return`${t}-${r}`},"getCurrentMonthString"),oL=o(()=>({usageQuota:{apps:0,rows:0,plugins:0,users:0,creators:0,userGroups:0,aiCustomConfigs:0,triggers:{}},monthly:{[vf()]:nv()}}),"generateBaseQuotaUsage"),Xz=o(()=>{let e={_id:rv(),quotaReset:nje(),...oL(),apps:{}};return sL(e),e},"generateNewQuotaUsage"),nv=o(()=>({queries:0,automations:0,budibaseAICredits:0,actions:0,triggers:{}}),"generateNewMonthlyQuotas"),sL=o(e=>{let t=vf();e.monthly||(e.monthly={}),e.monthly[t]||(e.monthly[t]=nv()),e.monthly.current=e.monthly[t]},"setCurrentMonth"),aL=o((e,t)=>{if(!(!t||!e))switch(e){case"automations":return"automations";case"queries":return Os(t)?"rowQueries":im(t)?"datasourceQueries":void 0}},"getBreakdownName");var ije=jt.fromSeconds(60).toMs(),{Writethrough:oje}=Ue.writethrough;function AYt(e){return delete e.usageLimits,delete e.usageQuota.automationRuns,delete e.usageQuota.emails,delete e.usageQuota.storage,delete e.usageQuota.views,delete e.usageQuota.publishedApps,delete e.usageQuota.developers,e}o(AYt,"clearDeprecated");var uL=o(()=>Ee.isSelfHostUsingCloud()?new oje(Ee.getSelfHostCloudDB(),ije):new oje(Ee.getGlobalDB(),ije),"getDB");async function Zz(e=0){let r=uL(),n=rv(),i=await r.tryGet(n);i&&i._rev&&await r.remove(n,i._rev).catch(async s=>{if(e<1)return await Zz(e+1);throw s})}o(Zz,"bustCache");var fh=o(async()=>{let e=uL(),t=await e.tryGet(rv());if(!t){t=Xz();let{rev:r}=await e.put(t);t._rev=r}return sL(t),Jz(t),AYt(t)},"getQuotaUsage"),aje=o(async(e,t,r)=>t5({name:t,type:r,values:{total:e}}),"setUsage"),uje=o(async(e,t,r)=>{let n=uL(),i=await fh(),s=Object.values(e).reduce((u,c)=>u+c,0);for(let[u,c]of Object.entries(e))i=cje(i,t,r,{total:s,app:c},{appId:u});let a=await n.put(i);return i._rev=a.rev,i},"setUsagePerApp"),RYt=o((e,t,r,n)=>{let i=aL(t,r);if(!i||!n?.breakdown)return e;e.breakdown||(e.breakdown={}),e.breakdown[i]||(e.breakdown[i]={parent:t,values:{}});let s=e.breakdown[i];return s.values[r]=n.breakdown,e},"setBreakdown"),e5=o((e,t,r,n={},i)=>{let s;try{s=F.getProdWorkspaceID(n?.appId||C.getWorkspaceId())}catch{}if(!s||!i.app||!Uh.includes(t))return e;e.apps?.[s]||(e.apps={...e.apps,[s]:oL()});let a=e.apps[s];switch(r){case"static":a.usageQuota[t]=i.app;break;case"monthly":{let u=vf(),c=t,l=a.monthly[u];l||(a.monthly[u]=nv(),l=a.monthly[u]),l[c]=i.app,LX.includes(c)&&n?.id&&(l=RYt(l,c,n.id,i));break}}return e},"setAppUsageValue"),sje=o((e,t,r,n)=>{if(!Uh.includes(r))return{};let i;try{i=F.getProdWorkspaceID(C.getWorkspaceId())}catch{}if(!i||!e.apps||!e.apps[i])return{app:0};let s=e.apps[i];switch(t){case"static":if(s.usageQuota?.[r])return{app:s.usageQuota[r]};break;case"monthly":{let a=vf(),u=r;if(!s.monthly?.[a]?.[u])break;let c=s.monthly[a],l=c[u],f,d=aL(u,n);return d&&n&&c.breakdown?.[d]&&(f=c.breakdown[d]?.values[n]),{app:l,breakdown:f||0}}}return{app:0}},"getAppUsageValue"),OYt=o((e,t,r)=>{t.usageQuota.triggers||(t.usageQuota.triggers={}),r&&(t.usageQuota.triggers[e]=r)},"setStaticTriggers"),IYt=o((e,t,r,n)=>{r.monthly[t].triggers||(r.monthly[t].triggers={}),n&&(r.monthly[t].triggers[e]=n)},"setMonthlyTriggers"),cje=o((e,t,r,n,i={})=>{if(r==="static")t=t,e.usageQuota[t]=n.total,OYt(t,e,n.triggers);else if(r==="monthly"){t=t;let s=vf();e.monthly[s][t]=n.total,IYt(t,s,e,n.triggers)}else throw new Error(`Invalid usage type: ${r}`);return e5(e,t,r,i,n)},"coreUsageUpdate"),t5=o(async e=>{let t=Array.isArray(e)?e:[e],r=uL(),n=await fh();for(let s of t)n=cje(n,s.name,s.type,s.values,s.opts);let i=await r.put(n,0);return n._rev=i.rev,n},"setAllUsage"),lje=o(async(e,t,r)=>{let n=await fh(),i=0,s={};switch(e){case"static":if(n.usageQuota[t]){let a=t;i=n.usageQuota[a],s=sje(n,e,t,r)}break;case"monthly":{let a=vf(),u=t;n.monthly[a][u]&&(i=n.monthly[a][u],s=sje(n,e,t,r));break}default:throw new Error(`Invalid usage type: ${e}`)}return Uh.includes(t)&&!(s.app||s.breakdown)&&(s.app=s.app||0,s.breakdown=s.breakdown||0),{total:i,app:s.app,breakdown:s.breakdown}},"getCurrentUsageValues");var ms={};$(ms,{destroy:()=>DYt,get:()=>r5,save:()=>xYt});var CYt=o(()=>({_id:Zt.GLOBAL.docs.licenseInfo}),"newLicenseInfo"),xYt=o(async e=>{let t=await r5();t={...t,...e};let n=await Ee.getGlobalDB().put(t);return t._rev=n.rev,t},"save"),r5=o(async()=>{let e=Ee.getGlobalDB();try{return await e.get(Zt.GLOBAL.docs.licenseInfo)}catch(t){if(t.status===404)return CYt();throw t}},"get"),DYt=o(async()=>{let e=Ee.getGlobalDB(),t=await r5();t&&t._rev&&await e.remove(Zt.GLOBAL.docs.licenseInfo,t._rev)},"destroy");var Pr={};$(Pr,{bulkSave:()=>GYt,destroy:()=>VYt,fetch:()=>qYt,generateUserGroupID:()=>FYt,get:()=>jYt,getBulk:()=>WYt,getByName:()=>n5,getGroupUsers:()=>gje,getGroupUsersParams:()=>mje,getUserGroupsParams:()=>hje,save:()=>$Yt});async function fje(){let e=He.designDoc.base("type");e.sql.tables={[qf]:{fields:{appId:"VARCHAR",event:"VARCHAR",userId:"VARCHAR",timestamp:"VARCHAR",metadata:"VARCHAR",name:"VARCHAR",type:"VARCHAR",fallback:"VARCHAR"}}};let t=C.getAuditLogsDB(),r;try{r=await t.get(Nn),r={...r,...e}}catch(n){if(n.status===404)r=e;else throw n}await t.put(r)}o(fje,"createAuditLogDesignDocSQL");var{ViewName:NYt,SEPARATOR:LYt,DocumentType:kYt,createView:MYt}=F,UYt=kYt.USER+LYt;async function dje(){let e=Ee.getGlobalDB(),t=`function(doc) {
|
|
726
726
|
if (doc._id.startsWith("${UYt}") && Array.isArray(doc.userGroups)) {
|
|
727
727
|
for (let groupId of doc.userGroups) {
|
|
728
728
|
emit("g_" + groupId, { email: doc.email, userId: doc._id })
|