@budibase/server 2.7.21-alpha.3 → 2.7.23
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.91f1d954.js → index.1066b334.js} +347 -347
- package/builder/assets/{index.36462e95.css → index.d9b46807.css} +1 -1
- package/builder/index.html +2 -2
- package/dist/automation.js +180 -421
- package/dist/automation.js.map +3 -3
- package/dist/index.js +283 -532
- package/dist/index.js.map +3 -3
- package/dist/query.js +142 -317
- package/dist/query.js.map +3 -3
- package/package.json +11 -11
- package/src/api/controllers/backup.ts +8 -22
- package/src/api/controllers/datasource.ts +24 -41
- 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 +2 -18
- package/src/automations/steps/sendSmtpEmail.ts +4 -55
- package/src/automations/tests/sendSmtpEmail.spec.js +71 -0
- package/src/events/docUpdates/syncUsers.ts +0 -4
- package/src/integrations/googlesheets.ts +18 -35
- package/src/integrations/mongodb.ts +2 -4
- package/src/integrations/postgres.ts +3 -21
- package/src/middleware/currentapp.ts +1 -1
- package/src/sdk/app/backups/exports.ts +5 -33
- package/src/sdk/app/backups/imports.ts +1 -21
- package/src/sdk/app/datasources/datasources.ts +0 -1
- package/src/utilities/workerRequests.ts +9 -20
- package/src/automations/tests/sendSmtpEmail.spec.ts +0 -74
package/dist/query.js
CHANGED
|
@@ -838,7 +838,6 @@ var init_automation2 = __esm({
|
|
|
838
838
|
AutomationIOType2["NUMBER"] = "number";
|
|
839
839
|
AutomationIOType2["ARRAY"] = "array";
|
|
840
840
|
AutomationIOType2["JSON"] = "json";
|
|
841
|
-
AutomationIOType2["DATE"] = "date";
|
|
842
841
|
return AutomationIOType2;
|
|
843
842
|
})(AutomationIOType || {});
|
|
844
843
|
AutomationCustomIOType = /* @__PURE__ */ ((AutomationCustomIOType2) => {
|
|
@@ -10778,7 +10777,7 @@ function lowerBuiltinRoleID(roleId1, roleId2) {
|
|
|
10778
10777
|
}
|
|
10779
10778
|
return builtinRoleToNumber(roleId1) > builtinRoleToNumber(roleId2) ? roleId2 : roleId1;
|
|
10780
10779
|
}
|
|
10781
|
-
async function getRole(roleId
|
|
10780
|
+
async function getRole(roleId) {
|
|
10782
10781
|
if (!roleId) {
|
|
10783
10782
|
return void 0;
|
|
10784
10783
|
}
|
|
@@ -10794,9 +10793,6 @@ async function getRole(roleId, opts) {
|
|
|
10794
10793
|
role = Object.assign(role, dbRole);
|
|
10795
10794
|
role._id = getExternalRoleID(role._id);
|
|
10796
10795
|
} catch (err) {
|
|
10797
|
-
if (!isBuiltin(roleId) && (opts == null ? void 0 : opts.defaultPublic)) {
|
|
10798
|
-
return cloneDeep2(BUILTIN_ROLES.PUBLIC);
|
|
10799
|
-
}
|
|
10800
10796
|
if (Object.keys(role).length === 0) {
|
|
10801
10797
|
throw err;
|
|
10802
10798
|
}
|
|
@@ -11485,8 +11481,8 @@ async function preAuth(passport2, ctx, next) {
|
|
|
11485
11481
|
callbackUrl,
|
|
11486
11482
|
ssoSaveUserNoOp
|
|
11487
11483
|
);
|
|
11488
|
-
if (!ctx.query.appId) {
|
|
11489
|
-
ctx.throw(400, "appId query
|
|
11484
|
+
if (!ctx.query.appId || !ctx.query.datasourceId) {
|
|
11485
|
+
ctx.throw(400, "appId and datasourceId query params not present.");
|
|
11490
11486
|
}
|
|
11491
11487
|
return passport2.authenticate(strategy, {
|
|
11492
11488
|
scope: ["profile", "email", "https://www.googleapis.com/auth/spreadsheets"],
|
|
@@ -11506,7 +11502,7 @@ async function postAuth(passport2, ctx, next) {
|
|
|
11506
11502
|
clientSecret: config.clientSecret,
|
|
11507
11503
|
callbackURL: callbackUrl
|
|
11508
11504
|
},
|
|
11509
|
-
(accessToken, refreshToken,
|
|
11505
|
+
(accessToken, refreshToken, profile, done) => {
|
|
11510
11506
|
clearCookie(ctx, "budibase:datasourceauth" /* DatasourceAuth */);
|
|
11511
11507
|
done(null, { accessToken, refreshToken });
|
|
11512
11508
|
}
|
|
@@ -11514,14 +11510,22 @@ async function postAuth(passport2, ctx, next) {
|
|
|
11514
11510
|
{ successRedirect: "/", failureRedirect: "/error" },
|
|
11515
11511
|
async (err, tokens) => {
|
|
11516
11512
|
const baseUrl = `/builder/app/${authStateCookie.appId}/data`;
|
|
11517
|
-
|
|
11518
|
-
|
|
11519
|
-
|
|
11520
|
-
|
|
11521
|
-
|
|
11513
|
+
await doWithDB(authStateCookie.appId, async (db2) => {
|
|
11514
|
+
let datasource2;
|
|
11515
|
+
try {
|
|
11516
|
+
datasource2 = await db2.get(authStateCookie.datasourceId);
|
|
11517
|
+
} catch (err2) {
|
|
11518
|
+
if (err2.status === 404) {
|
|
11519
|
+
ctx.redirect(baseUrl);
|
|
11520
|
+
}
|
|
11522
11521
|
}
|
|
11523
|
-
|
|
11524
|
-
|
|
11522
|
+
if (!datasource2.config) {
|
|
11523
|
+
datasource2.config = {};
|
|
11524
|
+
}
|
|
11525
|
+
datasource2.config.auth = { type: "google", ...tokens };
|
|
11526
|
+
await db2.put(datasource2);
|
|
11527
|
+
ctx.redirect(`${baseUrl}/datasource/${authStateCookie.datasourceId}`);
|
|
11528
|
+
});
|
|
11525
11529
|
}
|
|
11526
11530
|
)(ctx, next);
|
|
11527
11531
|
}
|
|
@@ -11571,22 +11575,16 @@ var encryption_exports = {};
|
|
|
11571
11575
|
__export(encryption_exports, {
|
|
11572
11576
|
SecretOption: () => SecretOption,
|
|
11573
11577
|
decrypt: () => decrypt,
|
|
11574
|
-
decryptFile: () => decryptFile,
|
|
11575
11578
|
encrypt: () => encrypt,
|
|
11576
|
-
encryptFile: () => encryptFile,
|
|
11577
11579
|
getSecret: () => getSecret
|
|
11578
11580
|
});
|
|
11579
11581
|
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");
|
|
11584
11583
|
var ALGO = "aes-256-ctr";
|
|
11585
11584
|
var SEPARATOR3 = "-";
|
|
11586
11585
|
var ITERATIONS = 1e4;
|
|
11586
|
+
var RANDOM_BYTES = 16;
|
|
11587
11587
|
var STRETCH_LENGTH = 32;
|
|
11588
|
-
var SALT_LENGTH = 16;
|
|
11589
|
-
var IV_LENGTH = 16;
|
|
11590
11588
|
var SecretOption = /* @__PURE__ */ ((SecretOption2) => {
|
|
11591
11589
|
SecretOption2["API"] = "api";
|
|
11592
11590
|
SecretOption2["ENCRYPTION"] = "encryption";
|
|
@@ -11610,11 +11608,11 @@ function getSecret(secretOption) {
|
|
|
11610
11608
|
}
|
|
11611
11609
|
return secret;
|
|
11612
11610
|
}
|
|
11613
|
-
function stretchString(
|
|
11614
|
-
return import_crypto.default.pbkdf2Sync(
|
|
11611
|
+
function stretchString(string, salt) {
|
|
11612
|
+
return import_crypto.default.pbkdf2Sync(string, salt, ITERATIONS, STRETCH_LENGTH, "sha512");
|
|
11615
11613
|
}
|
|
11616
11614
|
function encrypt(input, secretOption = "api" /* API */) {
|
|
11617
|
-
const salt = import_crypto.default.randomBytes(
|
|
11615
|
+
const salt = import_crypto.default.randomBytes(RANDOM_BYTES);
|
|
11618
11616
|
const stretched = stretchString(getSecret(secretOption), salt);
|
|
11619
11617
|
const cipher = import_crypto.default.createCipheriv(ALGO, stretched, salt);
|
|
11620
11618
|
const base = cipher.update(input);
|
|
@@ -11631,87 +11629,6 @@ function decrypt(input, secretOption = "api" /* API */) {
|
|
|
11631
11629
|
const final = decipher.final();
|
|
11632
11630
|
return Buffer.concat([base, final]).toString();
|
|
11633
11631
|
}
|
|
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
|
-
}
|
|
11715
11632
|
|
|
11716
11633
|
// ../backend-core/src/middleware/authenticated.ts
|
|
11717
11634
|
init_identity();
|
|
@@ -12469,16 +12386,16 @@ var import_aws_sdk = __toESM(require("aws-sdk"));
|
|
|
12469
12386
|
var import_stream = __toESM(require("stream"));
|
|
12470
12387
|
var import_node_fetch6 = __toESM(require("node-fetch"));
|
|
12471
12388
|
var import_tar_fs = __toESM(require("tar-fs"));
|
|
12472
|
-
var
|
|
12389
|
+
var import_zlib = __toESM(require("zlib"));
|
|
12473
12390
|
var import_util = require("util");
|
|
12474
|
-
var
|
|
12475
|
-
var
|
|
12391
|
+
var import_path3 = require("path");
|
|
12392
|
+
var import_fs3 = __toESM(require("fs"));
|
|
12476
12393
|
init_environment2();
|
|
12477
12394
|
|
|
12478
12395
|
// ../backend-core/src/objectStore/utils.ts
|
|
12479
|
-
var
|
|
12396
|
+
var import_path2 = require("path");
|
|
12480
12397
|
var import_os = require("os");
|
|
12481
|
-
var
|
|
12398
|
+
var import_fs2 = __toESM(require("fs"));
|
|
12482
12399
|
init_environment2();
|
|
12483
12400
|
var ObjectStoreBuckets = {
|
|
12484
12401
|
BACKUPS: environment_default2.BACKUPS_BUCKET_NAME,
|
|
@@ -12487,9 +12404,9 @@ var ObjectStoreBuckets = {
|
|
|
12487
12404
|
GLOBAL: environment_default2.GLOBAL_BUCKET_NAME,
|
|
12488
12405
|
PLUGINS: environment_default2.PLUGIN_BUCKET_NAME
|
|
12489
12406
|
};
|
|
12490
|
-
var bbTmp = (0,
|
|
12491
|
-
if (!
|
|
12492
|
-
|
|
12407
|
+
var bbTmp = (0, import_path2.join)((0, import_os.tmpdir)(), ".budibase");
|
|
12408
|
+
if (!import_fs2.default.existsSync(bbTmp)) {
|
|
12409
|
+
import_fs2.default.mkdirSync(bbTmp);
|
|
12493
12410
|
}
|
|
12494
12411
|
function budibaseTempDir() {
|
|
12495
12412
|
return bbTmp;
|
|
@@ -12577,7 +12494,7 @@ var upload = async ({
|
|
|
12577
12494
|
metadata: metadata2
|
|
12578
12495
|
}) => {
|
|
12579
12496
|
const extension = filename.split(".").pop();
|
|
12580
|
-
const fileBytes =
|
|
12497
|
+
const fileBytes = import_fs3.default.readFileSync(path2);
|
|
12581
12498
|
const objectStore = ObjectStore(bucketName);
|
|
12582
12499
|
await makeSureBucketExists(objectStore, bucketName);
|
|
12583
12500
|
let contentType = type;
|
|
@@ -12679,13 +12596,13 @@ var retrieveToTmp = async (bucketName, filepath) => {
|
|
|
12679
12596
|
bucketName = sanitizeBucket(bucketName);
|
|
12680
12597
|
filepath = sanitizeKey(filepath);
|
|
12681
12598
|
const data = await retrieve(bucketName, filepath);
|
|
12682
|
-
const outputPath = (0,
|
|
12683
|
-
|
|
12599
|
+
const outputPath = (0, import_path3.join)(budibaseTempDir(), (0, import_uuid3.v4)());
|
|
12600
|
+
import_fs3.default.writeFileSync(outputPath, data);
|
|
12684
12601
|
return outputPath;
|
|
12685
12602
|
};
|
|
12686
12603
|
var retrieveDirectory = async (bucketName, path2) => {
|
|
12687
|
-
let writePath = (0,
|
|
12688
|
-
|
|
12604
|
+
let writePath = (0, import_path3.join)(budibaseTempDir(), (0, import_uuid3.v4)());
|
|
12605
|
+
import_fs3.default.mkdirSync(writePath);
|
|
12689
12606
|
const objects = await listAllObjects(bucketName, path2);
|
|
12690
12607
|
let fullObjects = await Promise.all(
|
|
12691
12608
|
objects.map((obj) => retrieve(bucketName, obj.Key))
|
|
@@ -12697,9 +12614,9 @@ var retrieveDirectory = async (bucketName, path2) => {
|
|
|
12697
12614
|
const possiblePath = filename.split("/");
|
|
12698
12615
|
if (possiblePath.length > 1) {
|
|
12699
12616
|
const dirs = possiblePath.slice(0, possiblePath.length - 1);
|
|
12700
|
-
|
|
12617
|
+
import_fs3.default.mkdirSync((0, import_path3.join)(writePath, ...dirs), { recursive: true });
|
|
12701
12618
|
}
|
|
12702
|
-
|
|
12619
|
+
import_fs3.default.writeFileSync((0, import_path3.join)(writePath, ...possiblePath), data);
|
|
12703
12620
|
}
|
|
12704
12621
|
return writePath;
|
|
12705
12622
|
};
|
|
@@ -12753,14 +12670,14 @@ var deleteFolder = async (bucketName, folder) => {
|
|
|
12753
12670
|
var uploadDirectory = async (bucketName, localPath, bucketPath2) => {
|
|
12754
12671
|
bucketName = sanitizeBucket(bucketName);
|
|
12755
12672
|
let uploads = [];
|
|
12756
|
-
const files2 =
|
|
12673
|
+
const files2 = import_fs3.default.readdirSync(localPath, { withFileTypes: true });
|
|
12757
12674
|
for (let file of files2) {
|
|
12758
|
-
const path2 = sanitizeKey((0,
|
|
12759
|
-
const local = (0,
|
|
12675
|
+
const path2 = sanitizeKey((0, import_path3.join)(bucketPath2, file.name));
|
|
12676
|
+
const local = (0, import_path3.join)(localPath, file.name);
|
|
12760
12677
|
if (file.isDirectory()) {
|
|
12761
12678
|
uploads.push(uploadDirectory(bucketName, local, path2));
|
|
12762
12679
|
} else {
|
|
12763
|
-
uploads.push(streamUpload(bucketName, path2,
|
|
12680
|
+
uploads.push(streamUpload(bucketName, path2, import_fs3.default.createReadStream(local)));
|
|
12764
12681
|
}
|
|
12765
12682
|
}
|
|
12766
12683
|
await Promise.all(uploads);
|
|
@@ -12772,7 +12689,7 @@ var downloadTarballDirect = async (url, path2, headers = {}) => {
|
|
|
12772
12689
|
if (!response.ok) {
|
|
12773
12690
|
throw new Error(`unexpected response ${response.statusText}`);
|
|
12774
12691
|
}
|
|
12775
|
-
await streamPipeline(response.body,
|
|
12692
|
+
await streamPipeline(response.body, import_zlib.default.createUnzip(), import_tar_fs.default.extract(path2));
|
|
12776
12693
|
};
|
|
12777
12694
|
var downloadTarball = async (url, bucketName, path2) => {
|
|
12778
12695
|
bucketName = sanitizeBucket(bucketName);
|
|
@@ -12781,8 +12698,8 @@ var downloadTarball = async (url, bucketName, path2) => {
|
|
|
12781
12698
|
if (!response.ok) {
|
|
12782
12699
|
throw new Error(`unexpected response ${response.statusText}`);
|
|
12783
12700
|
}
|
|
12784
|
-
const tmpPath = (0,
|
|
12785
|
-
await streamPipeline(response.body,
|
|
12701
|
+
const tmpPath = (0, import_path3.join)(budibaseTempDir(), path2);
|
|
12702
|
+
await streamPipeline(response.body, import_zlib.default.createUnzip(), import_tar_fs.default.extract(tmpPath));
|
|
12786
12703
|
if (!environment_default2.isTest() && environment_default2.SELF_HOSTED) {
|
|
12787
12704
|
await uploadDirectory(bucketName, tmpPath, path2);
|
|
12788
12705
|
}
|
|
@@ -14254,19 +14171,6 @@ var SCHEMA = {
|
|
|
14254
14171
|
required: false
|
|
14255
14172
|
},
|
|
14256
14173
|
ca: {
|
|
14257
|
-
display: "Server CA",
|
|
14258
|
-
type: "longForm" /* LONGFORM */,
|
|
14259
|
-
default: false,
|
|
14260
|
-
required: false
|
|
14261
|
-
},
|
|
14262
|
-
clientKey: {
|
|
14263
|
-
display: "Client key",
|
|
14264
|
-
type: "longForm" /* LONGFORM */,
|
|
14265
|
-
default: false,
|
|
14266
|
-
required: false
|
|
14267
|
-
},
|
|
14268
|
-
clientCert: {
|
|
14269
|
-
display: "Client cert",
|
|
14270
14174
|
type: "longForm" /* LONGFORM */,
|
|
14271
14175
|
default: false,
|
|
14272
14176
|
required: false
|
|
@@ -14308,9 +14212,7 @@ var PostgresIntegration = class extends sql_default {
|
|
|
14308
14212
|
...this.config,
|
|
14309
14213
|
ssl: this.config.ssl ? {
|
|
14310
14214
|
rejectUnauthorized: this.config.rejectUnauthorized,
|
|
14311
|
-
ca: this.config.ca
|
|
14312
|
-
key: this.config.clientKey,
|
|
14313
|
-
cert: this.config.clientCert
|
|
14215
|
+
ca: this.config.ca
|
|
14314
14216
|
} : void 0
|
|
14315
14217
|
};
|
|
14316
14218
|
this.client = new import_pg.Client(newConfig);
|
|
@@ -14453,8 +14355,7 @@ var PostgresIntegration = class extends sql_default {
|
|
|
14453
14355
|
try {
|
|
14454
14356
|
await this.openConnection();
|
|
14455
14357
|
const columnsResponse = await this.client.query(this.COLUMNS_SQL);
|
|
14456
|
-
|
|
14457
|
-
return [...new Set(names)];
|
|
14358
|
+
return columnsResponse.rows.map((row) => row.table_name);
|
|
14458
14359
|
} finally {
|
|
14459
14360
|
await this.closeConnection();
|
|
14460
14361
|
}
|
|
@@ -15067,8 +14968,6 @@ var MongoIntegration = class {
|
|
|
15067
14968
|
response.connected = true;
|
|
15068
14969
|
} catch (e) {
|
|
15069
14970
|
response.error = e.message;
|
|
15070
|
-
} finally {
|
|
15071
|
-
await this.client.close();
|
|
15072
14971
|
}
|
|
15073
14972
|
return response;
|
|
15074
14973
|
}
|
|
@@ -17336,39 +17235,11 @@ var hasFilters = (query) => {
|
|
|
17336
17235
|
// ../shared-core/src/utils.ts
|
|
17337
17236
|
var utils_exports3 = {};
|
|
17338
17237
|
__export(utils_exports3, {
|
|
17339
|
-
parallelForeach: () => parallelForeach,
|
|
17340
17238
|
unreachable: () => unreachable
|
|
17341
17239
|
});
|
|
17342
17240
|
function unreachable(value, message = `No such case in exhaustive switch: ${value}`) {
|
|
17343
17241
|
throw new Error(message);
|
|
17344
17242
|
}
|
|
17345
|
-
async function parallelForeach(items, task, maxConcurrency) {
|
|
17346
|
-
const promises = [];
|
|
17347
|
-
let index2 = 0;
|
|
17348
|
-
const processItem = async (item) => {
|
|
17349
|
-
try {
|
|
17350
|
-
await task(item);
|
|
17351
|
-
} finally {
|
|
17352
|
-
processNext();
|
|
17353
|
-
}
|
|
17354
|
-
};
|
|
17355
|
-
const processNext = () => {
|
|
17356
|
-
if (index2 >= items.length) {
|
|
17357
|
-
return;
|
|
17358
|
-
}
|
|
17359
|
-
const item = items[index2];
|
|
17360
|
-
index2++;
|
|
17361
|
-
const promise = processItem(item);
|
|
17362
|
-
promises.push(promise);
|
|
17363
|
-
if (promises.length >= maxConcurrency) {
|
|
17364
|
-
Promise.race(promises).then(processNext);
|
|
17365
|
-
} else {
|
|
17366
|
-
processNext();
|
|
17367
|
-
}
|
|
17368
|
-
};
|
|
17369
|
-
processNext();
|
|
17370
|
-
await Promise.all(promises);
|
|
17371
|
-
}
|
|
17372
17243
|
|
|
17373
17244
|
// src/integrations/googlesheets.ts
|
|
17374
17245
|
var ALLOWED_TYPES = [
|
|
@@ -17397,7 +17268,7 @@ var SCHEMA12 = {
|
|
|
17397
17268
|
},
|
|
17398
17269
|
datasource: {
|
|
17399
17270
|
spreadsheetId: {
|
|
17400
|
-
display: "
|
|
17271
|
+
display: "Google Sheet URL",
|
|
17401
17272
|
type: "string" /* STRING */,
|
|
17402
17273
|
required: true
|
|
17403
17274
|
}
|
|
@@ -17518,7 +17389,6 @@ var GoogleSheetsIntegration = class {
|
|
|
17518
17389
|
async connect() {
|
|
17519
17390
|
var _a;
|
|
17520
17391
|
try {
|
|
17521
|
-
await setupCreationAuth(this.config);
|
|
17522
17392
|
let googleConfig = await configs_exports.getGoogleDatasourceConfig();
|
|
17523
17393
|
if (!googleConfig) {
|
|
17524
17394
|
throw new HTTPError("Google config not found", 400);
|
|
@@ -17569,22 +17439,21 @@ var GoogleSheetsIntegration = class {
|
|
|
17569
17439
|
return table;
|
|
17570
17440
|
}
|
|
17571
17441
|
async buildSchema(datasourceId, entities) {
|
|
17442
|
+
if (!this.config.auth) {
|
|
17443
|
+
return;
|
|
17444
|
+
}
|
|
17572
17445
|
await this.connect();
|
|
17573
17446
|
const sheets = this.client.sheetsByIndex;
|
|
17574
17447
|
const tables = {};
|
|
17575
|
-
|
|
17576
|
-
|
|
17577
|
-
|
|
17578
|
-
|
|
17579
|
-
|
|
17580
|
-
|
|
17581
|
-
|
|
17582
|
-
|
|
17583
|
-
|
|
17584
|
-
);
|
|
17585
|
-
},
|
|
17586
|
-
10
|
|
17587
|
-
);
|
|
17448
|
+
for (let sheet of sheets) {
|
|
17449
|
+
await sheet.getRows();
|
|
17450
|
+
const id = buildExternalTableId(datasourceId, sheet.title);
|
|
17451
|
+
tables[sheet.title] = this.getTableSchema(
|
|
17452
|
+
sheet.title,
|
|
17453
|
+
sheet.headerValues,
|
|
17454
|
+
id
|
|
17455
|
+
);
|
|
17456
|
+
}
|
|
17588
17457
|
const final = finaliseExternalTables(tables, entities);
|
|
17589
17458
|
this.tables = final.tables;
|
|
17590
17459
|
this.schemaErrors = final.errors;
|
|
@@ -17830,16 +17699,6 @@ var GoogleSheetsIntegration = class {
|
|
|
17830
17699
|
}
|
|
17831
17700
|
}
|
|
17832
17701
|
};
|
|
17833
|
-
async function setupCreationAuth(datasouce) {
|
|
17834
|
-
if (datasouce.continueSetupId) {
|
|
17835
|
-
const appId = context_exports.getAppId();
|
|
17836
|
-
const tokens = await cache_exports.get(
|
|
17837
|
-
`datasource:creation:${appId}:google:${datasouce.continueSetupId}`
|
|
17838
|
-
);
|
|
17839
|
-
datasouce.auth = tokens.tokens;
|
|
17840
|
-
delete datasouce.continueSetupId;
|
|
17841
|
-
}
|
|
17842
|
-
}
|
|
17843
17702
|
var googlesheets_default = {
|
|
17844
17703
|
schema: SCHEMA12,
|
|
17845
17704
|
integration: GoogleSheetsIntegration
|
|
@@ -18618,24 +18477,24 @@ init_src();
|
|
|
18618
18477
|
var budibaseTempDir2 = objectStore_exports2.budibaseTempDir;
|
|
18619
18478
|
|
|
18620
18479
|
// src/utilities/fileSystem/app.ts
|
|
18621
|
-
var
|
|
18480
|
+
var import_path5 = require("path");
|
|
18622
18481
|
|
|
18623
18482
|
// src/utilities/fileSystem/filesystem.ts
|
|
18624
|
-
var
|
|
18625
|
-
var
|
|
18483
|
+
var import_fs4 = __toESM(require("fs"));
|
|
18484
|
+
var import_path4 = require("path");
|
|
18626
18485
|
var import_tar = __toESM(require("tar"));
|
|
18627
18486
|
var uuid2 = require("uuid/v4");
|
|
18628
|
-
var TOP_LEVEL_PATH = environment_default.TOP_LEVEL_PATH || (0,
|
|
18487
|
+
var TOP_LEVEL_PATH = environment_default.TOP_LEVEL_PATH || (0, import_path4.resolve)((0, import_path4.join)(__dirname, "..", "..", ".."));
|
|
18629
18488
|
var streamFile = (path2) => {
|
|
18630
|
-
return
|
|
18489
|
+
return import_fs4.default.createReadStream(path2);
|
|
18631
18490
|
};
|
|
18632
18491
|
var createTempFolder = (item) => {
|
|
18633
|
-
const path2 = (0,
|
|
18492
|
+
const path2 = (0, import_path4.join)(budibaseTempDir2(), item);
|
|
18634
18493
|
try {
|
|
18635
|
-
if (
|
|
18636
|
-
|
|
18494
|
+
if (import_fs4.default.existsSync(path2)) {
|
|
18495
|
+
import_fs4.default.rmSync(path2, { recursive: true, force: true });
|
|
18637
18496
|
}
|
|
18638
|
-
|
|
18497
|
+
import_fs4.default.mkdirSync(path2);
|
|
18639
18498
|
} catch (err) {
|
|
18640
18499
|
throw new Error(`Path cannot be created: ${err.message}`);
|
|
18641
18500
|
}
|
|
@@ -18649,18 +18508,18 @@ var extractTarball = async (fromFilePath, toPath) => {
|
|
|
18649
18508
|
};
|
|
18650
18509
|
|
|
18651
18510
|
// src/utilities/fileSystem/app.ts
|
|
18652
|
-
var NODE_MODULES_PATH = (0,
|
|
18511
|
+
var NODE_MODULES_PATH = (0, import_path5.join)(TOP_LEVEL_PATH, "node_modules");
|
|
18653
18512
|
|
|
18654
18513
|
// src/utilities/fileSystem/plugin.ts
|
|
18655
|
-
var
|
|
18656
|
-
var
|
|
18657
|
-
var DATASOURCE_PATH = (0,
|
|
18658
|
-
var AUTOMATION_PATH = (0,
|
|
18514
|
+
var import_fs5 = __toESM(require("fs"));
|
|
18515
|
+
var import_path6 = require("path");
|
|
18516
|
+
var DATASOURCE_PATH = (0, import_path6.join)(budibaseTempDir2(), "datasource");
|
|
18517
|
+
var AUTOMATION_PATH = (0, import_path6.join)(budibaseTempDir2(), "automation");
|
|
18659
18518
|
var getPluginMetadata = async (path2) => {
|
|
18660
18519
|
let metadata2 = {};
|
|
18661
18520
|
try {
|
|
18662
|
-
const pkg2 =
|
|
18663
|
-
const schema =
|
|
18521
|
+
const pkg2 = import_fs5.default.readFileSync((0, import_path6.join)(path2, "package.json"), "utf8");
|
|
18522
|
+
const schema = import_fs5.default.readFileSync((0, import_path6.join)(path2, "schema.json"), "utf8");
|
|
18664
18523
|
metadata2.schema = JSON.parse(schema);
|
|
18665
18524
|
metadata2.package = JSON.parse(pkg2);
|
|
18666
18525
|
if (!metadata2.package.name || !metadata2.package.version || !metadata2.package.description) {
|
|
@@ -18678,19 +18537,19 @@ var getPluginMetadata = async (path2) => {
|
|
|
18678
18537
|
async function getPluginImpl(path2, plugin) {
|
|
18679
18538
|
var _a;
|
|
18680
18539
|
const hash3 = (_a = plugin.schema) == null ? void 0 : _a.hash;
|
|
18681
|
-
if (!
|
|
18682
|
-
|
|
18540
|
+
if (!import_fs5.default.existsSync(path2)) {
|
|
18541
|
+
import_fs5.default.mkdirSync(path2);
|
|
18683
18542
|
}
|
|
18684
|
-
const filename = (0,
|
|
18543
|
+
const filename = (0, import_path6.join)(path2, plugin.name);
|
|
18685
18544
|
const metadataName = `${filename}.bbmetadata`;
|
|
18686
|
-
if (
|
|
18687
|
-
const currentHash =
|
|
18545
|
+
if (import_fs5.default.existsSync(filename)) {
|
|
18546
|
+
const currentHash = import_fs5.default.readFileSync(metadataName, "utf8");
|
|
18688
18547
|
if (currentHash === hash3) {
|
|
18689
18548
|
return require(filename);
|
|
18690
18549
|
} else {
|
|
18691
18550
|
console.log(`Updating plugin: ${plugin.name}`);
|
|
18692
18551
|
delete require.cache[require.resolve(filename)];
|
|
18693
|
-
|
|
18552
|
+
import_fs5.default.unlinkSync(filename);
|
|
18694
18553
|
}
|
|
18695
18554
|
}
|
|
18696
18555
|
const pluginKey = objectStore_exports2.getPluginJSKey(plugin);
|
|
@@ -18698,8 +18557,8 @@ async function getPluginImpl(path2, plugin) {
|
|
|
18698
18557
|
objectStore_exports2.ObjectStoreBuckets.PLUGINS,
|
|
18699
18558
|
pluginKey
|
|
18700
18559
|
);
|
|
18701
|
-
|
|
18702
|
-
|
|
18560
|
+
import_fs5.default.writeFileSync(filename, pluginJs);
|
|
18561
|
+
import_fs5.default.writeFileSync(metadataName, hash3);
|
|
18703
18562
|
return require(filename);
|
|
18704
18563
|
}
|
|
18705
18564
|
var getDatasourcePlugin = async (plugin) => {
|
|
@@ -18734,20 +18593,19 @@ var GLOBAL_DB_EXPORT_FILE = "global.txt";
|
|
|
18734
18593
|
var STATIC_APP_FILES = ["manifest.json", "budibase-client.js"];
|
|
18735
18594
|
|
|
18736
18595
|
// src/sdk/app/backups/exports.ts
|
|
18737
|
-
var
|
|
18738
|
-
var
|
|
18739
|
-
var import_tar2 = __toESM(require("tar"));
|
|
18596
|
+
var import_fs6 = __toESM(require("fs"));
|
|
18597
|
+
var import_path7 = require("path");
|
|
18740
18598
|
var uuid3 = require("uuid/v4");
|
|
18599
|
+
var tar3 = require("tar");
|
|
18741
18600
|
var MemoryStream = require("memorystream");
|
|
18742
18601
|
function tarFilesToTmp(tmpDir, files2) {
|
|
18743
|
-
const
|
|
18744
|
-
|
|
18745
|
-
import_tar2.default.create(
|
|
18602
|
+
const exportFile = (0, import_path7.join)(budibaseTempDir2(), `${uuid3()}.tar.gz`);
|
|
18603
|
+
tar3.create(
|
|
18746
18604
|
{
|
|
18747
18605
|
sync: true,
|
|
18748
18606
|
gzip: true,
|
|
18749
18607
|
file: exportFile,
|
|
18750
|
-
|
|
18608
|
+
recursive: true,
|
|
18751
18609
|
cwd: tmpDir
|
|
18752
18610
|
},
|
|
18753
18611
|
files2
|
|
@@ -18764,7 +18622,7 @@ async function exportDB(dbName, opts = {}) {
|
|
|
18764
18622
|
return db_exports.doWithDB(dbName, async (db2) => {
|
|
18765
18623
|
if (opts == null ? void 0 : opts.exportPath) {
|
|
18766
18624
|
const path2 = opts == null ? void 0 : opts.exportPath;
|
|
18767
|
-
const writeStream =
|
|
18625
|
+
const writeStream = import_fs6.default.createWriteStream(path2);
|
|
18768
18626
|
await db2.dump(writeStream, exportOpts);
|
|
18769
18627
|
return path2;
|
|
18770
18628
|
} else {
|
|
@@ -18797,9 +18655,9 @@ async function exportApp(appId, config) {
|
|
|
18797
18655
|
for (let path2 of STATIC_APP_FILES) {
|
|
18798
18656
|
const contents = await objectStore_exports2.retrieve(
|
|
18799
18657
|
ObjectStoreBuckets2.APPS,
|
|
18800
|
-
(0,
|
|
18658
|
+
(0, import_path7.join)(appPath, path2)
|
|
18801
18659
|
);
|
|
18802
|
-
|
|
18660
|
+
import_fs6.default.writeFileSync((0, import_path7.join)(tmpPath, path2), contents);
|
|
18803
18661
|
}
|
|
18804
18662
|
} else {
|
|
18805
18663
|
tmpPath = await objectStore_exports2.retrieveDirectory(
|
|
@@ -18808,48 +18666,33 @@ async function exportApp(appId, config) {
|
|
|
18808
18666
|
);
|
|
18809
18667
|
}
|
|
18810
18668
|
}
|
|
18811
|
-
const downloadedPath = (0,
|
|
18812
|
-
if (
|
|
18813
|
-
const allFiles =
|
|
18669
|
+
const downloadedPath = (0, import_path7.join)(tmpPath, appPath);
|
|
18670
|
+
if (import_fs6.default.existsSync(downloadedPath)) {
|
|
18671
|
+
const allFiles = import_fs6.default.readdirSync(downloadedPath);
|
|
18814
18672
|
for (let file of allFiles) {
|
|
18815
|
-
const path2 = (0,
|
|
18816
|
-
|
|
18673
|
+
const path2 = (0, import_path7.join)(downloadedPath, file);
|
|
18674
|
+
import_fs6.default.renameSync(path2, (0, import_path7.join)(downloadedPath, "..", file));
|
|
18817
18675
|
}
|
|
18818
|
-
|
|
18676
|
+
import_fs6.default.rmdirSync(downloadedPath);
|
|
18819
18677
|
}
|
|
18820
|
-
const dbPath = (0,
|
|
18678
|
+
const dbPath = (0, import_path7.join)(tmpPath, DB_EXPORT_FILE);
|
|
18821
18679
|
await exportDB(appId, {
|
|
18822
18680
|
filter: defineFilter(config == null ? void 0 : config.excludeRows, config == null ? void 0 : config.excludeLogs),
|
|
18823
18681
|
exportPath: dbPath
|
|
18824
18682
|
});
|
|
18825
|
-
if (config == null ? void 0 : config.encryptPassword) {
|
|
18826
|
-
for (let file of import_fs7.default.readdirSync(tmpPath)) {
|
|
18827
|
-
const path2 = (0, import_path8.join)(tmpPath, file);
|
|
18828
|
-
await encryption_exports.encryptFile(
|
|
18829
|
-
{ dir: tmpPath, filename: file },
|
|
18830
|
-
config.encryptPassword
|
|
18831
|
-
);
|
|
18832
|
-
import_fs7.default.rmSync(path2);
|
|
18833
|
-
}
|
|
18834
|
-
}
|
|
18835
18683
|
if (config == null ? void 0 : config.tar) {
|
|
18836
|
-
const tarPath = tarFilesToTmp(tmpPath,
|
|
18837
|
-
|
|
18684
|
+
const tarPath = tarFilesToTmp(tmpPath, import_fs6.default.readdirSync(tmpPath));
|
|
18685
|
+
import_fs6.default.rmSync(tmpPath, { recursive: true, force: true });
|
|
18838
18686
|
return tarPath;
|
|
18839
18687
|
} else {
|
|
18840
18688
|
return tmpPath;
|
|
18841
18689
|
}
|
|
18842
18690
|
}
|
|
18843
|
-
async function streamExportApp({
|
|
18844
|
-
appId,
|
|
18845
|
-
excludeRows,
|
|
18846
|
-
encryptPassword
|
|
18847
|
-
}) {
|
|
18691
|
+
async function streamExportApp(appId, excludeRows) {
|
|
18848
18692
|
const tmpPath = await exportApp(appId, {
|
|
18849
18693
|
excludeRows,
|
|
18850
18694
|
excludeLogs: true,
|
|
18851
|
-
tar: true
|
|
18852
|
-
encryptPassword
|
|
18695
|
+
tar: true
|
|
18853
18696
|
});
|
|
18854
18697
|
return streamFile(tmpPath);
|
|
18855
18698
|
}
|
|
@@ -18863,8 +18706,8 @@ __export(imports_exports, {
|
|
|
18863
18706
|
untarFile: () => untarFile,
|
|
18864
18707
|
updateAttachmentColumns: () => updateAttachmentColumns
|
|
18865
18708
|
});
|
|
18866
|
-
var
|
|
18867
|
-
var
|
|
18709
|
+
var import_path8 = require("path");
|
|
18710
|
+
var import_fs7 = __toESM(require("fs"));
|
|
18868
18711
|
init_src();
|
|
18869
18712
|
var uuid4 = require("uuid/v4");
|
|
18870
18713
|
var tar4 = require("tar");
|
|
@@ -18931,16 +18774,16 @@ async function getTemplateStream(template) {
|
|
|
18931
18774
|
throw new Error("Cannot import a non-text based file.");
|
|
18932
18775
|
}
|
|
18933
18776
|
if (template.file) {
|
|
18934
|
-
return
|
|
18777
|
+
return import_fs7.default.createReadStream(template.file.path);
|
|
18935
18778
|
} else if (template.key) {
|
|
18936
18779
|
const [type, name2] = template.key.split("/");
|
|
18937
18780
|
const tmpPath = await downloadTemplate(type, name2);
|
|
18938
|
-
return
|
|
18781
|
+
return import_fs7.default.createReadStream((0, import_path8.join)(tmpPath, name2, "db", "dump.txt"));
|
|
18939
18782
|
}
|
|
18940
18783
|
}
|
|
18941
18784
|
function untarFile(file) {
|
|
18942
|
-
const tmpPath = (0,
|
|
18943
|
-
|
|
18785
|
+
const tmpPath = (0, import_path8.join)(budibaseTempDir2(), uuid4());
|
|
18786
|
+
import_fs7.default.mkdirSync(tmpPath);
|
|
18944
18787
|
tar4.extract({
|
|
18945
18788
|
sync: true,
|
|
18946
18789
|
cwd: tmpPath,
|
|
@@ -18948,49 +18791,31 @@ function untarFile(file) {
|
|
|
18948
18791
|
});
|
|
18949
18792
|
return tmpPath;
|
|
18950
18793
|
}
|
|
18951
|
-
async function decryptFiles(path2, password) {
|
|
18952
|
-
try {
|
|
18953
|
-
for (let file of import_fs8.default.readdirSync(path2)) {
|
|
18954
|
-
const inputPath = (0, import_path9.join)(path2, file);
|
|
18955
|
-
const outputPath = inputPath.replace(/\.enc$/, "");
|
|
18956
|
-
await encryption_exports.decryptFile(inputPath, outputPath, password);
|
|
18957
|
-
import_fs8.default.rmSync(inputPath);
|
|
18958
|
-
}
|
|
18959
|
-
} catch (err) {
|
|
18960
|
-
if (err.message === "incorrect header check") {
|
|
18961
|
-
throw new Error("File cannot be imported");
|
|
18962
|
-
}
|
|
18963
|
-
throw err;
|
|
18964
|
-
}
|
|
18965
|
-
}
|
|
18966
18794
|
function getGlobalDBFile(tmpPath) {
|
|
18967
|
-
return
|
|
18795
|
+
return import_fs7.default.readFileSync((0, import_path8.join)(tmpPath, GLOBAL_DB_EXPORT_FILE), "utf8");
|
|
18968
18796
|
}
|
|
18969
18797
|
function getListOfAppsInMulti(tmpPath) {
|
|
18970
|
-
return
|
|
18798
|
+
return import_fs7.default.readdirSync(tmpPath).filter((dir) => dir !== GLOBAL_DB_EXPORT_FILE);
|
|
18971
18799
|
}
|
|
18972
18800
|
async function importApp(appId, db2, template) {
|
|
18973
18801
|
var _a, _b;
|
|
18974
18802
|
let prodAppId = db_exports.getProdAppID(appId);
|
|
18975
18803
|
let dbStream;
|
|
18976
18804
|
const isTar = template.file && ((_b = (_a = template == null ? void 0 : template.file) == null ? void 0 : _a.type) == null ? void 0 : _b.endsWith("gzip"));
|
|
18977
|
-
const isDirectory = template.file &&
|
|
18805
|
+
const isDirectory = template.file && import_fs7.default.lstatSync(template.file.path).isDirectory();
|
|
18978
18806
|
if (template.file && (isTar || isDirectory)) {
|
|
18979
18807
|
const tmpPath = isTar ? untarFile(template.file) : template.file.path;
|
|
18980
|
-
|
|
18981
|
-
await decryptFiles(tmpPath, template.file.password);
|
|
18982
|
-
}
|
|
18983
|
-
const contents = import_fs8.default.readdirSync(tmpPath);
|
|
18808
|
+
const contents = import_fs7.default.readdirSync(tmpPath);
|
|
18984
18809
|
if (contents.length) {
|
|
18985
18810
|
let promises = [];
|
|
18986
18811
|
let excludedFiles = [GLOBAL_DB_EXPORT_FILE, DB_EXPORT_FILE];
|
|
18987
18812
|
for (let filename of contents) {
|
|
18988
|
-
const path2 = (0,
|
|
18813
|
+
const path2 = (0, import_path8.join)(tmpPath, filename);
|
|
18989
18814
|
if (excludedFiles.includes(filename)) {
|
|
18990
18815
|
continue;
|
|
18991
18816
|
}
|
|
18992
|
-
filename = (0,
|
|
18993
|
-
if (
|
|
18817
|
+
filename = (0, import_path8.join)(prodAppId, filename);
|
|
18818
|
+
if (import_fs7.default.lstatSync(path2).isDirectory()) {
|
|
18994
18819
|
promises.push(
|
|
18995
18820
|
objectStore_exports2.uploadDirectory(ObjectStoreBuckets2.APPS, path2, filename)
|
|
18996
18821
|
);
|
|
@@ -19006,7 +18831,7 @@ async function importApp(appId, db2, template) {
|
|
|
19006
18831
|
}
|
|
19007
18832
|
await Promise.all(promises);
|
|
19008
18833
|
}
|
|
19009
|
-
dbStream =
|
|
18834
|
+
dbStream = import_fs7.default.createReadStream((0, import_path8.join)(tmpPath, DB_EXPORT_FILE));
|
|
19010
18835
|
} else {
|
|
19011
18836
|
dbStream = await getTemplateStream(template);
|
|
19012
18837
|
}
|
|
@@ -20125,17 +19950,17 @@ __export(version_exports, {
|
|
|
20125
19950
|
getLicenseVersion: () => getLicenseVersion,
|
|
20126
19951
|
getProVersion: () => getProVersion
|
|
20127
19952
|
});
|
|
20128
|
-
var
|
|
20129
|
-
var
|
|
19953
|
+
var import_fs8 = __toESM(require("fs"));
|
|
19954
|
+
var import_path9 = __toESM(require("path"));
|
|
20130
19955
|
var getLicenseVersion = () => {
|
|
20131
19956
|
if (environment_default2.isDev()) {
|
|
20132
19957
|
const DEV_VER_FILENAME = "dev-version.txt";
|
|
20133
|
-
const verFile =
|
|
20134
|
-
if (
|
|
20135
|
-
return
|
|
19958
|
+
const verFile = import_path9.default.join(objectStore_exports2.budibaseTempDir(), DEV_VER_FILENAME);
|
|
19959
|
+
if (import_fs8.default.existsSync(verFile)) {
|
|
19960
|
+
return import_fs8.default.readFileSync(verFile, "utf8");
|
|
20136
19961
|
} else {
|
|
20137
19962
|
const devVer = utils_exports2.newid();
|
|
20138
|
-
|
|
19963
|
+
import_fs8.default.writeFileSync(verFile, devVer);
|
|
20139
19964
|
return devVer;
|
|
20140
19965
|
}
|
|
20141
19966
|
} else {
|
|
@@ -20494,16 +20319,16 @@ __export(offline_exports, {
|
|
|
20494
20319
|
getOfflineLicense: () => getOfflineLicense,
|
|
20495
20320
|
writeOfflineLicenseToDisk: () => writeOfflineLicenseToDisk
|
|
20496
20321
|
});
|
|
20497
|
-
var
|
|
20498
|
-
var
|
|
20322
|
+
var import_fs9 = __toESM(require("fs"));
|
|
20323
|
+
var import_path10 = require("path");
|
|
20499
20324
|
var import_os2 = require("os");
|
|
20500
20325
|
var import_jsonwebtoken = __toESM(require("jsonwebtoken"));
|
|
20501
20326
|
var SUB_DIRECTORY = environment_default2.isTest() ? ".budibase-test" : ".budibase";
|
|
20502
|
-
var DIRECTORY = (0,
|
|
20327
|
+
var DIRECTORY = (0, import_path10.join)((0, import_os2.tmpdir)(), SUB_DIRECTORY);
|
|
20503
20328
|
var OFFLINE_LICENSE_FILE = "offline_license.txt";
|
|
20504
|
-
var LICENSE_FILE_PATH = (0,
|
|
20505
|
-
if (!
|
|
20506
|
-
|
|
20329
|
+
var LICENSE_FILE_PATH = (0, import_path10.join)(DIRECTORY, OFFLINE_LICENSE_FILE);
|
|
20330
|
+
if (!import_fs9.default.existsSync(DIRECTORY)) {
|
|
20331
|
+
import_fs9.default.mkdirSync(DIRECTORY);
|
|
20507
20332
|
}
|
|
20508
20333
|
var PUBLIC_KEY = "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvz3jePLCFBXZ19c8Dpkv\nXtSgOhKFOcvQdo/LV0KJRUzQWDPWuO4ILtBtnqhjtIzZH4CH0qCYBet5L6Qr4CM1\nl2HXiAD1Q2rlHNW9wDaYyKb1F5f+v4RyqCAyzlkwRdksmkLeECTboojNnmRCrE3C\n8suunQP5bEScqEY2kclqzSf8e6xqMzPUg3mL/pNa1iEv7TuLbU9nJfgR36l0WmZY\n94fWnSaT8OSXSqcxsaByf06gfS3HAoTJNc7eqz1Hf9fUORQGPUAnFK8cT3SfdA36\nd/o3ZWE1TTj1zYwlCLN5qRKr3hU8nC3xEYNEbkB9SfTRaOq9Q7P8WmfLkoCPm3pR\nmwIDAQAB\n-----END PUBLIC KEY-----\n";
|
|
20509
20334
|
function getOfflineLicense() {
|
|
@@ -20514,16 +20339,16 @@ function getOfflineLicense() {
|
|
|
20514
20339
|
}
|
|
20515
20340
|
}
|
|
20516
20341
|
function getOfflineLicenseFromDisk() {
|
|
20517
|
-
if (
|
|
20518
|
-
const token =
|
|
20342
|
+
if (import_fs9.default.existsSync(LICENSE_FILE_PATH)) {
|
|
20343
|
+
const token = import_fs9.default.readFileSync(LICENSE_FILE_PATH, { encoding: "utf-8" });
|
|
20519
20344
|
return import_jsonwebtoken.default.verify(token, PUBLIC_KEY, { algorithms: ["RS256"] });
|
|
20520
20345
|
}
|
|
20521
20346
|
}
|
|
20522
20347
|
function writeOfflineLicenseToDisk(signedLicense) {
|
|
20523
|
-
|
|
20348
|
+
import_fs9.default.writeFileSync(LICENSE_FILE_PATH, signedLicense, { encoding: "utf-8" });
|
|
20524
20349
|
}
|
|
20525
20350
|
function deleteOfflineLicense() {
|
|
20526
|
-
|
|
20351
|
+
import_fs9.default.rmSync(LICENSE_FILE_PATH, { force: true });
|
|
20527
20352
|
}
|
|
20528
20353
|
|
|
20529
20354
|
// ../pro/packages/pro/src/sdk/licensing/licenses/licenses.ts
|
|
@@ -21728,10 +21553,10 @@ __export(plugins_exports, {
|
|
|
21728
21553
|
init_src();
|
|
21729
21554
|
|
|
21730
21555
|
// ../pro/packages/pro/src/utilities/fileSystem.ts
|
|
21731
|
-
var
|
|
21732
|
-
var
|
|
21556
|
+
var import_fs10 = __toESM(require("fs"));
|
|
21557
|
+
var import_path11 = require("path");
|
|
21733
21558
|
function loadJSFile(directory2, name2) {
|
|
21734
|
-
return
|
|
21559
|
+
return import_fs10.default.readFileSync((0, import_path11.join)(directory2, name2), "utf8");
|
|
21735
21560
|
}
|
|
21736
21561
|
|
|
21737
21562
|
// ../pro/packages/pro/src/sdk/plugins/index.ts
|
|
@@ -22368,7 +22193,7 @@ __export(processing_exports, {
|
|
|
22368
22193
|
init: () => init12
|
|
22369
22194
|
});
|
|
22370
22195
|
init_src();
|
|
22371
|
-
var
|
|
22196
|
+
var import_fs11 = __toESM(require("fs"));
|
|
22372
22197
|
async function init12(opts) {
|
|
22373
22198
|
await getBackupQueue().process(async (job) => {
|
|
22374
22199
|
const data = job.data;
|
|
@@ -22436,8 +22261,8 @@ async function runBackup(trigger, tenantId, appId, opts) {
|
|
|
22436
22261
|
}
|
|
22437
22262
|
});
|
|
22438
22263
|
await updateMetadata("complete" /* COMPLETE */, { filename, contents });
|
|
22439
|
-
if (
|
|
22440
|
-
|
|
22264
|
+
if (import_fs11.default.existsSync(tarPath)) {
|
|
22265
|
+
import_fs11.default.rmSync(tarPath);
|
|
22441
22266
|
}
|
|
22442
22267
|
} catch (err) {
|
|
22443
22268
|
logging_exports.logAlert("App backup error", err);
|
|
@@ -22890,7 +22715,7 @@ router3.post(
|
|
|
22890
22715
|
|
|
22891
22716
|
// ../pro/packages/pro/src/api/controllers/apps/backups.ts
|
|
22892
22717
|
init_src();
|
|
22893
|
-
var
|
|
22718
|
+
var import_fs12 = __toESM(require("fs"));
|
|
22894
22719
|
async function checkAppID(ctx, appId) {
|
|
22895
22720
|
if (!await utils_exports5.appExists(appId)) {
|
|
22896
22721
|
ctx.throw(400, `Provided app ID: ${appId} - is invalid.`);
|
|
@@ -22976,7 +22801,7 @@ async function downloadBackup(ctx) {
|
|
|
22976
22801
|
const backupId = ctx.params.backupId;
|
|
22977
22802
|
const { metadata: metadata2, path: path2 } = await backups_default2.downloadAppBackup(backupId);
|
|
22978
22803
|
ctx.attachment(`backup-${metadata2.timestamp}.tar.gz`);
|
|
22979
|
-
ctx.body =
|
|
22804
|
+
ctx.body = import_fs12.default.createReadStream(path2);
|
|
22980
22805
|
}
|
|
22981
22806
|
|
|
22982
22807
|
// ../pro/packages/pro/src/api/routes/apps/backups.ts
|