@pack/hydrogen 0.1.0 → 0.2.0-ab-beta.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.
@@ -0,0 +1,3 @@
1
+ export declare const PACK_COOKIE_ID = "__pack";
2
+ export declare const PACK_COOKIE_MAX_AGE: number;
3
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc,WAAW,CAAC;AACvC,eAAO,MAAM,mBAAmB,QAAyB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export const PACK_COOKIE_ID = "__pack";
2
+ export const PACK_COOKIE_MAX_AGE = 60 * 60 * 24 * 360 * 1; // 1 year
@@ -1,7 +1,8 @@
1
1
  /// <reference types="@shopify/oxygen-workers-types" />
2
2
  import { PackClient } from "@pack/client";
3
3
  import { CacheCustom } from "@shopify/hydrogen";
4
- import { PreviewSession } from "./preview/preview-session";
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 {
@@ -16,11 +17,17 @@ interface EnvironmentOptions {
16
17
  */
17
18
  waitUntil: ExecutionContext["waitUntil"];
18
19
  }
19
- interface CreatePackClientOptions extends EnvironmentOptions {
20
+ export interface CreatePackClientOptions extends EnvironmentOptions {
20
21
  apiUrl?: string;
21
- token: string;
22
+ token?: string;
23
+ contentEnvironment?: string;
24
+ }
25
+ interface PackClientOptions extends EnvironmentOptions {
26
+ apiUrl?: string;
27
+ token?: string;
28
+ session: PackSession;
22
29
  preview?: {
23
- session: PreviewSession;
30
+ session: PackSession;
24
31
  };
25
32
  contentEnvironment?: string;
26
33
  }
@@ -28,6 +35,7 @@ type Variables = Record<string, any>;
28
35
  interface QueryOptions {
29
36
  variables?: Variables;
30
37
  cache?: CachingStrategy;
38
+ test?: TestInput;
31
39
  }
32
40
  interface QueryError {
33
41
  message: string;
@@ -41,12 +49,21 @@ interface QueryResponse<T> {
41
49
  }
42
50
  export interface Pack {
43
51
  isPreviewModeEnabled: () => boolean;
52
+ session: PackSession;
44
53
  preview?: {
45
- session: PreviewSession;
54
+ session: PackSession;
46
55
  };
56
+ abTest: Test | null | undefined;
57
+ setRequestAbTest: (request: Request) => void;
47
58
  query: <T = any>(query: string, options?: QueryOptions) => Promise<QueryResponse<T>>;
48
59
  isValidEditToken: PackClient["isValidEditToken"];
60
+ getRootLoaderData(): {
61
+ sessionId: string;
62
+ abTest: Test | null | undefined;
63
+ isPreviewModeEnabled: boolean;
64
+ customizerMeta: any;
65
+ };
49
66
  }
50
- export declare function createPackClient(options: CreatePackClientOptions): Pack;
67
+ export declare function createPackClient(options: PackClientOptions): Pack;
51
68
  export {};
52
69
  //# sourceMappingURL=create-pack-client.d.ts.map
@@ -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;AAEjE,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAE3D,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,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE;QACR,OAAO,EAAE,cAAc,CAAC;KACzB,CAAC;IACF,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;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,CAAC,EAAE;QACR,OAAO,EAAE,cAAc,CAAC;KACzB,CAAC;IACF,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;CAClD;AAqCD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,uBAAuB,GAAG,IAAI,CAwDvE"}
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;AAEjE,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,MAAM,WAAW,uBAAwB,SAAQ,kBAAkB;IACjE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,UAAU,iBAAkB,SAAQ,kBAAkB;IACpD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,WAAW,CAAC;IACrB,OAAO,CAAC,EAAE;QACR,OAAO,EAAE,WAAW,CAAC;KACtB,CAAC;IACF,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;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,OAAO,CAAC,EAAE;QACR,OAAO,EAAE,WAAW,CAAC;KACtB,CAAC;IACF,MAAM,EAAE,IAAI,GAAG,IAAI,GAAG,SAAS,CAAC;IAChC,gBAAgB,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAC7C,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,iBAAiB,IAAI;QACnB,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;AAwCD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,iBAAiB,GAAG,IAAI,CAiHjE"}
@@ -1,6 +1,6 @@
1
1
  import { PackClient } from "@pack/client";
2
2
  import { CacheCustom, createWithCache } from "@shopify/hydrogen";
3
- const PRODUCTION_ENVIRONMENT = "production";
3
+ import { getTestInfo, setTestHeaders, getTestSession, setRequestAbTest, } from "./tests/test";
4
4
  /**
5
5
  * Create an SHA-256 hash as a hex string
6
6
  * @see https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/digest#converting_a_digest_to_a_hex_string
@@ -19,10 +19,12 @@ async function sha256(message) {
19
19
  * Hash query and its parameters for use as cache key.
20
20
  * NOTE: Oxygen deployment will break if the cache key is long or contains `\n`
21
21
  */
22
- function hashQuery(query, variables) {
22
+ function hashQuery(query, variables, headers) {
23
23
  let hash = query;
24
24
  if (variables !== null)
25
25
  hash += JSON.stringify(variables);
26
+ if (headers !== null)
27
+ hash += JSON.stringify(headers);
26
28
  return sha256(hash);
27
29
  }
28
30
  // Extends the CacheLong strategy with a stale-if-error policy
@@ -32,25 +34,56 @@ const cacheCustom = CacheCustom({
32
34
  staleIfError: 86400, // 1 day
33
35
  });
34
36
  export function createPackClient(options) {
35
- const { cache, waitUntil, preview, contentEnvironment, token, apiUrl } = options;
37
+ const { cache, waitUntil, session, preview, contentEnvironment, token, apiUrl, } = options;
36
38
  const previewEnabled = !!preview?.session.get("enabled");
37
39
  const previewEnvironment = preview?.session.get("environment");
38
- const clientContentEnvironment = previewEnvironment || contentEnvironment || PRODUCTION_ENVIRONMENT;
40
+ let requestAbTest = null;
41
+ const clientContentEnvironment = previewEnvironment || contentEnvironment;
39
42
  const packClient = new PackClient({
40
- // Use live API URL if preview mode is enabled always
41
- apiUrl: previewEnabled ? "https://app.packdigital.com/graphql" : apiUrl,
42
- token,
43
+ // Use apiUrl, it is configured
44
+ // Use active API URL if preview mode is enabled
45
+ // Otherwise, Live PackClient uses its internal configuration
46
+ apiUrl: apiUrl
47
+ ? apiUrl
48
+ : previewEnabled
49
+ ? "https://app.packdigital.com/graphql"
50
+ : undefined,
51
+ token: token || "",
43
52
  contentEnvironment: clientContentEnvironment,
53
+ sessionId: session.id,
54
+ });
55
+ const getTestVariantPromise = getTestInfo({
56
+ packClient,
57
+ session,
44
58
  });
45
59
  return {
60
+ session,
46
61
  preview,
62
+ abTest: getTestSession(session, requestAbTest, previewEnabled),
63
+ setRequestAbTest: (request) => {
64
+ requestAbTest = setRequestAbTest(request);
65
+ },
47
66
  isPreviewModeEnabled: () => previewEnabled,
48
- async query(query, { variables, cache: strategy = cacheCustom } = {}) {
49
- const queryHash = await hashQuery(query, variables);
67
+ async query(query, { variables, cache: strategy = cacheCustom, test } = {}) {
50
68
  const withCache = createWithCache({
51
69
  cache,
52
70
  waitUntil,
53
71
  });
72
+ let headers = {};
73
+ headers = await setTestHeaders(headers, {
74
+ test: requestAbTest || test,
75
+ previewEnabled,
76
+ sessionTest: await (async () => {
77
+ try {
78
+ return await getTestVariantPromise;
79
+ }
80
+ catch (e) {
81
+ console.error(e);
82
+ }
83
+ return undefined;
84
+ })(),
85
+ });
86
+ const queryHash = await hashQuery(query, variables, headers);
54
87
  const queryVariables = variables ? { ...variables } : {};
55
88
  if (previewEnabled) {
56
89
  queryVariables.version = "CURRENT";
@@ -61,7 +94,10 @@ export function createPackClient(options) {
61
94
  // Preview mode always bypasses the cache
62
95
  if (previewEnabled) {
63
96
  try {
64
- return await packClient.fetch(query, { variables: queryVariables });
97
+ return await packClient.fetch(query, {
98
+ variables: queryVariables,
99
+ headers: headers,
100
+ });
65
101
  }
66
102
  catch (error) {
67
103
  return { error, data: {} };
@@ -69,7 +105,10 @@ export function createPackClient(options) {
69
105
  }
70
106
  return withCache(queryHash, strategy, async () => {
71
107
  try {
72
- return await packClient.fetch(query, { variables: queryVariables });
108
+ return await packClient.fetch(query, {
109
+ variables: queryVariables,
110
+ headers: headers,
111
+ });
73
112
  }
74
113
  catch (error) {
75
114
  return { error, data: {} };
@@ -77,5 +116,13 @@ export function createPackClient(options) {
77
116
  });
78
117
  },
79
118
  isValidEditToken: (token) => packClient.isValidEditToken(token),
119
+ getRootLoaderData: () => {
120
+ return {
121
+ sessionId: session.id,
122
+ abTest: getTestSession(session, requestAbTest, previewEnabled),
123
+ isPreviewModeEnabled: previewEnabled,
124
+ customizerMeta: preview?.session.get("customizerMeta"),
125
+ };
126
+ },
80
127
  };
81
128
  }
package/dist/index.d.ts CHANGED
@@ -1,5 +1,8 @@
1
- import { Pack, createPackClient } from "./create-pack-client";
2
- import { PreviewSession } from "./preview/preview-session";
1
+ import { createRequestHandler } from "./server";
2
+ import { Pack } from "./create-pack-client";
3
+ import { PackSession } from "./session/session";
4
+ import { useAbTest, useAbTestHandle, useAbTestId, useAbTestSessionId, useAbTestVariantHandle, useAbTestVariantId } from "./tests/testHooks";
5
+ import { usePackCookies } from "./session/usePackCookies";
3
6
  import { action as previewModeAction, loader as previewModeLoader } from "./preview/preview-mode";
4
- export { type Pack, createPackClient, PreviewSession, previewModeAction, previewModeLoader, };
7
+ export { type Pack, usePackCookies, createRequestHandler, PackSession, previewModeAction, previewModeLoader, useAbTest, useAbTestId, useAbTestHandle, useAbTestSessionId, useAbTestVariantId, useAbTestVariantHandle, };
5
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,IAAI,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EACL,MAAM,IAAI,iBAAiB,EAC3B,MAAM,IAAI,iBAAiB,EAC5B,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,KAAK,IAAI,EACT,gBAAgB,EAChB,cAAc,EACd,iBAAiB,EACjB,iBAAiB,GAClB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EACL,SAAS,EACT,eAAe,EACf,WAAW,EACX,kBAAkB,EAClB,sBAAsB,EACtB,kBAAkB,EACnB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EACL,MAAM,IAAI,iBAAiB,EAC3B,MAAM,IAAI,iBAAiB,EAC5B,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,KAAK,IAAI,EACT,cAAc,EACd,oBAAoB,EACpB,WAAW,EACX,iBAAiB,EACjB,iBAAiB,EACjB,SAAS,EACT,WAAW,EACX,eAAe,EACf,kBAAkB,EAClB,kBAAkB,EAClB,sBAAsB,GACvB,CAAC"}
package/dist/index.js CHANGED
@@ -1,4 +1,6 @@
1
- import { createPackClient } from "./create-pack-client";
2
- import { PreviewSession } from "./preview/preview-session";
1
+ import { createRequestHandler } from "./server";
2
+ import { PackSession } from "./session/session";
3
+ import { useAbTest, useAbTestHandle, useAbTestId, useAbTestSessionId, useAbTestVariantHandle, useAbTestVariantId, } from "./tests/testHooks";
4
+ import { usePackCookies } from "./session/usePackCookies";
3
5
  import { action as previewModeAction, loader as previewModeLoader, } from "./preview/preview-mode";
4
- export { createPackClient, PreviewSession, previewModeAction, previewModeLoader, };
6
+ export { usePackCookies, createRequestHandler, PackSession, previewModeAction, previewModeLoader, useAbTest, useAbTestId, useAbTestHandle, useAbTestSessionId, useAbTestVariantId, useAbTestVariantHandle, };
@@ -1 +1 @@
1
- {"version":3,"file":"preview-mode.d.ts","sourceRoot":"","sources":["../../src/preview/preview-mode.tsx"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,cAAc,EACpB,MAAM,2BAA2B,CAAC;AAInC,KAAK,YAAY,GAAG,CAAC,IAAI,EACvB,IAAI,EAAE,IAAI,EACV,IAAI,CAAC,EAAE,MAAM,GAAG,YAAY,KACzB,aAAa,CAAC,IAAI,CAAC,CAAC;AAEzB,KAAK,gBAAgB,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,YAAY,KAAK,QAAQ,CAAC;AAIhF,KAAK,aAAa,CAAC,CAAC,GAAG,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,GAAG;IACzD,IAAI,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC;CACpB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,IAAI,EAAE,YAYlB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,QAAQ,EAAE,gBAetB,CAAC;AAoBF;;;GAGG;AACH,eAAO,MAAM,MAAM,EAAE,cAkBpB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,MAAM,EAAE,cA+CpB,CAAC"}
1
+ {"version":3,"file":"preview-mode.d.ts","sourceRoot":"","sources":["../../src/preview/preview-mode.tsx"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,cAAc,EACpB,MAAM,2BAA2B,CAAC;AAInC,KAAK,YAAY,GAAG,CAAC,IAAI,EACvB,IAAI,EAAE,IAAI,EACV,IAAI,CAAC,EAAE,MAAM,GAAG,YAAY,KACzB,aAAa,CAAC,IAAI,CAAC,CAAC;AAEzB,KAAK,gBAAgB,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,YAAY,KAAK,QAAQ,CAAC;AAIhF,KAAK,aAAa,CAAC,CAAC,GAAG,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,GAAG;IACzD,IAAI,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC;CACpB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,IAAI,EAAE,YAYlB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,QAAQ,EAAE,gBAetB,CAAC;AAoBF;;;GAGG;AACH,eAAO,MAAM,MAAM,EAAE,cAkBpB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,MAAM,EAAE,cAwCpB,CAAC"}
@@ -74,7 +74,6 @@ export const loader = async function ({ request, context }) {
74
74
  if (!pack.preview?.session)
75
75
  return notFound();
76
76
  const { searchParams } = new URL(request.url);
77
- console.log("searchParams.customizerMeta", searchParams.get("customizerMeta"));
78
77
  const token = searchParams.get("token");
79
78
  const environment = searchParams.get("environment");
80
79
  const path = searchParams.get("path") ?? ROOT_PATH;
@@ -89,12 +88,11 @@ export const loader = async function ({ request, context }) {
89
88
  }
90
89
  let customizerMetaJson;
91
90
  try {
92
- customizerMetaJson = JSON.parse(customizerMeta || "{}");
91
+ customizerMetaJson = customizerMeta ? JSON.parse(customizerMeta) : null;
93
92
  }
94
93
  catch (_error) {
95
94
  customizerMetaJson = null;
96
95
  }
97
- console.log("customizerMetaJson", customizerMetaJson);
98
96
  pack.preview.session.set("enabled", true);
99
97
  pack.preview.session.set("environment", environment);
100
98
  pack.preview.session.set("customizerMeta", customizerMetaJson);
@@ -0,0 +1,13 @@
1
+ import { type ServerBuild } from "@remix-run/server-runtime";
2
+ import { CreatePackClientOptions } from "./create-pack-client";
3
+ export declare function createRequestHandler<Context = unknown>({ request, env, build, mode, getLoadContext, packClientOptions, }: {
4
+ request: Request;
5
+ env?: {
6
+ [key: string]: any;
7
+ };
8
+ build: ServerBuild;
9
+ mode?: string;
10
+ getLoadContext?: (request: Request) => Promise<Context> | Context;
11
+ packClientOptions: CreatePackClientOptions;
12
+ }): Promise<(request: Request) => Promise<Response>>;
13
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAEL,uBAAuB,EACxB,MAAM,sBAAsB,CAAC;AAI9B,wBAAsB,oBAAoB,CAAC,OAAO,GAAG,OAAO,EAAE,EAC5D,OAAO,EACP,GAAG,EACH,KAAK,EACL,IAAI,EACJ,cAAc,EACd,iBAAiB,GAClB,EAAE;IACD,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE;QACJ,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;KACpB,CAAC;IACF,KAAK,EAAE,WAAW,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;IAClE,iBAAiB,EAAE,uBAAuB,CAAC;CAC5C,qBAkBwB,OAAO,wBAiC/B"}
package/dist/server.js ADDED
@@ -0,0 +1,49 @@
1
+ import { createRequestHandler as createRemixRequestHandler } from "@shopify/remix-oxygen";
2
+ import { createPackClient, } from "./create-pack-client";
3
+ import { PackSession } from "./session/session";
4
+ import { usePacklytics } from "@pack/packlytics";
5
+ export async function createRequestHandler({ request, env, build, mode, getLoadContext, packClientOptions, }) {
6
+ /**
7
+ * Open a cache instance in the worker and a custom session instance.
8
+ */
9
+ if (!env?.SESSION_SECRET) {
10
+ throw new Error("SESSION_SECRET environment variable is not set");
11
+ }
12
+ const packSession = await PackSession.init(request, [env.SESSION_SECRET]);
13
+ const pack = createPackClient({
14
+ ...packClientOptions,
15
+ token: env.PACK_SECRET_TOKEN,
16
+ session: packSession,
17
+ preview: { session: packSession },
18
+ contentEnvironment: env.PACK_CONTENT_ENVIRONMENT,
19
+ });
20
+ return async (request) => {
21
+ pack.setRequestAbTest(request);
22
+ /**
23
+ * Create a Remix request handler and pass
24
+ * Hydrogen's Storefront client to the loader context.
25
+ */
26
+ const handleRequest = createRemixRequestHandler({
27
+ build: build,
28
+ mode: mode,
29
+ poweredByHeader: false,
30
+ getLoadContext: async (request) => ({
31
+ ...(getLoadContext ? getLoadContext(request) : {}),
32
+ pack,
33
+ }),
34
+ });
35
+ // We need this,
36
+ // because once the handleRequest return
37
+ // remix kills all processes, and if this happens we lost our page-hit.
38
+ const [response, _] = await Promise.all([
39
+ handleRequest(request),
40
+ usePacklytics(request, pack, {
41
+ storeFrontId: env.PACK_STOREFRONT_ID,
42
+ sessionSecret: env.SESSION_SECRET,
43
+ }),
44
+ ]);
45
+ response.headers.append("powered-by", "Shopify, Hydrogen + Pack Digital");
46
+ response.headers.append("Set-Cookie", await packSession.commit());
47
+ return response;
48
+ };
49
+ }
@@ -0,0 +1,13 @@
1
+ /**
2
+ * This will generate a random UUID
3
+ * This is not based on user data,
4
+ * This is based on a random number generator using crypto or math.random
5
+ *
6
+ * This UUID is used to generate a session ID for the session cookie
7
+ *
8
+ * We can never use this id to trace back users for GDPR compliance.
9
+ *
10
+ */
11
+ export declare function buildRandomUUID(): string;
12
+ export declare function hexTime(): string;
13
+ //# sourceMappingURL=cookies-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cookies-utils.d.ts","sourceRoot":"","sources":["../../src/session/cookies-utils.tsx"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AACH,wBAAgB,eAAe,IAAI,MAAM,CA8BxC;AAED,wBAAgB,OAAO,IAAI,MAAM,CAoBhC"}
@@ -0,0 +1,58 @@
1
+ const tokenHash = "xxxx-4xxx-xxxx-xxxxxxxxxxxx";
2
+ /**
3
+ * This will generate a random UUID
4
+ * This is not based on user data,
5
+ * This is based on a random number generator using crypto or math.random
6
+ *
7
+ * This UUID is used to generate a session ID for the session cookie
8
+ *
9
+ * We can never use this id to trace back users for GDPR compliance.
10
+ *
11
+ */
12
+ export function buildRandomUUID() {
13
+ let hash = "";
14
+ try {
15
+ const crypto = window.crypto;
16
+ const randomValuesArray = new Uint16Array(31);
17
+ crypto.getRandomValues(randomValuesArray);
18
+ // Generate a strong UUID
19
+ let i = 0;
20
+ hash = tokenHash
21
+ .replace(/[x]/g, (c) => {
22
+ const r = randomValuesArray[i] % 16;
23
+ const v = c === "x" ? r : (r & 0x3) | 0x8;
24
+ i++;
25
+ return v.toString(16);
26
+ })
27
+ .toUpperCase();
28
+ }
29
+ catch (err) {
30
+ // crypto not available, generate weak UUID
31
+ hash = tokenHash
32
+ .replace(/[x]/g, (c) => {
33
+ const r = (Math.random() * 16) | 0;
34
+ const v = c === "x" ? r : (r & 0x3) | 0x8;
35
+ return v.toString(16);
36
+ })
37
+ .toUpperCase();
38
+ }
39
+ return `${hexTime()}-${hash}`;
40
+ }
41
+ export function hexTime() {
42
+ // 32 bit representations of new Date().getTime() and performance.now()
43
+ let dateNumber = 0;
44
+ let perfNumber = 0;
45
+ // Result of zero-fill right shift is always positive
46
+ dateNumber = new Date().getTime() >>> 0;
47
+ try {
48
+ perfNumber = performance.now() >>> 0;
49
+ }
50
+ catch (err) {
51
+ perfNumber = 0;
52
+ }
53
+ const output = Math.abs(dateNumber + perfNumber)
54
+ .toString(16)
55
+ .toLowerCase();
56
+ // Ensure the output is exactly 8 characters
57
+ return output.padStart(8, "0");
58
+ }
@@ -0,0 +1,13 @@
1
+ import { type Session, type SessionStorage } from "@shopify/remix-oxygen";
2
+ export declare class PackSession {
3
+ #private;
4
+ readonly id: string;
5
+ constructor(id: string, sessionStorage: SessionStorage, session: Session);
6
+ static init(request: Request, secrets: string[]): Promise<PackSession>;
7
+ has(key: string): boolean;
8
+ get(key: string): any;
9
+ destroy(): Promise<string>;
10
+ set(key: string, value: any): void;
11
+ commit(): Promise<string>;
12
+ }
13
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/session/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,OAAO,EACZ,KAAK,cAAc,EACpB,MAAM,uBAAuB,CAAC;AAI/B,qBAAa,WAAW;;IACtB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;gBAMR,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE,cAAc,EAAE,OAAO,EAAE,OAAO;WAM3D,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC;IAwB5E,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIzB,GAAG,CAAC,GAAG,EAAE,MAAM;IAIf,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;IAI1B,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,IAAI;IAIlC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC;CAG1B"}
@@ -0,0 +1,47 @@
1
+ import { createCookie, createCookieSessionStorage, } from "@shopify/remix-oxygen";
2
+ import { PACK_COOKIE_ID, PACK_COOKIE_MAX_AGE } from "../constants";
3
+ import { buildRandomUUID } from "./cookies-utils";
4
+ export class PackSession {
5
+ id;
6
+ #session;
7
+ #sessionStorage;
8
+ constructor(id, sessionStorage, session) {
9
+ this.id = id;
10
+ this.#session = session;
11
+ this.#sessionStorage = sessionStorage;
12
+ }
13
+ static async init(request, secrets) {
14
+ const storage = createCookieSessionStorage({
15
+ cookie: createCookie(PACK_COOKIE_ID, {
16
+ // secure: true should be used in production
17
+ secure: process.env.NODE_ENV === "production",
18
+ secrets,
19
+ sameSite: "lax",
20
+ path: "/",
21
+ maxAge: PACK_COOKIE_MAX_AGE,
22
+ }),
23
+ });
24
+ const session = await storage.getSession(request.headers.get("Cookie"));
25
+ let sessionId = session.get("session_id");
26
+ if (!sessionId) {
27
+ sessionId = buildRandomUUID();
28
+ session.set("session_id", sessionId);
29
+ }
30
+ return new this(sessionId, storage, session);
31
+ }
32
+ has(key) {
33
+ return this.#session.has(key);
34
+ }
35
+ get(key) {
36
+ return this.#session.get(key);
37
+ }
38
+ destroy() {
39
+ return this.#sessionStorage.destroySession(this.#session);
40
+ }
41
+ set(key, value) {
42
+ this.#session.set(key, value);
43
+ }
44
+ commit() {
45
+ return this.#sessionStorage.commitSession(this.#session);
46
+ }
47
+ }
@@ -0,0 +1,15 @@
1
+ type UsePackCookiesOptions = {
2
+ /**
3
+ * If set to `false`, Shopify cookies will be removed.
4
+ * If set to `true`, Shopify unique user token cookie will have cookie expiry of 1 year.
5
+ * Defaults to false.
6
+ **/
7
+ hasUserConsent?: boolean;
8
+ /**
9
+ * The domain scope of the cookie. Defaults to empty string.
10
+ **/
11
+ domain?: string;
12
+ };
13
+ export declare function usePackCookies(options?: UsePackCookiesOptions): void;
14
+ export {};
15
+ //# sourceMappingURL=usePackCookies.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usePackCookies.d.ts","sourceRoot":"","sources":["../../src/session/usePackCookies.ts"],"names":[],"mappings":"AAKA,KAAK,qBAAqB,GAAG;IAC3B;;;;QAII;IACJ,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB;;QAEI;IACJ,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,wBAAgB,cAAc,CAAC,OAAO,CAAC,EAAE,qBAAqB,GAAG,IAAI,CAgBpE"}
@@ -0,0 +1,27 @@
1
+ import { useEffect } from "react";
2
+ import { stringify } from "worktop/cookie";
3
+ import { useShopifyCookies } from "@shopify/hydrogen";
4
+ import { PACK_COOKIE_ID } from "../constants";
5
+ export function usePackCookies(options) {
6
+ useShopifyCookies(options);
7
+ const { hasUserConsent = false, domain = "" } = options || {};
8
+ /**
9
+ * Set the user cookie
10
+ */
11
+ useEffect(() => {
12
+ /**
13
+ * Set user and session cookies and refresh the expiry time
14
+ */
15
+ if (!hasUserConsent) {
16
+ setCookie(PACK_COOKIE_ID, "", 0, domain);
17
+ }
18
+ });
19
+ }
20
+ function setCookie(name, value, maxage, domain) {
21
+ document.cookie = stringify(name, value, {
22
+ maxage,
23
+ domain,
24
+ samesite: "Lax",
25
+ path: "/",
26
+ });
27
+ }
@@ -0,0 +1,33 @@
1
+ import { PackClient } from "@pack/client";
2
+ import { PackSession } from "../session/session";
3
+ export interface TestInput {
4
+ testId?: string;
5
+ testHandle?: string;
6
+ variantId?: string;
7
+ variantHandle?: 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, requestAbTest: TestInput | null, previewEnabled: boolean): Test | null | undefined;
22
+ export declare function setRequestAbTest(request: Request): {
23
+ testId: string;
24
+ testHandle: string;
25
+ variantId: string;
26
+ variantHandle: string;
27
+ } | null;
28
+ export declare function setTestHeaders(headers: any, options: {
29
+ test: TestInput | null | undefined;
30
+ previewEnabled: boolean;
31
+ sessionTest: Test | undefined;
32
+ }): any;
33
+ //# 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,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;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,CAgC5B;AAED,wBAAgB,cAAc,CAC5B,OAAO,EAAE,WAAW,GAAG,SAAS,EAChC,aAAa,EAAE,SAAS,GAAG,IAAI,EAC/B,cAAc,EAAE,OAAO,GACtB,IAAI,GAAG,IAAI,GAAG,SAAS,CA8BzB;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO;;;;;SAmBhD;AAED,wBAAgB,cAAc,CAC5B,OAAO,EAAE,GAAG,EACZ,OAAO,EAAE;IACP,IAAI,EAAE,SAAS,GAAG,IAAI,GAAG,SAAS,CAAC;IACnC,cAAc,EAAE,OAAO,CAAC;IACxB,WAAW,EAAE,IAAI,GAAG,SAAS,CAAC;CAC/B,OA8BF"}
@@ -0,0 +1,101 @@
1
+ const QUERY_TEST = `#graphql
2
+ query TestCurrent {
3
+ testCurrent {
4
+ id
5
+ handle
6
+ 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
+ const resp = await packClient.fetch(QUERY_TEST, {});
22
+ test = resp.data?.testCurrent;
23
+ // Expire on 24 hours the test cache
24
+ const expire_at = new Date();
25
+ expire_at.setHours(expire_at.getHours() + 24);
26
+ session.set("test", {
27
+ data: test || null,
28
+ expire_at: expire_at,
29
+ });
30
+ }
31
+ return test;
32
+ }
33
+ export function getTestSession(session, requestAbTest, previewEnabled) {
34
+ if (!session) {
35
+ return undefined;
36
+ }
37
+ if (requestAbTest) {
38
+ return {
39
+ id: requestAbTest.testId || "",
40
+ handle: requestAbTest.testHandle || "",
41
+ TestVariant: {
42
+ id: requestAbTest.variantId || "",
43
+ handle: requestAbTest.variantHandle || "",
44
+ },
45
+ };
46
+ }
47
+ if (previewEnabled) {
48
+ return {
49
+ id: "",
50
+ handle: "isPreview",
51
+ TestVariant: {
52
+ id: "",
53
+ handle: "isPreview",
54
+ },
55
+ };
56
+ }
57
+ const testSession = session.get("test");
58
+ return testSession?.data || null;
59
+ }
60
+ export function setRequestAbTest(request) {
61
+ const requestUrl = new URL(request.url);
62
+ const params = requestUrl.searchParams;
63
+ if (params.has("test_id") ||
64
+ params.has("test_handle") ||
65
+ params.has("variant_id") ||
66
+ params.has("variant_handle")) {
67
+ return {
68
+ testId: params.get("test_id") || "",
69
+ testHandle: params.get("test_handle") || "",
70
+ variantId: params.get("variant_id") || "",
71
+ variantHandle: params.get("variant_handle") || "",
72
+ };
73
+ }
74
+ return null;
75
+ }
76
+ export function setTestHeaders(headers, options) {
77
+ const { test, previewEnabled, sessionTest } = options;
78
+ if (test) {
79
+ if (test.testId) {
80
+ headers["X-Test-Id"] = test.testId;
81
+ }
82
+ if (test.testHandle) {
83
+ headers["X-Test-Handle"] = test.testHandle;
84
+ }
85
+ if (test.variantId) {
86
+ headers["X-Variant-Id"] = test.variantId;
87
+ }
88
+ if (test.variantHandle) {
89
+ headers["X-Variant-Handle"] = test.variantHandle;
90
+ }
91
+ }
92
+ else {
93
+ if (!previewEnabled && sessionTest) {
94
+ headers = {
95
+ "X-Test-Id": sessionTest?.id,
96
+ "X-Variant-Id": sessionTest?.TestVariant?.id,
97
+ };
98
+ }
99
+ }
100
+ return headers;
101
+ }
@@ -0,0 +1,8 @@
1
+ import { Test } from "./test";
2
+ export declare function useAbTest(): Test;
3
+ export declare function useAbTestSessionId(): string;
4
+ export declare function useAbTestId(): string;
5
+ export declare function useAbTestHandle(): string;
6
+ export declare function useAbTestVariantId(): string;
7
+ export declare function useAbTestVariantHandle(): string;
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,CAWhC;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAW3C;AAED,wBAAgB,WAAW,IAAI,MAAM,CAIpC;AAED,wBAAgB,eAAe,IAAI,MAAM,CAIxC;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAI3C;AAED,wBAAgB,sBAAsB,IAAI,MAAM,CAI/C"}
@@ -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.getRootLoaderData() 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.getRootLoaderData() 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": "0.1.0",
4
+ "version": "0.2.0-ab-beta.0",
5
5
  "exports": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
7
7
  "engines": {
@@ -22,13 +22,15 @@
22
22
  "dist"
23
23
  ],
24
24
  "dependencies": {
25
- "@pack/client": "^0.0.7",
25
+ "@pack/client": "^0.1.0-ab-beta.0",
26
+ "@pack/packlytics": "^0.1.0-ab-beta.0",
26
27
  "@shopify/hydrogen": "^2023.10.2"
27
28
  },
28
29
  "devDependencies": {
29
30
  "@remix-run/server-runtime": "^2.0.0",
30
31
  "@shopify/oxygen-workers-types": "^4.0.0",
31
- "@shopify/remix-oxygen": "^2.0.1"
32
+ "@shopify/remix-oxygen": "^2.0.1",
33
+ "@types/node": "^20.11.17"
32
34
  },
33
35
  "peerDependencies": {
34
36
  "react": "^18.0.0"
@@ -1,12 +0,0 @@
1
- import { type Session, type SessionStorage } from '@shopify/remix-oxygen';
2
- export declare class PreviewSession {
3
- #private;
4
- constructor(sessionStorage: SessionStorage, session: Session);
5
- static init(request: Request, secrets: string[]): Promise<PreviewSession>;
6
- has(key: string): boolean;
7
- get(key: string): any;
8
- destroy(): Promise<string>;
9
- set(key: string, value: any): void;
10
- commit(): Promise<string>;
11
- }
12
- //# sourceMappingURL=preview-session.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"preview-session.d.ts","sourceRoot":"","sources":["../../src/preview/preview-session.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,OAAO,EACZ,KAAK,cAAc,EACpB,MAAM,uBAAuB,CAAA;AAE9B,qBAAa,cAAc;;gBAIb,cAAc,EAAE,cAAc,EAAE,OAAO,EAAE,OAAO;WAK/C,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,cAAc,CAAC;IAe/E,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIzB,GAAG,CAAC,GAAG,EAAE,MAAM;IAIf,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;IAI1B,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,IAAI;IAIlC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC;CAG1B"}
@@ -1,36 +0,0 @@
1
- import { createCookieSessionStorage, } from '@shopify/remix-oxygen';
2
- export class PreviewSession {
3
- #sessionStorage;
4
- #session;
5
- constructor(sessionStorage, session) {
6
- this.#sessionStorage = sessionStorage;
7
- this.#session = session;
8
- }
9
- static async init(request, secrets) {
10
- const storage = createCookieSessionStorage({
11
- cookie: {
12
- name: '__preview',
13
- sameSite: 'none',
14
- secure: true,
15
- secrets,
16
- },
17
- });
18
- const session = await storage.getSession(request.headers.get('Cookie'));
19
- return new this(storage, session);
20
- }
21
- has(key) {
22
- return this.#session.has(key);
23
- }
24
- get(key) {
25
- return this.#session.get(key);
26
- }
27
- destroy() {
28
- return this.#sessionStorage.destroySession(this.#session);
29
- }
30
- set(key, value) {
31
- this.#session.set(key, value);
32
- }
33
- commit() {
34
- return this.#sessionStorage.commitSession(this.#session);
35
- }
36
- }