@shopify/cli-hydrogen 5.0.2 → 5.1.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.
Files changed (243) hide show
  1. package/dist/commands/hydrogen/build.js +16 -2
  2. package/dist/commands/hydrogen/codegen-unstable.js +13 -24
  3. package/dist/commands/hydrogen/dev.js +45 -39
  4. package/dist/commands/hydrogen/env/list.js +25 -24
  5. package/dist/commands/hydrogen/env/list.test.js +46 -43
  6. package/dist/commands/hydrogen/env/pull.js +53 -25
  7. package/dist/commands/hydrogen/env/pull.test.js +123 -42
  8. package/dist/commands/hydrogen/generate/route.js +31 -132
  9. package/dist/commands/hydrogen/generate/route.test.js +34 -126
  10. package/dist/commands/hydrogen/init.js +46 -127
  11. package/dist/commands/hydrogen/init.test.js +352 -100
  12. package/dist/commands/hydrogen/link.js +70 -69
  13. package/dist/commands/hydrogen/link.test.js +72 -107
  14. package/dist/commands/hydrogen/list.js +22 -12
  15. package/dist/commands/hydrogen/list.test.js +51 -48
  16. package/dist/commands/hydrogen/login.js +31 -0
  17. package/dist/commands/hydrogen/logout.js +21 -0
  18. package/dist/commands/hydrogen/setup/css.js +79 -0
  19. package/dist/commands/hydrogen/setup/markets.js +53 -0
  20. package/dist/commands/hydrogen/setup.js +133 -0
  21. package/dist/commands/hydrogen/shortcut.js +2 -45
  22. package/dist/commands/hydrogen/shortcut.test.js +10 -37
  23. package/dist/generator-templates/assets/css-modules/package.json +6 -0
  24. package/dist/generator-templates/assets/postcss/package.json +10 -0
  25. package/dist/generator-templates/assets/postcss/postcss.config.js +8 -0
  26. package/dist/generator-templates/assets/tailwind/package.json +13 -0
  27. package/dist/generator-templates/assets/tailwind/postcss.config.js +10 -0
  28. package/dist/generator-templates/assets/tailwind/tailwind.config.js +8 -0
  29. package/dist/generator-templates/assets/tailwind/tailwind.css +3 -0
  30. package/dist/generator-templates/assets/vanilla-extract/package.json +9 -0
  31. package/dist/generator-templates/starter/.eslintignore +5 -0
  32. package/dist/generator-templates/starter/.eslintrc.js +18 -0
  33. package/dist/generator-templates/starter/.graphqlrc.yml +1 -0
  34. package/dist/generator-templates/starter/README.md +40 -0
  35. package/dist/generator-templates/starter/app/components/Aside.tsx +47 -0
  36. package/dist/generator-templates/starter/app/components/Cart.tsx +340 -0
  37. package/dist/generator-templates/starter/app/components/Footer.tsx +99 -0
  38. package/dist/generator-templates/starter/app/components/Header.tsx +178 -0
  39. package/dist/generator-templates/starter/app/components/Layout.tsx +95 -0
  40. package/dist/generator-templates/starter/app/components/Search.tsx +480 -0
  41. package/dist/generator-templates/starter/app/entry.client.tsx +12 -0
  42. package/dist/generator-templates/starter/app/entry.server.tsx +33 -0
  43. package/dist/generator-templates/starter/app/root.tsx +270 -0
  44. package/dist/generator-templates/starter/app/routes/$.tsx +7 -0
  45. package/dist/generator-templates/{routes → starter/app/routes}/[robots.txt].tsx +47 -69
  46. package/dist/generator-templates/starter/app/routes/[sitemap.xml].tsx +174 -0
  47. package/dist/generator-templates/starter/app/routes/_index.tsx +145 -0
  48. package/dist/generator-templates/starter/app/routes/account.$.tsx +9 -0
  49. package/dist/generator-templates/starter/app/routes/account.addresses.tsx +563 -0
  50. package/dist/generator-templates/starter/app/routes/account.orders.$id.tsx +309 -0
  51. package/dist/generator-templates/starter/app/routes/account.orders._index.tsx +196 -0
  52. package/dist/generator-templates/starter/app/routes/account.profile.tsx +289 -0
  53. package/dist/generator-templates/starter/app/routes/account.tsx +203 -0
  54. package/dist/generator-templates/starter/app/routes/account_.activate.$id.$activationToken.tsx +157 -0
  55. package/dist/generator-templates/starter/app/routes/account_.login.tsx +143 -0
  56. package/dist/generator-templates/starter/app/routes/account_.logout.tsx +33 -0
  57. package/dist/generator-templates/starter/app/routes/account_.recover.tsx +124 -0
  58. package/dist/generator-templates/starter/app/routes/account_.register.tsx +207 -0
  59. package/dist/generator-templates/starter/app/routes/account_.reset.$id.$resetToken.tsx +136 -0
  60. package/dist/generator-templates/starter/app/routes/api.predictive-search.tsx +342 -0
  61. package/dist/generator-templates/starter/app/routes/blogs.$blogHandle.$articleHandle.tsx +88 -0
  62. package/dist/generator-templates/starter/app/routes/blogs.$blogHandle._index.tsx +162 -0
  63. package/dist/generator-templates/starter/app/routes/blogs._index.tsx +94 -0
  64. package/dist/generator-templates/starter/app/routes/cart.tsx +104 -0
  65. package/dist/generator-templates/starter/app/routes/collections.$handle.tsx +184 -0
  66. package/dist/generator-templates/starter/app/routes/collections._index.tsx +120 -0
  67. package/dist/generator-templates/starter/app/routes/pages.$handle.tsx +57 -0
  68. package/dist/generator-templates/starter/app/routes/policies.$handle.tsx +94 -0
  69. package/dist/generator-templates/starter/app/routes/policies._index.tsx +63 -0
  70. package/dist/generator-templates/starter/app/routes/products.$handle.tsx +418 -0
  71. package/dist/generator-templates/starter/app/routes/search.tsx +168 -0
  72. package/dist/generator-templates/starter/app/styles/app.css +473 -0
  73. package/dist/generator-templates/starter/app/styles/reset.css +129 -0
  74. package/dist/generator-templates/starter/app/utils.ts +46 -0
  75. package/dist/generator-templates/starter/package.json +43 -0
  76. package/dist/generator-templates/starter/public/favicon.svg +28 -0
  77. package/dist/generator-templates/starter/remix.config.js +26 -0
  78. package/dist/generator-templates/starter/remix.env.d.ts +39 -0
  79. package/dist/generator-templates/starter/server.ts +253 -0
  80. package/dist/generator-templates/starter/storefrontapi.generated.d.ts +1906 -0
  81. package/dist/generator-templates/starter/tsconfig.json +22 -0
  82. package/dist/lib/auth.js +123 -0
  83. package/dist/lib/auth.test.js +157 -0
  84. package/dist/lib/build.js +51 -0
  85. package/dist/lib/check-version.js +3 -3
  86. package/dist/lib/check-version.test.js +24 -0
  87. package/dist/lib/codegen.js +26 -17
  88. package/dist/lib/environment-variables.js +68 -0
  89. package/dist/lib/environment-variables.test.js +147 -0
  90. package/dist/lib/file.js +41 -0
  91. package/dist/lib/file.test.js +69 -0
  92. package/dist/lib/flags.js +39 -2
  93. package/dist/lib/format-code.js +26 -0
  94. package/dist/lib/gid.js +12 -0
  95. package/dist/lib/{graphql.test.js → gid.test.js} +1 -1
  96. package/dist/lib/graphql/admin/client.js +27 -0
  97. package/dist/lib/graphql/admin/client.test.js +51 -0
  98. package/dist/lib/graphql/admin/create-storefront.js +13 -15
  99. package/dist/lib/graphql/admin/create-storefront.test.js +64 -0
  100. package/dist/lib/graphql/admin/fetch-job.js +6 -15
  101. package/dist/lib/graphql/admin/link-storefront.js +7 -11
  102. package/dist/lib/graphql/admin/link-storefront.test.js +38 -0
  103. package/dist/lib/graphql/admin/list-environments.js +2 -2
  104. package/dist/lib/graphql/admin/list-environments.test.js +44 -0
  105. package/dist/lib/graphql/admin/list-storefronts.js +7 -11
  106. package/dist/lib/graphql/admin/list-storefronts.test.js +44 -0
  107. package/dist/lib/graphql/admin/pull-variables.js +3 -3
  108. package/dist/lib/graphql/admin/pull-variables.test.js +37 -0
  109. package/dist/lib/graphql/business-platform/user-account.js +83 -0
  110. package/dist/lib/graphql/business-platform/user-account.test.js +80 -0
  111. package/dist/lib/log.js +185 -9
  112. package/dist/lib/log.test.js +92 -0
  113. package/dist/lib/mini-oxygen.js +19 -9
  114. package/dist/lib/missing-routes.js +0 -2
  115. package/dist/lib/onboarding/common.js +456 -0
  116. package/dist/lib/onboarding/index.js +2 -0
  117. package/dist/lib/onboarding/local.js +229 -0
  118. package/dist/lib/onboarding/remote.js +89 -0
  119. package/dist/lib/remix-version-interop.js +5 -5
  120. package/dist/lib/remix-version-interop.test.js +11 -1
  121. package/dist/lib/render-errors.js +13 -11
  122. package/dist/lib/setups/css/assets.js +89 -0
  123. package/dist/lib/setups/css/css-modules.js +22 -0
  124. package/dist/lib/setups/css/index.js +44 -0
  125. package/dist/lib/setups/css/postcss.js +34 -0
  126. package/dist/lib/setups/css/replacers.js +137 -0
  127. package/dist/lib/setups/css/tailwind.js +54 -0
  128. package/dist/lib/setups/css/vanilla-extract.js +22 -0
  129. package/dist/lib/setups/i18n/domains.test.js +25 -0
  130. package/dist/lib/setups/i18n/index.js +46 -0
  131. package/dist/lib/setups/i18n/replacers.js +227 -0
  132. package/dist/lib/setups/i18n/subdomains.test.js +25 -0
  133. package/dist/lib/setups/i18n/subfolders.test.js +25 -0
  134. package/dist/lib/setups/i18n/templates/domains.js +14 -0
  135. package/dist/lib/setups/i18n/templates/domains.ts +25 -0
  136. package/dist/lib/setups/i18n/templates/subdomains.js +14 -0
  137. package/dist/lib/setups/i18n/templates/subdomains.ts +24 -0
  138. package/dist/lib/setups/i18n/templates/subfolders.js +14 -0
  139. package/dist/lib/setups/i18n/templates/subfolders.ts +28 -0
  140. package/dist/lib/setups/routes/generate.js +244 -0
  141. package/dist/lib/setups/routes/generate.test.js +313 -0
  142. package/dist/lib/shell.js +52 -5
  143. package/dist/lib/shell.test.js +42 -16
  144. package/dist/lib/shopify-config.js +23 -18
  145. package/dist/lib/shopify-config.test.js +63 -73
  146. package/dist/lib/template-downloader.js +9 -7
  147. package/dist/lib/transpile-ts.js +9 -29
  148. package/dist/virtual-routes/routes/index.jsx +40 -19
  149. package/oclif.manifest.json +710 -1
  150. package/package.json +16 -16
  151. package/dist/commands/hydrogen/build.d.ts +0 -23
  152. package/dist/commands/hydrogen/check.d.ts +0 -15
  153. package/dist/commands/hydrogen/codegen-unstable.d.ts +0 -15
  154. package/dist/commands/hydrogen/dev.d.ts +0 -21
  155. package/dist/commands/hydrogen/env/list.d.ts +0 -18
  156. package/dist/commands/hydrogen/env/pull.d.ts +0 -22
  157. package/dist/commands/hydrogen/g.d.ts +0 -10
  158. package/dist/commands/hydrogen/generate/route.d.ts +0 -32
  159. package/dist/commands/hydrogen/generate/route.test.d.ts +0 -1
  160. package/dist/commands/hydrogen/generate/routes.d.ts +0 -16
  161. package/dist/commands/hydrogen/init.d.ts +0 -24
  162. package/dist/commands/hydrogen/init.test.d.ts +0 -1
  163. package/dist/commands/hydrogen/link.d.ts +0 -23
  164. package/dist/commands/hydrogen/link.test.d.ts +0 -1
  165. package/dist/commands/hydrogen/list.d.ts +0 -21
  166. package/dist/commands/hydrogen/list.test.d.ts +0 -1
  167. package/dist/commands/hydrogen/preview.d.ts +0 -17
  168. package/dist/commands/hydrogen/shortcut.d.ts +0 -9
  169. package/dist/commands/hydrogen/shortcut.test.d.ts +0 -1
  170. package/dist/commands/hydrogen/unlink.d.ts +0 -16
  171. package/dist/commands/hydrogen/unlink.test.d.ts +0 -1
  172. package/dist/create-app.d.ts +0 -1
  173. package/dist/generator-templates/routes/[sitemap.xml].tsx +0 -235
  174. package/dist/generator-templates/routes/account/login.tsx +0 -103
  175. package/dist/generator-templates/routes/account/register.tsx +0 -103
  176. package/dist/generator-templates/routes/cart.tsx +0 -81
  177. package/dist/generator-templates/routes/collections/$collectionHandle.tsx +0 -104
  178. package/dist/generator-templates/routes/collections/index.tsx +0 -102
  179. package/dist/generator-templates/routes/graphiql.tsx +0 -10
  180. package/dist/generator-templates/routes/index.tsx +0 -40
  181. package/dist/generator-templates/routes/pages/$pageHandle.tsx +0 -112
  182. package/dist/generator-templates/routes/policies/$policyHandle.tsx +0 -140
  183. package/dist/generator-templates/routes/policies/index.tsx +0 -117
  184. package/dist/generator-templates/routes/products/$productHandle.tsx +0 -92
  185. package/dist/hooks/init.d.ts +0 -5
  186. package/dist/lib/admin-session.d.ts +0 -6
  187. package/dist/lib/admin-session.js +0 -16
  188. package/dist/lib/admin-session.test.d.ts +0 -1
  189. package/dist/lib/admin-session.test.js +0 -27
  190. package/dist/lib/admin-urls.d.ts +0 -8
  191. package/dist/lib/check-lockfile.d.ts +0 -3
  192. package/dist/lib/check-lockfile.test.d.ts +0 -1
  193. package/dist/lib/check-version.d.ts +0 -16
  194. package/dist/lib/check-version.test.d.ts +0 -1
  195. package/dist/lib/codegen.d.ts +0 -26
  196. package/dist/lib/combined-environment-variables.d.ts +0 -8
  197. package/dist/lib/combined-environment-variables.js +0 -57
  198. package/dist/lib/combined-environment-variables.test.d.ts +0 -1
  199. package/dist/lib/combined-environment-variables.test.js +0 -111
  200. package/dist/lib/config.d.ts +0 -20
  201. package/dist/lib/flags.d.ts +0 -27
  202. package/dist/lib/flags.test.d.ts +0 -1
  203. package/dist/lib/graphql/admin/create-storefront.d.ts +0 -17
  204. package/dist/lib/graphql/admin/fetch-job.d.ts +0 -23
  205. package/dist/lib/graphql/admin/link-storefront.d.ts +0 -14
  206. package/dist/lib/graphql/admin/list-environments.d.ts +0 -21
  207. package/dist/lib/graphql/admin/list-storefronts.d.ts +0 -25
  208. package/dist/lib/graphql/admin/pull-variables.d.ts +0 -21
  209. package/dist/lib/graphql.d.ts +0 -21
  210. package/dist/lib/graphql.js +0 -18
  211. package/dist/lib/graphql.test.d.ts +0 -1
  212. package/dist/lib/log.d.ts +0 -6
  213. package/dist/lib/mini-oxygen.d.ts +0 -22
  214. package/dist/lib/missing-routes.d.ts +0 -8
  215. package/dist/lib/missing-routes.test.d.ts +0 -1
  216. package/dist/lib/missing-storefronts.d.ts +0 -5
  217. package/dist/lib/missing-storefronts.js +0 -18
  218. package/dist/lib/process.d.ts +0 -6
  219. package/dist/lib/pull-environment-variables.d.ts +0 -20
  220. package/dist/lib/pull-environment-variables.js +0 -57
  221. package/dist/lib/pull-environment-variables.test.d.ts +0 -1
  222. package/dist/lib/pull-environment-variables.test.js +0 -174
  223. package/dist/lib/remix-version-interop.d.ts +0 -11
  224. package/dist/lib/remix-version-interop.test.d.ts +0 -1
  225. package/dist/lib/render-errors.d.ts +0 -16
  226. package/dist/lib/shell.d.ts +0 -11
  227. package/dist/lib/shell.test.d.ts +0 -1
  228. package/dist/lib/shop.d.ts +0 -7
  229. package/dist/lib/shop.js +0 -32
  230. package/dist/lib/shop.test.d.ts +0 -1
  231. package/dist/lib/shop.test.js +0 -78
  232. package/dist/lib/shopify-config.d.ts +0 -35
  233. package/dist/lib/shopify-config.test.d.ts +0 -1
  234. package/dist/lib/string.d.ts +0 -3
  235. package/dist/lib/string.test.d.ts +0 -1
  236. package/dist/lib/template-downloader.d.ts +0 -6
  237. package/dist/lib/transpile-ts.d.ts +0 -16
  238. package/dist/lib/user-errors.d.ts +0 -9
  239. package/dist/lib/user-errors.js +0 -11
  240. package/dist/lib/virtual-routes.d.ts +0 -7
  241. package/dist/lib/virtual-routes.test.d.ts +0 -1
  242. /package/dist/{commands/hydrogen/env/list.test.d.ts → lib/setups/css/common.js} +0 -0
  243. /package/dist/{commands/hydrogen/env/pull.test.d.ts → lib/setups/i18n/mock-i18n-types.js} +0 -0
@@ -0,0 +1,26 @@
1
+ /** @type {import('@remix-run/dev').AppConfig} */
2
+ module.exports = {
3
+ appDirectory: 'app',
4
+ ignoredRouteFiles: ['**/.*'],
5
+ watchPaths: ['./public', './.env'],
6
+ server: './server.ts',
7
+ /**
8
+ * The following settings are required to deploy Hydrogen apps to Oxygen:
9
+ */
10
+ publicPath: (process.env.HYDROGEN_ASSET_BASE_URL ?? '/') + 'build/',
11
+ assetsBuildDirectory: 'dist/client/build',
12
+ serverBuildPath: 'dist/worker/index.js',
13
+ serverMainFields: ['browser', 'module', 'main'],
14
+ serverConditions: ['worker', process.env.NODE_ENV],
15
+ serverDependenciesToBundle: 'all',
16
+ serverModuleFormat: 'esm',
17
+ serverPlatform: 'neutral',
18
+ serverMinify: process.env.NODE_ENV === 'production',
19
+ future: {
20
+ v2_meta: true,
21
+ v2_headers: true,
22
+ v2_errorBoundary: true,
23
+ v2_routeConvention: true,
24
+ v2_normalizeFormMethod: true,
25
+ },
26
+ };
@@ -0,0 +1,39 @@
1
+ /// <reference types="@remix-run/dev" />
2
+ /// <reference types="@shopify/remix-oxygen" />
3
+ /// <reference types="@shopify/oxygen-workers-types" />
4
+
5
+ // Enhance TypeScript's built-in typings.
6
+ import '@total-typescript/ts-reset';
7
+
8
+ import type {Storefront, HydrogenCart} from '@shopify/hydrogen';
9
+ import type {HydrogenSession} from './server';
10
+
11
+ declare global {
12
+ /**
13
+ * A global `process` object is only available during build to access NODE_ENV.
14
+ */
15
+ const process: {env: {NODE_ENV: 'production' | 'development'}};
16
+
17
+ /**
18
+ * Declare expected Env parameter in fetch handler.
19
+ */
20
+ interface Env {
21
+ SESSION_SECRET: string;
22
+ PUBLIC_STOREFRONT_API_TOKEN: string;
23
+ PRIVATE_STOREFRONT_API_TOKEN: string;
24
+ PUBLIC_STORE_DOMAIN: string;
25
+ PUBLIC_STOREFRONT_ID: string;
26
+ }
27
+ }
28
+
29
+ /**
30
+ * Declare local additions to `AppLoadContext` to include the session utilities we injected in `server.ts`.
31
+ */
32
+ declare module '@shopify/remix-oxygen' {
33
+ export interface AppLoadContext {
34
+ env: Env;
35
+ cart: HydrogenCart;
36
+ storefront: Storefront;
37
+ session: HydrogenSession;
38
+ }
39
+ }
@@ -0,0 +1,253 @@
1
+ // Virtual entry point for the app
2
+ import * as remixBuild from '@remix-run/dev/server-build';
3
+ import {
4
+ cartGetIdDefault,
5
+ cartSetIdDefault,
6
+ createCartHandler,
7
+ createStorefrontClient,
8
+ storefrontRedirect,
9
+ } from '@shopify/hydrogen';
10
+ import {
11
+ createRequestHandler,
12
+ getStorefrontHeaders,
13
+ createCookieSessionStorage,
14
+ type SessionStorage,
15
+ type Session,
16
+ } from '@shopify/remix-oxygen';
17
+
18
+ /**
19
+ * Export a fetch handler in module format.
20
+ */
21
+ export default {
22
+ async fetch(
23
+ request: Request,
24
+ env: Env,
25
+ executionContext: ExecutionContext,
26
+ ): Promise<Response> {
27
+ try {
28
+ /**
29
+ * Open a cache instance in the worker and a custom session instance.
30
+ */
31
+ if (!env?.SESSION_SECRET) {
32
+ throw new Error('SESSION_SECRET environment variable is not set');
33
+ }
34
+
35
+ const waitUntil = (p: Promise<any>) => executionContext.waitUntil(p);
36
+ const [cache, session] = await Promise.all([
37
+ caches.open('hydrogen'),
38
+ HydrogenSession.init(request, [env.SESSION_SECRET]),
39
+ ]);
40
+
41
+ /**
42
+ * Create Hydrogen's Storefront client.
43
+ */
44
+ const {storefront} = createStorefrontClient({
45
+ cache,
46
+ waitUntil,
47
+ i18n: {language: 'EN', country: 'US'},
48
+ publicStorefrontToken: env.PUBLIC_STOREFRONT_API_TOKEN,
49
+ privateStorefrontToken: env.PRIVATE_STOREFRONT_API_TOKEN,
50
+ storeDomain: env.PUBLIC_STORE_DOMAIN,
51
+ storefrontId: env.PUBLIC_STOREFRONT_ID,
52
+ storefrontHeaders: getStorefrontHeaders(request),
53
+ });
54
+
55
+ /*
56
+ * Create a cart handler that will be used to
57
+ * create and update the cart in the session.
58
+ */
59
+ const cart = createCartHandler({
60
+ storefront,
61
+ getCartId: cartGetIdDefault(request.headers),
62
+ setCartId: cartSetIdDefault(),
63
+ cartQueryFragment: CART_QUERY_FRAGMENT,
64
+ });
65
+
66
+ /**
67
+ * Create a Remix request handler and pass
68
+ * Hydrogen's Storefront client to the loader context.
69
+ */
70
+ const handleRequest = createRequestHandler({
71
+ build: remixBuild,
72
+ mode: process.env.NODE_ENV,
73
+ getLoadContext: () => ({session, storefront, env, cart}),
74
+ });
75
+
76
+ const response = await handleRequest(request);
77
+
78
+ if (response.status === 404) {
79
+ /**
80
+ * Check for redirects only when there's a 404 from the app.
81
+ * If the redirect doesn't exist, then `storefrontRedirect`
82
+ * will pass through the 404 response.
83
+ */
84
+ return storefrontRedirect({request, response, storefront});
85
+ }
86
+
87
+ return response;
88
+ } catch (error) {
89
+ // eslint-disable-next-line no-console
90
+ console.error(error);
91
+ return new Response('An unexpected error occurred', {status: 500});
92
+ }
93
+ },
94
+ };
95
+
96
+ /**
97
+ * This is a custom session implementation for your Hydrogen shop.
98
+ * Feel free to customize it to your needs, add helper methods, or
99
+ * swap out the cookie-based implementation with something else!
100
+ */
101
+ export class HydrogenSession {
102
+ constructor(
103
+ private sessionStorage: SessionStorage,
104
+ private session: Session,
105
+ ) {}
106
+
107
+ static async init(request: Request, secrets: string[]) {
108
+ const storage = createCookieSessionStorage({
109
+ cookie: {
110
+ name: 'session',
111
+ httpOnly: true,
112
+ path: '/',
113
+ sameSite: 'lax',
114
+ secrets,
115
+ },
116
+ });
117
+
118
+ const session = await storage.getSession(request.headers.get('Cookie'));
119
+
120
+ return new this(storage, session);
121
+ }
122
+
123
+ has(key: string) {
124
+ return this.session.has(key);
125
+ }
126
+
127
+ get(key: string) {
128
+ return this.session.get(key);
129
+ }
130
+
131
+ destroy() {
132
+ return this.sessionStorage.destroySession(this.session);
133
+ }
134
+
135
+ flash(key: string, value: any) {
136
+ this.session.flash(key, value);
137
+ }
138
+
139
+ unset(key: string) {
140
+ this.session.unset(key);
141
+ }
142
+
143
+ set(key: string, value: any) {
144
+ this.session.set(key, value);
145
+ }
146
+
147
+ commit() {
148
+ return this.sessionStorage.commitSession(this.session);
149
+ }
150
+ }
151
+
152
+ // NOTE: https://shopify.dev/docs/api/storefront/latest/queries/cart
153
+ const CART_QUERY_FRAGMENT = `#graphql
154
+ fragment Money on MoneyV2 {
155
+ currencyCode
156
+ amount
157
+ }
158
+ fragment CartLine on CartLine {
159
+ id
160
+ quantity
161
+ attributes {
162
+ key
163
+ value
164
+ }
165
+ cost {
166
+ totalAmount {
167
+ ...Money
168
+ }
169
+ amountPerQuantity {
170
+ ...Money
171
+ }
172
+ compareAtAmountPerQuantity {
173
+ ...Money
174
+ }
175
+ }
176
+ merchandise {
177
+ ... on ProductVariant {
178
+ id
179
+ availableForSale
180
+ compareAtPrice {
181
+ ...Money
182
+ }
183
+ price {
184
+ ...Money
185
+ }
186
+ requiresShipping
187
+ title
188
+ image {
189
+ id
190
+ url
191
+ altText
192
+ width
193
+ height
194
+
195
+ }
196
+ product {
197
+ handle
198
+ title
199
+ id
200
+ }
201
+ selectedOptions {
202
+ name
203
+ value
204
+ }
205
+ }
206
+ }
207
+ }
208
+ fragment CartApiQuery on Cart {
209
+ id
210
+ checkoutUrl
211
+ totalQuantity
212
+ buyerIdentity {
213
+ countryCode
214
+ customer {
215
+ id
216
+ email
217
+ firstName
218
+ lastName
219
+ displayName
220
+ }
221
+ email
222
+ phone
223
+ }
224
+ lines(first: $numCartLines) {
225
+ nodes {
226
+ ...CartLine
227
+ }
228
+ }
229
+ cost {
230
+ subtotalAmount {
231
+ ...Money
232
+ }
233
+ totalAmount {
234
+ ...Money
235
+ }
236
+ totalDutyAmount {
237
+ ...Money
238
+ }
239
+ totalTaxAmount {
240
+ ...Money
241
+ }
242
+ }
243
+ note
244
+ attributes {
245
+ key
246
+ value
247
+ }
248
+ discountCodes {
249
+ code
250
+ applicable
251
+ }
252
+ }
253
+ ` as const;