@budibase/server 2.7.6 → 2.7.7-alpha.1
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/Dockerfile +1 -1
- package/builder/assets/{index.4ca5529d.js → index.933787a7.js} +326 -326
- package/builder/assets/{index.a86e2071.css → index.b33e8ad5.css} +1 -1
- package/builder/index.html +2 -2
- package/dist/automation.js +70 -60
- package/dist/automation.js.map +3 -3
- package/dist/index.js +76 -62
- package/dist/index.js.map +3 -3
- package/dist/query.js +40 -37
- package/dist/query.js.map +3 -3
- package/package.json +8 -8
- package/src/api/controllers/datasource.ts +13 -1
- package/src/api/controllers/static/index.ts +3 -3
- package/src/environment.ts +2 -1
- package/src/integrations/googlesheets.ts +18 -2
- package/src/utilities/fileSystem/filesystem.ts +2 -2
package/builder/index.html
CHANGED
|
@@ -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.
|
|
12
|
-
<link rel="stylesheet" href="/builder/assets/index.
|
|
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">
|
package/dist/automation.js
CHANGED
|
@@ -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((
|
|
2858
|
+
return new Promise((resolve3) => {
|
|
2859
2859
|
if (pickClient(selectDb) == null) {
|
|
2860
2860
|
init2();
|
|
2861
2861
|
} else if (CONNECTED) {
|
|
2862
|
-
|
|
2862
|
+
resolve3("");
|
|
2863
2863
|
return;
|
|
2864
2864
|
}
|
|
2865
2865
|
const interval = set(() => {
|
|
2866
2866
|
if (CONNECTED) {
|
|
2867
2867
|
clear(interval);
|
|
2868
|
-
|
|
2868
|
+
resolve3("");
|
|
2869
2869
|
}
|
|
2870
2870
|
}, 500);
|
|
2871
2871
|
});
|
|
2872
2872
|
}
|
|
2873
2873
|
function promisifyStream(stream3, client3) {
|
|
2874
|
-
return new Promise((
|
|
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
|
-
|
|
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((
|
|
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
|
|
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
|
|
5360
|
+
const cache3 = await getCache();
|
|
5361
5361
|
const key = doc._id;
|
|
5362
5362
|
let cacheItem;
|
|
5363
5363
|
if (key) {
|
|
5364
|
-
cacheItem = await
|
|
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
|
|
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
|
|
5407
|
+
const cache3 = await getCache();
|
|
5408
5408
|
const cacheKey = makeCacheKey(db2, id);
|
|
5409
|
-
let cacheItem = await
|
|
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
|
|
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
|
|
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
|
|
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((
|
|
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
|
|
9785
|
-
ctx.throw(400, "appId
|
|
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,
|
|
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
|
-
|
|
9814
|
-
|
|
9815
|
-
|
|
9816
|
-
|
|
9817
|
-
|
|
9818
|
-
if (err2.status === 404) {
|
|
9819
|
-
ctx.redirect(baseUrl);
|
|
9820
|
-
}
|
|
9821
|
-
}
|
|
9822
|
-
if (!datasource2.config) {
|
|
9823
|
-
datasource2.config = {};
|
|
9813
|
+
const id = newid();
|
|
9814
|
+
await store(
|
|
9815
|
+
`datasource:creation:${authStateCookie.appId}:google:${id}`,
|
|
9816
|
+
{
|
|
9817
|
+
tokens
|
|
9824
9818
|
}
|
|
9825
|
-
|
|
9826
|
-
|
|
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
|
}
|
|
@@ -9834,9 +9826,9 @@ var init_google2 = __esm({
|
|
|
9834
9826
|
"../backend-core/src/middleware/passport/datasource/google.ts"() {
|
|
9835
9827
|
init_google();
|
|
9836
9828
|
init_constants2();
|
|
9837
|
-
init_utils5();
|
|
9838
|
-
init_db5();
|
|
9839
9829
|
init_configs3();
|
|
9830
|
+
init_cache();
|
|
9831
|
+
init_utils5();
|
|
9840
9832
|
init_sso2();
|
|
9841
9833
|
GoogleStrategy2 = require("passport-google-oauth").OAuth2Strategy;
|
|
9842
9834
|
}
|
|
@@ -10559,12 +10551,12 @@ async function refreshOIDCAccessToken(chosenConfig, refreshToken) {
|
|
|
10559
10551
|
return strategy._getOAuth2Client(enrichedConfig);
|
|
10560
10552
|
}
|
|
10561
10553
|
});
|
|
10562
|
-
return new Promise((
|
|
10554
|
+
return new Promise((resolve3) => {
|
|
10563
10555
|
refresh.requestNewAccessToken(
|
|
10564
10556
|
"oidc" /* OIDC */,
|
|
10565
10557
|
refreshToken,
|
|
10566
10558
|
(err, accessToken, refreshToken2, params2) => {
|
|
10567
|
-
|
|
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((
|
|
10580
|
+
return new Promise((resolve3) => {
|
|
10589
10581
|
refresh.requestNewAccessToken(
|
|
10590
10582
|
"google" /* GOOGLE */,
|
|
10591
10583
|
refreshToken,
|
|
10592
10584
|
(err, accessToken, refreshToken2, params2) => {
|
|
10593
|
-
|
|
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((
|
|
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((
|
|
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
|
-
|
|
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((
|
|
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
|
-
|
|
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: "
|
|
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
|
|
26893
|
-
return
|
|
26895
|
+
const cache3 = await getClient2();
|
|
26896
|
+
return cache3.get(makeVariableKey(queryId, variable));
|
|
26894
26897
|
}
|
|
26895
26898
|
async function invalidateDynamicVariables(cachedVars) {
|
|
26896
|
-
const
|
|
26899
|
+
const cache3 = await getClient2();
|
|
26897
26900
|
let promises = [];
|
|
26898
26901
|
for (let variable of cachedVars) {
|
|
26899
26902
|
promises.push(
|
|
26900
|
-
|
|
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
|
|
26907
|
-
await
|
|
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((
|
|
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
|
-
|
|
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((
|
|
27018
|
+
return new Promise((resolve3) => {
|
|
27016
27019
|
if (_Thread.workerRefs.length === 0) {
|
|
27017
|
-
|
|
27020
|
+
resolve3();
|
|
27018
27021
|
}
|
|
27019
27022
|
let count = 0;
|
|
27020
27023
|
function complete() {
|
|
27021
27024
|
count++;
|
|
27022
27025
|
if (count >= _Thread.workerRefs.length) {
|
|
27023
|
-
|
|
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((
|
|
32562
|
+
const timeoutPromise = new Promise((resolve3, reject) => {
|
|
32553
32563
|
setTimeout(() => {
|
|
32554
32564
|
reject(new Error("Timeout exceeded"));
|
|
32555
32565
|
}, job.data.event.timeout || 12e3);
|