@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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@budibase/backend-core",
3
- "version": "3.19.0",
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": "72863c719173848d3128cbef9556a0af09708c20"
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 P=Object.getOwnPropertyDescriptor;var D=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 D(n))!N.call(t,g)&&g!==i&&T(t,g,{get:()=>n[g],enumerable:!(a=P(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)),I=t=>L(T({},"__esModule",{value:!0}),t);var j={};x(j,{validate:()=>M});module.exports=I(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||{}),C=(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))(C||{});var m=(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))(m||{}),f=[...Object.values(m),...Object.values(C)];var e=U(require("joi"));var y=["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(...y),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});
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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAWA,oBAiBC;AAED,4BAEC;AAQD,sCAcC;AAED,kCAEC;AAkLD,8BAEC;AAED,kBAEC;AAlPD,iEAAgC;AAChC,+CAAgC;AAChC,oDAAqC;AACrC,+CAAsD;AACtD,wDAA6B;AAC7B,oCAAmC;AACnC,mCAAkC;AAClC,2CAAqD;AACrD,oDAAqC;AAErC,IAAI,OAA4B,CAAA;AAChC,SAAgB,IAAI,CAAC,IAAqB;IACxC,IACE,qBAAG,CAAC,aAAa;QACjB,qBAAG,CAAC,gBAAgB;QACpB,CAAC,qBAAG,CAAC,WAAW;QAChB,qBAAG,CAAC,6BAA6B,EACjC,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAA;QAC7C,OAAO,GAAG,IAAI,sBAAO,CAAC,qBAAG,CAAC,aAAa,kBACrC,IAAI,EAAE,qBAAG,CAAC,gBAAgB,EAC1B,cAAc,EAAE,qBAAG,CAAC,sBAAsB,EAC1C,2BAA2B,EAAE,gBAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,IACxD,IAAI,EACP,CAAA;IACJ,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAA;IACjC,CAAC;AACH,CAAC;AAED,SAAgB,QAAQ;IACtB,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,QAAQ,EAAE,CAAA;AACrB,CAAC;AAQD,SAAgB,aAAa,CAAC,KAAa;IACzC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAA;IACrD,MAAM,MAAM,GAAmB,EAAE,CAAA;IACjC,KAAK,MAAM,CAAC,QAAQ,EAAE,GAAG,QAAQ,CAAC,IAAI,KAAK,EAAE,CAAC;QAC5C,KAAK,IAAI,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC7B,IAAI,KAAK,GAAG,IAAI,CAAA;YAChB,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC5B,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;gBAC1B,KAAK,GAAG,KAAK,CAAA;YACf,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAA;QAChD,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAED,SAAgB,WAAW;IACzB,OAAO,aAAa,CAAC,qBAAG,CAAC,oBAAoB,IAAI,EAAE,CAAC,CAAA;AACtD,CAAC;AAED,MAAa,OAAO;IAMlB,YAA6B,UAAa;QAAb,eAAU,GAAV,UAAU,CAAG;QACxC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,UAAU,EAAE,CAAA;IAClC,CAAC;IAED,QAAQ;QACN,OAAO,IAAA,kBAAS,EAAC,IAAI,CAAC,UAAU,CAAC,CAAA;IACnC,CAAC;IAED,UAAU,CAAC,IAA8B;QACvC,OAAO,IAAI,CAAC,UAAU,CAAC,IAAe,CAAC,KAAK,SAAS,CAAA;IACvD,CAAC;IAEK,SAAS,CAAoB,GAAM;;YACvC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE,CAAA;YAChC,OAAO,KAAK,CAAC,GAAG,CAAC,CAAA;QACnB,CAAC;KAAA;IAEK,KAAK;;YACT,OAAO,MAAM,kBAAM,CAAC,KAAK,CAAC,gBAAgB,EAAE,CAAM,IAAI,EAAC,EAAE;gBACvD,MAAM,WAAW,GAAG,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;gBACvD,IAAI,WAAW,EAAE,CAAC;oBAChB,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,OAAO,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;oBAClC,OAAO,WAAgB,CAAA;gBACzB,CAAC;gBAED,MAAM,IAAI,GAAwB,EAAE,CAAA;gBACpC,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAA;gBAClC,MAAM,eAAe,GAAG,OAAO,CAAC,WAAW,EAAE,CAAA;gBAC7C,MAAM,oBAAoB,GAAG,IAAI,GAAG,EAAU,CAAA;gBAE9C,8EAA8E;gBAC9E,IAAI,OAAO,CAAC,oBAAoB,EAAE,EAAE,CAAC;oBACnC,OAAO,UAAU,CAAA;gBACnB,CAAC;gBAED,KAAK,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,WAAW,EAAE,EAAE,CAAC;oBACrD,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,KAAK,GAAG,IAAI,QAAQ,KAAK,eAAe,CAAC,EAAE,CAAC;wBACpE,SAAQ;oBACV,CAAC;oBAED,IAAI,CAAC,yBAAyB,CAAC,GAAG,IAAI,CAAA;oBAEtC,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC;wBACpB,oBAAoB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;oBAC/B,CAAC;oBAED,uBAAuB;oBACvB,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;wBAC1B,SAAQ;oBACV,CAAC;oBAED,IAAI,OAAO,UAAU,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE,CAAC;wBACzC,MAAM,IAAI,KAAK,CAAC,YAAY,GAAG,mBAAmB,CAAC,CAAA;oBACrD,CAAC;oBAED,uEAAuE;oBACvE,uEAAuE;oBACvE,UAAU,CAAC,GAAc,CAAC,GAAG,KAAK,CAAA;oBAClC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC,GAAG,aAAa,CAAA;gBAC7C,CAAC;gBAED,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,EAAE,CAAA;gBAEtC,IAAI,MAAM,GAAG,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,GAAG,CAAA;gBAC1B,IAAI,CAAC,MAAM,EAAE,CAAC;oBACZ,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,EAAE,CAAA;oBAC1B,IAAI,EAAE,EAAE,CAAC;wBACP,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;oBAC/D,CAAC;gBACH,CAAC;gBAED,IAAI,QAAQ,GAAG,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,QAAQ,CAAA;gBACjC,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACd,QAAQ,GAAG,eAAe,CAAA;gBAC5B,CAAC;gBAED,IAAI,CAAC,eAAe,CAAC,GAAG,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,IAAI,CAAA;gBACtC,IAAI,CAAC,cAAc,CAAC,GAAG,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,GAAG,CAAA;gBACpC,IAAI,CAAC,UAAU,CAAC,GAAG,QAAQ,CAAA;gBAC3B,IAAI,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAA;gBAEvB,IAAI,OAAO,IAAI,MAAM,EAAE,CAAC;oBACtB,IAAI,CAAC,iBAAiB,CAAC,GAAG,IAAI,CAAA;oBAE9B,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,oBAAoB,EAAE,CAAA;oBACnD,MAAM,gBAAgB,GAA2B,EAAE,QAAQ,EAAE,CAAA;oBAE7D,MAAM,eAAe,GAMjB;wBACF,MAAM,EAAE;4BACN,EAAE,EAAE,QAAQ;yBACb;qBACF,CAAA;oBACD,IAAI,MAAM,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;wBACjC,eAAe,CAAC,MAAM,CAAC,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,cAAc,CAAA;oBACtE,CAAC;oBACD,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;wBACrB,eAAe,CAAC,MAAM,CAAC,SAAS,GAAG,GAAG,MAAM,CAAC,SAAS,EAAE,CAAA;oBAC1D,CAAC;oBACD,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,MAAM,EAAE;wBACrD,gBAAgB;wBAChB,mBAAmB,EAAE,IAAI;wBACzB,MAAM,EAAE;4BACN,MAAM,EAAE,QAAQ;yBACjB;wBACD,eAAe;qBAChB,CAAC,CAAA;oBAEF,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;wBACzD,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;4BAC3B,4DAA4D;4BAC5D,SAAQ;wBACV,CAAC;wBAED,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE,CAAC;4BAC/B,OAAO,CAAC,IAAI,CAAC,mCAAmC,IAAI,MAAM,KAAK,EAAE,CAAC,CAAA;4BAClE,SAAQ;wBACV,CAAC;wBAED,IAAI,UAAU,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;4BAChE,kEAAkE;4BAClE,gDAAgD;4BAChD,SAAQ;wBACV,CAAC;wBAED,IAAI,CAAC;4BACH,uEAAuE;4BACvE,UAAU,CAAC,IAAI,CAAC,GAAG,KAAK,CAAA;4BACxB,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,GAAG,SAAS,CAAA;wBAC1C,CAAC;wBAAC,OAAO,GAAG,EAAE,CAAC;4BACb,qEAAqE;4BACrE,uBAAuB;4BACvB,OAAO,CAAC,IAAI,CAAC,+BAA+B,IAAI,MAAM,KAAK,EAAE,EAAE,GAAG,CAAC,CAAA;wBACrE,CAAC;oBACH,CAAC;gBACH,CAAC;gBAED,MAAM,SAAS,GAAG,OAAO,CAAC,uBAAuB,EAAE,CAAA;gBACnD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;oBACrD,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;wBAC1B,SAAQ;oBACV,CAAC;oBAED,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE,CAAC;wBAC/B,SAAQ;oBACV,CAAC;oBAED,uEAAuE;oBACvE,UAAU,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;oBACvB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC,GAAG,UAAU,CAAA;gBAC1C,CAAC;gBAED,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,EAAE,UAAU,CAAC,CAAA;gBAC/C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;oBACtD,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,GAAG,KAAK,CAAA;gBACpC,CAAC;gBACD,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,OAAO,CAAC,IAAI,CAAC,CAAA;gBAEnB,OAAO,UAAU,CAAA;YACnB,CAAC,CAAA,CAAC,CAAA;QACJ,CAAC;KAAA;CACF;AA5KD,0BA4KC;AAEY,QAAA,KAAK,GAAG,IAAI,OAAO,CAAC,2BAAmB,CAAC,CAAA;AAErD,SAAsB,SAAS,CAAC,IAAsC;;QACpE,OAAO,MAAM,aAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;IACpC,CAAC;CAAA;AAED,SAAsB,GAAG;;QACvB,OAAO,MAAM,aAAK,CAAC,KAAK,EAAE,CAAA;IAC5B,CAAC;CAAA"}
@@ -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 environment_1 = __importDefault(require("../../environment"));
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 `${objectStore.sanitizeKey(appId)}/budibase-client.js`;
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
- let tenantId, qsParams;
85
- try {
86
- tenantId = (0, context_1.getTenantId)();
87
- }
88
- finally {
89
- qsParams = {
90
- appId,
91
- version,
92
- };
93
- }
94
- if (tenantId && tenantId !== context_1.DEFAULT_TENANT_ID) {
95
- qsParams.tenantId = tenantId;
96
- }
97
- return `/api/assets/client?${querystring_1.default.encode(qsParams)}`;
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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOA,8CAEC;AAOD,kDAaC;AAED,4CAcC;AAED,sCAMC;AAED,0CAqBC;AA5ED,oEAAmC;AACnC,4DAA6C;AAC7C,0DAA2C;AAC3C,8DAA4B;AAC5B,2CAA8D;AAG9D,SAAgB,iBAAiB,CAAC,KAAa;IAC7C,OAAO,GAAG,WAAW,CAAC,WAAW,CAAC,KAAK,CAAC,qBAAqB,CAAA;AAC/D,CAAC;AAED;;;;GAIG;AACH,SAAsB,mBAAmB,CAAC,KAAa,EAAE,OAAe;;QACtE,IAAI,IAAI,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAA;QACnC,IAAI,qBAAG,CAAC,cAAc,EAAE,CAAC;YACvB,uCAAuC;YACvC,IAAI,OAAO,EAAE,CAAC;gBACZ,IAAI,IAAI,MAAM,OAAO,EAAE,CAAA;YACzB,CAAC;YACD,yDAAyD;YACzD,iBAAiB;YACjB,OAAO,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QAChC,CAAC;aAAM,CAAC;YACN,OAAO,MAAM,WAAW,CAAC,eAAe,CAAC,qBAAG,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAA;QACtE,CAAC;IACH,CAAC;CAAA;AAED,SAAgB,gBAAgB,CAAC,KAAa,EAAE,OAAe;IAC7D,IAAI,QAAQ,EAAE,QAA+D,CAAA;IAC7E,IAAI,CAAC;QACH,QAAQ,GAAG,IAAA,qBAAW,GAAE,CAAA;IAC1B,CAAC;YAAS,CAAC;QACT,QAAQ,GAAG;YACT,KAAK;YACL,OAAO;SACR,CAAA;IACH,CAAC;IACD,IAAI,QAAQ,IAAI,QAAQ,KAAK,2BAAiB,EAAE,CAAC;QAC/C,QAAQ,CAAC,QAAQ,GAAG,QAAQ,CAAA;IAC9B,CAAC;IACD,OAAO,sBAAsB,qBAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAA;AACpD,CAAC;AAED,SAAsB,aAAa,CAAC,KAAa;;QAC/C,IAAI,qBAAG,CAAC,cAAc,EAAE,CAAC;YACvB,OAAO,UAAU,CAAC,eAAe,CAAC,KAAK,CAAC,CAAA;QAC1C,CAAC;aAAM,CAAC;YACN,OAAO,MAAM,WAAW,CAAC,eAAe,CAAC,qBAAG,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAA;QACvE,CAAC;IACH,CAAC;CAAA;AAED,SAAsB,eAAe,CACnC,MAA0B;;QAE1B,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,EAAE,CAAA;QACX,CAAC;QAED,IAAI,CAAC;YACH,OAAO,MAAM,OAAO,CAAC,GAAG,CACtB,MAAM,CAAC,GAAG,CAAC,CAAM,KAAK,EAAC,EAAE;gBACvB,uCACK,KAAK,KACR,GAAG,EAAE,MAAM,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,EACnC,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,WAAW,IAChC;YACH,CAAC,CAAA,CAAC,CACH,CAAA;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,KAAK,CAAC,CAAA;YACnD,OAAO,MAAM,CAAA;QACf,CAAC;IACH,CAAC;CAAA"}
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<Readable>;
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 response.Body;
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