@pack/hydrogen 1.0.0 → 1.0.1-ab-test.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/dist/create-pack-client.d.ts +5 -0
- package/dist/create-pack-client.d.ts.map +1 -1
- package/dist/create-pack-client.js +31 -1
- package/dist/handle-request.d.ts.map +1 -1
- package/dist/handle-request.js +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/tests/test.d.ts +28 -0
- package/dist/tests/test.d.ts.map +1 -0
- package/dist/tests/test.js +135 -0
- package/dist/tests/testHooks.d.ts +8 -0
- package/dist/tests/testHooks.d.ts.map +1 -0
- package/dist/tests/testHooks.js +33 -0
- package/package.json +3 -3
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
import { PackClient } from "@pack/client";
|
|
3
3
|
import { CacheCustom } from "@shopify/hydrogen";
|
|
4
4
|
import { PackSession } from "./session/session";
|
|
5
|
+
import { Test, TestInput } from "./tests/test";
|
|
5
6
|
/** @see https://shopify.dev/docs/custom-storefronts/hydrogen/data-fetching/cache#caching-strategies */
|
|
6
7
|
type CachingStrategy = ReturnType<typeof CacheCustom>;
|
|
7
8
|
interface EnvironmentOptions {
|
|
@@ -29,6 +30,7 @@ type Variables = Record<string, any>;
|
|
|
29
30
|
interface QueryOptions {
|
|
30
31
|
variables?: Variables;
|
|
31
32
|
cache?: CachingStrategy;
|
|
33
|
+
test?: TestInput;
|
|
32
34
|
}
|
|
33
35
|
interface QueryError {
|
|
34
36
|
message: string;
|
|
@@ -43,11 +45,14 @@ interface QueryResponse<T> {
|
|
|
43
45
|
export interface Pack {
|
|
44
46
|
isPreviewModeEnabled: () => boolean;
|
|
45
47
|
session: PackSession;
|
|
48
|
+
abTest: Test | null | undefined;
|
|
49
|
+
setTestFromQueryParams: (request: Request) => void;
|
|
46
50
|
query: <T = any>(query: string, options?: QueryOptions) => Promise<QueryResponse<T>>;
|
|
47
51
|
isValidEditToken: PackClient["isValidEditToken"];
|
|
48
52
|
getPackSessionData(): {
|
|
49
53
|
storeId: string;
|
|
50
54
|
sessionId: string;
|
|
55
|
+
abTest: Test | null | undefined;
|
|
51
56
|
isPreviewModeEnabled: boolean;
|
|
52
57
|
customizerMeta: any;
|
|
53
58
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-pack-client.d.ts","sourceRoot":"","sources":["../src/create-pack-client.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAmB,MAAM,mBAAmB,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"create-pack-client.d.ts","sourceRoot":"","sources":["../src/create-pack-client.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAmB,MAAM,mBAAmB,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAKL,IAAI,EACJ,SAAS,EACV,MAAM,cAAc,CAAC;AAEtB,uGAAuG;AACvG,KAAK,eAAe,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;AAEtD,UAAU,kBAAkB;IAC1B;;;OAGG;IACH,KAAK,EAAE,KAAK,CAAC;IACb;;;OAGG;IACH,SAAS,EAAE,gBAAgB,CAAC,WAAW,CAAC,CAAC;CAC1C;AAED,UAAU,uBAAwB,SAAQ,kBAAkB;IAC1D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,WAAW,CAAC;IACrB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,0DAA0D;IAC1D,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;CACrC;AAED,KAAK,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAErC,UAAU,YAAY;IACpB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,KAAK,CAAC,EAAE,eAAe,CAAC;IACxB,IAAI,CAAC,EAAE,SAAS,CAAC;CAClB;AAED,UAAU,UAAU;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,UAAU,aAAa,CAAC,CAAC;IACvB,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;IACf,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,IAAI;IACnB,oBAAoB,EAAE,MAAM,OAAO,CAAC;IACpC,OAAO,EAAE,WAAW,CAAC;IACrB,MAAM,EAAE,IAAI,GAAG,IAAI,GAAG,SAAS,CAAC;IAChC,sBAAsB,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACnD,KAAK,EAAE,CAAC,CAAC,GAAG,GAAG,EACb,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,YAAY,KACnB,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/B,gBAAgB,EAAE,UAAU,CAAC,kBAAkB,CAAC,CAAC;IACjD,kBAAkB,IAAI;QACpB,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,IAAI,GAAG,IAAI,GAAG,SAAS,CAAC;QAChC,oBAAoB,EAAE,OAAO,CAAC;QAC9B,cAAc,EAAE,GAAG,CAAC;KACrB,CAAC;CACH;AAED,UAAU,gBAAgB;IACxB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC3B;AA2FD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,uBAAuB,GAAG,IAAI,CAmKvE"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { PackClient } from "@pack/client";
|
|
2
2
|
import { CacheCustom, createWithCache } from "@shopify/hydrogen";
|
|
3
|
+
import { getTestInfo, getTestSession, getTestFromQueryParams, setTestHeaders, } from "./tests/test";
|
|
3
4
|
/**
|
|
4
5
|
* Create an SHA-256 hash as a hex string
|
|
5
6
|
* @see https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/digest#converting_a_digest_to_a_hex_string
|
|
@@ -76,6 +77,7 @@ export function createPackClient(options) {
|
|
|
76
77
|
const previewEnabled = !!session.get("previewEnabled");
|
|
77
78
|
const previewEnvironment = session.get("environment");
|
|
78
79
|
const clientContentEnvironment = previewEnvironment || contentEnvironment;
|
|
80
|
+
let testFromQueryParams = null;
|
|
79
81
|
if (!token && !defaultThemeData) {
|
|
80
82
|
throw new Error("The Pack client token is missing or empty. Please provide a valid token or default theme data.");
|
|
81
83
|
}
|
|
@@ -85,6 +87,10 @@ export function createPackClient(options) {
|
|
|
85
87
|
if (!token) {
|
|
86
88
|
return {
|
|
87
89
|
session,
|
|
90
|
+
abTest: getTestSession(session, testFromQueryParams, previewEnabled),
|
|
91
|
+
setTestFromQueryParams: (request) => {
|
|
92
|
+
testFromQueryParams = getTestFromQueryParams(request);
|
|
93
|
+
},
|
|
88
94
|
isPreviewModeEnabled: () => previewEnabled,
|
|
89
95
|
async query(query, { variables } = {}) {
|
|
90
96
|
if (!defaultThemeData?.data) {
|
|
@@ -99,6 +105,7 @@ export function createPackClient(options) {
|
|
|
99
105
|
return {
|
|
100
106
|
storeId: storeId,
|
|
101
107
|
sessionId: session.id,
|
|
108
|
+
abTest: getTestSession(session, testFromQueryParams, previewEnabled),
|
|
102
109
|
isPreviewModeEnabled: previewEnabled,
|
|
103
110
|
customizerMeta: session.get("customizerMeta"),
|
|
104
111
|
};
|
|
@@ -119,15 +126,37 @@ export function createPackClient(options) {
|
|
|
119
126
|
contentEnvironment: clientContentEnvironment,
|
|
120
127
|
sessionId: session.id,
|
|
121
128
|
});
|
|
129
|
+
const getTestInfoPromise = getTestInfo({
|
|
130
|
+
packClient,
|
|
131
|
+
session,
|
|
132
|
+
});
|
|
122
133
|
return {
|
|
123
134
|
session,
|
|
135
|
+
abTest: getTestSession(session, testFromQueryParams, previewEnabled),
|
|
136
|
+
setTestFromQueryParams: (request) => {
|
|
137
|
+
testFromQueryParams = getTestFromQueryParams(request);
|
|
138
|
+
},
|
|
124
139
|
isPreviewModeEnabled: () => previewEnabled,
|
|
125
|
-
async query(query, { variables, cache: strategy = cacheCustom } = {}) {
|
|
140
|
+
async query(query, { variables, cache: strategy = cacheCustom, test } = {}) {
|
|
126
141
|
const withCache = createWithCache({
|
|
127
142
|
cache,
|
|
128
143
|
waitUntil,
|
|
129
144
|
});
|
|
145
|
+
const testFromSession = await (async () => {
|
|
146
|
+
try {
|
|
147
|
+
return await getTestInfoPromise;
|
|
148
|
+
}
|
|
149
|
+
catch (e) {
|
|
150
|
+
console.error(e);
|
|
151
|
+
}
|
|
152
|
+
return undefined;
|
|
153
|
+
})();
|
|
130
154
|
let headers = {};
|
|
155
|
+
headers = setTestHeaders(headers, {
|
|
156
|
+
previewEnabled,
|
|
157
|
+
testFromSession,
|
|
158
|
+
testFromQueryParams: testFromQueryParams || test,
|
|
159
|
+
});
|
|
131
160
|
const queryHash = await hashQuery(query, variables, headers);
|
|
132
161
|
const queryVariables = variables ? { ...variables } : {};
|
|
133
162
|
if (previewEnabled) {
|
|
@@ -165,6 +194,7 @@ export function createPackClient(options) {
|
|
|
165
194
|
return {
|
|
166
195
|
storeId: storeId,
|
|
167
196
|
sessionId: session.id,
|
|
197
|
+
abTest: getTestSession(session, testFromQueryParams, previewEnabled),
|
|
168
198
|
isPreviewModeEnabled: previewEnabled,
|
|
169
199
|
customizerMeta: session.get("customizerMeta"),
|
|
170
200
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handle-request.d.ts","sourceRoot":"","sources":["../src/handle-request.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAG5C,wBAAsB,aAAa,CACjC,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,OAAO,EAChB,aAAa,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,GACrD,OAAO,CAAC,QAAQ,CAAC,
|
|
1
|
+
{"version":3,"file":"handle-request.d.ts","sourceRoot":"","sources":["../src/handle-request.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAG5C,wBAAsB,aAAa,CACjC,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,OAAO,EAChB,aAAa,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,GACrD,OAAO,CAAC,QAAQ,CAAC,CAenB"}
|
package/dist/handle-request.js
CHANGED
package/dist/index.d.ts
CHANGED
|
@@ -3,5 +3,6 @@ import { usePackCookies } from "./session/usePackCookies";
|
|
|
3
3
|
import { PackSession } from "./session/session";
|
|
4
4
|
import { createPackClient } from "./create-pack-client";
|
|
5
5
|
import { action as previewModeAction, loader as previewModeLoader } from "./preview/preview-mode";
|
|
6
|
-
|
|
6
|
+
import { useAbTest, useAbTestHandle, useAbTestId, useAbTestSessionId, useAbTestVariantHandle, useAbTestVariantId } from "./tests/testHooks";
|
|
7
|
+
export { PackSession, createPackClient, handleRequest, previewModeAction, previewModeLoader, usePackCookies, useAbTest, useAbTestId, useAbTestHandle, useAbTestSessionId, useAbTestVariantId, useAbTestVariantHandle, };
|
|
7
8
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EACL,MAAM,IAAI,iBAAiB,EAC3B,MAAM,IAAI,iBAAiB,EAC5B,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EACL,MAAM,IAAI,iBAAiB,EAC3B,MAAM,IAAI,iBAAiB,EAC5B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,SAAS,EACT,eAAe,EACf,WAAW,EACX,kBAAkB,EAClB,sBAAsB,EACtB,kBAAkB,EACnB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,aAAa,EACb,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACd,SAAS,EACT,WAAW,EACX,eAAe,EACf,kBAAkB,EAClB,kBAAkB,EAClB,sBAAsB,GACvB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -3,4 +3,5 @@ import { usePackCookies } from "./session/usePackCookies";
|
|
|
3
3
|
import { PackSession } from "./session/session";
|
|
4
4
|
import { createPackClient } from "./create-pack-client";
|
|
5
5
|
import { action as previewModeAction, loader as previewModeLoader, } from "./preview/preview-mode";
|
|
6
|
-
|
|
6
|
+
import { useAbTest, useAbTestHandle, useAbTestId, useAbTestSessionId, useAbTestVariantHandle, useAbTestVariantId, } from "./tests/testHooks";
|
|
7
|
+
export { PackSession, createPackClient, handleRequest, previewModeAction, previewModeLoader, usePackCookies, useAbTest, useAbTestId, useAbTestHandle, useAbTestSessionId, useAbTestVariantId, useAbTestVariantHandle, };
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { PackClient } from "@pack/client";
|
|
2
|
+
import { PackSession } from "../session/session";
|
|
3
|
+
export interface TestInput {
|
|
4
|
+
testId?: string;
|
|
5
|
+
testHandle?: string;
|
|
6
|
+
testVariantId?: string;
|
|
7
|
+
testVariantHandle?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface Test {
|
|
10
|
+
id: string;
|
|
11
|
+
handle: string;
|
|
12
|
+
testVariant: {
|
|
13
|
+
id: string;
|
|
14
|
+
handle: string;
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
export declare function getTestInfo({ packClient, session, }: {
|
|
18
|
+
packClient: PackClient;
|
|
19
|
+
session: PackSession | undefined;
|
|
20
|
+
}): Promise<Test | undefined>;
|
|
21
|
+
export declare function getTestSession(session: PackSession | undefined, testFromQueryParams: TestInput | null, previewEnabled: boolean): Test | null | undefined;
|
|
22
|
+
export declare function getTestFromQueryParams(request: Request): TestInput | null;
|
|
23
|
+
export declare function setTestHeaders(headers: any, options: {
|
|
24
|
+
previewEnabled: boolean;
|
|
25
|
+
testFromSession?: Test;
|
|
26
|
+
testFromQueryParams?: TestInput;
|
|
27
|
+
}): any;
|
|
28
|
+
//# sourceMappingURL=test.d.ts.map
|
|
@@ -0,0 +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;AAEjD,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,wBAAsB,WAAW,CAAC,EAChC,UAAU,EACV,OAAO,GACR,EAAE;IACD,UAAU,EAAE,UAAU,CAAC;IACvB,OAAO,EAAE,WAAW,GAAG,SAAS,CAAC;CAClC,GAAG,OAAO,CAAC,IAAI,GAAG,SAAS,CAAC,CA2C5B;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,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,eAAe,CAAC,EAAE,IAAI,CAAC;IACvB,mBAAmB,CAAC,EAAE,SAAS,CAAC;CACjC,OAmCF"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
const QUERY_TEST = `#graphql
|
|
2
|
+
query TestCurrent {
|
|
3
|
+
testCurrent {
|
|
4
|
+
id
|
|
5
|
+
handle
|
|
6
|
+
testVariant: TestVariant {
|
|
7
|
+
id
|
|
8
|
+
handle
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
`;
|
|
13
|
+
export async function getTestInfo({ packClient, session, }) {
|
|
14
|
+
if (!session) {
|
|
15
|
+
return undefined;
|
|
16
|
+
}
|
|
17
|
+
const testSession = session.get("test");
|
|
18
|
+
let test = testSession?.data || undefined;
|
|
19
|
+
if (!testSession ||
|
|
20
|
+
(testSession && new Date(testSession.expire_at) < new Date())) {
|
|
21
|
+
// Request directly to API if it is using CDN to reduce latency
|
|
22
|
+
let usingCdn = false;
|
|
23
|
+
if (packClient.apiUrl === "https://apicdn.packdigital.com/graphql") {
|
|
24
|
+
packClient.apiUrl = "https://app.packdigital.com/graphql";
|
|
25
|
+
usingCdn = true;
|
|
26
|
+
}
|
|
27
|
+
const packClientFetch = packClient.fetch(QUERY_TEST, {});
|
|
28
|
+
if (usingCdn) {
|
|
29
|
+
// Return to CDN
|
|
30
|
+
packClient.apiUrl = "https://apicdn.packdigital.com/graphql";
|
|
31
|
+
}
|
|
32
|
+
const resp = await packClientFetch;
|
|
33
|
+
test = resp.data?.testCurrent;
|
|
34
|
+
// Expire on 24 hours the test cache
|
|
35
|
+
const expire_at = new Date();
|
|
36
|
+
expire_at.setHours(expire_at.getHours() + 24);
|
|
37
|
+
session.set("test", {
|
|
38
|
+
data: test || null,
|
|
39
|
+
expire_at: expire_at,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
return test;
|
|
43
|
+
}
|
|
44
|
+
export function getTestSession(session, testFromQueryParams, previewEnabled) {
|
|
45
|
+
if (testFromQueryParams) {
|
|
46
|
+
return {
|
|
47
|
+
id: testFromQueryParams.testId || "",
|
|
48
|
+
handle: testFromQueryParams.testHandle || "",
|
|
49
|
+
testVariant: {
|
|
50
|
+
id: testFromQueryParams.testVariantId || "",
|
|
51
|
+
handle: testFromQueryParams.testVariantHandle || "",
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
if (previewEnabled) {
|
|
56
|
+
return {
|
|
57
|
+
id: "",
|
|
58
|
+
handle: "isPreview",
|
|
59
|
+
testVariant: {
|
|
60
|
+
id: "",
|
|
61
|
+
handle: "isPreview",
|
|
62
|
+
},
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
if (!session) {
|
|
66
|
+
return undefined;
|
|
67
|
+
}
|
|
68
|
+
const testSession = session.get("test");
|
|
69
|
+
return testSession?.data || null;
|
|
70
|
+
}
|
|
71
|
+
export function getTestFromQueryParams(request) {
|
|
72
|
+
const requestUrl = new URL(request.url);
|
|
73
|
+
const params = requestUrl.searchParams;
|
|
74
|
+
if (params.has("testId") ||
|
|
75
|
+
params.has("test_id") ||
|
|
76
|
+
params.has("test-id") ||
|
|
77
|
+
params.has("testHandle") ||
|
|
78
|
+
params.has("test_handle") ||
|
|
79
|
+
params.has("test-handle") ||
|
|
80
|
+
params.has("testVariantId") ||
|
|
81
|
+
params.has("test_variant_id") ||
|
|
82
|
+
params.has("test-variant-id") ||
|
|
83
|
+
params.has("testVariantHandle") ||
|
|
84
|
+
params.has("test_variant_handle") ||
|
|
85
|
+
params.has("test-variant-handle")) {
|
|
86
|
+
return {
|
|
87
|
+
testId: params.get("testId") ||
|
|
88
|
+
params.get("test_id") ||
|
|
89
|
+
params.get("test-id") ||
|
|
90
|
+
"",
|
|
91
|
+
testHandle: params.get("testHandle") ||
|
|
92
|
+
params.get("test_handle") ||
|
|
93
|
+
params.get("test-handle") ||
|
|
94
|
+
"",
|
|
95
|
+
testVariantId: params.get("testVariantId") ||
|
|
96
|
+
params.get("test_variant_id") ||
|
|
97
|
+
params.get("test-variant-id") ||
|
|
98
|
+
"",
|
|
99
|
+
testVariantHandle: params.get("testVariantHandle") ||
|
|
100
|
+
params.get("test_variant_handle") ||
|
|
101
|
+
params.get("test-variant-handle") ||
|
|
102
|
+
"",
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
export function setTestHeaders(headers, options) {
|
|
108
|
+
const { previewEnabled, testFromQueryParams, testFromSession } = options;
|
|
109
|
+
if (previewEnabled) {
|
|
110
|
+
return headers;
|
|
111
|
+
}
|
|
112
|
+
if (testFromQueryParams) {
|
|
113
|
+
headers["X-Pack-Test-Ignore-Test-Status"] = true;
|
|
114
|
+
if (testFromQueryParams.testId) {
|
|
115
|
+
headers["X-Pack-Test-Id"] = testFromQueryParams.testId;
|
|
116
|
+
}
|
|
117
|
+
if (testFromQueryParams.testHandle) {
|
|
118
|
+
headers["X-Pack-Test-Handle"] = testFromQueryParams.testHandle;
|
|
119
|
+
}
|
|
120
|
+
if (testFromQueryParams.testVariantId) {
|
|
121
|
+
headers["X-Pack-Test-Variant-Id"] = testFromQueryParams.testVariantId;
|
|
122
|
+
}
|
|
123
|
+
if (testFromQueryParams.testVariantHandle) {
|
|
124
|
+
headers["X-Pack-Test-Variant-Handle"] =
|
|
125
|
+
testFromQueryParams.testVariantHandle;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
else if (testFromSession) {
|
|
129
|
+
headers = {
|
|
130
|
+
"X-Pack-Test-Id": testFromSession?.id,
|
|
131
|
+
"X-Pack-Test-Variant-Id": testFromSession?.testVariant?.id,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
return headers;
|
|
135
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Test } from "./test";
|
|
2
|
+
export declare function useAbTest(): Test | null;
|
|
3
|
+
export declare function useAbTestSessionId(): string;
|
|
4
|
+
export declare function useAbTestId(): string | undefined;
|
|
5
|
+
export declare function useAbTestHandle(): string | undefined;
|
|
6
|
+
export declare function useAbTestVariantId(): string | undefined;
|
|
7
|
+
export declare function useAbTestVariantHandle(): string | undefined;
|
|
8
|
+
//# sourceMappingURL=testHooks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testHooks.d.ts","sourceRoot":"","sources":["../../src/tests/testHooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAG9B,wBAAgB,SAAS,IAAI,IAAI,GAAG,IAAI,CAWvC;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAW3C;AAED,wBAAgB,WAAW,IAAI,MAAM,GAAG,SAAS,CAIhD;AAED,wBAAgB,eAAe,IAAI,MAAM,GAAG,SAAS,CAIpD;AAED,wBAAgB,kBAAkB,IAAI,MAAM,GAAG,SAAS,CAIvD;AAED,wBAAgB,sBAAsB,IAAI,MAAM,GAAG,SAAS,CAI3D"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { useRouteLoaderData } from "@remix-run/react";
|
|
2
|
+
export function useAbTest() {
|
|
3
|
+
// @ts-ignore
|
|
4
|
+
const { abTest: test } = useRouteLoaderData("root");
|
|
5
|
+
if (test === undefined) {
|
|
6
|
+
throw new Error("No A/B test found, are you sure you have call ...pack.getPackSessionData() on root loader return?");
|
|
7
|
+
}
|
|
8
|
+
return test;
|
|
9
|
+
}
|
|
10
|
+
export function useAbTestSessionId() {
|
|
11
|
+
// @ts-ignore
|
|
12
|
+
const { sessionId } = useRouteLoaderData("root");
|
|
13
|
+
if (!sessionId) {
|
|
14
|
+
throw new Error("No Session ID found, are you sure you have call ...pack.getPackSessionData() on root loader return?");
|
|
15
|
+
}
|
|
16
|
+
return sessionId;
|
|
17
|
+
}
|
|
18
|
+
export function useAbTestId() {
|
|
19
|
+
const test = useAbTest();
|
|
20
|
+
return test?.id;
|
|
21
|
+
}
|
|
22
|
+
export function useAbTestHandle() {
|
|
23
|
+
const test = useAbTest();
|
|
24
|
+
return test?.handle;
|
|
25
|
+
}
|
|
26
|
+
export function useAbTestVariantId() {
|
|
27
|
+
const test = useAbTest();
|
|
28
|
+
return test?.testVariant?.id;
|
|
29
|
+
}
|
|
30
|
+
export function useAbTestVariantHandle() {
|
|
31
|
+
const test = useAbTest();
|
|
32
|
+
return test?.testVariant?.handle;
|
|
33
|
+
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pack/hydrogen",
|
|
3
3
|
"description": "Pack Hydrogen",
|
|
4
|
-
"version": "1.0.0",
|
|
4
|
+
"version": "1.0.1-ab-test.0",
|
|
5
5
|
"exports": "./dist/index.js",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
7
7
|
"engines": {
|
|
@@ -22,8 +22,8 @@
|
|
|
22
22
|
"dist"
|
|
23
23
|
],
|
|
24
24
|
"dependencies": {
|
|
25
|
-
"@pack/client": "^1.0.0",
|
|
26
|
-
"@pack/packlytics": "^1.0.0",
|
|
25
|
+
"@pack/client": "^1.0.1-ab-test.0",
|
|
26
|
+
"@pack/packlytics": "^1.0.1-ab-test.0",
|
|
27
27
|
"@shopify/hydrogen": "^2023.10.2"
|
|
28
28
|
},
|
|
29
29
|
"devDependencies": {
|