@budibase/server 2.7.20-alpha.0 → 2.7.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/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, opts) {
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 param not present.");
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, _profile, done) => {
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
- const id = newid();
11518
- await store(
11519
- `datasource:creation:${authStateCookie.appId}:google:${id}`,
11520
- {
11521
- tokens
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
- ctx.redirect(`${baseUrl}/new?continue_google_setup=${id}`);
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(secret, salt) {
11614
- return import_crypto.default.pbkdf2Sync(secret, salt, ITERATIONS, STRETCH_LENGTH, "sha512");
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(SALT_LENGTH);
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 import_zlib2 = __toESM(require("zlib"));
12389
+ var import_zlib = __toESM(require("zlib"));
12473
12390
  var import_util = require("util");
12474
- var import_path4 = require("path");
12475
- var import_fs4 = __toESM(require("fs"));
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 import_path3 = require("path");
12396
+ var import_path2 = require("path");
12480
12397
  var import_os = require("os");
12481
- var import_fs3 = __toESM(require("fs"));
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, import_path3.join)((0, import_os.tmpdir)(), ".budibase");
12491
- if (!import_fs3.default.existsSync(bbTmp)) {
12492
- import_fs3.default.mkdirSync(bbTmp);
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 = import_fs4.default.readFileSync(path2);
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, import_path4.join)(budibaseTempDir(), (0, import_uuid3.v4)());
12683
- import_fs4.default.writeFileSync(outputPath, data);
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, import_path4.join)(budibaseTempDir(), (0, import_uuid3.v4)());
12688
- import_fs4.default.mkdirSync(writePath);
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
- import_fs4.default.mkdirSync((0, import_path4.join)(writePath, ...dirs), { recursive: true });
12617
+ import_fs3.default.mkdirSync((0, import_path3.join)(writePath, ...dirs), { recursive: true });
12701
12618
  }
12702
- import_fs4.default.writeFileSync((0, import_path4.join)(writePath, ...possiblePath), data);
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 = import_fs4.default.readdirSync(localPath, { withFileTypes: true });
12673
+ const files2 = import_fs3.default.readdirSync(localPath, { withFileTypes: true });
12757
12674
  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);
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, import_fs4.default.createReadStream(local)));
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, import_zlib2.default.createUnzip(), import_tar_fs.default.extract(path2));
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, import_path4.join)(budibaseTempDir(), path2);
12785
- await streamPipeline(response.body, import_zlib2.default.createUnzip(), import_tar_fs.default.extract(tmpPath));
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
  }
@@ -14438,8 +14355,7 @@ var PostgresIntegration = class extends sql_default {
14438
14355
  try {
14439
14356
  await this.openConnection();
14440
14357
  const columnsResponse = await this.client.query(this.COLUMNS_SQL);
14441
- const names = columnsResponse.rows.map((row) => row.table_name);
14442
- return [...new Set(names)];
14358
+ return columnsResponse.rows.map((row) => row.table_name);
14443
14359
  } finally {
14444
14360
  await this.closeConnection();
14445
14361
  }
@@ -15052,8 +14968,6 @@ var MongoIntegration = class {
15052
14968
  response.connected = true;
15053
14969
  } catch (e) {
15054
14970
  response.error = e.message;
15055
- } finally {
15056
- await this.client.close();
15057
14971
  }
15058
14972
  return response;
15059
14973
  }
@@ -17321,39 +17235,11 @@ var hasFilters = (query) => {
17321
17235
  // ../shared-core/src/utils.ts
17322
17236
  var utils_exports3 = {};
17323
17237
  __export(utils_exports3, {
17324
- parallelForeach: () => parallelForeach,
17325
17238
  unreachable: () => unreachable
17326
17239
  });
17327
17240
  function unreachable(value, message = `No such case in exhaustive switch: ${value}`) {
17328
17241
  throw new Error(message);
17329
17242
  }
17330
- async function parallelForeach(items, task, maxConcurrency) {
17331
- const promises = [];
17332
- let index2 = 0;
17333
- const processItem = async (item) => {
17334
- try {
17335
- await task(item);
17336
- } finally {
17337
- processNext();
17338
- }
17339
- };
17340
- const processNext = () => {
17341
- if (index2 >= items.length) {
17342
- return;
17343
- }
17344
- const item = items[index2];
17345
- index2++;
17346
- const promise = processItem(item);
17347
- promises.push(promise);
17348
- if (promises.length >= maxConcurrency) {
17349
- Promise.race(promises).then(processNext);
17350
- } else {
17351
- processNext();
17352
- }
17353
- };
17354
- processNext();
17355
- await Promise.all(promises);
17356
- }
17357
17243
 
17358
17244
  // src/integrations/googlesheets.ts
17359
17245
  var ALLOWED_TYPES = [
@@ -17382,7 +17268,7 @@ var SCHEMA12 = {
17382
17268
  },
17383
17269
  datasource: {
17384
17270
  spreadsheetId: {
17385
- display: "Spreadsheet URL",
17271
+ display: "Google Sheet URL",
17386
17272
  type: "string" /* STRING */,
17387
17273
  required: true
17388
17274
  }
@@ -17503,7 +17389,6 @@ var GoogleSheetsIntegration = class {
17503
17389
  async connect() {
17504
17390
  var _a;
17505
17391
  try {
17506
- await setupCreationAuth(this.config);
17507
17392
  let googleConfig = await configs_exports.getGoogleDatasourceConfig();
17508
17393
  if (!googleConfig) {
17509
17394
  throw new HTTPError("Google config not found", 400);
@@ -17554,22 +17439,21 @@ var GoogleSheetsIntegration = class {
17554
17439
  return table;
17555
17440
  }
17556
17441
  async buildSchema(datasourceId, entities) {
17442
+ if (!this.config.auth) {
17443
+ return;
17444
+ }
17557
17445
  await this.connect();
17558
17446
  const sheets = this.client.sheetsByIndex;
17559
17447
  const tables = {};
17560
- await utils_exports3.parallelForeach(
17561
- sheets,
17562
- async (sheet) => {
17563
- await sheet.getRows({ limit: 0, offset: 0 });
17564
- const id = buildExternalTableId(datasourceId, sheet.title);
17565
- tables[sheet.title] = this.getTableSchema(
17566
- sheet.title,
17567
- sheet.headerValues,
17568
- id
17569
- );
17570
- },
17571
- 10
17572
- );
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
+ }
17573
17457
  const final = finaliseExternalTables(tables, entities);
17574
17458
  this.tables = final.tables;
17575
17459
  this.schemaErrors = final.errors;
@@ -17815,16 +17699,6 @@ var GoogleSheetsIntegration = class {
17815
17699
  }
17816
17700
  }
17817
17701
  };
17818
- async function setupCreationAuth(datasouce) {
17819
- if (datasouce.continueSetupId) {
17820
- const appId = context_exports.getAppId();
17821
- const tokens = await cache_exports.get(
17822
- `datasource:creation:${appId}:google:${datasouce.continueSetupId}`
17823
- );
17824
- datasouce.auth = tokens.tokens;
17825
- delete datasouce.continueSetupId;
17826
- }
17827
- }
17828
17702
  var googlesheets_default = {
17829
17703
  schema: SCHEMA12,
17830
17704
  integration: GoogleSheetsIntegration
@@ -18603,24 +18477,24 @@ init_src();
18603
18477
  var budibaseTempDir2 = objectStore_exports2.budibaseTempDir;
18604
18478
 
18605
18479
  // src/utilities/fileSystem/app.ts
18606
- var import_path6 = require("path");
18480
+ var import_path5 = require("path");
18607
18481
 
18608
18482
  // src/utilities/fileSystem/filesystem.ts
18609
- var import_fs5 = __toESM(require("fs"));
18610
- var import_path5 = require("path");
18483
+ var import_fs4 = __toESM(require("fs"));
18484
+ var import_path4 = require("path");
18611
18485
  var import_tar = __toESM(require("tar"));
18612
18486
  var uuid2 = require("uuid/v4");
18613
- var TOP_LEVEL_PATH = environment_default.TOP_LEVEL_PATH || (0, import_path5.resolve)((0, import_path5.join)(__dirname, "..", "..", ".."));
18487
+ var TOP_LEVEL_PATH = environment_default.TOP_LEVEL_PATH || (0, import_path4.resolve)((0, import_path4.join)(__dirname, "..", "..", ".."));
18614
18488
  var streamFile = (path2) => {
18615
- return import_fs5.default.createReadStream(path2);
18489
+ return import_fs4.default.createReadStream(path2);
18616
18490
  };
18617
18491
  var createTempFolder = (item) => {
18618
- const path2 = (0, import_path5.join)(budibaseTempDir2(), item);
18492
+ const path2 = (0, import_path4.join)(budibaseTempDir2(), item);
18619
18493
  try {
18620
- if (import_fs5.default.existsSync(path2)) {
18621
- import_fs5.default.rmSync(path2, { recursive: true, force: true });
18494
+ if (import_fs4.default.existsSync(path2)) {
18495
+ import_fs4.default.rmSync(path2, { recursive: true, force: true });
18622
18496
  }
18623
- import_fs5.default.mkdirSync(path2);
18497
+ import_fs4.default.mkdirSync(path2);
18624
18498
  } catch (err) {
18625
18499
  throw new Error(`Path cannot be created: ${err.message}`);
18626
18500
  }
@@ -18634,18 +18508,18 @@ var extractTarball = async (fromFilePath, toPath) => {
18634
18508
  };
18635
18509
 
18636
18510
  // src/utilities/fileSystem/app.ts
18637
- var NODE_MODULES_PATH = (0, import_path6.join)(TOP_LEVEL_PATH, "node_modules");
18511
+ var NODE_MODULES_PATH = (0, import_path5.join)(TOP_LEVEL_PATH, "node_modules");
18638
18512
 
18639
18513
  // src/utilities/fileSystem/plugin.ts
18640
- var import_fs6 = __toESM(require("fs"));
18641
- var import_path7 = require("path");
18642
- var DATASOURCE_PATH = (0, import_path7.join)(budibaseTempDir2(), "datasource");
18643
- var AUTOMATION_PATH = (0, import_path7.join)(budibaseTempDir2(), "automation");
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");
18644
18518
  var getPluginMetadata = async (path2) => {
18645
18519
  let metadata2 = {};
18646
18520
  try {
18647
- const pkg2 = import_fs6.default.readFileSync((0, import_path7.join)(path2, "package.json"), "utf8");
18648
- const schema = import_fs6.default.readFileSync((0, import_path7.join)(path2, "schema.json"), "utf8");
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");
18649
18523
  metadata2.schema = JSON.parse(schema);
18650
18524
  metadata2.package = JSON.parse(pkg2);
18651
18525
  if (!metadata2.package.name || !metadata2.package.version || !metadata2.package.description) {
@@ -18663,19 +18537,19 @@ var getPluginMetadata = async (path2) => {
18663
18537
  async function getPluginImpl(path2, plugin) {
18664
18538
  var _a;
18665
18539
  const hash3 = (_a = plugin.schema) == null ? void 0 : _a.hash;
18666
- if (!import_fs6.default.existsSync(path2)) {
18667
- import_fs6.default.mkdirSync(path2);
18540
+ if (!import_fs5.default.existsSync(path2)) {
18541
+ import_fs5.default.mkdirSync(path2);
18668
18542
  }
18669
- const filename = (0, import_path7.join)(path2, plugin.name);
18543
+ const filename = (0, import_path6.join)(path2, plugin.name);
18670
18544
  const metadataName = `${filename}.bbmetadata`;
18671
- if (import_fs6.default.existsSync(filename)) {
18672
- const currentHash = import_fs6.default.readFileSync(metadataName, "utf8");
18545
+ if (import_fs5.default.existsSync(filename)) {
18546
+ const currentHash = import_fs5.default.readFileSync(metadataName, "utf8");
18673
18547
  if (currentHash === hash3) {
18674
18548
  return require(filename);
18675
18549
  } else {
18676
18550
  console.log(`Updating plugin: ${plugin.name}`);
18677
18551
  delete require.cache[require.resolve(filename)];
18678
- import_fs6.default.unlinkSync(filename);
18552
+ import_fs5.default.unlinkSync(filename);
18679
18553
  }
18680
18554
  }
18681
18555
  const pluginKey = objectStore_exports2.getPluginJSKey(plugin);
@@ -18683,8 +18557,8 @@ async function getPluginImpl(path2, plugin) {
18683
18557
  objectStore_exports2.ObjectStoreBuckets.PLUGINS,
18684
18558
  pluginKey
18685
18559
  );
18686
- import_fs6.default.writeFileSync(filename, pluginJs);
18687
- import_fs6.default.writeFileSync(metadataName, hash3);
18560
+ import_fs5.default.writeFileSync(filename, pluginJs);
18561
+ import_fs5.default.writeFileSync(metadataName, hash3);
18688
18562
  return require(filename);
18689
18563
  }
18690
18564
  var getDatasourcePlugin = async (plugin) => {
@@ -18719,20 +18593,19 @@ var GLOBAL_DB_EXPORT_FILE = "global.txt";
18719
18593
  var STATIC_APP_FILES = ["manifest.json", "budibase-client.js"];
18720
18594
 
18721
18595
  // src/sdk/app/backups/exports.ts
18722
- var import_fs7 = __toESM(require("fs"));
18723
- var import_path8 = require("path");
18724
- var import_tar2 = __toESM(require("tar"));
18596
+ var import_fs6 = __toESM(require("fs"));
18597
+ var import_path7 = require("path");
18725
18598
  var uuid3 = require("uuid/v4");
18599
+ var tar3 = require("tar");
18726
18600
  var MemoryStream = require("memorystream");
18727
18601
  function tarFilesToTmp(tmpDir, files2) {
18728
- const fileName = `${uuid3()}.tar.gz`;
18729
- const exportFile = (0, import_path8.join)(budibaseTempDir2(), fileName);
18730
- import_tar2.default.create(
18602
+ const exportFile = (0, import_path7.join)(budibaseTempDir2(), `${uuid3()}.tar.gz`);
18603
+ tar3.create(
18731
18604
  {
18732
18605
  sync: true,
18733
18606
  gzip: true,
18734
18607
  file: exportFile,
18735
- noDirRecurse: false,
18608
+ recursive: true,
18736
18609
  cwd: tmpDir
18737
18610
  },
18738
18611
  files2
@@ -18749,7 +18622,7 @@ async function exportDB(dbName, opts = {}) {
18749
18622
  return db_exports.doWithDB(dbName, async (db2) => {
18750
18623
  if (opts == null ? void 0 : opts.exportPath) {
18751
18624
  const path2 = opts == null ? void 0 : opts.exportPath;
18752
- const writeStream = import_fs7.default.createWriteStream(path2);
18625
+ const writeStream = import_fs6.default.createWriteStream(path2);
18753
18626
  await db2.dump(writeStream, exportOpts);
18754
18627
  return path2;
18755
18628
  } else {
@@ -18782,9 +18655,9 @@ async function exportApp(appId, config) {
18782
18655
  for (let path2 of STATIC_APP_FILES) {
18783
18656
  const contents = await objectStore_exports2.retrieve(
18784
18657
  ObjectStoreBuckets2.APPS,
18785
- (0, import_path8.join)(appPath, path2)
18658
+ (0, import_path7.join)(appPath, path2)
18786
18659
  );
18787
- import_fs7.default.writeFileSync((0, import_path8.join)(tmpPath, path2), contents);
18660
+ import_fs6.default.writeFileSync((0, import_path7.join)(tmpPath, path2), contents);
18788
18661
  }
18789
18662
  } else {
18790
18663
  tmpPath = await objectStore_exports2.retrieveDirectory(
@@ -18793,48 +18666,33 @@ async function exportApp(appId, config) {
18793
18666
  );
18794
18667
  }
18795
18668
  }
18796
- const downloadedPath = (0, import_path8.join)(tmpPath, appPath);
18797
- if (import_fs7.default.existsSync(downloadedPath)) {
18798
- const allFiles = import_fs7.default.readdirSync(downloadedPath);
18669
+ const downloadedPath = (0, import_path7.join)(tmpPath, appPath);
18670
+ if (import_fs6.default.existsSync(downloadedPath)) {
18671
+ const allFiles = import_fs6.default.readdirSync(downloadedPath);
18799
18672
  for (let file of allFiles) {
18800
- const path2 = (0, import_path8.join)(downloadedPath, file);
18801
- import_fs7.default.renameSync(path2, (0, import_path8.join)(downloadedPath, "..", file));
18673
+ const path2 = (0, import_path7.join)(downloadedPath, file);
18674
+ import_fs6.default.renameSync(path2, (0, import_path7.join)(downloadedPath, "..", file));
18802
18675
  }
18803
- import_fs7.default.rmdirSync(downloadedPath);
18676
+ import_fs6.default.rmdirSync(downloadedPath);
18804
18677
  }
18805
- const dbPath = (0, import_path8.join)(tmpPath, DB_EXPORT_FILE);
18678
+ const dbPath = (0, import_path7.join)(tmpPath, DB_EXPORT_FILE);
18806
18679
  await exportDB(appId, {
18807
18680
  filter: defineFilter(config == null ? void 0 : config.excludeRows, config == null ? void 0 : config.excludeLogs),
18808
18681
  exportPath: dbPath
18809
18682
  });
18810
- if (config == null ? void 0 : config.encryptPassword) {
18811
- for (let file of import_fs7.default.readdirSync(tmpPath)) {
18812
- const path2 = (0, import_path8.join)(tmpPath, file);
18813
- await encryption_exports.encryptFile(
18814
- { dir: tmpPath, filename: file },
18815
- config.encryptPassword
18816
- );
18817
- import_fs7.default.rmSync(path2);
18818
- }
18819
- }
18820
18683
  if (config == null ? void 0 : config.tar) {
18821
- const tarPath = tarFilesToTmp(tmpPath, import_fs7.default.readdirSync(tmpPath));
18822
- import_fs7.default.rmSync(tmpPath, { recursive: true, force: true });
18684
+ const tarPath = tarFilesToTmp(tmpPath, import_fs6.default.readdirSync(tmpPath));
18685
+ import_fs6.default.rmSync(tmpPath, { recursive: true, force: true });
18823
18686
  return tarPath;
18824
18687
  } else {
18825
18688
  return tmpPath;
18826
18689
  }
18827
18690
  }
18828
- async function streamExportApp({
18829
- appId,
18830
- excludeRows,
18831
- encryptPassword
18832
- }) {
18691
+ async function streamExportApp(appId, excludeRows) {
18833
18692
  const tmpPath = await exportApp(appId, {
18834
18693
  excludeRows,
18835
18694
  excludeLogs: true,
18836
- tar: true,
18837
- encryptPassword
18695
+ tar: true
18838
18696
  });
18839
18697
  return streamFile(tmpPath);
18840
18698
  }
@@ -18848,8 +18706,8 @@ __export(imports_exports, {
18848
18706
  untarFile: () => untarFile,
18849
18707
  updateAttachmentColumns: () => updateAttachmentColumns
18850
18708
  });
18851
- var import_path9 = require("path");
18852
- var import_fs8 = __toESM(require("fs"));
18709
+ var import_path8 = require("path");
18710
+ var import_fs7 = __toESM(require("fs"));
18853
18711
  init_src();
18854
18712
  var uuid4 = require("uuid/v4");
18855
18713
  var tar4 = require("tar");
@@ -18916,16 +18774,16 @@ async function getTemplateStream(template) {
18916
18774
  throw new Error("Cannot import a non-text based file.");
18917
18775
  }
18918
18776
  if (template.file) {
18919
- return import_fs8.default.createReadStream(template.file.path);
18777
+ return import_fs7.default.createReadStream(template.file.path);
18920
18778
  } else if (template.key) {
18921
18779
  const [type, name2] = template.key.split("/");
18922
18780
  const tmpPath = await downloadTemplate(type, name2);
18923
- return import_fs8.default.createReadStream((0, import_path9.join)(tmpPath, name2, "db", "dump.txt"));
18781
+ return import_fs7.default.createReadStream((0, import_path8.join)(tmpPath, name2, "db", "dump.txt"));
18924
18782
  }
18925
18783
  }
18926
18784
  function untarFile(file) {
18927
- const tmpPath = (0, import_path9.join)(budibaseTempDir2(), uuid4());
18928
- import_fs8.default.mkdirSync(tmpPath);
18785
+ const tmpPath = (0, import_path8.join)(budibaseTempDir2(), uuid4());
18786
+ import_fs7.default.mkdirSync(tmpPath);
18929
18787
  tar4.extract({
18930
18788
  sync: true,
18931
18789
  cwd: tmpPath,
@@ -18933,49 +18791,31 @@ function untarFile(file) {
18933
18791
  });
18934
18792
  return tmpPath;
18935
18793
  }
18936
- async function decryptFiles(path2, password) {
18937
- try {
18938
- for (let file of import_fs8.default.readdirSync(path2)) {
18939
- const inputPath = (0, import_path9.join)(path2, file);
18940
- const outputPath = inputPath.replace(/\.enc$/, "");
18941
- await encryption_exports.decryptFile(inputPath, outputPath, password);
18942
- import_fs8.default.rmSync(inputPath);
18943
- }
18944
- } catch (err) {
18945
- if (err.message === "incorrect header check") {
18946
- throw new Error("File cannot be imported");
18947
- }
18948
- throw err;
18949
- }
18950
- }
18951
18794
  function getGlobalDBFile(tmpPath) {
18952
- return import_fs8.default.readFileSync((0, import_path9.join)(tmpPath, GLOBAL_DB_EXPORT_FILE), "utf8");
18795
+ return import_fs7.default.readFileSync((0, import_path8.join)(tmpPath, GLOBAL_DB_EXPORT_FILE), "utf8");
18953
18796
  }
18954
18797
  function getListOfAppsInMulti(tmpPath) {
18955
- return import_fs8.default.readdirSync(tmpPath).filter((dir) => dir !== GLOBAL_DB_EXPORT_FILE);
18798
+ return import_fs7.default.readdirSync(tmpPath).filter((dir) => dir !== GLOBAL_DB_EXPORT_FILE);
18956
18799
  }
18957
18800
  async function importApp(appId, db2, template) {
18958
18801
  var _a, _b;
18959
18802
  let prodAppId = db_exports.getProdAppID(appId);
18960
18803
  let dbStream;
18961
18804
  const isTar = template.file && ((_b = (_a = template == null ? void 0 : template.file) == null ? void 0 : _a.type) == null ? void 0 : _b.endsWith("gzip"));
18962
- const isDirectory = template.file && import_fs8.default.lstatSync(template.file.path).isDirectory();
18805
+ const isDirectory = template.file && import_fs7.default.lstatSync(template.file.path).isDirectory();
18963
18806
  if (template.file && (isTar || isDirectory)) {
18964
18807
  const tmpPath = isTar ? untarFile(template.file) : template.file.path;
18965
- if (isTar && template.file.password) {
18966
- await decryptFiles(tmpPath, template.file.password);
18967
- }
18968
- const contents = import_fs8.default.readdirSync(tmpPath);
18808
+ const contents = import_fs7.default.readdirSync(tmpPath);
18969
18809
  if (contents.length) {
18970
18810
  let promises = [];
18971
18811
  let excludedFiles = [GLOBAL_DB_EXPORT_FILE, DB_EXPORT_FILE];
18972
18812
  for (let filename of contents) {
18973
- const path2 = (0, import_path9.join)(tmpPath, filename);
18813
+ const path2 = (0, import_path8.join)(tmpPath, filename);
18974
18814
  if (excludedFiles.includes(filename)) {
18975
18815
  continue;
18976
18816
  }
18977
- filename = (0, import_path9.join)(prodAppId, filename);
18978
- if (import_fs8.default.lstatSync(path2).isDirectory()) {
18817
+ filename = (0, import_path8.join)(prodAppId, filename);
18818
+ if (import_fs7.default.lstatSync(path2).isDirectory()) {
18979
18819
  promises.push(
18980
18820
  objectStore_exports2.uploadDirectory(ObjectStoreBuckets2.APPS, path2, filename)
18981
18821
  );
@@ -18991,7 +18831,7 @@ async function importApp(appId, db2, template) {
18991
18831
  }
18992
18832
  await Promise.all(promises);
18993
18833
  }
18994
- dbStream = import_fs8.default.createReadStream((0, import_path9.join)(tmpPath, DB_EXPORT_FILE));
18834
+ dbStream = import_fs7.default.createReadStream((0, import_path8.join)(tmpPath, DB_EXPORT_FILE));
18995
18835
  } else {
18996
18836
  dbStream = await getTemplateStream(template);
18997
18837
  }
@@ -20110,17 +19950,17 @@ __export(version_exports, {
20110
19950
  getLicenseVersion: () => getLicenseVersion,
20111
19951
  getProVersion: () => getProVersion
20112
19952
  });
20113
- var import_fs9 = __toESM(require("fs"));
20114
- var import_path10 = __toESM(require("path"));
19953
+ var import_fs8 = __toESM(require("fs"));
19954
+ var import_path9 = __toESM(require("path"));
20115
19955
  var getLicenseVersion = () => {
20116
19956
  if (environment_default2.isDev()) {
20117
19957
  const DEV_VER_FILENAME = "dev-version.txt";
20118
- const verFile = import_path10.default.join(objectStore_exports2.budibaseTempDir(), DEV_VER_FILENAME);
20119
- if (import_fs9.default.existsSync(verFile)) {
20120
- return import_fs9.default.readFileSync(verFile, "utf8");
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");
20121
19961
  } else {
20122
19962
  const devVer = utils_exports2.newid();
20123
- import_fs9.default.writeFileSync(verFile, devVer);
19963
+ import_fs8.default.writeFileSync(verFile, devVer);
20124
19964
  return devVer;
20125
19965
  }
20126
19966
  } else {
@@ -20479,16 +20319,16 @@ __export(offline_exports, {
20479
20319
  getOfflineLicense: () => getOfflineLicense,
20480
20320
  writeOfflineLicenseToDisk: () => writeOfflineLicenseToDisk
20481
20321
  });
20482
- var import_fs10 = __toESM(require("fs"));
20483
- var import_path11 = require("path");
20322
+ var import_fs9 = __toESM(require("fs"));
20323
+ var import_path10 = require("path");
20484
20324
  var import_os2 = require("os");
20485
20325
  var import_jsonwebtoken = __toESM(require("jsonwebtoken"));
20486
20326
  var SUB_DIRECTORY = environment_default2.isTest() ? ".budibase-test" : ".budibase";
20487
- var DIRECTORY = (0, import_path11.join)((0, import_os2.tmpdir)(), SUB_DIRECTORY);
20327
+ var DIRECTORY = (0, import_path10.join)((0, import_os2.tmpdir)(), SUB_DIRECTORY);
20488
20328
  var OFFLINE_LICENSE_FILE = "offline_license.txt";
20489
- var LICENSE_FILE_PATH = (0, import_path11.join)(DIRECTORY, OFFLINE_LICENSE_FILE);
20490
- if (!import_fs10.default.existsSync(DIRECTORY)) {
20491
- import_fs10.default.mkdirSync(DIRECTORY);
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);
20492
20332
  }
20493
20333
  var PUBLIC_KEY = "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvz3jePLCFBXZ19c8Dpkv\nXtSgOhKFOcvQdo/LV0KJRUzQWDPWuO4ILtBtnqhjtIzZH4CH0qCYBet5L6Qr4CM1\nl2HXiAD1Q2rlHNW9wDaYyKb1F5f+v4RyqCAyzlkwRdksmkLeECTboojNnmRCrE3C\n8suunQP5bEScqEY2kclqzSf8e6xqMzPUg3mL/pNa1iEv7TuLbU9nJfgR36l0WmZY\n94fWnSaT8OSXSqcxsaByf06gfS3HAoTJNc7eqz1Hf9fUORQGPUAnFK8cT3SfdA36\nd/o3ZWE1TTj1zYwlCLN5qRKr3hU8nC3xEYNEbkB9SfTRaOq9Q7P8WmfLkoCPm3pR\nmwIDAQAB\n-----END PUBLIC KEY-----\n";
20494
20334
  function getOfflineLicense() {
@@ -20499,16 +20339,16 @@ function getOfflineLicense() {
20499
20339
  }
20500
20340
  }
20501
20341
  function getOfflineLicenseFromDisk() {
20502
- if (import_fs10.default.existsSync(LICENSE_FILE_PATH)) {
20503
- const token = import_fs10.default.readFileSync(LICENSE_FILE_PATH, { encoding: "utf-8" });
20342
+ if (import_fs9.default.existsSync(LICENSE_FILE_PATH)) {
20343
+ const token = import_fs9.default.readFileSync(LICENSE_FILE_PATH, { encoding: "utf-8" });
20504
20344
  return import_jsonwebtoken.default.verify(token, PUBLIC_KEY, { algorithms: ["RS256"] });
20505
20345
  }
20506
20346
  }
20507
20347
  function writeOfflineLicenseToDisk(signedLicense) {
20508
- import_fs10.default.writeFileSync(LICENSE_FILE_PATH, signedLicense, { encoding: "utf-8" });
20348
+ import_fs9.default.writeFileSync(LICENSE_FILE_PATH, signedLicense, { encoding: "utf-8" });
20509
20349
  }
20510
20350
  function deleteOfflineLicense() {
20511
- import_fs10.default.rmSync(LICENSE_FILE_PATH, { force: true });
20351
+ import_fs9.default.rmSync(LICENSE_FILE_PATH, { force: true });
20512
20352
  }
20513
20353
 
20514
20354
  // ../pro/packages/pro/src/sdk/licensing/licenses/licenses.ts
@@ -21713,10 +21553,10 @@ __export(plugins_exports, {
21713
21553
  init_src();
21714
21554
 
21715
21555
  // ../pro/packages/pro/src/utilities/fileSystem.ts
21716
- var import_fs11 = __toESM(require("fs"));
21717
- var import_path12 = require("path");
21556
+ var import_fs10 = __toESM(require("fs"));
21557
+ var import_path11 = require("path");
21718
21558
  function loadJSFile(directory2, name2) {
21719
- return import_fs11.default.readFileSync((0, import_path12.join)(directory2, name2), "utf8");
21559
+ return import_fs10.default.readFileSync((0, import_path11.join)(directory2, name2), "utf8");
21720
21560
  }
21721
21561
 
21722
21562
  // ../pro/packages/pro/src/sdk/plugins/index.ts
@@ -22353,7 +22193,7 @@ __export(processing_exports, {
22353
22193
  init: () => init12
22354
22194
  });
22355
22195
  init_src();
22356
- var import_fs12 = __toESM(require("fs"));
22196
+ var import_fs11 = __toESM(require("fs"));
22357
22197
  async function init12(opts) {
22358
22198
  await getBackupQueue().process(async (job) => {
22359
22199
  const data = job.data;
@@ -22421,8 +22261,8 @@ async function runBackup(trigger, tenantId, appId, opts) {
22421
22261
  }
22422
22262
  });
22423
22263
  await updateMetadata("complete" /* COMPLETE */, { filename, contents });
22424
- if (import_fs12.default.existsSync(tarPath)) {
22425
- import_fs12.default.rmSync(tarPath);
22264
+ if (import_fs11.default.existsSync(tarPath)) {
22265
+ import_fs11.default.rmSync(tarPath);
22426
22266
  }
22427
22267
  } catch (err) {
22428
22268
  logging_exports.logAlert("App backup error", err);
@@ -22875,7 +22715,7 @@ router3.post(
22875
22715
 
22876
22716
  // ../pro/packages/pro/src/api/controllers/apps/backups.ts
22877
22717
  init_src();
22878
- var import_fs13 = __toESM(require("fs"));
22718
+ var import_fs12 = __toESM(require("fs"));
22879
22719
  async function checkAppID(ctx, appId) {
22880
22720
  if (!await utils_exports5.appExists(appId)) {
22881
22721
  ctx.throw(400, `Provided app ID: ${appId} - is invalid.`);
@@ -22961,7 +22801,7 @@ async function downloadBackup(ctx) {
22961
22801
  const backupId = ctx.params.backupId;
22962
22802
  const { metadata: metadata2, path: path2 } = await backups_default2.downloadAppBackup(backupId);
22963
22803
  ctx.attachment(`backup-${metadata2.timestamp}.tar.gz`);
22964
- ctx.body = import_fs13.default.createReadStream(path2);
22804
+ ctx.body = import_fs12.default.createReadStream(path2);
22965
22805
  }
22966
22806
 
22967
22807
  // ../pro/packages/pro/src/api/routes/apps/backups.ts