@growthbook/edge-utils 0.1.1 → 0.1.2
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 +3 -2
- package/dist/app.js +4 -5
- package/dist/app.js.map +1 -1
- package/dist/redirect.js +2 -3
- package/dist/redirect.js.map +1 -1
- package/dist/types.d.ts +0 -5
- package/package.json +1 -1
- package/src/app.ts +4 -6
- package/src/redirect.ts +4 -3
- package/src/types.ts +0 -5
package/README.md
CHANGED
|
@@ -19,7 +19,7 @@ The **GrowthBook Edge App** provides turnkey Visual Editor and URL Redirect expe
|
|
|
19
19
|
To run the edge app, add our base app to request handler to your project. You will need to manually build app context and helper functions:
|
|
20
20
|
|
|
21
21
|
```javascript
|
|
22
|
-
import { edgeApp, getConfig } from "@growthbook/edge-utils";
|
|
22
|
+
import { edgeApp, getConfig, defaultContext } from "@growthbook/edge-utils";
|
|
23
23
|
|
|
24
24
|
export async function handler(request, env) {
|
|
25
25
|
const context = await init(env);
|
|
@@ -27,7 +27,8 @@ export async function handler(request, env) {
|
|
|
27
27
|
}
|
|
28
28
|
|
|
29
29
|
function init(env) {
|
|
30
|
-
const context =
|
|
30
|
+
const context = defaultContext;
|
|
31
|
+
context.config = getConfig(env);
|
|
31
32
|
context.helpers = {
|
|
32
33
|
// define utility functions for request/response manipulation
|
|
33
34
|
};
|
package/dist/app.js
CHANGED
|
@@ -56,14 +56,13 @@ next) {
|
|
|
56
56
|
const resetDomChanges = () => (domChanges = []);
|
|
57
57
|
let preRedirectChangeIds = [];
|
|
58
58
|
const setPreRedirectChangeIds = (changeIds) => (preRedirectChangeIds = changeIds);
|
|
59
|
-
|
|
59
|
+
context.config.localStorage &&
|
|
60
60
|
(0, growthbook_1.setPolyfills)({ localStorage: context.config.localStorage });
|
|
61
|
-
|
|
61
|
+
context.config.crypto &&
|
|
62
62
|
(0, growthbook_1.setPolyfills)({ SubtleCrypto: context.config.crypto });
|
|
63
|
-
if (context.config.staleTTL !== undefined)
|
|
63
|
+
if (context.config.staleTTL !== undefined) {
|
|
64
64
|
(0, growthbook_1.configureCache)({ staleTTL: context.config.staleTTL });
|
|
65
|
-
|
|
66
|
-
growthbook_1.helpers.fetchFeaturesCall = context.config.fetchFeaturesCall;
|
|
65
|
+
}
|
|
67
66
|
let stickyBucketService = undefined;
|
|
68
67
|
if (context.config.enableStickyBucketing) {
|
|
69
68
|
stickyBucketService =
|
package/dist/app.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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"}
|
package/dist/redirect.js
CHANGED
|
@@ -22,18 +22,17 @@ function redirect({ context, req, setCookie, growthbook, previousUrl, resetDomCh
|
|
|
22
22
|
if (!newUrl)
|
|
23
23
|
return previousUrl;
|
|
24
24
|
while (previousUrl != newUrl) {
|
|
25
|
-
newUrl = previousUrl;
|
|
26
25
|
if (redirectCount >= maxRedirects)
|
|
27
26
|
return previousUrl;
|
|
28
27
|
// clear visual experiment effects since we're no longer on the same page
|
|
29
28
|
resetDomChanges();
|
|
30
29
|
// keep track of experiments that triggered prior to final redirect
|
|
31
30
|
setPreRedirectChangeIds(growthbook.getCompletedChangeIds());
|
|
32
|
-
// change the URL to trigger the experiment
|
|
31
|
+
// update attributes and change the URL to trigger the experiment
|
|
33
32
|
yield growthbook.setAttributes((0, attributes_1.getUserAttributes)(context, req, newUrl, setCookie));
|
|
34
33
|
yield growthbook.setURL(newUrl);
|
|
35
34
|
previousUrl = newUrl;
|
|
36
|
-
newUrl = growthbook.getRedirectUrl();
|
|
35
|
+
newUrl = growthbook.getRedirectUrl() || previousUrl;
|
|
37
36
|
redirectCount++;
|
|
38
37
|
}
|
|
39
38
|
return newUrl;
|
package/dist/redirect.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"redirect.js","sourceRoot":"","sources":["../src/redirect.ts"],"names":[],"mappings":";;;;;;;;;;;AAEA,6CAAiD;AAEjD,SAA8B,QAAQ,CAAC,EACrC,OAAO,EACP,GAAG,EACH,SAAS,EACT,UAAU,EACV,WAAW,EACX,eAAe,EACf,uBAAuB,GASxB;;QACC,MAAM,6BAA6B,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,QAAQ,CAChE,OAAO,CAAC,MAAM,CAAC,yBAAyB,CACzC,CAAC;QACF,IAAI,6BAA6B;YAAE,OAAO,WAAW,CAAC;QAEtD,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,YAAY,IAAI,CAAC,CAAC;QACtD,IAAI,aAAa,GAAG,CAAC,CAAC;QAEtB,IAAI,MAAM,GAAG,UAAU,CAAC,cAAc,EAAE,CAAC;QACzC,cAAc;QACd,IAAI,CAAC,MAAM;YAAE,OAAO,WAAW,CAAC;QAEhC,OAAO,WAAW,IAAI,MAAM,EAAE;YAC5B,
|
|
1
|
+
{"version":3,"file":"redirect.js","sourceRoot":"","sources":["../src/redirect.ts"],"names":[],"mappings":";;;;;;;;;;;AAEA,6CAAiD;AAEjD,SAA8B,QAAQ,CAAC,EACrC,OAAO,EACP,GAAG,EACH,SAAS,EACT,UAAU,EACV,WAAW,EACX,eAAe,EACf,uBAAuB,GASxB;;QACC,MAAM,6BAA6B,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,QAAQ,CAChE,OAAO,CAAC,MAAM,CAAC,yBAAyB,CACzC,CAAC;QACF,IAAI,6BAA6B;YAAE,OAAO,WAAW,CAAC;QAEtD,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,YAAY,IAAI,CAAC,CAAC;QACtD,IAAI,aAAa,GAAG,CAAC,CAAC;QAEtB,IAAI,MAAM,GAAG,UAAU,CAAC,cAAc,EAAE,CAAC;QACzC,cAAc;QACd,IAAI,CAAC,MAAM;YAAE,OAAO,WAAW,CAAC;QAEhC,OAAO,WAAW,IAAI,MAAM,EAAE;YAC5B,IAAI,aAAa,IAAI,YAAY;gBAAE,OAAO,WAAW,CAAC;YAEtD,yEAAyE;YACzE,eAAe,EAAE,CAAC;YAClB,mEAAmE;YACnE,uBAAuB,CAAC,UAAU,CAAC,qBAAqB,EAAE,CAAC,CAAC;YAE5D,iEAAiE;YACjE,MAAM,UAAU,CAAC,aAAa,CAC5B,IAAA,8BAAiB,EAAC,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,CAAC,CACnD,CAAC;YACF,MAAM,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAEhC,WAAW,GAAG,MAAM,CAAC;YACrB,MAAM,GAAG,UAAU,CAAC,cAAc,EAAE,IAAI,WAAW,CAAC;YAEpD,aAAa,EAAE,CAAC;SACjB;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;CAAA;AAjDD,2BAiDC"}
|
package/dist/types.d.ts
CHANGED
|
@@ -25,11 +25,6 @@ export interface Config {
|
|
|
25
25
|
crypto?: any;
|
|
26
26
|
localStorage?: LocalStorageCompat;
|
|
27
27
|
staleTTL?: number;
|
|
28
|
-
fetchFeaturesCall?: ({ host, clientKey, headers }: {
|
|
29
|
-
host: string;
|
|
30
|
-
clientKey: string;
|
|
31
|
-
headers?: Record<string, string>;
|
|
32
|
-
}) => Promise<any>;
|
|
33
28
|
apiHost: string;
|
|
34
29
|
clientKey: string;
|
|
35
30
|
decryptionKey?: string;
|
package/package.json
CHANGED
package/src/app.ts
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
AutoExperimentVariation, configureCache,
|
|
3
3
|
GrowthBook,
|
|
4
|
-
helpers,
|
|
5
4
|
setPolyfills,
|
|
6
5
|
StickyBucketService
|
|
7
6
|
} from "@growthbook/growthbook";
|
|
@@ -65,14 +64,13 @@ export async function edgeApp<Req, Res>(
|
|
|
65
64
|
const setPreRedirectChangeIds = (changeIds: string[]) =>
|
|
66
65
|
(preRedirectChangeIds = changeIds);
|
|
67
66
|
|
|
68
|
-
|
|
67
|
+
context.config.localStorage &&
|
|
69
68
|
setPolyfills({ localStorage: context.config.localStorage });
|
|
70
|
-
|
|
69
|
+
context.config.crypto &&
|
|
71
70
|
setPolyfills({ SubtleCrypto: context.config.crypto });
|
|
72
|
-
if (context.config.staleTTL !== undefined)
|
|
71
|
+
if (context.config.staleTTL !== undefined) {
|
|
73
72
|
configureCache({ staleTTL: context.config.staleTTL });
|
|
74
|
-
|
|
75
|
-
helpers.fetchFeaturesCall = context.config.fetchFeaturesCall;
|
|
73
|
+
}
|
|
76
74
|
|
|
77
75
|
let stickyBucketService:
|
|
78
76
|
| EdgeStickyBucketService<Req, Res>
|
package/src/redirect.ts
CHANGED
|
@@ -32,7 +32,6 @@ export default async function redirect({
|
|
|
32
32
|
if (!newUrl) return previousUrl;
|
|
33
33
|
|
|
34
34
|
while (previousUrl != newUrl) {
|
|
35
|
-
newUrl = previousUrl;
|
|
36
35
|
if (redirectCount >= maxRedirects) return previousUrl;
|
|
37
36
|
|
|
38
37
|
// clear visual experiment effects since we're no longer on the same page
|
|
@@ -40,13 +39,15 @@ export default async function redirect({
|
|
|
40
39
|
// keep track of experiments that triggered prior to final redirect
|
|
41
40
|
setPreRedirectChangeIds(growthbook.getCompletedChangeIds());
|
|
42
41
|
|
|
43
|
-
// change the URL to trigger the experiment
|
|
42
|
+
// update attributes and change the URL to trigger the experiment
|
|
44
43
|
await growthbook.setAttributes(
|
|
45
44
|
getUserAttributes(context, req, newUrl, setCookie),
|
|
46
45
|
);
|
|
47
46
|
await growthbook.setURL(newUrl);
|
|
47
|
+
|
|
48
48
|
previousUrl = newUrl;
|
|
49
|
-
newUrl = growthbook.getRedirectUrl();
|
|
49
|
+
newUrl = growthbook.getRedirectUrl() || previousUrl;
|
|
50
|
+
|
|
50
51
|
redirectCount++;
|
|
51
52
|
}
|
|
52
53
|
return newUrl;
|
package/src/types.ts
CHANGED
|
@@ -41,11 +41,6 @@ export interface Config {
|
|
|
41
41
|
crypto?: any;
|
|
42
42
|
localStorage?: LocalStorageCompat;
|
|
43
43
|
staleTTL?: number;
|
|
44
|
-
fetchFeaturesCall?: ({host, clientKey, headers}: {
|
|
45
|
-
host: string;
|
|
46
|
-
clientKey: string;
|
|
47
|
-
headers?: Record<string, string>;
|
|
48
|
-
}) => Promise<any>;
|
|
49
44
|
|
|
50
45
|
// growthbook
|
|
51
46
|
apiHost: string;
|