@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.
package/dist/index.js CHANGED
@@ -2782,23 +2782,23 @@ function init2(selectDb = DEFAULT_SELECT_DB) {
2782
2782
  CLIENTS[selectDb] = client3;
2783
2783
  }
2784
2784
  function waitForConnection(selectDb = DEFAULT_SELECT_DB) {
2785
- return new Promise((resolve2) => {
2785
+ return new Promise((resolve3) => {
2786
2786
  if (pickClient(selectDb) == null) {
2787
2787
  init2();
2788
2788
  } else if (CONNECTED) {
2789
- resolve2("");
2789
+ resolve3("");
2790
2790
  return;
2791
2791
  }
2792
2792
  const interval = set(() => {
2793
2793
  if (CONNECTED) {
2794
2794
  clear(interval);
2795
- resolve2("");
2795
+ resolve3("");
2796
2796
  }
2797
2797
  }, 500);
2798
2798
  });
2799
2799
  }
2800
2800
  function promisifyStream(stream3, client3) {
2801
- return new Promise((resolve2, reject) => {
2801
+ return new Promise((resolve3, reject) => {
2802
2802
  const outputKeys = /* @__PURE__ */ new Set();
2803
2803
  stream3.on("data", (keys2) => {
2804
2804
  keys2.forEach((key) => {
@@ -2816,7 +2816,7 @@ function promisifyStream(stream3, client3) {
2816
2816
  getPromises.push(client3.get(key));
2817
2817
  }
2818
2818
  const jsonArray = await Promise.all(getPromises);
2819
- resolve2(
2819
+ resolve3(
2820
2820
  keysArray.map((key) => ({
2821
2821
  key: removeDbPrefix(key),
2822
2822
  value: JSON.parse(jsonArray.shift())
@@ -4532,11 +4532,11 @@ var init_Replication = __esm({
4532
4532
  return Promise.all([closePouchDB(this.source), closePouchDB(this.target)]);
4533
4533
  }
4534
4534
  promisify(operation, opts = {}) {
4535
- return new Promise((resolve2) => {
4535
+ return new Promise((resolve3) => {
4536
4536
  operation(this.target, opts).on("denied", function(err) {
4537
4537
  throw new Error(`Denied: Document failed to replicate ${err}`);
4538
4538
  }).on("complete", function(info) {
4539
- return resolve2(info);
4539
+ return resolve3(info);
4540
4540
  }).on("error", function(err) {
4541
4541
  throw new Error(`Replication Error: ${err}`);
4542
4542
  });
@@ -5397,11 +5397,11 @@ function makeCacheItem(doc, lastWrite = null) {
5397
5397
  return { doc, lastWrite: lastWrite || Date.now() };
5398
5398
  }
5399
5399
  async function put(db2, doc, writeRateMs = DEFAULT_WRITE_RATE_MS) {
5400
- const cache2 = await getCache();
5400
+ const cache3 = await getCache();
5401
5401
  const key = doc._id;
5402
5402
  let cacheItem;
5403
5403
  if (key) {
5404
- cacheItem = await cache2.get(makeCacheKey(db2, key));
5404
+ cacheItem = await cache3.get(makeCacheKey(db2, key));
5405
5405
  }
5406
5406
  const updateDb = !cacheItem || cacheItem.lastWrite < Date.now() - writeRateMs;
5407
5407
  let output = doc;
@@ -5439,30 +5439,30 @@ async function put(db2, doc, writeRateMs = DEFAULT_WRITE_RATE_MS) {
5439
5439
  }
5440
5440
  cacheItem = makeCacheItem(output, updateDb ? null : cacheItem == null ? void 0 : cacheItem.lastWrite);
5441
5441
  if (output._id) {
5442
- await cache2.store(makeCacheKey(db2, output._id), cacheItem);
5442
+ await cache3.store(makeCacheKey(db2, output._id), cacheItem);
5443
5443
  }
5444
5444
  return { ok: true, id: output._id, rev: output._rev };
5445
5445
  }
5446
5446
  async function get2(db2, id) {
5447
- const cache2 = await getCache();
5447
+ const cache3 = await getCache();
5448
5448
  const cacheKey = makeCacheKey(db2, id);
5449
- let cacheItem = await cache2.get(cacheKey);
5449
+ let cacheItem = await cache3.get(cacheKey);
5450
5450
  if (!cacheItem) {
5451
5451
  const doc = await db2.get(id);
5452
5452
  cacheItem = makeCacheItem(doc);
5453
- await cache2.store(cacheKey, cacheItem);
5453
+ await cache3.store(cacheKey, cacheItem);
5454
5454
  }
5455
5455
  return cacheItem.doc;
5456
5456
  }
5457
5457
  async function remove(db2, docOrId, rev) {
5458
- const cache2 = await getCache();
5458
+ const cache3 = await getCache();
5459
5459
  if (!docOrId) {
5460
5460
  throw new Error("No ID/Rev provided.");
5461
5461
  }
5462
5462
  const id = typeof docOrId === "string" ? docOrId : docOrId._id;
5463
5463
  rev = typeof docOrId === "string" ? rev : docOrId._rev;
5464
5464
  try {
5465
- await cache2.delete(makeCacheKey(db2, id));
5465
+ await cache3.delete(makeCacheKey(db2, id));
5466
5466
  } finally {
5467
5467
  await db2.remove(id, rev);
5468
5468
  }
@@ -6131,7 +6131,7 @@ function isClient(ctx) {
6131
6131
  return ctx.headers["x-budibase-type" /* TYPE */] === "client";
6132
6132
  }
6133
6133
  function timeout(timeMs) {
6134
- return new Promise((resolve2) => setTimeout(resolve2, timeMs));
6134
+ return new Promise((resolve3) => setTimeout(resolve3, timeMs));
6135
6135
  }
6136
6136
  function isAudited(event) {
6137
6137
  return !!AuditedEventFriendlyName[event];
@@ -10060,8 +10060,8 @@ async function preAuth(passport2, ctx, next) {
10060
10060
  callbackUrl,
10061
10061
  ssoSaveUserNoOp
10062
10062
  );
10063
- if (!ctx.query.appId || !ctx.query.datasourceId) {
10064
- ctx.throw(400, "appId and datasourceId query params not present.");
10063
+ if (!ctx.query.appId) {
10064
+ ctx.throw(400, "appId query param not present.");
10065
10065
  }
10066
10066
  return passport2.authenticate(strategy, {
10067
10067
  scope: ["profile", "email", "https://www.googleapis.com/auth/spreadsheets"],
@@ -10081,7 +10081,7 @@ async function postAuth(passport2, ctx, next) {
10081
10081
  clientSecret: config.clientSecret,
10082
10082
  callbackURL: callbackUrl
10083
10083
  },
10084
- (accessToken, refreshToken, profile, done) => {
10084
+ (accessToken, refreshToken, _profile, done) => {
10085
10085
  clearCookie(ctx, "budibase:datasourceauth" /* DatasourceAuth */);
10086
10086
  done(null, { accessToken, refreshToken });
10087
10087
  }
@@ -10089,22 +10089,14 @@ async function postAuth(passport2, ctx, next) {
10089
10089
  { successRedirect: "/", failureRedirect: "/error" },
10090
10090
  async (err, tokens) => {
10091
10091
  const baseUrl = `/builder/app/${authStateCookie.appId}/data`;
10092
- await doWithDB(authStateCookie.appId, async (db2) => {
10093
- let datasource2;
10094
- try {
10095
- datasource2 = await db2.get(authStateCookie.datasourceId);
10096
- } catch (err2) {
10097
- if (err2.status === 404) {
10098
- ctx.redirect(baseUrl);
10099
- }
10100
- }
10101
- if (!datasource2.config) {
10102
- datasource2.config = {};
10092
+ const id = utils_exports2.newid();
10093
+ await cache_exports.store(
10094
+ `datasource:creation:${authStateCookie.appId}:google:${id}`,
10095
+ {
10096
+ tokens
10103
10097
  }
10104
- datasource2.config.auth = { type: "google", ...tokens };
10105
- await db2.put(datasource2);
10106
- ctx.redirect(`${baseUrl}/datasource/${authStateCookie.datasourceId}`);
10107
- });
10098
+ );
10099
+ ctx.redirect(`${baseUrl}/new?continue_google_setup=${id}`);
10108
10100
  }
10109
10101
  )(ctx, next);
10110
10102
  }
@@ -10114,9 +10106,9 @@ var init_google2 = __esm({
10114
10106
  init_google();
10115
10107
  init_constants2();
10116
10108
  init_utils5();
10117
- init_db5();
10118
10109
  init_configs3();
10119
10110
  init_sso2();
10111
+ init_src2();
10120
10112
  GoogleStrategy2 = require("passport-google-oauth").OAuth2Strategy;
10121
10113
  }
10122
10114
  });
@@ -10838,12 +10830,12 @@ async function refreshOIDCAccessToken(chosenConfig, refreshToken) {
10838
10830
  return strategy._getOAuth2Client(enrichedConfig);
10839
10831
  }
10840
10832
  });
10841
- return new Promise((resolve2) => {
10833
+ return new Promise((resolve3) => {
10842
10834
  refresh.requestNewAccessToken(
10843
10835
  "oidc" /* OIDC */,
10844
10836
  refreshToken,
10845
10837
  (err, accessToken, refreshToken2, params2) => {
10846
- resolve2({ err, accessToken, refreshToken: refreshToken2, params: params2 });
10838
+ resolve3({ err, accessToken, refreshToken: refreshToken2, params: params2 });
10847
10839
  }
10848
10840
  );
10849
10841
  });
@@ -10864,12 +10856,12 @@ async function refreshGoogleAccessToken(config, refreshToken) {
10864
10856
  );
10865
10857
  }
10866
10858
  refresh.use(strategy);
10867
- return new Promise((resolve2) => {
10859
+ return new Promise((resolve3) => {
10868
10860
  refresh.requestNewAccessToken(
10869
10861
  "google" /* GOOGLE */,
10870
10862
  refreshToken,
10871
10863
  (err, accessToken, refreshToken2, params2) => {
10872
- resolve2({ err, accessToken, refreshToken: refreshToken2, params: params2 });
10864
+ resolve3({ err, accessToken, refreshToken: refreshToken2, params: params2 });
10873
10865
  }
10874
10866
  );
10875
10867
  });
@@ -12135,7 +12127,7 @@ var init_environment3 = __esm({
12135
12127
  isInThread: () => {
12136
12128
  return process.env.FORKED_PROCESS;
12137
12129
  },
12138
- TOP_LEVEL_PATH: process.env.TOP_LEVEL_PATH
12130
+ TOP_LEVEL_PATH: process.env.TOP_LEVEL_PATH || process.env.SERVER_TOP_LEVEL_PATH
12139
12131
  };
12140
12132
  if (isDev2() && environment2.DISABLE_THREADING == null) {
12141
12133
  environment2._set("DISABLE_THREADING", "1");
@@ -12163,7 +12155,7 @@ var init_filesystem = __esm({
12163
12155
  import_tar = __toESM(require("tar"));
12164
12156
  init_environment3();
12165
12157
  uuid2 = require("uuid/v4");
12166
- TOP_LEVEL_PATH = environment_default2.TOP_LEVEL_PATH || (0, import_path5.join)(__dirname, "..", "..", "..");
12158
+ TOP_LEVEL_PATH = environment_default2.TOP_LEVEL_PATH || (0, import_path5.resolve)((0, import_path5.join)(__dirname, "..", "..", ".."));
12167
12159
  init9 = () => {
12168
12160
  const tempDir = budibaseTempDir2();
12169
12161
  if (!import_fs4.default.existsSync(tempDir)) {
@@ -24198,7 +24190,7 @@ var init_datasource_bb_default = __esm({
24198
24190
 
24199
24191
  // src/utilities/index.ts
24200
24192
  function wait(ms) {
24201
- return new Promise((resolve2) => setTimeout(resolve2, ms));
24193
+ return new Promise((resolve3) => setTimeout(resolve3, ms));
24202
24194
  }
24203
24195
  function removeFromArray(array, element) {
24204
24196
  const index2 = array.indexOf(element);
@@ -24499,7 +24491,7 @@ var init_threads = __esm({
24499
24491
  }
24500
24492
  run(job) {
24501
24493
  const timeout2 = this.timeoutMs;
24502
- return new Promise((resolve2, reject) => {
24494
+ return new Promise((resolve3, reject) => {
24503
24495
  function fire(worker) {
24504
24496
  worker.execute(job, (err, response2) => {
24505
24497
  if (err && err.type === "TimeoutError") {
@@ -24507,7 +24499,7 @@ var init_threads = __esm({
24507
24499
  } else if (err) {
24508
24500
  reject(err);
24509
24501
  } else {
24510
- resolve2(response2);
24502
+ resolve3(response2);
24511
24503
  }
24512
24504
  });
24513
24505
  }
@@ -24521,15 +24513,15 @@ var init_threads = __esm({
24521
24513
  });
24522
24514
  }
24523
24515
  static stopThreads() {
24524
- return new Promise((resolve2) => {
24516
+ return new Promise((resolve3) => {
24525
24517
  if (_Thread.workerRefs.length === 0) {
24526
- resolve2();
24518
+ resolve3();
24527
24519
  }
24528
24520
  let count = 0;
24529
24521
  function complete() {
24530
24522
  count++;
24531
24523
  if (count >= _Thread.workerRefs.length) {
24532
- resolve2();
24524
+ resolve3();
24533
24525
  }
24534
24526
  }
24535
24527
  for (let worker of _Thread.workerRefs) {
@@ -24847,22 +24839,22 @@ function threadSetup() {
24847
24839
  init10();
24848
24840
  }
24849
24841
  async function checkCacheForDynamicVariable(queryId, variable) {
24850
- const cache2 = await getClient3();
24851
- return cache2.get(makeVariableKey(queryId, variable));
24842
+ const cache3 = await getClient3();
24843
+ return cache3.get(makeVariableKey(queryId, variable));
24852
24844
  }
24853
24845
  async function invalidateDynamicVariables(cachedVars) {
24854
- const cache2 = await getClient3();
24846
+ const cache3 = await getClient3();
24855
24847
  let promises = [];
24856
24848
  for (let variable of cachedVars) {
24857
24849
  promises.push(
24858
- cache2.delete(makeVariableKey(variable.queryId, variable.name))
24850
+ cache3.delete(makeVariableKey(variable.queryId, variable.name))
24859
24851
  );
24860
24852
  }
24861
24853
  await Promise.all(promises);
24862
24854
  }
24863
24855
  async function storeDynamicVariable(queryId, variable, value) {
24864
- const cache2 = await getClient3();
24865
- await cache2.store(
24856
+ const cache3 = await getClient3();
24857
+ await cache3.store(
24866
24858
  makeVariableKey(queryId, variable),
24867
24859
  value,
24868
24860
  VARIABLE_TTL_SECONDS
@@ -26377,13 +26369,13 @@ var init_postgres = __esm({
26377
26369
  }
26378
26370
  closeConnection() {
26379
26371
  const pg = this;
26380
- return new Promise((resolve2, reject) => {
26372
+ return new Promise((resolve3, reject) => {
26381
26373
  this.client.end((err) => {
26382
26374
  pg.open = false;
26383
26375
  if (err) {
26384
26376
  reject(err);
26385
26377
  } else {
26386
- resolve2();
26378
+ resolve3();
26387
26379
  }
26388
26380
  });
26389
26381
  });
@@ -28134,7 +28126,7 @@ var init_s3 = __esm({
28134
28126
  Key: query3.key
28135
28127
  }).createReadStream();
28136
28128
  let csvError = false;
28137
- return new Promise((resolve2, reject) => {
28129
+ return new Promise((resolve3, reject) => {
28138
28130
  stream3.on("error", (err) => {
28139
28131
  reject(err);
28140
28132
  });
@@ -28142,7 +28134,7 @@ var init_s3 = __esm({
28142
28134
  csvError = true;
28143
28135
  });
28144
28136
  stream3.on("finish", () => {
28145
- resolve2(response2);
28137
+ resolve3(response2);
28146
28138
  });
28147
28139
  }).catch((err) => {
28148
28140
  if (csvError) {
@@ -29038,6 +29030,16 @@ var init_rest = __esm({
29038
29030
  });
29039
29031
 
29040
29032
  // src/integrations/googlesheets.ts
29033
+ async function setupCreationAuth(datasouce) {
29034
+ if (datasouce.continueSetupId) {
29035
+ const appId = context_exports.getAppId();
29036
+ const tokens = await cache_exports.get(
29037
+ `datasource:creation:${appId}:google:${datasouce.continueSetupId}`
29038
+ );
29039
+ datasouce.auth = tokens.tokens;
29040
+ delete datasouce.continueSetupId;
29041
+ }
29042
+ }
29041
29043
  var import_google_auth_library, import_google_spreadsheet, import_node_fetch10, ALLOWED_TYPES, SCHEMA12, GoogleSheetsIntegration, googlesheets_default;
29042
29044
  var init_googlesheets = __esm({
29043
29045
  "src/integrations/googlesheets.ts"() {
@@ -29075,7 +29077,7 @@ var init_googlesheets = __esm({
29075
29077
  },
29076
29078
  datasource: {
29077
29079
  spreadsheetId: {
29078
- display: "Google Sheet URL",
29080
+ display: "Spreadsheet URL",
29079
29081
  type: "string" /* STRING */,
29080
29082
  required: true
29081
29083
  }
@@ -29145,6 +29147,7 @@ var init_googlesheets = __esm({
29145
29147
  }
29146
29148
  async testConnection() {
29147
29149
  try {
29150
+ await setupCreationAuth(this.config);
29148
29151
  await this.connect();
29149
29152
  return { connected: true };
29150
29153
  } catch (e) {
@@ -34793,6 +34796,9 @@ async function save13(ctx) {
34793
34796
  datasource2.entities = tables;
34794
34797
  setDefaultDisplayColumns(datasource2);
34795
34798
  }
34799
+ if (preSaveAction[datasource2.source]) {
34800
+ await preSaveAction[datasource2.source](datasource2);
34801
+ }
34796
34802
  const dbResp = await db2.put(datasource2);
34797
34803
  await events_exports.datasource.created(datasource2);
34798
34804
  datasource2._rev = dbResp.rev;
@@ -34871,6 +34877,7 @@ async function query(ctx) {
34871
34877
  ctx.throw(400, err);
34872
34878
  }
34873
34879
  }
34880
+ var preSaveAction;
34874
34881
  var init_datasource5 = __esm({
34875
34882
  "src/api/controllers/datasource.ts"() {
34876
34883
  init_utils9();
@@ -34880,8 +34887,15 @@ var init_datasource5 = __esm({
34880
34887
  init_utils24();
34881
34888
  init_utils18();
34882
34889
  init_src2();
34890
+ init_src();
34883
34891
  init_sdk3();
34884
34892
  init_websockets();
34893
+ init_googlesheets();
34894
+ preSaveAction = {
34895
+ ["GOOGLE_SHEETS" /* GOOGLE_SHEETS */]: async (datasource2) => {
34896
+ await setupCreationAuth(datasource2.config);
34897
+ }
34898
+ };
34885
34899
  }
34886
34900
  });
34887
34901
 
@@ -37905,7 +37919,7 @@ function executeSynchronously(job) {
37905
37919
  if (!appId) {
37906
37920
  throw new Error("Unable to execute, event doesn't contain app ID.");
37907
37921
  }
37908
- const timeoutPromise = new Promise((resolve2, reject) => {
37922
+ const timeoutPromise = new Promise((resolve3, reject) => {
37909
37923
  setTimeout(() => {
37910
37924
  reject(new Error("Timeout exceeded"));
37911
37925
  }, job.data.event.timeout || 12e3);
@@ -43314,7 +43328,7 @@ var init_static = __esm({
43314
43328
  };
43315
43329
  return;
43316
43330
  }
43317
- let builderPath = resolve(TOP_LEVEL_PATH, "new_design_ui");
43331
+ let builderPath = join3(TOP_LEVEL_PATH, "new_design_ui");
43318
43332
  if (!import_fs15.default.existsSync(builderPath)) {
43319
43333
  import_fs15.default.mkdirSync(builderPath);
43320
43334
  }
@@ -43328,7 +43342,7 @@ var init_static = __esm({
43328
43342
  };
43329
43343
  };
43330
43344
  serveBuilder = async function(ctx) {
43331
- const builderPath = resolve(TOP_LEVEL_PATH, "builder");
43345
+ const builderPath = join3(TOP_LEVEL_PATH, "builder");
43332
43346
  await send2(ctx, ctx.file, { root: builderPath });
43333
43347
  };
43334
43348
  uploadFile = async function(ctx) {