@budibase/server 2.7.6 → 2.7.7-alpha.0

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.
@@ -8,8 +8,8 @@
8
8
  <link rel="preconnect" href="https://fonts.gstatic.com" />
9
9
  <link href="https://fonts.googleapis.com/css2?family=Source+Sans+Pro:wght@400;600;700&display=swap"
10
10
  rel="stylesheet" />
11
- <script type="module" crossorigin src="/builder/assets/index.4ca5529d.js"></script>
12
- <link rel="stylesheet" href="/builder/assets/index.a86e2071.css">
11
+ <script type="module" crossorigin src="/builder/assets/index.933787a7.js"></script>
12
+ <link rel="stylesheet" href="/builder/assets/index.b33e8ad5.css">
13
13
  </head>
14
14
 
15
15
  <body id="app">
@@ -145,7 +145,7 @@ var init_environment = __esm({
145
145
  isInThread: () => {
146
146
  return process.env.FORKED_PROCESS;
147
147
  },
148
- TOP_LEVEL_PATH: process.env.TOP_LEVEL_PATH
148
+ TOP_LEVEL_PATH: process.env.TOP_LEVEL_PATH || process.env.SERVER_TOP_LEVEL_PATH
149
149
  };
150
150
  if (isDev() && environment.DISABLE_THREADING == null) {
151
151
  environment._set("DISABLE_THREADING", "1");
@@ -2855,23 +2855,23 @@ function init2(selectDb = DEFAULT_SELECT_DB) {
2855
2855
  CLIENTS[selectDb] = client3;
2856
2856
  }
2857
2857
  function waitForConnection(selectDb = DEFAULT_SELECT_DB) {
2858
- return new Promise((resolve2) => {
2858
+ return new Promise((resolve3) => {
2859
2859
  if (pickClient(selectDb) == null) {
2860
2860
  init2();
2861
2861
  } else if (CONNECTED) {
2862
- resolve2("");
2862
+ resolve3("");
2863
2863
  return;
2864
2864
  }
2865
2865
  const interval = set(() => {
2866
2866
  if (CONNECTED) {
2867
2867
  clear(interval);
2868
- resolve2("");
2868
+ resolve3("");
2869
2869
  }
2870
2870
  }, 500);
2871
2871
  });
2872
2872
  }
2873
2873
  function promisifyStream(stream3, client3) {
2874
- return new Promise((resolve2, reject) => {
2874
+ return new Promise((resolve3, reject) => {
2875
2875
  const outputKeys = /* @__PURE__ */ new Set();
2876
2876
  stream3.on("data", (keys2) => {
2877
2877
  keys2.forEach((key) => {
@@ -2889,7 +2889,7 @@ function promisifyStream(stream3, client3) {
2889
2889
  getPromises.push(client3.get(key));
2890
2890
  }
2891
2891
  const jsonArray = await Promise.all(getPromises);
2892
- resolve2(
2892
+ resolve3(
2893
2893
  keysArray.map((key) => ({
2894
2894
  key: removeDbPrefix(key),
2895
2895
  value: JSON.parse(jsonArray.shift())
@@ -4492,11 +4492,11 @@ var init_Replication = __esm({
4492
4492
  return Promise.all([closePouchDB(this.source), closePouchDB(this.target)]);
4493
4493
  }
4494
4494
  promisify(operation, opts = {}) {
4495
- return new Promise((resolve2) => {
4495
+ return new Promise((resolve3) => {
4496
4496
  operation(this.target, opts).on("denied", function(err) {
4497
4497
  throw new Error(`Denied: Document failed to replicate ${err}`);
4498
4498
  }).on("complete", function(info) {
4499
- return resolve2(info);
4499
+ return resolve3(info);
4500
4500
  }).on("error", function(err) {
4501
4501
  throw new Error(`Replication Error: ${err}`);
4502
4502
  });
@@ -5357,11 +5357,11 @@ function makeCacheItem(doc, lastWrite = null) {
5357
5357
  return { doc, lastWrite: lastWrite || Date.now() };
5358
5358
  }
5359
5359
  async function put(db2, doc, writeRateMs = DEFAULT_WRITE_RATE_MS) {
5360
- const cache2 = await getCache();
5360
+ const cache3 = await getCache();
5361
5361
  const key = doc._id;
5362
5362
  let cacheItem;
5363
5363
  if (key) {
5364
- cacheItem = await cache2.get(makeCacheKey(db2, key));
5364
+ cacheItem = await cache3.get(makeCacheKey(db2, key));
5365
5365
  }
5366
5366
  const updateDb = !cacheItem || cacheItem.lastWrite < Date.now() - writeRateMs;
5367
5367
  let output = doc;
@@ -5399,30 +5399,30 @@ async function put(db2, doc, writeRateMs = DEFAULT_WRITE_RATE_MS) {
5399
5399
  }
5400
5400
  cacheItem = makeCacheItem(output, updateDb ? null : cacheItem == null ? void 0 : cacheItem.lastWrite);
5401
5401
  if (output._id) {
5402
- await cache2.store(makeCacheKey(db2, output._id), cacheItem);
5402
+ await cache3.store(makeCacheKey(db2, output._id), cacheItem);
5403
5403
  }
5404
5404
  return { ok: true, id: output._id, rev: output._rev };
5405
5405
  }
5406
5406
  async function get2(db2, id) {
5407
- const cache2 = await getCache();
5407
+ const cache3 = await getCache();
5408
5408
  const cacheKey = makeCacheKey(db2, id);
5409
- let cacheItem = await cache2.get(cacheKey);
5409
+ let cacheItem = await cache3.get(cacheKey);
5410
5410
  if (!cacheItem) {
5411
5411
  const doc = await db2.get(id);
5412
5412
  cacheItem = makeCacheItem(doc);
5413
- await cache2.store(cacheKey, cacheItem);
5413
+ await cache3.store(cacheKey, cacheItem);
5414
5414
  }
5415
5415
  return cacheItem.doc;
5416
5416
  }
5417
5417
  async function remove(db2, docOrId, rev) {
5418
- const cache2 = await getCache();
5418
+ const cache3 = await getCache();
5419
5419
  if (!docOrId) {
5420
5420
  throw new Error("No ID/Rev provided.");
5421
5421
  }
5422
5422
  const id = typeof docOrId === "string" ? docOrId : docOrId._id;
5423
5423
  rev = typeof docOrId === "string" ? rev : docOrId._rev;
5424
5424
  try {
5425
- await cache2.delete(makeCacheKey(db2, id));
5425
+ await cache3.delete(makeCacheKey(db2, id));
5426
5426
  } finally {
5427
5427
  await db2.remove(id, rev);
5428
5428
  }
@@ -6091,7 +6091,7 @@ function isClient(ctx) {
6091
6091
  return ctx.headers["x-budibase-type" /* TYPE */] === "client";
6092
6092
  }
6093
6093
  function timeout(timeMs) {
6094
- return new Promise((resolve2) => setTimeout(resolve2, timeMs));
6094
+ return new Promise((resolve3) => setTimeout(resolve3, timeMs));
6095
6095
  }
6096
6096
  function isAudited(event) {
6097
6097
  return !!AuditedEventFriendlyName[event];
@@ -9781,8 +9781,8 @@ async function preAuth(passport2, ctx, next) {
9781
9781
  callbackUrl,
9782
9782
  ssoSaveUserNoOp
9783
9783
  );
9784
- if (!ctx.query.appId || !ctx.query.datasourceId) {
9785
- ctx.throw(400, "appId and datasourceId query params not present.");
9784
+ if (!ctx.query.appId) {
9785
+ ctx.throw(400, "appId query param not present.");
9786
9786
  }
9787
9787
  return passport2.authenticate(strategy, {
9788
9788
  scope: ["profile", "email", "https://www.googleapis.com/auth/spreadsheets"],
@@ -9802,7 +9802,7 @@ async function postAuth(passport2, ctx, next) {
9802
9802
  clientSecret: config.clientSecret,
9803
9803
  callbackURL: callbackUrl
9804
9804
  },
9805
- (accessToken, refreshToken, profile, done) => {
9805
+ (accessToken, refreshToken, _profile, done) => {
9806
9806
  clearCookie(ctx, "budibase:datasourceauth" /* DatasourceAuth */);
9807
9807
  done(null, { accessToken, refreshToken });
9808
9808
  }
@@ -9810,22 +9810,14 @@ async function postAuth(passport2, ctx, next) {
9810
9810
  { successRedirect: "/", failureRedirect: "/error" },
9811
9811
  async (err, tokens) => {
9812
9812
  const baseUrl = `/builder/app/${authStateCookie.appId}/data`;
9813
- await doWithDB(authStateCookie.appId, async (db2) => {
9814
- let datasource2;
9815
- try {
9816
- datasource2 = await db2.get(authStateCookie.datasourceId);
9817
- } catch (err2) {
9818
- if (err2.status === 404) {
9819
- ctx.redirect(baseUrl);
9820
- }
9821
- }
9822
- if (!datasource2.config) {
9823
- datasource2.config = {};
9813
+ const id = utils_exports2.newid();
9814
+ await cache_exports.store(
9815
+ `datasource:creation:${authStateCookie.appId}:google:${id}`,
9816
+ {
9817
+ tokens
9824
9818
  }
9825
- datasource2.config.auth = { type: "google", ...tokens };
9826
- await db2.put(datasource2);
9827
- ctx.redirect(`${baseUrl}/datasource/${authStateCookie.datasourceId}`);
9828
- });
9819
+ );
9820
+ ctx.redirect(`${baseUrl}/new?continue_google_setup=${id}`);
9829
9821
  }
9830
9822
  )(ctx, next);
9831
9823
  }
@@ -9835,9 +9827,9 @@ var init_google2 = __esm({
9835
9827
  init_google();
9836
9828
  init_constants2();
9837
9829
  init_utils5();
9838
- init_db5();
9839
9830
  init_configs3();
9840
9831
  init_sso2();
9832
+ init_src2();
9841
9833
  GoogleStrategy2 = require("passport-google-oauth").OAuth2Strategy;
9842
9834
  }
9843
9835
  });
@@ -10559,12 +10551,12 @@ async function refreshOIDCAccessToken(chosenConfig, refreshToken) {
10559
10551
  return strategy._getOAuth2Client(enrichedConfig);
10560
10552
  }
10561
10553
  });
10562
- return new Promise((resolve2) => {
10554
+ return new Promise((resolve3) => {
10563
10555
  refresh.requestNewAccessToken(
10564
10556
  "oidc" /* OIDC */,
10565
10557
  refreshToken,
10566
10558
  (err, accessToken, refreshToken2, params2) => {
10567
- resolve2({ err, accessToken, refreshToken: refreshToken2, params: params2 });
10559
+ resolve3({ err, accessToken, refreshToken: refreshToken2, params: params2 });
10568
10560
  }
10569
10561
  );
10570
10562
  });
@@ -10585,12 +10577,12 @@ async function refreshGoogleAccessToken(config, refreshToken) {
10585
10577
  );
10586
10578
  }
10587
10579
  refresh.use(strategy);
10588
- return new Promise((resolve2) => {
10580
+ return new Promise((resolve3) => {
10589
10581
  refresh.requestNewAccessToken(
10590
10582
  "google" /* GOOGLE */,
10591
10583
  refreshToken,
10592
10584
  (err, accessToken, refreshToken2, params2) => {
10593
- resolve2({ err, accessToken, refreshToken: refreshToken2, params: params2 });
10585
+ resolve3({ err, accessToken, refreshToken: refreshToken2, params: params2 });
10594
10586
  }
10595
10587
  );
10596
10588
  });
@@ -19369,7 +19361,7 @@ var init_utils13 = __esm({
19369
19361
 
19370
19362
  // src/utilities/index.ts
19371
19363
  function wait(ms) {
19372
- return new Promise((resolve2) => setTimeout(resolve2, ms));
19364
+ return new Promise((resolve3) => setTimeout(resolve3, ms));
19373
19365
  }
19374
19366
  function checkSlashesInUrl2(url) {
19375
19367
  return url.replace(/(https?:\/\/)|(\/)+/g, "$1$2");
@@ -19527,7 +19519,7 @@ var init_filesystem = __esm({
19527
19519
  import_tar = __toESM(require("tar"));
19528
19520
  init_environment();
19529
19521
  uuid2 = require("uuid/v4");
19530
- TOP_LEVEL_PATH = environment_default.TOP_LEVEL_PATH || (0, import_path7.join)(__dirname, "..", "..", "..");
19522
+ TOP_LEVEL_PATH = environment_default.TOP_LEVEL_PATH || (0, import_path7.resolve)((0, import_path7.join)(__dirname, "..", "..", ".."));
19531
19523
  apiFileReturn = (contents) => {
19532
19524
  const path2 = (0, import_path7.join)(budibaseTempDir2(), uuid2());
19533
19525
  import_fs9.default.writeFileSync(path2, contents);
@@ -21150,13 +21142,13 @@ var init_postgres = __esm({
21150
21142
  }
21151
21143
  closeConnection() {
21152
21144
  const pg = this;
21153
- return new Promise((resolve2, reject) => {
21145
+ return new Promise((resolve3, reject) => {
21154
21146
  this.client.end((err) => {
21155
21147
  pg.open = false;
21156
21148
  if (err) {
21157
21149
  reject(err);
21158
21150
  } else {
21159
- resolve2();
21151
+ resolve3();
21160
21152
  }
21161
21153
  });
21162
21154
  });
@@ -22907,7 +22899,7 @@ var init_s3 = __esm({
22907
22899
  Key: query.key
22908
22900
  }).createReadStream();
22909
22901
  let csvError = false;
22910
- return new Promise((resolve2, reject) => {
22902
+ return new Promise((resolve3, reject) => {
22911
22903
  stream3.on("error", (err) => {
22912
22904
  reject(err);
22913
22905
  });
@@ -22915,7 +22907,7 @@ var init_s3 = __esm({
22915
22907
  csvError = true;
22916
22908
  });
22917
22909
  stream3.on("finish", () => {
22918
- resolve2(response2);
22910
+ resolve3(response2);
22919
22911
  });
22920
22912
  }).catch((err) => {
22921
22913
  if (csvError) {
@@ -23811,6 +23803,16 @@ var init_rest = __esm({
23811
23803
  });
23812
23804
 
23813
23805
  // src/integrations/googlesheets.ts
23806
+ async function setupCreationAuth(datasouce) {
23807
+ if (datasouce.continueSetupId) {
23808
+ const appId = context_exports.getAppId();
23809
+ const tokens = await cache_exports.get(
23810
+ `datasource:creation:${appId}:google:${datasouce.continueSetupId}`
23811
+ );
23812
+ datasouce.auth = tokens.tokens;
23813
+ delete datasouce.continueSetupId;
23814
+ }
23815
+ }
23814
23816
  var import_google_auth_library, import_google_spreadsheet, import_node_fetch9, ALLOWED_TYPES, SCHEMA12, GoogleSheetsIntegration, googlesheets_default;
23815
23817
  var init_googlesheets = __esm({
23816
23818
  "src/integrations/googlesheets.ts"() {
@@ -23848,7 +23850,7 @@ var init_googlesheets = __esm({
23848
23850
  },
23849
23851
  datasource: {
23850
23852
  spreadsheetId: {
23851
- display: "Google Sheet URL",
23853
+ display: "Spreadsheet URL",
23852
23854
  type: "string" /* STRING */,
23853
23855
  required: true
23854
23856
  }
@@ -23918,6 +23920,7 @@ var init_googlesheets = __esm({
23918
23920
  }
23919
23921
  async testConnection() {
23920
23922
  try {
23923
+ await setupCreationAuth(this.config);
23921
23924
  await this.connect();
23922
23925
  return { connected: true };
23923
23926
  } catch (e) {
@@ -26889,22 +26892,22 @@ function threadSetup() {
26889
26892
  init8();
26890
26893
  }
26891
26894
  async function checkCacheForDynamicVariable(queryId, variable) {
26892
- const cache2 = await getClient2();
26893
- return cache2.get(makeVariableKey(queryId, variable));
26895
+ const cache3 = await getClient2();
26896
+ return cache3.get(makeVariableKey(queryId, variable));
26894
26897
  }
26895
26898
  async function invalidateDynamicVariables(cachedVars) {
26896
- const cache2 = await getClient2();
26899
+ const cache3 = await getClient2();
26897
26900
  let promises = [];
26898
26901
  for (let variable of cachedVars) {
26899
26902
  promises.push(
26900
- cache2.delete(makeVariableKey(variable.queryId, variable.name))
26903
+ cache3.delete(makeVariableKey(variable.queryId, variable.name))
26901
26904
  );
26902
26905
  }
26903
26906
  await Promise.all(promises);
26904
26907
  }
26905
26908
  async function storeDynamicVariable(queryId, variable, value) {
26906
- const cache2 = await getClient2();
26907
- await cache2.store(
26909
+ const cache3 = await getClient2();
26910
+ await cache3.store(
26908
26911
  makeVariableKey(queryId, variable),
26909
26912
  value,
26910
26913
  VARIABLE_TTL_SECONDS
@@ -26990,7 +26993,7 @@ var _Thread = class {
26990
26993
  }
26991
26994
  run(job) {
26992
26995
  const timeout2 = this.timeoutMs;
26993
- return new Promise((resolve2, reject) => {
26996
+ return new Promise((resolve3, reject) => {
26994
26997
  function fire(worker) {
26995
26998
  worker.execute(job, (err, response2) => {
26996
26999
  if (err && err.type === "TimeoutError") {
@@ -26998,7 +27001,7 @@ var _Thread = class {
26998
27001
  } else if (err) {
26999
27002
  reject(err);
27000
27003
  } else {
27001
- resolve2(response2);
27004
+ resolve3(response2);
27002
27005
  }
27003
27006
  });
27004
27007
  }
@@ -27012,15 +27015,15 @@ var _Thread = class {
27012
27015
  });
27013
27016
  }
27014
27017
  static stopThreads() {
27015
- return new Promise((resolve2) => {
27018
+ return new Promise((resolve3) => {
27016
27019
  if (_Thread.workerRefs.length === 0) {
27017
- resolve2();
27020
+ resolve3();
27018
27021
  }
27019
27022
  let count = 0;
27020
27023
  function complete() {
27021
27024
  count++;
27022
27025
  if (count >= _Thread.workerRefs.length) {
27023
- resolve2();
27026
+ resolve3();
27024
27027
  }
27025
27028
  }
27026
27029
  for (let worker of _Thread.workerRefs) {
@@ -30682,8 +30685,15 @@ init_constants6();
30682
30685
  init_integrations2();
30683
30686
  init_utils20();
30684
30687
  init_src2();
30688
+ init_src();
30685
30689
  init_sdk3();
30686
30690
  init_websockets();
30691
+ init_googlesheets();
30692
+ var preSaveAction = {
30693
+ ["GOOGLE_SHEETS" /* GOOGLE_SHEETS */]: async (datasource2) => {
30694
+ await setupCreationAuth(datasource2.config);
30695
+ }
30696
+ };
30687
30697
 
30688
30698
  // src/api/controllers/query/validation.ts
30689
30699
  init_src2();
@@ -32549,7 +32559,7 @@ function executeSynchronously(job) {
32549
32559
  if (!appId) {
32550
32560
  throw new Error("Unable to execute, event doesn't contain app ID.");
32551
32561
  }
32552
- const timeoutPromise = new Promise((resolve2, reject) => {
32562
+ const timeoutPromise = new Promise((resolve3, reject) => {
32553
32563
  setTimeout(() => {
32554
32564
  reject(new Error("Timeout exceeded"));
32555
32565
  }, job.data.event.timeout || 12e3);