@shopify/cli 3.90.1 → 3.91.1

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 (159) hide show
  1. package/dist/{acorn-45LE5Z2A.js → acorn-WDTBS4B3.js} +2 -2
  2. package/dist/{angular-Z5FPQPLR.js → angular-WLPEGHXZ.js} +4 -4
  3. package/dist/assets/hydrogen/starter/.graphqlrc.ts +4 -2
  4. package/dist/assets/hydrogen/starter/CHANGELOG.md +172 -0
  5. package/dist/assets/hydrogen/starter/app/components/CartLineItem.tsx +67 -38
  6. package/dist/assets/hydrogen/starter/app/components/CartMain.tsx +45 -7
  7. package/dist/assets/hydrogen/starter/app/components/CartSummary.tsx +20 -38
  8. package/dist/assets/hydrogen/starter/app/components/MockShopNotice.tsx +20 -0
  9. package/dist/assets/hydrogen/starter/app/entry.client.tsx +2 -3
  10. package/dist/assets/hydrogen/starter/app/lib/fragments.ts +8 -0
  11. package/dist/assets/hydrogen/starter/app/routes/_index.tsx +4 -5
  12. package/dist/assets/hydrogen/starter/app/routes/account.addresses.tsx +12 -12
  13. package/dist/assets/hydrogen/starter/app/routes/account.tsx +4 -7
  14. package/dist/assets/hydrogen/starter/app/routes/account_.login.tsx +10 -0
  15. package/dist/assets/hydrogen/starter/app/routes/blogs.$blogHandle._index.tsx +2 -9
  16. package/dist/assets/hydrogen/starter/app/routes/blogs._index.tsx +1 -4
  17. package/dist/assets/hydrogen/starter/app/routes/cart.tsx +3 -11
  18. package/dist/assets/hydrogen/starter/app/routes/collections.all.tsx +1 -3
  19. package/dist/assets/hydrogen/starter/app/routes/pages.$handle.tsx +2 -8
  20. package/dist/assets/hydrogen/starter/app/routes/policies.$handle.tsx +1 -4
  21. package/dist/assets/hydrogen/starter/app/routes/policies._index.tsx +1 -1
  22. package/dist/assets/hydrogen/starter/app/routes/products.$handle.tsx +2 -9
  23. package/dist/assets/hydrogen/starter/app/routes/search.tsx +18 -12
  24. package/dist/assets/hydrogen/starter/app/styles/app.css +72 -1
  25. package/dist/assets/hydrogen/starter/eslint.config.js +1 -0
  26. package/dist/assets/hydrogen/starter/guides/predictiveSearch/predictiveSearch.md +3 -3
  27. package/dist/assets/hydrogen/starter/guides/search/search.md +1 -1
  28. package/dist/assets/hydrogen/starter/package.json +14 -13
  29. package/dist/assets/hydrogen/starter/server.ts +5 -7
  30. package/dist/assets/hydrogen/starter/storefrontapi.generated.d.ts +89 -0
  31. package/dist/{babel-TRRZ6QQY.js → babel-LQYCV4NA.js} +2 -7
  32. package/dist/{brotli-2OKV26Y6.js → brotli-6CC7WD4Z.js} +1 -2
  33. package/dist/{chunk-SGU7BPE4.js → chunk-2EQNSO7C.js} +3 -3
  34. package/dist/{chunk-PAU7LKSJ.js → chunk-2YAGQHB2.js} +3 -3
  35. package/dist/{chunk-OZPZBNSB.js → chunk-463KYFYO.js} +2 -2
  36. package/dist/{chunk-IEPPQIPW.js → chunk-54FE2FGU.js} +2 -2
  37. package/dist/{chunk-EFOOQV72.js → chunk-56ELYGPH.js} +2 -2
  38. package/dist/{chunk-6ONJ77I7.js → chunk-5JYQJQ2E.js} +2 -2
  39. package/dist/chunk-5ZDTGPNX.js +28 -0
  40. package/dist/{chunk-6ONJEX7Y.js → chunk-6NVYATES.js} +2 -2
  41. package/dist/chunk-77BDQRQW.js +90 -0
  42. package/dist/{chunk-HMDWNGIV.js → chunk-A27P5CF7.js} +211 -103
  43. package/dist/{chunk-4BBQTKIZ.js → chunk-A2CZGTAP.js} +27763 -25681
  44. package/dist/{chunk-TIYR37XP.js → chunk-ATQVKUJC.js} +4 -4
  45. package/dist/{chunk-3GXB4ZRP.js → chunk-CE4S2SGM.js} +10 -10
  46. package/dist/{chunk-WC5EDB4Z.js → chunk-CEUL3KX5.js} +1190 -144
  47. package/dist/{chunk-2TMOMDXO.js → chunk-DR5R5UTE.js} +6 -6
  48. package/dist/{chunk-IYNLJNFT.js → chunk-DUNGALP3.js} +3 -3
  49. package/dist/{chunk-TGDLXF4K.js → chunk-E44JKFB6.js} +2 -2
  50. package/dist/{chunk-5SJCPOBW.js → chunk-E4GUDBAR.js} +417 -387
  51. package/dist/{chunk-C5STUYKR.js → chunk-FKP67FZI.js} +3 -3
  52. package/dist/{chunk-ZZNQWJUM.js → chunk-HAG3HJ2V.js} +10 -10
  53. package/dist/{chunk-PUMWL67K.js → chunk-HOIU6WRE.js} +3 -3
  54. package/dist/{chunk-GPKHDSF5.js → chunk-HTGTTXQL.js} +24 -26
  55. package/dist/{chunk-3VKS4374.js → chunk-I23GZAC4.js} +15 -17
  56. package/dist/chunk-ITTNM7I4.js +23 -0
  57. package/dist/chunk-IUKBWIQY.js +39 -0
  58. package/dist/{chunk-H3SSAPRP.js → chunk-K45ALTZ7.js} +3 -3
  59. package/dist/chunk-K52ORY26.js +78 -0
  60. package/dist/{prettier-2ITB6I34.js → chunk-KV3364EL.js} +43 -42
  61. package/dist/{chunk-4TOZOCIV.js → chunk-LFMBIRVC.js} +3 -3
  62. package/dist/{chunk-OTD3FRPC.js → chunk-NYP3N62G.js} +2 -2
  63. package/dist/chunk-OIUDJFV2.js +309 -0
  64. package/dist/{chunk-HV4MPORZ.js → chunk-PCNR4TMY.js} +5 -5
  65. package/dist/{chunk-SG2A4CTL.js → chunk-QFO7QSBW.js} +4 -4
  66. package/dist/{chunk-UHBL2XEG.js → chunk-R622IPZN.js} +3 -3
  67. package/dist/{chunk-X7CGUWBF.js → chunk-RKFRXKFE.js} +3 -3
  68. package/dist/{chunk-WYVKPOTO.js → chunk-RLJICWO6.js} +4 -4
  69. package/dist/chunk-SJXHR42U.js +36 -0
  70. package/dist/{chunk-CYPBBNM2.js → chunk-SUFC4ISB.js} +6 -6
  71. package/dist/{chunk-3AF66HDC.js → chunk-SVV4RJVX.js} +4 -4
  72. package/dist/chunk-TH7ZYYDZ.js +20868 -0
  73. package/dist/{chunk-J2CFMYG5.js → chunk-TY5YKCUW.js} +5 -5
  74. package/dist/{chunk-XD3LXUGW.js → chunk-VBBBCVMH.js} +2 -2
  75. package/dist/chunk-VRUH5BDH.js +51 -0
  76. package/dist/{chunk-7FIBLDM2.js → chunk-VUYVHHZY.js} +3 -3
  77. package/dist/{chunk-KC6KOCJ5.js → chunk-WDYPK6VH.js} +7 -7
  78. package/dist/{chunk-JRFL7VGC.js → chunk-XDCBS7SY.js} +3 -3
  79. package/dist/{chunk-6MYWZ7MP.js → chunk-Z5FK5H2M.js} +8 -27
  80. package/dist/{chunk-RHYTM4FE.js → chunk-ZLV2A27J.js} +2 -2
  81. package/dist/cli/commands/auth/login.js +14 -16
  82. package/dist/cli/commands/auth/login.test.js +16 -18
  83. package/dist/cli/commands/auth/logout.js +14 -16
  84. package/dist/cli/commands/auth/logout.test.js +17 -19
  85. package/dist/cli/commands/cache/clear.js +15 -16
  86. package/dist/cli/commands/debug/command-flags.js +14 -16
  87. package/dist/cli/commands/docs/generate.js +14 -16
  88. package/dist/cli/commands/docs/generate.test.js +15 -17
  89. package/dist/cli/commands/doctor-release/doctor-release.d.ts +6 -0
  90. package/dist/cli/commands/doctor-release/doctor-release.js +27 -0
  91. package/dist/cli/commands/doctor-release/theme/index.d.ts +14 -0
  92. package/dist/cli/commands/doctor-release/theme/index.js +33 -0
  93. package/dist/cli/commands/help.js +14 -16
  94. package/dist/cli/commands/kitchen-sink/async.js +15 -17
  95. package/dist/cli/commands/kitchen-sink/async.test.js +16 -18
  96. package/dist/cli/commands/kitchen-sink/index.js +17 -19
  97. package/dist/cli/commands/kitchen-sink/index.test.js +20 -22
  98. package/dist/cli/commands/kitchen-sink/prompts.js +15 -17
  99. package/dist/cli/commands/kitchen-sink/prompts.test.js +16 -18
  100. package/dist/cli/commands/kitchen-sink/static.js +15 -17
  101. package/dist/cli/commands/kitchen-sink/static.test.js +16 -18
  102. package/dist/cli/commands/notifications/generate.js +15 -17
  103. package/dist/cli/commands/notifications/list.js +15 -17
  104. package/dist/cli/commands/search.js +15 -17
  105. package/dist/cli/commands/upgrade.js +15 -17
  106. package/dist/cli/commands/upgrade.test.js +1 -1
  107. package/dist/cli/commands/version.js +15 -17
  108. package/dist/cli/commands/version.test.js +16 -18
  109. package/dist/cli/services/commands/notifications.js +14 -14
  110. package/dist/cli/services/commands/search.js +8 -9
  111. package/dist/cli/services/commands/search.test.js +9 -10
  112. package/dist/cli/services/commands/version.js +9 -10
  113. package/dist/cli/services/commands/version.test.js +11 -12
  114. package/dist/cli/services/doctor-release/context.d.ts +16 -0
  115. package/dist/cli/services/doctor-release/context.js +9 -0
  116. package/dist/cli/services/doctor-release/theme/runner.d.ts +7 -0
  117. package/dist/cli/services/doctor-release/theme/runner.js +24 -0
  118. package/dist/cli/services/doctor-release/theme/tests/init.d.ts +11 -0
  119. package/dist/cli/services/doctor-release/theme/tests/init.js +21 -0
  120. package/dist/cli/services/doctor-release/theme/tests/push.d.ts +10 -0
  121. package/dist/cli/services/doctor-release/theme/tests/push.js +21 -0
  122. package/dist/cli/services/kitchen-sink/async.js +8 -9
  123. package/dist/cli/services/kitchen-sink/prompts.js +8 -9
  124. package/dist/cli/services/kitchen-sink/static.js +8 -9
  125. package/dist/cli/services/upgrade.js +9 -10
  126. package/dist/cli/services/upgrade.test.js +11 -12
  127. package/dist/{custom-oclif-loader-RINU7HR3.js → custom-oclif-loader-AAJZ7WBW.js} +8 -9
  128. package/dist/{del-E4LJOSMR.js → del-63DSU6FP.js} +7 -7
  129. package/dist/{devtools-D47L6HIC.js → devtools-4MXU7BNJ.js} +2 -2
  130. package/dist/{devtools-2SG3BFWJ.js → devtools-BAOTGU3O.js} +2 -2
  131. package/dist/{error-handler-CWNDOJLB.js → error-handler-GSQRFK57.js} +12 -14
  132. package/dist/{estree-PY6WKTNG.js → estree-U57GTUKI.js} +14 -35
  133. package/dist/{flow-YN54TSCB.js → flow-CBPGBIW5.js} +2 -4
  134. package/dist/{glimmer-RMPUUUDS.js → glimmer-VWCK7UCR.js} +2 -6
  135. package/dist/{graphql-PPLVYWBL.js → graphql-2HHXB4VZ.js} +3 -5
  136. package/dist/hooks/postrun.js +13 -13
  137. package/dist/hooks/prerun.js +14 -14
  138. package/dist/{html-3U6QZZZ4.js → html-ST4I6M3K.js} +4 -6
  139. package/dist/index.js +143537 -8573
  140. package/dist/{lib-XGN4IWQ3.js → lib-HAW436ZI.js} +3 -4
  141. package/dist/{local-FQVEYJ4K.js → local-GOP2BHNI.js} +10 -11
  142. package/dist/{markdown-RHRQTUMC.js → markdown-NVTT3U3H.js} +4 -13
  143. package/dist/{meriyah-7MIMHTWQ.js → meriyah-H6RUUN2F.js} +2 -9
  144. package/dist/{morph-37GC7LQM.js → morph-7WAMUK6I.js} +68 -143
  145. package/dist/{multipart-parser-IYYNISJK.js → multipart-parser-WKKMXACL.js} +2 -2
  146. package/dist/{node-package-manager-XIE2HZEQ.js → node-package-manager-W4R4DUTE.js} +9 -10
  147. package/dist/{npa-E675GQOI.js → npa-GRSJKUWS.js} +5 -7
  148. package/dist/{postcss-MSOPGY7M.js → postcss-LKRKUSYR.js} +4 -6
  149. package/dist/prettier-5ODD6NHV.js +36 -0
  150. package/dist/{source-map-UFUVQCYE.js → source-map-KSW2YKNC.js} +2 -2
  151. package/dist/tsconfig.tsbuildinfo +1 -1
  152. package/dist/{ui-UAEFJEFY.js → ui-VRLRLHWH.js} +8 -9
  153. package/dist/{workerd-EPURL4IC.js → workerd-AO3T6IIJ.js} +19 -22
  154. package/dist/{yaml-6GALFXQY.js → yaml-54MHMX7H.js} +6 -9
  155. package/oclif.manifest.json +128 -9
  156. package/package.json +8 -8
  157. package/dist/chunk-DOZD5WAI.js +0 -153039
  158. package/dist/chunk-EZQWZ57B.js +0 -53
  159. package/dist/chunk-W65CJE3X.js +0 -2238
@@ -2931,7 +2931,7 @@ var Ii, Be, Ni, Li, Ri, Vi, ot, Oi, Bi, ut, Qt, $e, Pi, Di, dt, Mi, mt, De, Me,
2931
2931
  this._curlyBrace && (s.push(this.translate(this._curlyBrace, t)), this._curlyBrace = null), s.push(this.translate(e, t));
2932
2932
  } };
2933
2933
  Ci = rt, Ti = [3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17];
2934
- Q = Symbol("espree's internal state"), at = Symbol("espree's esprimaFinishNode");
2934
+ Q = /* @__PURE__ */ Symbol("espree's internal state"), at = /* @__PURE__ */ Symbol("espree's esprimaFinishNode");
2935
2935
  nt = () => (e) => {
2936
2936
  let t = Object.assign({}, e.acorn.tokTypes);
2937
2937
  return e.acornJsx && Object.assign(t, e.acornJsx.tokTypes), class extends e {
@@ -3013,4 +3013,4 @@ export {
3013
3013
  Pi as default,
3014
3014
  dr as parsers
3015
3015
  };
3016
- //# sourceMappingURL=acorn-45LE5Z2A.js.map
3016
+ //# sourceMappingURL=acorn-WDTBS4B3.js.map
@@ -246,7 +246,7 @@ function pt(e22) {
246
246
  return delete n.comments, e22 === ht && n.type !== "NGChainedExpression" && (n = { ...n, type: "NGChainedExpression", expressions: [n] }), { type: "NGRoot", node: n, comments: s };
247
247
  }, locStart: en, locEnd: Os };
248
248
  }
249
- var Hs, rn, an, ft, U, ze, dt, x, Fs, tn, ei, fn, dn, mn, L, gn, vn, xn, wn, Sn, En, yn, _n, u, _, Je, gt, vt, xt, wt, Ye, St, Et, w, yt, _t, Ct, kt, Qe, Tt, bt, ti, Cn, a, l, At, ni, kn, Y, v, Pe, A, Q, It, Le, Me, X, ce, ue, he, be, Re, k, $e, De, Vt, y, J, K, Z, ee, Be, Oe, pe, fe, de, me, Fe, Ve, B, F, ge, He, Nt, Tn, bn, M, An, ye, as, Xe, Gs, Xs, Js, os, Ys, ls, Qs, Ht, Ks, In, cs, Ae, q, Nn, us, re, hs, ke, Ke, j, Te, Zs, b, er, Pn, tr, nr, Ut, sr, Wt, le, mt, G, rr, ot, ps, ir, ar, or, lr, cr, ur, hr, fs, Ze, Ln, ie, ds, Pt, et, tt, nt, st, Mt, Rn, $n, Dn, fr, ms, dr, Rt, mr, gr, qt, ii, ai, vr, oi, xr, li, gs, ci, ui, wr, Sr, Er, hi, pi, fi, f, ve, Bn, On, Fn, R, Vn, Hn, Un, Wn, $, qn, jn, yr, vs, We, jt, di, mi, gi, rt, xe, zn, Gn, Xn, Jn, $t, vi, Yn, Qn, xi, wi, Si, Ei, yi, _r, Cr, Kn, xs, _i, Ci, p, V, kr, Ue, I, Ie, Ge, Dt, Bt, Ot, we, ae, ts, z, Ft, Or, ki, Ti, bi, Ai, Ii, Ni, Pi, Li, Mi, Ri, $i, ns, Di, Bi, ss, rs, ws, Oi, Fi, is, Vi, Hr, Ss, Wr, Es, ys, _s, Cs, jr, lt, ks, Gt, Se, se, m, Ps, T, Xt, Jt, Yt, Ls, Ms, Rs, $s, Ns, zr, Qt, Kt, ht, Zt, Gr, Xr, Jr, Yr, init_angular = __esm({
249
+ var Hs, rn, an, ft, U, ze, dt, x, Fs, tn, ei, fn, dn, mn, L, gn, vn, xn, wn, Sn, En, yn, _n, u, _, Je, gt, vt, xt, wt, Ye, St, Et, w, yt, _t, Ct, kt, Qe, Tt, bt, ti, Cn, a, l, At, ni, kn, Y, v, Pe, A, Q, It, Le, Me, X, ce, ue, he, be, Re, k, $e, De, Vt, y, J, K, Z, ee, Be, Oe, pe, fe, de, me, Fe, Ve, B, F, ge, He, Nt, Tn, bn, M, An, ye, as, Xe, Gs, Xs, Js, os, Ys, ls, Qs, Ht, Ks, In, cs, Ae, q, Nn, us, re, hs, ke, Ke, j, Te, Zs, b, er, Pn, tr, nr, Ut, sr, Wt, le, mt, G, rr, ot, ps, ir, ar, or, lr, cr, ur, hr, fs, Ze, Ln, ie, ds, Pt, et, tt, nt, st, Mt, Rn, $n, Dn, fr, ms, dr, Rt, mr, gr, qt, ii, ai, vr, oi, xr, li, gs, ci, ui, wr, Sr, Er, hi, pi, fi, f, ve, Bn, On, Fn, R, Vn, Hn, Un, Wn, $, qn, jn, yr, vs, We, jt, di, mi, gi, rt, xe, zn, Gn, Xn, Jn, $t, vi, Yn, Qn, xi, wi, Si, Ei, yi, _r, Cr, Kn, xs, _i, Ci, p, V, kr, Ue, I, Ie, Ge, Dt, Bt, Ot, we, ae, ts, z, Ft, Or, ki, Ti, bi, Ai, Ii, Ni, Pi, Li, Mi, Ri, $i, ns, Di, ss, rs, ws, Oi, Fi, is, Vi, Hr, Ss, Wr, Es, ys, _s, Cs, jr, lt, ks, Gt, Se, se, m, Ps, T, Xt, Jt, Yt, Ls, Ms, Rs, $s, Ns, zr, Qt, Kt, ht, Zt, Gr, Xr, Jr, Yr, init_angular = __esm({
250
250
  "../../node_modules/.pnpm/prettier@3.7.4/node_modules/prettier/plugins/angular.mjs"() {
251
251
  init_cjs_shims();
252
252
  Hs = Object.defineProperty, rn = (e22) => {
@@ -1432,7 +1432,7 @@ var Hs, rn, an, ft, U, ze, dt, x, Fs, tn, ei, fn, dn, mn, L, gn, vn, xn, wn, Sn,
1432
1432
  (function(e22) {
1433
1433
  e22[e22.NgTemplate = 0] = "NgTemplate", e22[e22.Structural = 1] = "Structural", e22[e22.Block = 2] = "Block";
1434
1434
  })(jn || (jn = {}));
1435
- yr = Symbol("ConsumesSlot"), vs = Symbol("DependsOnSlotContext"), We = Symbol("ConsumesVars"), jt = Symbol("UsesVarOffset"), di = { [yr]: !0, numSlotsUsed: 1 }, mi = { [vs]: !0 }, gi = { [We]: !0 }, rt = class {
1435
+ yr = /* @__PURE__ */ Symbol("ConsumesSlot"), vs = /* @__PURE__ */ Symbol("DependsOnSlotContext"), We = /* @__PURE__ */ Symbol("ConsumesVars"), jt = /* @__PURE__ */ Symbol("UsesVarOffset"), di = { [yr]: !0, numSlotsUsed: 1 }, mi = { [vs]: !0 }, gi = { [We]: !0 }, rt = class {
1436
1436
  strings;
1437
1437
  expressions;
1438
1438
  i18nPlaceholders;
@@ -2549,7 +2549,7 @@ var Hs, rn, an, ft, U, ze, dt, x, Fs, tn, ei, fn, dn, mn, L, gn, vn, xn, wn, Sn,
2549
2549
  (function(e22) {
2550
2550
  e22[e22.None = 0] = "None", e22[e22.ViewContextRead = 1] = "ViewContextRead", e22[e22.ViewContextWrite = 2] = "ViewContextWrite", e22[e22.SideEffectful = 4] = "SideEffectful";
2551
2551
  })(ns || (ns = {}));
2552
- Di = /* @__PURE__ */ new Map([[M.Property, R.Property], [M.TwoWay, R.TwoWayProperty], [M.Attribute, R.Attribute], [M.Class, R.ClassName], [M.Style, R.StyleProperty], [M.LegacyAnimation, R.LegacyAnimation], [M.Animation, R.Animation]]), Bi = Symbol("queryAdvancePlaceholder");
2552
+ Di = /* @__PURE__ */ new Map([[M.Property, R.Property], [M.TwoWay, R.TwoWayProperty], [M.Attribute, R.Attribute], [M.Class, R.ClassName], [M.Style, R.StyleProperty], [M.LegacyAnimation, R.LegacyAnimation], [M.Animation, R.Animation]]);
2553
2553
  (function(e22) {
2554
2554
  e22[e22.NG_CONTENT = 0] = "NG_CONTENT", e22[e22.STYLE = 1] = "STYLE", e22[e22.STYLESHEET = 2] = "STYLESHEET", e22[e22.SCRIPT = 3] = "SCRIPT", e22[e22.OTHER = 4] = "OTHER";
2555
2555
  })(ss || (ss = {}));
@@ -2788,4 +2788,4 @@ export {
2788
2788
  Fs as default,
2789
2789
  tn as parsers
2790
2790
  };
2791
- //# sourceMappingURL=angular-Z5FPQPLR.js.map
2791
+ //# sourceMappingURL=angular-WLPEGHXZ.js.map
@@ -6,7 +6,7 @@ import {getSchema} from '@shopify/hydrogen-codegen';
6
6
  * @see https://the-guild.dev/graphql/config/docs/user/usage
7
7
  * @type {IGraphQLConfig}
8
8
  */
9
- export default {
9
+ const graphqlConfig: IGraphQLConfig = {
10
10
  projects: {
11
11
  default: {
12
12
  schema: getSchema('storefront'),
@@ -24,4 +24,6 @@ export default {
24
24
 
25
25
  // Add your own GraphQL projects here for CMS, Shopify Admin API, etc.
26
26
  },
27
- } as IGraphQLConfig;
27
+ };
28
+
29
+ export default graphqlConfig;
@@ -1,5 +1,177 @@
1
1
  # skeleton
2
2
 
3
+ ## 2026.1.1
4
+
5
+ ### Patch Changes
6
+
7
+ - Added a notice with relevant information on how to link a store in case there is no store linked yet ([#3448](https://github.com/Shopify/hydrogen/pull/3448)) by [@fredericoo](https://github.com/fredericoo)
8
+
9
+ - Fixed an issue where users without addresses could not add the first one ([#3456](https://github.com/Shopify/hydrogen/pull/3456)) by [@fredericoo](https://github.com/fredericoo)
10
+
11
+ - Updated dependencies [[`ff93a1daf2207e52e1f8331f9ff2ccd1f9b7fed6`](https://github.com/Shopify/hydrogen/commit/ff93a1daf2207e52e1f8331f9ff2ccd1f9b7fed6)]:
12
+ - @shopify/hydrogen@2026.1.1
13
+
14
+ ## 2026.1.0
15
+
16
+ ### Major Changes
17
+
18
+ - Updated to Storefront API 2026-01 and Customer Account API 2026-01. ([#3434](https://github.com/Shopify/hydrogen/pull/3434)) by [@kdaviduik](https://github.com/kdaviduik)
19
+
20
+ This is a quarterly API version update aligned with Shopify's API release schedule.
21
+
22
+ **Action Required**: The `cartDiscountCodesUpdate` mutation now requires the `discountCodes` argument. If you have custom cart discount code logic, verify your mutations include this field.
23
+
24
+ Review the changelogs for other changes that may affect your storefront:
25
+ - [Storefront API 2026-01 changelog](https://shopify.dev/changelog?filter=api&api_version=2026-01&api_type=storefront-graphql)
26
+ - [Customer Account API 2026-01 changelog](https://shopify.dev/changelog?filter=api&api_version=2026-01&api_type=customer-account-graphql)
27
+
28
+ ### Patch Changes
29
+
30
+ - Updated dependencies [[`d46c8864aea059cac7dda4871a565f76a04b1495`](https://github.com/Shopify/hydrogen/commit/d46c8864aea059cac7dda4871a565f76a04b1495)]:
31
+ - @shopify/hydrogen@2026.0.0
32
+
33
+ ## 2025.10.1
34
+
35
+ ### Major Changes
36
+
37
+ - Update Storefront API and Customer Account API to version 2025-10 ([#3430](https://github.com/Shopify/hydrogen/pull/3430)) by [@kdaviduik](https://github.com/kdaviduik)
38
+
39
+ ### Patch Changes
40
+
41
+ - Add support for Bun's text-based lockfile (`bun.lock`) introduced in Bun 1.2, and npm's shrinkwrap lockfile (`npm-shrinkwrap.json`), as alternatives to their respective primary lockfiles (`bun.lockb` and `package-lock.json`). ([#3430](https://github.com/Shopify/hydrogen/pull/3430)) by [@kdaviduik](https://github.com/kdaviduik)
42
+
43
+ - Add `cartGiftCardCodesAdd` mutation ([#3430](https://github.com/Shopify/hydrogen/pull/3430)) by [@kdaviduik](https://github.com/kdaviduik)
44
+
45
+ ## New Feature: cartGiftCardCodesAdd
46
+
47
+ The skeleton template has been updated to use the new `cartGiftCardCodesAdd` mutation:
48
+ - Removed `UpdateGiftCardForm` component from `CartSummary.tsx`
49
+ - Added `AddGiftCardForm` component using `CartForm.ACTIONS.GiftCardCodesAdd`
50
+
51
+ If you customized the gift card form in your project, you may want to migrate to the new `Add` action for simpler code.
52
+
53
+ ## Usage
54
+
55
+ ```typescript
56
+ import {CartForm} from '@shopify/hydrogen';
57
+
58
+ <CartForm action={CartForm.ACTIONS.GiftCardCodesAdd} inputs={{giftCardCodes: ['CODE1', 'CODE2']}}>
59
+ <button>Add Gift Cards</button>
60
+ </CartForm>
61
+ ```
62
+
63
+ Or with createCartHandler:
64
+
65
+ ```typescript
66
+ const cart = createCartHandler({storefront, getCartId, setCartId});
67
+ await cart.addGiftCardCodes(['SUMMER2025', 'WELCOME10']);
68
+ ```
69
+
70
+ - Add support for nested cart line items (warranties, gift wrapping, etc.) ([#3430](https://github.com/Shopify/hydrogen/pull/3430)) by [@kdaviduik](https://github.com/kdaviduik)
71
+
72
+ Storefront API 2025-10 introduces `parentRelationship` on cart line items, enabling parent-child relationships for add-ons. This update displays nested line items in the cart.
73
+
74
+ ### Changes
75
+ - Updates GraphQL fragments to include `parentRelationship` and `lineComponents` fields
76
+ - Updates `CartMain` and `CartLineItem` to render child line items with visual hierarchy
77
+
78
+ ### Note
79
+
80
+ This update focuses on **displaying** nested line items. To add both a product and its child (e.g., warranty) in a single action:
81
+
82
+ ```tsx
83
+ <AddToCartButton
84
+ lines={[
85
+ {merchandiseId: 'gid://shopify/ProductVariant/laptop-456', quantity: 1},
86
+ {
87
+ merchandiseId: 'gid://shopify/ProductVariant/warranty-123',
88
+ quantity: 1,
89
+ parent: {merchandiseId: 'gid://shopify/ProductVariant/laptop-456'},
90
+ },
91
+ ]}
92
+ >
93
+ Add to Cart with Warranty
94
+ </AddToCartButton>
95
+ ```
96
+
97
+ - Updated dependencies [[`722915130410086bc7af22215ba57ee77aa14156`](https://github.com/Shopify/hydrogen/commit/722915130410086bc7af22215ba57ee77aa14156)]:
98
+ - @shopify/hydrogen@2025.10.1
99
+
100
+ ## 2025.10.0
101
+
102
+ ### Patch Changes
103
+
104
+ - Updated dependencies [[`cd653456fbd1e7e1ab1f6fecff04c89a74b6cad9`](https://github.com/Shopify/hydrogen/commit/cd653456fbd1e7e1ab1f6fecff04c89a74b6cad9), [`24d26ad94e90ab0a859c274838f7f31e75a7808c`](https://github.com/Shopify/hydrogen/commit/24d26ad94e90ab0a859c274838f7f31e75a7808c), [`13a6f8987ea20d33a30a9c0329d7c11528b892ea`](https://github.com/Shopify/hydrogen/commit/13a6f8987ea20d33a30a9c0329d7c11528b892ea), [`403c1f5b6e266c3dfad30f7cfed229e3304570b0`](https://github.com/Shopify/hydrogen/commit/403c1f5b6e266c3dfad30f7cfed229e3304570b0), [`38f8a79625838a9cd4520b20c0db2e5d331f7d26`](https://github.com/Shopify/hydrogen/commit/38f8a79625838a9cd4520b20c0db2e5d331f7d26)]:
105
+ - @shopify/hydrogen@2026.0.0
106
+
107
+ ## 2025.7.3
108
+
109
+ ### Patch Changes
110
+
111
+ - Support OAuth parameters via URL query strings in skeleton login route ([#3391](https://github.com/Shopify/hydrogen/pull/3391)) by [@kdaviduik](https://github.com/kdaviduik)
112
+
113
+ The skeleton template's login route (`account_.login.tsx`) now reads OAuth parameters from the URL and forwards them to `customerAccount.login()`. This enables deep linking to the login page with pre-configured authentication options.
114
+
115
+ ### Supported Query Parameters
116
+
117
+ | Query Parameter | Description |
118
+ | ----------------- | ---------------------------------------------------------------------------------- |
119
+ | `acr_values` | Direct users to a specific login method (e.g., `provider:google` for social login) |
120
+ | `login_hint` | Pre-fill the email address field |
121
+ | `login_hint_mode` | When set to `submit` with `login_hint`, auto-submits the login form |
122
+ | `locale` | Display the login page in a specific language (e.g., `fr`, `zh-CN`) |
123
+
124
+ ### Usage Examples
125
+
126
+ ```
127
+ /account/login?login_hint=user@example.com
128
+ /account/login?login_hint=user@example.com&login_hint_mode=submit
129
+ /account/login?acr_values=provider:google
130
+ /account/login?locale=fr
131
+ ```
132
+
133
+ - Updated dependencies [[`7c077f5f21a595c0355873ac8073b716dfeaf4d0`](https://github.com/Shopify/hydrogen/commit/7c077f5f21a595c0355873ac8073b716dfeaf4d0), [`7c077f5f21a595c0355873ac8073b716dfeaf4d0`](https://github.com/Shopify/hydrogen/commit/7c077f5f21a595c0355873ac8073b716dfeaf4d0), [`7c077f5f21a595c0355873ac8073b716dfeaf4d0`](https://github.com/Shopify/hydrogen/commit/7c077f5f21a595c0355873ac8073b716dfeaf4d0)]:
134
+ - @shopify/hydrogen@2025.8.0
135
+
136
+ ## 2025.7.2
137
+
138
+ ### Patch Changes
139
+
140
+ - Updated dependencies [[`6d22e45d29e89a7a8dddfe3c06459d89e4590483`](https://github.com/Shopify/hydrogen/commit/6d22e45d29e89a7a8dddfe3c06459d89e4590483), [`702f966c8e60eba7434363c9012f12bed92a8e4d`](https://github.com/Shopify/hydrogen/commit/702f966c8e60eba7434363c9012f12bed92a8e4d)]:
141
+ - @shopify/hydrogen@2025.7.2
142
+
143
+ ## 2025.7.1
144
+
145
+ ### Patch Changes
146
+
147
+ - Update React Router to 7.12.0 with stabilized future flags ([#3346](https://github.com/Shopify/hydrogen/pull/3346)) by [@kdaviduik](https://github.com/kdaviduik)
148
+
149
+ This release uses React Router's newly stabilized future flags (`v8_splitRouteModules`, `v8_middleware`) instead of their unstable counterparts
150
+
151
+ - Moved server build in `server.ts` from a dynamic import to a static import to speed up first rendering during local development (2s => 200ms). ([#3331](https://github.com/Shopify/hydrogen/pull/3331)) by [@frandiox](https://github.com/frandiox)
152
+
153
+ ```diff
154
+ // server.ts
155
+
156
+ +import * as serverBuild from 'virtual:react-router/server-build';
157
+
158
+ const handleRequest = createRequestHandler({
159
+ - build: await import('virtual:react-router/server-build'),
160
+ + build: serverBuild,
161
+ ```
162
+
163
+ Updated ESLint config to allow `virtual:` imports:
164
+
165
+ ```diff
166
+ // eslint.config.js
167
+
168
+ rules: {
169
+ + 'import/no-unresolved': ['error', {ignore: ['^virtual:']}],
170
+ ```
171
+
172
+ - Updated dependencies [[`264e13349168f17cc1f096c84135d13d38cfc8df`](https://github.com/Shopify/hydrogen/commit/264e13349168f17cc1f096c84135d13d38cfc8df), [`6d5e3d371e7e02e15be17029a0f34daae53a978e`](https://github.com/Shopify/hydrogen/commit/6d5e3d371e7e02e15be17029a0f34daae53a978e), [`ee00f1025867c40d5f67fa89d4ffb215bf280e8f`](https://github.com/Shopify/hydrogen/commit/ee00f1025867c40d5f67fa89d4ffb215bf280e8f), [`5a38948133766e358c5f357f52562f6fdcfe7969`](https://github.com/Shopify/hydrogen/commit/5a38948133766e358c5f357f52562f6fdcfe7969), [`264e13349168f17cc1f096c84135d13d38cfc8df`](https://github.com/Shopify/hydrogen/commit/264e13349168f17cc1f096c84135d13d38cfc8df)]:
173
+ - @shopify/hydrogen@2025.7.1
174
+
3
175
  ## 2025.7.0
4
176
 
5
177
  ### Major Changes
@@ -1,69 +1,98 @@
1
1
  import type {CartLineUpdateInput} from '@shopify/hydrogen/storefront-api-types';
2
- import type {CartLayout} from '~/components/CartMain';
2
+ import type {CartLayout, LineItemChildrenMap} from '~/components/CartMain';
3
3
  import {CartForm, Image, type OptimisticCartLine} from '@shopify/hydrogen';
4
4
  import {useVariantUrl} from '~/lib/variants';
5
5
  import {Link} from 'react-router';
6
6
  import {ProductPrice} from './ProductPrice';
7
7
  import {useAside} from './Aside';
8
- import type {CartApiQueryFragment} from 'storefrontapi.generated';
8
+ import type {
9
+ CartApiQueryFragment,
10
+ CartLineFragment,
11
+ } from 'storefrontapi.generated';
9
12
 
10
- type CartLine = OptimisticCartLine<CartApiQueryFragment>;
13
+ export type CartLine = OptimisticCartLine<CartApiQueryFragment>;
11
14
 
12
15
  /**
13
16
  * A single line item in the cart. It displays the product image, title, price.
14
17
  * It also provides controls to update the quantity or remove the line item.
18
+ * If the line is a parent line that has child components (like warranties or gift wrapping), they are
19
+ * rendered nested below the parent line.
15
20
  */
16
21
  export function CartLineItem({
17
22
  layout,
18
23
  line,
24
+ childrenMap,
19
25
  }: {
20
26
  layout: CartLayout;
21
27
  line: CartLine;
28
+ childrenMap: LineItemChildrenMap;
22
29
  }) {
23
30
  const {id, merchandise} = line;
24
31
  const {product, title, image, selectedOptions} = merchandise;
25
32
  const lineItemUrl = useVariantUrl(product.handle, selectedOptions);
26
33
  const {close} = useAside();
34
+ const lineItemChildren = childrenMap[id];
35
+ const childrenLabelId = `cart-line-children-${id}`;
27
36
 
28
37
  return (
29
38
  <li key={id} className="cart-line">
30
- {image && (
31
- <Image
32
- alt={title}
33
- aspectRatio="1/1"
34
- data={image}
35
- height={100}
36
- loading="lazy"
37
- width={100}
38
- />
39
- )}
39
+ <div className="cart-line-inner">
40
+ {image && (
41
+ <Image
42
+ alt={title}
43
+ aspectRatio="1/1"
44
+ data={image}
45
+ height={100}
46
+ loading="lazy"
47
+ width={100}
48
+ />
49
+ )}
40
50
 
41
- <div>
42
- <Link
43
- prefetch="intent"
44
- to={lineItemUrl}
45
- onClick={() => {
46
- if (layout === 'aside') {
47
- close();
48
- }
49
- }}
50
- >
51
- <p>
52
- <strong>{product.title}</strong>
53
- </p>
54
- </Link>
55
- <ProductPrice price={line?.cost?.totalAmount} />
56
- <ul>
57
- {selectedOptions.map((option) => (
58
- <li key={option.name}>
59
- <small>
60
- {option.name}: {option.value}
61
- </small>
62
- </li>
63
- ))}
64
- </ul>
65
- <CartLineQuantity line={line} />
51
+ <div>
52
+ <Link
53
+ prefetch="intent"
54
+ to={lineItemUrl}
55
+ onClick={() => {
56
+ if (layout === 'aside') {
57
+ close();
58
+ }
59
+ }}
60
+ >
61
+ <p>
62
+ <strong>{product.title}</strong>
63
+ </p>
64
+ </Link>
65
+ <ProductPrice price={line?.cost?.totalAmount} />
66
+ <ul>
67
+ {selectedOptions.map((option) => (
68
+ <li key={option.name}>
69
+ <small>
70
+ {option.name}: {option.value}
71
+ </small>
72
+ </li>
73
+ ))}
74
+ </ul>
75
+ <CartLineQuantity line={line} />
76
+ </div>
66
77
  </div>
78
+
79
+ {lineItemChildren ? (
80
+ <div>
81
+ <p id={childrenLabelId} className="sr-only">
82
+ Line items with {product.title}
83
+ </p>
84
+ <ul aria-labelledby={childrenLabelId} className="cart-line-children">
85
+ {lineItemChildren.map((childLine) => (
86
+ <CartLineItem
87
+ childrenMap={childrenMap}
88
+ key={childLine.id}
89
+ line={childLine}
90
+ layout={layout}
91
+ />
92
+ ))}
93
+ </ul>
94
+ </div>
95
+ ) : null}
67
96
  </li>
68
97
  );
69
98
  }
@@ -1,8 +1,8 @@
1
- import {useOptimisticCart} from '@shopify/hydrogen';
1
+ import {useOptimisticCart, type OptimisticCartLine} from '@shopify/hydrogen';
2
2
  import {Link} from 'react-router';
3
3
  import type {CartApiQueryFragment} from 'storefrontapi.generated';
4
4
  import {useAside} from '~/components/Aside';
5
- import {CartLineItem} from '~/components/CartLineItem';
5
+ import {CartLineItem, type CartLine} from '~/components/CartLineItem';
6
6
  import {CartSummary} from './CartSummary';
7
7
 
8
8
  export type CartLayout = 'page' | 'aside';
@@ -12,6 +12,26 @@ export type CartMainProps = {
12
12
  layout: CartLayout;
13
13
  };
14
14
 
15
+ export type LineItemChildrenMap = {[parentId: string]: CartLine[]};
16
+ /** Returns a map of all line items and their children. */
17
+ function getLineItemChildrenMap(lines: CartLine[]): LineItemChildrenMap {
18
+ const children: LineItemChildrenMap = {};
19
+ for (const line of lines) {
20
+ if ('parentRelationship' in line && line.parentRelationship?.parent) {
21
+ const parentId = line.parentRelationship.parent.id;
22
+ if (!children[parentId]) children[parentId] = [];
23
+ children[parentId].push(line);
24
+ }
25
+ if ('lineComponents' in line) {
26
+ const children = getLineItemChildrenMap(line.lineComponents);
27
+ for (const [parentId, childIds] of Object.entries(children)) {
28
+ if (!children[parentId]) children[parentId] = [];
29
+ children[parentId].push(...childIds);
30
+ }
31
+ }
32
+ }
33
+ return children;
34
+ }
15
35
  /**
16
36
  * The main cart component that displays the cart items and summary.
17
37
  * It is used by both the /cart route and the cart aside dialog.
@@ -27,16 +47,34 @@ export function CartMain({layout, cart: originalCart}: CartMainProps) {
27
47
  Boolean(cart?.discountCodes?.filter((code) => code.applicable)?.length);
28
48
  const className = `cart-main ${withDiscount ? 'with-discount' : ''}`;
29
49
  const cartHasItems = cart?.totalQuantity ? cart.totalQuantity > 0 : false;
50
+ const childrenMap = getLineItemChildrenMap(cart?.lines?.nodes ?? []);
30
51
 
31
52
  return (
32
53
  <div className={className}>
33
54
  <CartEmpty hidden={linesCount} layout={layout} />
34
55
  <div className="cart-details">
35
- <div aria-labelledby="cart-lines">
36
- <ul>
37
- {(cart?.lines?.nodes ?? []).map((line) => (
38
- <CartLineItem key={line.id} line={line} layout={layout} />
39
- ))}
56
+ <p id="cart-lines" className="sr-only">
57
+ Line items
58
+ </p>
59
+ <div>
60
+ <ul aria-labelledby="cart-lines">
61
+ {(cart?.lines?.nodes ?? []).map((line) => {
62
+ // we do not render non-parent lines at the root of the cart
63
+ if (
64
+ 'parentRelationship' in line &&
65
+ line.parentRelationship?.parent
66
+ ) {
67
+ return null;
68
+ }
69
+ return (
70
+ <CartLineItem
71
+ key={line.id}
72
+ line={line}
73
+ layout={layout}
74
+ childrenMap={childrenMap}
75
+ />
76
+ );
77
+ })}
40
78
  </ul>
41
79
  </div>
42
80
  {cartHasItems && <CartSummary cart={cart} layout={layout} />}
@@ -3,7 +3,6 @@ import type {CartLayout} from '~/components/CartMain';
3
3
  import {CartForm, Money, type OptimisticCart} from '@shopify/hydrogen';
4
4
  import {useEffect, useRef} from 'react';
5
5
  import {useFetcher} from 'react-router';
6
- import type {FetcherWithComponents} from 'react-router';
7
6
 
8
7
  type CartSummaryProps = {
9
8
  cart: OptimisticCart<CartApiQueryFragment | null>;
@@ -67,7 +66,9 @@ function CartDiscounts({
67
66
  <div className="cart-discount">
68
67
  <code>{codes?.join(', ')}</code>
69
68
  &nbsp;
70
- <button>Remove</button>
69
+ <button type="submit" aria-label="Remove discount">
70
+ Remove
71
+ </button>
71
72
  </div>
72
73
  </UpdateDiscountForm>
73
74
  </div>
@@ -76,9 +77,19 @@ function CartDiscounts({
76
77
  {/* Show an input to apply a discount */}
77
78
  <UpdateDiscountForm discountCodes={codes}>
78
79
  <div>
79
- <input type="text" name="discountCode" placeholder="Discount code" />
80
+ <label htmlFor="discount-code-input" className="sr-only">
81
+ Discount code
82
+ </label>
83
+ <input
84
+ id="discount-code-input"
85
+ type="text"
86
+ name="discountCode"
87
+ placeholder="Discount code"
88
+ />
80
89
  &nbsp;
81
- <button type="submit">Apply</button>
90
+ <button type="submit" aria-label="Apply discount code">
91
+ Apply
92
+ </button>
82
93
  </div>
83
94
  </UpdateDiscountForm>
84
95
  </div>
@@ -110,27 +121,17 @@ function CartGiftCard({
110
121
  }: {
111
122
  giftCardCodes: CartApiQueryFragment['appliedGiftCards'] | undefined;
112
123
  }) {
113
- const appliedGiftCardCodes = useRef<string[]>([]);
114
124
  const giftCardCodeInput = useRef<HTMLInputElement>(null);
115
125
  const giftCardAddFetcher = useFetcher({key: 'gift-card-add'});
116
126
 
117
- // Clear the gift card code input after the gift card is added
118
127
  useEffect(() => {
119
128
  if (giftCardAddFetcher.data) {
120
129
  giftCardCodeInput.current!.value = '';
121
130
  }
122
131
  }, [giftCardAddFetcher.data]);
123
132
 
124
- function saveAppliedCode(code: string) {
125
- const formattedCode = code.replace(/\s/g, ''); // Remove spaces
126
- if (!appliedGiftCardCodes.current.includes(formattedCode)) {
127
- appliedGiftCardCodes.current.push(formattedCode);
128
- }
129
- }
130
-
131
133
  return (
132
134
  <div>
133
- {/* Display applied gift cards with individual remove buttons */}
134
135
  {giftCardCodes && giftCardCodes.length > 0 && (
135
136
  <dl>
136
137
  <dt>Applied Gift Card(s)</dt>
@@ -148,12 +149,7 @@ function CartGiftCard({
148
149
  </dl>
149
150
  )}
150
151
 
151
- {/* Show an input to apply a gift card */}
152
- <UpdateGiftCardForm
153
- giftCardCodes={appliedGiftCardCodes.current}
154
- saveAppliedCode={saveAppliedCode}
155
- fetcherKey="gift-card-add"
156
- >
152
+ <AddGiftCardForm fetcherKey="gift-card-add">
157
153
  <div>
158
154
  <input
159
155
  type="text"
@@ -166,19 +162,15 @@ function CartGiftCard({
166
162
  Apply
167
163
  </button>
168
164
  </div>
169
- </UpdateGiftCardForm>
165
+ </AddGiftCardForm>
170
166
  </div>
171
167
  );
172
168
  }
173
169
 
174
- function UpdateGiftCardForm({
175
- giftCardCodes,
176
- saveAppliedCode,
170
+ function AddGiftCardForm({
177
171
  fetcherKey,
178
172
  children,
179
173
  }: {
180
- giftCardCodes?: string[];
181
- saveAppliedCode?: (code: string) => void;
182
174
  fetcherKey?: string;
183
175
  children: React.ReactNode;
184
176
  }) {
@@ -186,18 +178,9 @@ function UpdateGiftCardForm({
186
178
  <CartForm
187
179
  fetcherKey={fetcherKey}
188
180
  route="/cart"
189
- action={CartForm.ACTIONS.GiftCardCodesUpdate}
190
- inputs={{
191
- giftCardCodes: giftCardCodes || [],
192
- }}
181
+ action={CartForm.ACTIONS.GiftCardCodesAdd}
193
182
  >
194
- {(fetcher: FetcherWithComponents<any>) => {
195
- const code = fetcher.formData?.get('giftCardCode');
196
- if (code && saveAppliedCode) {
197
- saveAppliedCode(code as string);
198
- }
199
- return children;
200
- }}
183
+ {children}
201
184
  </CartForm>
202
185
  );
203
186
  }
@@ -221,4 +204,3 @@ function RemoveGiftCardForm({
221
204
  </CartForm>
222
205
  );
223
206
  }
224
-
@@ -0,0 +1,20 @@
1
+ export function MockShopNotice() {
2
+ return (
3
+ <section
4
+ className="mock-shop-notice"
5
+ aria-labelledby="mock-shop-notice-heading"
6
+ >
7
+ <div className="inner">
8
+ <h2 id="mock-shop-notice-heading">Welcome to Hydrogen!</h2>
9
+ <p>
10
+ You&rsquo;re seeing mocked products because no store is connected to
11
+ this project yet.
12
+ </p>
13
+ <p>
14
+ Link a store by running <code>npx shopify hydrogen link</code> in your
15
+ terminal.
16
+ </p>
17
+ </div>
18
+ </section>
19
+ );
20
+ }
@@ -6,9 +6,8 @@ import {NonceProvider} from '@shopify/hydrogen';
6
6
  if (!window.location.origin.includes('webcache.googleusercontent.com')) {
7
7
  startTransition(() => {
8
8
  // Extract nonce from existing script tags
9
- const existingNonce = document
10
- .querySelector<HTMLScriptElement>('script[nonce]')
11
- ?.nonce;
9
+ const existingNonce =
10
+ document.querySelector<HTMLScriptElement>('script[nonce]')?.nonce;
12
11
 
13
12
  hydrateRoot(
14
13
  document,
@@ -54,6 +54,11 @@ export const CART_QUERY_FRAGMENT = `#graphql
54
54
  }
55
55
  }
56
56
  }
57
+ parentRelationship {
58
+ parent {
59
+ id
60
+ }
61
+ }
57
62
  }
58
63
  fragment CartLineComponent on ComponentizableCartLine {
59
64
  id
@@ -104,6 +109,9 @@ export const CART_QUERY_FRAGMENT = `#graphql
104
109
  }
105
110
  }
106
111
  }
112
+ lineComponents {
113
+ ...CartLine
114
+ }
107
115
  }
108
116
  fragment CartApiQuery on Cart {
109
117
  updatedAt