@budibase/server 2.7.15 → 2.7.16-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/builder/assets/{index.d9b46807.css → index.2e9069f3.css} +1 -1
- package/builder/assets/{index.717d69a6.js → index.3801a6c5.js} +371 -371
- package/builder/index.html +2 -2
- package/dist/automation.js +859 -634
- package/dist/automation.js.map +3 -3
- package/dist/index.js +1180 -947
- package/dist/index.js.map +3 -3
- package/dist/query.js +996 -837
- package/dist/query.js.map +3 -3
- package/package.json +11 -11
- package/src/api/controllers/backup.ts +22 -8
- package/src/api/controllers/datasource.ts +41 -24
- package/src/api/controllers/role.ts +5 -5
- package/src/api/controllers/routing.ts +3 -3
- package/src/api/routes/backup.ts +1 -1
- package/src/api/routes/tests/backup.spec.ts +18 -2
- package/src/automations/steps/sendSmtpEmail.ts +55 -4
- package/src/automations/tests/sendSmtpEmail.spec.ts +74 -0
- package/src/events/docUpdates/syncUsers.ts +4 -0
- package/src/integrations/googlesheets.ts +35 -18
- package/src/integrations/mongodb.ts +4 -2
- package/src/integrations/postgres.ts +2 -1
- package/src/middleware/currentapp.ts +1 -1
- package/src/sdk/app/backups/exports.ts +33 -5
- package/src/sdk/app/backups/imports.ts +21 -1
- package/src/sdk/app/datasources/datasources.ts +1 -0
- package/src/utilities/workerRequests.ts +20 -9
- package/src/automations/tests/sendSmtpEmail.spec.js +0 -71
package/dist/query.js
CHANGED
|
@@ -11,8 +11,8 @@ var __commonJS = (cb, mod) => function __require() {
|
|
|
11
11
|
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
|
|
12
12
|
};
|
|
13
13
|
var __export = (target, all) => {
|
|
14
|
-
for (var
|
|
15
|
-
__defProp(target,
|
|
14
|
+
for (var name2 in all)
|
|
15
|
+
__defProp(target, name2, { get: all[name2], enumerable: true });
|
|
16
16
|
};
|
|
17
17
|
var __copyProps = (to, from, except, desc) => {
|
|
18
18
|
if (from && typeof from === "object" || typeof from === "function") {
|
|
@@ -563,13 +563,13 @@ var init_plan = __esm({
|
|
|
563
563
|
var isStaticQuota, isMonthlyQuota, isConstantQuota;
|
|
564
564
|
var init_quota = __esm({
|
|
565
565
|
"../types/src/sdk/licensing/quota.ts"() {
|
|
566
|
-
isStaticQuota = (quotaType, usageType,
|
|
566
|
+
isStaticQuota = (quotaType, usageType, name2) => {
|
|
567
567
|
return quotaType === "usage" /* USAGE */ && usageType === "static" /* STATIC */;
|
|
568
568
|
};
|
|
569
|
-
isMonthlyQuota = (quotaType, usageType,
|
|
569
|
+
isMonthlyQuota = (quotaType, usageType, name2) => {
|
|
570
570
|
return quotaType === "usage" /* USAGE */ && usageType === "monthly" /* MONTHLY */;
|
|
571
571
|
};
|
|
572
|
-
isConstantQuota = (quotaType,
|
|
572
|
+
isConstantQuota = (quotaType, name2) => {
|
|
573
573
|
return quotaType === "constant" /* CONSTANT */;
|
|
574
574
|
};
|
|
575
575
|
}
|
|
@@ -679,8 +679,8 @@ var init_locks = __esm({
|
|
|
679
679
|
var isDocument;
|
|
680
680
|
var init_db = __esm({
|
|
681
681
|
"../types/src/sdk/db.ts"() {
|
|
682
|
-
isDocument = (
|
|
683
|
-
return typeof
|
|
682
|
+
isDocument = (doc2) => {
|
|
683
|
+
return typeof doc2 === "object" && doc2._id && doc2._rev;
|
|
684
684
|
};
|
|
685
685
|
}
|
|
686
686
|
});
|
|
@@ -838,6 +838,7 @@ var init_automation2 = __esm({
|
|
|
838
838
|
AutomationIOType2["NUMBER"] = "number";
|
|
839
839
|
AutomationIOType2["ARRAY"] = "array";
|
|
840
840
|
AutomationIOType2["JSON"] = "json";
|
|
841
|
+
AutomationIOType2["DATE"] = "date";
|
|
841
842
|
return AutomationIOType2;
|
|
842
843
|
})(AutomationIOType || {});
|
|
843
844
|
AutomationCustomIOType = /* @__PURE__ */ ((AutomationCustomIOType2) => {
|
|
@@ -1954,27 +1955,27 @@ function init(opts) {
|
|
|
1954
1955
|
}
|
|
1955
1956
|
function getPouchDB(dbName, opts) {
|
|
1956
1957
|
checkInitialised();
|
|
1957
|
-
const
|
|
1958
|
-
const dbPut =
|
|
1959
|
-
|
|
1960
|
-
if (!
|
|
1961
|
-
|
|
1962
|
-
}
|
|
1963
|
-
|
|
1964
|
-
return dbPut(
|
|
1958
|
+
const db2 = new Pouch(dbName, opts);
|
|
1959
|
+
const dbPut = db2.put;
|
|
1960
|
+
db2.put = async (doc2, options2 = {}) => {
|
|
1961
|
+
if (!doc2.createdAt) {
|
|
1962
|
+
doc2.createdAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
1963
|
+
}
|
|
1964
|
+
doc2.updatedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
1965
|
+
return dbPut(doc2, options2);
|
|
1965
1966
|
};
|
|
1966
|
-
|
|
1967
|
-
const info = await
|
|
1967
|
+
db2.exists = async () => {
|
|
1968
|
+
const info = await db2.info();
|
|
1968
1969
|
return !info.error;
|
|
1969
1970
|
};
|
|
1970
|
-
return
|
|
1971
|
+
return db2;
|
|
1971
1972
|
}
|
|
1972
|
-
async function closePouchDB(
|
|
1973
|
-
if (!
|
|
1973
|
+
async function closePouchDB(db2) {
|
|
1974
|
+
if (!db2 || environment_default2.isTest()) {
|
|
1974
1975
|
return;
|
|
1975
1976
|
}
|
|
1976
1977
|
try {
|
|
1977
|
-
return await
|
|
1978
|
+
return await db2.close();
|
|
1978
1979
|
} catch (err) {
|
|
1979
1980
|
}
|
|
1980
1981
|
}
|
|
@@ -2125,14 +2126,14 @@ var init_DatabaseImpl = __esm({
|
|
|
2125
2126
|
}
|
|
2126
2127
|
}
|
|
2127
2128
|
async get(id) {
|
|
2128
|
-
const
|
|
2129
|
+
const db2 = await this.checkSetup();
|
|
2129
2130
|
if (!id) {
|
|
2130
2131
|
throw new Error("Unable to get doc without a valid _id.");
|
|
2131
2132
|
}
|
|
2132
|
-
return this.updateOutput(() =>
|
|
2133
|
+
return this.updateOutput(() => db2.get(id));
|
|
2133
2134
|
}
|
|
2134
|
-
async remove(idOrDoc,
|
|
2135
|
-
const
|
|
2135
|
+
async remove(idOrDoc, rev2) {
|
|
2136
|
+
const db2 = await this.checkSetup();
|
|
2136
2137
|
let _id;
|
|
2137
2138
|
let _rev;
|
|
2138
2139
|
if (isDocument(idOrDoc)) {
|
|
@@ -2140,12 +2141,12 @@ var init_DatabaseImpl = __esm({
|
|
|
2140
2141
|
_rev = idOrDoc._rev;
|
|
2141
2142
|
} else {
|
|
2142
2143
|
_id = idOrDoc;
|
|
2143
|
-
_rev =
|
|
2144
|
+
_rev = rev2;
|
|
2144
2145
|
}
|
|
2145
2146
|
if (!_id || !_rev) {
|
|
2146
2147
|
throw new Error("Unable to remove doc without a valid _id and _rev.");
|
|
2147
2148
|
}
|
|
2148
|
-
return this.updateOutput(() =>
|
|
2149
|
+
return this.updateOutput(() => db2.destroy(_id, _rev));
|
|
2149
2150
|
}
|
|
2150
2151
|
async post(document, opts) {
|
|
2151
2152
|
if (!document._id) {
|
|
@@ -2157,7 +2158,7 @@ var init_DatabaseImpl = __esm({
|
|
|
2157
2158
|
if (!document._id) {
|
|
2158
2159
|
throw new Error("Cannot store document without _id field.");
|
|
2159
2160
|
}
|
|
2160
|
-
const
|
|
2161
|
+
const db2 = await this.checkSetup();
|
|
2161
2162
|
if (!document.createdAt) {
|
|
2162
2163
|
document.createdAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
2163
2164
|
}
|
|
@@ -2174,20 +2175,20 @@ var init_DatabaseImpl = __esm({
|
|
|
2174
2175
|
}
|
|
2175
2176
|
}
|
|
2176
2177
|
}
|
|
2177
|
-
return this.updateOutput(() =>
|
|
2178
|
+
return this.updateOutput(() => db2.insert(document));
|
|
2178
2179
|
}
|
|
2179
2180
|
async bulkDocs(documents) {
|
|
2180
|
-
const
|
|
2181
|
-
return this.updateOutput(() =>
|
|
2181
|
+
const db2 = await this.checkSetup();
|
|
2182
|
+
return this.updateOutput(() => db2.bulk({ docs: documents }));
|
|
2182
2183
|
}
|
|
2183
2184
|
async allDocs(params2) {
|
|
2184
|
-
const
|
|
2185
|
-
return this.updateOutput(() =>
|
|
2185
|
+
const db2 = await this.checkSetup();
|
|
2186
|
+
return this.updateOutput(() => db2.list(params2));
|
|
2186
2187
|
}
|
|
2187
2188
|
async query(viewName, params2) {
|
|
2188
|
-
const
|
|
2189
|
+
const db2 = await this.checkSetup();
|
|
2189
2190
|
const [database, view] = viewName.split("/");
|
|
2190
|
-
return this.updateOutput(() =>
|
|
2191
|
+
return this.updateOutput(() => db2.view(database, view, params2));
|
|
2191
2192
|
}
|
|
2192
2193
|
async destroy() {
|
|
2193
2194
|
try {
|
|
@@ -2201,8 +2202,8 @@ var init_DatabaseImpl = __esm({
|
|
|
2201
2202
|
}
|
|
2202
2203
|
}
|
|
2203
2204
|
async compact() {
|
|
2204
|
-
const
|
|
2205
|
-
return this.updateOutput(() =>
|
|
2205
|
+
const db2 = await this.checkSetup();
|
|
2206
|
+
return this.updateOutput(() => db2.compact());
|
|
2206
2207
|
}
|
|
2207
2208
|
// All below functions are in-frequently called, just utilise PouchDB
|
|
2208
2209
|
// for them as it implements them better than we can
|
|
@@ -2245,8 +2246,8 @@ function getDB(dbName, opts) {
|
|
|
2245
2246
|
return new DatabaseImpl(dbName, opts);
|
|
2246
2247
|
}
|
|
2247
2248
|
async function doWithDB(dbName, cb, opts = {}) {
|
|
2248
|
-
const
|
|
2249
|
-
return await cb(
|
|
2249
|
+
const db2 = getDB(dbName, opts);
|
|
2250
|
+
return await cb(db2);
|
|
2250
2251
|
}
|
|
2251
2252
|
function allDbs() {
|
|
2252
2253
|
if (!environment_default2.isTest()) {
|
|
@@ -2594,11 +2595,11 @@ function getRedisOptions() {
|
|
|
2594
2595
|
}
|
|
2595
2596
|
return { opts, host, port: parseInt(port), redisProtocolUrl };
|
|
2596
2597
|
}
|
|
2597
|
-
function addDbPrefix(
|
|
2598
|
-
if (key.includes(
|
|
2598
|
+
function addDbPrefix(db2, key) {
|
|
2599
|
+
if (key.includes(db2)) {
|
|
2599
2600
|
return key;
|
|
2600
2601
|
}
|
|
2601
|
-
return `${
|
|
2602
|
+
return `${db2}${SEPARATOR2}${key}`;
|
|
2602
2603
|
}
|
|
2603
2604
|
function removeDbPrefix(key) {
|
|
2604
2605
|
let parts = key.split(SEPARATOR2);
|
|
@@ -2818,8 +2819,8 @@ var init_redis = __esm({
|
|
|
2818
2819
|
CONNECTED = true;
|
|
2819
2820
|
}
|
|
2820
2821
|
RedisWrapper = class {
|
|
2821
|
-
constructor(
|
|
2822
|
-
this._db =
|
|
2822
|
+
constructor(db2, selectDb = null) {
|
|
2823
|
+
this._db = db2;
|
|
2823
2824
|
this._select = selectDb || DEFAULT_SELECT_DB;
|
|
2824
2825
|
}
|
|
2825
2826
|
getClient() {
|
|
@@ -2839,8 +2840,8 @@ var init_redis = __esm({
|
|
|
2839
2840
|
this.getClient().disconnect();
|
|
2840
2841
|
}
|
|
2841
2842
|
async scan(key = "") {
|
|
2842
|
-
const
|
|
2843
|
-
key = `${
|
|
2843
|
+
const db2 = this._db;
|
|
2844
|
+
key = `${db2}${SEPARATOR2}${key}`;
|
|
2844
2845
|
let stream3;
|
|
2845
2846
|
if (CLUSTERED) {
|
|
2846
2847
|
let node = this.getClient().nodes("master");
|
|
@@ -2851,16 +2852,16 @@ var init_redis = __esm({
|
|
|
2851
2852
|
return promisifyStream(stream3, this.getClient());
|
|
2852
2853
|
}
|
|
2853
2854
|
async keys(pattern) {
|
|
2854
|
-
const
|
|
2855
|
-
return this.getClient().keys(addDbPrefix(
|
|
2855
|
+
const db2 = this._db;
|
|
2856
|
+
return this.getClient().keys(addDbPrefix(db2, pattern));
|
|
2856
2857
|
}
|
|
2857
2858
|
async exists(key) {
|
|
2858
|
-
const
|
|
2859
|
-
return await this.getClient().exists(addDbPrefix(
|
|
2859
|
+
const db2 = this._db;
|
|
2860
|
+
return await this.getClient().exists(addDbPrefix(db2, key));
|
|
2860
2861
|
}
|
|
2861
2862
|
async get(key) {
|
|
2862
|
-
const
|
|
2863
|
-
let response = await this.getClient().get(addDbPrefix(
|
|
2863
|
+
const db2 = this._db;
|
|
2864
|
+
let response = await this.getClient().get(addDbPrefix(db2, key));
|
|
2864
2865
|
if (response != null && response.key) {
|
|
2865
2866
|
response.key = key;
|
|
2866
2867
|
}
|
|
@@ -2871,11 +2872,11 @@ var init_redis = __esm({
|
|
|
2871
2872
|
}
|
|
2872
2873
|
}
|
|
2873
2874
|
async bulkGet(keys2) {
|
|
2874
|
-
const
|
|
2875
|
+
const db2 = this._db;
|
|
2875
2876
|
if (keys2.length === 0) {
|
|
2876
2877
|
return {};
|
|
2877
2878
|
}
|
|
2878
|
-
const prefixedKeys = keys2.map((key) => addDbPrefix(
|
|
2879
|
+
const prefixedKeys = keys2.map((key) => addDbPrefix(db2, key));
|
|
2879
2880
|
let response = await this.getClient().mget(prefixedKeys);
|
|
2880
2881
|
if (Array.isArray(response)) {
|
|
2881
2882
|
let final = {};
|
|
@@ -2898,29 +2899,29 @@ var init_redis = __esm({
|
|
|
2898
2899
|
}
|
|
2899
2900
|
}
|
|
2900
2901
|
async store(key, value, expirySeconds = null) {
|
|
2901
|
-
const
|
|
2902
|
+
const db2 = this._db;
|
|
2902
2903
|
if (typeof value === "object") {
|
|
2903
2904
|
value = JSON.stringify(value);
|
|
2904
2905
|
}
|
|
2905
|
-
const prefixedKey = addDbPrefix(
|
|
2906
|
+
const prefixedKey = addDbPrefix(db2, key);
|
|
2906
2907
|
await this.getClient().set(prefixedKey, value);
|
|
2907
2908
|
if (expirySeconds) {
|
|
2908
2909
|
await this.getClient().expire(prefixedKey, expirySeconds);
|
|
2909
2910
|
}
|
|
2910
2911
|
}
|
|
2911
2912
|
async getTTL(key) {
|
|
2912
|
-
const
|
|
2913
|
-
const prefixedKey = addDbPrefix(
|
|
2913
|
+
const db2 = this._db;
|
|
2914
|
+
const prefixedKey = addDbPrefix(db2, key);
|
|
2914
2915
|
return this.getClient().ttl(prefixedKey);
|
|
2915
2916
|
}
|
|
2916
2917
|
async setExpiry(key, expirySeconds) {
|
|
2917
|
-
const
|
|
2918
|
-
const prefixedKey = addDbPrefix(
|
|
2918
|
+
const db2 = this._db;
|
|
2919
|
+
const prefixedKey = addDbPrefix(db2, key);
|
|
2919
2920
|
await this.getClient().expire(prefixedKey, expirySeconds);
|
|
2920
2921
|
}
|
|
2921
2922
|
async delete(key) {
|
|
2922
|
-
const
|
|
2923
|
-
await this.getClient().del(addDbPrefix(
|
|
2923
|
+
const db2 = this._db;
|
|
2924
|
+
await this.getClient().del(addDbPrefix(db2, key));
|
|
2924
2925
|
}
|
|
2925
2926
|
async clear() {
|
|
2926
2927
|
let items = await this.scan();
|
|
@@ -3296,8 +3297,8 @@ function logAlert(message, e) {
|
|
|
3296
3297
|
}
|
|
3297
3298
|
console.error(`bb-alert: ${message}`, e);
|
|
3298
3299
|
}
|
|
3299
|
-
function logAlertWithInfo(message,
|
|
3300
|
-
message = `${message} - db: ${
|
|
3300
|
+
function logAlertWithInfo(message, db2, id, error) {
|
|
3301
|
+
message = `${message} - db: ${db2} - doc: ${id} - error: `;
|
|
3301
3302
|
logAlert(message, error);
|
|
3302
3303
|
}
|
|
3303
3304
|
function logWarn(message) {
|
|
@@ -3334,8 +3335,8 @@ var init_logging = __esm({
|
|
|
3334
3335
|
var require_Helper = __commonJS({
|
|
3335
3336
|
"../string-templates/src/helpers/Helper.js"(exports2, module2) {
|
|
3336
3337
|
var Helper = class {
|
|
3337
|
-
constructor(
|
|
3338
|
-
this.name =
|
|
3338
|
+
constructor(name2, fn, useValueFallback = true) {
|
|
3339
|
+
this.name = name2;
|
|
3339
3340
|
this.fn = fn;
|
|
3340
3341
|
this.useValueFallback = useValueFallback;
|
|
3341
3342
|
}
|
|
@@ -3504,18 +3505,18 @@ var require_external = __commonJS({
|
|
|
3504
3505
|
exports2.externalCollections = EXTERNAL_FUNCTION_COLLECTIONS;
|
|
3505
3506
|
exports2.addedHelpers = ADDED_HELPERS;
|
|
3506
3507
|
exports2.registerAll = (handlebars) => {
|
|
3507
|
-
for (let [
|
|
3508
|
-
handlebars.registerHelper(
|
|
3508
|
+
for (let [name2, helper] of Object.entries(ADDED_HELPERS)) {
|
|
3509
|
+
handlebars.registerHelper(name2, helper);
|
|
3509
3510
|
}
|
|
3510
3511
|
let externalNames = [];
|
|
3511
3512
|
for (let collection of EXTERNAL_FUNCTION_COLLECTIONS) {
|
|
3512
3513
|
let hbsHelperInfo = helpers[collection]();
|
|
3513
3514
|
for (let entry of Object.entries(hbsHelperInfo)) {
|
|
3514
|
-
const
|
|
3515
|
-
if (HelperFunctionBuiltin.indexOf(
|
|
3515
|
+
const name2 = entry[0];
|
|
3516
|
+
if (HelperFunctionBuiltin.indexOf(name2) !== -1 || externalNames.indexOf(name2) !== -1) {
|
|
3516
3517
|
continue;
|
|
3517
3518
|
}
|
|
3518
|
-
externalNames.push(
|
|
3519
|
+
externalNames.push(name2);
|
|
3519
3520
|
}
|
|
3520
3521
|
helpers[collection]({
|
|
3521
3522
|
handlebars
|
|
@@ -3524,11 +3525,11 @@ var require_external = __commonJS({
|
|
|
3524
3525
|
exports2.externalHelperNames = externalNames.concat(Object.keys(ADDED_HELPERS));
|
|
3525
3526
|
};
|
|
3526
3527
|
exports2.unregisterAll = (handlebars) => {
|
|
3527
|
-
for (let
|
|
3528
|
-
handlebars.unregisterHelper(
|
|
3528
|
+
for (let name2 of Object.keys(ADDED_HELPERS)) {
|
|
3529
|
+
handlebars.unregisterHelper(name2);
|
|
3529
3530
|
}
|
|
3530
|
-
for (let
|
|
3531
|
-
handlebars.unregisterHelper(
|
|
3531
|
+
for (let name2 of module2.exports.externalHelperNames) {
|
|
3532
|
+
handlebars.unregisterHelper(name2);
|
|
3532
3533
|
}
|
|
3533
3534
|
exports2.externalHelperNames = [];
|
|
3534
3535
|
};
|
|
@@ -3642,12 +3643,12 @@ var require_javascript = __commonJS({
|
|
|
3642
3643
|
throw new Error("JS disabled in environment.");
|
|
3643
3644
|
}
|
|
3644
3645
|
try {
|
|
3645
|
-
const
|
|
3646
|
+
const js2 = `function run(){${atob(handlebars)}};run();`;
|
|
3646
3647
|
const sandboxContext = {
|
|
3647
3648
|
$: (path2) => getContextValue(path2, cloneDeep7(context)),
|
|
3648
3649
|
helpers: getHelperList()
|
|
3649
3650
|
};
|
|
3650
|
-
const res = { data: runJS(
|
|
3651
|
+
const res = { data: runJS(js2, sandboxContext) };
|
|
3651
3652
|
return `{{${LITERAL_MARKER} js_result-${JSON.stringify(res)}}}`;
|
|
3652
3653
|
} catch (error) {
|
|
3653
3654
|
return "Error while executing JS";
|
|
@@ -3760,8 +3761,8 @@ var require_preprocessor = __commonJS({
|
|
|
3760
3761
|
FINALISE: "finalise"
|
|
3761
3762
|
};
|
|
3762
3763
|
var Preprocessor = class {
|
|
3763
|
-
constructor(
|
|
3764
|
-
this.name =
|
|
3764
|
+
constructor(name2, fn) {
|
|
3765
|
+
this.name = name2;
|
|
3765
3766
|
this.fn = fn;
|
|
3766
3767
|
}
|
|
3767
3768
|
process(fullString, statement, opts) {
|
|
@@ -3825,8 +3826,8 @@ var require_postprocessor = __commonJS({
|
|
|
3825
3826
|
CONVERT_LITERALS: "convert-literals"
|
|
3826
3827
|
};
|
|
3827
3828
|
var Postprocessor = class {
|
|
3828
|
-
constructor(
|
|
3829
|
-
this.name =
|
|
3829
|
+
constructor(name2, fn) {
|
|
3830
|
+
this.name = name2;
|
|
3830
3831
|
this.fn = fn;
|
|
3831
3832
|
}
|
|
3832
3833
|
process(statement) {
|
|
@@ -5468,10 +5469,10 @@ var require_src = __commonJS({
|
|
|
5468
5469
|
};
|
|
5469
5470
|
module2.exports.convertToJS = (hbs) => {
|
|
5470
5471
|
const blocks = exports2.findHBSBlocks(hbs);
|
|
5471
|
-
let
|
|
5472
|
+
let js2 = "return `", prevBlock = null;
|
|
5472
5473
|
const variables = {};
|
|
5473
5474
|
if (blocks.length === 0) {
|
|
5474
|
-
|
|
5475
|
+
js2 += hbs;
|
|
5475
5476
|
}
|
|
5476
5477
|
let count = 1;
|
|
5477
5478
|
for (let block of blocks) {
|
|
@@ -5483,15 +5484,15 @@ var require_src = __commonJS({
|
|
|
5483
5484
|
prevBlock = block;
|
|
5484
5485
|
const { variable, value } = convertHBSBlock(block, count++);
|
|
5485
5486
|
variables[variable] = value;
|
|
5486
|
-
|
|
5487
|
+
js2 += `${stringPart.split()}\${${variable}}`;
|
|
5487
5488
|
}
|
|
5488
5489
|
let varBlock = "";
|
|
5489
5490
|
for (let [variable, value] of Object.entries(variables)) {
|
|
5490
5491
|
varBlock += `const ${variable} = ${value};
|
|
5491
5492
|
`;
|
|
5492
5493
|
}
|
|
5493
|
-
|
|
5494
|
-
return `${varBlock}${
|
|
5494
|
+
js2 += "`;";
|
|
5495
|
+
return `${varBlock}${js2}`;
|
|
5495
5496
|
};
|
|
5496
5497
|
}
|
|
5497
5498
|
});
|
|
@@ -5518,12 +5519,12 @@ var require_src2 = __commonJS({
|
|
|
5518
5519
|
if (!process.env.NO_JS) {
|
|
5519
5520
|
const { VM: VM2 } = require("vm2");
|
|
5520
5521
|
const { setJSRunner } = require_javascript();
|
|
5521
|
-
setJSRunner((
|
|
5522
|
+
setJSRunner((js2, context) => {
|
|
5522
5523
|
const vm = new VM2({
|
|
5523
5524
|
sandbox: context,
|
|
5524
5525
|
timeout: 1e3
|
|
5525
5526
|
});
|
|
5526
|
-
return vm.run(
|
|
5527
|
+
return vm.run(js2);
|
|
5527
5528
|
});
|
|
5528
5529
|
}
|
|
5529
5530
|
}
|
|
@@ -5874,8 +5875,8 @@ async function lookupTenantId(userId) {
|
|
|
5874
5875
|
return user.tenantId;
|
|
5875
5876
|
}
|
|
5876
5877
|
async function getUserDoc(emailOrId) {
|
|
5877
|
-
const
|
|
5878
|
-
return
|
|
5878
|
+
const db2 = getPlatformDB();
|
|
5879
|
+
return db2.get(emailOrId);
|
|
5879
5880
|
}
|
|
5880
5881
|
function newUserIdDoc(id, tenantId) {
|
|
5881
5882
|
return {
|
|
@@ -5891,14 +5892,14 @@ function newUserEmailDoc(userId, email, tenantId) {
|
|
|
5891
5892
|
};
|
|
5892
5893
|
}
|
|
5893
5894
|
async function addUserDoc(emailOrId, newDocFn) {
|
|
5894
|
-
const
|
|
5895
|
+
const db2 = getPlatformDB();
|
|
5895
5896
|
let user;
|
|
5896
5897
|
try {
|
|
5897
|
-
await
|
|
5898
|
+
await db2.get(emailOrId);
|
|
5898
5899
|
} catch (e) {
|
|
5899
5900
|
if (e.status === 404) {
|
|
5900
5901
|
user = newDocFn();
|
|
5901
|
-
await
|
|
5902
|
+
await db2.put(user);
|
|
5902
5903
|
} else {
|
|
5903
5904
|
throw e;
|
|
5904
5905
|
}
|
|
@@ -5911,9 +5912,9 @@ async function addUser(tenantId, userId, email) {
|
|
|
5911
5912
|
]);
|
|
5912
5913
|
}
|
|
5913
5914
|
async function removeUser(user) {
|
|
5914
|
-
const
|
|
5915
|
+
const db2 = getPlatformDB();
|
|
5915
5916
|
const keys2 = [user._id, user.email];
|
|
5916
|
-
const userDocs = await
|
|
5917
|
+
const userDocs = await db2.allDocs({
|
|
5917
5918
|
keys: keys2,
|
|
5918
5919
|
include_docs: true
|
|
5919
5920
|
});
|
|
@@ -5923,7 +5924,7 @@ async function removeUser(user) {
|
|
|
5923
5924
|
_deleted: true
|
|
5924
5925
|
};
|
|
5925
5926
|
});
|
|
5926
|
-
await
|
|
5927
|
+
await db2.bulkDocs(toDelete);
|
|
5927
5928
|
}
|
|
5928
5929
|
|
|
5929
5930
|
// ../backend-core/src/platform/tenants.ts
|
|
@@ -6008,18 +6009,18 @@ async function newRedlock(opts = {}) {
|
|
|
6008
6009
|
}
|
|
6009
6010
|
function getLockName(opts) {
|
|
6010
6011
|
const prefix = opts.systemLock ? "system" : getTenantId();
|
|
6011
|
-
let
|
|
6012
|
+
let name2 = `lock:${prefix}_${opts.name}`;
|
|
6012
6013
|
if (opts.resource) {
|
|
6013
|
-
|
|
6014
|
+
name2 = name2 + `_${opts.resource}`;
|
|
6014
6015
|
}
|
|
6015
|
-
return
|
|
6016
|
+
return name2;
|
|
6016
6017
|
}
|
|
6017
6018
|
async function doWithLock(opts, task) {
|
|
6018
6019
|
const redlock = await getClient(opts.type, opts.customOptions);
|
|
6019
6020
|
let lock;
|
|
6020
6021
|
try {
|
|
6021
|
-
const
|
|
6022
|
-
lock = await redlock.lock(
|
|
6022
|
+
const name2 = getLockName(opts);
|
|
6023
|
+
lock = await redlock.lock(name2, opts.ttl);
|
|
6023
6024
|
const result = await task();
|
|
6024
6025
|
return { executed: true, result };
|
|
6025
6026
|
} catch (e) {
|
|
@@ -6129,8 +6130,8 @@ var getAccount = async (email) => {
|
|
|
6129
6130
|
// ../backend-core/src/cache/user.ts
|
|
6130
6131
|
var EXPIRY_SECONDS = 3600;
|
|
6131
6132
|
async function populateFromDB(userId, tenantId) {
|
|
6132
|
-
const
|
|
6133
|
-
const user = await
|
|
6133
|
+
const db2 = getTenantDB(tenantId);
|
|
6134
|
+
const user = await db2.get(userId);
|
|
6134
6135
|
user.budibaseAccess = true;
|
|
6135
6136
|
if (!environment_default2.SELF_HOSTED && !environment_default2.DISABLE_ACCOUNT_PORTAL) {
|
|
6136
6137
|
const account = await getAccount(user.email);
|
|
@@ -6319,8 +6320,8 @@ function generateRoleID(id) {
|
|
|
6319
6320
|
var generateDevInfoID = (userId) => {
|
|
6320
6321
|
return `${"devinfo" /* DEV_INFO */}${SEPARATOR}${userId}`;
|
|
6321
6322
|
};
|
|
6322
|
-
var generatePluginID = (
|
|
6323
|
-
return `${"plg" /* PLUGIN */}${SEPARATOR}${
|
|
6323
|
+
var generatePluginID = (name2) => {
|
|
6324
|
+
return `${"plg" /* PLUGIN */}${SEPARATOR}${name2}`;
|
|
6324
6325
|
};
|
|
6325
6326
|
|
|
6326
6327
|
// ../backend-core/src/docIds/params.ts
|
|
@@ -6405,8 +6406,8 @@ function getStartEndKeyURL(baseKey, tenantId) {
|
|
|
6405
6406
|
const tenancy2 = tenantId ? `${SEPARATOR}${tenantId}` : "";
|
|
6406
6407
|
return `startkey="${baseKey}${tenancy2}"&endkey="${baseKey}${tenancy2}${UNICODE_MAX}"`;
|
|
6407
6408
|
}
|
|
6408
|
-
var getPluginParams = (
|
|
6409
|
-
return getDocParams("plg" /* PLUGIN */,
|
|
6409
|
+
var getPluginParams = (pluginId2, otherProps = {}) => {
|
|
6410
|
+
return getDocParams("plg" /* PLUGIN */, pluginId2, otherProps);
|
|
6410
6411
|
};
|
|
6411
6412
|
|
|
6412
6413
|
// ../backend-core/src/db/utils.ts
|
|
@@ -6513,8 +6514,8 @@ function isSameAppID(appId1, appId2) {
|
|
|
6513
6514
|
async function dbExists(dbName) {
|
|
6514
6515
|
return doWithDB(
|
|
6515
6516
|
dbName,
|
|
6516
|
-
async (
|
|
6517
|
-
return await
|
|
6517
|
+
async (db2) => {
|
|
6518
|
+
return await db2.exists();
|
|
6518
6519
|
},
|
|
6519
6520
|
{ skip_setup: true }
|
|
6520
6521
|
);
|
|
@@ -6533,7 +6534,7 @@ function pagination(data, pageSize, {
|
|
|
6533
6534
|
const hasNextPage = data.length > pageSize;
|
|
6534
6535
|
let nextPage = void 0;
|
|
6535
6536
|
if (!getKey) {
|
|
6536
|
-
getKey = (
|
|
6537
|
+
getKey = (doc2) => property ? doc2 == null ? void 0 : doc2[property] : doc2 == null ? void 0 : doc2._id;
|
|
6537
6538
|
}
|
|
6538
6539
|
if (hasNextPage) {
|
|
6539
6540
|
nextPage = getKey(data[pageSize]);
|
|
@@ -6558,23 +6559,23 @@ function DesignDoc() {
|
|
|
6558
6559
|
views: {}
|
|
6559
6560
|
};
|
|
6560
6561
|
}
|
|
6561
|
-
async function removeDeprecated(
|
|
6562
|
+
async function removeDeprecated(db2, viewName) {
|
|
6562
6563
|
if (!DeprecatedViews[viewName]) {
|
|
6563
6564
|
return;
|
|
6564
6565
|
}
|
|
6565
6566
|
try {
|
|
6566
|
-
const designDoc = await
|
|
6567
|
+
const designDoc = await db2.get(DESIGN_DB);
|
|
6567
6568
|
for (let deprecatedNames of DeprecatedViews[viewName]) {
|
|
6568
6569
|
delete designDoc.views[deprecatedNames];
|
|
6569
6570
|
}
|
|
6570
|
-
await
|
|
6571
|
+
await db2.put(designDoc);
|
|
6571
6572
|
} catch (err) {
|
|
6572
6573
|
}
|
|
6573
6574
|
}
|
|
6574
|
-
async function createView(
|
|
6575
|
+
async function createView(db2, viewJs, viewName) {
|
|
6575
6576
|
let designDoc;
|
|
6576
6577
|
try {
|
|
6577
|
-
designDoc = await
|
|
6578
|
+
designDoc = await db2.get(DESIGN_DB);
|
|
6578
6579
|
} catch (err) {
|
|
6579
6580
|
designDoc = DesignDoc();
|
|
6580
6581
|
}
|
|
@@ -6586,26 +6587,26 @@ async function createView(db, viewJs, viewName) {
|
|
|
6586
6587
|
[viewName]: view
|
|
6587
6588
|
};
|
|
6588
6589
|
try {
|
|
6589
|
-
await
|
|
6590
|
+
await db2.put(designDoc);
|
|
6590
6591
|
} catch (err) {
|
|
6591
6592
|
if (err.status === 409) {
|
|
6592
|
-
return await createView(
|
|
6593
|
+
return await createView(db2, viewJs, viewName);
|
|
6593
6594
|
} else {
|
|
6594
6595
|
throw err;
|
|
6595
6596
|
}
|
|
6596
6597
|
}
|
|
6597
6598
|
}
|
|
6598
6599
|
var createNewUserEmailView = async () => {
|
|
6599
|
-
const
|
|
6600
|
+
const db2 = getGlobalDB();
|
|
6600
6601
|
const viewJs = `function(doc) {
|
|
6601
6602
|
if (doc._id.startsWith("${"us" /* USER */}${SEPARATOR}")) {
|
|
6602
6603
|
emit(doc.email.toLowerCase(), doc._id)
|
|
6603
6604
|
}
|
|
6604
6605
|
}`;
|
|
6605
|
-
await createView(
|
|
6606
|
+
await createView(db2, viewJs, "by_email2" /* USER_BY_EMAIL */);
|
|
6606
6607
|
};
|
|
6607
6608
|
var createUserAppView = async () => {
|
|
6608
|
-
const
|
|
6609
|
+
const db2 = getGlobalDB();
|
|
6609
6610
|
const viewJs = `function(doc) {
|
|
6610
6611
|
if (doc._id.startsWith("${"us" /* USER */}${SEPARATOR}") && doc.roles) {
|
|
6611
6612
|
for (let prodAppId of Object.keys(doc.roles)) {
|
|
@@ -6614,46 +6615,46 @@ var createUserAppView = async () => {
|
|
|
6614
6615
|
}
|
|
6615
6616
|
}
|
|
6616
6617
|
}`;
|
|
6617
|
-
await createView(
|
|
6618
|
+
await createView(db2, viewJs, "by_app" /* USER_BY_APP */);
|
|
6618
6619
|
};
|
|
6619
6620
|
var createApiKeyView = async () => {
|
|
6620
|
-
const
|
|
6621
|
+
const db2 = getGlobalDB();
|
|
6621
6622
|
const viewJs = `function(doc) {
|
|
6622
6623
|
if (doc._id.startsWith("${"devinfo" /* DEV_INFO */}") && doc.apiKey) {
|
|
6623
6624
|
emit(doc.apiKey, doc.userId)
|
|
6624
6625
|
}
|
|
6625
6626
|
}`;
|
|
6626
|
-
await createView(
|
|
6627
|
+
await createView(db2, viewJs, "by_api_key" /* BY_API_KEY */);
|
|
6627
6628
|
};
|
|
6628
6629
|
var createUserBuildersView = async () => {
|
|
6629
|
-
const
|
|
6630
|
+
const db2 = getGlobalDB();
|
|
6630
6631
|
const viewJs = `function(doc) {
|
|
6631
6632
|
if (doc.builder && doc.builder.global === true) {
|
|
6632
6633
|
emit(doc._id, doc._id)
|
|
6633
6634
|
}
|
|
6634
6635
|
}`;
|
|
6635
|
-
await createView(
|
|
6636
|
+
await createView(db2, viewJs, "by_builders" /* USER_BY_BUILDERS */);
|
|
6636
6637
|
};
|
|
6637
|
-
async function queryViewRaw(viewName, params2,
|
|
6638
|
+
async function queryViewRaw(viewName, params2, db2, createFunc, opts) {
|
|
6638
6639
|
try {
|
|
6639
|
-
const response = await
|
|
6640
|
+
const response = await db2.query(`database/${viewName}`, params2);
|
|
6640
6641
|
return response;
|
|
6641
6642
|
} catch (err) {
|
|
6642
6643
|
const pouchNotFound = err && err.name === "not_found";
|
|
6643
6644
|
const couchNotFound = err && err.status === 404;
|
|
6644
6645
|
if (pouchNotFound || couchNotFound) {
|
|
6645
|
-
await removeDeprecated(
|
|
6646
|
+
await removeDeprecated(db2, viewName);
|
|
6646
6647
|
await createFunc();
|
|
6647
|
-
return queryViewRaw(viewName, params2,
|
|
6648
|
+
return queryViewRaw(viewName, params2, db2, createFunc, opts);
|
|
6648
6649
|
} else if (err.status === 409) {
|
|
6649
|
-
return queryViewRaw(viewName, params2,
|
|
6650
|
+
return queryViewRaw(viewName, params2, db2, createFunc, opts);
|
|
6650
6651
|
} else {
|
|
6651
6652
|
throw err;
|
|
6652
6653
|
}
|
|
6653
6654
|
}
|
|
6654
6655
|
}
|
|
6655
|
-
var queryView = async (viewName, params2,
|
|
6656
|
-
const response = await queryViewRaw(viewName, params2,
|
|
6656
|
+
var queryView = async (viewName, params2, db2, createFunc, opts) => {
|
|
6657
|
+
const response = await queryViewRaw(viewName, params2, db2, createFunc, opts);
|
|
6657
6658
|
const rows2 = response.rows;
|
|
6658
6659
|
const docs = rows2.map(
|
|
6659
6660
|
(row) => params2.include_docs ? row.doc : row.value
|
|
@@ -6666,8 +6667,8 @@ var queryView = async (viewName, params2, db, createFunc, opts) => {
|
|
|
6666
6667
|
};
|
|
6667
6668
|
async function createPlatformView(viewJs, viewName) {
|
|
6668
6669
|
try {
|
|
6669
|
-
await doWithDB(StaticDatabases.PLATFORM_INFO.name, async (
|
|
6670
|
-
await createView(
|
|
6670
|
+
await doWithDB(StaticDatabases.PLATFORM_INFO.name, async (db2) => {
|
|
6671
|
+
await createView(db2, viewJs, viewName);
|
|
6671
6672
|
});
|
|
6672
6673
|
} catch (e) {
|
|
6673
6674
|
if (e.status === 409 && environment_default2.isTest()) {
|
|
@@ -6697,9 +6698,9 @@ var queryPlatformView = async (viewName, params2, opts) => {
|
|
|
6697
6698
|
["account_by_email" /* ACCOUNT_BY_EMAIL */]: createPlatformAccountEmailView,
|
|
6698
6699
|
["platform_users_lowercase" /* PLATFORM_USERS_LOWERCASE */]: createPlatformUserView
|
|
6699
6700
|
};
|
|
6700
|
-
return doWithDB(StaticDatabases.PLATFORM_INFO.name, async (
|
|
6701
|
+
return doWithDB(StaticDatabases.PLATFORM_INFO.name, async (db2) => {
|
|
6701
6702
|
const createFn = CreateFuncByName2[viewName];
|
|
6702
|
-
return queryView(viewName, params2,
|
|
6703
|
+
return queryView(viewName, params2, db2, createFn, opts);
|
|
6703
6704
|
});
|
|
6704
6705
|
};
|
|
6705
6706
|
var CreateFuncByName = {
|
|
@@ -6708,17 +6709,17 @@ var CreateFuncByName = {
|
|
|
6708
6709
|
["by_builders" /* USER_BY_BUILDERS */]: createUserBuildersView,
|
|
6709
6710
|
["by_app" /* USER_BY_APP */]: createUserAppView
|
|
6710
6711
|
};
|
|
6711
|
-
var queryGlobalView = async (viewName, params2,
|
|
6712
|
-
if (!
|
|
6713
|
-
|
|
6712
|
+
var queryGlobalView = async (viewName, params2, db2, opts) => {
|
|
6713
|
+
if (!db2) {
|
|
6714
|
+
db2 = getGlobalDB();
|
|
6714
6715
|
}
|
|
6715
6716
|
const createFn = CreateFuncByName[viewName];
|
|
6716
|
-
return queryView(viewName, params2,
|
|
6717
|
+
return queryView(viewName, params2, db2, createFn, opts);
|
|
6717
6718
|
};
|
|
6718
6719
|
async function queryGlobalViewRaw(viewName, params2, opts) {
|
|
6719
|
-
const
|
|
6720
|
+
const db2 = getGlobalDB();
|
|
6720
6721
|
const createFn = CreateFuncByName[viewName];
|
|
6721
|
-
return queryViewRaw(viewName, params2,
|
|
6722
|
+
return queryViewRaw(viewName, params2, db2, createFn, opts);
|
|
6722
6723
|
}
|
|
6723
6724
|
|
|
6724
6725
|
// ../backend-core/src/db/index.ts
|
|
@@ -6733,8 +6734,8 @@ var Replication = class {
|
|
|
6733
6734
|
* @param {String} source - the DB you want to replicate or rollback to
|
|
6734
6735
|
* @param {String} target - the DB you want to replicate to, or rollback from
|
|
6735
6736
|
*/
|
|
6736
|
-
constructor({ source, target }) {
|
|
6737
|
-
this.source = getPouchDB(
|
|
6737
|
+
constructor({ source: source2, target }) {
|
|
6738
|
+
this.source = getPouchDB(source2);
|
|
6738
6739
|
this.target = getPouchDB(target);
|
|
6739
6740
|
}
|
|
6740
6741
|
close() {
|
|
@@ -6769,8 +6770,8 @@ var Replication = class {
|
|
|
6769
6770
|
}
|
|
6770
6771
|
appReplicateOpts() {
|
|
6771
6772
|
return {
|
|
6772
|
-
filter: (
|
|
6773
|
-
return
|
|
6773
|
+
filter: (doc2) => {
|
|
6774
|
+
return doc2._id !== "app_metadata" /* APP_METADATA */;
|
|
6774
6775
|
}
|
|
6775
6776
|
};
|
|
6776
6777
|
}
|
|
@@ -6858,9 +6859,9 @@ var _QueryBuilder = class {
|
|
|
6858
6859
|
__privateSet(this, _indexBuilder, builderFn);
|
|
6859
6860
|
return this;
|
|
6860
6861
|
}
|
|
6861
|
-
setVersion(
|
|
6862
|
-
if (
|
|
6863
|
-
__privateSet(this, _version,
|
|
6862
|
+
setVersion(version2) {
|
|
6863
|
+
if (version2 != null) {
|
|
6864
|
+
__privateSet(this, _version, version2);
|
|
6864
6865
|
}
|
|
6865
6866
|
return this;
|
|
6866
6867
|
}
|
|
@@ -7353,10 +7354,10 @@ __export(searchIndexes_exports, {
|
|
|
7353
7354
|
init_src();
|
|
7354
7355
|
init_context2();
|
|
7355
7356
|
async function createUserIndex() {
|
|
7356
|
-
const
|
|
7357
|
+
const db2 = getGlobalDB();
|
|
7357
7358
|
let designDoc;
|
|
7358
7359
|
try {
|
|
7359
|
-
designDoc = await
|
|
7360
|
+
designDoc = await db2.get("_design/database");
|
|
7360
7361
|
} catch (err) {
|
|
7361
7362
|
if (err.status === 404) {
|
|
7362
7363
|
designDoc = { _id: "_design/database" };
|
|
@@ -7402,7 +7403,7 @@ async function createUserIndex() {
|
|
|
7402
7403
|
}
|
|
7403
7404
|
}
|
|
7404
7405
|
};
|
|
7405
|
-
await
|
|
7406
|
+
await db2.put(designDoc);
|
|
7406
7407
|
}
|
|
7407
7408
|
|
|
7408
7409
|
// ../backend-core/src/cache/appMetadata.ts
|
|
@@ -7413,42 +7414,42 @@ var EXPIRY_SECONDS2 = 3600;
|
|
|
7413
7414
|
async function populateFromDB2(appId) {
|
|
7414
7415
|
return doWithDB(
|
|
7415
7416
|
appId,
|
|
7416
|
-
(
|
|
7417
|
-
return
|
|
7417
|
+
(db2) => {
|
|
7418
|
+
return db2.get("app_metadata" /* APP_METADATA */);
|
|
7418
7419
|
},
|
|
7419
7420
|
{ skip_setup: true }
|
|
7420
7421
|
);
|
|
7421
7422
|
}
|
|
7422
|
-
function isInvalid(
|
|
7423
|
-
return !
|
|
7423
|
+
function isInvalid(metadata2) {
|
|
7424
|
+
return !metadata2 || metadata2.state === AppState.INVALID;
|
|
7424
7425
|
}
|
|
7425
7426
|
async function getAppMetadata(appId) {
|
|
7426
7427
|
const client3 = await getAppClient();
|
|
7427
|
-
let
|
|
7428
|
-
if (!
|
|
7428
|
+
let metadata2 = await client3.get(appId);
|
|
7429
|
+
if (!metadata2) {
|
|
7429
7430
|
let expiry = EXPIRY_SECONDS2;
|
|
7430
7431
|
try {
|
|
7431
|
-
|
|
7432
|
+
metadata2 = await populateFromDB2(appId);
|
|
7432
7433
|
} catch (err) {
|
|
7433
7434
|
if (err && err.status === 404) {
|
|
7434
|
-
|
|
7435
|
+
metadata2 = { state: AppState.INVALID };
|
|
7435
7436
|
expiry = void 0;
|
|
7436
7437
|
} else {
|
|
7437
7438
|
throw err;
|
|
7438
7439
|
}
|
|
7439
7440
|
}
|
|
7440
|
-
if (isInvalid(
|
|
7441
|
+
if (isInvalid(metadata2)) {
|
|
7441
7442
|
const temp = await client3.get(appId);
|
|
7442
7443
|
if (temp) {
|
|
7443
|
-
|
|
7444
|
+
metadata2 = temp;
|
|
7444
7445
|
}
|
|
7445
7446
|
}
|
|
7446
|
-
await client3.store(appId,
|
|
7447
|
+
await client3.store(appId, metadata2, expiry);
|
|
7447
7448
|
}
|
|
7448
|
-
if (isInvalid(
|
|
7449
|
+
if (isInvalid(metadata2)) {
|
|
7449
7450
|
throw { status: 404, message: "No app metadata found" };
|
|
7450
7451
|
}
|
|
7451
|
-
return
|
|
7452
|
+
return metadata2;
|
|
7452
7453
|
}
|
|
7453
7454
|
async function invalidateAppMetadata(appId, newMetadata) {
|
|
7454
7455
|
if (!appId) {
|
|
@@ -7479,21 +7480,21 @@ async function getCache() {
|
|
|
7479
7480
|
}
|
|
7480
7481
|
return CACHE;
|
|
7481
7482
|
}
|
|
7482
|
-
function makeCacheKey(
|
|
7483
|
-
return
|
|
7483
|
+
function makeCacheKey(db2, key) {
|
|
7484
|
+
return db2.name + key;
|
|
7484
7485
|
}
|
|
7485
|
-
function makeCacheItem(
|
|
7486
|
-
return { doc, lastWrite: lastWrite || Date.now() };
|
|
7486
|
+
function makeCacheItem(doc2, lastWrite = null) {
|
|
7487
|
+
return { doc: doc2, lastWrite: lastWrite || Date.now() };
|
|
7487
7488
|
}
|
|
7488
|
-
async function put(
|
|
7489
|
+
async function put(db2, doc2, writeRateMs = DEFAULT_WRITE_RATE_MS) {
|
|
7489
7490
|
const cache2 = await getCache();
|
|
7490
|
-
const key =
|
|
7491
|
+
const key = doc2._id;
|
|
7491
7492
|
let cacheItem;
|
|
7492
7493
|
if (key) {
|
|
7493
|
-
cacheItem = await cache2.get(makeCacheKey(
|
|
7494
|
+
cacheItem = await cache2.get(makeCacheKey(db2, key));
|
|
7494
7495
|
}
|
|
7495
7496
|
const updateDb = !cacheItem || cacheItem.lastWrite < Date.now() - writeRateMs;
|
|
7496
|
-
let output =
|
|
7497
|
+
let output = doc2;
|
|
7497
7498
|
if (updateDb) {
|
|
7498
7499
|
const lockResponse = await doWithLock(
|
|
7499
7500
|
{
|
|
@@ -7504,15 +7505,15 @@ async function put(db, doc, writeRateMs = DEFAULT_WRITE_RATE_MS) {
|
|
|
7504
7505
|
},
|
|
7505
7506
|
async () => {
|
|
7506
7507
|
const writeDb = async (toWrite) => {
|
|
7507
|
-
const response = await
|
|
7508
|
+
const response = await db2.put(toWrite, { force: true });
|
|
7508
7509
|
output = {
|
|
7509
|
-
...
|
|
7510
|
+
...doc2,
|
|
7510
7511
|
_id: response.id,
|
|
7511
7512
|
_rev: response.rev
|
|
7512
7513
|
};
|
|
7513
7514
|
};
|
|
7514
7515
|
try {
|
|
7515
|
-
await writeDb(
|
|
7516
|
+
await writeDb(doc2);
|
|
7516
7517
|
} catch (err) {
|
|
7517
7518
|
if (err.status !== 409) {
|
|
7518
7519
|
throw err;
|
|
@@ -7528,47 +7529,47 @@ async function put(db, doc, writeRateMs = DEFAULT_WRITE_RATE_MS) {
|
|
|
7528
7529
|
}
|
|
7529
7530
|
cacheItem = makeCacheItem(output, updateDb ? null : cacheItem == null ? void 0 : cacheItem.lastWrite);
|
|
7530
7531
|
if (output._id) {
|
|
7531
|
-
await cache2.store(makeCacheKey(
|
|
7532
|
+
await cache2.store(makeCacheKey(db2, output._id), cacheItem);
|
|
7532
7533
|
}
|
|
7533
7534
|
return { ok: true, id: output._id, rev: output._rev };
|
|
7534
7535
|
}
|
|
7535
|
-
async function get2(
|
|
7536
|
+
async function get2(db2, id) {
|
|
7536
7537
|
const cache2 = await getCache();
|
|
7537
|
-
const cacheKey = makeCacheKey(
|
|
7538
|
+
const cacheKey = makeCacheKey(db2, id);
|
|
7538
7539
|
let cacheItem = await cache2.get(cacheKey);
|
|
7539
7540
|
if (!cacheItem) {
|
|
7540
|
-
const
|
|
7541
|
-
cacheItem = makeCacheItem(
|
|
7541
|
+
const doc2 = await db2.get(id);
|
|
7542
|
+
cacheItem = makeCacheItem(doc2);
|
|
7542
7543
|
await cache2.store(cacheKey, cacheItem);
|
|
7543
7544
|
}
|
|
7544
7545
|
return cacheItem.doc;
|
|
7545
7546
|
}
|
|
7546
|
-
async function remove(
|
|
7547
|
+
async function remove(db2, docOrId, rev2) {
|
|
7547
7548
|
const cache2 = await getCache();
|
|
7548
7549
|
if (!docOrId) {
|
|
7549
7550
|
throw new Error("No ID/Rev provided.");
|
|
7550
7551
|
}
|
|
7551
7552
|
const id = typeof docOrId === "string" ? docOrId : docOrId._id;
|
|
7552
|
-
|
|
7553
|
+
rev2 = typeof docOrId === "string" ? rev2 : docOrId._rev;
|
|
7553
7554
|
try {
|
|
7554
|
-
await cache2.delete(makeCacheKey(
|
|
7555
|
+
await cache2.delete(makeCacheKey(db2, id));
|
|
7555
7556
|
} finally {
|
|
7556
|
-
await
|
|
7557
|
+
await db2.remove(id, rev2);
|
|
7557
7558
|
}
|
|
7558
7559
|
}
|
|
7559
7560
|
var Writethrough = class {
|
|
7560
|
-
constructor(
|
|
7561
|
-
this.db =
|
|
7561
|
+
constructor(db2, writeRateMs = DEFAULT_WRITE_RATE_MS) {
|
|
7562
|
+
this.db = db2;
|
|
7562
7563
|
this.writeRateMs = writeRateMs;
|
|
7563
7564
|
}
|
|
7564
|
-
async put(
|
|
7565
|
-
return put(this.db,
|
|
7565
|
+
async put(doc2) {
|
|
7566
|
+
return put(this.db, doc2, this.writeRateMs);
|
|
7566
7567
|
}
|
|
7567
7568
|
async get(id) {
|
|
7568
7569
|
return get2(this.db, id);
|
|
7569
7570
|
}
|
|
7570
|
-
async remove(docOrId,
|
|
7571
|
-
return remove(this.db, docOrId,
|
|
7571
|
+
async remove(docOrId, rev2) {
|
|
7572
|
+
return remove(this.db, docOrId, rev2);
|
|
7572
7573
|
}
|
|
7573
7574
|
};
|
|
7574
7575
|
|
|
@@ -7580,9 +7581,9 @@ function generateConfigID(type) {
|
|
|
7580
7581
|
return `${"config" /* CONFIG */}${SEPARATOR}${type}`;
|
|
7581
7582
|
}
|
|
7582
7583
|
async function getConfig(type) {
|
|
7583
|
-
const
|
|
7584
|
+
const db2 = getGlobalDB();
|
|
7584
7585
|
try {
|
|
7585
|
-
return await
|
|
7586
|
+
return await db2.get(generateConfigID(type));
|
|
7586
7587
|
} catch (e) {
|
|
7587
7588
|
if (e.status === 404) {
|
|
7588
7589
|
return;
|
|
@@ -7591,8 +7592,8 @@ async function getConfig(type) {
|
|
|
7591
7592
|
}
|
|
7592
7593
|
}
|
|
7593
7594
|
async function save(config) {
|
|
7594
|
-
const
|
|
7595
|
-
return
|
|
7595
|
+
const db2 = getGlobalDB();
|
|
7596
|
+
return db2.put(config);
|
|
7596
7597
|
}
|
|
7597
7598
|
async function getSettingsConfigDoc() {
|
|
7598
7599
|
let config = await getConfig("settings" /* SETTINGS */);
|
|
@@ -8041,7 +8042,7 @@ __export(utils_exports2, {
|
|
|
8041
8042
|
compare: () => compare,
|
|
8042
8043
|
getAppIdFromCtx: () => getAppIdFromCtx,
|
|
8043
8044
|
getCookie: () => getCookie,
|
|
8044
|
-
hash: () =>
|
|
8045
|
+
hash: () => hash2,
|
|
8045
8046
|
isAudited: () => isAudited,
|
|
8046
8047
|
isClient: () => isClient,
|
|
8047
8048
|
isPublicApiRequest: () => isPublicApiRequest,
|
|
@@ -8062,7 +8063,7 @@ init_environment2();
|
|
|
8062
8063
|
init_newid();
|
|
8063
8064
|
var bcrypt = environment_default2.JS_BCRYPT ? require("bcryptjs") : require("bcrypt");
|
|
8064
8065
|
var SALT_ROUNDS = environment_default2.SALT_ROUNDS || 10;
|
|
8065
|
-
async function
|
|
8066
|
+
async function hash2(data) {
|
|
8066
8067
|
const salt = await bcrypt.genSalt(SALT_ROUNDS);
|
|
8067
8068
|
return bcrypt.hash(data, salt);
|
|
8068
8069
|
}
|
|
@@ -8178,14 +8179,14 @@ function isValidInternalAPIKey(apiKey) {
|
|
|
8178
8179
|
}
|
|
8179
8180
|
return false;
|
|
8180
8181
|
}
|
|
8181
|
-
function getCookie(ctx,
|
|
8182
|
-
const cookie = ctx.cookies.get(
|
|
8182
|
+
function getCookie(ctx, name2) {
|
|
8183
|
+
const cookie = ctx.cookies.get(name2);
|
|
8183
8184
|
if (!cookie) {
|
|
8184
8185
|
return cookie;
|
|
8185
8186
|
}
|
|
8186
8187
|
return openJwt(cookie);
|
|
8187
8188
|
}
|
|
8188
|
-
function setCookie(ctx, value,
|
|
8189
|
+
function setCookie(ctx, value, name2 = "builder", opts = { sign: true }) {
|
|
8189
8190
|
if (value && opts && opts.sign) {
|
|
8190
8191
|
value = jwt.sign(value, environment_default2.JWT_SECRET);
|
|
8191
8192
|
}
|
|
@@ -8198,10 +8199,10 @@ function setCookie(ctx, value, name = "builder", opts = { sign: true }) {
|
|
|
8198
8199
|
if (environment_default2.COOKIE_DOMAIN) {
|
|
8199
8200
|
config.domain = environment_default2.COOKIE_DOMAIN;
|
|
8200
8201
|
}
|
|
8201
|
-
ctx.cookies.set(
|
|
8202
|
+
ctx.cookies.set(name2, value, config);
|
|
8202
8203
|
}
|
|
8203
|
-
function clearCookie(ctx,
|
|
8204
|
-
setCookie(ctx, null,
|
|
8204
|
+
function clearCookie(ctx, name2) {
|
|
8205
|
+
setCookie(ctx, null, name2);
|
|
8205
8206
|
}
|
|
8206
8207
|
function isClient(ctx) {
|
|
8207
8208
|
return ctx.headers["x-budibase-type" /* TYPE */] === "client";
|
|
@@ -8235,8 +8236,8 @@ var InMemoryQueue = class {
|
|
|
8235
8236
|
* @param {object|null} opts This is not used by the in memory queue as there is no real use
|
|
8236
8237
|
* case when in memory, but is the same API as Bull
|
|
8237
8238
|
*/
|
|
8238
|
-
constructor(
|
|
8239
|
-
this._name =
|
|
8239
|
+
constructor(name2, opts = null) {
|
|
8240
|
+
this._name = name2;
|
|
8240
8241
|
this._opts = opts;
|
|
8241
8242
|
this._messages = [];
|
|
8242
8243
|
this._emitter = new import_events2.default.EventEmitter();
|
|
@@ -8669,13 +8670,13 @@ var getInstallFromDB = async () => {
|
|
|
8669
8670
|
}
|
|
8670
8671
|
);
|
|
8671
8672
|
};
|
|
8672
|
-
var updateVersion = async (
|
|
8673
|
+
var updateVersion = async (version2) => {
|
|
8673
8674
|
try {
|
|
8674
8675
|
await doWithDB(
|
|
8675
8676
|
StaticDatabases.PLATFORM_INFO.name,
|
|
8676
8677
|
async (platformDb) => {
|
|
8677
8678
|
const install = await getInstall();
|
|
8678
|
-
install.version =
|
|
8679
|
+
install.version = version2;
|
|
8679
8680
|
await platformDb.put(install);
|
|
8680
8681
|
await bustCache("installation" /* INSTALLATION */);
|
|
8681
8682
|
}
|
|
@@ -8777,13 +8778,13 @@ var identifyInstallationGroup = async (installId, timestamp) => {
|
|
|
8777
8778
|
const id = installId;
|
|
8778
8779
|
const type = "installation" /* INSTALLATION */;
|
|
8779
8780
|
const hosting = getHostingFromEnv();
|
|
8780
|
-
const
|
|
8781
|
+
const version2 = environment_default2.VERSION;
|
|
8781
8782
|
const environment3 = getDeploymentEnvironment();
|
|
8782
8783
|
const group = {
|
|
8783
8784
|
id,
|
|
8784
8785
|
type,
|
|
8785
8786
|
hosting,
|
|
8786
|
-
version,
|
|
8787
|
+
version: version2,
|
|
8787
8788
|
environment: environment3
|
|
8788
8789
|
};
|
|
8789
8790
|
await identifyGroup(group, timestamp);
|
|
@@ -8908,7 +8909,7 @@ var getEventTenantId = async (tenantId) => {
|
|
|
8908
8909
|
var getUniqueTenantId = async (tenantId) => {
|
|
8909
8910
|
return doInTenant(tenantId, () => {
|
|
8910
8911
|
return withCache("uniqueTenantId" /* UNIQUE_TENANT_ID */, 86400 /* ONE_DAY */, async () => {
|
|
8911
|
-
const
|
|
8912
|
+
const db2 = getGlobalDB();
|
|
8912
8913
|
const config = await getSettingsConfigDoc();
|
|
8913
8914
|
let uniqueTenantId;
|
|
8914
8915
|
if (config.config.uniqueTenantId) {
|
|
@@ -8916,7 +8917,7 @@ var getUniqueTenantId = async (tenantId) => {
|
|
|
8916
8917
|
} else {
|
|
8917
8918
|
uniqueTenantId = `${newid()}_${tenantId}`;
|
|
8918
8919
|
config.config.uniqueTenantId = uniqueTenantId;
|
|
8919
|
-
await
|
|
8920
|
+
await db2.put(config);
|
|
8920
8921
|
return uniqueTenantId;
|
|
8921
8922
|
}
|
|
8922
8923
|
});
|
|
@@ -8956,10 +8957,10 @@ __export(backfill_exports, {
|
|
|
8956
8957
|
init_src();
|
|
8957
8958
|
init_context2();
|
|
8958
8959
|
var start = async (events2) => {
|
|
8959
|
-
const
|
|
8960
|
+
const metadata2 = {
|
|
8960
8961
|
eventWhitelist: events2
|
|
8961
8962
|
};
|
|
8962
|
-
return saveBackfillMetadata(
|
|
8963
|
+
return saveBackfillMetadata(metadata2);
|
|
8963
8964
|
};
|
|
8964
8965
|
var recordEvent2 = async (event, properties) => {
|
|
8965
8966
|
const eventKey2 = getEventKey(event, properties);
|
|
@@ -9269,11 +9270,11 @@ var app_default = {
|
|
|
9269
9270
|
|
|
9270
9271
|
// ../backend-core/src/events/publishers/auth.ts
|
|
9271
9272
|
init_src();
|
|
9272
|
-
async function login(
|
|
9273
|
+
async function login(source2, email) {
|
|
9273
9274
|
const identity = await identification_default.getCurrentIdentity();
|
|
9274
9275
|
const properties = {
|
|
9275
9276
|
userId: identity.id,
|
|
9276
|
-
source,
|
|
9277
|
+
source: source2,
|
|
9277
9278
|
audited: {
|
|
9278
9279
|
email
|
|
9279
9280
|
}
|
|
@@ -10062,9 +10063,9 @@ var view_default = {
|
|
|
10062
10063
|
|
|
10063
10064
|
// ../backend-core/src/events/publishers/installation.ts
|
|
10064
10065
|
init_src();
|
|
10065
|
-
async function versionChecked(
|
|
10066
|
+
async function versionChecked(version2) {
|
|
10066
10067
|
const properties = {
|
|
10067
|
-
currentVersion:
|
|
10068
|
+
currentVersion: version2
|
|
10068
10069
|
};
|
|
10069
10070
|
await publishEvent("installation:version:checked" /* INSTALLATION_VERSION_CHECKED */, properties);
|
|
10070
10071
|
}
|
|
@@ -10283,13 +10284,13 @@ async function appBackupRestored(backup) {
|
|
|
10283
10284
|
};
|
|
10284
10285
|
await publishEvent("app:backup:restored" /* APP_BACKUP_RESTORED */, properties);
|
|
10285
10286
|
}
|
|
10286
|
-
async function appBackupTriggered(appId, backupId, type, trigger,
|
|
10287
|
+
async function appBackupTriggered(appId, backupId, type, trigger, name2) {
|
|
10287
10288
|
const properties = {
|
|
10288
10289
|
appId,
|
|
10289
10290
|
backupId,
|
|
10290
10291
|
type,
|
|
10291
10292
|
trigger,
|
|
10292
|
-
name
|
|
10293
|
+
name: name2
|
|
10293
10294
|
};
|
|
10294
10295
|
await publishEvent("app:backup:triggered" /* APP_BACKUP_TRIGGERED */, properties);
|
|
10295
10296
|
}
|
|
@@ -10300,16 +10301,16 @@ var backup_default = {
|
|
|
10300
10301
|
|
|
10301
10302
|
// ../backend-core/src/events/publishers/environmentVariable.ts
|
|
10302
10303
|
init_src();
|
|
10303
|
-
async function created14(
|
|
10304
|
+
async function created14(name2, environments) {
|
|
10304
10305
|
const properties = {
|
|
10305
|
-
name,
|
|
10306
|
+
name: name2,
|
|
10306
10307
|
environments
|
|
10307
10308
|
};
|
|
10308
10309
|
await publishEvent("environment_variable:created" /* ENVIRONMENT_VARIABLE_CREATED */, properties);
|
|
10309
10310
|
}
|
|
10310
|
-
async function deleted14(
|
|
10311
|
+
async function deleted14(name2) {
|
|
10311
10312
|
const properties = {
|
|
10312
|
-
name
|
|
10313
|
+
name: name2
|
|
10313
10314
|
};
|
|
10314
10315
|
await publishEvent("environment_variable:deleted" /* ENVIRONMENT_VARIABLE_DELETED */, properties);
|
|
10315
10316
|
}
|
|
@@ -10430,8 +10431,8 @@ function removeUserPassword(users2) {
|
|
|
10430
10431
|
return users2;
|
|
10431
10432
|
}
|
|
10432
10433
|
var bulkGetGlobalUsersById = async (userIds, opts) => {
|
|
10433
|
-
const
|
|
10434
|
-
let users2 = (await
|
|
10434
|
+
const db2 = getGlobalDB();
|
|
10435
|
+
let users2 = (await db2.allDocs({
|
|
10435
10436
|
keys: userIds,
|
|
10436
10437
|
include_docs: true
|
|
10437
10438
|
})).rows.map((row) => row.doc);
|
|
@@ -10441,21 +10442,21 @@ var bulkGetGlobalUsersById = async (userIds, opts) => {
|
|
|
10441
10442
|
return users2;
|
|
10442
10443
|
};
|
|
10443
10444
|
var getAllUserIds = async () => {
|
|
10444
|
-
const
|
|
10445
|
+
const db2 = getGlobalDB();
|
|
10445
10446
|
const startKey = `${"us" /* USER */}${SEPARATOR}`;
|
|
10446
|
-
const response = await
|
|
10447
|
+
const response = await db2.allDocs({
|
|
10447
10448
|
startkey: startKey,
|
|
10448
10449
|
endkey: `${startKey}${UNICODE_MAX}`
|
|
10449
10450
|
});
|
|
10450
10451
|
return response.rows.map((row) => row.id);
|
|
10451
10452
|
};
|
|
10452
10453
|
var bulkUpdateGlobalUsers = async (users2) => {
|
|
10453
|
-
const
|
|
10454
|
-
return await
|
|
10454
|
+
const db2 = getGlobalDB();
|
|
10455
|
+
return await db2.bulkDocs(users2);
|
|
10455
10456
|
};
|
|
10456
10457
|
async function getById(id, opts) {
|
|
10457
|
-
const
|
|
10458
|
-
let user = await
|
|
10458
|
+
const db2 = getGlobalDB();
|
|
10459
|
+
let user = await db2.get(id);
|
|
10459
10460
|
if (opts == null ? void 0 : opts.cleanup) {
|
|
10460
10461
|
user = removeUserPassword(user);
|
|
10461
10462
|
}
|
|
@@ -10558,7 +10559,7 @@ var paginatedUsers = async ({
|
|
|
10558
10559
|
email,
|
|
10559
10560
|
appId
|
|
10560
10561
|
} = {}) => {
|
|
10561
|
-
const
|
|
10562
|
+
const db2 = getGlobalDB();
|
|
10562
10563
|
const opts = {
|
|
10563
10564
|
include_docs: true,
|
|
10564
10565
|
limit: PAGE_LIMIT + 1
|
|
@@ -10569,12 +10570,12 @@ var paginatedUsers = async ({
|
|
|
10569
10570
|
let userList, property = "_id", getKey;
|
|
10570
10571
|
if (appId) {
|
|
10571
10572
|
userList = await searchGlobalUsersByApp(appId, opts);
|
|
10572
|
-
getKey = (
|
|
10573
|
+
getKey = (doc2) => getGlobalUserByAppPage(appId, doc2);
|
|
10573
10574
|
} else if (email) {
|
|
10574
10575
|
userList = await searchGlobalUsersByEmail(email, opts);
|
|
10575
10576
|
property = "email";
|
|
10576
10577
|
} else {
|
|
10577
|
-
const response = await
|
|
10578
|
+
const response = await db2.allDocs(getGlobalUserParams(null, opts));
|
|
10578
10579
|
userList = response.rows.map((row) => row.doc);
|
|
10579
10580
|
}
|
|
10580
10581
|
return pagination(userList, PAGE_LIMIT, {
|
|
@@ -10695,10 +10696,10 @@ var EXTERNAL_BUILTIN_ROLE_IDS = [
|
|
|
10695
10696
|
BUILTIN_IDS.PUBLIC
|
|
10696
10697
|
];
|
|
10697
10698
|
var Role2 = class {
|
|
10698
|
-
constructor(id,
|
|
10699
|
+
constructor(id, name2, permissionId) {
|
|
10699
10700
|
this.permissions = {};
|
|
10700
10701
|
this._id = id;
|
|
10701
|
-
this.name =
|
|
10702
|
+
this.name = name2;
|
|
10702
10703
|
this.permissionId = permissionId;
|
|
10703
10704
|
}
|
|
10704
10705
|
addInheritance(inherits) {
|
|
@@ -10777,7 +10778,7 @@ function lowerBuiltinRoleID(roleId1, roleId2) {
|
|
|
10777
10778
|
}
|
|
10778
10779
|
return builtinRoleToNumber(roleId1) > builtinRoleToNumber(roleId2) ? roleId2 : roleId1;
|
|
10779
10780
|
}
|
|
10780
|
-
async function getRole(roleId) {
|
|
10781
|
+
async function getRole(roleId, opts) {
|
|
10781
10782
|
if (!roleId) {
|
|
10782
10783
|
return void 0;
|
|
10783
10784
|
}
|
|
@@ -10788,11 +10789,14 @@ async function getRole(roleId) {
|
|
|
10788
10789
|
);
|
|
10789
10790
|
}
|
|
10790
10791
|
try {
|
|
10791
|
-
const
|
|
10792
|
-
const dbRole = await
|
|
10792
|
+
const db2 = getAppDB();
|
|
10793
|
+
const dbRole = await db2.get(getDBRoleID(roleId));
|
|
10793
10794
|
role = Object.assign(role, dbRole);
|
|
10794
10795
|
role._id = getExternalRoleID(role._id);
|
|
10795
10796
|
} catch (err) {
|
|
10797
|
+
if (!isBuiltin(roleId) && (opts == null ? void 0 : opts.defaultPublic)) {
|
|
10798
|
+
return cloneDeep2(BUILTIN_ROLES.PUBLIC);
|
|
10799
|
+
}
|
|
10796
10800
|
if (Object.keys(role).length === 0) {
|
|
10797
10801
|
throw err;
|
|
10798
10802
|
}
|
|
@@ -10840,10 +10844,10 @@ async function getAllRoles(appId) {
|
|
|
10840
10844
|
}
|
|
10841
10845
|
return internal(appDB);
|
|
10842
10846
|
}
|
|
10843
|
-
async function internal(
|
|
10847
|
+
async function internal(db2) {
|
|
10844
10848
|
let roles = [];
|
|
10845
|
-
if (
|
|
10846
|
-
const body2 = await
|
|
10849
|
+
if (db2) {
|
|
10850
|
+
const body2 = await db2.allDocs(
|
|
10847
10851
|
getRoleParams(null, {
|
|
10848
10852
|
include_docs: true
|
|
10849
10853
|
})
|
|
@@ -11279,12 +11283,12 @@ async function syncUser(user, details) {
|
|
|
11279
11283
|
if (details.profile) {
|
|
11280
11284
|
const profile = details.profile;
|
|
11281
11285
|
if (profile.name) {
|
|
11282
|
-
const
|
|
11283
|
-
if (
|
|
11284
|
-
firstName =
|
|
11286
|
+
const name2 = profile.name;
|
|
11287
|
+
if (name2.givenName) {
|
|
11288
|
+
firstName = name2.givenName;
|
|
11285
11289
|
}
|
|
11286
|
-
if (
|
|
11287
|
-
lastName =
|
|
11290
|
+
if (name2.familyName) {
|
|
11291
|
+
lastName = name2.familyName;
|
|
11288
11292
|
}
|
|
11289
11293
|
}
|
|
11290
11294
|
pictureUrl = await getProfilePictureUrl(user, details);
|
|
@@ -11481,8 +11485,8 @@ async function preAuth(passport2, ctx, next) {
|
|
|
11481
11485
|
callbackUrl,
|
|
11482
11486
|
ssoSaveUserNoOp
|
|
11483
11487
|
);
|
|
11484
|
-
if (!ctx.query.appId
|
|
11485
|
-
ctx.throw(400, "appId
|
|
11488
|
+
if (!ctx.query.appId) {
|
|
11489
|
+
ctx.throw(400, "appId query param not present.");
|
|
11486
11490
|
}
|
|
11487
11491
|
return passport2.authenticate(strategy, {
|
|
11488
11492
|
scope: ["profile", "email", "https://www.googleapis.com/auth/spreadsheets"],
|
|
@@ -11502,7 +11506,7 @@ async function postAuth(passport2, ctx, next) {
|
|
|
11502
11506
|
clientSecret: config.clientSecret,
|
|
11503
11507
|
callbackURL: callbackUrl
|
|
11504
11508
|
},
|
|
11505
|
-
(accessToken, refreshToken,
|
|
11509
|
+
(accessToken, refreshToken, _profile, done) => {
|
|
11506
11510
|
clearCookie(ctx, "budibase:datasourceauth" /* DatasourceAuth */);
|
|
11507
11511
|
done(null, { accessToken, refreshToken });
|
|
11508
11512
|
}
|
|
@@ -11510,22 +11514,14 @@ async function postAuth(passport2, ctx, next) {
|
|
|
11510
11514
|
{ successRedirect: "/", failureRedirect: "/error" },
|
|
11511
11515
|
async (err, tokens) => {
|
|
11512
11516
|
const baseUrl = `/builder/app/${authStateCookie.appId}/data`;
|
|
11513
|
-
|
|
11514
|
-
|
|
11515
|
-
|
|
11516
|
-
|
|
11517
|
-
|
|
11518
|
-
if (err2.status === 404) {
|
|
11519
|
-
ctx.redirect(baseUrl);
|
|
11520
|
-
}
|
|
11521
|
-
}
|
|
11522
|
-
if (!datasource2.config) {
|
|
11523
|
-
datasource2.config = {};
|
|
11517
|
+
const id = newid();
|
|
11518
|
+
await store(
|
|
11519
|
+
`datasource:creation:${authStateCookie.appId}:google:${id}`,
|
|
11520
|
+
{
|
|
11521
|
+
tokens
|
|
11524
11522
|
}
|
|
11525
|
-
|
|
11526
|
-
|
|
11527
|
-
ctx.redirect(`${baseUrl}/datasource/${authStateCookie.datasourceId}`);
|
|
11528
|
-
});
|
|
11523
|
+
);
|
|
11524
|
+
ctx.redirect(`${baseUrl}/new?continue_google_setup=${id}`);
|
|
11529
11525
|
}
|
|
11530
11526
|
)(ctx, next);
|
|
11531
11527
|
}
|
|
@@ -11575,16 +11571,22 @@ var encryption_exports = {};
|
|
|
11575
11571
|
__export(encryption_exports, {
|
|
11576
11572
|
SecretOption: () => SecretOption,
|
|
11577
11573
|
decrypt: () => decrypt,
|
|
11574
|
+
decryptFile: () => decryptFile,
|
|
11578
11575
|
encrypt: () => encrypt,
|
|
11576
|
+
encryptFile: () => encryptFile,
|
|
11579
11577
|
getSecret: () => getSecret
|
|
11580
11578
|
});
|
|
11581
11579
|
var import_crypto = __toESM(require("crypto"));
|
|
11580
|
+
var import_fs2 = __toESM(require("fs"));
|
|
11581
|
+
var import_zlib = __toESM(require("zlib"));
|
|
11582
11582
|
init_environment2();
|
|
11583
|
+
var import_path2 = require("path");
|
|
11583
11584
|
var ALGO = "aes-256-ctr";
|
|
11584
11585
|
var SEPARATOR3 = "-";
|
|
11585
11586
|
var ITERATIONS = 1e4;
|
|
11586
|
-
var RANDOM_BYTES = 16;
|
|
11587
11587
|
var STRETCH_LENGTH = 32;
|
|
11588
|
+
var SALT_LENGTH = 16;
|
|
11589
|
+
var IV_LENGTH = 16;
|
|
11588
11590
|
var SecretOption = /* @__PURE__ */ ((SecretOption2) => {
|
|
11589
11591
|
SecretOption2["API"] = "api";
|
|
11590
11592
|
SecretOption2["ENCRYPTION"] = "encryption";
|
|
@@ -11608,11 +11610,11 @@ function getSecret(secretOption) {
|
|
|
11608
11610
|
}
|
|
11609
11611
|
return secret;
|
|
11610
11612
|
}
|
|
11611
|
-
function stretchString(
|
|
11612
|
-
return import_crypto.default.pbkdf2Sync(
|
|
11613
|
+
function stretchString(secret, salt) {
|
|
11614
|
+
return import_crypto.default.pbkdf2Sync(secret, salt, ITERATIONS, STRETCH_LENGTH, "sha512");
|
|
11613
11615
|
}
|
|
11614
11616
|
function encrypt(input, secretOption = "api" /* API */) {
|
|
11615
|
-
const salt = import_crypto.default.randomBytes(
|
|
11617
|
+
const salt = import_crypto.default.randomBytes(SALT_LENGTH);
|
|
11616
11618
|
const stretched = stretchString(getSecret(secretOption), salt);
|
|
11617
11619
|
const cipher = import_crypto.default.createCipheriv(ALGO, stretched, salt);
|
|
11618
11620
|
const base = cipher.update(input);
|
|
@@ -11629,6 +11631,87 @@ function decrypt(input, secretOption = "api" /* API */) {
|
|
|
11629
11631
|
const final = decipher.final();
|
|
11630
11632
|
return Buffer.concat([base, final]).toString();
|
|
11631
11633
|
}
|
|
11634
|
+
async function encryptFile({ dir, filename }, secret) {
|
|
11635
|
+
const outputFileName = `${filename}.enc`;
|
|
11636
|
+
const filePath = (0, import_path2.join)(dir, filename);
|
|
11637
|
+
const inputFile = import_fs2.default.createReadStream(filePath);
|
|
11638
|
+
const outputFile = import_fs2.default.createWriteStream((0, import_path2.join)(dir, outputFileName));
|
|
11639
|
+
const salt = import_crypto.default.randomBytes(SALT_LENGTH);
|
|
11640
|
+
const iv = import_crypto.default.randomBytes(IV_LENGTH);
|
|
11641
|
+
const stretched = stretchString(secret, salt);
|
|
11642
|
+
const cipher = import_crypto.default.createCipheriv(ALGO, stretched, iv);
|
|
11643
|
+
outputFile.write(salt);
|
|
11644
|
+
outputFile.write(iv);
|
|
11645
|
+
inputFile.pipe(import_zlib.default.createGzip()).pipe(cipher).pipe(outputFile);
|
|
11646
|
+
return new Promise((r) => {
|
|
11647
|
+
outputFile.on("finish", () => {
|
|
11648
|
+
r({
|
|
11649
|
+
filename: outputFileName,
|
|
11650
|
+
dir
|
|
11651
|
+
});
|
|
11652
|
+
});
|
|
11653
|
+
});
|
|
11654
|
+
}
|
|
11655
|
+
async function getSaltAndIV(path2) {
|
|
11656
|
+
const fileStream = import_fs2.default.createReadStream(path2);
|
|
11657
|
+
const salt = await readBytes(fileStream, SALT_LENGTH);
|
|
11658
|
+
const iv = await readBytes(fileStream, IV_LENGTH);
|
|
11659
|
+
fileStream.close();
|
|
11660
|
+
return { salt, iv };
|
|
11661
|
+
}
|
|
11662
|
+
async function decryptFile(inputPath, outputPath, secret) {
|
|
11663
|
+
const { salt, iv } = await getSaltAndIV(inputPath);
|
|
11664
|
+
const inputFile = import_fs2.default.createReadStream(inputPath, {
|
|
11665
|
+
start: SALT_LENGTH + IV_LENGTH
|
|
11666
|
+
});
|
|
11667
|
+
const outputFile = import_fs2.default.createWriteStream(outputPath);
|
|
11668
|
+
const stretched = stretchString(secret, salt);
|
|
11669
|
+
const decipher = import_crypto.default.createDecipheriv(ALGO, stretched, iv);
|
|
11670
|
+
const unzip = import_zlib.default.createGunzip();
|
|
11671
|
+
inputFile.pipe(decipher).pipe(unzip).pipe(outputFile);
|
|
11672
|
+
return new Promise((res, rej) => {
|
|
11673
|
+
outputFile.on("finish", () => {
|
|
11674
|
+
outputFile.close();
|
|
11675
|
+
res();
|
|
11676
|
+
});
|
|
11677
|
+
inputFile.on("error", (e) => {
|
|
11678
|
+
outputFile.close();
|
|
11679
|
+
rej(e);
|
|
11680
|
+
});
|
|
11681
|
+
decipher.on("error", (e) => {
|
|
11682
|
+
outputFile.close();
|
|
11683
|
+
rej(e);
|
|
11684
|
+
});
|
|
11685
|
+
unzip.on("error", (e) => {
|
|
11686
|
+
outputFile.close();
|
|
11687
|
+
rej(e);
|
|
11688
|
+
});
|
|
11689
|
+
outputFile.on("error", (e) => {
|
|
11690
|
+
outputFile.close();
|
|
11691
|
+
rej(e);
|
|
11692
|
+
});
|
|
11693
|
+
});
|
|
11694
|
+
}
|
|
11695
|
+
function readBytes(stream3, length) {
|
|
11696
|
+
return new Promise((resolve3, reject) => {
|
|
11697
|
+
let bytesRead = 0;
|
|
11698
|
+
const data = [];
|
|
11699
|
+
stream3.on("readable", () => {
|
|
11700
|
+
let chunk;
|
|
11701
|
+
while ((chunk = stream3.read(length - bytesRead)) !== null) {
|
|
11702
|
+
data.push(chunk);
|
|
11703
|
+
bytesRead += chunk.length;
|
|
11704
|
+
}
|
|
11705
|
+
resolve3(Buffer.concat(data));
|
|
11706
|
+
});
|
|
11707
|
+
stream3.on("end", () => {
|
|
11708
|
+
reject(new Error("Insufficient data in the stream."));
|
|
11709
|
+
});
|
|
11710
|
+
stream3.on("error", (error) => {
|
|
11711
|
+
reject(error);
|
|
11712
|
+
});
|
|
11713
|
+
});
|
|
11714
|
+
}
|
|
11632
11715
|
|
|
11633
11716
|
// ../backend-core/src/middleware/authenticated.ts
|
|
11634
11717
|
init_identity();
|
|
@@ -11720,13 +11803,13 @@ async function checkApiKey(apiKey, populateUser) {
|
|
|
11720
11803
|
return doInTenant(tenantId, async () => {
|
|
11721
11804
|
let userId;
|
|
11722
11805
|
try {
|
|
11723
|
-
const
|
|
11806
|
+
const db2 = getGlobalDB();
|
|
11724
11807
|
userId = await queryGlobalView(
|
|
11725
11808
|
"by_api_key" /* BY_API_KEY */,
|
|
11726
11809
|
{
|
|
11727
11810
|
key: apiKey
|
|
11728
11811
|
},
|
|
11729
|
-
|
|
11812
|
+
db2
|
|
11730
11813
|
);
|
|
11731
11814
|
} catch (err) {
|
|
11732
11815
|
userId = void 0;
|
|
@@ -11747,7 +11830,7 @@ function authenticated_default(noAuthPatterns = [], opts = {
|
|
|
11747
11830
|
const noAuthOptions = noAuthPatterns ? buildMatcherRegex(noAuthPatterns) : [];
|
|
11748
11831
|
return async (ctx, next) => {
|
|
11749
11832
|
let publicEndpoint = false;
|
|
11750
|
-
const
|
|
11833
|
+
const version2 = ctx.request.headers["x-budibase-api-version" /* API_VER */];
|
|
11751
11834
|
const found = matches(ctx, noAuthOptions);
|
|
11752
11835
|
if (found) {
|
|
11753
11836
|
publicEndpoint = true;
|
|
@@ -11810,7 +11893,7 @@ function authenticated_default(noAuthPatterns = [], opts = {
|
|
|
11810
11893
|
if (!authenticated) {
|
|
11811
11894
|
authenticated = false;
|
|
11812
11895
|
}
|
|
11813
|
-
finalise(ctx, { authenticated, user, internal, version, publicEndpoint });
|
|
11896
|
+
finalise(ctx, { authenticated, user, internal, version: version2, publicEndpoint });
|
|
11814
11897
|
if (user && user.email) {
|
|
11815
11898
|
return doInUserContext(user, ctx, next);
|
|
11816
11899
|
} else {
|
|
@@ -11825,7 +11908,7 @@ function authenticated_default(noAuthPatterns = [], opts = {
|
|
|
11825
11908
|
ctx.throw(403, err.message);
|
|
11826
11909
|
}
|
|
11827
11910
|
if (opts && opts.publicAllowed || publicEndpoint) {
|
|
11828
|
-
finalise(ctx, { authenticated: false, version, publicEndpoint });
|
|
11911
|
+
finalise(ctx, { authenticated: false, version: version2, publicEndpoint });
|
|
11829
11912
|
return next();
|
|
11830
11913
|
} else {
|
|
11831
11914
|
ctx.throw(err.status || 403, err);
|
|
@@ -12182,8 +12265,8 @@ async function updateUserOAuth(userId, oAuthConfig) {
|
|
|
12182
12265
|
refreshToken: oAuthConfig.refreshToken
|
|
12183
12266
|
};
|
|
12184
12267
|
try {
|
|
12185
|
-
const
|
|
12186
|
-
const dbUser = await
|
|
12268
|
+
const db2 = getGlobalDB();
|
|
12269
|
+
const dbUser = await db2.get(userId);
|
|
12187
12270
|
if (typeof details.refreshToken !== "string") {
|
|
12188
12271
|
delete details.refreshToken;
|
|
12189
12272
|
}
|
|
@@ -12191,7 +12274,7 @@ async function updateUserOAuth(userId, oAuthConfig) {
|
|
|
12191
12274
|
...dbUser.oauth2,
|
|
12192
12275
|
...details
|
|
12193
12276
|
};
|
|
12194
|
-
await
|
|
12277
|
+
await db2.put(dbUser);
|
|
12195
12278
|
await invalidateUser(userId);
|
|
12196
12279
|
} catch (e) {
|
|
12197
12280
|
console.error("Could not update OAuth details for current user", e);
|
|
@@ -12386,16 +12469,16 @@ var import_aws_sdk = __toESM(require("aws-sdk"));
|
|
|
12386
12469
|
var import_stream = __toESM(require("stream"));
|
|
12387
12470
|
var import_node_fetch6 = __toESM(require("node-fetch"));
|
|
12388
12471
|
var import_tar_fs = __toESM(require("tar-fs"));
|
|
12389
|
-
var
|
|
12472
|
+
var import_zlib2 = __toESM(require("zlib"));
|
|
12390
12473
|
var import_util = require("util");
|
|
12391
|
-
var
|
|
12392
|
-
var
|
|
12474
|
+
var import_path4 = require("path");
|
|
12475
|
+
var import_fs4 = __toESM(require("fs"));
|
|
12393
12476
|
init_environment2();
|
|
12394
12477
|
|
|
12395
12478
|
// ../backend-core/src/objectStore/utils.ts
|
|
12396
|
-
var
|
|
12479
|
+
var import_path3 = require("path");
|
|
12397
12480
|
var import_os = require("os");
|
|
12398
|
-
var
|
|
12481
|
+
var import_fs3 = __toESM(require("fs"));
|
|
12399
12482
|
init_environment2();
|
|
12400
12483
|
var ObjectStoreBuckets = {
|
|
12401
12484
|
BACKUPS: environment_default2.BACKUPS_BUCKET_NAME,
|
|
@@ -12404,9 +12487,9 @@ var ObjectStoreBuckets = {
|
|
|
12404
12487
|
GLOBAL: environment_default2.GLOBAL_BUCKET_NAME,
|
|
12405
12488
|
PLUGINS: environment_default2.PLUGIN_BUCKET_NAME
|
|
12406
12489
|
};
|
|
12407
|
-
var bbTmp = (0,
|
|
12408
|
-
if (!
|
|
12409
|
-
|
|
12490
|
+
var bbTmp = (0, import_path3.join)((0, import_os.tmpdir)(), ".budibase");
|
|
12491
|
+
if (!import_fs3.default.existsSync(bbTmp)) {
|
|
12492
|
+
import_fs3.default.mkdirSync(bbTmp);
|
|
12410
12493
|
}
|
|
12411
12494
|
function budibaseTempDir() {
|
|
12412
12495
|
return bbTmp;
|
|
@@ -12491,10 +12574,10 @@ var upload = async ({
|
|
|
12491
12574
|
filename,
|
|
12492
12575
|
path: path2,
|
|
12493
12576
|
type,
|
|
12494
|
-
metadata
|
|
12577
|
+
metadata: metadata2
|
|
12495
12578
|
}) => {
|
|
12496
12579
|
const extension = filename.split(".").pop();
|
|
12497
|
-
const fileBytes =
|
|
12580
|
+
const fileBytes = import_fs4.default.readFileSync(path2);
|
|
12498
12581
|
const objectStore = ObjectStore(bucketName);
|
|
12499
12582
|
await makeSureBucketExists(objectStore, bucketName);
|
|
12500
12583
|
let contentType = type;
|
|
@@ -12507,13 +12590,13 @@ var upload = async ({
|
|
|
12507
12590
|
Body: fileBytes,
|
|
12508
12591
|
ContentType: contentType
|
|
12509
12592
|
};
|
|
12510
|
-
if (
|
|
12511
|
-
for (let key of Object.keys(
|
|
12512
|
-
if (!
|
|
12513
|
-
delete
|
|
12593
|
+
if (metadata2 && typeof metadata2 === "object") {
|
|
12594
|
+
for (let key of Object.keys(metadata2)) {
|
|
12595
|
+
if (!metadata2[key] || typeof metadata2[key] !== "string") {
|
|
12596
|
+
delete metadata2[key];
|
|
12514
12597
|
}
|
|
12515
12598
|
}
|
|
12516
|
-
config.Metadata =
|
|
12599
|
+
config.Metadata = metadata2;
|
|
12517
12600
|
}
|
|
12518
12601
|
return objectStore.upload(config).promise();
|
|
12519
12602
|
};
|
|
@@ -12596,13 +12679,13 @@ var retrieveToTmp = async (bucketName, filepath) => {
|
|
|
12596
12679
|
bucketName = sanitizeBucket(bucketName);
|
|
12597
12680
|
filepath = sanitizeKey(filepath);
|
|
12598
12681
|
const data = await retrieve(bucketName, filepath);
|
|
12599
|
-
const outputPath = (0,
|
|
12600
|
-
|
|
12682
|
+
const outputPath = (0, import_path4.join)(budibaseTempDir(), (0, import_uuid3.v4)());
|
|
12683
|
+
import_fs4.default.writeFileSync(outputPath, data);
|
|
12601
12684
|
return outputPath;
|
|
12602
12685
|
};
|
|
12603
12686
|
var retrieveDirectory = async (bucketName, path2) => {
|
|
12604
|
-
let writePath = (0,
|
|
12605
|
-
|
|
12687
|
+
let writePath = (0, import_path4.join)(budibaseTempDir(), (0, import_uuid3.v4)());
|
|
12688
|
+
import_fs4.default.mkdirSync(writePath);
|
|
12606
12689
|
const objects = await listAllObjects(bucketName, path2);
|
|
12607
12690
|
let fullObjects = await Promise.all(
|
|
12608
12691
|
objects.map((obj) => retrieve(bucketName, obj.Key))
|
|
@@ -12614,9 +12697,9 @@ var retrieveDirectory = async (bucketName, path2) => {
|
|
|
12614
12697
|
const possiblePath = filename.split("/");
|
|
12615
12698
|
if (possiblePath.length > 1) {
|
|
12616
12699
|
const dirs = possiblePath.slice(0, possiblePath.length - 1);
|
|
12617
|
-
|
|
12700
|
+
import_fs4.default.mkdirSync((0, import_path4.join)(writePath, ...dirs), { recursive: true });
|
|
12618
12701
|
}
|
|
12619
|
-
|
|
12702
|
+
import_fs4.default.writeFileSync((0, import_path4.join)(writePath, ...possiblePath), data);
|
|
12620
12703
|
}
|
|
12621
12704
|
return writePath;
|
|
12622
12705
|
};
|
|
@@ -12667,21 +12750,21 @@ var deleteFolder = async (bucketName, folder) => {
|
|
|
12667
12750
|
return deleteFolder(bucketName, folder);
|
|
12668
12751
|
}
|
|
12669
12752
|
};
|
|
12670
|
-
var uploadDirectory = async (bucketName, localPath,
|
|
12753
|
+
var uploadDirectory = async (bucketName, localPath, bucketPath2) => {
|
|
12671
12754
|
bucketName = sanitizeBucket(bucketName);
|
|
12672
12755
|
let uploads = [];
|
|
12673
|
-
const
|
|
12674
|
-
for (let file of
|
|
12675
|
-
const path2 = sanitizeKey((0,
|
|
12676
|
-
const local = (0,
|
|
12756
|
+
const files2 = import_fs4.default.readdirSync(localPath, { withFileTypes: true });
|
|
12757
|
+
for (let file of files2) {
|
|
12758
|
+
const path2 = sanitizeKey((0, import_path4.join)(bucketPath2, file.name));
|
|
12759
|
+
const local = (0, import_path4.join)(localPath, file.name);
|
|
12677
12760
|
if (file.isDirectory()) {
|
|
12678
12761
|
uploads.push(uploadDirectory(bucketName, local, path2));
|
|
12679
12762
|
} else {
|
|
12680
|
-
uploads.push(streamUpload(bucketName, path2,
|
|
12763
|
+
uploads.push(streamUpload(bucketName, path2, import_fs4.default.createReadStream(local)));
|
|
12681
12764
|
}
|
|
12682
12765
|
}
|
|
12683
12766
|
await Promise.all(uploads);
|
|
12684
|
-
return
|
|
12767
|
+
return files2;
|
|
12685
12768
|
};
|
|
12686
12769
|
var downloadTarballDirect = async (url, path2, headers = {}) => {
|
|
12687
12770
|
path2 = sanitizeKey(path2);
|
|
@@ -12689,7 +12772,7 @@ var downloadTarballDirect = async (url, path2, headers = {}) => {
|
|
|
12689
12772
|
if (!response.ok) {
|
|
12690
12773
|
throw new Error(`unexpected response ${response.statusText}`);
|
|
12691
12774
|
}
|
|
12692
|
-
await streamPipeline(response.body,
|
|
12775
|
+
await streamPipeline(response.body, import_zlib2.default.createUnzip(), import_tar_fs.default.extract(path2));
|
|
12693
12776
|
};
|
|
12694
12777
|
var downloadTarball = async (url, bucketName, path2) => {
|
|
12695
12778
|
bucketName = sanitizeBucket(bucketName);
|
|
@@ -12698,8 +12781,8 @@ var downloadTarball = async (url, bucketName, path2) => {
|
|
|
12698
12781
|
if (!response.ok) {
|
|
12699
12782
|
throw new Error(`unexpected response ${response.statusText}`);
|
|
12700
12783
|
}
|
|
12701
|
-
const tmpPath = (0,
|
|
12702
|
-
await streamPipeline(response.body,
|
|
12784
|
+
const tmpPath = (0, import_path4.join)(budibaseTempDir(), path2);
|
|
12785
|
+
await streamPipeline(response.body, import_zlib2.default.createUnzip(), import_tar_fs.default.extract(tmpPath));
|
|
12703
12786
|
if (!environment_default2.isTest() && environment_default2.SELF_HOSTED) {
|
|
12704
12787
|
await uploadDirectory(bucketName, tmpPath, path2);
|
|
12705
12788
|
}
|
|
@@ -12746,12 +12829,12 @@ var getUrl = (s3Key) => {
|
|
|
12746
12829
|
};
|
|
12747
12830
|
|
|
12748
12831
|
// ../backend-core/src/objectStore/buckets/app.ts
|
|
12749
|
-
var clientLibraryUrl = (appId,
|
|
12832
|
+
var clientLibraryUrl = (appId, version2) => {
|
|
12750
12833
|
if (environment_default2.isProd()) {
|
|
12751
12834
|
let file = `${sanitizeKey(appId)}/budibase-client.js`;
|
|
12752
12835
|
if (environment_default2.CLOUDFRONT_CDN) {
|
|
12753
|
-
if (
|
|
12754
|
-
file += `?v=${
|
|
12836
|
+
if (version2) {
|
|
12837
|
+
file += `?v=${version2}`;
|
|
12755
12838
|
}
|
|
12756
12839
|
return getUrl(file);
|
|
12757
12840
|
} else {
|
|
@@ -12772,8 +12855,8 @@ var getAppFileUrl = (s3Key) => {
|
|
|
12772
12855
|
// ../backend-core/src/objectStore/buckets/global.ts
|
|
12773
12856
|
init_environment2();
|
|
12774
12857
|
init_context2();
|
|
12775
|
-
var getGlobalFileUrl = (type,
|
|
12776
|
-
let file = getGlobalFileS3Key(type,
|
|
12858
|
+
var getGlobalFileUrl = (type, name2, etag) => {
|
|
12859
|
+
let file = getGlobalFileS3Key(type, name2);
|
|
12777
12860
|
if (environment_default2.CLOUDFRONT_CDN) {
|
|
12778
12861
|
if (etag) {
|
|
12779
12862
|
file = `${file}?etag=${etag}`;
|
|
@@ -12783,8 +12866,8 @@ var getGlobalFileUrl = (type, name, etag) => {
|
|
|
12783
12866
|
return getPresignedUrl(environment_default2.GLOBAL_BUCKET_NAME, file);
|
|
12784
12867
|
}
|
|
12785
12868
|
};
|
|
12786
|
-
var getGlobalFileS3Key = (type,
|
|
12787
|
-
let file = `${type}/${
|
|
12869
|
+
var getGlobalFileS3Key = (type, name2) => {
|
|
12870
|
+
let file = `${type}/${name2}`;
|
|
12788
12871
|
if (environment_default2.MULTI_TENANCY) {
|
|
12789
12872
|
const tenantId = getTenantId();
|
|
12790
12873
|
file = `${tenantId}/${file}`;
|
|
@@ -12827,11 +12910,11 @@ var getPluginJSKey = (plugin) => {
|
|
|
12827
12910
|
return getPluginS3Key(plugin, "plugin.min.js");
|
|
12828
12911
|
};
|
|
12829
12912
|
var getPluginIconKey = (plugin) => {
|
|
12830
|
-
const
|
|
12831
|
-
if (!
|
|
12913
|
+
const iconFileName2 = plugin.iconUrl ? "icon.svg" : plugin.iconFileName;
|
|
12914
|
+
if (!iconFileName2) {
|
|
12832
12915
|
return;
|
|
12833
12916
|
}
|
|
12834
|
-
return getPluginS3Key(plugin,
|
|
12917
|
+
return getPluginS3Key(plugin, iconFileName2);
|
|
12835
12918
|
};
|
|
12836
12919
|
var getPluginS3Key = (plugin, fileName) => {
|
|
12837
12920
|
const s3Key = getPluginS3Dir(plugin.name);
|
|
@@ -13384,18 +13467,18 @@ function finaliseExternalTables(tables, entities) {
|
|
|
13384
13467
|
let finalTables = {};
|
|
13385
13468
|
const errors = {};
|
|
13386
13469
|
const tableIds = Object.values(tables).map((table) => table._id);
|
|
13387
|
-
for (let [
|
|
13470
|
+
for (let [name2, table] of Object.entries(tables)) {
|
|
13388
13471
|
const schemaFields = Object.keys(table.schema);
|
|
13389
13472
|
if (table.primary == null || table.primary.length === 0) {
|
|
13390
|
-
errors[
|
|
13473
|
+
errors[name2] = "no_key" /* NO_KEY */;
|
|
13391
13474
|
continue;
|
|
13392
13475
|
} else if (schemaFields.find(
|
|
13393
13476
|
(field) => invalidColumns.includes(field)
|
|
13394
13477
|
)) {
|
|
13395
|
-
errors[
|
|
13478
|
+
errors[name2] = "invalid_column" /* INVALID_COLUMN */;
|
|
13396
13479
|
continue;
|
|
13397
13480
|
}
|
|
13398
|
-
finalTables[
|
|
13481
|
+
finalTables[name2] = copyExistingPropsOver(name2, table, entities, tableIds);
|
|
13399
13482
|
}
|
|
13400
13483
|
finalTables = Object.entries(finalTables).sort(([a], [b]) => a.localeCompare(b)).reduce((r, [k, v]) => ({ ...r, [k]: v }), {});
|
|
13401
13484
|
return { tables: finalTables, errors };
|
|
@@ -14355,7 +14438,8 @@ var PostgresIntegration = class extends sql_default {
|
|
|
14355
14438
|
try {
|
|
14356
14439
|
await this.openConnection();
|
|
14357
14440
|
const columnsResponse = await this.client.query(this.COLUMNS_SQL);
|
|
14358
|
-
|
|
14441
|
+
const names = columnsResponse.rows.map((row) => row.table_name);
|
|
14442
|
+
return [...new Set(names)];
|
|
14359
14443
|
} finally {
|
|
14360
14444
|
await this.closeConnection();
|
|
14361
14445
|
}
|
|
@@ -14968,6 +15052,8 @@ var MongoIntegration = class {
|
|
|
14968
15052
|
response.connected = true;
|
|
14969
15053
|
} catch (e) {
|
|
14970
15054
|
response.error = e.message;
|
|
15055
|
+
} finally {
|
|
15056
|
+
await this.client.close();
|
|
14971
15057
|
}
|
|
14972
15058
|
return response;
|
|
14973
15059
|
}
|
|
@@ -15040,8 +15126,8 @@ var MongoIntegration = class {
|
|
|
15040
15126
|
async create(query) {
|
|
15041
15127
|
try {
|
|
15042
15128
|
await this.connect();
|
|
15043
|
-
const
|
|
15044
|
-
const collection =
|
|
15129
|
+
const db2 = this.client.db(this.config.db);
|
|
15130
|
+
const collection = db2.collection(query.extra.collection);
|
|
15045
15131
|
let json = this.createObjectIds(query.json);
|
|
15046
15132
|
switch (query.extra.actionType) {
|
|
15047
15133
|
case "insertOne": {
|
|
@@ -15066,8 +15152,8 @@ var MongoIntegration = class {
|
|
|
15066
15152
|
async read(query) {
|
|
15067
15153
|
try {
|
|
15068
15154
|
await this.connect();
|
|
15069
|
-
const
|
|
15070
|
-
const collection =
|
|
15155
|
+
const db2 = this.client.db(this.config.db);
|
|
15156
|
+
const collection = db2.collection(query.extra.collection);
|
|
15071
15157
|
let json = this.createObjectIds(query.json);
|
|
15072
15158
|
switch (query.extra.actionType) {
|
|
15073
15159
|
case "find": {
|
|
@@ -15109,8 +15195,8 @@ var MongoIntegration = class {
|
|
|
15109
15195
|
async update(query) {
|
|
15110
15196
|
try {
|
|
15111
15197
|
await this.connect();
|
|
15112
|
-
const
|
|
15113
|
-
const collection =
|
|
15198
|
+
const db2 = this.client.db(this.config.db);
|
|
15199
|
+
const collection = db2.collection(query.extra.collection);
|
|
15114
15200
|
let queryJson = query.json;
|
|
15115
15201
|
if (typeof queryJson === "string") {
|
|
15116
15202
|
queryJson = this.parseQueryParams(queryJson, "update");
|
|
@@ -15147,8 +15233,8 @@ var MongoIntegration = class {
|
|
|
15147
15233
|
async delete(query) {
|
|
15148
15234
|
try {
|
|
15149
15235
|
await this.connect();
|
|
15150
|
-
const
|
|
15151
|
-
const collection =
|
|
15236
|
+
const db2 = this.client.db(this.config.db);
|
|
15237
|
+
const collection = db2.collection(query.extra.collection);
|
|
15152
15238
|
let queryJson = query.json;
|
|
15153
15239
|
if (typeof queryJson === "string") {
|
|
15154
15240
|
queryJson = this.parseQueryParams(queryJson, "delete");
|
|
@@ -15184,25 +15270,25 @@ var MongoIntegration = class {
|
|
|
15184
15270
|
var _a;
|
|
15185
15271
|
try {
|
|
15186
15272
|
await this.connect();
|
|
15187
|
-
const
|
|
15188
|
-
const collection =
|
|
15273
|
+
const db2 = this.client.db(this.config.db);
|
|
15274
|
+
const collection = db2.collection(query.extra.collection);
|
|
15189
15275
|
let response = [];
|
|
15190
15276
|
if (((_a = query.extra) == null ? void 0 : _a.actionType) === "pipeline") {
|
|
15191
|
-
for await (const
|
|
15277
|
+
for await (const doc2 of collection.aggregate(
|
|
15192
15278
|
query.steps.map(({ key, value }) => {
|
|
15193
15279
|
let temp = {};
|
|
15194
15280
|
temp[key] = JSON.parse(value.value);
|
|
15195
15281
|
return this.createObjectIds(temp);
|
|
15196
15282
|
})
|
|
15197
15283
|
)) {
|
|
15198
|
-
response.push(
|
|
15284
|
+
response.push(doc2);
|
|
15199
15285
|
}
|
|
15200
15286
|
} else {
|
|
15201
15287
|
const stages = query.json;
|
|
15202
|
-
for await (const
|
|
15288
|
+
for await (const doc2 of collection.aggregate(
|
|
15203
15289
|
stages ? this.createObjectIds(stages) : []
|
|
15204
15290
|
)) {
|
|
15205
|
-
response.push(
|
|
15291
|
+
response.push(doc2);
|
|
15206
15292
|
}
|
|
15207
15293
|
}
|
|
15208
15294
|
return response;
|
|
@@ -15502,9 +15588,9 @@ var CouchDBIntegration = class {
|
|
|
15502
15588
|
});
|
|
15503
15589
|
}
|
|
15504
15590
|
async delete(query) {
|
|
15505
|
-
const
|
|
15591
|
+
const doc2 = await this.query("get", "Cannot find doc to be deleted", query);
|
|
15506
15592
|
return this.query("remove", "Error deleting couchDB document", {
|
|
15507
|
-
json:
|
|
15593
|
+
json: doc2
|
|
15508
15594
|
});
|
|
15509
15595
|
}
|
|
15510
15596
|
};
|
|
@@ -15683,7 +15769,7 @@ var SqlServerIntegration = class extends sql_default {
|
|
|
15683
15769
|
throw "Unable to get list of tables in database";
|
|
15684
15770
|
}
|
|
15685
15771
|
const schema = this.config.schema || DEFAULT_SCHEMA;
|
|
15686
|
-
const tableNames = tableInfo.filter((record) => record.TABLE_SCHEMA === schema).map((record) => record.TABLE_NAME).filter((
|
|
15772
|
+
const tableNames = tableInfo.filter((record) => record.TABLE_SCHEMA === schema).map((record) => record.TABLE_NAME).filter((name2) => this.MASTER_TABLES.indexOf(name2) === -1);
|
|
15687
15773
|
const tables = {};
|
|
15688
15774
|
for (let tableName of tableNames) {
|
|
15689
15775
|
const definition = await this.runSQL(this.getDefinitionSQL(tableName));
|
|
@@ -15698,16 +15784,16 @@ var SqlServerIntegration = class extends sql_default {
|
|
|
15698
15784
|
const requiredColumns = columns.filter((col) => col.IS_NULLABLE === "NO").map((col) => col.COLUMN_NAME);
|
|
15699
15785
|
let schema2 = {};
|
|
15700
15786
|
for (let def of definition) {
|
|
15701
|
-
const
|
|
15702
|
-
if (typeof
|
|
15787
|
+
const name2 = def.COLUMN_NAME;
|
|
15788
|
+
if (typeof name2 !== "string") {
|
|
15703
15789
|
continue;
|
|
15704
15790
|
}
|
|
15705
15791
|
const hasDefault = def.COLUMN_DEFAULT;
|
|
15706
|
-
const isAuto = !!autoColumns.find((col) => col ===
|
|
15707
|
-
const required = !!requiredColumns.find((col) => col ===
|
|
15708
|
-
schema2[
|
|
15792
|
+
const isAuto = !!autoColumns.find((col) => col === name2);
|
|
15793
|
+
const required = !!requiredColumns.find((col) => col === name2);
|
|
15794
|
+
schema2[name2] = {
|
|
15709
15795
|
autocolumn: isAuto,
|
|
15710
|
-
name,
|
|
15796
|
+
name: name2,
|
|
15711
15797
|
constraints: {
|
|
15712
15798
|
presence: required && !isAuto && !hasDefault
|
|
15713
15799
|
},
|
|
@@ -15729,7 +15815,7 @@ var SqlServerIntegration = class extends sql_default {
|
|
|
15729
15815
|
async queryTableNames() {
|
|
15730
15816
|
let tableInfo = await this.runSQL(this.TABLES_SQL);
|
|
15731
15817
|
const schema = this.config.schema || DEFAULT_SCHEMA;
|
|
15732
|
-
return tableInfo.filter((record) => record.TABLE_SCHEMA === schema).map((record) => record.TABLE_NAME).filter((
|
|
15818
|
+
return tableInfo.filter((record) => record.TABLE_SCHEMA === schema).map((record) => record.TABLE_NAME).filter((name2) => this.MASTER_TABLES.indexOf(name2) === -1);
|
|
15733
15819
|
}
|
|
15734
15820
|
async getTableNames() {
|
|
15735
15821
|
await this.connect();
|
|
@@ -17119,11 +17205,11 @@ var runLuceneQuery = (docs, query) => {
|
|
|
17119
17205
|
return docs;
|
|
17120
17206
|
}
|
|
17121
17207
|
query = cleanupQuery(query);
|
|
17122
|
-
const match = (type, failFn) => (
|
|
17208
|
+
const match = (type, failFn) => (doc2) => {
|
|
17123
17209
|
const filters = Object.entries(query[type] || {});
|
|
17124
17210
|
for (let i = 0; i < filters.length; i++) {
|
|
17125
17211
|
const [key, testValue] = filters[i];
|
|
17126
|
-
const docValue = deepGet(
|
|
17212
|
+
const docValue = deepGet(doc2, removeKeyNumbering2(key));
|
|
17127
17213
|
if (failFn(docValue, testValue)) {
|
|
17128
17214
|
return false;
|
|
17129
17215
|
}
|
|
@@ -17184,8 +17270,8 @@ var runLuceneQuery = (docs, query) => {
|
|
|
17184
17270
|
return testValue == null ? void 0 : testValue.every((item) => docValue == null ? void 0 : docValue.includes(item));
|
|
17185
17271
|
}
|
|
17186
17272
|
);
|
|
17187
|
-
const docMatch = (
|
|
17188
|
-
return stringMatch(
|
|
17273
|
+
const docMatch = (doc2) => {
|
|
17274
|
+
return stringMatch(doc2) && fuzzyMatch(doc2) && rangeMatch(doc2) && equalMatch(doc2) && notEqualMatch(doc2) && emptyMatch(doc2) && notEmptyMatch(doc2) && oneOf(doc2) && contains(doc2) && containsAny(doc2) && notContains(doc2);
|
|
17189
17275
|
};
|
|
17190
17276
|
return docs.filter(docMatch);
|
|
17191
17277
|
};
|
|
@@ -17230,11 +17316,39 @@ var hasFilters = (query) => {
|
|
|
17230
17316
|
// ../shared-core/src/utils.ts
|
|
17231
17317
|
var utils_exports3 = {};
|
|
17232
17318
|
__export(utils_exports3, {
|
|
17319
|
+
parallelForeach: () => parallelForeach,
|
|
17233
17320
|
unreachable: () => unreachable
|
|
17234
17321
|
});
|
|
17235
17322
|
function unreachable(value, message = `No such case in exhaustive switch: ${value}`) {
|
|
17236
17323
|
throw new Error(message);
|
|
17237
17324
|
}
|
|
17325
|
+
async function parallelForeach(items, task, maxConcurrency) {
|
|
17326
|
+
const promises = [];
|
|
17327
|
+
let index2 = 0;
|
|
17328
|
+
const processItem = async (item) => {
|
|
17329
|
+
try {
|
|
17330
|
+
await task(item);
|
|
17331
|
+
} finally {
|
|
17332
|
+
processNext();
|
|
17333
|
+
}
|
|
17334
|
+
};
|
|
17335
|
+
const processNext = () => {
|
|
17336
|
+
if (index2 >= items.length) {
|
|
17337
|
+
return;
|
|
17338
|
+
}
|
|
17339
|
+
const item = items[index2];
|
|
17340
|
+
index2++;
|
|
17341
|
+
const promise = processItem(item);
|
|
17342
|
+
promises.push(promise);
|
|
17343
|
+
if (promises.length >= maxConcurrency) {
|
|
17344
|
+
Promise.race(promises).then(processNext);
|
|
17345
|
+
} else {
|
|
17346
|
+
processNext();
|
|
17347
|
+
}
|
|
17348
|
+
};
|
|
17349
|
+
processNext();
|
|
17350
|
+
await Promise.all(promises);
|
|
17351
|
+
}
|
|
17238
17352
|
|
|
17239
17353
|
// src/integrations/googlesheets.ts
|
|
17240
17354
|
var ALLOWED_TYPES = [
|
|
@@ -17263,7 +17377,7 @@ var SCHEMA12 = {
|
|
|
17263
17377
|
},
|
|
17264
17378
|
datasource: {
|
|
17265
17379
|
spreadsheetId: {
|
|
17266
|
-
display: "
|
|
17380
|
+
display: "Spreadsheet URL",
|
|
17267
17381
|
type: "string" /* STRING */,
|
|
17268
17382
|
required: true
|
|
17269
17383
|
}
|
|
@@ -17384,6 +17498,7 @@ var GoogleSheetsIntegration = class {
|
|
|
17384
17498
|
async connect() {
|
|
17385
17499
|
var _a;
|
|
17386
17500
|
try {
|
|
17501
|
+
await setupCreationAuth(this.config);
|
|
17387
17502
|
let googleConfig = await configs_exports.getGoogleDatasourceConfig();
|
|
17388
17503
|
if (!googleConfig) {
|
|
17389
17504
|
throw new HTTPError("Google config not found", 400);
|
|
@@ -17434,21 +17549,22 @@ var GoogleSheetsIntegration = class {
|
|
|
17434
17549
|
return table;
|
|
17435
17550
|
}
|
|
17436
17551
|
async buildSchema(datasourceId, entities) {
|
|
17437
|
-
if (!this.config.auth) {
|
|
17438
|
-
return;
|
|
17439
|
-
}
|
|
17440
17552
|
await this.connect();
|
|
17441
17553
|
const sheets = this.client.sheetsByIndex;
|
|
17442
17554
|
const tables = {};
|
|
17443
|
-
|
|
17444
|
-
|
|
17445
|
-
|
|
17446
|
-
|
|
17447
|
-
sheet.title
|
|
17448
|
-
sheet.
|
|
17449
|
-
|
|
17450
|
-
|
|
17451
|
-
|
|
17555
|
+
await utils_exports3.parallelForeach(
|
|
17556
|
+
sheets,
|
|
17557
|
+
async (sheet) => {
|
|
17558
|
+
await sheet.getRows({ limit: 0, offset: 0 });
|
|
17559
|
+
const id = buildExternalTableId(datasourceId, sheet.title);
|
|
17560
|
+
tables[sheet.title] = this.getTableSchema(
|
|
17561
|
+
sheet.title,
|
|
17562
|
+
sheet.headerValues,
|
|
17563
|
+
id
|
|
17564
|
+
);
|
|
17565
|
+
},
|
|
17566
|
+
10
|
|
17567
|
+
);
|
|
17452
17568
|
const final = finaliseExternalTables(tables, entities);
|
|
17453
17569
|
this.tables = final.tables;
|
|
17454
17570
|
this.schemaErrors = final.errors;
|
|
@@ -17496,13 +17612,13 @@ var GoogleSheetsIntegration = class {
|
|
|
17496
17612
|
}
|
|
17497
17613
|
return rowObject;
|
|
17498
17614
|
}
|
|
17499
|
-
async createTable(
|
|
17500
|
-
if (!
|
|
17615
|
+
async createTable(name2) {
|
|
17616
|
+
if (!name2) {
|
|
17501
17617
|
throw new Error("Must provide name for new sheet.");
|
|
17502
17618
|
}
|
|
17503
17619
|
try {
|
|
17504
17620
|
await this.connect();
|
|
17505
|
-
return await this.client.addSheet({ title:
|
|
17621
|
+
return await this.client.addSheet({ title: name2, headerValues: [name2] });
|
|
17506
17622
|
} catch (err) {
|
|
17507
17623
|
console.error("Error creating new table in google sheets", err);
|
|
17508
17624
|
throw err;
|
|
@@ -17694,6 +17810,16 @@ var GoogleSheetsIntegration = class {
|
|
|
17694
17810
|
}
|
|
17695
17811
|
}
|
|
17696
17812
|
};
|
|
17813
|
+
async function setupCreationAuth(datasouce) {
|
|
17814
|
+
if (datasouce.continueSetupId) {
|
|
17815
|
+
const appId = context_exports.getAppId();
|
|
17816
|
+
const tokens = await cache_exports.get(
|
|
17817
|
+
`datasource:creation:${appId}:google:${datasouce.continueSetupId}`
|
|
17818
|
+
);
|
|
17819
|
+
datasouce.auth = tokens.tokens;
|
|
17820
|
+
delete datasouce.continueSetupId;
|
|
17821
|
+
}
|
|
17822
|
+
}
|
|
17697
17823
|
var googlesheets_default = {
|
|
17698
17824
|
schema: SCHEMA12,
|
|
17699
17825
|
integration: GoogleSheetsIntegration
|
|
@@ -17823,7 +17949,7 @@ var FirebaseIntegration = class {
|
|
|
17823
17949
|
snapshot = await collectionRef.get();
|
|
17824
17950
|
}
|
|
17825
17951
|
const result = [];
|
|
17826
|
-
snapshot.forEach((
|
|
17952
|
+
snapshot.forEach((doc2) => result.push(doc2.data()));
|
|
17827
17953
|
return result;
|
|
17828
17954
|
} catch (err) {
|
|
17829
17955
|
console.error("Error querying Firestore", err);
|
|
@@ -18472,24 +18598,24 @@ init_src();
|
|
|
18472
18598
|
var budibaseTempDir2 = objectStore_exports2.budibaseTempDir;
|
|
18473
18599
|
|
|
18474
18600
|
// src/utilities/fileSystem/app.ts
|
|
18475
|
-
var
|
|
18601
|
+
var import_path6 = require("path");
|
|
18476
18602
|
|
|
18477
18603
|
// src/utilities/fileSystem/filesystem.ts
|
|
18478
|
-
var
|
|
18479
|
-
var
|
|
18604
|
+
var import_fs5 = __toESM(require("fs"));
|
|
18605
|
+
var import_path5 = require("path");
|
|
18480
18606
|
var import_tar = __toESM(require("tar"));
|
|
18481
18607
|
var uuid2 = require("uuid/v4");
|
|
18482
|
-
var TOP_LEVEL_PATH = environment_default.TOP_LEVEL_PATH || (0,
|
|
18608
|
+
var TOP_LEVEL_PATH = environment_default.TOP_LEVEL_PATH || (0, import_path5.resolve)((0, import_path5.join)(__dirname, "..", "..", ".."));
|
|
18483
18609
|
var streamFile = (path2) => {
|
|
18484
|
-
return
|
|
18610
|
+
return import_fs5.default.createReadStream(path2);
|
|
18485
18611
|
};
|
|
18486
18612
|
var createTempFolder = (item) => {
|
|
18487
|
-
const path2 = (0,
|
|
18613
|
+
const path2 = (0, import_path5.join)(budibaseTempDir2(), item);
|
|
18488
18614
|
try {
|
|
18489
|
-
if (
|
|
18490
|
-
|
|
18615
|
+
if (import_fs5.default.existsSync(path2)) {
|
|
18616
|
+
import_fs5.default.rmSync(path2, { recursive: true, force: true });
|
|
18491
18617
|
}
|
|
18492
|
-
|
|
18618
|
+
import_fs5.default.mkdirSync(path2);
|
|
18493
18619
|
} catch (err) {
|
|
18494
18620
|
throw new Error(`Path cannot be created: ${err.message}`);
|
|
18495
18621
|
}
|
|
@@ -18503,21 +18629,21 @@ var extractTarball = async (fromFilePath, toPath) => {
|
|
|
18503
18629
|
};
|
|
18504
18630
|
|
|
18505
18631
|
// src/utilities/fileSystem/app.ts
|
|
18506
|
-
var NODE_MODULES_PATH = (0,
|
|
18632
|
+
var NODE_MODULES_PATH = (0, import_path6.join)(TOP_LEVEL_PATH, "node_modules");
|
|
18507
18633
|
|
|
18508
18634
|
// src/utilities/fileSystem/plugin.ts
|
|
18509
|
-
var
|
|
18510
|
-
var
|
|
18511
|
-
var DATASOURCE_PATH = (0,
|
|
18512
|
-
var AUTOMATION_PATH = (0,
|
|
18635
|
+
var import_fs6 = __toESM(require("fs"));
|
|
18636
|
+
var import_path7 = require("path");
|
|
18637
|
+
var DATASOURCE_PATH = (0, import_path7.join)(budibaseTempDir2(), "datasource");
|
|
18638
|
+
var AUTOMATION_PATH = (0, import_path7.join)(budibaseTempDir2(), "automation");
|
|
18513
18639
|
var getPluginMetadata = async (path2) => {
|
|
18514
|
-
let
|
|
18640
|
+
let metadata2 = {};
|
|
18515
18641
|
try {
|
|
18516
|
-
const pkg2 =
|
|
18517
|
-
const schema =
|
|
18518
|
-
|
|
18519
|
-
|
|
18520
|
-
if (!
|
|
18642
|
+
const pkg2 = import_fs6.default.readFileSync((0, import_path7.join)(path2, "package.json"), "utf8");
|
|
18643
|
+
const schema = import_fs6.default.readFileSync((0, import_path7.join)(path2, "schema.json"), "utf8");
|
|
18644
|
+
metadata2.schema = JSON.parse(schema);
|
|
18645
|
+
metadata2.package = JSON.parse(pkg2);
|
|
18646
|
+
if (!metadata2.package.name || !metadata2.package.version || !metadata2.package.description) {
|
|
18521
18647
|
throw new Error(
|
|
18522
18648
|
"package.json is missing one of 'name', 'version' or 'description'."
|
|
18523
18649
|
);
|
|
@@ -18527,24 +18653,24 @@ var getPluginMetadata = async (path2) => {
|
|
|
18527
18653
|
`Unable to process schema.json/package.json in plugin. ${err.message}`
|
|
18528
18654
|
);
|
|
18529
18655
|
}
|
|
18530
|
-
return { metadata, directory: path2 };
|
|
18656
|
+
return { metadata: metadata2, directory: path2 };
|
|
18531
18657
|
};
|
|
18532
18658
|
async function getPluginImpl(path2, plugin) {
|
|
18533
18659
|
var _a;
|
|
18534
|
-
const
|
|
18535
|
-
if (!
|
|
18536
|
-
|
|
18660
|
+
const hash3 = (_a = plugin.schema) == null ? void 0 : _a.hash;
|
|
18661
|
+
if (!import_fs6.default.existsSync(path2)) {
|
|
18662
|
+
import_fs6.default.mkdirSync(path2);
|
|
18537
18663
|
}
|
|
18538
|
-
const filename = (0,
|
|
18664
|
+
const filename = (0, import_path7.join)(path2, plugin.name);
|
|
18539
18665
|
const metadataName = `${filename}.bbmetadata`;
|
|
18540
|
-
if (
|
|
18541
|
-
const currentHash =
|
|
18542
|
-
if (currentHash ===
|
|
18666
|
+
if (import_fs6.default.existsSync(filename)) {
|
|
18667
|
+
const currentHash = import_fs6.default.readFileSync(metadataName, "utf8");
|
|
18668
|
+
if (currentHash === hash3) {
|
|
18543
18669
|
return require(filename);
|
|
18544
18670
|
} else {
|
|
18545
18671
|
console.log(`Updating plugin: ${plugin.name}`);
|
|
18546
18672
|
delete require.cache[require.resolve(filename)];
|
|
18547
|
-
|
|
18673
|
+
import_fs6.default.unlinkSync(filename);
|
|
18548
18674
|
}
|
|
18549
18675
|
}
|
|
18550
18676
|
const pluginKey = objectStore_exports2.getPluginJSKey(plugin);
|
|
@@ -18552,8 +18678,8 @@ async function getPluginImpl(path2, plugin) {
|
|
|
18552
18678
|
objectStore_exports2.ObjectStoreBuckets.PLUGINS,
|
|
18553
18679
|
pluginKey
|
|
18554
18680
|
);
|
|
18555
|
-
|
|
18556
|
-
|
|
18681
|
+
import_fs6.default.writeFileSync(filename, pluginJs);
|
|
18682
|
+
import_fs6.default.writeFileSync(metadataName, hash3);
|
|
18557
18683
|
return require(filename);
|
|
18558
18684
|
}
|
|
18559
18685
|
var getDatasourcePlugin = async (plugin) => {
|
|
@@ -18561,9 +18687,9 @@ var getDatasourcePlugin = async (plugin) => {
|
|
|
18561
18687
|
};
|
|
18562
18688
|
|
|
18563
18689
|
// src/utilities/fileSystem/template.ts
|
|
18564
|
-
var downloadTemplate = async (type,
|
|
18690
|
+
var downloadTemplate = async (type, name2) => {
|
|
18565
18691
|
const DEFAULT_TEMPLATES_BUCKET = "prod-budi-templates.s3-eu-west-1.amazonaws.com";
|
|
18566
|
-
const templateUrl = `https://${DEFAULT_TEMPLATES_BUCKET}/templates/${type}/${
|
|
18692
|
+
const templateUrl = `https://${DEFAULT_TEMPLATES_BUCKET}/templates/${type}/${name2}.tar.gz`;
|
|
18567
18693
|
return objectStore_exports2.downloadTarball(
|
|
18568
18694
|
templateUrl,
|
|
18569
18695
|
ObjectStoreBuckets2.TEMPLATES,
|
|
@@ -18588,22 +18714,23 @@ var GLOBAL_DB_EXPORT_FILE = "global.txt";
|
|
|
18588
18714
|
var STATIC_APP_FILES = ["manifest.json", "budibase-client.js"];
|
|
18589
18715
|
|
|
18590
18716
|
// src/sdk/app/backups/exports.ts
|
|
18591
|
-
var
|
|
18592
|
-
var
|
|
18717
|
+
var import_fs7 = __toESM(require("fs"));
|
|
18718
|
+
var import_path8 = require("path");
|
|
18719
|
+
var import_tar2 = __toESM(require("tar"));
|
|
18593
18720
|
var uuid3 = require("uuid/v4");
|
|
18594
|
-
var tar3 = require("tar");
|
|
18595
18721
|
var MemoryStream = require("memorystream");
|
|
18596
|
-
function tarFilesToTmp(tmpDir,
|
|
18597
|
-
const
|
|
18598
|
-
|
|
18722
|
+
function tarFilesToTmp(tmpDir, files2) {
|
|
18723
|
+
const fileName = `${uuid3()}.tar.gz`;
|
|
18724
|
+
const exportFile = (0, import_path8.join)(budibaseTempDir2(), fileName);
|
|
18725
|
+
import_tar2.default.create(
|
|
18599
18726
|
{
|
|
18600
18727
|
sync: true,
|
|
18601
18728
|
gzip: true,
|
|
18602
18729
|
file: exportFile,
|
|
18603
|
-
|
|
18730
|
+
noDirRecurse: false,
|
|
18604
18731
|
cwd: tmpDir
|
|
18605
18732
|
},
|
|
18606
|
-
|
|
18733
|
+
files2
|
|
18607
18734
|
);
|
|
18608
18735
|
return exportFile;
|
|
18609
18736
|
}
|
|
@@ -18614,11 +18741,11 @@ async function exportDB(dbName, opts = {}) {
|
|
|
18614
18741
|
batch_limit: 5,
|
|
18615
18742
|
style: "main_only"
|
|
18616
18743
|
};
|
|
18617
|
-
return db_exports.doWithDB(dbName, async (
|
|
18744
|
+
return db_exports.doWithDB(dbName, async (db2) => {
|
|
18618
18745
|
if (opts == null ? void 0 : opts.exportPath) {
|
|
18619
18746
|
const path2 = opts == null ? void 0 : opts.exportPath;
|
|
18620
|
-
const writeStream =
|
|
18621
|
-
await
|
|
18747
|
+
const writeStream = import_fs7.default.createWriteStream(path2);
|
|
18748
|
+
await db2.dump(writeStream, exportOpts);
|
|
18622
18749
|
return path2;
|
|
18623
18750
|
} else {
|
|
18624
18751
|
const memStream = new MemoryStream();
|
|
@@ -18626,7 +18753,7 @@ async function exportDB(dbName, opts = {}) {
|
|
|
18626
18753
|
memStream.on("data", (chunk) => {
|
|
18627
18754
|
appString += chunk.toString();
|
|
18628
18755
|
});
|
|
18629
|
-
await
|
|
18756
|
+
await db2.dump(memStream, exportOpts);
|
|
18630
18757
|
return appString;
|
|
18631
18758
|
}
|
|
18632
18759
|
});
|
|
@@ -18639,7 +18766,7 @@ function defineFilter(excludeRows, excludeLogs) {
|
|
|
18639
18766
|
if (excludeLogs) {
|
|
18640
18767
|
ids.push(AUTOMATION_LOG_PREFIX);
|
|
18641
18768
|
}
|
|
18642
|
-
return (
|
|
18769
|
+
return (doc2) => !ids.map((key) => doc2._id.includes(key)).reduce((prev, curr) => prev || curr);
|
|
18643
18770
|
}
|
|
18644
18771
|
async function exportApp(appId, config) {
|
|
18645
18772
|
const prodAppId = db_exports.getProdAppID(appId);
|
|
@@ -18650,9 +18777,9 @@ async function exportApp(appId, config) {
|
|
|
18650
18777
|
for (let path2 of STATIC_APP_FILES) {
|
|
18651
18778
|
const contents = await objectStore_exports2.retrieve(
|
|
18652
18779
|
ObjectStoreBuckets2.APPS,
|
|
18653
|
-
(0,
|
|
18780
|
+
(0, import_path8.join)(appPath, path2)
|
|
18654
18781
|
);
|
|
18655
|
-
|
|
18782
|
+
import_fs7.default.writeFileSync((0, import_path8.join)(tmpPath, path2), contents);
|
|
18656
18783
|
}
|
|
18657
18784
|
} else {
|
|
18658
18785
|
tmpPath = await objectStore_exports2.retrieveDirectory(
|
|
@@ -18661,33 +18788,48 @@ async function exportApp(appId, config) {
|
|
|
18661
18788
|
);
|
|
18662
18789
|
}
|
|
18663
18790
|
}
|
|
18664
|
-
const downloadedPath = (0,
|
|
18665
|
-
if (
|
|
18666
|
-
const allFiles =
|
|
18791
|
+
const downloadedPath = (0, import_path8.join)(tmpPath, appPath);
|
|
18792
|
+
if (import_fs7.default.existsSync(downloadedPath)) {
|
|
18793
|
+
const allFiles = import_fs7.default.readdirSync(downloadedPath);
|
|
18667
18794
|
for (let file of allFiles) {
|
|
18668
|
-
const path2 = (0,
|
|
18669
|
-
|
|
18795
|
+
const path2 = (0, import_path8.join)(downloadedPath, file);
|
|
18796
|
+
import_fs7.default.renameSync(path2, (0, import_path8.join)(downloadedPath, "..", file));
|
|
18670
18797
|
}
|
|
18671
|
-
|
|
18798
|
+
import_fs7.default.rmdirSync(downloadedPath);
|
|
18672
18799
|
}
|
|
18673
|
-
const dbPath = (0,
|
|
18800
|
+
const dbPath = (0, import_path8.join)(tmpPath, DB_EXPORT_FILE);
|
|
18674
18801
|
await exportDB(appId, {
|
|
18675
18802
|
filter: defineFilter(config == null ? void 0 : config.excludeRows, config == null ? void 0 : config.excludeLogs),
|
|
18676
18803
|
exportPath: dbPath
|
|
18677
18804
|
});
|
|
18805
|
+
if (config == null ? void 0 : config.encryptPassword) {
|
|
18806
|
+
for (let file of import_fs7.default.readdirSync(tmpPath)) {
|
|
18807
|
+
const path2 = (0, import_path8.join)(tmpPath, file);
|
|
18808
|
+
await encryption_exports.encryptFile(
|
|
18809
|
+
{ dir: tmpPath, filename: file },
|
|
18810
|
+
config.encryptPassword
|
|
18811
|
+
);
|
|
18812
|
+
import_fs7.default.rmSync(path2);
|
|
18813
|
+
}
|
|
18814
|
+
}
|
|
18678
18815
|
if (config == null ? void 0 : config.tar) {
|
|
18679
|
-
const tarPath = tarFilesToTmp(tmpPath,
|
|
18680
|
-
|
|
18816
|
+
const tarPath = tarFilesToTmp(tmpPath, import_fs7.default.readdirSync(tmpPath));
|
|
18817
|
+
import_fs7.default.rmSync(tmpPath, { recursive: true, force: true });
|
|
18681
18818
|
return tarPath;
|
|
18682
18819
|
} else {
|
|
18683
18820
|
return tmpPath;
|
|
18684
18821
|
}
|
|
18685
18822
|
}
|
|
18686
|
-
async function streamExportApp(
|
|
18823
|
+
async function streamExportApp({
|
|
18824
|
+
appId,
|
|
18825
|
+
excludeRows,
|
|
18826
|
+
encryptPassword
|
|
18827
|
+
}) {
|
|
18687
18828
|
const tmpPath = await exportApp(appId, {
|
|
18688
18829
|
excludeRows,
|
|
18689
18830
|
excludeLogs: true,
|
|
18690
|
-
tar: true
|
|
18831
|
+
tar: true,
|
|
18832
|
+
encryptPassword
|
|
18691
18833
|
});
|
|
18692
18834
|
return streamFile(tmpPath);
|
|
18693
18835
|
}
|
|
@@ -18701,8 +18843,8 @@ __export(imports_exports, {
|
|
|
18701
18843
|
untarFile: () => untarFile,
|
|
18702
18844
|
updateAttachmentColumns: () => updateAttachmentColumns
|
|
18703
18845
|
});
|
|
18704
|
-
var
|
|
18705
|
-
var
|
|
18846
|
+
var import_path9 = require("path");
|
|
18847
|
+
var import_fs8 = __toESM(require("fs"));
|
|
18706
18848
|
init_src();
|
|
18707
18849
|
var uuid4 = require("uuid/v4");
|
|
18708
18850
|
var tar4 = require("tar");
|
|
@@ -18718,12 +18860,12 @@ function rewriteAttachmentUrl(appId, attachment) {
|
|
|
18718
18860
|
// calculated on retrieval using key
|
|
18719
18861
|
};
|
|
18720
18862
|
}
|
|
18721
|
-
async function updateAttachmentColumns(prodAppId,
|
|
18722
|
-
const tables = await sdk_default.tables.getAllInternalTables(
|
|
18863
|
+
async function updateAttachmentColumns(prodAppId, db2) {
|
|
18864
|
+
const tables = await sdk_default.tables.getAllInternalTables(db2);
|
|
18723
18865
|
let updatedRows = [];
|
|
18724
18866
|
for (let table of tables) {
|
|
18725
18867
|
const { rows: rows2, columns } = await sdk_default.rows.getRowsWithAttachments(
|
|
18726
|
-
|
|
18868
|
+
db2.name,
|
|
18727
18869
|
table
|
|
18728
18870
|
);
|
|
18729
18871
|
updatedRows = updatedRows.concat(
|
|
@@ -18739,11 +18881,11 @@ async function updateAttachmentColumns(prodAppId, db) {
|
|
|
18739
18881
|
})
|
|
18740
18882
|
);
|
|
18741
18883
|
}
|
|
18742
|
-
await
|
|
18884
|
+
await db2.bulkDocs(updatedRows);
|
|
18743
18885
|
}
|
|
18744
|
-
async function updateAutomations(prodAppId,
|
|
18886
|
+
async function updateAutomations(prodAppId, db2) {
|
|
18745
18887
|
var _a;
|
|
18746
|
-
const automations2 = (await
|
|
18888
|
+
const automations2 = (await db2.allDocs(
|
|
18747
18889
|
getAutomationParams(null, {
|
|
18748
18890
|
include_docs: true
|
|
18749
18891
|
})
|
|
@@ -18762,23 +18904,23 @@ async function updateAutomations(prodAppId, db) {
|
|
|
18762
18904
|
automation.appId = devAppId;
|
|
18763
18905
|
toSave.push(automation);
|
|
18764
18906
|
}
|
|
18765
|
-
await
|
|
18907
|
+
await db2.bulkDocs(toSave);
|
|
18766
18908
|
}
|
|
18767
18909
|
async function getTemplateStream(template) {
|
|
18768
18910
|
if (template.file && template.file.type !== "text/plain") {
|
|
18769
18911
|
throw new Error("Cannot import a non-text based file.");
|
|
18770
18912
|
}
|
|
18771
18913
|
if (template.file) {
|
|
18772
|
-
return
|
|
18914
|
+
return import_fs8.default.createReadStream(template.file.path);
|
|
18773
18915
|
} else if (template.key) {
|
|
18774
|
-
const [type,
|
|
18775
|
-
const tmpPath = await downloadTemplate(type,
|
|
18776
|
-
return
|
|
18916
|
+
const [type, name2] = template.key.split("/");
|
|
18917
|
+
const tmpPath = await downloadTemplate(type, name2);
|
|
18918
|
+
return import_fs8.default.createReadStream((0, import_path9.join)(tmpPath, name2, "db", "dump.txt"));
|
|
18777
18919
|
}
|
|
18778
18920
|
}
|
|
18779
18921
|
function untarFile(file) {
|
|
18780
|
-
const tmpPath = (0,
|
|
18781
|
-
|
|
18922
|
+
const tmpPath = (0, import_path9.join)(budibaseTempDir2(), uuid4());
|
|
18923
|
+
import_fs8.default.mkdirSync(tmpPath);
|
|
18782
18924
|
tar4.extract({
|
|
18783
18925
|
sync: true,
|
|
18784
18926
|
cwd: tmpPath,
|
|
@@ -18786,31 +18928,49 @@ function untarFile(file) {
|
|
|
18786
18928
|
});
|
|
18787
18929
|
return tmpPath;
|
|
18788
18930
|
}
|
|
18931
|
+
async function decryptFiles(path2, password) {
|
|
18932
|
+
try {
|
|
18933
|
+
for (let file of import_fs8.default.readdirSync(path2)) {
|
|
18934
|
+
const inputPath = (0, import_path9.join)(path2, file);
|
|
18935
|
+
const outputPath = inputPath.replace(/\.enc$/, "");
|
|
18936
|
+
await encryption_exports.decryptFile(inputPath, outputPath, password);
|
|
18937
|
+
import_fs8.default.rmSync(inputPath);
|
|
18938
|
+
}
|
|
18939
|
+
} catch (err) {
|
|
18940
|
+
if (err.message === "incorrect header check") {
|
|
18941
|
+
throw new Error("File cannot be imported");
|
|
18942
|
+
}
|
|
18943
|
+
throw err;
|
|
18944
|
+
}
|
|
18945
|
+
}
|
|
18789
18946
|
function getGlobalDBFile(tmpPath) {
|
|
18790
|
-
return
|
|
18947
|
+
return import_fs8.default.readFileSync((0, import_path9.join)(tmpPath, GLOBAL_DB_EXPORT_FILE), "utf8");
|
|
18791
18948
|
}
|
|
18792
18949
|
function getListOfAppsInMulti(tmpPath) {
|
|
18793
|
-
return
|
|
18950
|
+
return import_fs8.default.readdirSync(tmpPath).filter((dir) => dir !== GLOBAL_DB_EXPORT_FILE);
|
|
18794
18951
|
}
|
|
18795
|
-
async function importApp(appId,
|
|
18952
|
+
async function importApp(appId, db2, template) {
|
|
18796
18953
|
var _a, _b;
|
|
18797
18954
|
let prodAppId = db_exports.getProdAppID(appId);
|
|
18798
18955
|
let dbStream;
|
|
18799
18956
|
const isTar = template.file && ((_b = (_a = template == null ? void 0 : template.file) == null ? void 0 : _a.type) == null ? void 0 : _b.endsWith("gzip"));
|
|
18800
|
-
const isDirectory = template.file &&
|
|
18957
|
+
const isDirectory = template.file && import_fs8.default.lstatSync(template.file.path).isDirectory();
|
|
18801
18958
|
if (template.file && (isTar || isDirectory)) {
|
|
18802
18959
|
const tmpPath = isTar ? untarFile(template.file) : template.file.path;
|
|
18803
|
-
|
|
18960
|
+
if (isTar && template.file.password) {
|
|
18961
|
+
await decryptFiles(tmpPath, template.file.password);
|
|
18962
|
+
}
|
|
18963
|
+
const contents = import_fs8.default.readdirSync(tmpPath);
|
|
18804
18964
|
if (contents.length) {
|
|
18805
18965
|
let promises = [];
|
|
18806
18966
|
let excludedFiles = [GLOBAL_DB_EXPORT_FILE, DB_EXPORT_FILE];
|
|
18807
18967
|
for (let filename of contents) {
|
|
18808
|
-
const path2 = (0,
|
|
18968
|
+
const path2 = (0, import_path9.join)(tmpPath, filename);
|
|
18809
18969
|
if (excludedFiles.includes(filename)) {
|
|
18810
18970
|
continue;
|
|
18811
18971
|
}
|
|
18812
|
-
filename = (0,
|
|
18813
|
-
if (
|
|
18972
|
+
filename = (0, import_path9.join)(prodAppId, filename);
|
|
18973
|
+
if (import_fs8.default.lstatSync(path2).isDirectory()) {
|
|
18814
18974
|
promises.push(
|
|
18815
18975
|
objectStore_exports2.uploadDirectory(ObjectStoreBuckets2.APPS, path2, filename)
|
|
18816
18976
|
);
|
|
@@ -18826,16 +18986,16 @@ async function importApp(appId, db, template) {
|
|
|
18826
18986
|
}
|
|
18827
18987
|
await Promise.all(promises);
|
|
18828
18988
|
}
|
|
18829
|
-
dbStream =
|
|
18989
|
+
dbStream = import_fs8.default.createReadStream((0, import_path9.join)(tmpPath, DB_EXPORT_FILE));
|
|
18830
18990
|
} else {
|
|
18831
18991
|
dbStream = await getTemplateStream(template);
|
|
18832
18992
|
}
|
|
18833
|
-
const { ok } = await
|
|
18993
|
+
const { ok } = await db2.load(dbStream);
|
|
18834
18994
|
if (!ok) {
|
|
18835
18995
|
throw "Error loading database dump from template.";
|
|
18836
18996
|
}
|
|
18837
|
-
await updateAttachmentColumns(prodAppId,
|
|
18838
|
-
await updateAutomations(prodAppId,
|
|
18997
|
+
await updateAttachmentColumns(prodAppId, db2);
|
|
18998
|
+
await updateAutomations(prodAppId, db2);
|
|
18839
18999
|
return ok;
|
|
18840
19000
|
}
|
|
18841
19001
|
|
|
@@ -18847,54 +19007,54 @@ __export(statistics_exports, {
|
|
|
18847
19007
|
calculateDatasourceCount: () => calculateDatasourceCount,
|
|
18848
19008
|
calculateScreenCount: () => calculateScreenCount
|
|
18849
19009
|
});
|
|
18850
|
-
async function runInContext(appId, cb,
|
|
18851
|
-
if (
|
|
18852
|
-
return cb(
|
|
19010
|
+
async function runInContext(appId, cb, db2) {
|
|
19011
|
+
if (db2) {
|
|
19012
|
+
return cb(db2);
|
|
18853
19013
|
} else {
|
|
18854
19014
|
const devAppId = db_exports.getDevAppID(appId);
|
|
18855
19015
|
return context_exports.doInAppContext(devAppId, () => {
|
|
18856
|
-
const
|
|
18857
|
-
return cb(
|
|
19016
|
+
const db3 = context_exports.getAppDB();
|
|
19017
|
+
return cb(db3);
|
|
18858
19018
|
});
|
|
18859
19019
|
}
|
|
18860
19020
|
}
|
|
18861
|
-
async function calculateDatasourceCount(appId,
|
|
19021
|
+
async function calculateDatasourceCount(appId, db2) {
|
|
18862
19022
|
return runInContext(
|
|
18863
19023
|
appId,
|
|
18864
|
-
async (
|
|
18865
|
-
const datasourceList = await
|
|
18866
|
-
const tableList = await
|
|
19024
|
+
async (db3) => {
|
|
19025
|
+
const datasourceList = await db3.allDocs(getDatasourceParams());
|
|
19026
|
+
const tableList = await db3.allDocs(getTableParams());
|
|
18867
19027
|
return datasourceList.rows.length + tableList.rows.length;
|
|
18868
19028
|
},
|
|
18869
|
-
|
|
19029
|
+
db2
|
|
18870
19030
|
);
|
|
18871
19031
|
}
|
|
18872
|
-
async function calculateAutomationCount(appId,
|
|
19032
|
+
async function calculateAutomationCount(appId, db2) {
|
|
18873
19033
|
return runInContext(
|
|
18874
19034
|
appId,
|
|
18875
|
-
async (
|
|
18876
|
-
const automationList = await
|
|
19035
|
+
async (db3) => {
|
|
19036
|
+
const automationList = await db3.allDocs(getAutomationParams());
|
|
18877
19037
|
return automationList.rows.length;
|
|
18878
19038
|
},
|
|
18879
|
-
|
|
19039
|
+
db2
|
|
18880
19040
|
);
|
|
18881
19041
|
}
|
|
18882
|
-
async function calculateScreenCount(appId,
|
|
19042
|
+
async function calculateScreenCount(appId, db2) {
|
|
18883
19043
|
return runInContext(
|
|
18884
19044
|
appId,
|
|
18885
|
-
async (
|
|
18886
|
-
const screenList = await
|
|
19045
|
+
async (db3) => {
|
|
19046
|
+
const screenList = await db3.allDocs(getScreenParams());
|
|
18887
19047
|
return screenList.rows.length;
|
|
18888
19048
|
},
|
|
18889
|
-
|
|
19049
|
+
db2
|
|
18890
19050
|
);
|
|
18891
19051
|
}
|
|
18892
19052
|
async function calculateBackupStats(appId) {
|
|
18893
|
-
return runInContext(appId, async (
|
|
19053
|
+
return runInContext(appId, async (db2) => {
|
|
18894
19054
|
const promises = [];
|
|
18895
|
-
promises.push(calculateDatasourceCount(appId,
|
|
18896
|
-
promises.push(calculateAutomationCount(appId,
|
|
18897
|
-
promises.push(calculateScreenCount(appId,
|
|
19055
|
+
promises.push(calculateDatasourceCount(appId, db2));
|
|
19056
|
+
promises.push(calculateAutomationCount(appId, db2));
|
|
19057
|
+
promises.push(calculateScreenCount(appId, db2));
|
|
18898
19058
|
const responses = await Promise.all(promises);
|
|
18899
19059
|
return {
|
|
18900
19060
|
datasources: responses[0],
|
|
@@ -19140,11 +19300,11 @@ var setCurrentMonth = (usage) => {
|
|
|
19140
19300
|
}
|
|
19141
19301
|
usage.monthly.current = usage.monthly[currentMonth];
|
|
19142
19302
|
};
|
|
19143
|
-
var getBreakdownName = (
|
|
19144
|
-
if (!id || !
|
|
19303
|
+
var getBreakdownName = (name2, id) => {
|
|
19304
|
+
if (!id || !name2) {
|
|
19145
19305
|
return;
|
|
19146
19306
|
}
|
|
19147
|
-
switch (
|
|
19307
|
+
switch (name2) {
|
|
19148
19308
|
case "automations" /* AUTOMATIONS */:
|
|
19149
19309
|
return "automations" /* AUTOMATIONS */;
|
|
19150
19310
|
case "queries" /* QUERIES */:
|
|
@@ -19158,11 +19318,11 @@ var getDB2 = () => {
|
|
|
19158
19318
|
return new Writethrough2(tenancy.getGlobalDB());
|
|
19159
19319
|
};
|
|
19160
19320
|
var bustCache2 = async () => {
|
|
19161
|
-
const
|
|
19321
|
+
const db2 = getDB2();
|
|
19162
19322
|
try {
|
|
19163
|
-
const usage = await
|
|
19323
|
+
const usage = await db2.get(db_exports.StaticDatabases.GLOBAL.docs.usageQuota);
|
|
19164
19324
|
if (usage == null ? void 0 : usage._rev) {
|
|
19165
|
-
await
|
|
19325
|
+
await db2.remove(
|
|
19166
19326
|
db_exports.StaticDatabases.GLOBAL.docs.usageQuota,
|
|
19167
19327
|
usage == null ? void 0 : usage._rev
|
|
19168
19328
|
);
|
|
@@ -19174,16 +19334,16 @@ var bustCache2 = async () => {
|
|
|
19174
19334
|
}
|
|
19175
19335
|
};
|
|
19176
19336
|
var getQuotaUsage = async () => {
|
|
19177
|
-
const
|
|
19337
|
+
const db2 = getDB2();
|
|
19178
19338
|
let usage;
|
|
19179
19339
|
try {
|
|
19180
|
-
usage = await
|
|
19340
|
+
usage = await db2.get(db_exports.StaticDatabases.GLOBAL.docs.usageQuota);
|
|
19181
19341
|
setCurrentMonth(usage);
|
|
19182
19342
|
setQuotaReset(usage);
|
|
19183
19343
|
} catch (err) {
|
|
19184
19344
|
if (err.status === 404) {
|
|
19185
19345
|
usage = generateNewQuotaUsage();
|
|
19186
|
-
const response = await
|
|
19346
|
+
const response = await db2.put(usage);
|
|
19187
19347
|
usage._rev = response.rev;
|
|
19188
19348
|
} else {
|
|
19189
19349
|
throw err;
|
|
@@ -19198,17 +19358,17 @@ var getQuotaUsage = async () => {
|
|
|
19198
19358
|
delete usage.usageQuota.developers;
|
|
19199
19359
|
return usage;
|
|
19200
19360
|
};
|
|
19201
|
-
var setUsage = async (value,
|
|
19202
|
-
return setAllUsage(
|
|
19361
|
+
var setUsage = async (value, name2, type) => {
|
|
19362
|
+
return setAllUsage(name2, type, { total: value });
|
|
19203
19363
|
};
|
|
19204
|
-
var setUsagePerApp = async (appValues,
|
|
19205
|
-
const
|
|
19364
|
+
var setUsagePerApp = async (appValues, name2, type) => {
|
|
19365
|
+
const db2 = getDB2();
|
|
19206
19366
|
let quotaUsage = await getQuotaUsage();
|
|
19207
19367
|
const total = Object.values(appValues).reduce((sum, num) => sum + num, 0);
|
|
19208
19368
|
for (let [appId, value] of Object.entries(appValues)) {
|
|
19209
19369
|
quotaUsage = coreUsageUpdate(
|
|
19210
19370
|
quotaUsage,
|
|
19211
|
-
|
|
19371
|
+
name2,
|
|
19212
19372
|
type,
|
|
19213
19373
|
{
|
|
19214
19374
|
total,
|
|
@@ -19219,12 +19379,12 @@ var setUsagePerApp = async (appValues, name, type) => {
|
|
|
19219
19379
|
}
|
|
19220
19380
|
);
|
|
19221
19381
|
}
|
|
19222
|
-
const response = await
|
|
19382
|
+
const response = await db2.put(quotaUsage);
|
|
19223
19383
|
quotaUsage._rev = response.rev;
|
|
19224
19384
|
return quotaUsage;
|
|
19225
19385
|
};
|
|
19226
|
-
var setBreakdown = (monthUsage,
|
|
19227
|
-
const breakdownName = getBreakdownName(
|
|
19386
|
+
var setBreakdown = (monthUsage, name2, id, values) => {
|
|
19387
|
+
const breakdownName = getBreakdownName(name2, id);
|
|
19228
19388
|
if (!breakdownName || !(values == null ? void 0 : values.breakdown)) {
|
|
19229
19389
|
return monthUsage;
|
|
19230
19390
|
}
|
|
@@ -19233,7 +19393,7 @@ var setBreakdown = (monthUsage, name, id, values) => {
|
|
|
19233
19393
|
}
|
|
19234
19394
|
if (!monthUsage.breakdown[breakdownName]) {
|
|
19235
19395
|
monthUsage.breakdown[breakdownName] = {
|
|
19236
|
-
parent:
|
|
19396
|
+
parent: name2,
|
|
19237
19397
|
values: {}
|
|
19238
19398
|
};
|
|
19239
19399
|
}
|
|
@@ -19241,14 +19401,14 @@ var setBreakdown = (monthUsage, name, id, values) => {
|
|
|
19241
19401
|
breakdown.values[id] = values.breakdown;
|
|
19242
19402
|
return monthUsage;
|
|
19243
19403
|
};
|
|
19244
|
-
var setAppUsageValue = (quotaUsage,
|
|
19404
|
+
var setAppUsageValue = (quotaUsage, name2, type, opts = {}, values) => {
|
|
19245
19405
|
var _a;
|
|
19246
19406
|
let appId;
|
|
19247
19407
|
try {
|
|
19248
19408
|
appId = db_exports.getProdAppID((opts == null ? void 0 : opts.appId) || context_exports.getAppId());
|
|
19249
19409
|
} catch (err) {
|
|
19250
19410
|
}
|
|
19251
|
-
if (!appId || !values.app || !APP_QUOTA_NAMES.includes(
|
|
19411
|
+
if (!appId || !values.app || !APP_QUOTA_NAMES.includes(name2)) {
|
|
19252
19412
|
return quotaUsage;
|
|
19253
19413
|
}
|
|
19254
19414
|
if (!((_a = quotaUsage.apps) == null ? void 0 : _a[appId])) {
|
|
@@ -19260,11 +19420,11 @@ var setAppUsageValue = (quotaUsage, name, type, opts = {}, values) => {
|
|
|
19260
19420
|
const appUsage = quotaUsage.apps[appId];
|
|
19261
19421
|
switch (type) {
|
|
19262
19422
|
case "static" /* STATIC */:
|
|
19263
|
-
appUsage.usageQuota[
|
|
19423
|
+
appUsage.usageQuota[name2] = values.app;
|
|
19264
19424
|
break;
|
|
19265
19425
|
case "monthly" /* MONTHLY */:
|
|
19266
19426
|
const currentMonth = getCurrentMonthString();
|
|
19267
|
-
const monthlyName =
|
|
19427
|
+
const monthlyName = name2;
|
|
19268
19428
|
let monthUsage = appUsage.monthly[currentMonth];
|
|
19269
19429
|
if (!monthUsage) {
|
|
19270
19430
|
appUsage.monthly[currentMonth] = generateNewMonthlyQuotas();
|
|
@@ -19278,9 +19438,9 @@ var setAppUsageValue = (quotaUsage, name, type, opts = {}, values) => {
|
|
|
19278
19438
|
}
|
|
19279
19439
|
return quotaUsage;
|
|
19280
19440
|
};
|
|
19281
|
-
var getAppUsageValue = (quotaUsage, type,
|
|
19441
|
+
var getAppUsageValue = (quotaUsage, type, name2, id) => {
|
|
19282
19442
|
var _a, _b, _c, _d, _e;
|
|
19283
|
-
if (!APP_QUOTA_NAMES.includes(
|
|
19443
|
+
if (!APP_QUOTA_NAMES.includes(name2)) {
|
|
19284
19444
|
return {};
|
|
19285
19445
|
}
|
|
19286
19446
|
let appId;
|
|
@@ -19294,13 +19454,13 @@ var getAppUsageValue = (quotaUsage, type, name, id) => {
|
|
|
19294
19454
|
const appUsage = quotaUsage.apps[appId];
|
|
19295
19455
|
switch (type) {
|
|
19296
19456
|
case "static" /* STATIC */:
|
|
19297
|
-
if ((_a = appUsage.usageQuota) == null ? void 0 : _a[
|
|
19298
|
-
return { app: appUsage.usageQuota[
|
|
19457
|
+
if ((_a = appUsage.usageQuota) == null ? void 0 : _a[name2]) {
|
|
19458
|
+
return { app: appUsage.usageQuota[name2] };
|
|
19299
19459
|
}
|
|
19300
19460
|
break;
|
|
19301
19461
|
case "monthly" /* MONTHLY */:
|
|
19302
19462
|
const currentMonth = getCurrentMonthString();
|
|
19303
|
-
const monthlyName =
|
|
19463
|
+
const monthlyName = name2;
|
|
19304
19464
|
if (!((_c = (_b = appUsage.monthly) == null ? void 0 : _b[currentMonth]) == null ? void 0 : _c[monthlyName])) {
|
|
19305
19465
|
break;
|
|
19306
19466
|
}
|
|
@@ -19315,68 +19475,68 @@ var getAppUsageValue = (quotaUsage, type, name, id) => {
|
|
|
19315
19475
|
}
|
|
19316
19476
|
return { app: 0 };
|
|
19317
19477
|
};
|
|
19318
|
-
var setStaticTriggers = (
|
|
19478
|
+
var setStaticTriggers = (name2, quotaUsage, triggers) => {
|
|
19319
19479
|
if (!quotaUsage.usageQuota.triggers) {
|
|
19320
19480
|
quotaUsage.usageQuota.triggers = {};
|
|
19321
19481
|
}
|
|
19322
19482
|
if (triggers) {
|
|
19323
|
-
quotaUsage.usageQuota.triggers[
|
|
19483
|
+
quotaUsage.usageQuota.triggers[name2] = triggers;
|
|
19324
19484
|
}
|
|
19325
19485
|
};
|
|
19326
|
-
var setMonthlyTriggers = (
|
|
19486
|
+
var setMonthlyTriggers = (name2, currentMonth, quotaUsage, triggers) => {
|
|
19327
19487
|
if (!quotaUsage.monthly[currentMonth].triggers) {
|
|
19328
19488
|
quotaUsage.monthly[currentMonth].triggers = {};
|
|
19329
19489
|
}
|
|
19330
19490
|
if (triggers) {
|
|
19331
|
-
quotaUsage.monthly[currentMonth].triggers[
|
|
19491
|
+
quotaUsage.monthly[currentMonth].triggers[name2] = triggers;
|
|
19332
19492
|
}
|
|
19333
19493
|
};
|
|
19334
|
-
var coreUsageUpdate = (quotaUsage,
|
|
19494
|
+
var coreUsageUpdate = (quotaUsage, name2, type, values, opts = {}) => {
|
|
19335
19495
|
if (type === "static" /* STATIC */) {
|
|
19336
|
-
|
|
19337
|
-
quotaUsage.usageQuota[
|
|
19338
|
-
setStaticTriggers(
|
|
19496
|
+
name2 = name2;
|
|
19497
|
+
quotaUsage.usageQuota[name2] = values.total;
|
|
19498
|
+
setStaticTriggers(name2, quotaUsage, values.triggers);
|
|
19339
19499
|
} else if (type === "monthly" /* MONTHLY */) {
|
|
19340
|
-
|
|
19500
|
+
name2 = name2;
|
|
19341
19501
|
const currentMonth = getCurrentMonthString();
|
|
19342
|
-
quotaUsage.monthly[currentMonth][
|
|
19343
|
-
setMonthlyTriggers(
|
|
19502
|
+
quotaUsage.monthly[currentMonth][name2] = values.total;
|
|
19503
|
+
setMonthlyTriggers(name2, currentMonth, quotaUsage, values.triggers);
|
|
19344
19504
|
} else {
|
|
19345
19505
|
throw new Error(`Invalid usage type: ${type}`);
|
|
19346
19506
|
}
|
|
19347
|
-
return setAppUsageValue(quotaUsage,
|
|
19507
|
+
return setAppUsageValue(quotaUsage, name2, type, opts, values);
|
|
19348
19508
|
};
|
|
19349
|
-
var setAllUsage = async (
|
|
19350
|
-
const
|
|
19509
|
+
var setAllUsage = async (name2, type, values, opts = {}) => {
|
|
19510
|
+
const db2 = getDB2();
|
|
19351
19511
|
let quotaUsage = await getQuotaUsage();
|
|
19352
|
-
quotaUsage = coreUsageUpdate(quotaUsage,
|
|
19353
|
-
const response = await
|
|
19512
|
+
quotaUsage = coreUsageUpdate(quotaUsage, name2, type, values, opts);
|
|
19513
|
+
const response = await db2.put(quotaUsage);
|
|
19354
19514
|
quotaUsage._rev = response.rev;
|
|
19355
19515
|
return quotaUsage;
|
|
19356
19516
|
};
|
|
19357
|
-
var getCurrentUsageValues = async (type,
|
|
19517
|
+
var getCurrentUsageValues = async (type, name2, id) => {
|
|
19358
19518
|
const quotaUsage = await getQuotaUsage();
|
|
19359
19519
|
let total = 0, appValues = {};
|
|
19360
19520
|
switch (type) {
|
|
19361
19521
|
case "static" /* STATIC */:
|
|
19362
|
-
if (quotaUsage.usageQuota[
|
|
19363
|
-
const staticName =
|
|
19522
|
+
if (quotaUsage.usageQuota[name2]) {
|
|
19523
|
+
const staticName = name2;
|
|
19364
19524
|
total = quotaUsage.usageQuota[staticName];
|
|
19365
|
-
appValues = getAppUsageValue(quotaUsage, type,
|
|
19525
|
+
appValues = getAppUsageValue(quotaUsage, type, name2, id);
|
|
19366
19526
|
}
|
|
19367
19527
|
break;
|
|
19368
19528
|
case "monthly" /* MONTHLY */:
|
|
19369
19529
|
const currentMonth = getCurrentMonthString();
|
|
19370
|
-
const monthlyName =
|
|
19530
|
+
const monthlyName = name2;
|
|
19371
19531
|
if (quotaUsage.monthly[currentMonth][monthlyName]) {
|
|
19372
19532
|
total = quotaUsage.monthly[currentMonth][monthlyName];
|
|
19373
|
-
appValues = getAppUsageValue(quotaUsage, type,
|
|
19533
|
+
appValues = getAppUsageValue(quotaUsage, type, name2, id);
|
|
19374
19534
|
}
|
|
19375
19535
|
break;
|
|
19376
19536
|
default:
|
|
19377
19537
|
throw new Error(`Invalid usage type: ${type}`);
|
|
19378
19538
|
}
|
|
19379
|
-
if (APP_QUOTA_NAMES.includes(
|
|
19539
|
+
if (APP_QUOTA_NAMES.includes(name2) && !(appValues.app || appValues.breakdown)) {
|
|
19380
19540
|
appValues.app = appValues.app || 0;
|
|
19381
19541
|
appValues.breakdown = appValues.breakdown || 0;
|
|
19382
19542
|
}
|
|
@@ -19397,8 +19557,8 @@ var newLicenseInfo = (licenseKey) => {
|
|
|
19397
19557
|
};
|
|
19398
19558
|
};
|
|
19399
19559
|
var save2 = async (licenseInfo) => {
|
|
19400
|
-
const
|
|
19401
|
-
const response = await
|
|
19560
|
+
const db2 = tenancy.getGlobalDB();
|
|
19561
|
+
const response = await db2.put(licenseInfo);
|
|
19402
19562
|
licenseInfo._rev = response.rev;
|
|
19403
19563
|
return licenseInfo;
|
|
19404
19564
|
};
|
|
@@ -19407,9 +19567,9 @@ var create = async (licenseKey) => {
|
|
|
19407
19567
|
return save2(licenseInfo);
|
|
19408
19568
|
};
|
|
19409
19569
|
var get4 = async () => {
|
|
19410
|
-
const
|
|
19570
|
+
const db2 = tenancy.getGlobalDB();
|
|
19411
19571
|
try {
|
|
19412
|
-
return await
|
|
19572
|
+
return await db2.get(StaticDatabases.GLOBAL.docs.licenseInfo);
|
|
19413
19573
|
} catch (err) {
|
|
19414
19574
|
if (err.status === 404) {
|
|
19415
19575
|
return void 0;
|
|
@@ -19422,8 +19582,8 @@ var destroy2 = async () => {
|
|
|
19422
19582
|
if (!info) {
|
|
19423
19583
|
return;
|
|
19424
19584
|
}
|
|
19425
|
-
const
|
|
19426
|
-
return
|
|
19585
|
+
const db2 = tenancy.getGlobalDB();
|
|
19586
|
+
return db2.remove(StaticDatabases.GLOBAL.docs.licenseInfo, info._rev);
|
|
19427
19587
|
};
|
|
19428
19588
|
|
|
19429
19589
|
// ../pro/packages/pro/src/db/groups.ts
|
|
@@ -19445,10 +19605,10 @@ __export(groups_exports, {
|
|
|
19445
19605
|
// ../pro/packages/pro/src/db/views/staticViews.ts
|
|
19446
19606
|
init_src();
|
|
19447
19607
|
async function createAuditLogSearchIndex() {
|
|
19448
|
-
const
|
|
19608
|
+
const db2 = context_exports.getAuditLogsDB();
|
|
19449
19609
|
let designDoc;
|
|
19450
19610
|
try {
|
|
19451
|
-
designDoc = await
|
|
19611
|
+
designDoc = await db2.get("_design/database");
|
|
19452
19612
|
} catch (err) {
|
|
19453
19613
|
if (err.status === 404) {
|
|
19454
19614
|
designDoc = { _id: "_design/database" };
|
|
@@ -19491,14 +19651,14 @@ async function createAuditLogSearchIndex() {
|
|
|
19491
19651
|
}
|
|
19492
19652
|
}
|
|
19493
19653
|
};
|
|
19494
|
-
await
|
|
19654
|
+
await db2.put(designDoc);
|
|
19495
19655
|
}
|
|
19496
19656
|
|
|
19497
19657
|
// ../pro/packages/pro/src/db/views/groups.ts
|
|
19498
19658
|
var { ViewName: ViewName4, SEPARATOR: SEPARATOR5, DocumentType: DocumentType3, createView: createView2 } = db_exports;
|
|
19499
19659
|
var USER_PREFIX = DocumentType3.USER + SEPARATOR5;
|
|
19500
19660
|
async function createGroupUserLookupView() {
|
|
19501
|
-
const
|
|
19661
|
+
const db2 = tenancy.getGlobalDB();
|
|
19502
19662
|
const viewJs = `function(doc) {
|
|
19503
19663
|
if (doc._id.startsWith("${USER_PREFIX}") && Array.isArray(doc.userGroups)) {
|
|
19504
19664
|
for (let groupId of doc.userGroups) {
|
|
@@ -19507,7 +19667,7 @@ async function createGroupUserLookupView() {
|
|
|
19507
19667
|
}
|
|
19508
19668
|
}
|
|
19509
19669
|
}`;
|
|
19510
|
-
await createView2(
|
|
19670
|
+
await createView2(db2, viewJs, ViewName4.USER_BY_GROUP);
|
|
19511
19671
|
}
|
|
19512
19672
|
|
|
19513
19673
|
// ../pro/packages/pro/src/db/groups.ts
|
|
@@ -19547,17 +19707,17 @@ function generateUserGroupID() {
|
|
|
19547
19707
|
return `${GROUP_PREFIX}${utils_exports2.newid()}`;
|
|
19548
19708
|
}
|
|
19549
19709
|
async function getGroupUsers(groupId, params2) {
|
|
19550
|
-
const
|
|
19710
|
+
const db2 = tenancy.getGlobalDB();
|
|
19551
19711
|
const userDocs = await db_exports.queryView(
|
|
19552
19712
|
db_exports.ViewName.USER_BY_GROUP,
|
|
19553
19713
|
getGroupUsersParams(groupId, params2),
|
|
19554
|
-
|
|
19714
|
+
db2,
|
|
19555
19715
|
createGroupUserLookupView,
|
|
19556
19716
|
{ arrayResponse: true }
|
|
19557
19717
|
);
|
|
19558
|
-
const users2 = userDocs.map((
|
|
19559
|
-
_id:
|
|
19560
|
-
email:
|
|
19718
|
+
const users2 = userDocs.map((doc2) => ({
|
|
19719
|
+
_id: doc2.userId,
|
|
19720
|
+
email: doc2.email
|
|
19561
19721
|
})) || [];
|
|
19562
19722
|
return users2;
|
|
19563
19723
|
}
|
|
@@ -19586,9 +19746,9 @@ async function cleanupUsers(group) {
|
|
|
19586
19746
|
}
|
|
19587
19747
|
}
|
|
19588
19748
|
async function fetch11() {
|
|
19589
|
-
const
|
|
19749
|
+
const db2 = tenancy.getGlobalDB();
|
|
19590
19750
|
try {
|
|
19591
|
-
const groups = (await
|
|
19751
|
+
const groups = (await db2.allDocs(
|
|
19592
19752
|
getUserGroupsParams(null, {
|
|
19593
19753
|
include_docs: true
|
|
19594
19754
|
})
|
|
@@ -19603,18 +19763,18 @@ async function fetch11() {
|
|
|
19603
19763
|
}
|
|
19604
19764
|
}
|
|
19605
19765
|
async function get5(groupId) {
|
|
19606
|
-
const
|
|
19766
|
+
const db2 = tenancy.getGlobalDB();
|
|
19607
19767
|
try {
|
|
19608
|
-
const group = await
|
|
19768
|
+
const group = await db2.get(groupId);
|
|
19609
19769
|
return await enrichGroup(group);
|
|
19610
19770
|
} catch (err) {
|
|
19611
19771
|
throw err;
|
|
19612
19772
|
}
|
|
19613
19773
|
}
|
|
19614
19774
|
async function getBulk(groupIds, opts = { enriched: true }) {
|
|
19615
|
-
const
|
|
19775
|
+
const db2 = tenancy.getGlobalDB();
|
|
19616
19776
|
try {
|
|
19617
|
-
const groups = (await
|
|
19777
|
+
const groups = (await db2.allDocs({
|
|
19618
19778
|
keys: groupIds,
|
|
19619
19779
|
include_docs: true
|
|
19620
19780
|
})).rows.map((row) => row.doc);
|
|
@@ -19632,26 +19792,26 @@ async function getBulk(groupIds, opts = { enriched: true }) {
|
|
|
19632
19792
|
}
|
|
19633
19793
|
}
|
|
19634
19794
|
async function save3(group) {
|
|
19635
|
-
const
|
|
19636
|
-
return await
|
|
19795
|
+
const db2 = tenancy.getGlobalDB();
|
|
19796
|
+
return await db2.put(group);
|
|
19637
19797
|
}
|
|
19638
19798
|
async function bulkSave(groups) {
|
|
19639
|
-
const
|
|
19640
|
-
return await
|
|
19799
|
+
const db2 = tenancy.getGlobalDB();
|
|
19800
|
+
return await db2.bulkDocs(groups);
|
|
19641
19801
|
}
|
|
19642
19802
|
async function destroy3(groupId, revision) {
|
|
19643
|
-
const
|
|
19644
|
-
const group = await
|
|
19645
|
-
let resp = await
|
|
19803
|
+
const db2 = tenancy.getGlobalDB();
|
|
19804
|
+
const group = await db2.get(groupId);
|
|
19805
|
+
let resp = await db2.remove(groupId, revision);
|
|
19646
19806
|
await cleanupUsers(group);
|
|
19647
19807
|
return resp;
|
|
19648
19808
|
}
|
|
19649
|
-
async function getByName(
|
|
19809
|
+
async function getByName(name2) {
|
|
19650
19810
|
try {
|
|
19651
19811
|
const groups = await db_exports.directCouchFind(tenancy.getGlobalDBName(), {
|
|
19652
19812
|
selector: {
|
|
19653
19813
|
name: {
|
|
19654
|
-
$regex: `^(?i)${
|
|
19814
|
+
$regex: `^(?i)${name2}$`
|
|
19655
19815
|
}
|
|
19656
19816
|
},
|
|
19657
19817
|
limit: 1
|
|
@@ -19701,7 +19861,7 @@ var { ViewName: ViewName5, AutomationViewMode: AutomationViewMode2, SEPARATOR: S
|
|
|
19701
19861
|
var LOG_PREFIX = DocumentType4.AUTOMATION_LOG + SEPARATOR6;
|
|
19702
19862
|
var APP_BACKUP_PREFIX = DocumentType4.APP_BACKUP + SEPARATOR6;
|
|
19703
19863
|
async function createLogByAutomationView() {
|
|
19704
|
-
const
|
|
19864
|
+
const db2 = context_exports.getProdAppDB();
|
|
19705
19865
|
const viewJs = `function(doc) {
|
|
19706
19866
|
if (doc._id.startsWith("${LOG_PREFIX}")) {
|
|
19707
19867
|
let autoId = doc.automationId + "${SEPARATOR6}"
|
|
@@ -19714,10 +19874,10 @@ async function createLogByAutomationView() {
|
|
|
19714
19874
|
emit(allKey)
|
|
19715
19875
|
}
|
|
19716
19876
|
}`;
|
|
19717
|
-
await createView3(
|
|
19877
|
+
await createView3(db2, viewJs, ViewName5.AUTOMATION_LOGS);
|
|
19718
19878
|
}
|
|
19719
19879
|
async function createAppBackupTriggerView() {
|
|
19720
|
-
const
|
|
19880
|
+
const db2 = tenancy.getGlobalDB();
|
|
19721
19881
|
const viewJs = `function(doc) {
|
|
19722
19882
|
if (doc._id.startsWith("${APP_BACKUP_PREFIX}") && doc.type && doc.trigger) {
|
|
19723
19883
|
let full = doc.appId + "${SEPARATOR6}"
|
|
@@ -19726,7 +19886,7 @@ async function createAppBackupTriggerView() {
|
|
|
19726
19886
|
emit("${APP_BACKUP_PREFIX}" + full + doc.timestamp)
|
|
19727
19887
|
}
|
|
19728
19888
|
}`;
|
|
19729
|
-
await createView3(
|
|
19889
|
+
await createView3(db2, viewJs, ViewName5.APP_BACKUP_BY_TRIGGER);
|
|
19730
19890
|
}
|
|
19731
19891
|
|
|
19732
19892
|
// ../pro/packages/pro/src/db/utils/retention.ts
|
|
@@ -19945,17 +20105,17 @@ __export(version_exports, {
|
|
|
19945
20105
|
getLicenseVersion: () => getLicenseVersion,
|
|
19946
20106
|
getProVersion: () => getProVersion
|
|
19947
20107
|
});
|
|
19948
|
-
var
|
|
19949
|
-
var
|
|
20108
|
+
var import_fs9 = __toESM(require("fs"));
|
|
20109
|
+
var import_path10 = __toESM(require("path"));
|
|
19950
20110
|
var getLicenseVersion = () => {
|
|
19951
20111
|
if (environment_default2.isDev()) {
|
|
19952
20112
|
const DEV_VER_FILENAME = "dev-version.txt";
|
|
19953
|
-
const verFile =
|
|
19954
|
-
if (
|
|
19955
|
-
return
|
|
20113
|
+
const verFile = import_path10.default.join(objectStore_exports2.budibaseTempDir(), DEV_VER_FILENAME);
|
|
20114
|
+
if (import_fs9.default.existsSync(verFile)) {
|
|
20115
|
+
return import_fs9.default.readFileSync(verFile, "utf8");
|
|
19956
20116
|
} else {
|
|
19957
20117
|
const devVer = utils_exports2.newid();
|
|
19958
|
-
|
|
20118
|
+
import_fs9.default.writeFileSync(verFile, devVer);
|
|
19959
20119
|
return devVer;
|
|
19960
20120
|
}
|
|
19961
20121
|
} else {
|
|
@@ -19963,11 +20123,11 @@ var getLicenseVersion = () => {
|
|
|
19963
20123
|
}
|
|
19964
20124
|
};
|
|
19965
20125
|
var getProVersion = () => {
|
|
19966
|
-
const
|
|
19967
|
-
if (!
|
|
20126
|
+
const version2 = environment_default2.VERSION;
|
|
20127
|
+
if (!version2) {
|
|
19968
20128
|
throw new Error("No budibase pro version was specified");
|
|
19969
20129
|
}
|
|
19970
|
-
return
|
|
20130
|
+
return version2;
|
|
19971
20131
|
};
|
|
19972
20132
|
|
|
19973
20133
|
// ../pro/packages/pro/src/constants/misc.ts
|
|
@@ -20020,17 +20180,17 @@ async function getAppBackupParams(appId, filters, otherProps = {}) {
|
|
|
20020
20180
|
endkey: `${APP_BACKUP_PREFIX2}${endKey}`
|
|
20021
20181
|
};
|
|
20022
20182
|
}
|
|
20023
|
-
async function getAppBackupsByTrigger(
|
|
20183
|
+
async function getAppBackupsByTrigger(db2, params2) {
|
|
20024
20184
|
let backups = [];
|
|
20025
20185
|
try {
|
|
20026
20186
|
const queryIndex = db_exports.getQueryIndex(
|
|
20027
20187
|
db_exports.ViewName.APP_BACKUP_BY_TRIGGER
|
|
20028
20188
|
);
|
|
20029
|
-
backups = await
|
|
20189
|
+
backups = await db2.query(queryIndex, params2);
|
|
20030
20190
|
} catch (err) {
|
|
20031
20191
|
if (err != null && err.error === "not_found") {
|
|
20032
20192
|
await createAppBackupTriggerView();
|
|
20033
|
-
return getAppBackupsByTrigger(
|
|
20193
|
+
return getAppBackupsByTrigger(db2, params2);
|
|
20034
20194
|
} else {
|
|
20035
20195
|
throw err;
|
|
20036
20196
|
}
|
|
@@ -20041,7 +20201,7 @@ function generateAppBackupID(appId, timestamp) {
|
|
|
20041
20201
|
return `${APP_BACKUP_PREFIX2}${appId}${db_exports.SEPARATOR}${timestamp}`;
|
|
20042
20202
|
}
|
|
20043
20203
|
async function fetchAppBackups(appId, opts = {}) {
|
|
20044
|
-
const
|
|
20204
|
+
const db2 = tenancy.getGlobalDB();
|
|
20045
20205
|
let backups;
|
|
20046
20206
|
const pageSize = opts.limit || GENERIC_PAGE_SIZE;
|
|
20047
20207
|
const params2 = await getAppBackupParams(appId, opts, {
|
|
@@ -20052,9 +20212,9 @@ async function fetchAppBackups(appId, opts = {}) {
|
|
|
20052
20212
|
params2.startkey = opts.page;
|
|
20053
20213
|
}
|
|
20054
20214
|
if (!opts.trigger || !opts.type) {
|
|
20055
|
-
backups = await
|
|
20215
|
+
backups = await db2.allDocs(params2);
|
|
20056
20216
|
} else {
|
|
20057
|
-
backups = await getAppBackupsByTrigger(
|
|
20217
|
+
backups = await getAppBackupsByTrigger(db2, params2);
|
|
20058
20218
|
}
|
|
20059
20219
|
const pageData = pagination2(backups, {
|
|
20060
20220
|
paginate: opts.paginate,
|
|
@@ -20077,15 +20237,15 @@ async function fetchAppBackups(appId, opts = {}) {
|
|
|
20077
20237
|
}
|
|
20078
20238
|
return pageData;
|
|
20079
20239
|
}
|
|
20080
|
-
async function storeAppBackupMetadata(
|
|
20081
|
-
const
|
|
20082
|
-
const prodAppId = db_exports.getProdAppID(
|
|
20083
|
-
let _id = generateAppBackupID(prodAppId,
|
|
20240
|
+
async function storeAppBackupMetadata(metadata2, opts = {}) {
|
|
20241
|
+
const db2 = tenancy.getGlobalDB();
|
|
20242
|
+
const prodAppId = db_exports.getProdAppID(metadata2.appId);
|
|
20243
|
+
let _id = generateAppBackupID(prodAppId, metadata2.timestamp);
|
|
20084
20244
|
const appBackupDoc = {
|
|
20085
|
-
...
|
|
20245
|
+
...metadata2,
|
|
20086
20246
|
_id,
|
|
20087
20247
|
appId: prodAppId,
|
|
20088
|
-
name:
|
|
20248
|
+
name: metadata2.name
|
|
20089
20249
|
};
|
|
20090
20250
|
if (opts.filename) {
|
|
20091
20251
|
appBackupDoc.filename = opts.filename;
|
|
@@ -20094,27 +20254,27 @@ async function storeAppBackupMetadata(metadata, opts = {}) {
|
|
|
20094
20254
|
appBackupDoc._id = opts.docId;
|
|
20095
20255
|
appBackupDoc._rev = opts.docRev;
|
|
20096
20256
|
}
|
|
20097
|
-
if (
|
|
20257
|
+
if (metadata2.createdBy) {
|
|
20098
20258
|
appBackupDoc.createdBy = db_exports.getGlobalIDFromUserMetadataID(
|
|
20099
|
-
|
|
20259
|
+
metadata2.createdBy
|
|
20100
20260
|
);
|
|
20101
20261
|
}
|
|
20102
|
-
return await
|
|
20262
|
+
return await db2.put(appBackupDoc);
|
|
20103
20263
|
}
|
|
20104
|
-
async function updateAppBackupMetadata(backupId,
|
|
20105
|
-
const
|
|
20106
|
-
const
|
|
20107
|
-
|
|
20108
|
-
return await
|
|
20264
|
+
async function updateAppBackupMetadata(backupId, name2) {
|
|
20265
|
+
const db2 = tenancy.getGlobalDB();
|
|
20266
|
+
const metadata2 = await db2.get(backupId);
|
|
20267
|
+
metadata2.name = name2;
|
|
20268
|
+
return await db2.put(metadata2);
|
|
20109
20269
|
}
|
|
20110
20270
|
async function deleteAppBackupMetadata(backupId) {
|
|
20111
|
-
const
|
|
20112
|
-
const backupDoc = await
|
|
20113
|
-
await
|
|
20271
|
+
const db2 = tenancy.getGlobalDB();
|
|
20272
|
+
const backupDoc = await db2.get(backupId);
|
|
20273
|
+
await db2.remove(backupDoc._id, backupDoc._rev);
|
|
20114
20274
|
}
|
|
20115
20275
|
async function getAppBackupMetadata(backupId) {
|
|
20116
|
-
const
|
|
20117
|
-
return await
|
|
20276
|
+
const db2 = tenancy.getGlobalDB();
|
|
20277
|
+
return await db2.get(backupId);
|
|
20118
20278
|
}
|
|
20119
20279
|
|
|
20120
20280
|
// ../pro/packages/pro/src/db/environmentVariables.ts
|
|
@@ -20133,16 +20293,16 @@ var cache = new import_lru_cache.default({
|
|
|
20133
20293
|
function getEnvVarID() {
|
|
20134
20294
|
return StaticDatabases.GLOBAL.docs.environmentVariables;
|
|
20135
20295
|
}
|
|
20136
|
-
function getCacheEnvVarID(
|
|
20296
|
+
function getCacheEnvVarID(rev2) {
|
|
20137
20297
|
const tenantId = tenancy.getTenantId();
|
|
20138
|
-
return `${tenantId}/${getEnvVarID()}/${
|
|
20298
|
+
return `${tenantId}/${getEnvVarID()}/${rev2 || ""}`;
|
|
20139
20299
|
}
|
|
20140
20300
|
async function get6() {
|
|
20141
20301
|
const id = getEnvVarID();
|
|
20142
|
-
const
|
|
20302
|
+
const db2 = tenancy.getGlobalDB();
|
|
20143
20303
|
let encrypted, notFound = false;
|
|
20144
20304
|
try {
|
|
20145
|
-
encrypted = await
|
|
20305
|
+
encrypted = await db2.get(id);
|
|
20146
20306
|
} catch (err) {
|
|
20147
20307
|
if (err.status == 404) {
|
|
20148
20308
|
notFound = true;
|
|
@@ -20175,14 +20335,14 @@ async function get6() {
|
|
|
20175
20335
|
cache.set(cacheKey, finalDoc);
|
|
20176
20336
|
return finalDoc;
|
|
20177
20337
|
}
|
|
20178
|
-
async function update(
|
|
20338
|
+
async function update(doc2) {
|
|
20179
20339
|
const id = getEnvVarID();
|
|
20180
|
-
const
|
|
20181
|
-
return await
|
|
20182
|
-
_id:
|
|
20183
|
-
_rev:
|
|
20340
|
+
const db2 = tenancy.getGlobalDB();
|
|
20341
|
+
return await db2.put({
|
|
20342
|
+
_id: doc2._id || id,
|
|
20343
|
+
_rev: doc2._rev || void 0,
|
|
20184
20344
|
variables: encryption_exports.encrypt(
|
|
20185
|
-
JSON.stringify(
|
|
20345
|
+
JSON.stringify(doc2.variables),
|
|
20186
20346
|
encryption_exports.SecretOption.ENCRYPTION
|
|
20187
20347
|
)
|
|
20188
20348
|
});
|
|
@@ -20314,16 +20474,16 @@ __export(offline_exports, {
|
|
|
20314
20474
|
getOfflineLicense: () => getOfflineLicense,
|
|
20315
20475
|
writeOfflineLicenseToDisk: () => writeOfflineLicenseToDisk
|
|
20316
20476
|
});
|
|
20317
|
-
var
|
|
20318
|
-
var
|
|
20477
|
+
var import_fs10 = __toESM(require("fs"));
|
|
20478
|
+
var import_path11 = require("path");
|
|
20319
20479
|
var import_os2 = require("os");
|
|
20320
20480
|
var import_jsonwebtoken = __toESM(require("jsonwebtoken"));
|
|
20321
20481
|
var SUB_DIRECTORY = environment_default2.isTest() ? ".budibase-test" : ".budibase";
|
|
20322
|
-
var DIRECTORY = (0,
|
|
20482
|
+
var DIRECTORY = (0, import_path11.join)((0, import_os2.tmpdir)(), SUB_DIRECTORY);
|
|
20323
20483
|
var OFFLINE_LICENSE_FILE = "offline_license.txt";
|
|
20324
|
-
var LICENSE_FILE_PATH = (0,
|
|
20325
|
-
if (!
|
|
20326
|
-
|
|
20484
|
+
var LICENSE_FILE_PATH = (0, import_path11.join)(DIRECTORY, OFFLINE_LICENSE_FILE);
|
|
20485
|
+
if (!import_fs10.default.existsSync(DIRECTORY)) {
|
|
20486
|
+
import_fs10.default.mkdirSync(DIRECTORY);
|
|
20327
20487
|
}
|
|
20328
20488
|
var PUBLIC_KEY = "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvz3jePLCFBXZ19c8Dpkv\nXtSgOhKFOcvQdo/LV0KJRUzQWDPWuO4ILtBtnqhjtIzZH4CH0qCYBet5L6Qr4CM1\nl2HXiAD1Q2rlHNW9wDaYyKb1F5f+v4RyqCAyzlkwRdksmkLeECTboojNnmRCrE3C\n8suunQP5bEScqEY2kclqzSf8e6xqMzPUg3mL/pNa1iEv7TuLbU9nJfgR36l0WmZY\n94fWnSaT8OSXSqcxsaByf06gfS3HAoTJNc7eqz1Hf9fUORQGPUAnFK8cT3SfdA36\nd/o3ZWE1TTj1zYwlCLN5qRKr3hU8nC3xEYNEbkB9SfTRaOq9Q7P8WmfLkoCPm3pR\nmwIDAQAB\n-----END PUBLIC KEY-----\n";
|
|
20329
20489
|
function getOfflineLicense() {
|
|
@@ -20334,16 +20494,16 @@ function getOfflineLicense() {
|
|
|
20334
20494
|
}
|
|
20335
20495
|
}
|
|
20336
20496
|
function getOfflineLicenseFromDisk() {
|
|
20337
|
-
if (
|
|
20338
|
-
const token =
|
|
20497
|
+
if (import_fs10.default.existsSync(LICENSE_FILE_PATH)) {
|
|
20498
|
+
const token = import_fs10.default.readFileSync(LICENSE_FILE_PATH, { encoding: "utf-8" });
|
|
20339
20499
|
return import_jsonwebtoken.default.verify(token, PUBLIC_KEY, { algorithms: ["RS256"] });
|
|
20340
20500
|
}
|
|
20341
20501
|
}
|
|
20342
20502
|
function writeOfflineLicenseToDisk(signedLicense) {
|
|
20343
|
-
|
|
20503
|
+
import_fs10.default.writeFileSync(LICENSE_FILE_PATH, signedLicense, { encoding: "utf-8" });
|
|
20344
20504
|
}
|
|
20345
20505
|
function deleteOfflineLicense() {
|
|
20346
|
-
|
|
20506
|
+
import_fs10.default.rmSync(LICENSE_FILE_PATH, { force: true });
|
|
20347
20507
|
}
|
|
20348
20508
|
|
|
20349
20509
|
// ../pro/packages/pro/src/sdk/licensing/licenses/licenses.ts
|
|
@@ -20546,14 +20706,14 @@ __export(quotas_exports4, {
|
|
|
20546
20706
|
|
|
20547
20707
|
// ../pro/packages/pro/src/sdk/quotas/quotas.ts
|
|
20548
20708
|
init_src();
|
|
20549
|
-
var increment = (
|
|
20550
|
-
return tryIncrement(1,
|
|
20709
|
+
var increment = (name2, type, opts) => {
|
|
20710
|
+
return tryIncrement(1, name2, type, opts);
|
|
20551
20711
|
};
|
|
20552
|
-
var incrementMany = (change,
|
|
20553
|
-
return tryIncrement(change,
|
|
20712
|
+
var incrementMany = (change, name2, type, opts) => {
|
|
20713
|
+
return tryIncrement(change, name2, type, opts);
|
|
20554
20714
|
};
|
|
20555
|
-
var tryIncrement = async (change,
|
|
20556
|
-
await updateUsage(change,
|
|
20715
|
+
var tryIncrement = async (change, name2, type, opts = {}) => {
|
|
20716
|
+
await updateUsage(change, name2, type, {
|
|
20557
20717
|
dryRun: true,
|
|
20558
20718
|
suppressErrorLog: opts.suppressErrorLog,
|
|
20559
20719
|
id: opts.id
|
|
@@ -20562,7 +20722,7 @@ var tryIncrement = async (change, name, type, opts = {}) => {
|
|
|
20562
20722
|
if (opts.fn) {
|
|
20563
20723
|
result = await opts.fn();
|
|
20564
20724
|
}
|
|
20565
|
-
await updateUsage(change,
|
|
20725
|
+
await updateUsage(change, name2, type, {
|
|
20566
20726
|
dryRun: false,
|
|
20567
20727
|
valueFn: opts.valueFn,
|
|
20568
20728
|
suppressErrorLog: opts.suppressErrorLog,
|
|
@@ -20570,32 +20730,32 @@ var tryIncrement = async (change, name, type, opts = {}) => {
|
|
|
20570
20730
|
});
|
|
20571
20731
|
return result;
|
|
20572
20732
|
};
|
|
20573
|
-
var decrement = (
|
|
20574
|
-
return updateUsage(-1,
|
|
20733
|
+
var decrement = (name2, type, opts = {}) => {
|
|
20734
|
+
return updateUsage(-1, name2, type, opts);
|
|
20575
20735
|
};
|
|
20576
|
-
var decrementMany = (change,
|
|
20577
|
-
return updateUsage(-change,
|
|
20736
|
+
var decrementMany = (change, name2, type, opts = {}) => {
|
|
20737
|
+
return updateUsage(-change, name2, type, opts);
|
|
20578
20738
|
};
|
|
20579
|
-
var set2 = async (
|
|
20580
|
-
return quotas_exports.setUsage(value,
|
|
20739
|
+
var set2 = async (name2, type, value) => {
|
|
20740
|
+
return quotas_exports.setUsage(value, name2, type);
|
|
20581
20741
|
};
|
|
20582
|
-
var getExistingTriggers = (type,
|
|
20742
|
+
var getExistingTriggers = (type, name2, quotaUsage) => {
|
|
20583
20743
|
if (type == "static" /* STATIC */) {
|
|
20584
20744
|
const triggers = quotaUsage.usageQuota.triggers;
|
|
20585
|
-
return triggers ? triggers[
|
|
20745
|
+
return triggers ? triggers[name2] || {} : {};
|
|
20586
20746
|
} else {
|
|
20587
20747
|
const currentMonthString = quotas_exports.utils.getCurrentMonthString();
|
|
20588
20748
|
const triggers = quotaUsage.monthly[currentMonthString].triggers;
|
|
20589
|
-
return triggers ? triggers[
|
|
20749
|
+
return triggers ? triggers[name2] || {} : {};
|
|
20590
20750
|
}
|
|
20591
20751
|
};
|
|
20592
|
-
var triggerQuota2 = async (
|
|
20752
|
+
var triggerQuota2 = async (name2, quota, percentage, resetDate) => {
|
|
20593
20753
|
try {
|
|
20594
20754
|
await redlockImpl_exports.doWithLock(
|
|
20595
20755
|
{
|
|
20596
20756
|
type: "try_once" /* TRY_ONCE */,
|
|
20597
20757
|
name: "trigger_quota" /* TRIGGER_QUOTA */,
|
|
20598
|
-
resource:
|
|
20758
|
+
resource: name2,
|
|
20599
20759
|
// use the quota name for extra uniqueness on the lock
|
|
20600
20760
|
ttl: 1e4
|
|
20601
20761
|
// auto expire after 10 seconds
|
|
@@ -20615,10 +20775,10 @@ var triggerQuota2 = async (name, quota, percentage, resetDate) => {
|
|
|
20615
20775
|
logging_exports.logAlert("Error triggering quota", e);
|
|
20616
20776
|
}
|
|
20617
20777
|
};
|
|
20618
|
-
var checkTriggers = async (type,
|
|
20778
|
+
var checkTriggers = async (type, name2, totalValue, quota) => {
|
|
20619
20779
|
const usage = await getQuotaUsage();
|
|
20620
20780
|
const resetDate = type === "monthly" /* MONTHLY */ ? usage.quotaReset : void 0;
|
|
20621
|
-
const triggers = await getExistingTriggers(type,
|
|
20781
|
+
const triggers = await getExistingTriggers(type, name2, usage);
|
|
20622
20782
|
const quotaTriggers = quota.triggers;
|
|
20623
20783
|
let percentage = totalValue / quota.value * 100;
|
|
20624
20784
|
if (percentage > 100) {
|
|
@@ -20634,7 +20794,7 @@ var checkTriggers = async (type, name, totalValue, quota) => {
|
|
|
20634
20794
|
const isAtTrigger = percentage === triggerPercentage;
|
|
20635
20795
|
const sendNotification = !nextIsTriggered || isAtTrigger;
|
|
20636
20796
|
if (sendNotification) {
|
|
20637
|
-
await triggerQuota2(
|
|
20797
|
+
await triggerQuota2(name2, quota, percentage, resetDate);
|
|
20638
20798
|
}
|
|
20639
20799
|
}
|
|
20640
20800
|
} else {
|
|
@@ -20643,23 +20803,23 @@ var checkTriggers = async (type, name, totalValue, quota) => {
|
|
|
20643
20803
|
}
|
|
20644
20804
|
return triggers;
|
|
20645
20805
|
};
|
|
20646
|
-
var updateUsage = async (usageChange,
|
|
20806
|
+
var updateUsage = async (usageChange, name2, type, opts = {}) => {
|
|
20647
20807
|
let appId = null;
|
|
20648
20808
|
try {
|
|
20649
20809
|
appId = context_exports.getAppId();
|
|
20650
20810
|
} catch (err) {
|
|
20651
20811
|
}
|
|
20652
|
-
const isAppQuota = APP_QUOTA_NAMES.includes(
|
|
20812
|
+
const isAppQuota = APP_QUOTA_NAMES.includes(name2);
|
|
20653
20813
|
if (isAppQuota && !appId) {
|
|
20654
20814
|
throw new Error("App context required for quota update");
|
|
20655
20815
|
}
|
|
20656
20816
|
try {
|
|
20657
|
-
const licensedQuota = await getLicensedQuota("usage" /* USAGE */,
|
|
20817
|
+
const licensedQuota = await getLicensedQuota("usage" /* USAGE */, name2, type);
|
|
20658
20818
|
let {
|
|
20659
20819
|
total: totalValue,
|
|
20660
20820
|
app: appValue,
|
|
20661
20821
|
breakdown: breakdownValue
|
|
20662
|
-
} = await quotas_exports.getCurrentUsageValues(type,
|
|
20822
|
+
} = await quotas_exports.getCurrentUsageValues(type, name2, opts.id);
|
|
20663
20823
|
totalValue += usageChange;
|
|
20664
20824
|
if (appValue != null) {
|
|
20665
20825
|
appValue += usageChange;
|
|
@@ -20669,7 +20829,7 @@ var updateUsage = async (usageChange, name, type, opts = {}) => {
|
|
|
20669
20829
|
}
|
|
20670
20830
|
let triggers = {};
|
|
20671
20831
|
if (!opts.dryRun) {
|
|
20672
|
-
triggers = await checkTriggers(type,
|
|
20832
|
+
triggers = await checkTriggers(type, name2, totalValue, licensedQuota);
|
|
20673
20833
|
}
|
|
20674
20834
|
if (licensedQuota.value !== quotas_exports2.UNLIMITED && totalValue > licensedQuota.value && usageChange > 0) {
|
|
20675
20835
|
throw new UsageLimitError(
|
|
@@ -20692,7 +20852,7 @@ var updateUsage = async (usageChange, name, type, opts = {}) => {
|
|
|
20692
20852
|
appValue = totalValue;
|
|
20693
20853
|
}
|
|
20694
20854
|
await quotas_exports.setAllUsage(
|
|
20695
|
-
|
|
20855
|
+
name2,
|
|
20696
20856
|
type,
|
|
20697
20857
|
{
|
|
20698
20858
|
total: totalValue,
|
|
@@ -20704,30 +20864,30 @@ var updateUsage = async (usageChange, name, type, opts = {}) => {
|
|
|
20704
20864
|
);
|
|
20705
20865
|
} catch (err) {
|
|
20706
20866
|
if (!opts.suppressErrorLog) {
|
|
20707
|
-
console.error(`Error updating usage quotas for ${
|
|
20867
|
+
console.error(`Error updating usage quotas for ${name2}`, err);
|
|
20708
20868
|
}
|
|
20709
20869
|
throw err;
|
|
20710
20870
|
}
|
|
20711
20871
|
};
|
|
20712
|
-
var getLicensedQuota = async (quotaType,
|
|
20872
|
+
var getLicensedQuota = async (quotaType, name2, usageType) => {
|
|
20713
20873
|
const license = await cache_exports2.getCachedLicense();
|
|
20714
20874
|
if (!license) {
|
|
20715
20875
|
const tenantId = tenancy.getTenantId();
|
|
20716
20876
|
throw new Error("License not found for tenant id " + tenantId);
|
|
20717
20877
|
}
|
|
20718
|
-
if (usageType && isStaticQuota(quotaType, usageType,
|
|
20719
|
-
return license.quotas[quotaType][usageType][
|
|
20720
|
-
} else if (usageType && isMonthlyQuota(quotaType, usageType,
|
|
20721
|
-
return license.quotas[quotaType][usageType][
|
|
20722
|
-
} else if (isConstantQuota(quotaType,
|
|
20723
|
-
return license.quotas[quotaType][
|
|
20878
|
+
if (usageType && isStaticQuota(quotaType, usageType, name2)) {
|
|
20879
|
+
return license.quotas[quotaType][usageType][name2];
|
|
20880
|
+
} else if (usageType && isMonthlyQuota(quotaType, usageType, name2)) {
|
|
20881
|
+
return license.quotas[quotaType][usageType][name2];
|
|
20882
|
+
} else if (isConstantQuota(quotaType, name2)) {
|
|
20883
|
+
return license.quotas[quotaType][name2];
|
|
20724
20884
|
} else {
|
|
20725
20885
|
throw new Error("Invalid quota type");
|
|
20726
20886
|
}
|
|
20727
20887
|
};
|
|
20728
|
-
var usageLimitIsExceeded = async (
|
|
20888
|
+
var usageLimitIsExceeded = async (name2, type) => {
|
|
20729
20889
|
try {
|
|
20730
|
-
await updateUsage(1,
|
|
20890
|
+
await updateUsage(1, name2, type, { dryRun: true });
|
|
20731
20891
|
return false;
|
|
20732
20892
|
} catch (e) {
|
|
20733
20893
|
if (e.code === "usage_limit_exceeded" /* USAGE_LIMIT_EXCEEDED */) {
|
|
@@ -20841,19 +21001,19 @@ async function recordDayPassOnQuotas() {
|
|
|
20841
21001
|
});
|
|
20842
21002
|
}
|
|
20843
21003
|
async function recordDayPassTimeOnUser(user) {
|
|
20844
|
-
const
|
|
20845
|
-
let dbUser = await
|
|
21004
|
+
const db2 = tenancy.getGlobalDB();
|
|
21005
|
+
let dbUser = await db2.get(user._id);
|
|
20846
21006
|
const now = /* @__PURE__ */ new Date();
|
|
20847
21007
|
const nowString = (/* @__PURE__ */ new Date()).toISOString();
|
|
20848
21008
|
user.dayPassRecordedAt = nowString;
|
|
20849
21009
|
dbUser.dayPassRecordedAt = nowString;
|
|
20850
21010
|
try {
|
|
20851
21011
|
console.log(`Recording day pass for user=${user._id}`);
|
|
20852
|
-
await
|
|
21012
|
+
await db2.put(dbUser);
|
|
20853
21013
|
} catch (e) {
|
|
20854
21014
|
if (e.status === 409) {
|
|
20855
21015
|
console.warn(`Conflict recording day pass for user=${user._id}`);
|
|
20856
|
-
dbUser = await
|
|
21016
|
+
dbUser = await db2.get(user._id);
|
|
20857
21017
|
if (!dbUser.dayPassRecordedAt || new Date(dbUser.dayPassRecordedAt).getDay() !== now.getDay()) {
|
|
20858
21018
|
console.error(`Day pass not recorded for user=${user._id}`);
|
|
20859
21019
|
throw e;
|
|
@@ -21102,9 +21262,9 @@ function generateAutomationLogID(isoDate, status2, automationId) {
|
|
|
21102
21262
|
return `${DocumentType5.AUTOMATION_LOG}${SEPARATOR7}${isoDate}${SEPARATOR7}${automationId}${SEPARATOR7}${status2}`;
|
|
21103
21263
|
}
|
|
21104
21264
|
async function getAllLogs(startDate, endDate, opts = { docs: true }) {
|
|
21105
|
-
let
|
|
21106
|
-
if (!await
|
|
21107
|
-
|
|
21265
|
+
let db2 = context_exports.getProdAppDB();
|
|
21266
|
+
if (!await db2.exists()) {
|
|
21267
|
+
db2 = context_exports.getDevAppDB();
|
|
21108
21268
|
}
|
|
21109
21269
|
let optional = { status: opts.status };
|
|
21110
21270
|
let limit = (opts == null ? void 0 : opts.limit) ? opts.limit : (opts == null ? void 0 : opts.paginate) ? GENERIC_PAGE_SIZE + 1 : void 0;
|
|
@@ -21115,16 +21275,16 @@ async function getAllLogs(startDate, endDate, opts = { docs: true }) {
|
|
|
21115
21275
|
if (opts == null ? void 0 : opts.page) {
|
|
21116
21276
|
params2.startkey = opts.page;
|
|
21117
21277
|
}
|
|
21118
|
-
let response = await
|
|
21278
|
+
let response = await db2.allDocs(params2);
|
|
21119
21279
|
return pagination2(response, {
|
|
21120
21280
|
paginate: opts == null ? void 0 : opts.paginate,
|
|
21121
21281
|
pageSize: GENERIC_PAGE_SIZE
|
|
21122
21282
|
});
|
|
21123
21283
|
}
|
|
21124
21284
|
async function getLogsByView(startDate, endDate, viewParams = {}) {
|
|
21125
|
-
let
|
|
21126
|
-
if (!await
|
|
21127
|
-
|
|
21285
|
+
let db2 = context_exports.getProdAppDB();
|
|
21286
|
+
if (!await db2.exists()) {
|
|
21287
|
+
db2 = context_exports.getDevAppDB();
|
|
21128
21288
|
}
|
|
21129
21289
|
let response;
|
|
21130
21290
|
try {
|
|
@@ -21139,7 +21299,7 @@ async function getLogsByView(startDate, endDate, viewParams = {}) {
|
|
|
21139
21299
|
if (viewParams == null ? void 0 : viewParams.page) {
|
|
21140
21300
|
params2.startkey = viewParams.page;
|
|
21141
21301
|
}
|
|
21142
|
-
response = await
|
|
21302
|
+
response = await db2.query(getQueryIndex3(ViewName6.AUTOMATION_LOGS), params2);
|
|
21143
21303
|
} catch (err) {
|
|
21144
21304
|
if (err != null && (err.name === "not_found" || err.error === "not_found")) {
|
|
21145
21305
|
await createLogByAutomationView();
|
|
@@ -21151,9 +21311,9 @@ async function getLogsByView(startDate, endDate, viewParams = {}) {
|
|
|
21151
21311
|
return pagination2(response);
|
|
21152
21312
|
}
|
|
21153
21313
|
async function writeLog(automation, results) {
|
|
21154
|
-
const
|
|
21314
|
+
const db2 = context_exports.getProdAppDB();
|
|
21155
21315
|
const automationId = automation._id;
|
|
21156
|
-
const
|
|
21316
|
+
const name2 = automation.name;
|
|
21157
21317
|
const status2 = getStatus(results);
|
|
21158
21318
|
const isoDate = (/* @__PURE__ */ new Date()).toISOString();
|
|
21159
21319
|
const id = generateAutomationLogID(isoDate, status2, automationId);
|
|
@@ -21162,23 +21322,23 @@ async function writeLog(automation, results) {
|
|
|
21162
21322
|
...results,
|
|
21163
21323
|
automationId,
|
|
21164
21324
|
status: status2,
|
|
21165
|
-
automationName:
|
|
21325
|
+
automationName: name2,
|
|
21166
21326
|
createdAt: isoDate,
|
|
21167
21327
|
_id: id
|
|
21168
21328
|
};
|
|
21169
|
-
await
|
|
21329
|
+
await db2.put(log);
|
|
21170
21330
|
return id;
|
|
21171
21331
|
}
|
|
21172
21332
|
async function updateAppMetadataWithErrors(logIds, { clearing } = { clearing: false }) {
|
|
21173
|
-
const
|
|
21333
|
+
const db2 = context_exports.getProdAppDB();
|
|
21174
21334
|
await backOff(async () => {
|
|
21175
|
-
const
|
|
21335
|
+
const metadata2 = await db2.get(db_exports.DocumentType.APP_METADATA);
|
|
21176
21336
|
for (let logId of logIds) {
|
|
21177
21337
|
const parts = logId.split(db_exports.SEPARATOR);
|
|
21178
21338
|
const autoId = `${parts[parts.length - 3]}${db_exports.SEPARATOR}${parts[parts.length - 2]}`;
|
|
21179
21339
|
let errors = {};
|
|
21180
|
-
if (
|
|
21181
|
-
errors =
|
|
21340
|
+
if (metadata2.automationErrors) {
|
|
21341
|
+
errors = metadata2.automationErrors;
|
|
21182
21342
|
}
|
|
21183
21343
|
if (!Array.isArray(errors[autoId])) {
|
|
21184
21344
|
errors[autoId] = [];
|
|
@@ -21192,10 +21352,10 @@ async function updateAppMetadataWithErrors(logIds, { clearing } = { clearing: fa
|
|
|
21192
21352
|
if (errors[autoId].length === 0) {
|
|
21193
21353
|
delete errors[autoId];
|
|
21194
21354
|
}
|
|
21195
|
-
|
|
21355
|
+
metadata2.automationErrors = errors;
|
|
21196
21356
|
}
|
|
21197
|
-
await
|
|
21198
|
-
await cache_exports.app.invalidateAppMetadata(
|
|
21357
|
+
await db2.put(metadata2);
|
|
21358
|
+
await cache_exports.app.invalidateAppMetadata(metadata2.appId, metadata2);
|
|
21199
21359
|
}, "Failed to update app metadata with automation log error");
|
|
21200
21360
|
}
|
|
21201
21361
|
async function getExpiredLogs() {
|
|
@@ -21211,29 +21371,29 @@ async function getExpiredLogs() {
|
|
|
21211
21371
|
}
|
|
21212
21372
|
}
|
|
21213
21373
|
async function clearOldHistory() {
|
|
21214
|
-
const
|
|
21374
|
+
const db2 = context_exports.getProdAppDB();
|
|
21215
21375
|
try {
|
|
21216
21376
|
const expired = await getExpiredLogs();
|
|
21217
21377
|
if (!expired.data || expired.data.length === 0) {
|
|
21218
21378
|
return;
|
|
21219
21379
|
}
|
|
21220
|
-
const toDelete = expired.data.map((
|
|
21221
|
-
_id:
|
|
21222
|
-
_rev:
|
|
21380
|
+
const toDelete = expired.data.map((doc2) => ({
|
|
21381
|
+
_id: doc2.id,
|
|
21382
|
+
_rev: doc2.value.rev,
|
|
21223
21383
|
_deleted: true
|
|
21224
21384
|
}));
|
|
21225
|
-
const errorLogIds = expired.data.filter((
|
|
21226
|
-
const parts =
|
|
21385
|
+
const errorLogIds = expired.data.filter((doc2) => {
|
|
21386
|
+
const parts = doc2.id.split(db_exports.SEPARATOR);
|
|
21227
21387
|
const status2 = parts[parts.length - 1];
|
|
21228
21388
|
return status2 === "error" /* ERROR */;
|
|
21229
|
-
}).map((
|
|
21230
|
-
await
|
|
21389
|
+
}).map((doc2) => doc2.id);
|
|
21390
|
+
await db2.bulkDocs(toDelete);
|
|
21231
21391
|
if (errorLogIds.length) {
|
|
21232
21392
|
await updateAppMetadataWithErrors(errorLogIds, { clearing: true });
|
|
21233
21393
|
}
|
|
21234
21394
|
} catch (err) {
|
|
21235
21395
|
logging_exports.logAlert(
|
|
21236
|
-
`Failed to cleanup automation log history - Database "${
|
|
21396
|
+
`Failed to cleanup automation log history - Database "${db2.name}"`,
|
|
21237
21397
|
err
|
|
21238
21398
|
);
|
|
21239
21399
|
}
|
|
@@ -21406,10 +21566,10 @@ async function get7(id) {
|
|
|
21406
21566
|
async function getBulk2(ids, opts = { enriched: true }) {
|
|
21407
21567
|
return await groups_exports.getBulk(ids, opts);
|
|
21408
21568
|
}
|
|
21409
|
-
async function guardNameAvailility(
|
|
21410
|
-
const existingGroup = await groups_exports.getByName(
|
|
21569
|
+
async function guardNameAvailility(name2) {
|
|
21570
|
+
const existingGroup = await groups_exports.getByName(name2);
|
|
21411
21571
|
if (existingGroup) {
|
|
21412
|
-
throw new GroupNameUnavailableError(
|
|
21572
|
+
throw new GroupNameUnavailableError(name2);
|
|
21413
21573
|
}
|
|
21414
21574
|
}
|
|
21415
21575
|
async function save4(group) {
|
|
@@ -21548,16 +21708,16 @@ __export(plugins_exports, {
|
|
|
21548
21708
|
init_src();
|
|
21549
21709
|
|
|
21550
21710
|
// ../pro/packages/pro/src/utilities/fileSystem.ts
|
|
21551
|
-
var
|
|
21552
|
-
var
|
|
21553
|
-
function loadJSFile(
|
|
21554
|
-
return
|
|
21711
|
+
var import_fs11 = __toESM(require("fs"));
|
|
21712
|
+
var import_path12 = require("path");
|
|
21713
|
+
function loadJSFile(directory2, name2) {
|
|
21714
|
+
return import_fs11.default.readFileSync((0, import_path12.join)(directory2, name2), "utf8");
|
|
21555
21715
|
}
|
|
21556
21716
|
|
|
21557
21717
|
// ../pro/packages/pro/src/sdk/plugins/index.ts
|
|
21558
21718
|
async function storePlugin(metadata, directory, source) {
|
|
21559
21719
|
const db = tenancy.getGlobalDB();
|
|
21560
|
-
const version = metadata.package.version, name = metadata.package.name, description = metadata.package.description,
|
|
21720
|
+
const version = metadata.package.version, name = metadata.package.name, description = metadata.package.description, hash = metadata.schema.hash;
|
|
21561
21721
|
const bucketPath = objectStore_exports2.getPluginS3Dir(name);
|
|
21562
21722
|
const files = await objectStore_exports2.uploadDirectory(
|
|
21563
21723
|
objectStore_exports2.ObjectStoreBuckets.PLUGINS,
|
|
@@ -21572,8 +21732,7 @@ async function storePlugin(metadata, directory, source) {
|
|
|
21572
21732
|
if (metadata.schema.type === "datasource" /* DATASOURCE */) {
|
|
21573
21733
|
const js = loadJSFile(directory, jsFile.name);
|
|
21574
21734
|
try {
|
|
21575
|
-
;
|
|
21576
|
-
(0, eval)(js);
|
|
21735
|
+
eval(js);
|
|
21577
21736
|
} catch (err) {
|
|
21578
21737
|
const message = (err == null ? void 0 : err.message) ? err.message : JSON.stringify(err);
|
|
21579
21738
|
throw new Error(`JS invalid: ${message}`);
|
|
@@ -21594,7 +21753,7 @@ async function storePlugin(metadata, directory, source) {
|
|
|
21594
21753
|
...metadata,
|
|
21595
21754
|
name,
|
|
21596
21755
|
version,
|
|
21597
|
-
hash
|
|
21756
|
+
hash,
|
|
21598
21757
|
description
|
|
21599
21758
|
};
|
|
21600
21759
|
if (iconFileName) {
|
|
@@ -21606,7 +21765,7 @@ async function storePlugin(metadata, directory, source) {
|
|
|
21606
21765
|
source
|
|
21607
21766
|
};
|
|
21608
21767
|
}
|
|
21609
|
-
const
|
|
21768
|
+
const write = async () => {
|
|
21610
21769
|
const response = await db.put(doc);
|
|
21611
21770
|
await events_exports.plugin.imported(doc);
|
|
21612
21771
|
return {
|
|
@@ -21615,21 +21774,21 @@ async function storePlugin(metadata, directory, source) {
|
|
|
21615
21774
|
};
|
|
21616
21775
|
};
|
|
21617
21776
|
if (!rev) {
|
|
21618
|
-
return await addPlugin(
|
|
21777
|
+
return await addPlugin(write);
|
|
21619
21778
|
} else {
|
|
21620
|
-
return await
|
|
21779
|
+
return await write();
|
|
21621
21780
|
}
|
|
21622
21781
|
}
|
|
21623
|
-
async function deletePlugin(
|
|
21624
|
-
const
|
|
21782
|
+
async function deletePlugin(pluginId2) {
|
|
21783
|
+
const db2 = tenancy.getGlobalDB();
|
|
21625
21784
|
try {
|
|
21626
|
-
const plugin = await
|
|
21627
|
-
const
|
|
21785
|
+
const plugin = await db2.get(pluginId2);
|
|
21786
|
+
const bucketPath2 = objectStore_exports2.getPluginS3Dir(plugin.name);
|
|
21628
21787
|
await objectStore_exports2.deleteFolder(
|
|
21629
21788
|
objectStore_exports2.ObjectStoreBuckets.PLUGINS,
|
|
21630
|
-
|
|
21789
|
+
bucketPath2
|
|
21631
21790
|
);
|
|
21632
|
-
await
|
|
21791
|
+
await db2.remove(pluginId2, plugin._rev);
|
|
21633
21792
|
await events_exports.plugin.deleted(plugin);
|
|
21634
21793
|
await removePlugin();
|
|
21635
21794
|
} catch (err) {
|
|
@@ -21638,9 +21797,9 @@ async function deletePlugin(pluginId) {
|
|
|
21638
21797
|
}
|
|
21639
21798
|
}
|
|
21640
21799
|
async function checkPluginQuotas() {
|
|
21641
|
-
const
|
|
21800
|
+
const db2 = tenancy.getGlobalDB();
|
|
21642
21801
|
try {
|
|
21643
|
-
const allPlugins = await
|
|
21802
|
+
const allPlugins = await db2.allDocs(db_exports.getPluginParams());
|
|
21644
21803
|
const pluginCount = allPlugins.rows.length;
|
|
21645
21804
|
console.log(`Syncing plugin count: ${pluginCount}`);
|
|
21646
21805
|
await updatePluginCount(pluginCount);
|
|
@@ -21666,12 +21825,12 @@ function isEncryptionKeyAvailable() {
|
|
|
21666
21825
|
return !!environment_default2.ENCRYPTION_KEY;
|
|
21667
21826
|
}
|
|
21668
21827
|
async function fetch13() {
|
|
21669
|
-
const
|
|
21670
|
-
return Object.keys(
|
|
21828
|
+
const doc2 = await environmentVariables_exports.get();
|
|
21829
|
+
return Object.keys(doc2.variables);
|
|
21671
21830
|
}
|
|
21672
21831
|
async function fetchValues(environment3) {
|
|
21673
|
-
const
|
|
21674
|
-
const decrypted =
|
|
21832
|
+
const doc2 = await environmentVariables_exports.get();
|
|
21833
|
+
const decrypted = doc2.variables;
|
|
21675
21834
|
const output = {};
|
|
21676
21835
|
for (let [key, value] of Object.entries(decrypted)) {
|
|
21677
21836
|
switch (environment3) {
|
|
@@ -21693,9 +21852,9 @@ async function changeValues(cb) {
|
|
|
21693
21852
|
"User does not have access to environment variables feature."
|
|
21694
21853
|
);
|
|
21695
21854
|
}
|
|
21696
|
-
const
|
|
21697
|
-
|
|
21698
|
-
await environmentVariables_exports.update(
|
|
21855
|
+
const doc2 = await environmentVariables_exports.get();
|
|
21856
|
+
doc2.variables = cb(doc2.variables);
|
|
21857
|
+
await environmentVariables_exports.update(doc2);
|
|
21699
21858
|
}
|
|
21700
21859
|
async function update2(varName, value) {
|
|
21701
21860
|
const checkName = isValid(varName);
|
|
@@ -21724,7 +21883,7 @@ __export(auditLogs_exports2, {
|
|
|
21724
21883
|
definitions: () => definitions,
|
|
21725
21884
|
download: () => download,
|
|
21726
21885
|
fetch: () => fetch14,
|
|
21727
|
-
write: () =>
|
|
21886
|
+
write: () => write2
|
|
21728
21887
|
});
|
|
21729
21888
|
|
|
21730
21889
|
// ../pro/packages/pro/src/sdk/auditLogs/auditLogs.ts
|
|
@@ -21736,15 +21895,15 @@ var MemoryStream2 = require("memorystream");
|
|
|
21736
21895
|
function generateAuditLogID(timestamp) {
|
|
21737
21896
|
return `${"al" /* AUDIT_LOG */}${SEPARATOR}${timestamp}${SEPARATOR}${utils_exports2.newid()}`;
|
|
21738
21897
|
}
|
|
21739
|
-
async function save5(
|
|
21740
|
-
if (!
|
|
21741
|
-
|
|
21898
|
+
async function save5(doc2) {
|
|
21899
|
+
if (!doc2._id) {
|
|
21900
|
+
doc2._id = generateAuditLogID(doc2.timestamp);
|
|
21742
21901
|
}
|
|
21743
21902
|
try {
|
|
21744
|
-
const
|
|
21745
|
-
const response = await
|
|
21903
|
+
const db2 = context_exports.getAuditLogsDB();
|
|
21904
|
+
const response = await db2.put(doc2);
|
|
21746
21905
|
return {
|
|
21747
|
-
...
|
|
21906
|
+
...doc2,
|
|
21748
21907
|
_rev: response.rev
|
|
21749
21908
|
};
|
|
21750
21909
|
} catch (err) {
|
|
@@ -21769,12 +21928,12 @@ async function search(search3, bookmark) {
|
|
|
21769
21928
|
);
|
|
21770
21929
|
}
|
|
21771
21930
|
function dump(params2) {
|
|
21772
|
-
const
|
|
21931
|
+
const db2 = context_exports.getAuditLogsDB();
|
|
21773
21932
|
const stream3 = new MemoryStream2();
|
|
21774
|
-
const promise =
|
|
21775
|
-
filter: (
|
|
21933
|
+
const promise = db2.dump(stream3, {
|
|
21934
|
+
filter: (doc2) => {
|
|
21776
21935
|
var _a;
|
|
21777
|
-
const auditLog =
|
|
21936
|
+
const auditLog = doc2;
|
|
21778
21937
|
if (!((_a = auditLog._id) == null ? void 0 : _a.startsWith("al" /* AUDIT_LOG */))) {
|
|
21779
21938
|
return false;
|
|
21780
21939
|
}
|
|
@@ -21792,7 +21951,7 @@ function dump(params2) {
|
|
|
21792
21951
|
allMatched = allMatched && auditLog.timestamp >= params2.startDate && auditLog.timestamp <= params2.endDate;
|
|
21793
21952
|
}
|
|
21794
21953
|
if (params2.fullSearch) {
|
|
21795
|
-
const json = JSON.stringify(
|
|
21954
|
+
const json = JSON.stringify(doc2);
|
|
21796
21955
|
allMatched = allMatched && json.includes(params2.fullSearch);
|
|
21797
21956
|
}
|
|
21798
21957
|
return allMatched;
|
|
@@ -21803,8 +21962,8 @@ function dump(params2) {
|
|
|
21803
21962
|
const json = JSON.parse(Buffer.from(data).toString());
|
|
21804
21963
|
if (Array.isArray(json.docs)) {
|
|
21805
21964
|
let str = "";
|
|
21806
|
-
for (let
|
|
21807
|
-
str += JSON.stringify(
|
|
21965
|
+
for (let doc2 of json.docs) {
|
|
21966
|
+
str += JSON.stringify(doc2) + "\n";
|
|
21808
21967
|
}
|
|
21809
21968
|
returnStream.write(str);
|
|
21810
21969
|
}
|
|
@@ -21910,12 +22069,12 @@ async function auditLogsEnabled() {
|
|
|
21910
22069
|
const license = await licensing_exports.cache.getCachedLicense();
|
|
21911
22070
|
return license.features.includes("auditLogs" /* AUDIT_LOGS */);
|
|
21912
22071
|
}
|
|
21913
|
-
function getEventFriendlyName(event,
|
|
22072
|
+
function getEventFriendlyName(event, metadata2) {
|
|
21914
22073
|
const friendly = AuditedEventFriendlyName[event];
|
|
21915
22074
|
if (!friendly) {
|
|
21916
22075
|
throw new Error("No friendly name found.");
|
|
21917
22076
|
}
|
|
21918
|
-
let processed = processStringSync(friendly,
|
|
22077
|
+
let processed = processStringSync(friendly, metadata2);
|
|
21919
22078
|
if (processed.includes(`""`)) {
|
|
21920
22079
|
processed = removeTemplateStrings(friendly);
|
|
21921
22080
|
}
|
|
@@ -21923,29 +22082,29 @@ function getEventFriendlyName(event, metadata) {
|
|
|
21923
22082
|
}
|
|
21924
22083
|
|
|
21925
22084
|
// ../pro/packages/pro/src/sdk/auditLogs/auditLogs.ts
|
|
21926
|
-
async function
|
|
22085
|
+
async function write2(event, metadata2, opts) {
|
|
21927
22086
|
if (!await auditLogsEnabled() || !utils_exports2.isAudited(event)) {
|
|
21928
22087
|
return;
|
|
21929
22088
|
}
|
|
21930
|
-
const friendly = getEventFriendlyName(event,
|
|
22089
|
+
const friendly = getEventFriendlyName(event, metadata2);
|
|
21931
22090
|
let date = /* @__PURE__ */ new Date();
|
|
21932
22091
|
if (opts == null ? void 0 : opts.timestamp) {
|
|
21933
22092
|
date = new Date(opts.timestamp);
|
|
21934
22093
|
}
|
|
21935
|
-
const
|
|
22094
|
+
const doc2 = {
|
|
21936
22095
|
timestamp: date.toISOString(),
|
|
21937
22096
|
event,
|
|
21938
22097
|
name: friendly,
|
|
21939
22098
|
userId: (opts == null ? void 0 : opts.userId) || AuditLogSystemUser,
|
|
21940
22099
|
metadata: {
|
|
21941
|
-
...
|
|
22100
|
+
...metadata2,
|
|
21942
22101
|
...opts == null ? void 0 : opts.hostInfo
|
|
21943
22102
|
}
|
|
21944
22103
|
};
|
|
21945
22104
|
const fallback = {};
|
|
21946
22105
|
try {
|
|
21947
22106
|
if (opts == null ? void 0 : opts.appId) {
|
|
21948
|
-
|
|
22107
|
+
doc2.appId = db_exports.getProdAppID(opts.appId);
|
|
21949
22108
|
const appMetadata = await cache_exports.app.getAppMetadata(opts.appId);
|
|
21950
22109
|
fallback.appName = appMetadata.name;
|
|
21951
22110
|
}
|
|
@@ -21959,8 +22118,8 @@ async function write(event, metadata, opts) {
|
|
|
21959
22118
|
err
|
|
21960
22119
|
);
|
|
21961
22120
|
}
|
|
21962
|
-
|
|
21963
|
-
return await save5(
|
|
22121
|
+
doc2.fallback = fallback;
|
|
22122
|
+
return await save5(doc2);
|
|
21964
22123
|
}
|
|
21965
22124
|
async function enrich(logs) {
|
|
21966
22125
|
const allUserIds = logs.map((log) => log.userId);
|
|
@@ -22031,8 +22190,8 @@ function getBackupQueue() {
|
|
|
22031
22190
|
}
|
|
22032
22191
|
|
|
22033
22192
|
// ../pro/packages/pro/src/sdk/backups/backup.ts
|
|
22034
|
-
async function storeAppBackupMetadata2(
|
|
22035
|
-
return backups_exports.storeAppBackupMetadata(
|
|
22193
|
+
async function storeAppBackupMetadata2(metadata2, opts = {}) {
|
|
22194
|
+
return backups_exports.storeAppBackupMetadata(metadata2, opts);
|
|
22036
22195
|
}
|
|
22037
22196
|
function getTimestamps(status2) {
|
|
22038
22197
|
const timestamp = (/* @__PURE__ */ new Date()).toISOString();
|
|
@@ -22046,7 +22205,7 @@ function getTimestamps(status2) {
|
|
|
22046
22205
|
return { timestamp, createdAt: timestamp };
|
|
22047
22206
|
}
|
|
22048
22207
|
}
|
|
22049
|
-
async function updateBackupStatus(id,
|
|
22208
|
+
async function updateBackupStatus(id, rev2, status2, contents, filename) {
|
|
22050
22209
|
const backup = await getAppBackup(id);
|
|
22051
22210
|
return await backups_exports.storeAppBackupMetadata(
|
|
22052
22211
|
{
|
|
@@ -22056,10 +22215,10 @@ async function updateBackupStatus(id, rev, status2, contents, filename) {
|
|
|
22056
22215
|
status: status2,
|
|
22057
22216
|
type: "backup" /* BACKUP */
|
|
22058
22217
|
},
|
|
22059
|
-
{ filename, docId: id, docRev:
|
|
22218
|
+
{ filename, docId: id, docRev: rev2 }
|
|
22060
22219
|
);
|
|
22061
22220
|
}
|
|
22062
|
-
async function updateRestoreStatus(id,
|
|
22221
|
+
async function updateRestoreStatus(id, rev2, status2) {
|
|
22063
22222
|
const restore = await getAppBackup(id);
|
|
22064
22223
|
return await backups_exports.storeAppBackupMetadata(
|
|
22065
22224
|
{
|
|
@@ -22069,7 +22228,7 @@ async function updateRestoreStatus(id, rev, status2) {
|
|
|
22069
22228
|
type: "restore" /* RESTORE */,
|
|
22070
22229
|
trigger: "manual" /* MANUAL */
|
|
22071
22230
|
},
|
|
22072
|
-
{ docId: id, docRev:
|
|
22231
|
+
{ docId: id, docRev: rev2 }
|
|
22073
22232
|
);
|
|
22074
22233
|
}
|
|
22075
22234
|
async function getAppBackup(backupId) {
|
|
@@ -22079,11 +22238,11 @@ async function updateAppBackup(backupId, backupName) {
|
|
|
22079
22238
|
return backups_exports.updateAppBackupMetadata(backupId, backupName);
|
|
22080
22239
|
}
|
|
22081
22240
|
async function deleteAppBackup(backupId) {
|
|
22082
|
-
const
|
|
22083
|
-
if (
|
|
22241
|
+
const metadata2 = await backups_exports.getAppBackupMetadata(backupId);
|
|
22242
|
+
if (metadata2.filename) {
|
|
22084
22243
|
await objectStore_exports2.deleteFile(
|
|
22085
22244
|
objectStore_exports2.ObjectStoreBuckets.BACKUPS,
|
|
22086
|
-
|
|
22245
|
+
metadata2.filename
|
|
22087
22246
|
);
|
|
22088
22247
|
}
|
|
22089
22248
|
return backups_exports.deleteAppBackupMetadata(backupId);
|
|
@@ -22092,15 +22251,15 @@ async function fetchAppBackups2(appId, opts) {
|
|
|
22092
22251
|
return backups_exports.fetchAppBackups(appId, opts);
|
|
22093
22252
|
}
|
|
22094
22253
|
async function downloadAppBackup(backupId) {
|
|
22095
|
-
const
|
|
22096
|
-
if (!
|
|
22254
|
+
const metadata2 = await backups_exports.getAppBackupMetadata(backupId);
|
|
22255
|
+
if (!metadata2.filename) {
|
|
22097
22256
|
throw new Error("Backup incomplete - cannot download.");
|
|
22098
22257
|
}
|
|
22099
22258
|
const path2 = await objectStore_exports2.retrieveToTmp(
|
|
22100
22259
|
objectStore_exports2.ObjectStoreBuckets.BACKUPS,
|
|
22101
|
-
|
|
22260
|
+
metadata2.filename
|
|
22102
22261
|
);
|
|
22103
|
-
return { metadata, path: path2 };
|
|
22262
|
+
return { metadata: metadata2, path: path2 };
|
|
22104
22263
|
}
|
|
22105
22264
|
async function triggerAppBackup(appId, trigger, opts = {}) {
|
|
22106
22265
|
let backup;
|
|
@@ -22139,7 +22298,7 @@ async function triggerAppBackup(appId, trigger, opts = {}) {
|
|
|
22139
22298
|
return backup.id;
|
|
22140
22299
|
}
|
|
22141
22300
|
async function triggerAppRestore(appId, backupId, nameForBackup, createdBy) {
|
|
22142
|
-
const
|
|
22301
|
+
const metadata2 = await getAppBackup(backupId);
|
|
22143
22302
|
let restore;
|
|
22144
22303
|
try {
|
|
22145
22304
|
restore = await storeAppBackupMetadata2({
|
|
@@ -22166,7 +22325,7 @@ async function triggerAppRestore(appId, backupId, nameForBackup, createdBy) {
|
|
|
22166
22325
|
createdBy
|
|
22167
22326
|
}
|
|
22168
22327
|
});
|
|
22169
|
-
return { restoreId: restore.id, metadata };
|
|
22328
|
+
return { restoreId: restore.id, metadata: metadata2 };
|
|
22170
22329
|
}
|
|
22171
22330
|
var pkg = {
|
|
22172
22331
|
isEnabled: isBackupsEnabled,
|
|
@@ -22189,7 +22348,7 @@ __export(processing_exports, {
|
|
|
22189
22348
|
init: () => init12
|
|
22190
22349
|
});
|
|
22191
22350
|
init_src();
|
|
22192
|
-
var
|
|
22351
|
+
var import_fs12 = __toESM(require("fs"));
|
|
22193
22352
|
async function init12(opts) {
|
|
22194
22353
|
await getBackupQueue().process(async (job) => {
|
|
22195
22354
|
const data = job.data;
|
|
@@ -22257,8 +22416,8 @@ async function runBackup(trigger, tenantId, appId, opts) {
|
|
|
22257
22416
|
}
|
|
22258
22417
|
});
|
|
22259
22418
|
await updateMetadata("complete" /* COMPLETE */, { filename, contents });
|
|
22260
|
-
if (
|
|
22261
|
-
|
|
22419
|
+
if (import_fs12.default.existsSync(tarPath)) {
|
|
22420
|
+
import_fs12.default.rmSync(tarPath);
|
|
22262
22421
|
}
|
|
22263
22422
|
} catch (err) {
|
|
22264
22423
|
logging_exports.logAlert("App backup error", err);
|
|
@@ -22271,7 +22430,7 @@ async function importProcessor(job, opts) {
|
|
|
22271
22430
|
const tenantId = tenancy.getTenantIDFromAppID(appId);
|
|
22272
22431
|
return tenancy.doInTenant(tenantId, async () => {
|
|
22273
22432
|
const devAppId = db_exports.getDevAppID(appId);
|
|
22274
|
-
const { rev } = await backup_default2.updateRestoreStatus(
|
|
22433
|
+
const { rev: rev2 } = await backup_default2.updateRestoreStatus(
|
|
22275
22434
|
data.docId,
|
|
22276
22435
|
data.docRev,
|
|
22277
22436
|
"started" /* STARTED */
|
|
@@ -22296,23 +22455,23 @@ async function importProcessor(job, opts) {
|
|
|
22296
22455
|
logging_exports.logAlert("App restore error", err);
|
|
22297
22456
|
status2 = "failed" /* FAILED */;
|
|
22298
22457
|
}
|
|
22299
|
-
await backup_default2.updateRestoreStatus(data.docId,
|
|
22458
|
+
await backup_default2.updateRestoreStatus(data.docId, rev2, status2);
|
|
22300
22459
|
});
|
|
22301
22460
|
}
|
|
22302
22461
|
async function exportProcessor(job, opts) {
|
|
22303
22462
|
const data = job.data;
|
|
22304
|
-
const appId = data.appId, trigger = data.export.trigger,
|
|
22463
|
+
const appId = data.appId, trigger = data.export.trigger, name2 = data.export.name;
|
|
22305
22464
|
const tenantId = tenancy.getTenantIDFromAppID(appId);
|
|
22306
22465
|
await tenancy.doInTenant(tenantId, async () => {
|
|
22307
|
-
const { rev } = await backup_default2.updateBackupStatus(
|
|
22466
|
+
const { rev: rev2 } = await backup_default2.updateBackupStatus(
|
|
22308
22467
|
data.docId,
|
|
22309
22468
|
data.docRev,
|
|
22310
22469
|
"started" /* STARTED */
|
|
22311
22470
|
);
|
|
22312
22471
|
return runBackup(trigger, tenantId, appId, {
|
|
22313
22472
|
processing: opts,
|
|
22314
|
-
doc: { id: data.docId, rev },
|
|
22315
|
-
name
|
|
22473
|
+
doc: { id: data.docId, rev: rev2 },
|
|
22474
|
+
name: name2
|
|
22316
22475
|
});
|
|
22317
22476
|
});
|
|
22318
22477
|
}
|
|
@@ -22359,8 +22518,8 @@ var ScimUserService = class {
|
|
|
22359
22518
|
constructor(config) {
|
|
22360
22519
|
this.get = async (params2) => {
|
|
22361
22520
|
var _a;
|
|
22362
|
-
const
|
|
22363
|
-
const builder2 = new db_exports.QueryBuilder(
|
|
22521
|
+
const db2 = tenancy.getGlobalDB();
|
|
22522
|
+
const builder2 = new db_exports.QueryBuilder(db2.name, "user" /* USER */);
|
|
22364
22523
|
builder2.setIndexBuilder(db_exports.searchIndexes.createUserIndex);
|
|
22365
22524
|
builder2.setLimit(params2.pageSize);
|
|
22366
22525
|
builder2.addEqual("scimInfo.isSync", true);
|
|
@@ -22496,9 +22655,9 @@ var fetch15 = async (ctx) => {
|
|
|
22496
22655
|
ctx.body = { data: await fetch12() };
|
|
22497
22656
|
};
|
|
22498
22657
|
var destroy4 = async (ctx) => {
|
|
22499
|
-
const { id, rev } = ctx.params;
|
|
22658
|
+
const { id, rev: rev2 } = ctx.params;
|
|
22500
22659
|
try {
|
|
22501
|
-
await remove2(id,
|
|
22660
|
+
await remove2(id, rev2);
|
|
22502
22661
|
ctx.body = { message: "Group deleted successfully" };
|
|
22503
22662
|
} catch (err) {
|
|
22504
22663
|
ctx.throw(err.status, err);
|
|
@@ -22543,13 +22702,13 @@ async function fetch16(ctx) {
|
|
|
22543
22702
|
};
|
|
22544
22703
|
}
|
|
22545
22704
|
async function create3(ctx) {
|
|
22546
|
-
const { name, production, development } = ctx.request.body;
|
|
22547
|
-
await environmentVariables_exports2.update(
|
|
22705
|
+
const { name: name2, production, development } = ctx.request.body;
|
|
22706
|
+
await environmentVariables_exports2.update(name2, { production, development });
|
|
22548
22707
|
const environments = ["production" /* PRODUCTION */];
|
|
22549
22708
|
if (production !== development) {
|
|
22550
22709
|
environments.push("development" /* DEVELOPMENT */);
|
|
22551
22710
|
}
|
|
22552
|
-
await events_exports.environmentVariable.created(
|
|
22711
|
+
await events_exports.environmentVariable.created(name2, environments);
|
|
22553
22712
|
ctx.status = 200;
|
|
22554
22713
|
}
|
|
22555
22714
|
async function update4(ctx) {
|
|
@@ -22711,7 +22870,7 @@ router3.post(
|
|
|
22711
22870
|
|
|
22712
22871
|
// ../pro/packages/pro/src/api/controllers/apps/backups.ts
|
|
22713
22872
|
init_src();
|
|
22714
|
-
var
|
|
22873
|
+
var import_fs13 = __toESM(require("fs"));
|
|
22715
22874
|
async function checkAppID(ctx, appId) {
|
|
22716
22875
|
if (!await utils_exports5.appExists(appId)) {
|
|
22717
22876
|
ctx.throw(400, `Provided app ID: ${appId} - is invalid.`);
|
|
@@ -22795,9 +22954,9 @@ async function downloadBackup(ctx) {
|
|
|
22795
22954
|
const appId = ctx.params.appId;
|
|
22796
22955
|
await checkAppID(ctx, appId);
|
|
22797
22956
|
const backupId = ctx.params.backupId;
|
|
22798
|
-
const { metadata, path: path2 } = await backups_default2.downloadAppBackup(backupId);
|
|
22799
|
-
ctx.attachment(`backup-${
|
|
22800
|
-
ctx.body =
|
|
22957
|
+
const { metadata: metadata2, path: path2 } = await backups_default2.downloadAppBackup(backupId);
|
|
22958
|
+
ctx.attachment(`backup-${metadata2.timestamp}.tar.gz`);
|
|
22959
|
+
ctx.body = import_fs13.default.createReadStream(path2);
|
|
22801
22960
|
}
|
|
22802
22961
|
|
|
22803
22962
|
// ../pro/packages/pro/src/api/routes/apps/backups.ts
|
|
@@ -22912,8 +23071,8 @@ var import_router6 = __toESM(require("@koa/router"));
|
|
|
22912
23071
|
|
|
22913
23072
|
// ../pro/packages/pro/src/api/controllers/global/scim/users.ts
|
|
22914
23073
|
var import_scim_patch = require("scim-patch");
|
|
22915
|
-
function tryGetQueryAsNumber(ctx,
|
|
22916
|
-
const value = ctx.request.query[
|
|
23074
|
+
function tryGetQueryAsNumber(ctx, name2) {
|
|
23075
|
+
const value = ctx.request.query[name2];
|
|
22917
23076
|
if (value === void 0) {
|
|
22918
23077
|
return void 0;
|
|
22919
23078
|
}
|
|
@@ -23459,11 +23618,11 @@ var datasources_default = {
|
|
|
23459
23618
|
};
|
|
23460
23619
|
|
|
23461
23620
|
// src/sdk/app/tables/index.ts
|
|
23462
|
-
async function getAllInternalTables(
|
|
23463
|
-
if (!
|
|
23464
|
-
|
|
23621
|
+
async function getAllInternalTables(db2) {
|
|
23622
|
+
if (!db2) {
|
|
23623
|
+
db2 = context_exports.getAppDB();
|
|
23465
23624
|
}
|
|
23466
|
-
const internalTables = await
|
|
23625
|
+
const internalTables = await db2.allDocs(
|
|
23467
23626
|
getTableParams(null, {
|
|
23468
23627
|
include_docs: true
|
|
23469
23628
|
})
|
|
@@ -23475,7 +23634,7 @@ async function getAllInternalTables(db) {
|
|
|
23475
23634
|
}));
|
|
23476
23635
|
}
|
|
23477
23636
|
async function getAllExternalTables(datasourceId) {
|
|
23478
|
-
const
|
|
23637
|
+
const db2 = context_exports.getAppDB();
|
|
23479
23638
|
const datasource2 = await datasources_default.get(datasourceId, { enriched: true });
|
|
23480
23639
|
if (!datasource2 || !datasource2.entities) {
|
|
23481
23640
|
throw "Datasource is not configured fully.";
|
|
@@ -23487,14 +23646,14 @@ async function getExternalTable(datasourceId, tableName) {
|
|
|
23487
23646
|
return entities[tableName];
|
|
23488
23647
|
}
|
|
23489
23648
|
async function getTable(tableId) {
|
|
23490
|
-
const
|
|
23649
|
+
const db2 = context_exports.getAppDB();
|
|
23491
23650
|
if (isExternalTable(tableId)) {
|
|
23492
23651
|
let { datasourceId, tableName } = breakExternalTableId(tableId);
|
|
23493
23652
|
const datasource2 = await datasources_default.get(datasourceId);
|
|
23494
23653
|
const table = await getExternalTable(datasourceId, tableName);
|
|
23495
23654
|
return { ...table, sql: isSQL(datasource2) };
|
|
23496
23655
|
} else {
|
|
23497
|
-
return
|
|
23656
|
+
return db2.get(tableId);
|
|
23498
23657
|
}
|
|
23499
23658
|
}
|
|
23500
23659
|
var tables_default = {
|
|
@@ -23514,10 +23673,10 @@ __export(webhook_exports, {
|
|
|
23514
23673
|
function isWebhookID(id) {
|
|
23515
23674
|
return id.startsWith(db_exports.DocumentType.WEBHOOK);
|
|
23516
23675
|
}
|
|
23517
|
-
function newDoc(
|
|
23676
|
+
function newDoc(name2, type, target) {
|
|
23518
23677
|
return {
|
|
23519
23678
|
live: true,
|
|
23520
|
-
name,
|
|
23679
|
+
name: name2,
|
|
23521
23680
|
action: {
|
|
23522
23681
|
type,
|
|
23523
23682
|
target
|
|
@@ -23525,22 +23684,22 @@ function newDoc(name, type, target) {
|
|
|
23525
23684
|
};
|
|
23526
23685
|
}
|
|
23527
23686
|
async function save7(webhook) {
|
|
23528
|
-
const
|
|
23687
|
+
const db2 = context_exports.getAppDB();
|
|
23529
23688
|
if (webhook._id && isWebhookID(webhook._id)) {
|
|
23530
|
-
await
|
|
23689
|
+
await db2.get(webhook._id);
|
|
23531
23690
|
} else {
|
|
23532
23691
|
webhook._id = generateWebhookID();
|
|
23533
23692
|
}
|
|
23534
|
-
const response = await
|
|
23693
|
+
const response = await db2.put(webhook);
|
|
23535
23694
|
webhook._rev = response.rev;
|
|
23536
23695
|
return webhook;
|
|
23537
23696
|
}
|
|
23538
|
-
async function destroy6(id,
|
|
23539
|
-
const
|
|
23697
|
+
async function destroy6(id, rev2) {
|
|
23698
|
+
const db2 = context_exports.getAppDB();
|
|
23540
23699
|
if (!id || !isWebhookID(id)) {
|
|
23541
23700
|
throw new Error("Provided webhook ID is not valid.");
|
|
23542
23701
|
}
|
|
23543
|
-
return await
|
|
23702
|
+
return await db2.remove(id, rev2);
|
|
23544
23703
|
}
|
|
23545
23704
|
|
|
23546
23705
|
// src/sdk/app/automations/utils.ts
|
|
@@ -23620,14 +23779,14 @@ async function processUser(user, opts = {}) {
|
|
|
23620
23779
|
}
|
|
23621
23780
|
async function getGlobalUsers(userIds, opts) {
|
|
23622
23781
|
const appId = context_exports.getAppId();
|
|
23623
|
-
const
|
|
23782
|
+
const db2 = tenancy.getGlobalDB();
|
|
23624
23783
|
let globalUsers;
|
|
23625
23784
|
if (userIds) {
|
|
23626
|
-
globalUsers = (await
|
|
23785
|
+
globalUsers = (await db2.allDocs(getMultiIDParams(userIds))).rows.map(
|
|
23627
23786
|
(row) => row.doc
|
|
23628
23787
|
);
|
|
23629
23788
|
} else {
|
|
23630
|
-
globalUsers = (await
|
|
23789
|
+
globalUsers = (await db2.allDocs(
|
|
23631
23790
|
db_exports.getGlobalUserParams(null, {
|
|
23632
23791
|
include_docs: true
|
|
23633
23792
|
})
|
|
@@ -23654,7 +23813,7 @@ async function syncUsersToApp(appId, users2, groups) {
|
|
|
23654
23813
|
return;
|
|
23655
23814
|
}
|
|
23656
23815
|
await context_exports.doInAppContext(appId, async () => {
|
|
23657
|
-
const
|
|
23816
|
+
const db2 = context_exports.getAppDB();
|
|
23658
23817
|
for (let user of users2) {
|
|
23659
23818
|
let ctxUser = user;
|
|
23660
23819
|
let deletedUser = false;
|
|
@@ -23669,9 +23828,9 @@ async function syncUsersToApp(appId, users2, groups) {
|
|
|
23669
23828
|
if (roleId === roles_exports.BUILTIN_ROLE_IDS.PUBLIC) {
|
|
23670
23829
|
roleId = void 0;
|
|
23671
23830
|
}
|
|
23672
|
-
let
|
|
23831
|
+
let metadata2;
|
|
23673
23832
|
try {
|
|
23674
|
-
|
|
23833
|
+
metadata2 = await db2.get(metadataId);
|
|
23675
23834
|
} catch (err) {
|
|
23676
23835
|
if (err.status !== 404) {
|
|
23677
23836
|
throw err;
|
|
@@ -23679,21 +23838,21 @@ async function syncUsersToApp(appId, users2, groups) {
|
|
|
23679
23838
|
if (!roleId) {
|
|
23680
23839
|
continue;
|
|
23681
23840
|
} else if (!deletedUser) {
|
|
23682
|
-
|
|
23841
|
+
metadata2 = {
|
|
23683
23842
|
tableId: InternalTables.USER_METADATA
|
|
23684
23843
|
};
|
|
23685
23844
|
}
|
|
23686
23845
|
}
|
|
23687
23846
|
if (deletedUser || !roleId) {
|
|
23688
|
-
await
|
|
23847
|
+
await db2.remove(metadata2);
|
|
23689
23848
|
continue;
|
|
23690
23849
|
}
|
|
23691
23850
|
if (roleId) {
|
|
23692
|
-
|
|
23851
|
+
metadata2.roleId = roleId;
|
|
23693
23852
|
}
|
|
23694
|
-
let combined = sdk_default.users.combineMetadataAndUser(ctxUser,
|
|
23853
|
+
let combined = sdk_default.users.combineMetadataAndUser(ctxUser, metadata2);
|
|
23695
23854
|
if (combined) {
|
|
23696
|
-
await
|
|
23855
|
+
await db2.put(combined);
|
|
23697
23856
|
}
|
|
23698
23857
|
}
|
|
23699
23858
|
});
|
|
@@ -23748,7 +23907,7 @@ async function syncApp(appId, opts) {
|
|
|
23748
23907
|
try {
|
|
23749
23908
|
const replOpts = replication.appReplicateOpts();
|
|
23750
23909
|
if (opts == null ? void 0 : opts.automationOnly) {
|
|
23751
|
-
replOpts.filter = (
|
|
23910
|
+
replOpts.filter = (doc2) => doc2._id.startsWith(db_exports.DocumentType.AUTOMATION);
|
|
23752
23911
|
}
|
|
23753
23912
|
await replication.replicate(replOpts);
|
|
23754
23913
|
} catch (err) {
|
|
@@ -23861,7 +24020,7 @@ function generateAttachmentFindParams(tableId, attachmentCols, bookmark) {
|
|
|
23861
24020
|
return params2;
|
|
23862
24021
|
}
|
|
23863
24022
|
async function getRowsWithAttachments(appId, table) {
|
|
23864
|
-
const
|
|
24023
|
+
const db2 = db_exports.getDB(appId);
|
|
23865
24024
|
const attachmentCols = [];
|
|
23866
24025
|
for (let [key, column] of Object.entries(table.schema)) {
|
|
23867
24026
|
if (column.type === "attachment" /* ATTACHMENT */) {
|
|
@@ -23878,7 +24037,7 @@ async function getRowsWithAttachments(appId, table) {
|
|
|
23878
24037
|
attachmentCols,
|
|
23879
24038
|
bookmark
|
|
23880
24039
|
);
|
|
23881
|
-
const resp = await db_exports.directCouchFind(
|
|
24040
|
+
const resp = await db_exports.directCouchFind(db2.name, params2);
|
|
23882
24041
|
bookmark = resp.bookmark;
|
|
23883
24042
|
rowsLength = resp.rows.length;
|
|
23884
24043
|
const rows2 = resp.rows;
|
|
@@ -23893,13 +24052,13 @@ __export(rows_exports, {
|
|
|
23893
24052
|
getAllInternalRows: () => getAllInternalRows
|
|
23894
24053
|
});
|
|
23895
24054
|
async function getAllInternalRows(appId) {
|
|
23896
|
-
let
|
|
24055
|
+
let db2;
|
|
23897
24056
|
if (appId) {
|
|
23898
|
-
|
|
24057
|
+
db2 = db_exports.getDB(appId);
|
|
23899
24058
|
} else {
|
|
23900
|
-
|
|
24059
|
+
db2 = context_exports.getAppDB();
|
|
23901
24060
|
}
|
|
23902
|
-
const response = await
|
|
24061
|
+
const response = await db2.allDocs(
|
|
23903
24062
|
getRowParams2(null, null, {
|
|
23904
24063
|
include_docs: true
|
|
23905
24064
|
})
|
|
@@ -23921,9 +24080,9 @@ __export(utils_exports8, {
|
|
|
23921
24080
|
syncGlobalUsers: () => syncGlobalUsers
|
|
23922
24081
|
});
|
|
23923
24082
|
var import_lodash5 = require("lodash");
|
|
23924
|
-
function combineMetadataAndUser(user,
|
|
24083
|
+
function combineMetadataAndUser(user, metadata2) {
|
|
23925
24084
|
const metadataId = generateUserMetadataID2(user._id);
|
|
23926
|
-
const found = Array.isArray(
|
|
24085
|
+
const found = Array.isArray(metadata2) ? metadata2.find((doc2) => doc2._id === metadataId) : metadata2;
|
|
23927
24086
|
if (user.roleId == null || user.roleId === roles_exports.BUILTIN_ROLE_IDS.PUBLIC) {
|
|
23928
24087
|
if (found == null ? void 0 : found._id) {
|
|
23929
24088
|
return { ...found, _deleted: true };
|
|
@@ -23950,11 +24109,11 @@ function combineMetadataAndUser(user, metadata) {
|
|
|
23950
24109
|
}
|
|
23951
24110
|
return null;
|
|
23952
24111
|
}
|
|
23953
|
-
async function rawUserMetadata(
|
|
23954
|
-
if (!
|
|
23955
|
-
|
|
24112
|
+
async function rawUserMetadata(db2) {
|
|
24113
|
+
if (!db2) {
|
|
24114
|
+
db2 = context_exports.getAppDB();
|
|
23956
24115
|
}
|
|
23957
|
-
return (await
|
|
24116
|
+
return (await db2.allDocs(
|
|
23958
24117
|
getUserMetadataParams2(null, {
|
|
23959
24118
|
include_docs: true
|
|
23960
24119
|
})
|
|
@@ -23962,22 +24121,22 @@ async function rawUserMetadata(db) {
|
|
|
23962
24121
|
}
|
|
23963
24122
|
async function syncGlobalUsers() {
|
|
23964
24123
|
const dbs = [context_exports.getDevAppDB(), context_exports.getProdAppDB()];
|
|
23965
|
-
for (let
|
|
23966
|
-
if (!await
|
|
24124
|
+
for (let db2 of dbs) {
|
|
24125
|
+
if (!await db2.exists()) {
|
|
23967
24126
|
continue;
|
|
23968
24127
|
}
|
|
23969
|
-
const resp = await Promise.all([getGlobalUsers(), rawUserMetadata(
|
|
24128
|
+
const resp = await Promise.all([getGlobalUsers(), rawUserMetadata(db2)]);
|
|
23970
24129
|
const users2 = resp[0];
|
|
23971
|
-
const
|
|
24130
|
+
const metadata2 = resp[1];
|
|
23972
24131
|
const toWrite = [];
|
|
23973
24132
|
for (let user of users2) {
|
|
23974
|
-
const combined = combineMetadataAndUser(user,
|
|
24133
|
+
const combined = combineMetadataAndUser(user, metadata2);
|
|
23975
24134
|
if (combined) {
|
|
23976
24135
|
toWrite.push(combined);
|
|
23977
24136
|
}
|
|
23978
24137
|
}
|
|
23979
24138
|
let foundEmails = [];
|
|
23980
|
-
for (let data of
|
|
24139
|
+
for (let data of metadata2) {
|
|
23981
24140
|
if (!data._id) {
|
|
23982
24141
|
continue;
|
|
23983
24142
|
}
|
|
@@ -23990,7 +24149,7 @@ async function syncGlobalUsers() {
|
|
|
23990
24149
|
foundEmails.push(data.email);
|
|
23991
24150
|
}
|
|
23992
24151
|
}
|
|
23993
|
-
await
|
|
24152
|
+
await db2.bulkDocs(toWrite);
|
|
23994
24153
|
}
|
|
23995
24154
|
}
|
|
23996
24155
|
|
|
@@ -24051,8 +24210,8 @@ var clientAppSocket;
|
|
|
24051
24210
|
|
|
24052
24211
|
// src/sdk/plugins/plugins.ts
|
|
24053
24212
|
async function fetch17(type) {
|
|
24054
|
-
const
|
|
24055
|
-
const response = await
|
|
24213
|
+
const db2 = tenancy.getGlobalDB();
|
|
24214
|
+
const response = await db2.allDocs(
|
|
24056
24215
|
db_exports.getPluginParams(null, {
|
|
24057
24216
|
include_docs: true
|
|
24058
24217
|
})
|
|
@@ -24068,16 +24227,16 @@ async function fetch17(type) {
|
|
|
24068
24227
|
return plugins2;
|
|
24069
24228
|
}
|
|
24070
24229
|
}
|
|
24071
|
-
async function processUploaded(plugin,
|
|
24230
|
+
async function processUploaded(plugin, source2) {
|
|
24072
24231
|
var _a, _b;
|
|
24073
|
-
const { metadata, directory } = await fileUpload(plugin);
|
|
24074
|
-
plugin_exports.validate(
|
|
24075
|
-
if (!environment_default.SELF_HOSTED && ((_a =
|
|
24232
|
+
const { metadata: metadata2, directory: directory2 } = await fileUpload(plugin);
|
|
24233
|
+
plugin_exports.validate(metadata2 == null ? void 0 : metadata2.schema);
|
|
24234
|
+
if (!environment_default.SELF_HOSTED && ((_a = metadata2 == null ? void 0 : metadata2.schema) == null ? void 0 : _a.type) !== "component" /* COMPONENT */) {
|
|
24076
24235
|
throw new Error("Only component plugins are supported outside of self-host");
|
|
24077
24236
|
}
|
|
24078
|
-
const
|
|
24079
|
-
(_b = clientAppSocket) == null ? void 0 : _b.emit("plugin-update", { name:
|
|
24080
|
-
return
|
|
24237
|
+
const doc2 = await sdk_exports.plugins.storePlugin(metadata2, directory2, source2);
|
|
24238
|
+
(_b = clientAppSocket) == null ? void 0 : _b.emit("plugin-update", { name: doc2.name, hash: doc2.hash });
|
|
24239
|
+
return doc2;
|
|
24081
24240
|
}
|
|
24082
24241
|
|
|
24083
24242
|
// src/sdk/plugins/index.ts
|
|
@@ -24141,13 +24300,13 @@ if (process.arch && !process.arch.startsWith("arm") && oracle_default.integratio
|
|
|
24141
24300
|
DEFINITIONS2["ORACLE" /* ORACLE */] = oracle_default.schema;
|
|
24142
24301
|
INTEGRATIONS["ORACLE" /* ORACLE */] = oracle_default.integration;
|
|
24143
24302
|
}
|
|
24144
|
-
async function getDefinition(
|
|
24145
|
-
const definition = DEFINITIONS2[
|
|
24303
|
+
async function getDefinition(source2) {
|
|
24304
|
+
const definition = DEFINITIONS2[source2];
|
|
24146
24305
|
if (definition) {
|
|
24147
24306
|
return definition;
|
|
24148
24307
|
}
|
|
24149
24308
|
const allDefinitions = await getDefinitions();
|
|
24150
|
-
return allDefinitions[
|
|
24309
|
+
return allDefinitions[source2];
|
|
24151
24310
|
}
|
|
24152
24311
|
async function getDefinitions() {
|
|
24153
24312
|
const pluginSchemas = {};
|
|
@@ -24350,8 +24509,8 @@ var QueryRunner = class {
|
|
|
24350
24509
|
return { rows: rows2, keys: keys2, info, extra, pagination: pagination3 };
|
|
24351
24510
|
}
|
|
24352
24511
|
async runAnotherQuery(queryId, parameters) {
|
|
24353
|
-
const
|
|
24354
|
-
const query = await
|
|
24512
|
+
const db2 = context_exports.getAppDB();
|
|
24513
|
+
const query = await db2.get(queryId);
|
|
24355
24514
|
const datasource2 = await sdk_default.datasources.get(query.datasourceId, {
|
|
24356
24515
|
enriched: true
|
|
24357
24516
|
});
|
|
@@ -24393,14 +24552,14 @@ var QueryRunner = class {
|
|
|
24393
24552
|
}
|
|
24394
24553
|
async getDynamicVariable(variable) {
|
|
24395
24554
|
let { parameters } = this;
|
|
24396
|
-
const queryId = variable.queryId,
|
|
24397
|
-
let value = await utils_default.checkCacheForDynamicVariable(queryId,
|
|
24555
|
+
const queryId = variable.queryId, name2 = variable.name;
|
|
24556
|
+
let value = await utils_default.checkCacheForDynamicVariable(queryId, name2);
|
|
24398
24557
|
if (!value) {
|
|
24399
24558
|
value = this.queryResponse[queryId] ? this.queryResponse[queryId] : await this.runAnotherQuery(queryId, parameters);
|
|
24400
24559
|
this.queryResponse[queryId] = value;
|
|
24401
|
-
await utils_default.storeDynamicVariable(queryId,
|
|
24560
|
+
await utils_default.storeDynamicVariable(queryId, name2, value);
|
|
24402
24561
|
} else {
|
|
24403
|
-
this.cachedVariables.push({ queryId, name });
|
|
24562
|
+
this.cachedVariables.push({ queryId, name: name2 });
|
|
24404
24563
|
}
|
|
24405
24564
|
return value;
|
|
24406
24565
|
}
|