@pack/hydrogen 0.0.3 → 0.0.5

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,9 +1,9 @@
1
1
  /// <reference types="@shopify/oxygen-workers-types" />
2
- import { PackClient } from '@pack/client';
3
- import { CacheLong } from '@shopify/hydrogen';
4
- import { PreviewSession } from './preview/preview-session';
2
+ import { PackClient } from "@pack/client";
3
+ import { CacheCustom } from "@shopify/hydrogen";
4
+ import { PreviewSession } from "./preview/preview-session";
5
5
  /** @see https://shopify.dev/docs/custom-storefronts/hydrogen/data-fetching/cache#caching-strategies */
6
- type CachingStrategy = ReturnType<typeof CacheLong>;
6
+ type CachingStrategy = ReturnType<typeof CacheCustom>;
7
7
  interface EnvironmentOptions {
8
8
  /**
9
9
  * A Cache API instance.
@@ -14,7 +14,7 @@ interface EnvironmentOptions {
14
14
  * A runtime utility for serverless environments
15
15
  * @see https://developers.cloudflare.com/workers/runtime-apis/fetch-event/#waituntil
16
16
  */
17
- waitUntil: ExecutionContext['waitUntil'];
17
+ waitUntil: ExecutionContext["waitUntil"];
18
18
  }
19
19
  interface CreatePackClientOptions extends EnvironmentOptions {
20
20
  apiUrl?: string;
@@ -45,7 +45,7 @@ export interface Pack {
45
45
  session: PreviewSession;
46
46
  };
47
47
  query: <T = any>(query: string, options?: QueryOptions) => Promise<QueryResponse<T>>;
48
- isValidEditToken: PackClient['isValidEditToken'];
48
+ isValidEditToken: PackClient["isValidEditToken"];
49
49
  }
50
50
  export declare function createPackClient(options: CreatePackClientOptions): Pack;
51
51
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"create-pack-client.d.ts","sourceRoot":"","sources":["../src/create-pack-client.ts"],"names":[],"mappings":";AAAA,OAAO,EAAC,UAAU,EAAC,MAAM,cAAc,CAAA;AACvC,OAAO,EAAC,SAAS,EAAkB,MAAM,mBAAmB,CAAA;AAE5D,OAAO,EAAC,cAAc,EAAC,MAAM,2BAA2B,CAAA;AAExD,uGAAuG;AACvG,KAAK,eAAe,GAAG,UAAU,CAAC,OAAO,SAAS,CAAC,CAAA;AAEnD,UAAU,kBAAkB;IAC1B;;;OAGG;IACH,KAAK,EAAE,KAAK,CAAA;IACZ;;;OAGG;IACH,SAAS,EAAE,gBAAgB,CAAC,WAAW,CAAC,CAAA;CACzC;AAED,UAAU,uBAAwB,SAAQ,kBAAkB;IAC1D,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE;QACR,OAAO,EAAE,cAAc,CAAA;KACxB,CAAA;IACD,kBAAkB,CAAC,EAAE,MAAM,CAAA;CAC5B;AAED,KAAK,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;AAEpC,UAAU,YAAY;IACpB,SAAS,CAAC,EAAE,SAAS,CAAA;IACrB,KAAK,CAAC,EAAE,eAAe,CAAA;CACxB;AAED,UAAU,UAAU;IAClB,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;CACb;AAED,UAAU,aAAa,CAAC,CAAC;IACvB,IAAI,EAAE,CAAC,GAAG,IAAI,CAAA;IACd,KAAK,EAAE,UAAU,GAAG,IAAI,CAAA;CACzB;AAED,MAAM,WAAW,IAAI;IACnB,oBAAoB,EAAE,MAAM,OAAO,CAAA;IACnC,OAAO,CAAC,EAAE;QACR,OAAO,EAAE,cAAc,CAAA;KACxB,CAAA;IACD,KAAK,EAAE,CAAC,CAAC,GAAG,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,KAAK,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAA;IACpF,gBAAgB,EAAE,UAAU,CAAC,kBAAkB,CAAC,CAAA;CACjD;AA8BD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,uBAAuB,GAAG,IAAI,CA2CvE"}
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,CA6DvE"}
@@ -1,6 +1,6 @@
1
- import { PackClient } from '@pack/client';
2
- import { CacheLong, createWithCache } from '@shopify/hydrogen';
3
- const PRODUCTION_ENVIRONMENT = 'production';
1
+ import { PackClient } from "@pack/client";
2
+ import { CacheCustom, createWithCache } from "@shopify/hydrogen";
3
+ const PRODUCTION_ENVIRONMENT = "production";
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
@@ -9,14 +9,14 @@ async function sha256(message) {
9
9
  // encode as UTF-8
10
10
  const messageBuffer = new TextEncoder().encode(message);
11
11
  // hash the message
12
- const hashBuffer = await crypto.subtle.digest('SHA-256', messageBuffer);
12
+ const hashBuffer = await crypto.subtle.digest("SHA-256", messageBuffer);
13
13
  // convert bytes to hex string
14
14
  return Array.from(new Uint8Array(hashBuffer))
15
- .map((b) => b.toString(16).padStart(2, '0'))
16
- .join('');
15
+ .map((b) => b.toString(16).padStart(2, "0"))
16
+ .join("");
17
17
  }
18
18
  /**
19
- * Hash query and its parameters for use as cache key
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
22
  function hashQuery(query, variables) {
@@ -25,20 +25,30 @@ function hashQuery(query, variables) {
25
25
  hash += JSON.stringify(variables);
26
26
  return sha256(hash);
27
27
  }
28
+ // Extends the CacheLong strategy with a stale-if-error policy
29
+ const cacheCustom = CacheCustom({
30
+ maxAge: 3600,
31
+ staleWhileRevalidate: 82800,
32
+ staleIfError: 86400, // 1 day
33
+ });
28
34
  export function createPackClient(options) {
29
35
  const { cache, waitUntil, preview, contentEnvironment, token, apiUrl } = options;
30
- const previewEnabled = !!preview?.session.get('enabled');
31
- const previewEnvironment = preview?.session.get('environment');
36
+ const previewEnabled = !!preview?.session.get("enabled");
37
+ const previewEnvironment = preview?.session.get("environment");
32
38
  const clientContentEnvironment = previewEnvironment || contentEnvironment || PRODUCTION_ENVIRONMENT;
39
+ // Use live API URL if preview mode is enabled and no API URL is provided
40
+ const clientApiUrl = previewEnabled && !apiUrl
41
+ ? "https://apicdn.packdigital.com/graphql"
42
+ : apiUrl;
33
43
  const packClient = new PackClient({
34
- apiUrl,
44
+ apiUrl: clientApiUrl,
35
45
  token,
36
46
  contentEnvironment: clientContentEnvironment,
37
47
  });
38
48
  return {
39
49
  preview,
40
50
  isPreviewModeEnabled: () => previewEnabled,
41
- async query(query, { variables, cache: strategy = CacheLong() } = {}) {
51
+ async query(query, { variables, cache: strategy = cacheCustom } = {}) {
42
52
  const queryHash = await hashQuery(query, variables);
43
53
  const withCache = createWithCache({
44
54
  cache,
@@ -46,15 +56,28 @@ export function createPackClient(options) {
46
56
  });
47
57
  const queryVariables = variables ? { ...variables } : {};
48
58
  if (previewEnabled) {
49
- queryVariables.version = 'CURRENT';
59
+ queryVariables.version = "CURRENT";
50
60
  }
51
61
  else {
52
- queryVariables.version = 'PUBLISHED';
62
+ queryVariables.version = "PUBLISHED";
53
63
  }
54
64
  // Preview mode always bypasses the cache
55
- if (previewEnabled)
56
- return packClient.fetch(query, { variables: queryVariables });
57
- return withCache(queryHash, strategy, () => packClient.fetch(query, { variables: queryVariables }));
65
+ if (previewEnabled) {
66
+ try {
67
+ return await packClient.fetch(query, { variables: queryVariables });
68
+ }
69
+ catch (error) {
70
+ return { error, data: {} };
71
+ }
72
+ }
73
+ return withCache(queryHash, strategy, async () => {
74
+ try {
75
+ return await packClient.fetch(query, { variables: queryVariables });
76
+ }
77
+ catch (error) {
78
+ return { error, data: {} };
79
+ }
80
+ });
58
81
  },
59
82
  isValidEditToken: (token) => packClient.isValidEditToken(token),
60
83
  };
@@ -1,4 +1,4 @@
1
- import { type ActionFunction, type LoaderFunction } from "@shopify/remix-oxygen";
1
+ import { type ActionFunction, type LoaderFunction } from "@remix-run/server-runtime";
2
2
  type JsonFunction = <Data>(data: Data, init?: number | ResponseInit) => TypedResponse<Data>;
3
3
  type RedirectFunction = (url: string, init?: number | ResponseInit) => Response;
4
4
  type TypedResponse<T = unknown> = Omit<Response, "json"> & {
@@ -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,uBAAuB,CAAC;AAI/B,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+BpB,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,cA+BpB,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@pack/hydrogen",
3
3
  "description": "Pack Hydrogen",
4
- "version": "0.0.3",
4
+ "version": "0.0.5",
5
5
  "exports": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
7
7
  "engines": {
@@ -22,11 +22,15 @@
22
22
  "dist"
23
23
  ],
24
24
  "dependencies": {
25
- "@pack/client": "^0.0.5",
25
+ "@pack/client": "^0.0.6",
26
26
  "@shopify/hydrogen": "^2023.10.2"
27
27
  },
28
28
  "devDependencies": {
29
+ "@remix-run/server-runtime": "^2.0.0",
29
30
  "@shopify/oxygen-workers-types": "^4.0.0",
30
31
  "@shopify/remix-oxygen": "^2.0.1"
32
+ },
33
+ "peerDependencies": {
34
+ "react": "^18.0.0"
31
35
  }
32
36
  }