@pack/hydrogen 1.0.6-ab-test.0 → 1.0.6-ab-test.3

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.
@@ -1 +1 @@
1
- {"version":3,"file":"create-pack-client.d.ts","sourceRoot":"","sources":["../src/create-pack-client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"create-pack-client.d.ts","sourceRoot":"","sources":["../src/create-pack-client.ts"],"names":[],"mappings":"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"}
@@ -127,12 +127,13 @@ export function createPackClient(options) {
127
127
  const handleRequest = async (request) => {
128
128
  testFromQueryParams = getTestFromQueryParams(request);
129
129
  const testTargetAudienceAttributes = getTestTargetingAttributesFromRequest(request);
130
- if (packClient) {
130
+ if (packClient && token) {
131
131
  testInfoForRequest = await getTestInfo({
132
132
  request,
133
133
  testTargetAudienceAttributes,
134
134
  packClient,
135
135
  session,
136
+ token,
136
137
  });
137
138
  }
138
139
  return (response) => {
@@ -29,11 +29,12 @@ export interface GetTestInfoOptions {
29
29
  testTargetAudienceAttributes: TestTargetAudienceAttributes | null;
30
30
  packClient: PackClient;
31
31
  session: PackSession | undefined;
32
+ token: string;
32
33
  }
33
34
  export interface TestInfo extends Test {
34
35
  isFirstExposure?: boolean;
35
36
  }
36
- export declare function getTestInfo({ request, testTargetAudienceAttributes, packClient, session, }: GetTestInfoOptions): Promise<TestInfo | undefined>;
37
+ export declare function getTestInfo({ request, testTargetAudienceAttributes, packClient, session, token, }: GetTestInfoOptions): Promise<TestInfo | undefined>;
37
38
  export declare function getTestSession(session: PackSession | undefined, testFromQueryParams: TestInput | null, previewEnabled: boolean): Test | null | undefined;
38
39
  export declare function getTestTargetingAttributesFromRequest(request: Request): TestTargetAudienceAttributes;
39
40
  export declare function getTestFromQueryParams(request: Request): TestInput | null;
@@ -1 +1 @@
1
- {"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../../src/tests/test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGjD,MAAM,WAAW,SAAS;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE;QACX,EAAE,EAAE,MAAM,CAAC;QACX,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAED,MAAM,WAAW,4BAA4B;IAC3C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAqBD,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,4BAA4B,EAAE,4BAA4B,GAAG,IAAI,CAAC;IAClE,UAAU,EAAE,UAAU,CAAC;IACvB,OAAO,EAAE,WAAW,GAAG,SAAS,CAAC;CAClC;AAED,MAAM,WAAW,QAAS,SAAQ,IAAI;IACpC,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AA+DD,wBAAsB,WAAW,CAAC,EAChC,OAAO,EACP,4BAA4B,EAC5B,UAAU,EACV,OAAO,GACR,EAAE,kBAAkB,GAAG,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,CA4DpD;AAED,wBAAgB,cAAc,CAC5B,OAAO,EAAE,WAAW,GAAG,SAAS,EAChC,mBAAmB,EAAE,SAAS,GAAG,IAAI,EACrC,cAAc,EAAE,OAAO,GACtB,IAAI,GAAG,IAAI,GAAG,SAAS,CA8BzB;AAED,wBAAgB,qCAAqC,CACnD,OAAO,EAAE,OAAO,GACf,4BAA4B,CA0B9B;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,SAAS,GAAG,IAAI,CA2CzE;AAED,wBAAgB,cAAc,CAC5B,OAAO,EAAE,GAAG,EACZ,OAAO,EAAE;IACP,cAAc,EAAE,OAAO,CAAC;IACxB,kBAAkB,CAAC,EAAE,QAAQ,CAAC;IAC9B,mBAAmB,CAAC,EAAE,SAAS,CAAC;CACjC,OA+BF"}
1
+ {"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../../src/tests/test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGjD,MAAM,WAAW,SAAS;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE;QACX,EAAE,EAAE,MAAM,CAAC;QACX,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAED,MAAM,WAAW,4BAA4B;IAC3C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAQD,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,4BAA4B,EAAE,4BAA4B,GAAG,IAAI,CAAC;IAClE,UAAU,EAAE,UAAU,CAAC;IACvB,OAAO,EAAE,WAAW,GAAG,SAAS,CAAC;IACjC,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,QAAS,SAAQ,IAAI;IACpC,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AA2FD,wBAAsB,WAAW,CAAC,EAChC,OAAO,EACP,4BAA4B,EAC5B,UAAU,EACV,OAAO,EACP,KAAK,GACN,EAAE,kBAAkB,GAAG,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,CAgGpD;AAED,wBAAgB,cAAc,CAC5B,OAAO,EAAE,WAAW,GAAG,SAAS,EAChC,mBAAmB,EAAE,SAAS,GAAG,IAAI,EACrC,cAAc,EAAE,OAAO,GACtB,IAAI,GAAG,IAAI,GAAG,SAAS,CA8BzB;AAED,wBAAgB,qCAAqC,CACnD,OAAO,EAAE,OAAO,GACf,4BAA4B,CA0B9B;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,SAAS,GAAG,IAAI,CA2CzE;AAED,wBAAgB,cAAc,CAC5B,OAAO,EAAE,GAAG,EACZ,OAAO,EAAE;IACP,cAAc,EAAE,OAAO,CAAC;IACxB,kBAAkB,CAAC,EAAE,QAAQ,CAAC;IAC9B,mBAAmB,CAAC,EAAE,SAAS,CAAC;CACjC,OA+BF"}
@@ -1,48 +1,51 @@
1
1
  import cookie from "cookie";
2
- const QUERY_TEST_BY_RULES = `#graphql
3
- query TestByRules($testTargetAudienceAttributes: JSON!) {
4
- testByRules(attributes: $testTargetAudienceAttributes) {
5
- id
6
- handle
7
- testVariant {
8
- id
9
- handle
10
- }
11
- }
12
- }
13
- `;
14
2
  const QUERY_TEST_VARIANT_IS_RUNNING = `#graphql
15
3
  query TestVariantIsRunning($handle: String!, $testId: ID!) {
16
4
  testVariantIsRunning(handle: $handle, testId: $testId)
17
5
  }
18
6
  `;
19
- async function packClientFetchTestByRules(packClient, testTargetAudienceAttributes) {
20
- let resp = undefined;
21
- // Check if are using CDN or a custom endpoint if so
22
- // Request directly to API if it is using CDN to reduce latency
23
- const isUsingCdn = packClient.apiUrl === "https://apicdn.packdigital.com/graphql";
24
- if (isUsingCdn) {
25
- packClient.apiUrl = "https://app.packdigital.com/graphql";
7
+ async function packClientFetchTestByRules(packClient, testTargetAudienceAttributes, token) {
8
+ if (!packClient.storeId) {
9
+ console.error("Pack error: Store ID is required to fetch a test.");
10
+ return undefined;
26
11
  }
27
- try {
28
- const packClientFetchTestByRules = await packClient.fetch(QUERY_TEST_BY_RULES, {
29
- variables: {
30
- testTargetAudienceAttributes,
31
- },
32
- });
33
- if (packClientFetchTestByRules.data?.testByRules) {
34
- resp = {
35
- ...packClientFetchTestByRules.data?.testByRules,
36
- isFirstExposure: true,
37
- };
12
+ let resp = undefined;
13
+ const URL = "https://tests-service-production.packdigital.workers.dev/tests/assign";
14
+ const assignByRulesResp = await fetch(URL, {
15
+ method: "POST",
16
+ headers: {
17
+ Authorization: `Bearer ${token}`,
18
+ "X-Pack-Storefront-Id": packClient.storeId,
19
+ ...(packClient.contentEnvironment
20
+ ? { "X-Environment": packClient.contentEnvironment }
21
+ : {}),
22
+ "Content-Type": "application/json",
23
+ },
24
+ body: JSON.stringify({
25
+ attributes: testTargetAudienceAttributes,
26
+ }),
27
+ });
28
+ const { status } = assignByRulesResp;
29
+ if (status !== 200) {
30
+ let message;
31
+ if (status === 401) {
32
+ message =
33
+ "Pack error: Unauthorized request to test assignment service. Please check your token.";
38
34
  }
39
- }
40
- catch (e) {
41
- console.error(e);
42
- }
43
- // Return to CDN
44
- if (isUsingCdn) {
45
- packClient.apiUrl = "https://apicdn.packdigital.com/graphql";
35
+ else {
36
+ message = `Pack error: Request to test assignment service failed with status ${status}`;
37
+ }
38
+ console.error(message);
39
+ return resp;
40
+ }
41
+ const assignByRulesRespJson = await assignByRulesResp.json();
42
+ if (assignByRulesRespJson?.data) {
43
+ resp = {
44
+ ...assignByRulesRespJson.data,
45
+ // `isFirstExposure` tells the `<PackTestRoute />` this will be the
46
+ // first exposure on render and will be confirmed next request
47
+ isFirstExposure: true,
48
+ };
46
49
  }
47
50
  return resp;
48
51
  }
@@ -61,7 +64,12 @@ async function packClientCheckTestIsRunning(packClient, testSession) {
61
64
  }
62
65
  return false;
63
66
  }
64
- export async function getTestInfo({ request, testTargetAudienceAttributes, packClient, session, }) {
67
+ function getExpireAtDate() {
68
+ const expireAt = new Date();
69
+ expireAt.setHours(expireAt.getHours() + 4); // 4 hours
70
+ return expireAt;
71
+ }
72
+ export async function getTestInfo({ request, testTargetAudienceAttributes, packClient, session, token, }) {
65
73
  let testInfo = undefined;
66
74
  let exposedTest = undefined;
67
75
  if (!session) {
@@ -72,33 +80,61 @@ export async function getTestInfo({ request, testTargetAudienceAttributes, packC
72
80
  if (exposedTestCookieString) {
73
81
  exposedTest = JSON.parse(exposedTestCookieString);
74
82
  }
75
- // If there is test on session, check if the test on session is still running.
76
- if (testSession && testSession.data?.id && testSession.data?.testVariant) {
77
- const testVariantIsRunning = await packClientCheckTestIsRunning(packClient, testSession.data);
78
- // If true, set testInfo to the testSession assigned test.
79
- if (testVariantIsRunning) {
80
- testInfo = testSession.data;
81
- }
82
- }
83
- else if (exposedTest) {
83
+ if (exposedTest && !testSession) {
84
84
  // If there is no assigned test on the session and an exposed test in the
85
85
  // incoming request cookie it means that the user was exposed to a test previously.
86
86
  // Verify test is still running
87
87
  const testVariantIsRunning = await packClientCheckTestIsRunning(packClient, exposedTest);
88
- // If the test is still running, set testInfo to the exposed test
88
+ // If the test is still running, set testInfo for the client and store in session
89
89
  if (testVariantIsRunning) {
90
- testInfo = exposedTest;
90
+ const { id, handle, testVariant } = exposedTest;
91
+ testInfo = {
92
+ id,
93
+ handle,
94
+ testVariant,
95
+ };
96
+ // Only set the test to the session on exposure
97
+ session.set("test", {
98
+ data: testInfo,
99
+ expireAt: getExpireAtDate(),
100
+ });
101
+ }
102
+ else {
103
+ // If the test is not running, fetch a new test for the client
104
+ testInfo = await packClientFetchTestByRules(packClient, testTargetAudienceAttributes, token);
91
105
  }
92
106
  }
93
- // If the testInfo is not setup that means that is not a valid test
94
- // on the session or on the cookie, then fetch a new test for the user
95
- if (!testInfo) {
96
- testInfo = await packClientFetchTestByRules(packClient, testTargetAudienceAttributes);
107
+ else {
108
+ // If there is no exposed test in the incoming request cookie
109
+ if (testSession && testSession.data?.id && testSession.data?.testVariant) {
110
+ // If there is a test on session, check if the test on session has expired
111
+ if (!testSession.expireAt ||
112
+ new Date(testSession.expireAt) < new Date()) {
113
+ // If there is test on session, check if the test on session is still running
114
+ const testVariantIsRunning = await packClientCheckTestIsRunning(packClient, testSession.data);
115
+ // If true, set testInfo to the testSession assigned test.
116
+ if (testVariantIsRunning) {
117
+ testInfo = testSession.data;
118
+ session.set("test", {
119
+ data: testInfo,
120
+ expireAt: getExpireAtDate(),
121
+ });
122
+ }
123
+ else {
124
+ // If not running, clear test session and fetch a new test for the client
125
+ session.set("test", undefined);
126
+ testInfo = await packClientFetchTestByRules(packClient, testTargetAudienceAttributes, token);
127
+ }
128
+ }
129
+ else {
130
+ testInfo = testSession.data;
131
+ }
132
+ }
133
+ else {
134
+ // If there is no test on session and no exposed test, check for a new test for client
135
+ testInfo = await packClientFetchTestByRules(packClient, testTargetAudienceAttributes, token);
136
+ }
97
137
  }
98
- // save this test on the session
99
- session.set("test", {
100
- data: testInfo,
101
- });
102
138
  return testInfo;
103
139
  }
104
140
  export function getTestSession(session, testFromQueryParams, previewEnabled) {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@pack/hydrogen",
3
3
  "description": "Pack Hydrogen",
4
- "version": "1.0.6-ab-test.0",
4
+ "version": "1.0.6-ab-test.3",
5
5
  "exports": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
7
7
  "engines": {