@growthbook/edge-utils 0.1.6 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -2,10 +2,11 @@
2
2
 
3
3
  [GrowthBook](https://www.growthbook.io) is a modular Feature Flagging and Experimentation platform.
4
4
 
5
- The **GrowthBook Edge App** provides turnkey Visual Editor and URL Redirect experimentation on edge without any of the flicker associated with front-end experiments. It runs as a smart proxy layer between your application and your end users. It also can inject a fully-hydrated front-end SDK onto the rendered page, meaning no extra network requests needed.
5
+ The **GrowthBook Edge App** provides turnkey Visual Editor and URL Redirect experimentation on edge without any of the flicker associated with front-end experiments while also supporting manual feature flagging and experimentation. It runs as a smart proxy layer between your application and your end users. It also can inject a fully-hydrated front-end SDK onto the rendered page, meaning no extra network requests needed.
6
6
 
7
7
  - Automatically run server-side or hybrid Visual Experiments without redraw flicker.
8
8
  - Automatically run server-side or hybrid URL Redirect Experiments without flicker or delay.
9
+ - Perform custom feature flagging and experimentation logic using [lifecycle hooks](#lifecycle-hooks).
9
10
  - Inject the JavaScript SDK with hydrated payload, allowing the front-end to pick up where the edge left off without any extra network requests.
10
11
 
11
12
  > [!NOTE]
@@ -60,6 +61,9 @@ The GrowthBook Edge App supports a number of configuration options available via
60
61
  #### Proxy behavior
61
62
  - `PROXY_TARGET` - Non-edge url to your website
62
63
  - `FORWARD_PROXY_HEADERS` - "true" or "1" to preserve response headers from your server (default : `true`)
64
+ - `FOLLOW_REDIRECTS` - "true" or "1" to follow redirects when processing an origin response (default : `true`)
65
+ - `USE_DEFAULT_CONTENT_TYPE` - "true" or "1" to assume a content-type of "text-html" if no "Content-Type" header was set (default `false`).
66
+ - `PROCESS_TEXT_HTML_ONLY` - "true" or "1" to only process server responses with the `Content-Type: text/html` header set – others will be proxied through (default `true`).
63
67
  - `NODE_ENV` - default: `production`
64
68
  - `ROUTES` - JSON encoded array of Routes, rules for intercepting, proxy passing, or erroring based on request URL pattern matching
65
69
 
@@ -93,9 +97,27 @@ The GrowthBook Edge App supports a number of configuration options available via
93
97
  - `UUID_KEY` - Customize the user identifier name (default `id`)
94
98
  - `SKIP_AUTO_ATTRIBUTES` "true" or "1" to skip auto-generating targeting attributes (default `false`)
95
99
 
100
+ #### Lifecycle hooks
101
+ - `ALWAYS_PARSE_DOM` - Normally the worker will only build a virtual DOM if there are visual changes. Set to "true" or "1" to always build a virtual DOM so that you can access it in lifecycle hooks (ex: `onBodyReady`)
102
+
96
103
  #### Misc
97
104
  - `CONTENT_SECURITY_POLICY` - CSP header value
98
105
 
106
+
107
+ ## Lifecycle hooks
108
+ You can perform custom logic and optionally return a response at various stages in the Edge App's lifecycle. This allows for expressiveness of custom routing, user attribute mutation, header and body (DOM) mutation, and custom feature flag and experiment implementations – while preserving the ability to automatically run Visual and URL Redirect experiments and SDK hydration.
109
+
110
+ With each hook, you may mutate any of the provided attributes *or* return an early response to halt the Edge App processing. The following hooks are available
111
+
112
+ - `onRequest` - Fired on initial user request. Can exit early based on requested URL.
113
+ - `onRoute` - Fired after standard routing has been processed. Can exit early (proxy) based on manual routing logic.
114
+ - `onUserAttributes` - Fired after auto-attributes have been assigned to the user. Either enhance the provided `attributes` object or exit early if desired.
115
+ - `onGrowthBookInit` - Fired after the Edge App's internal GrowthBook SDK has been initialized. Call SDK functions or exit early if desired.
116
+ - `onBeforeOriginFetch` - Similar hook to the above; triggers after any URL Redirect experiments have run but before any origin requests have been made.
117
+ - `onOriginFetch` - Fired immediately after the origin fetch has been made, but before the full response body has been captured. Useful for exiting early based on response status or headers.
118
+ - `onBodyReadyParams` - Fired once the entire response body has been parsed. In addition to early exiting, you may begin to mutate the final response body via `resHeaders` and the `setBody()` method. The text `body` as well as the optional parsed virtual DOM `root` (disabled by default, use `ALWAYS_PARSE_DOM` to enable) are exposed. NOTE: If mutating the `root` DOM, it is your responsibility to `setBody()` with the latest changes before the response is returned.
119
+ - `onBeforeResponse` - The final hook fired before the response is returned to the user, triggering after both visual editor changes and client SDK hydration have been injected. While the virtual DOM is no longer available, this hook can be used to apply any final changes the body via `setBody()`.
120
+
99
121
  ## Further reading
100
122
 
101
123
  See the Edge App [documentation](https://docs.growthbook.io/lib/edge/other) for more details and examples.
package/dist/app.d.ts CHANGED
@@ -1,3 +1,3 @@
1
1
  import { Context } from "./types";
2
2
  export declare function edgeApp<Req, Res>(context: Context<Req, Res>, req: Req, res?: Res, next?: any): Promise<unknown>;
3
- export declare function getOriginUrl(context: Context, currentURL: string): string;
3
+ export declare function getOriginUrl<Req, Res>(context: Context<Req, Res>, currentURL: string): string;
package/dist/app.js CHANGED
@@ -12,7 +12,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
12
12
  return (mod && mod.__esModule) ? mod : { "default": mod };
13
13
  };
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
- exports.getOriginUrl = exports.edgeApp = void 0;
15
+ exports.edgeApp = edgeApp;
16
+ exports.getOriginUrl = getOriginUrl;
16
17
  const growthbook_1 = require("@growthbook/growthbook");
17
18
  const attributes_1 = require("./attributes");
18
19
  const inject_1 = require("./inject");
@@ -20,54 +21,79 @@ const domMutations_1 = require("./domMutations");
20
21
  const redirect_1 = __importDefault(require("./redirect"));
21
22
  const routing_1 = require("./routing");
22
23
  const stickyBucketService_1 = require("./stickyBucketService");
24
+ const node_html_parser_1 = require("node-html-parser");
25
+ const pako_1 = __importDefault(require("pako"));
23
26
  function edgeApp(context, req, res,
24
27
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
25
28
  next) {
26
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s;
27
29
  return __awaiter(this, void 0, void 0, function* () {
28
- let url = ((_b = (_a = context.helpers).getRequestURL) === null || _b === void 0 ? void 0 : _b.call(_a, req)) || "";
29
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
30
- let headers = {
31
- "Content-Type": "text/html",
32
- };
33
- const cookies = {};
34
- const setCookie = (key, value) => {
35
- cookies[key] = value;
30
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w;
31
+ /**
32
+ * 1. Init app variables
33
+ */
34
+ // Request vars:
35
+ let requestUrl = context.helpers.getRequestURL(req);
36
+ let originUrl = getOriginUrl(context, requestUrl);
37
+ // Response vars:
38
+ let originResponse = undefined;
39
+ let resHeaders = {};
40
+ const respCookies = {};
41
+ const setRespCookie = (key, value) => {
42
+ respCookies[key] = value;
36
43
  };
37
- const { csp, nonce } = (0, inject_1.getCspInfo)(context);
38
- if (csp) {
39
- headers["Content-Security-Policy"] = csp;
40
- }
41
- let body = "";
44
+ // Initial hook:
45
+ let hookResp;
46
+ hookResp = yield ((_b = (_a = context === null || context === void 0 ? void 0 : context.hooks) === null || _a === void 0 ? void 0 : _a.onRequest) === null || _b === void 0 ? void 0 : _b.call(_a, { context, req, res, next, requestUrl, originUrl }));
47
+ if (hookResp)
48
+ return hookResp;
49
+ // DOM mutations
50
+ let domChanges = [];
51
+ const resetDomChanges = () => (domChanges = []);
52
+ // Experiments that triggered prior to final redirect
53
+ let preRedirectChangeIds = [];
54
+ const setPreRedirectChangeIds = (changeIds) => (preRedirectChangeIds = changeIds);
55
+ /**
56
+ * 2. Early exits based on method, routes, etc
57
+ */
42
58
  // Non GET requests are proxied
43
- if (((_d = (_c = context.helpers).getRequestMethod) === null || _d === void 0 ? void 0 : _d.call(_c, req)) !== "GET") {
44
- return (_f = (_e = context.helpers).proxyRequest) === null || _f === void 0 ? void 0 : _f.call(_e, context, req, res, next);
59
+ if (context.helpers.getRequestMethod(req) !== "GET") {
60
+ return context.helpers.proxyRequest(context, req, res, next);
45
61
  }
46
62
  // Check the url for routing rules (default behavior is intercept)
47
- const route = (0, routing_1.getRoute)(context, url);
63
+ const route = (0, routing_1.getRoute)(context, requestUrl);
48
64
  if (route.behavior === "error") {
49
- return (_h = (_g = context.helpers).sendResponse) === null || _h === void 0 ? void 0 : _h.call(_g, context, res, headers, route.body || "", cookies, route.statusCode);
65
+ return context.helpers.sendResponse(context, res, {}, route.body || "", {}, route.statusCode);
50
66
  }
51
67
  if (route.behavior === "proxy") {
52
- return (_k = (_j = context.helpers).proxyRequest) === null || _k === void 0 ? void 0 : _k.call(_j, context, req, res, next);
68
+ return context.helpers.proxyRequest(context, req, res, next);
53
69
  }
54
- const attributes = (0, attributes_1.getUserAttributes)(context, req, url, setCookie);
55
- let domChanges = [];
56
- const resetDomChanges = () => (domChanges = []);
57
- let preRedirectChangeIds = [];
58
- const setPreRedirectChangeIds = (changeIds) => (preRedirectChangeIds = changeIds);
59
- if (context.config.localStorage)
60
- (0, growthbook_1.setPolyfills)({ localStorage: context.config.localStorage });
61
- if (context.config.crypto)
62
- (0, growthbook_1.setPolyfills)({ SubtleCrypto: context.config.crypto });
70
+ // Custom route behavior via hook:
71
+ hookResp = yield ((_d = (_c = context === null || context === void 0 ? void 0 : context.hooks) === null || _c === void 0 ? void 0 : _c.onRoute) === null || _d === void 0 ? void 0 : _d.call(_c, { context, req, res, next, requestUrl, originUrl, route }));
72
+ if (hookResp)
73
+ return hookResp;
74
+ /**
75
+ * 3. User attributes & uuid
76
+ */
77
+ const attributes = (0, attributes_1.getUserAttributes)(context, req, requestUrl, setRespCookie);
78
+ // Hook to allow enriching user attributes, etc
79
+ hookResp = yield ((_f = (_e = context === null || context === void 0 ? void 0 : context.hooks) === null || _e === void 0 ? void 0 : _e.onUserAttributes) === null || _f === void 0 ? void 0 : _f.call(_e, { context, req, res, next, requestUrl, originUrl, route, attributes }));
80
+ if (hookResp)
81
+ return hookResp;
82
+ /**
83
+ * 4. Init GrowthBook SDK
84
+ */
85
+ (0, growthbook_1.setPolyfills)({
86
+ localStorage: (_g = context.config) === null || _g === void 0 ? void 0 : _g.localStorage,
87
+ SubtleCrypto: (_h = context.config) === null || _h === void 0 ? void 0 : _h.crypto,
88
+ });
63
89
  if (context.config.staleTTL !== undefined)
64
90
  (0, growthbook_1.configureCache)({ staleTTL: context.config.staleTTL });
65
91
  if (context.config.fetchFeaturesCall)
66
92
  growthbook_1.helpers.fetchFeaturesCall = context.config.fetchFeaturesCall;
67
- let stickyBucketService = undefined;
93
+ let stickyBucketService;
68
94
  if (context.config.enableStickyBucketing) {
69
95
  stickyBucketService =
70
- (_l = context.config.edgeStickyBucketService) !== null && _l !== void 0 ? _l : new stickyBucketService_1.EdgeStickyBucketService({
96
+ (_j = context.config.edgeStickyBucketService) !== null && _j !== void 0 ? _j : new stickyBucketService_1.EdgeStickyBucketService({
71
97
  context,
72
98
  prefix: context.config.stickyBucketPrefix,
73
99
  req,
@@ -80,9 +106,10 @@ next) {
80
106
  attributes,
81
107
  applyDomChangesCallback: (changes) => {
82
108
  domChanges.push(changes);
83
- return () => { };
109
+ return () => {
110
+ };
84
111
  },
85
- url,
112
+ url: requestUrl,
86
113
  disableVisualExperiments: ["skip", "browser"].includes(context.config.runVisualEditorExperiments),
87
114
  disableJsInjection: context.config.disableJsInjection,
88
115
  disableUrlRedirectExperiments: ["skip", "browser"].includes(context.config.runUrlRedirectExperiments),
@@ -93,52 +120,126 @@ next) {
93
120
  yield growthbook.init({
94
121
  payload: context.config.payload,
95
122
  });
96
- const oldUrl = url;
97
- url = yield (0, redirect_1.default)({
98
- context: context,
123
+ // Hook to perform any custom logic given the initialized SDK
124
+ hookResp = yield ((_l = (_k = context === null || context === void 0 ? void 0 : context.hooks) === null || _k === void 0 ? void 0 : _k.onGrowthbookInit) === null || _l === void 0 ? void 0 : _l.call(_k, { context, req, res, next, requestUrl, originUrl, route, attributes, growthbook }));
125
+ if (hookResp)
126
+ return hookResp;
127
+ /**
128
+ * 5. Run URL redirect tests before fetching from origin
129
+ */
130
+ const redirectRequestUrl = yield (0, redirect_1.default)({
131
+ context,
99
132
  req,
100
- setCookie,
133
+ setRespCookie,
101
134
  growthbook,
102
- previousUrl: url,
135
+ previousUrl: requestUrl,
103
136
  resetDomChanges,
104
137
  setPreRedirectChangeIds: setPreRedirectChangeIds,
105
138
  });
106
- const originUrl = getOriginUrl(context, url);
107
- /* eslint-disable @typescript-eslint/no-explicit-any */
108
- let fetchedResponse = undefined;
139
+ originUrl = getOriginUrl(context, redirectRequestUrl);
140
+ // Pre-origin-fetch hook (after redirect logic):
141
+ hookResp = yield ((_o = (_m = context === null || context === void 0 ? void 0 : context.hooks) === null || _m === void 0 ? void 0 : _m.onBeforeOriginFetch) === null || _o === void 0 ? void 0 : _o.call(_m, { context, req, res, next, requestUrl, redirectRequestUrl, originUrl, route, attributes, growthbook }));
142
+ if (hookResp)
143
+ return hookResp;
144
+ /**
145
+ * 6. Fetch from origin, parse body / DOM
146
+ */
147
+ try {
148
+ originResponse = (yield context.helpers.fetch(context, originUrl, req));
149
+ }
150
+ catch (e) {
151
+ console.error(e);
152
+ }
153
+ const originStatus = originResponse ? parseInt(originResponse.status ? originResponse.status + "" : "400") : 500;
154
+ // On fetch hook (for custom response processing, etc)
155
+ hookResp = yield ((_q = (_p = context === null || context === void 0 ? void 0 : context.hooks) === null || _p === void 0 ? void 0 : _p.onOriginFetch) === null || _q === void 0 ? void 0 : _q.call(_p, { context, req, res, next, requestUrl, redirectRequestUrl, originUrl, route, attributes, growthbook, originResponse, originStatus }));
156
+ if (hookResp)
157
+ return hookResp;
158
+ // Standard error response handling
159
+ if (originStatus >= 500 || !originResponse) {
160
+ console.error("Fetch: 5xx status returned");
161
+ return context.helpers.sendResponse(context, res, {}, "Error fetching page", {}, 500);
162
+ }
163
+ if (originStatus >= 400) {
164
+ return originResponse;
165
+ }
166
+ // Got a valid response, begin processing
167
+ const originHeaders = headersToObject(originResponse.headers);
168
+ if (context.config.forwardProxyHeaders) {
169
+ resHeaders = Object.assign(Object.assign({}, originHeaders), resHeaders);
170
+ }
171
+ // At minimum, the content-type is forwarded
172
+ resHeaders["content-type"] = originHeaders === null || originHeaders === void 0 ? void 0 : originHeaders["content-type"];
173
+ if (context.config.useDefaultContentType && !resHeaders["content-type"]) {
174
+ resHeaders["content-type"] = "text/html";
175
+ }
176
+ if (context.config.processTextHtmlOnly && !((_r = resHeaders["content-type"]) !== null && _r !== void 0 ? _r : "").includes("text/html")) {
177
+ return context.helpers.proxyRequest(context, req, res, next);
178
+ }
179
+ const { csp, nonce } = (0, inject_1.getCspInfo)(context);
180
+ if (csp) {
181
+ resHeaders["content-security-policy"] = csp;
182
+ }
183
+ let body = "";
109
184
  try {
110
- fetchedResponse = (yield ((_o = (_m = context.helpers).fetch) === null || _o === void 0 ? void 0 : _o.call(_m, context, originUrl)));
111
- if (!(fetchedResponse === null || fetchedResponse === void 0 ? void 0 : fetchedResponse.ok)) {
112
- throw new Error("Fetch: non-2xx status returned");
185
+ // Check if content-encoding is gzip
186
+ if (originHeaders["content-encoding"] === "gzip") {
187
+ const buffer = yield originResponse.arrayBuffer();
188
+ body = pako_1.default.inflate(new Uint8Array(buffer), { to: "string" });
189
+ delete resHeaders["content-encoding"]; // do not forward this header since it's now unzipped
190
+ }
191
+ else {
192
+ body = (_s = yield (originResponse === null || originResponse === void 0 ? void 0 : originResponse.text())) !== null && _s !== void 0 ? _s : "";
113
193
  }
114
194
  }
115
195
  catch (e) {
116
196
  console.error(e);
117
- return (_q = (_p = context.helpers).sendResponse) === null || _q === void 0 ? void 0 : _q.call(_p, context, res, headers, "Error fetching page", cookies, 500);
118
197
  }
119
- if (context.config.forwardProxyHeaders && (fetchedResponse === null || fetchedResponse === void 0 ? void 0 : fetchedResponse.headers)) {
120
- headers = Object.assign(Object.assign({}, fetchedResponse.headers), headers);
198
+ let setBody = (s) => {
199
+ body = s;
200
+ };
201
+ let root;
202
+ if (context.config.alwaysParseDOM) {
203
+ root = (0, node_html_parser_1.parse)(body);
121
204
  }
122
- body = yield fetchedResponse.text();
123
- body = yield (0, domMutations_1.applyDomMutations)({
205
+ // Body ready hook (pre-DOM-mutations):
206
+ hookResp = yield ((_u = (_t = context === null || context === void 0 ? void 0 : context.hooks) === null || _t === void 0 ? void 0 : _t.onBodyReady) === null || _u === void 0 ? void 0 : _u.call(_t, { context, req, res, next, requestUrl, redirectRequestUrl, originUrl, route, attributes, growthbook, originResponse, originStatus, originHeaders, resHeaders, body, setBody, root }));
207
+ if (hookResp)
208
+ return hookResp;
209
+ /**
210
+ * 7. Apply visual editor DOM mutations
211
+ */
212
+ yield (0, domMutations_1.applyDomMutations)({
124
213
  body,
214
+ setBody,
215
+ root,
125
216
  nonce,
126
217
  domChanges,
127
218
  });
128
- body = (0, inject_1.injectScript)({
129
- context: context,
219
+ /**
220
+ * 8. Inject the client-facing GrowthBook SDK (auto-wrapper)
221
+ */
222
+ (0, inject_1.injectScript)({
223
+ context,
130
224
  body,
225
+ setBody,
131
226
  nonce,
132
227
  growthbook,
133
228
  attributes,
134
229
  preRedirectChangeIds,
135
- url,
136
- oldUrl,
230
+ url: redirectRequestUrl,
231
+ oldUrl: requestUrl,
137
232
  });
138
- return (_s = (_r = context.helpers).sendResponse) === null || _s === void 0 ? void 0 : _s.call(_r, context, res, headers, body, cookies);
233
+ // Final hook (post-mutations) before sending back
234
+ hookResp = yield ((_w = (_v = context === null || context === void 0 ? void 0 : context.hooks) === null || _v === void 0 ? void 0 : _v.onBeforeResponse) === null || _w === void 0 ? void 0 : _w.call(_v, { context, req, res, next, requestUrl, redirectRequestUrl, originUrl, route, attributes, growthbook, originResponse, originStatus, originHeaders, resHeaders, body, setBody }));
235
+ if (hookResp)
236
+ return hookResp;
237
+ /**
238
+ * 9. Send mutated response
239
+ */
240
+ return context.helpers.sendResponse(context, res, resHeaders, body, respCookies);
139
241
  });
140
242
  }
141
- exports.edgeApp = edgeApp;
142
243
  function getOriginUrl(context, currentURL) {
143
244
  const proxyTarget = context.config.proxyTarget;
144
245
  const currentParsedURL = new URL(currentURL);
@@ -167,5 +268,10 @@ function getOriginUrl(context, currentURL) {
167
268
  }
168
269
  return newURL;
169
270
  }
170
- exports.getOriginUrl = getOriginUrl;
271
+ function headersToObject(headers) {
272
+ if (headers && typeof headers.entries === "function") {
273
+ return Object.fromEntries(headers.entries());
274
+ }
275
+ return headers || {};
276
+ }
171
277
  //# sourceMappingURL=app.js.map
package/dist/app.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { Attributes } from "@growthbook/growthbook";
2
2
  import { Context } from "./types";
3
- export declare function getUserAttributes<Req, Res>(ctx: Context<Req, Res>, req: Req, url: string, setCookie: (key: string, value: string) => void): Attributes;
3
+ export declare function getUserAttributes<Req, Res>(ctx: Context<Req, Res>, req: Req, url: string, setRespCookie: (key: string, value: string) => void): Attributes;
4
4
  export declare function getUUID<Req, Res>(ctx: Context<Req, Res>, req: Req): any;
5
5
  export declare function getAutoAttributes<Req, Res>(ctx: Context<Req, Res>, req: Req, url: string): Attributes;
@@ -1,8 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getAutoAttributes = exports.getUUID = exports.getUserAttributes = void 0;
3
+ exports.getUserAttributes = getUserAttributes;
4
+ exports.getUUID = getUUID;
5
+ exports.getAutoAttributes = getAutoAttributes;
4
6
  // Get the user's attributes by merging the UUID cookie with any auto-attributes
5
- function getUserAttributes(ctx, req, url, setCookie) {
7
+ function getUserAttributes(ctx, req, url, setRespCookie) {
6
8
  const { config, helpers } = ctx;
7
9
  const providedAttributes = config.attributes || {};
8
10
  if (config.skipAutoAttributes) {
@@ -14,12 +16,11 @@ function getUserAttributes(ctx, req, url, setCookie) {
14
16
  if (!(helpers === null || helpers === void 0 ? void 0 : helpers.setCookie)) {
15
17
  throw new Error("Missing required dependencies");
16
18
  }
17
- setCookie(config.uuidCookieName, uuid);
19
+ setRespCookie(config.uuidCookieName, uuid);
18
20
  }
19
21
  const autoAttributes = getAutoAttributes(ctx, req, url);
20
22
  return Object.assign(Object.assign({}, autoAttributes), providedAttributes);
21
23
  }
22
- exports.getUserAttributes = getUserAttributes;
23
24
  // Get or create a UUID for the user:
24
25
  // - Try to get the UUID from the cookie
25
26
  // - Or create a new one and store in the cookie
@@ -39,7 +40,6 @@ function getUUID(ctx, req) {
39
40
  // get the existing UUID from cookie if set, otherwise create one
40
41
  return helpers.getCookie(req, config.uuidCookieName) || genUUID();
41
42
  }
42
- exports.getUUID = getUUID;
43
43
  // Infer attributes from the request
44
44
  // - UUID will come from the cookie or be generated
45
45
  // - Other attributes come from the request headers and URL
@@ -73,7 +73,6 @@ function getAutoAttributes(ctx, req, url) {
73
73
  }
74
74
  return autoAttributes;
75
75
  }
76
- exports.getAutoAttributes = getAutoAttributes;
77
76
  function getUtmAttributes(urlObj) {
78
77
  // Store utm- params in sessionStorage for future page loads
79
78
  let utms = {};
@@ -1 +1 @@
1
- {"version":3,"file":"attributes.js","sourceRoot":"","sources":["../src/attributes.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"attributes.js","sourceRoot":"","sources":["../src/attributes.ts"],"names":[],"mappings":"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"}
package/dist/config.d.ts CHANGED
@@ -1,13 +1,19 @@
1
1
  import { Config, Context, ExperimentRunEnvironment } from "./types";
2
- export declare const defaultContext: Context;
2
+ type Req = any;
3
+ type Res = any;
4
+ export declare const defaultContext: Context<Req, Res>;
3
5
  export interface ConfigEnv {
4
6
  PROXY_TARGET?: string;
5
7
  FORWARD_PROXY_HEADERS?: string;
8
+ FOLLOW_REDIRECTS?: string;
9
+ USE_DEFAULT_CONTENT_TYPE?: string;
10
+ PROCESS_TEXT_HTML_ONLY?: string;
6
11
  NODE_ENV?: string;
7
12
  MAX_PAYLOAD_SIZE?: string;
8
13
  ROUTES?: string;
9
14
  RUN_VISUAL_EDITOR_EXPERIMENTS?: ExperimentRunEnvironment;
10
15
  DISABLE_JS_INJECTION?: string;
16
+ ALWAYS_PARSE_DOM?: string;
11
17
  RUN_URL_REDIRECT_EXPERIMENTS?: ExperimentRunEnvironment;
12
18
  RUN_CROSS_ORIGIN_URL_REDIRECT_EXPERIMENTS?: ExperimentRunEnvironment;
13
19
  INJECT_REDIRECT_URL_SCRIPT?: string;
@@ -33,3 +39,4 @@ export interface ConfigEnv {
33
39
  [key: string]: any;
34
40
  }
35
41
  export declare function getConfig(env: ConfigEnv): Config;
42
+ export {};
package/dist/config.js CHANGED
@@ -1,14 +1,19 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getConfig = exports.defaultContext = void 0;
3
+ exports.defaultContext = void 0;
4
+ exports.getConfig = getConfig;
4
5
  exports.defaultContext = {
5
6
  config: {
6
7
  proxyTarget: "/",
7
8
  forwardProxyHeaders: true,
9
+ followRedirects: true,
10
+ useDefaultContentType: false,
11
+ processTextHtmlOnly: true,
8
12
  environment: "production",
9
13
  maxPayloadSize: "2mb",
10
14
  runVisualEditorExperiments: "everywhere",
11
15
  disableJsInjection: false,
16
+ alwaysParseDOM: false,
12
17
  runUrlRedirectExperiments: "browser",
13
18
  runCrossOriginUrlRedirectExperiments: "browser",
14
19
  injectRedirectUrlScript: true,
@@ -25,17 +30,37 @@ exports.defaultContext = {
25
30
  uuidKey: "id",
26
31
  skipAutoAttributes: false,
27
32
  },
28
- helpers: {},
33
+ helpers: {
34
+ getRequestURL: function (req) {
35
+ throw new Error("getRequestURL not implemented");
36
+ },
37
+ getRequestMethod: function (req) {
38
+ throw new Error("getRequestMethod not implemented");
39
+ },
40
+ sendResponse: function (ctx, res, headers, body, cookies, status) {
41
+ throw new Error("sendResponse not implemented");
42
+ },
43
+ fetch: function (ctx, url, req) {
44
+ throw new Error("fetchFn not implemented");
45
+ },
46
+ proxyRequest: function (ctx, req, res, next) {
47
+ throw new Error("proxyRequest not implemented");
48
+ }
49
+ },
50
+ hooks: {},
29
51
  };
30
52
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
31
53
  function getConfig(env) {
32
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s;
54
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w;
33
55
  const config = exports.defaultContext.config;
34
56
  config.proxyTarget = (_a = env.PROXY_TARGET) !== null && _a !== void 0 ? _a : exports.defaultContext.config.proxyTarget;
35
57
  config.forwardProxyHeaders = ["true", "1"].includes((_b = env.FORWARD_PROXY_HEADERS) !== null && _b !== void 0 ? _b : "" + exports.defaultContext.config.forwardProxyHeaders);
36
- config.environment = (_c = env.NODE_ENV) !== null && _c !== void 0 ? _c : exports.defaultContext.config.environment;
58
+ config.followRedirects = ["true", "1"].includes((_c = env.FOLLOW_REDIRECTS) !== null && _c !== void 0 ? _c : "" + exports.defaultContext.config.followRedirects);
59
+ config.useDefaultContentType = ["true", "1"].includes((_d = env.USE_DEFAULT_CONTENT_TYPE) !== null && _d !== void 0 ? _d : "" + exports.defaultContext.config.useDefaultContentType);
60
+ config.processTextHtmlOnly = ["true", "1"].includes((_e = env.PROCESS_TEXT_HTML_ONLY) !== null && _e !== void 0 ? _e : "" + exports.defaultContext.config.processTextHtmlOnly);
61
+ config.environment = (_f = env.NODE_ENV) !== null && _f !== void 0 ? _f : exports.defaultContext.config.environment;
37
62
  config.maxPayloadSize =
38
- (_d = env.MAX_PAYLOAD_SIZE) !== null && _d !== void 0 ? _d : exports.defaultContext.config.maxPayloadSize;
63
+ (_g = env.MAX_PAYLOAD_SIZE) !== null && _g !== void 0 ? _g : exports.defaultContext.config.maxPayloadSize;
39
64
  try {
40
65
  config.routes = JSON.parse(env.ROUTES || "[]");
41
66
  }
@@ -43,22 +68,23 @@ function getConfig(env) {
43
68
  console.error("Error parsing ROUTES", e);
44
69
  config.routes = [];
45
70
  }
46
- config.runVisualEditorExperiments = ((_e = env.RUN_VISUAL_EDITOR_EXPERIMENTS) !== null && _e !== void 0 ? _e : exports.defaultContext.config
71
+ config.runVisualEditorExperiments = ((_h = env.RUN_VISUAL_EDITOR_EXPERIMENTS) !== null && _h !== void 0 ? _h : exports.defaultContext.config
47
72
  .runVisualEditorExperiments);
48
- config.disableJsInjection = ["true", "1"].includes((_f = env.DISABLE_JS_INJECTION) !== null && _f !== void 0 ? _f : "" + exports.defaultContext.config.disableJsInjection);
49
- config.runUrlRedirectExperiments = ((_g = env.RUN_URL_REDIRECT_EXPERIMENTS) !== null && _g !== void 0 ? _g : exports.defaultContext.config
73
+ config.disableJsInjection = ["true", "1"].includes((_j = env.DISABLE_JS_INJECTION) !== null && _j !== void 0 ? _j : "" + exports.defaultContext.config.disableJsInjection);
74
+ config.alwaysParseDOM = ["true", "1"].includes((_k = env.ALWAYS_PARSE_DOM) !== null && _k !== void 0 ? _k : "" + exports.defaultContext.config.alwaysParseDOM);
75
+ config.runUrlRedirectExperiments = ((_l = env.RUN_URL_REDIRECT_EXPERIMENTS) !== null && _l !== void 0 ? _l : exports.defaultContext.config
50
76
  .runUrlRedirectExperiments);
51
77
  config.runCrossOriginUrlRedirectExperiments =
52
- ((_h = env.RUN_CROSS_ORIGIN_URL_REDIRECT_EXPERIMENTS) !== null && _h !== void 0 ? _h : exports.defaultContext.config
78
+ ((_m = env.RUN_CROSS_ORIGIN_URL_REDIRECT_EXPERIMENTS) !== null && _m !== void 0 ? _m : exports.defaultContext.config
53
79
  .runCrossOriginUrlRedirectExperiments);
54
- config.injectRedirectUrlScript = ["true", "1"].includes((_j = env.INJECT_REDIRECT_URL_SCRIPT) !== null && _j !== void 0 ? _j : "" + exports.defaultContext.config.injectRedirectUrlScript);
80
+ config.injectRedirectUrlScript = ["true", "1"].includes((_o = env.INJECT_REDIRECT_URL_SCRIPT) !== null && _o !== void 0 ? _o : "" + exports.defaultContext.config.injectRedirectUrlScript);
55
81
  config.maxRedirects = parseInt(env.MAX_REDIRECTS || "" + exports.defaultContext.config.maxRedirects);
56
82
  config.scriptInjectionPattern =
57
83
  env.SCRIPT_INJECTION_PATTERN ||
58
84
  exports.defaultContext.config.scriptInjectionPattern;
59
- config.disableInjections = ["true", "1"].includes((_k = env.DISABLE_INJECTIONS) !== null && _k !== void 0 ? _k : "" + exports.defaultContext.config.disableInjections);
60
- config.enableStreaming = ["true", "1"].includes((_l = env.ENABLE_STREAMING) !== null && _l !== void 0 ? _l : "" + exports.defaultContext.config.enableStreaming);
61
- config.enableStickyBucketing = ["true", "1"].includes((_m = env.ENABLE_STICKY_BUCKETING) !== null && _m !== void 0 ? _m : "" + exports.defaultContext.config.enableStickyBucketing);
85
+ config.disableInjections = ["true", "1"].includes((_p = env.DISABLE_INJECTIONS) !== null && _p !== void 0 ? _p : "" + exports.defaultContext.config.disableInjections);
86
+ config.enableStreaming = ["true", "1"].includes((_q = env.ENABLE_STREAMING) !== null && _q !== void 0 ? _q : "" + exports.defaultContext.config.enableStreaming);
87
+ config.enableStickyBucketing = ["true", "1"].includes((_r = env.ENABLE_STICKY_BUCKETING) !== null && _r !== void 0 ? _r : "" + exports.defaultContext.config.enableStickyBucketing);
62
88
  "STICKY_BUCKET_PREFIX" in env &&
63
89
  (config.stickyBucketPrefix = env.STICKY_BUCKET_PREFIX);
64
90
  config.contentSecurityPolicy = env.CONTENT_SECURITY_POLICY || "";
@@ -66,8 +92,8 @@ function getConfig(env) {
66
92
  config.nonce = env.NONCE || undefined;
67
93
  config.crypto = crypto;
68
94
  // growthbook
69
- config.apiHost = ((_o = env.GROWTHBOOK_API_HOST) !== null && _o !== void 0 ? _o : "").replace(/\/*$/, "");
70
- config.clientKey = (_p = env.GROWTHBOOK_CLIENT_KEY) !== null && _p !== void 0 ? _p : "";
95
+ config.apiHost = ((_s = env.GROWTHBOOK_API_HOST) !== null && _s !== void 0 ? _s : "").replace(/\/*$/, "");
96
+ config.clientKey = (_t = env.GROWTHBOOK_CLIENT_KEY) !== null && _t !== void 0 ? _t : "";
71
97
  "GROWTHBOOK_DECRYPTION_KEY" in env &&
72
98
  (config.decryptionKey = env.GROWTHBOOK_DECRYPTION_KEY);
73
99
  "GROWTHBOOK_TRACKING_CALLBACK" in env &&
@@ -80,13 +106,12 @@ function getConfig(env) {
80
106
  console.error("Error parsing GROWTHBOOK_PAYLOAD", e);
81
107
  }
82
108
  "STALE_TTL" in env && (config.staleTTL = parseInt(env.STALE_TTL || (1000 * 60) + ""));
83
- config.persistUuid = ["true", "1"].includes((_q = env.PERSIST_UUID) !== null && _q !== void 0 ? _q : "" + exports.defaultContext.config.persistUuid);
84
- config.noAutoCookies = ["true", "1"].includes((_r = env.NO_AUTO_COOKIES) !== null && _r !== void 0 ? _r : "" + exports.defaultContext.config.noAutoCookies);
109
+ config.persistUuid = ["true", "1"].includes((_u = env.PERSIST_UUID) !== null && _u !== void 0 ? _u : "" + exports.defaultContext.config.persistUuid);
110
+ config.noAutoCookies = ["true", "1"].includes((_v = env.NO_AUTO_COOKIES) !== null && _v !== void 0 ? _v : "" + exports.defaultContext.config.noAutoCookies);
85
111
  config.uuidCookieName =
86
112
  env.UUID_COOKIE_NAME || exports.defaultContext.config.uuidCookieName;
87
113
  config.uuidKey = env.UUID_KEY || exports.defaultContext.config.uuidKey;
88
- config.skipAutoAttributes = ["true", "1"].includes((_s = env.SKIP_AUTO_ATTRIBUTES) !== null && _s !== void 0 ? _s : "" + exports.defaultContext.config.skipAutoAttributes);
114
+ config.skipAutoAttributes = ["true", "1"].includes((_w = env.SKIP_AUTO_ATTRIBUTES) !== null && _w !== void 0 ? _w : "" + exports.defaultContext.config.skipAutoAttributes);
89
115
  return config;
90
116
  }
91
- exports.getConfig = getConfig;
92
117
  //# sourceMappingURL=config.js.map