@shopify/cli 3.83.1 → 3.83.3

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 (137) hide show
  1. package/dist/assets/hydrogen/starter/.cursor/rules/hydrogen-react-router.mdc +52 -0
  2. package/dist/assets/hydrogen/starter/CHANGELOG.md +35 -0
  3. package/dist/assets/hydrogen/starter/app/components/AddToCartButton.tsx +1 -1
  4. package/dist/assets/hydrogen/starter/app/components/CartLineItem.tsx +1 -1
  5. package/dist/assets/hydrogen/starter/app/components/CartMain.tsx +1 -1
  6. package/dist/assets/hydrogen/starter/app/components/CartSummary.tsx +1 -1
  7. package/dist/assets/hydrogen/starter/app/components/Footer.tsx +1 -1
  8. package/dist/assets/hydrogen/starter/app/components/Header.tsx +1 -1
  9. package/dist/assets/hydrogen/starter/app/components/PageLayout.tsx +1 -1
  10. package/dist/assets/hydrogen/starter/app/components/ProductForm.tsx +1 -1
  11. package/dist/assets/hydrogen/starter/app/components/ProductItem.tsx +1 -1
  12. package/dist/assets/hydrogen/starter/app/components/SearchForm.tsx +1 -1
  13. package/dist/assets/hydrogen/starter/app/components/SearchFormPredictive.tsx +1 -6
  14. package/dist/assets/hydrogen/starter/app/components/SearchResults.tsx +1 -1
  15. package/dist/assets/hydrogen/starter/app/components/SearchResultsPredictive.tsx +1 -1
  16. package/dist/assets/hydrogen/starter/app/entry.client.tsx +2 -2
  17. package/dist/assets/hydrogen/starter/app/entry.server.tsx +9 -4
  18. package/dist/assets/hydrogen/starter/app/lib/variants.ts +1 -1
  19. package/dist/assets/hydrogen/starter/app/root.tsx +1 -1
  20. package/dist/assets/hydrogen/starter/app/routes/_index.tsx +1 -1
  21. package/dist/assets/hydrogen/starter/app/routes/account.addresses.tsx +1 -1
  22. package/dist/assets/hydrogen/starter/app/routes/account.orders.$id.tsx +4 -4
  23. package/dist/assets/hydrogen/starter/app/routes/account.orders._index.tsx +1 -1
  24. package/dist/assets/hydrogen/starter/app/routes/account.profile.tsx +1 -7
  25. package/dist/assets/hydrogen/starter/app/routes/account.tsx +1 -1
  26. package/dist/assets/hydrogen/starter/app/routes/api.$version.[graphql.json].tsx +14 -0
  27. package/dist/assets/hydrogen/starter/app/routes/blogs.$blogHandle.$articleHandle.tsx +1 -1
  28. package/dist/assets/hydrogen/starter/app/routes/blogs.$blogHandle._index.tsx +1 -1
  29. package/dist/assets/hydrogen/starter/app/routes/blogs._index.tsx +1 -1
  30. package/dist/assets/hydrogen/starter/app/routes/cart.tsx +7 -2
  31. package/dist/assets/hydrogen/starter/app/routes/collections.$handle.tsx +1 -1
  32. package/dist/assets/hydrogen/starter/app/routes/collections._index.tsx +1 -1
  33. package/dist/assets/hydrogen/starter/app/routes/collections.all.tsx +2 -2
  34. package/dist/assets/hydrogen/starter/app/routes/pages.$handle.tsx +1 -1
  35. package/dist/assets/hydrogen/starter/app/routes/policies.$handle.tsx +1 -1
  36. package/dist/assets/hydrogen/starter/app/routes/policies._index.tsx +1 -1
  37. package/dist/assets/hydrogen/starter/app/routes/products.$handle.tsx +1 -1
  38. package/dist/assets/hydrogen/starter/app/routes/search.tsx +1 -1
  39. package/dist/assets/hydrogen/starter/app/routes.ts +2 -2
  40. package/dist/assets/hydrogen/starter/env.d.ts +12 -2
  41. package/dist/assets/hydrogen/starter/eslint.config.js +2 -0
  42. package/dist/assets/hydrogen/starter/package.json +11 -12
  43. package/dist/assets/hydrogen/starter/react-router.config.ts +7 -0
  44. package/dist/assets/hydrogen/starter/server.ts +2 -5
  45. package/dist/assets/hydrogen/starter/tsconfig.json +18 -6
  46. package/dist/assets/hydrogen/starter/vite.config.ts +3 -24
  47. package/dist/assets/hydrogen/tailwind/package.json +4 -1
  48. package/dist/assets/hydrogen/virtual-routes/components/RequestDetails.jsx +1 -1
  49. package/dist/assets/hydrogen/virtual-routes/layout.jsx +1 -7
  50. package/dist/assets/hydrogen/virtual-routes/routes/index.jsx +1 -1
  51. package/dist/assets/hydrogen/virtual-routes/routes/subrequest-profiler.jsx +1 -1
  52. package/dist/assets/hydrogen/virtual-routes/virtual-root-with-layout.jsx +1 -1
  53. package/dist/assets/hydrogen/virtual-routes/virtual-root.jsx +1 -1
  54. package/dist/assets/hydrogen/vite/vite.config.js +1 -1
  55. package/dist/{chunk-SJYNVNUB.js → chunk-2MEZBZGZ.js} +2 -2
  56. package/dist/{chunk-TLYRIQK7.js → chunk-3EURRQ7K.js} +6 -6
  57. package/dist/{chunk-7KLV4YSY.js → chunk-45OTXKBK.js} +2 -2
  58. package/dist/{chunk-XI6AXLZO.js → chunk-6QJUUGM2.js} +4 -4
  59. package/dist/{chunk-RDAZS4FZ.js → chunk-AQDVU7OK.js} +7 -7
  60. package/dist/{chunk-DVGCJLCA.js → chunk-BXBJI6XD.js} +6 -6
  61. package/dist/{chunk-5BJYF6FG.js → chunk-CC4H7OAW.js} +3 -3
  62. package/dist/{chunk-DFABOPSU.js → chunk-DRATBB26.js} +4 -4
  63. package/dist/{chunk-DDU22ZPL.js → chunk-EG4X7G4K.js} +3 -3
  64. package/dist/{chunk-Y2JP6WFP.js → chunk-EG6MBBEN.js} +2 -2
  65. package/dist/{chunk-FNYLJESL.js → chunk-EYZZIYQJ.js} +4 -4
  66. package/dist/{chunk-ARXCCKJT.js → chunk-FE35FSRC.js} +8 -8
  67. package/dist/{chunk-TB443RFG.js → chunk-FHOKC4TU.js} +5 -5
  68. package/dist/{chunk-A6DFWCO7.js → chunk-GGCRQOED.js} +4 -4
  69. package/dist/{chunk-4BPSIIGV.js → chunk-HFQX4JZY.js} +3 -3
  70. package/dist/{chunk-7EV36FNO.js → chunk-JEQ7HZCS.js} +306 -474
  71. package/dist/{chunk-ZQMRVJXG.js → chunk-JWJ2ZR5V.js} +3 -3
  72. package/dist/{chunk-UZIJLLPI.js → chunk-MGI52UZC.js} +3 -3
  73. package/dist/{chunk-XOIMWH77.js → chunk-Q6VEUT5Q.js} +2 -2
  74. package/dist/{chunk-FEMALH67.js → chunk-RBL7EMA5.js} +4 -4
  75. package/dist/{chunk-57SXE5DE.js → chunk-S5JEIN5Q.js} +2 -2
  76. package/dist/{chunk-ASWHWSRF.js → chunk-SBU6S5G7.js} +2 -2
  77. package/dist/{chunk-K5GF4S7D.js → chunk-U7OT774M.js} +2 -2
  78. package/dist/{chunk-KPFBSWRK.js → chunk-UNQM4BV5.js} +3 -3
  79. package/dist/{chunk-2ZA3MHM5.js → chunk-VCN6UBNT.js} +3 -3
  80. package/dist/{chunk-5QFLNCVR.js → chunk-VQ6DWYP7.js} +6 -6
  81. package/dist/{chunk-KSLA767C.js → chunk-VRECY72K.js} +2 -2
  82. package/dist/{chunk-QNMWKLS4.js → chunk-WGMFODN6.js} +3 -3
  83. package/dist/{chunk-BZFP2O66.js → chunk-WHCXZSKH.js} +4 -4
  84. package/dist/{chunk-JEW6HZHJ.js → chunk-WROAVXGY.js} +3 -3
  85. package/dist/{chunk-SUA462JY.js → chunk-XFK3CKIN.js} +5 -5
  86. package/dist/{chunk-XVZQHSFP.js → chunk-YYAMP36W.js} +5 -5
  87. package/dist/{chunk-NJN55E4K.js → chunk-ZE4NKLTB.js} +4 -4
  88. package/dist/{chunk-PPDGMVCL.js → chunk-ZLYK26OR.js} +4 -4
  89. package/dist/{chunk-BZBO3V3A.js → chunk-ZZGNTCPD.js} +3 -3
  90. package/dist/cli/commands/auth/logout.js +12 -12
  91. package/dist/cli/commands/auth/logout.test.js +13 -13
  92. package/dist/cli/commands/cache/clear.js +11 -11
  93. package/dist/cli/commands/debug/command-flags.js +11 -11
  94. package/dist/cli/commands/docs/generate.js +11 -11
  95. package/dist/cli/commands/docs/generate.test.js +11 -11
  96. package/dist/cli/commands/help.js +11 -11
  97. package/dist/cli/commands/kitchen-sink/async.js +12 -12
  98. package/dist/cli/commands/kitchen-sink/async.test.js +12 -12
  99. package/dist/cli/commands/kitchen-sink/index.js +14 -14
  100. package/dist/cli/commands/kitchen-sink/index.test.js +14 -14
  101. package/dist/cli/commands/kitchen-sink/prompts.js +12 -12
  102. package/dist/cli/commands/kitchen-sink/prompts.test.js +12 -12
  103. package/dist/cli/commands/kitchen-sink/static.js +12 -12
  104. package/dist/cli/commands/kitchen-sink/static.test.js +12 -12
  105. package/dist/cli/commands/notifications/generate.js +12 -12
  106. package/dist/cli/commands/notifications/list.js +12 -12
  107. package/dist/cli/commands/search.js +12 -12
  108. package/dist/cli/commands/upgrade.js +12 -12
  109. package/dist/cli/commands/version.js +12 -12
  110. package/dist/cli/commands/version.test.js +12 -12
  111. package/dist/cli/services/commands/notifications.js +7 -7
  112. package/dist/cli/services/commands/search.js +3 -3
  113. package/dist/cli/services/commands/search.test.js +3 -3
  114. package/dist/cli/services/commands/version.js +4 -4
  115. package/dist/cli/services/commands/version.test.js +5 -5
  116. package/dist/cli/services/kitchen-sink/async.js +3 -3
  117. package/dist/cli/services/kitchen-sink/prompts.js +3 -3
  118. package/dist/cli/services/kitchen-sink/static.js +3 -3
  119. package/dist/cli/services/upgrade.js +4 -4
  120. package/dist/cli/services/upgrade.test.js +5 -5
  121. package/dist/{custom-oclif-loader-XASCYJ7O.js → custom-oclif-loader-FOBJVOKU.js} +3 -3
  122. package/dist/{error-handler-HQBVO3GI.js → error-handler-VBQPBASZ.js} +9 -9
  123. package/dist/hooks/postrun.js +7 -7
  124. package/dist/hooks/prerun.js +8 -8
  125. package/dist/index.js +826 -1144
  126. package/dist/{local-PI2REOYY.js → local-3V2H6DEQ.js} +3 -3
  127. package/dist/{morph-5LWJDWYB.js → morph-TYIH255V.js} +9 -9
  128. package/dist/{node-package-manager-RVDETLBX.js → node-package-manager-3VOZDWRH.js} +4 -4
  129. package/dist/{path-COZT77T2.js → path-GB4VIEM6.js} +2 -2
  130. package/dist/tsconfig.tsbuildinfo +1 -1
  131. package/dist/{ui-RDFVKEJS.js → ui-MKD65UA4.js} +3 -3
  132. package/dist/{workerd-XLT4ZWI5.js → workerd-EQ7HXYPK.js} +14 -14
  133. package/oclif.manifest.json +3 -23
  134. package/package.json +8 -8
  135. package/dist/assets/hydrogen/starter/.cursor/rules/cookbook-recipe-subscriptions.mdc +0 -921
  136. package/dist/chunk-V67D4V7T.js +0 -107
  137. package/dist/node-NAYZANSZ.js +0 -162
@@ -0,0 +1,52 @@
1
+ ---
2
+ description:
3
+ globs:
4
+ alwaysApply: true
5
+ ---
6
+
7
+ # React Router Import Rule for Hydrogen
8
+
9
+ ## Overview
10
+
11
+ This Hydrogen project is based on React Router, not Remix. When working with documentation or code examples, you should always use imports from the appropriate React Router packages instead of Remix packages.
12
+
13
+ ## Import Replacements
14
+
15
+ When you see imports from Remix packages, replace them with their equivalent React Router v7 packages. Here are the common replacements:
16
+
17
+ | Remix v2 Package | React Router v7 Package |
18
+ |------------------|-------------------------|
19
+ | `@remix-run/react` | `react-router` |
20
+ | `@remix-run/dev` | `@react-router/dev` |
21
+ | `@remix-run/architect` | `@react-router/architect` |
22
+ | `@remix-run/cloudflare` | `@react-router/cloudflare` |
23
+ | `@remix-run/express` | `@react-router/express` |
24
+ | `@remix-run/fs-routes` | `@react-router/fs-routes` |
25
+ | `@remix-run/node` | `@react-router/node` |
26
+ | `@remix-run/route-config` | `@react-router/dev` |
27
+ | `@remix-run/routes-option-adapter` | `@react-router/remix-routes-option-adapter` |
28
+ | `@remix-run/serve` | `@react-router/serve` |
29
+ | `@remix-run/server-runtime` | `react-router` |
30
+ | `@remix-run/testing` | `react-router` |
31
+
32
+ NEVER USE 'react-router-dom' imports!
33
+
34
+ ## Common Import Examples
35
+
36
+ ```js
37
+ // INCORRECT (Remix style)
38
+ import { useLoaderData, Link, Form, useActionData, useNavigation, useSubmit } from '@remix-run/react';
39
+
40
+ // CORRECT (React Router style)
41
+ import { useLoaderData, Link, Form, useActionData, useNavigation, useSubmit } from 'react-router';
42
+ ```
43
+
44
+ ## Development Guidelines
45
+
46
+ 1. Always check existing code in the project to understand which specific React Router hooks and components are being used
47
+ 2. When generating new code or modifying existing code, ensure all routing-related imports come from the correct React Router packages
48
+ 3. If following documentation or examples based on Remix, adapt the code to use React Router equivalents
49
+
50
+ When working in this codebase, always follow the React Router patterns that are already established in the existing code.
51
+
52
+ For more information, consult the official Remix to React Router upgrade guide: https://reactrouter.com/upgrading/remix
@@ -1,5 +1,40 @@
1
1
  # skeleton
2
2
 
3
+ ## 2025.5.2
4
+
5
+ ### Patch Changes
6
+
7
+ - Fixing the skeleton's Vite Config ([#2958](https://github.com/Shopify/hydrogen/pull/2958)) by [@balazsbajorics](https://github.com/balazsbajorics)
8
+
9
+ ## 2025.5.1
10
+
11
+ ### Patch Changes
12
+
13
+ - Bumping the cli to 3.80.4 ([#2956](https://github.com/Shopify/hydrogen/pull/2956)) by [@balazsbajorics](https://github.com/balazsbajorics)
14
+
15
+ ## 2025.5.0
16
+
17
+ ### Patch Changes
18
+
19
+ - Migrating to React Router 7 ([#2866](https://github.com/Shopify/hydrogen/pull/2866)) by [@balazsbajorics](https://github.com/balazsbajorics)
20
+
21
+ - Updated dependencies [[`e9132d88`](https://github.com/Shopify/hydrogen/commit/e9132d8888ad090d3db41fe4d5d63569a30e9d8e), [`e9132d88`](https://github.com/Shopify/hydrogen/commit/e9132d8888ad090d3db41fe4d5d63569a30e9d8e)]:
22
+ - @shopify/remix-oxygen@3.0.0
23
+ - @shopify/hydrogen@2025.5.0
24
+
25
+ ## 2025.4.0
26
+
27
+ ### Patch Changes
28
+
29
+ - Moved the Cursor rules into more generic LLM prompt files. If you were using the Cursor rules, you will find the prompts in the `cookbook/llms` folder and they can be put into your `.cursor/rules` folder manually. LLM prompt files will be maintained moving forward, while previous Cursor rules will not be updated anymore. ([#2936](https://github.com/Shopify/hydrogen/pull/2936)) by [@ruggishop](https://github.com/ruggishop)
30
+
31
+ - Bump skeleton @shopify/cli and @shopify/mini-oxygen ([#2883](https://github.com/Shopify/hydrogen/pull/2883)) by [@juanpprieto](https://github.com/juanpprieto)
32
+
33
+ - Update SFAPI and CAAPI versions to 2025.04 ([#2886](https://github.com/Shopify/hydrogen/pull/2886)) by [@juanpprieto](https://github.com/juanpprieto)
34
+
35
+ - Updated dependencies [[`af23e710`](https://github.com/Shopify/hydrogen/commit/af23e710dac83bb57498d9c2ef1d8bcf9df55d34), [`9d8a6644`](https://github.com/Shopify/hydrogen/commit/9d8a6644a5b67dca890c6687df390aee78fc85c3)]:
36
+ - @shopify/hydrogen@2025.4.0
37
+
3
38
  ## 2025.1.7
4
39
 
5
40
  ### Patch Changes
@@ -1,4 +1,4 @@
1
- import {type FetcherWithComponents} from '@remix-run/react';
1
+ import { type FetcherWithComponents } from 'react-router';
2
2
  import {CartForm, type OptimisticCartLineInput} from '@shopify/hydrogen';
3
3
 
4
4
  export function AddToCartButton({
@@ -2,7 +2,7 @@ import type {CartLineUpdateInput} from '@shopify/hydrogen/storefront-api-types';
2
2
  import type {CartLayout} from '~/components/CartMain';
3
3
  import {CartForm, Image, type OptimisticCartLine} from '@shopify/hydrogen';
4
4
  import {useVariantUrl} from '~/lib/variants';
5
- import {Link} from '@remix-run/react';
5
+ import { Link } from 'react-router';
6
6
  import {ProductPrice} from './ProductPrice';
7
7
  import {useAside} from './Aside';
8
8
  import type {CartApiQueryFragment} from 'storefrontapi.generated';
@@ -1,5 +1,5 @@
1
1
  import {useOptimisticCart} from '@shopify/hydrogen';
2
- import {Link} from '@remix-run/react';
2
+ import { Link } from 'react-router';
3
3
  import type {CartApiQueryFragment} from 'storefrontapi.generated';
4
4
  import {useAside} from '~/components/Aside';
5
5
  import {CartLineItem} from '~/components/CartLineItem';
@@ -2,7 +2,7 @@ import type {CartApiQueryFragment} from 'storefrontapi.generated';
2
2
  import type {CartLayout} from '~/components/CartMain';
3
3
  import {CartForm, Money, type OptimisticCart} from '@shopify/hydrogen';
4
4
  import {useRef} from 'react';
5
- import {FetcherWithComponents} from '@remix-run/react';
5
+ import { FetcherWithComponents } from 'react-router';
6
6
 
7
7
  type CartSummaryProps = {
8
8
  cart: OptimisticCart<CartApiQueryFragment | null>;
@@ -1,5 +1,5 @@
1
1
  import {Suspense} from 'react';
2
- import {Await, NavLink} from '@remix-run/react';
2
+ import {Await, NavLink} from 'react-router';
3
3
  import type {FooterQuery, HeaderQuery} from 'storefrontapi.generated';
4
4
 
5
5
  interface FooterProps {
@@ -1,5 +1,5 @@
1
1
  import {Suspense} from 'react';
2
- import {Await, NavLink, useAsyncValue} from '@remix-run/react';
2
+ import { Await, NavLink, useAsyncValue } from 'react-router';
3
3
  import {
4
4
  type CartViewPayload,
5
5
  useAnalytics,
@@ -1,4 +1,4 @@
1
- import {Await, Link} from '@remix-run/react';
1
+ import { Await, Link } from 'react-router';
2
2
  import {Suspense, useId} from 'react';
3
3
  import type {
4
4
  CartApiQueryFragment,
@@ -1,4 +1,4 @@
1
- import {Link, useNavigate} from '@remix-run/react';
1
+ import { Link, useNavigate } from 'react-router';
2
2
  import {type MappedProductOptions} from '@shopify/hydrogen';
3
3
  import type {
4
4
  Maybe,
@@ -1,4 +1,4 @@
1
- import {Link} from '@remix-run/react';
1
+ import {Link} from 'react-router';
2
2
  import {Image, Money} from '@shopify/hydrogen';
3
3
  import type {
4
4
  ProductItemFragment,
@@ -1,5 +1,5 @@
1
1
  import {useRef, useEffect} from 'react';
2
- import {Form, type FormProps} from '@remix-run/react';
2
+ import { Form, type FormProps } from 'react-router';
3
3
 
4
4
  type SearchFormProps = Omit<FormProps, 'children'> & {
5
5
  children: (args: {
@@ -1,9 +1,4 @@
1
- import {
2
- useFetcher,
3
- useNavigate,
4
- type FormProps,
5
- type Fetcher,
6
- } from '@remix-run/react';
1
+ import { useFetcher, useNavigate, type FormProps, type Fetcher } from 'react-router';
7
2
  import React, {useRef, useEffect} from 'react';
8
3
  import type {PredictiveSearchReturn} from '~/lib/search';
9
4
  import {useAside} from './Aside';
@@ -1,4 +1,4 @@
1
- import {Link} from '@remix-run/react';
1
+ import { Link } from 'react-router';
2
2
  import {Image, Money, Pagination} from '@shopify/hydrogen';
3
3
  import {urlWithTrackingParams, type RegularSearchReturn} from '~/lib/search';
4
4
 
@@ -1,4 +1,4 @@
1
- import {Link, useFetcher, type Fetcher} from '@remix-run/react';
1
+ import { Link, useFetcher, type Fetcher } from 'react-router';
2
2
  import {Image, Money} from '@shopify/hydrogen';
3
3
  import React, {useRef, useEffect} from 'react';
4
4
  import {
@@ -1,4 +1,4 @@
1
- import {RemixBrowser} from '@remix-run/react';
1
+ import { HydratedRouter } from 'react-router/dom';
2
2
  import {startTransition, StrictMode} from 'react';
3
3
  import {hydrateRoot} from 'react-dom/client';
4
4
 
@@ -7,7 +7,7 @@ if (!window.location.origin.includes('webcache.googleusercontent.com')) {
7
7
  hydrateRoot(
8
8
  document,
9
9
  <StrictMode>
10
- <RemixBrowser />
10
+ <HydratedRouter />
11
11
  </StrictMode>,
12
12
  );
13
13
  });
@@ -1,14 +1,15 @@
1
- import type {EntryContext, AppLoadContext} from '@shopify/remix-oxygen';
2
- import {RemixServer} from '@remix-run/react';
1
+ import type {AppLoadContext} from '@shopify/remix-oxygen';
2
+ import {ServerRouter} from 'react-router';
3
3
  import {isbot} from 'isbot';
4
4
  import {renderToReadableStream} from 'react-dom/server';
5
5
  import {createContentSecurityPolicy} from '@shopify/hydrogen';
6
+ import type {EntryContext} from 'react-router';
6
7
 
7
8
  export default async function handleRequest(
8
9
  request: Request,
9
10
  responseStatusCode: number,
10
11
  responseHeaders: Headers,
11
- remixContext: EntryContext,
12
+ reactRouterContext: EntryContext,
12
13
  context: AppLoadContext,
13
14
  ) {
14
15
  const {nonce, header, NonceProvider} = createContentSecurityPolicy({
@@ -20,7 +21,11 @@ export default async function handleRequest(
20
21
 
21
22
  const body = await renderToReadableStream(
22
23
  <NonceProvider>
23
- <RemixServer context={remixContext} url={request.url} nonce={nonce}/>
24
+ <ServerRouter
25
+ context={reactRouterContext}
26
+ url={request.url}
27
+ nonce={nonce}
28
+ />
24
29
  </NonceProvider>,
25
30
  {
26
31
  nonce,
@@ -1,4 +1,4 @@
1
- import {useLocation} from '@remix-run/react';
1
+ import { useLocation } from 'react-router';
2
2
  import type {SelectedOption} from '@shopify/hydrogen/storefront-api-types';
3
3
  import {useMemo} from 'react';
4
4
 
@@ -10,7 +10,7 @@ import {
10
10
  Scripts,
11
11
  ScrollRestoration,
12
12
  useRouteLoaderData,
13
- } from '@remix-run/react';
13
+ } from 'react-router';
14
14
  import favicon from '~/assets/favicon.svg';
15
15
  import {FOOTER_QUERY, HEADER_QUERY} from '~/lib/fragments';
16
16
  import resetStyles from '~/styles/reset.css?url';
@@ -1,5 +1,5 @@
1
1
  import {type LoaderFunctionArgs} from '@shopify/remix-oxygen';
2
- import {Await, useLoaderData, Link, type MetaFunction} from '@remix-run/react';
2
+ import { Await, useLoaderData, Link, type MetaFunction } from 'react-router';
3
3
  import {Suspense} from 'react';
4
4
  import {Image, Money} from '@shopify/hydrogen';
5
5
  import type {
@@ -15,7 +15,7 @@ import {
15
15
  useOutletContext,
16
16
  type MetaFunction,
17
17
  type Fetcher,
18
- } from '@remix-run/react';
18
+ } from 'react-router';
19
19
  import {
20
20
  UPDATE_ADDRESS_MUTATION,
21
21
  DELETE_ADDRESS_MUTATION,
@@ -1,5 +1,5 @@
1
1
  import {redirect, type LoaderFunctionArgs} from '@shopify/remix-oxygen';
2
- import {useLoaderData, type MetaFunction} from '@remix-run/react';
2
+ import { useLoaderData, type MetaFunction } from 'react-router';
3
3
  import {Money, Image, flattenConnection} from '@shopify/hydrogen';
4
4
  import type {OrderLineItemFullFragment} from 'customer-accountapi.generated';
5
5
  import {CUSTOMER_ORDER_QUERY} from '~/graphql/customer-account/CustomerOrderQuery';
@@ -60,7 +60,7 @@ export default function OrderRoute() {
60
60
  fulfillmentStatus,
61
61
  } = useLoaderData<typeof loader>();
62
62
  return (
63
- <div className="account-order">
63
+ (<div className="account-order">
64
64
  <h2>Order {order.name}</h2>
65
65
  <p>Placed on {new Date(order.processedAt!).toDateString()}</p>
66
66
  <br />
@@ -77,7 +77,7 @@ export default function OrderRoute() {
77
77
  <tbody>
78
78
  {lineItems.map((lineItem, lineItemIndex) => (
79
79
  // eslint-disable-next-line react/no-array-index-key
80
- <OrderLineRow key={lineItemIndex} lineItem={lineItem} />
80
+ (<OrderLineRow key={lineItemIndex} lineItem={lineItem} />)
81
81
  ))}
82
82
  </tbody>
83
83
  <tfoot>
@@ -165,7 +165,7 @@ export default function OrderRoute() {
165
165
  View Order Status →
166
166
  </a>
167
167
  </p>
168
- </div>
168
+ </div>)
169
169
  );
170
170
  }
171
171
 
@@ -1,4 +1,4 @@
1
- import {Link, useLoaderData, type MetaFunction} from '@remix-run/react';
1
+ import { Link, useLoaderData, type MetaFunction } from 'react-router';
2
2
  import {
3
3
  Money,
4
4
  getPaginationVariables,
@@ -6,13 +6,7 @@ import {
6
6
  type ActionFunctionArgs,
7
7
  type LoaderFunctionArgs,
8
8
  } from '@shopify/remix-oxygen';
9
- import {
10
- Form,
11
- useActionData,
12
- useNavigation,
13
- useOutletContext,
14
- type MetaFunction,
15
- } from '@remix-run/react';
9
+ import { Form, useActionData, useNavigation, useOutletContext, type MetaFunction } from 'react-router';
16
10
 
17
11
  export type ActionResponse = {
18
12
  error: string | null;
@@ -1,5 +1,5 @@
1
1
  import {data as remixData, type LoaderFunctionArgs} from '@shopify/remix-oxygen';
2
- import {Form, NavLink, Outlet, useLoaderData} from '@remix-run/react';
2
+ import { Form, NavLink, Outlet, useLoaderData } from 'react-router';
3
3
  import {CUSTOMER_DETAILS_QUERY} from '~/graphql/customer-account/CustomerDetailsQuery';
4
4
 
5
5
  export function shouldRevalidate() {
@@ -0,0 +1,14 @@
1
+ import {LoaderFunctionArgs} from 'react-router';
2
+
3
+ export async function action({params, context, request}: LoaderFunctionArgs) {
4
+ const response = await fetch(
5
+ `https://${context.env.PUBLIC_CHECKOUT_DOMAIN}/api/${params.version}/graphql.json`,
6
+ {
7
+ method: 'POST',
8
+ body: request.body,
9
+ headers: request.headers,
10
+ },
11
+ );
12
+
13
+ return new Response(response.body, {headers: new Headers(response.headers)});
14
+ }
@@ -1,5 +1,5 @@
1
1
  import {type LoaderFunctionArgs} from '@shopify/remix-oxygen';
2
- import {useLoaderData, type MetaFunction} from '@remix-run/react';
2
+ import { useLoaderData, type MetaFunction } from 'react-router';
3
3
  import {Image} from '@shopify/hydrogen';
4
4
  import {redirectIfHandleIsLocalized} from '~/lib/redirect';
5
5
 
@@ -1,5 +1,5 @@
1
1
  import {type LoaderFunctionArgs} from '@shopify/remix-oxygen';
2
- import {Link, useLoaderData, type MetaFunction} from '@remix-run/react';
2
+ import { Link, useLoaderData, type MetaFunction } from 'react-router';
3
3
  import {Image, getPaginationVariables} from '@shopify/hydrogen';
4
4
  import type {ArticleItemFragment} from 'storefrontapi.generated';
5
5
  import {PaginatedResourceSection} from '~/components/PaginatedResourceSection';
@@ -1,5 +1,5 @@
1
1
  import {type LoaderFunctionArgs} from '@shopify/remix-oxygen';
2
- import {Link, useLoaderData, type MetaFunction} from '@remix-run/react';
2
+ import { Link, useLoaderData, type MetaFunction } from 'react-router';
3
3
  import {getPaginationVariables} from '@shopify/hydrogen';
4
4
  import {PaginatedResourceSection} from '~/components/PaginatedResourceSection';
5
5
 
@@ -1,7 +1,12 @@
1
- import {type MetaFunction, useLoaderData} from '@remix-run/react';
1
+ import { type MetaFunction, useLoaderData } from 'react-router';
2
2
  import type {CartQueryDataReturn} from '@shopify/hydrogen';
3
3
  import {CartForm} from '@shopify/hydrogen';
4
- import {data, type LoaderFunctionArgs, type ActionFunctionArgs, type HeadersFunction} from '@shopify/remix-oxygen';
4
+ import {
5
+ data,
6
+ type LoaderFunctionArgs,
7
+ type ActionFunctionArgs,
8
+ type HeadersFunction,
9
+ } from '@shopify/remix-oxygen';
5
10
  import {CartMain} from '~/components/CartMain';
6
11
 
7
12
  export const meta: MetaFunction = () => {
@@ -1,5 +1,5 @@
1
1
  import {redirect, type LoaderFunctionArgs} from '@shopify/remix-oxygen';
2
- import {useLoaderData, type MetaFunction} from '@remix-run/react';
2
+ import {useLoaderData, type MetaFunction} from 'react-router';
3
3
  import {getPaginationVariables, Analytics} from '@shopify/hydrogen';
4
4
  import {PaginatedResourceSection} from '~/components/PaginatedResourceSection';
5
5
  import {redirectIfHandleIsLocalized} from '~/lib/redirect';
@@ -1,4 +1,4 @@
1
- import {useLoaderData, Link} from '@remix-run/react';
1
+ import { useLoaderData, Link } from 'react-router';
2
2
  import {type LoaderFunctionArgs} from '@shopify/remix-oxygen';
3
3
  import {getPaginationVariables, Image} from '@shopify/hydrogen';
4
4
  import type {CollectionFragment} from 'storefrontapi.generated';
@@ -1,6 +1,6 @@
1
1
  import {type LoaderFunctionArgs} from '@shopify/remix-oxygen';
2
- import {useLoaderData, type MetaFunction} from '@remix-run/react';
3
- import {getPaginationVariables} from '@shopify/hydrogen';
2
+ import {useLoaderData, type MetaFunction} from 'react-router';
3
+ import {getPaginationVariables, Image, Money} from '@shopify/hydrogen';
4
4
  import {PaginatedResourceSection} from '~/components/PaginatedResourceSection';
5
5
  import {ProductItem} from '~/components/ProductItem';
6
6
 
@@ -1,5 +1,5 @@
1
1
  import {type LoaderFunctionArgs} from '@shopify/remix-oxygen';
2
- import {useLoaderData, type MetaFunction} from '@remix-run/react';
2
+ import { useLoaderData, type MetaFunction } from 'react-router';
3
3
  import {redirectIfHandleIsLocalized} from '~/lib/redirect';
4
4
 
5
5
  export const meta: MetaFunction<typeof loader> = ({data}) => {
@@ -1,5 +1,5 @@
1
1
  import {type LoaderFunctionArgs} from '@shopify/remix-oxygen';
2
- import {Link, useLoaderData, type MetaFunction} from '@remix-run/react';
2
+ import { Link, useLoaderData, type MetaFunction } from 'react-router';
3
3
  import {type Shop} from '@shopify/hydrogen/storefront-api-types';
4
4
 
5
5
  type SelectedPolicies = keyof Pick<
@@ -1,5 +1,5 @@
1
1
  import {type LoaderFunctionArgs} from '@shopify/remix-oxygen';
2
- import {useLoaderData, Link} from '@remix-run/react';
2
+ import { useLoaderData, Link } from 'react-router';
3
3
 
4
4
  export async function loader({context}: LoaderFunctionArgs) {
5
5
  const data = await context.storefront.query(POLICIES_QUERY);
@@ -1,5 +1,5 @@
1
1
  import {redirect, type LoaderFunctionArgs} from '@shopify/remix-oxygen';
2
- import {useLoaderData, type MetaFunction} from '@remix-run/react';
2
+ import { useLoaderData, type MetaFunction } from 'react-router';
3
3
  import {
4
4
  getSelectedProductOptions,
5
5
  Analytics,
@@ -2,7 +2,7 @@ import {
2
2
  type LoaderFunctionArgs,
3
3
  type ActionFunctionArgs,
4
4
  } from '@shopify/remix-oxygen';
5
- import {useLoaderData, type MetaFunction} from '@remix-run/react';
5
+ import { useLoaderData, type MetaFunction } from 'react-router';
6
6
  import {getPaginationVariables, Analytics} from '@shopify/hydrogen';
7
7
  import {SearchForm} from '~/components/SearchForm';
8
8
  import {SearchResults} from '~/components/SearchResults';
@@ -1,5 +1,5 @@
1
- import {flatRoutes} from '@remix-run/fs-routes';
2
- import {type RouteConfig} from '@remix-run/route-config';
1
+ import {flatRoutes} from '@react-router/fs-routes';
2
+ import {type RouteConfig} from '@react-router/dev/routes';
3
3
  import {hydrogenRoutes} from '@shopify/hydrogen';
4
4
 
5
5
  export default hydrogenRoutes([
@@ -1,5 +1,5 @@
1
1
  /// <reference types="vite/client" />
2
- /// <reference types="@shopify/remix-oxygen" />
2
+ /// <reference types="react-router" />
3
3
  /// <reference types="@shopify/oxygen-workers-types" />
4
4
 
5
5
  // Enhance TypeScript's built-in typings.
@@ -23,12 +23,22 @@ declare global {
23
23
  }
24
24
  }
25
25
 
26
- declare module '@shopify/remix-oxygen' {
26
+ declare module 'react-router' {
27
27
  interface AppLoadContext
28
28
  extends Awaited<ReturnType<typeof createAppLoadContext>> {
29
29
  // to change context type, change the return of createAppLoadContext() instead
30
30
  }
31
31
 
32
+ // TODO: remove this once we've migrated our loaders to `Route.LoaderArgs`
33
+ interface LoaderFunctionArgs {
34
+ context: AppLoadContext;
35
+ }
36
+
37
+ // TODO: remove this once we've migrated our loaders to `Route.ActionArgs`
38
+ interface ActionFunctionArgs {
39
+ context: AppLoadContext;
40
+ }
41
+
32
42
  interface SessionData extends HydrogenSessionData {
33
43
  // declare local additions to the Remix session data here
34
44
  }
@@ -29,6 +29,8 @@ export default [
29
29
  '**/*.graphql.d.ts',
30
30
  '**/*.graphql.ts',
31
31
  '**/*.generated.d.ts',
32
+ '**/.react-router/',
33
+ '**/packages/hydrogen/dist/',
32
34
  ],
33
35
  },
34
36
  ...fixupConfigRules(
@@ -2,7 +2,7 @@
2
2
  "name": "skeleton",
3
3
  "private": true,
4
4
  "sideEffects": false,
5
- "version": "2025.1.7",
5
+ "version": "2025.5.2",
6
6
  "type": "module",
7
7
  "scripts": {
8
8
  "build": "shopify hydrogen build --codegen",
@@ -14,31 +14,29 @@
14
14
  },
15
15
  "prettier": "@shopify/prettier-config",
16
16
  "dependencies": {
17
- "@remix-run/react": "^2.16.1",
18
- "@remix-run/server-runtime": "^2.16.1",
17
+ "@shopify/hydrogen": "2025.5.0",
18
+ "@shopify/remix-oxygen": "^3.0.0",
19
19
  "graphql": "^16.10.0",
20
- "@shopify/hydrogen": "2025.1.4",
21
- "@shopify/remix-oxygen": "^2.0.12",
22
20
  "graphql-tag": "^2.12.6",
23
21
  "isbot": "^5.1.22",
24
22
  "react": "^18.2.0",
25
- "react-dom": "^18.2.0"
23
+ "react-dom": "^18.2.0",
24
+ "react-router": "7.6.0",
25
+ "react-router-dom": "7.6.0"
26
26
  },
27
27
  "devDependencies": {
28
28
  "@eslint/compat": "^1.2.5",
29
29
  "@eslint/eslintrc": "^3.2.0",
30
30
  "@eslint/js": "^9.18.0",
31
31
  "@graphql-codegen/cli": "5.0.2",
32
- "@remix-run/dev": "^2.16.1",
33
- "@remix-run/fs-routes": "^2.16.1",
34
- "@remix-run/route-config": "^2.16.1",
35
- "@shopify/cli": "~3.78.1",
32
+ "@react-router/dev": "7.6.0",
33
+ "@react-router/fs-routes": "7.6.0",
34
+ "@shopify/cli": "~3.80.4",
36
35
  "@shopify/hydrogen-codegen": "^0.3.3",
37
36
  "@shopify/mini-oxygen": "^3.2.1",
38
37
  "@shopify/oxygen-workers-types": "^4.1.6",
39
38
  "@shopify/prettier-config": "^1.1.2",
40
39
  "@total-typescript/ts-reset": "^0.6.1",
41
- "prettier": "^3.4.2",
42
40
  "@types/eslint": "^9.6.1",
43
41
  "@types/react": "^18.2.22",
44
42
  "@types/react-dom": "^18.2.7",
@@ -54,6 +52,7 @@
54
52
  "eslint-plugin-react": "^7.37.4",
55
53
  "eslint-plugin-react-hooks": "^5.1.0",
56
54
  "globals": "^15.14.0",
55
+ "prettier": "^3.4.2",
57
56
  "typescript": "^5.2.2",
58
57
  "vite": "^6.2.4",
59
58
  "vite-tsconfig-paths": "^4.3.1"
@@ -61,4 +60,4 @@
61
60
  "engines": {
62
61
  "node": ">=18.0.0"
63
62
  }
64
- }
63
+ }
@@ -0,0 +1,7 @@
1
+ import type {Config} from '@react-router/dev/config';
2
+
3
+ export default {
4
+ appDirectory: 'app',
5
+ buildDirectory: 'dist',
6
+ ssr: true,
7
+ } satisfies Config;
@@ -1,8 +1,4 @@
1
1
  // Virtual entry point for the app
2
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
3
- // @ts-ignore
4
- // eslint-disable-next-line import/no-unresolved
5
- import * as remixBuild from 'virtual:remix/server-build';
6
2
  import {storefrontRedirect} from '@shopify/hydrogen';
7
3
  import {createRequestHandler} from '@shopify/remix-oxygen';
8
4
  import {createAppLoadContext} from '~/lib/context';
@@ -28,7 +24,8 @@ export default {
28
24
  * Hydrogen's Storefront client to the loader context.
29
25
  */
30
26
  const handleRequest = createRequestHandler({
31
- build: remixBuild,
27
+ // eslint-disable-next-line import/no-unresolved
28
+ build: await import('virtual:react-router/server-build'),
32
29
  mode: process.env.NODE_ENV,
33
30
  getLoadContext: () => appLoadContext,
34
31
  });