@budibase/backend-core 3.19.0 → 3.19.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/dist/index.js +11 -11
- package/dist/index.js.map +3 -3
- package/dist/package.json +2 -2
- package/dist/plugins.js +1 -1
- package/dist/src/features/features.js +250 -0
- package/dist/src/features/features.js.map +1 -0
- package/dist/src/features/index.js +42 -0
- package/dist/src/features/index.js.map +1 -0
- package/dist/src/features/tests/utils.js +56 -0
- package/dist/src/features/tests/utils.js.map +1 -0
- package/dist/src/objectStore/buckets/app.d.ts +4 -2
- package/dist/src/objectStore/buckets/app.js +44 -19
- package/dist/src/objectStore/buckets/app.js.map +1 -1
- package/dist/src/objectStore/objectStore.d.ts +6 -1
- package/dist/src/objectStore/objectStore.js +31 -2
- package/dist/src/objectStore/objectStore.js.map +1 -1
- package/dist/src/objectStore/utils.js +4 -4
- package/dist/src/objectStore/utils.js.map +1 -1
- package/package.json +2 -2
package/dist/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@budibase/backend-core",
|
|
3
|
-
"version": "3.19.
|
|
3
|
+
"version": "3.19.1",
|
|
4
4
|
"description": "Budibase backend core libraries used in server and worker",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/src/index.d.ts",
|
|
@@ -112,5 +112,5 @@
|
|
|
112
112
|
}
|
|
113
113
|
}
|
|
114
114
|
},
|
|
115
|
-
"gitHead": "
|
|
115
|
+
"gitHead": "46f5ca09bb21f040008e247b6047d17dc91259be"
|
|
116
116
|
}
|
package/dist/plugins.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var b=Object.create;var T=Object.defineProperty;var
|
|
1
|
+
"use strict";var b=Object.create;var T=Object.defineProperty;var D=Object.getOwnPropertyDescriptor;var P=Object.getOwnPropertyNames;var A=Object.getPrototypeOf,N=Object.prototype.hasOwnProperty;var l=(t,n)=>T(t,"name",{value:n,configurable:!0});var x=(t,n)=>{for(var i in n)T(t,i,{get:n[i],enumerable:!0})},L=(t,n,i,a)=>{if(n&&typeof n=="object"||typeof n=="function")for(let g of P(n))!N.call(t,g)&&g!==i&&T(t,g,{get:()=>n[g],enumerable:!(a=D(n,g))||a.enumerable});return t};var U=(t,n,i)=>(i=t!=null?b(A(t)):{},L(n||!t||!t.__esModule?T(i,"default",{value:t,enumerable:!0}):i,t)),y=t=>L(T({},"__esModule",{value:!0}),t);var j={};x(j,{validate:()=>M});module.exports=y(j);var O=(a=>(a.SQL="sql",a.JSON="json",a.FIELDS="fields",a))(O||{}),c=(o=>(o.STRING="string",o.CODE="code",o.LONGFORM="longForm",o.BOOLEAN="boolean",o.NUMBER="number",o.PASSWORD="password",o.LIST="list",o.OBJECT="object",o.JSON="json",o.FILE="file",o.FIELD_GROUP="fieldGroup",o.SELECT="select",o))(c||{});var p=(a=>(a.CONNECTION_CHECKING="connection",a.FETCH_TABLE_NAMES="fetch_table_names",a.EXPORT_SCHEMA="export_schema",a))(p||{});var u=(E=>(E.OBJECT="object",E.STRING="string",E.BOOLEAN="boolean",E.NUMBER="number",E.ARRAY="array",E.JSON="json",E.DATE="date",E.DATETIME="datetime",E.ATTACHMENT="attachment",E.LONGFORM="longform",E))(u||{}),d=(s=>(s.TABLE="table",s.ROW="row",s.ROWS="rows",s.WIDE="wide",s.QUERY="query",s.QUERY_PARAMS="queryParams",s.QUERY_LIMIT="queryLimit",s.LOOP_OPTION="loopOption",s.ITEM="item",s.CODE="code",s.FILTERS="filters",s.COLUMN="column",s.TRIGGER_SCHEMA="triggerSchema",s.CRON="cron",s.WEBHOOK_URL="webhookUrl",s.AUTOMATION="automation",s.AUTOMATION_FIELDS="automationFields",s.MULTI_ATTACHMENTS="multi_attachments",s.TRIGGER_FILTER="trigger_filter",s.CATEGORIES="categories",s))(d||{}),m=(R=>(R.ROW_SAVED="ROW_SAVED",R.ROW_UPDATED="ROW_UPDATED",R.ROW_DELETED="ROW_DELETED",R.WEBHOOK="WEBHOOK",R.APP="APP",R.CRON="CRON",R.ROW_ACTION="ROW_ACTION",R))(m||{});var C=(r=>(r.SEND_EMAIL_SMTP="SEND_EMAIL_SMTP",r.CREATE_ROW="CREATE_ROW",r.UPDATE_ROW="UPDATE_ROW",r.DELETE_ROW="DELETE_ROW",r.EXECUTE_BASH="EXECUTE_BASH",r.OUTGOING_WEBHOOK="OUTGOING_WEBHOOK",r.EXECUTE_SCRIPT="EXECUTE_SCRIPT",r.EXECUTE_SCRIPT_V2="EXECUTE_SCRIPT_V2",r.EXECUTE_QUERY="EXECUTE_QUERY",r.SERVER_LOG="SERVER_LOG",r.DELAY="DELAY",r.FILTER="FILTER",r.API_REQUEST="API_REQUEST",r.QUERY_ROWS="QUERY_ROWS",r.LOOP="LOOP",r.COLLECT="COLLECT",r.OPENAI="OPENAI",r.TRIGGER_AUTOMATION_RUN="TRIGGER_AUTOMATION_RUN",r.BRANCH="BRANCH",r.CLASSIFY_CONTENT="CLASSIFY_CONTENT",r.PROMPT_LLM="PROMPT_LLM",r.TRANSLATE="TRANSLATE",r.SUMMARISE="SUMMARISE",r.GENERATE_TEXT="GENERATE_TEXT",r.EXTRACT_FILE_DATA="EXTRACT_FILE_DATA",r.EXTRACT_STATE="EXTRACT_STATE",r.LOOP_V2="LOOP_V2",r.discord="discord",r.slack="slack",r.zapier="zapier",r.integromat="integromat",r.n8n="n8n",r))(C||{}),f=[...Object.values(C),...Object.values(m)];var e=U(require("joi"));var I=["Relational","Non-relational","Spreadsheet","Object store","Graph","API"];function _(t,n){let{error:i}=t.validate(n);if(i)throw i}l(_,"runJoi");function S(t){let n=e.default.object({type:e.default.string().allow("component").required(),metadata:e.default.object().unknown(!0).required(),hash:e.default.string().optional(),version:e.default.string().optional(),schema:e.default.object({name:e.default.string().required(),settings:e.default.array().items(e.default.object().unknown(!0)).required()}).unknown(!0)});_(n,t)}l(S,"validateComponent");function G(t){let n=e.default.object({type:e.default.string().allow(...Object.values(c)).required(),required:e.default.boolean().required(),default:e.default.any(),display:e.default.string()}),i=e.default.object({type:e.default.string().allow(...Object.values(O)),readable:e.default.boolean(),displayName:e.default.string(),fields:e.default.object().pattern(e.default.string(),n)}).required(),a=e.default.object({type:e.default.string().allow("datasource").required(),metadata:e.default.object().unknown(!0).required(),hash:e.default.string().optional(),version:e.default.string().optional(),schema:e.default.object({docs:e.default.string(),plus:e.default.boolean().optional(),isSQL:e.default.boolean().optional(),auth:e.default.object({type:e.default.string().required()}).optional(),features:e.default.object(Object.fromEntries(Object.values(p).map(g=>[g,e.default.boolean().optional()]))).optional(),relationships:e.default.boolean().optional(),description:e.default.string().required(),friendlyName:e.default.string().required(),type:e.default.string().allow(...I),datasource:e.default.object().pattern(e.default.string(),n).required(),query:e.default.object().pattern(e.default.string(),i).unknown(!0).required(),extra:e.default.object().pattern(e.default.string(),e.default.object({type:e.default.string().required(),displayName:e.default.string().required(),required:e.default.boolean(),data:e.default.object()}))})});_(a,t)}l(G,"validateDatasource");function B(t){let n=e.default.object().pattern(e.default.string(),{type:e.default.string().allow(...Object.values(u)).required(),customType:e.default.string().allow(...Object.values(d)),title:e.default.string(),description:e.default.string(),enum:e.default.array().items(e.default.string()),pretty:e.default.array().items(e.default.string())}),i=e.default.object({properties:n,required:e.default.array().items(e.default.string())}).concat(n).required(),a=e.default.object({type:e.default.string().allow("automation").required(),metadata:e.default.object().unknown(!0).required(),hash:e.default.string().optional(),version:e.default.string().optional(),schema:e.default.object({name:e.default.string().required(),tagline:e.default.string().required(),icon:e.default.string().required(),description:e.default.string().required(),type:e.default.string().allow("ACTION","LOGIC").required(),stepId:e.default.string().disallow(...f).required(),inputs:e.default.object().optional(),schema:e.default.object({inputs:i,outputs:i}).required()})});_(a,t)}l(B,"validateAutomation");function M(t){switch(t?.type){case"component":S(t);break;case"datasource":G(t);break;case"automation":B(t);break;default:throw new Error(`Unknown plugin type - check schema.json: ${t.type}`)}}l(M,"validate");0&&(module.exports={validate});
|
|
2
2
|
//# sourceMappingURL=plugins.js.map
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
36
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
37
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
38
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
39
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
40
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
41
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
42
|
+
});
|
|
43
|
+
};
|
|
44
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
45
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
46
|
+
};
|
|
47
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
48
|
+
exports.flags = exports.FlagSet = void 0;
|
|
49
|
+
exports.init = init;
|
|
50
|
+
exports.shutdown = shutdown;
|
|
51
|
+
exports.parseEnvFlags = parseEnvFlags;
|
|
52
|
+
exports.getEnvFlags = getEnvFlags;
|
|
53
|
+
exports.isEnabled = isEnabled;
|
|
54
|
+
exports.all = all;
|
|
55
|
+
const environment_1 = __importDefault(require("../environment"));
|
|
56
|
+
const crypto = __importStar(require("crypto"));
|
|
57
|
+
const context = __importStar(require("../context"));
|
|
58
|
+
const posthog_node_1 = require("posthog-node");
|
|
59
|
+
const dd_trace_1 = __importDefault(require("dd-trace"));
|
|
60
|
+
const utils_1 = require("../utils");
|
|
61
|
+
const lodash_1 = require("lodash");
|
|
62
|
+
const types_1 = require("@budibase/types");
|
|
63
|
+
const configs = __importStar(require("../configs"));
|
|
64
|
+
let posthog;
|
|
65
|
+
function init(opts) {
|
|
66
|
+
if (environment_1.default.POSTHOG_TOKEN &&
|
|
67
|
+
environment_1.default.POSTHOG_API_HOST &&
|
|
68
|
+
!environment_1.default.SELF_HOSTED &&
|
|
69
|
+
environment_1.default.POSTHOG_FEATURE_FLAGS_ENABLED) {
|
|
70
|
+
console.log("initializing posthog client...");
|
|
71
|
+
posthog = new posthog_node_1.PostHog(environment_1.default.POSTHOG_TOKEN, Object.assign({ host: environment_1.default.POSTHOG_API_HOST, personalApiKey: environment_1.default.POSTHOG_PERSONAL_TOKEN, featureFlagsPollingInterval: utils_1.Duration.fromMinutes(3).toMs() }, opts));
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
console.log("posthog disabled");
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
function shutdown() {
|
|
78
|
+
posthog === null || posthog === void 0 ? void 0 : posthog.shutdown();
|
|
79
|
+
}
|
|
80
|
+
function parseEnvFlags(flags) {
|
|
81
|
+
const split = flags.split(",").map(x => x.split(":"));
|
|
82
|
+
const result = [];
|
|
83
|
+
for (const [tenantId, ...features] of split) {
|
|
84
|
+
for (let feature of features) {
|
|
85
|
+
let value = true;
|
|
86
|
+
if (feature.startsWith("!")) {
|
|
87
|
+
feature = feature.slice(1);
|
|
88
|
+
value = false;
|
|
89
|
+
}
|
|
90
|
+
result.push({ tenantId, key: feature, value });
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return result;
|
|
94
|
+
}
|
|
95
|
+
function getEnvFlags() {
|
|
96
|
+
return parseEnvFlags(environment_1.default.TENANT_FEATURE_FLAGS || "");
|
|
97
|
+
}
|
|
98
|
+
class FlagSet {
|
|
99
|
+
constructor(flagSchema) {
|
|
100
|
+
this.flagSchema = flagSchema;
|
|
101
|
+
this.setId = crypto.randomUUID();
|
|
102
|
+
}
|
|
103
|
+
defaults() {
|
|
104
|
+
return (0, lodash_1.cloneDeep)(this.flagSchema);
|
|
105
|
+
}
|
|
106
|
+
isFlagName(name) {
|
|
107
|
+
return this.flagSchema[name] !== undefined;
|
|
108
|
+
}
|
|
109
|
+
isEnabled(key) {
|
|
110
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
111
|
+
const flags = yield this.fetch();
|
|
112
|
+
return flags[key];
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
fetch() {
|
|
116
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
117
|
+
return yield dd_trace_1.default.trace("features.fetch", (span) => __awaiter(this, void 0, void 0, function* () {
|
|
118
|
+
const cachedFlags = context.getFeatureFlags(this.setId);
|
|
119
|
+
if (cachedFlags) {
|
|
120
|
+
span === null || span === void 0 ? void 0 : span.addTags({ fromCache: true });
|
|
121
|
+
return cachedFlags;
|
|
122
|
+
}
|
|
123
|
+
const tags = {};
|
|
124
|
+
const flagValues = this.defaults();
|
|
125
|
+
const currentTenantId = context.getTenantId();
|
|
126
|
+
const specificallySetFalse = new Set();
|
|
127
|
+
// flags can't be worked out is self hoster accessing the cloud - no global DB
|
|
128
|
+
if (context.isSelfHostUsingCloud()) {
|
|
129
|
+
return flagValues;
|
|
130
|
+
}
|
|
131
|
+
for (const { tenantId, key, value } of getEnvFlags()) {
|
|
132
|
+
if (!tenantId || (tenantId !== "*" && tenantId !== currentTenantId)) {
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
135
|
+
tags[`readFromEnvironmentVars`] = true;
|
|
136
|
+
if (value === false) {
|
|
137
|
+
specificallySetFalse.add(key);
|
|
138
|
+
}
|
|
139
|
+
// ignore unknown flags
|
|
140
|
+
if (!this.isFlagName(key)) {
|
|
141
|
+
continue;
|
|
142
|
+
}
|
|
143
|
+
if (typeof flagValues[key] !== "boolean") {
|
|
144
|
+
throw new Error(`Feature: ${key} is not a boolean`);
|
|
145
|
+
}
|
|
146
|
+
// @ts-expect-error - TS does not like you writing into a generic type,
|
|
147
|
+
// but we know that it's okay in this case because it's just an object.
|
|
148
|
+
flagValues[key] = value;
|
|
149
|
+
tags[`flags.${key}.source`] = "environment";
|
|
150
|
+
}
|
|
151
|
+
const identity = context.getIdentity();
|
|
152
|
+
let userId = identity === null || identity === void 0 ? void 0 : identity._id;
|
|
153
|
+
if (!userId) {
|
|
154
|
+
const ip = context.getIP();
|
|
155
|
+
if (ip) {
|
|
156
|
+
userId = crypto.createHash("sha512").update(ip).digest("hex");
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
let tenantId = identity === null || identity === void 0 ? void 0 : identity.tenantId;
|
|
160
|
+
if (!tenantId) {
|
|
161
|
+
tenantId = currentTenantId;
|
|
162
|
+
}
|
|
163
|
+
tags[`identity.type`] = identity === null || identity === void 0 ? void 0 : identity.type;
|
|
164
|
+
tags[`identity._id`] = identity === null || identity === void 0 ? void 0 : identity._id;
|
|
165
|
+
tags[`tenantId`] = tenantId;
|
|
166
|
+
tags[`userId`] = userId;
|
|
167
|
+
if (posthog && userId) {
|
|
168
|
+
tags[`readFromPostHog`] = true;
|
|
169
|
+
const config = yield configs.getSettingsConfigDoc();
|
|
170
|
+
const personProperties = { tenantId };
|
|
171
|
+
const groupProperties = {
|
|
172
|
+
tenant: {
|
|
173
|
+
id: tenantId,
|
|
174
|
+
},
|
|
175
|
+
};
|
|
176
|
+
if (config.config.createdVersion) {
|
|
177
|
+
groupProperties.tenant.createdVersion = config.config.createdVersion;
|
|
178
|
+
}
|
|
179
|
+
if (config.createdAt) {
|
|
180
|
+
groupProperties.tenant.createdAt = `${config.createdAt}`;
|
|
181
|
+
}
|
|
182
|
+
const posthogFlags = yield posthog.getAllFlags(userId, {
|
|
183
|
+
personProperties,
|
|
184
|
+
onlyEvaluateLocally: true,
|
|
185
|
+
groups: {
|
|
186
|
+
tenant: tenantId,
|
|
187
|
+
},
|
|
188
|
+
groupProperties,
|
|
189
|
+
});
|
|
190
|
+
for (const [name, value] of Object.entries(posthogFlags)) {
|
|
191
|
+
if (!this.isFlagName(name)) {
|
|
192
|
+
// We don't want an unexpected PostHog flag to break the app
|
|
193
|
+
continue;
|
|
194
|
+
}
|
|
195
|
+
if (typeof value !== "boolean") {
|
|
196
|
+
console.warn(`Invalid value for posthog flag "${name}": ${value}`);
|
|
197
|
+
continue;
|
|
198
|
+
}
|
|
199
|
+
if (flagValues[name] === true || specificallySetFalse.has(name)) {
|
|
200
|
+
// If the flag is already set to through environment variables, we
|
|
201
|
+
// don't want to override it back to false here.
|
|
202
|
+
continue;
|
|
203
|
+
}
|
|
204
|
+
try {
|
|
205
|
+
// @ts-expect-error - TS does not like you writing into a generic type.
|
|
206
|
+
flagValues[name] = value;
|
|
207
|
+
tags[`flags.${name}.source`] = "posthog";
|
|
208
|
+
}
|
|
209
|
+
catch (err) {
|
|
210
|
+
// We don't want an invalid PostHog flag to break the app, so we just
|
|
211
|
+
// log it and continue.
|
|
212
|
+
console.warn(`Error parsing posthog flag "${name}": ${value}`, err);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
const overrides = context.getFeatureFlagOverrides();
|
|
217
|
+
for (const [key, value] of Object.entries(overrides)) {
|
|
218
|
+
if (!this.isFlagName(key)) {
|
|
219
|
+
continue;
|
|
220
|
+
}
|
|
221
|
+
if (typeof value !== "boolean") {
|
|
222
|
+
continue;
|
|
223
|
+
}
|
|
224
|
+
// @ts-expect-error - TS does not like you writing into a generic type.
|
|
225
|
+
flagValues[key] = value;
|
|
226
|
+
tags[`flags.${key}.source`] = "override";
|
|
227
|
+
}
|
|
228
|
+
context.setFeatureFlags(this.setId, flagValues);
|
|
229
|
+
for (const [key, value] of Object.entries(flagValues)) {
|
|
230
|
+
tags[`flags.${key}.value`] = value;
|
|
231
|
+
}
|
|
232
|
+
span === null || span === void 0 ? void 0 : span.addTags(tags);
|
|
233
|
+
return flagValues;
|
|
234
|
+
}));
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
exports.FlagSet = FlagSet;
|
|
239
|
+
exports.flags = new FlagSet(types_1.FeatureFlagDefaults);
|
|
240
|
+
function isEnabled(flag) {
|
|
241
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
242
|
+
return yield exports.flags.isEnabled(flag);
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
function all() {
|
|
246
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
247
|
+
return yield exports.flags.fetch();
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
//# sourceMappingURL=features.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"features.js","sourceRoot":"","sources":["../../../src/features/features.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
19
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
20
|
+
};
|
|
21
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
22
|
+
var ownKeys = function(o) {
|
|
23
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
24
|
+
var ar = [];
|
|
25
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
26
|
+
return ar;
|
|
27
|
+
};
|
|
28
|
+
return ownKeys(o);
|
|
29
|
+
};
|
|
30
|
+
return function (mod) {
|
|
31
|
+
if (mod && mod.__esModule) return mod;
|
|
32
|
+
var result = {};
|
|
33
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
34
|
+
__setModuleDefault(result, mod);
|
|
35
|
+
return result;
|
|
36
|
+
};
|
|
37
|
+
})();
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.testutils = void 0;
|
|
40
|
+
__exportStar(require("./features"), exports);
|
|
41
|
+
exports.testutils = __importStar(require("./tests/utils"));
|
|
42
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/features/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,6CAA0B;AAC1B,2DAA0C"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.setFeatureFlags = setFeatureFlags;
|
|
4
|
+
exports.withFeatureFlags = withFeatureFlags;
|
|
5
|
+
const environment_1 = require("../../environment");
|
|
6
|
+
const features_1 = require("../features");
|
|
7
|
+
function getCurrentFlags() {
|
|
8
|
+
const result = {};
|
|
9
|
+
for (const { tenantId, key, value } of (0, features_1.parseEnvFlags)(process.env.TENANT_FEATURE_FLAGS || "")) {
|
|
10
|
+
const tenantFlags = result[tenantId] || {};
|
|
11
|
+
// Don't allow overwriting specifically false flags, to match the beheaviour
|
|
12
|
+
// of FlagSet.
|
|
13
|
+
if (tenantFlags[key] === false) {
|
|
14
|
+
continue;
|
|
15
|
+
}
|
|
16
|
+
tenantFlags[key] = value;
|
|
17
|
+
result[tenantId] = tenantFlags;
|
|
18
|
+
}
|
|
19
|
+
return result;
|
|
20
|
+
}
|
|
21
|
+
function buildFlagString(flags) {
|
|
22
|
+
const parts = [];
|
|
23
|
+
for (const [tenantId, tenantFlags] of Object.entries(flags)) {
|
|
24
|
+
for (const [key, value] of Object.entries(tenantFlags)) {
|
|
25
|
+
if (value === false) {
|
|
26
|
+
parts.push(`${tenantId}:!${key}`);
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
parts.push(`${tenantId}:${key}`);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return parts.join(",");
|
|
34
|
+
}
|
|
35
|
+
function setFeatureFlags(tenantId, flags) {
|
|
36
|
+
const current = getCurrentFlags();
|
|
37
|
+
for (const [key, value] of Object.entries(flags)) {
|
|
38
|
+
const tenantFlags = current[tenantId] || {};
|
|
39
|
+
tenantFlags[key] = value;
|
|
40
|
+
current[tenantId] = tenantFlags;
|
|
41
|
+
}
|
|
42
|
+
const flagString = buildFlagString(current);
|
|
43
|
+
return (0, environment_1.setEnv)({ TENANT_FEATURE_FLAGS: flagString });
|
|
44
|
+
}
|
|
45
|
+
function withFeatureFlags(tenantId, flags, f) {
|
|
46
|
+
const cleanup = setFeatureFlags(tenantId, flags);
|
|
47
|
+
const result = f();
|
|
48
|
+
if (result instanceof Promise) {
|
|
49
|
+
return result.finally(cleanup);
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
cleanup();
|
|
53
|
+
return result;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/features/tests/utils.ts"],"names":[],"mappings":";;AAqCA,0CAYC;AAED,4CAaC;AA/DD,mDAA0C;AAC1C,0CAA2C;AAE3C,SAAS,eAAe;IACtB,MAAM,MAAM,GAA4C,EAAE,CAAA;IAC1D,KAAK,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,IAAA,wBAAa,EAClD,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,EAAE,CACvC,EAAE,CAAC;QACF,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAA;QAC1C,4EAA4E;QAC5E,cAAc;QACd,IAAI,WAAW,CAAC,GAAG,CAAC,KAAK,KAAK,EAAE,CAAC;YAC/B,SAAQ;QACV,CAAC;QACD,WAAW,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;QACxB,MAAM,CAAC,QAAQ,CAAC,GAAG,WAAW,CAAA;IAChC,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAED,SAAS,eAAe,CACtB,KAA8C;IAE9C,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,KAAK,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5D,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;YACvD,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC;gBACpB,KAAK,CAAC,IAAI,CAAC,GAAG,QAAQ,KAAK,GAAG,EAAE,CAAC,CAAA;YACnC,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,IAAI,CAAC,GAAG,QAAQ,IAAI,GAAG,EAAE,CAAC,CAAA;YAClC,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AACxB,CAAC;AAED,SAAgB,eAAe,CAC7B,QAAgB,EAChB,KAA4B;IAE5B,MAAM,OAAO,GAAG,eAAe,EAAE,CAAA;IACjC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACjD,MAAM,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAA;QAC3C,WAAW,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;QACxB,OAAO,CAAC,QAAQ,CAAC,GAAG,WAAW,CAAA;IACjC,CAAC;IACD,MAAM,UAAU,GAAG,eAAe,CAAC,OAAO,CAAC,CAAA;IAC3C,OAAO,IAAA,oBAAM,EAAC,EAAE,oBAAoB,EAAE,UAAU,EAAE,CAAC,CAAA;AACrD,CAAC;AAED,SAAgB,gBAAgB,CAC9B,QAAgB,EAChB,KAA4B,EAC5B,CAAU;IAEV,MAAM,OAAO,GAAG,eAAe,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAA;IAChD,MAAM,MAAM,GAAG,CAAC,EAAE,CAAA;IAClB,IAAI,MAAM,YAAY,OAAO,EAAE,CAAC;QAC9B,OAAO,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;IAChC,CAAC;SAAM,CAAC;QACN,OAAO,EAAE,CAAA;QACT,OAAO,MAAM,CAAA;IACf,CAAC;AACH,CAAC"}
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import { PWAManifestImage } from "@budibase/types";
|
|
2
|
-
export declare function clientLibraryPath(appId: string): string
|
|
2
|
+
export declare function clientLibraryPath(appId: string): Promise<string>;
|
|
3
|
+
export declare function client3rdPartyLibrary(appId: string, file: string): string;
|
|
3
4
|
/**
|
|
4
5
|
* Previously we used to serve the client library directly from Cloudfront, however
|
|
5
6
|
* due to issues with the domain we were unable to continue doing this - keeping
|
|
6
7
|
* incase we are able to switch back to CDN path again in future.
|
|
7
8
|
*/
|
|
8
9
|
export declare function clientLibraryCDNUrl(appId: string, version: string): Promise<string>;
|
|
9
|
-
export declare function clientLibraryUrl(appId: string, version: string): string
|
|
10
|
+
export declare function clientLibraryUrl(appId: string, version: string): Promise<string>;
|
|
11
|
+
export declare function getClientCacheKey(appId: string, version: string): Promise<string>;
|
|
10
12
|
export declare function getAppFileUrl(s3Key: string): Promise<string>;
|
|
11
13
|
export declare function enrichPWAImages(images: PWAManifestImage[]): Promise<PWAManifestImage[]>;
|
|
@@ -46,17 +46,34 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
46
46
|
};
|
|
47
47
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
48
48
|
exports.clientLibraryPath = clientLibraryPath;
|
|
49
|
+
exports.client3rdPartyLibrary = client3rdPartyLibrary;
|
|
49
50
|
exports.clientLibraryCDNUrl = clientLibraryCDNUrl;
|
|
50
51
|
exports.clientLibraryUrl = clientLibraryUrl;
|
|
52
|
+
exports.getClientCacheKey = getClientCacheKey;
|
|
51
53
|
exports.getAppFileUrl = getAppFileUrl;
|
|
52
54
|
exports.enrichPWAImages = enrichPWAImages;
|
|
53
|
-
const
|
|
54
|
-
const objectStore = __importStar(require("../objectStore"));
|
|
55
|
-
const cloudfront = __importStar(require("../cloudfront"));
|
|
55
|
+
const types_1 = require("@budibase/types");
|
|
56
56
|
const querystring_1 = __importDefault(require("querystring"));
|
|
57
57
|
const context_1 = require("../../context");
|
|
58
|
+
const environment_1 = __importDefault(require("../../environment"));
|
|
59
|
+
const features = __importStar(require("../../features"));
|
|
60
|
+
const cloudfront = __importStar(require("../cloudfront"));
|
|
61
|
+
const objectStore = __importStar(require("../objectStore"));
|
|
58
62
|
function clientLibraryPath(appId) {
|
|
59
|
-
return
|
|
63
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
64
|
+
const oldClient = `${objectStore.sanitizeKey(appId)}/budibase-client.js`;
|
|
65
|
+
const newClient = `${objectStore.sanitizeKey(appId)}/budibase-client.new.js`;
|
|
66
|
+
if (!(yield features.isEnabled(types_1.FeatureFlag.USE_DYNAMIC_LOADING))) {
|
|
67
|
+
return oldClient;
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
const newClientExists = yield objectStore.objectExists(environment_1.default.APPS_BUCKET_NAME, newClient);
|
|
71
|
+
return newClientExists ? newClient : oldClient;
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
function client3rdPartyLibrary(appId, file) {
|
|
76
|
+
return `${objectStore.sanitizeKey(appId)}/_dependencies/${file}`;
|
|
60
77
|
}
|
|
61
78
|
/**
|
|
62
79
|
* Previously we used to serve the client library directly from Cloudfront, however
|
|
@@ -65,7 +82,7 @@ function clientLibraryPath(appId) {
|
|
|
65
82
|
*/
|
|
66
83
|
function clientLibraryCDNUrl(appId, version) {
|
|
67
84
|
return __awaiter(this, void 0, void 0, function* () {
|
|
68
|
-
let file = clientLibraryPath(appId);
|
|
85
|
+
let file = yield clientLibraryPath(appId);
|
|
69
86
|
if (environment_1.default.CLOUDFRONT_CDN) {
|
|
70
87
|
// append app version to bust the cache
|
|
71
88
|
if (version) {
|
|
@@ -81,20 +98,28 @@ function clientLibraryCDNUrl(appId, version) {
|
|
|
81
98
|
});
|
|
82
99
|
}
|
|
83
100
|
function clientLibraryUrl(appId, version) {
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
101
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
102
|
+
return `/api/assets/client?${yield getClientCacheKey(appId, version)}`;
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
function getClientCacheKey(appId, version) {
|
|
106
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
107
|
+
let tenantId, qsParams;
|
|
108
|
+
try {
|
|
109
|
+
tenantId = (0, context_1.getTenantId)();
|
|
110
|
+
}
|
|
111
|
+
finally {
|
|
112
|
+
qsParams = {
|
|
113
|
+
appId,
|
|
114
|
+
version,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
if (tenantId && tenantId !== context_1.DEFAULT_TENANT_ID) {
|
|
118
|
+
qsParams.tenantId = tenantId;
|
|
119
|
+
}
|
|
120
|
+
qsParams.dynamic = yield features.isEnabled(types_1.FeatureFlag.USE_DYNAMIC_LOADING);
|
|
121
|
+
return querystring_1.default.encode(qsParams);
|
|
122
|
+
});
|
|
98
123
|
}
|
|
99
124
|
function getAppFileUrl(s3Key) {
|
|
100
125
|
return __awaiter(this, void 0, void 0, function* () {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.js","sourceRoot":"","sources":["../../../../src/objectStore/buckets/app.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"app.js","sourceRoot":"","sources":["../../../../src/objectStore/buckets/app.ts"],"names":[],"mappings":"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"}
|
|
@@ -97,8 +97,13 @@ export declare function deleteFolder(bucketName: string, folder: string): Promis
|
|
|
97
97
|
export declare function uploadDirectory(bucketName: string, localPath: string, bucketPath: string): Promise<fs.Dirent<string>[]>;
|
|
98
98
|
export declare function downloadTarballDirect(url: string, path: string, headers?: {}): Promise<void>;
|
|
99
99
|
export declare function downloadTarball(url: string, bucketName: string, path: string): Promise<string>;
|
|
100
|
-
export declare function getReadStream(bucketName: string, path: string): Promise<
|
|
100
|
+
export declare function getReadStream(bucketName: string, path: string): Promise<{
|
|
101
|
+
stream: Readable;
|
|
102
|
+
contentLength?: number;
|
|
103
|
+
contentType?: string;
|
|
104
|
+
}>;
|
|
101
105
|
export declare function getObjectMetadata(bucket: string, path: string): Promise<HeadObjectCommandOutput>;
|
|
106
|
+
export declare function objectExists(bucket: string, path: string): Promise<boolean>;
|
|
102
107
|
export declare function extractBucketAndPath(url: string): {
|
|
103
108
|
bucket: string;
|
|
104
109
|
path: string;
|
|
@@ -45,6 +45,7 @@ exports.downloadTarballDirect = downloadTarballDirect;
|
|
|
45
45
|
exports.downloadTarball = downloadTarball;
|
|
46
46
|
exports.getReadStream = getReadStream;
|
|
47
47
|
exports.getObjectMetadata = getObjectMetadata;
|
|
48
|
+
exports.objectExists = objectExists;
|
|
48
49
|
exports.extractBucketAndPath = extractBucketAndPath;
|
|
49
50
|
const sanitize = require("sanitize-s3-objectkey");
|
|
50
51
|
const client_s3_1 = require("@aws-sdk/client-s3");
|
|
@@ -395,7 +396,7 @@ function retrieveDirectory(bucketName, path) {
|
|
|
395
396
|
yield dd_trace_1.default.trace("retrieveDirectory.object", (span) => __awaiter(this, void 0, void 0, function* () {
|
|
396
397
|
const filename = object.Key;
|
|
397
398
|
span.addTags({ filename });
|
|
398
|
-
const stream = yield getReadStream(bucketName, filename);
|
|
399
|
+
const { stream } = yield getReadStream(bucketName, filename);
|
|
399
400
|
const possiblePath = filename.split("/");
|
|
400
401
|
const dirs = possiblePath.slice(0, possiblePath.length - 1);
|
|
401
402
|
const possibleDir = (0, path_1.join)(writePath, ...dirs);
|
|
@@ -545,7 +546,11 @@ function getReadStream(bucketName, path) {
|
|
|
545
546
|
contentLength: response.ContentLength,
|
|
546
547
|
contentType: response.ContentType,
|
|
547
548
|
});
|
|
548
|
-
return
|
|
549
|
+
return {
|
|
550
|
+
stream: response.Body,
|
|
551
|
+
contentLength: response.ContentLength,
|
|
552
|
+
contentType: response.ContentType,
|
|
553
|
+
};
|
|
549
554
|
}));
|
|
550
555
|
});
|
|
551
556
|
}
|
|
@@ -566,6 +571,30 @@ function getObjectMetadata(bucket, path) {
|
|
|
566
571
|
}
|
|
567
572
|
});
|
|
568
573
|
}
|
|
574
|
+
function objectExists(bucket, path) {
|
|
575
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
576
|
+
var _a;
|
|
577
|
+
bucket = sanitizeBucket(bucket);
|
|
578
|
+
path = sanitizeKey(path);
|
|
579
|
+
const client = ObjectStore();
|
|
580
|
+
const params = {
|
|
581
|
+
Bucket: bucket,
|
|
582
|
+
Key: path,
|
|
583
|
+
};
|
|
584
|
+
try {
|
|
585
|
+
yield client.headObject(params);
|
|
586
|
+
return true;
|
|
587
|
+
}
|
|
588
|
+
catch (err) {
|
|
589
|
+
const statusCode = err.statusCode || ((_a = err.$response) === null || _a === void 0 ? void 0 : _a.statusCode);
|
|
590
|
+
if (statusCode === 404) {
|
|
591
|
+
return false;
|
|
592
|
+
}
|
|
593
|
+
// Re-throw non-404 errors (access denied, network issues, etc.)
|
|
594
|
+
throw err;
|
|
595
|
+
}
|
|
596
|
+
});
|
|
597
|
+
}
|
|
569
598
|
/*
|
|
570
599
|
Given a signed url like '/files/signed/tmp-files-attachments/app_123456/myfile.txt' extract
|
|
571
600
|
the bucket and the path from it
|