@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/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
  }
@@ -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
- const names = columnsResponse.rows.map((row) => row.table_name);
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: "Spreadsheet URL",
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
- await utils_exports3.parallelForeach(
17576
- sheets,
17577
- async (sheet) => {
17578
- await sheet.getRows({ limit: 0, offset: 0 });
17579
- const id = buildExternalTableId(datasourceId, sheet.title);
17580
- tables[sheet.title] = this.getTableSchema(
17581
- sheet.title,
17582
- sheet.headerValues,
17583
- id
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 import_path6 = require("path");
18480
+ var import_path5 = require("path");
18622
18481
 
18623
18482
  // src/utilities/fileSystem/filesystem.ts
18624
- var import_fs5 = __toESM(require("fs"));
18625
- var import_path5 = require("path");
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, 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, "..", "..", ".."));
18629
18488
  var streamFile = (path2) => {
18630
- return import_fs5.default.createReadStream(path2);
18489
+ return import_fs4.default.createReadStream(path2);
18631
18490
  };
18632
18491
  var createTempFolder = (item) => {
18633
- const path2 = (0, import_path5.join)(budibaseTempDir2(), item);
18492
+ const path2 = (0, import_path4.join)(budibaseTempDir2(), item);
18634
18493
  try {
18635
- if (import_fs5.default.existsSync(path2)) {
18636
- 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 });
18637
18496
  }
18638
- import_fs5.default.mkdirSync(path2);
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, import_path6.join)(TOP_LEVEL_PATH, "node_modules");
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 import_fs6 = __toESM(require("fs"));
18656
- var import_path7 = require("path");
18657
- var DATASOURCE_PATH = (0, import_path7.join)(budibaseTempDir2(), "datasource");
18658
- 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");
18659
18518
  var getPluginMetadata = async (path2) => {
18660
18519
  let metadata2 = {};
18661
18520
  try {
18662
- const pkg2 = import_fs6.default.readFileSync((0, import_path7.join)(path2, "package.json"), "utf8");
18663
- 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");
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 (!import_fs6.default.existsSync(path2)) {
18682
- import_fs6.default.mkdirSync(path2);
18540
+ if (!import_fs5.default.existsSync(path2)) {
18541
+ import_fs5.default.mkdirSync(path2);
18683
18542
  }
18684
- const filename = (0, import_path7.join)(path2, plugin.name);
18543
+ const filename = (0, import_path6.join)(path2, plugin.name);
18685
18544
  const metadataName = `${filename}.bbmetadata`;
18686
- if (import_fs6.default.existsSync(filename)) {
18687
- const currentHash = import_fs6.default.readFileSync(metadataName, "utf8");
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
- import_fs6.default.unlinkSync(filename);
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
- import_fs6.default.writeFileSync(filename, pluginJs);
18702
- import_fs6.default.writeFileSync(metadataName, hash3);
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 import_fs7 = __toESM(require("fs"));
18738
- var import_path8 = require("path");
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 fileName = `${uuid3()}.tar.gz`;
18744
- const exportFile = (0, import_path8.join)(budibaseTempDir2(), fileName);
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
- noDirRecurse: false,
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 = import_fs7.default.createWriteStream(path2);
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, import_path8.join)(appPath, path2)
18658
+ (0, import_path7.join)(appPath, path2)
18801
18659
  );
18802
- import_fs7.default.writeFileSync((0, import_path8.join)(tmpPath, path2), contents);
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, import_path8.join)(tmpPath, appPath);
18812
- if (import_fs7.default.existsSync(downloadedPath)) {
18813
- 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);
18814
18672
  for (let file of allFiles) {
18815
- const path2 = (0, import_path8.join)(downloadedPath, file);
18816
- 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));
18817
18675
  }
18818
- import_fs7.default.rmdirSync(downloadedPath);
18676
+ import_fs6.default.rmdirSync(downloadedPath);
18819
18677
  }
18820
- const dbPath = (0, import_path8.join)(tmpPath, DB_EXPORT_FILE);
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, import_fs7.default.readdirSync(tmpPath));
18837
- 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 });
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 import_path9 = require("path");
18867
- var import_fs8 = __toESM(require("fs"));
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 import_fs8.default.createReadStream(template.file.path);
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 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"));
18939
18782
  }
18940
18783
  }
18941
18784
  function untarFile(file) {
18942
- const tmpPath = (0, import_path9.join)(budibaseTempDir2(), uuid4());
18943
- import_fs8.default.mkdirSync(tmpPath);
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 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");
18968
18796
  }
18969
18797
  function getListOfAppsInMulti(tmpPath) {
18970
- 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);
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 && import_fs8.default.lstatSync(template.file.path).isDirectory();
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
- if (isTar && template.file.password) {
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, import_path9.join)(tmpPath, filename);
18813
+ const path2 = (0, import_path8.join)(tmpPath, filename);
18989
18814
  if (excludedFiles.includes(filename)) {
18990
18815
  continue;
18991
18816
  }
18992
- filename = (0, import_path9.join)(prodAppId, filename);
18993
- if (import_fs8.default.lstatSync(path2).isDirectory()) {
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 = 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));
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 import_fs9 = __toESM(require("fs"));
20129
- var import_path10 = __toESM(require("path"));
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 = import_path10.default.join(objectStore_exports2.budibaseTempDir(), DEV_VER_FILENAME);
20134
- if (import_fs9.default.existsSync(verFile)) {
20135
- 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");
20136
19961
  } else {
20137
19962
  const devVer = utils_exports2.newid();
20138
- import_fs9.default.writeFileSync(verFile, devVer);
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 import_fs10 = __toESM(require("fs"));
20498
- var import_path11 = require("path");
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, import_path11.join)((0, import_os2.tmpdir)(), SUB_DIRECTORY);
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, import_path11.join)(DIRECTORY, OFFLINE_LICENSE_FILE);
20505
- if (!import_fs10.default.existsSync(DIRECTORY)) {
20506
- 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);
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 (import_fs10.default.existsSync(LICENSE_FILE_PATH)) {
20518
- 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" });
20519
20344
  return import_jsonwebtoken.default.verify(token, PUBLIC_KEY, { algorithms: ["RS256"] });
20520
20345
  }
20521
20346
  }
20522
20347
  function writeOfflineLicenseToDisk(signedLicense) {
20523
- import_fs10.default.writeFileSync(LICENSE_FILE_PATH, signedLicense, { encoding: "utf-8" });
20348
+ import_fs9.default.writeFileSync(LICENSE_FILE_PATH, signedLicense, { encoding: "utf-8" });
20524
20349
  }
20525
20350
  function deleteOfflineLicense() {
20526
- import_fs10.default.rmSync(LICENSE_FILE_PATH, { force: true });
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 import_fs11 = __toESM(require("fs"));
21732
- var import_path12 = require("path");
21556
+ var import_fs10 = __toESM(require("fs"));
21557
+ var import_path11 = require("path");
21733
21558
  function loadJSFile(directory2, name2) {
21734
- 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");
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 import_fs12 = __toESM(require("fs"));
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 (import_fs12.default.existsSync(tarPath)) {
22440
- import_fs12.default.rmSync(tarPath);
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 import_fs13 = __toESM(require("fs"));
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 = import_fs13.default.createReadStream(path2);
22804
+ ctx.body = import_fs12.default.createReadStream(path2);
22980
22805
  }
22981
22806
 
22982
22807
  // ../pro/packages/pro/src/api/routes/apps/backups.ts