@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.
@@ -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;AAEhD,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;CACzB;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,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,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,CAkIvE"}
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,CAanB"}
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"}
@@ -1,5 +1,6 @@
1
1
  import { packlytics } from "@pack/packlytics";
2
2
  export async function handleRequest(pack, request, handleRequest) {
3
+ pack.setTestFromQueryParams(request);
3
4
  const [response, _] = await Promise.all([
4
5
  handleRequest(request),
5
6
  packlytics(request, pack.session, {
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
- export { PackSession, createPackClient, handleRequest, previewModeAction, previewModeLoader, usePackCookies, };
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
@@ -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;AAEhC,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,aAAa,EACb,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,GACf,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
- export { PackSession, createPackClient, handleRequest, previewModeAction, previewModeLoader, usePackCookies, };
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": {