@shopify/cli 3.80.2 → 3.80.4
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.
- package/dist/assets/hydrogen/starter/.cursor/rules/hydrogen-react-router.mdc +50 -0
- package/dist/assets/hydrogen/starter/CHANGELOG.md +63 -40
- package/dist/assets/hydrogen/starter/app/components/AddToCartButton.tsx +1 -1
- package/dist/assets/hydrogen/starter/app/components/CartLineItem.tsx +1 -1
- package/dist/assets/hydrogen/starter/app/components/CartMain.tsx +1 -1
- package/dist/assets/hydrogen/starter/app/components/CartSummary.tsx +1 -1
- package/dist/assets/hydrogen/starter/app/components/Footer.tsx +1 -1
- package/dist/assets/hydrogen/starter/app/components/Header.tsx +1 -1
- package/dist/assets/hydrogen/starter/app/components/PageLayout.tsx +1 -1
- package/dist/assets/hydrogen/starter/app/components/ProductForm.tsx +1 -1
- package/dist/assets/hydrogen/starter/app/components/ProductItem.tsx +1 -1
- package/dist/assets/hydrogen/starter/app/components/SearchForm.tsx +1 -1
- package/dist/assets/hydrogen/starter/app/components/SearchFormPredictive.tsx +1 -6
- package/dist/assets/hydrogen/starter/app/components/SearchResults.tsx +1 -1
- package/dist/assets/hydrogen/starter/app/components/SearchResultsPredictive.tsx +1 -1
- package/dist/assets/hydrogen/starter/app/entry.client.tsx +2 -2
- package/dist/assets/hydrogen/starter/app/entry.server.tsx +9 -4
- package/dist/assets/hydrogen/starter/app/lib/variants.ts +1 -1
- package/dist/assets/hydrogen/starter/app/root.tsx +1 -1
- package/dist/assets/hydrogen/starter/app/routes/_index.tsx +1 -1
- package/dist/assets/hydrogen/starter/app/routes/account.addresses.tsx +1 -1
- package/dist/assets/hydrogen/starter/app/routes/account.orders.$id.tsx +4 -4
- package/dist/assets/hydrogen/starter/app/routes/account.orders._index.tsx +1 -1
- package/dist/assets/hydrogen/starter/app/routes/account.profile.tsx +1 -7
- package/dist/assets/hydrogen/starter/app/routes/account.tsx +1 -1
- package/dist/assets/hydrogen/starter/app/routes/api.$version.[graphql.json].tsx +14 -0
- package/dist/assets/hydrogen/starter/app/routes/blogs.$blogHandle.$articleHandle.tsx +1 -1
- package/dist/assets/hydrogen/starter/app/routes/blogs.$blogHandle._index.tsx +1 -1
- package/dist/assets/hydrogen/starter/app/routes/blogs._index.tsx +1 -1
- package/dist/assets/hydrogen/starter/app/routes/cart.tsx +7 -2
- package/dist/assets/hydrogen/starter/app/routes/collections.$handle.tsx +1 -1
- package/dist/assets/hydrogen/starter/app/routes/collections._index.tsx +1 -1
- package/dist/assets/hydrogen/starter/app/routes/collections.all.tsx +2 -2
- package/dist/assets/hydrogen/starter/app/routes/pages.$handle.tsx +1 -1
- package/dist/assets/hydrogen/starter/app/routes/policies.$handle.tsx +1 -1
- package/dist/assets/hydrogen/starter/app/routes/policies._index.tsx +1 -1
- package/dist/assets/hydrogen/starter/app/routes/products.$handle.tsx +1 -1
- package/dist/assets/hydrogen/starter/app/routes/search.tsx +1 -1
- package/dist/assets/hydrogen/starter/app/routes.ts +2 -2
- package/dist/assets/hydrogen/starter/env.d.ts +12 -2
- package/dist/assets/hydrogen/starter/eslint.config.js +2 -0
- package/dist/assets/hydrogen/starter/package.json +11 -12
- package/dist/assets/hydrogen/starter/react-router.config.ts +7 -0
- package/dist/assets/hydrogen/starter/server.ts +2 -5
- package/dist/assets/hydrogen/starter/tsconfig.json +18 -6
- package/dist/assets/hydrogen/starter/vite.config.ts +2 -23
- package/dist/assets/hydrogen/tailwind/package.json +4 -1
- package/dist/assets/hydrogen/virtual-routes/components/RequestDetails.jsx +1 -1
- package/dist/assets/hydrogen/virtual-routes/layout.jsx +1 -7
- package/dist/assets/hydrogen/virtual-routes/routes/index.jsx +1 -1
- package/dist/assets/hydrogen/virtual-routes/routes/subrequest-profiler.jsx +1 -1
- package/dist/assets/hydrogen/virtual-routes/virtual-root-with-layout.jsx +1 -1
- package/dist/assets/hydrogen/virtual-routes/virtual-root.jsx +1 -1
- package/dist/assets/hydrogen/vite/vite.config.js +1 -1
- package/dist/{chunk-DOBXMM33.js → chunk-22KQHOXJ.js} +2 -2
- package/dist/{chunk-LSS7RKE5.js → chunk-3DDKTA7S.js} +4 -4
- package/dist/{chunk-5QY6PIXL.js → chunk-3WZJKL5I.js} +2 -2
- package/dist/{chunk-6D5FAXPI.js → chunk-4DKJ765Z.js} +4 -4
- package/dist/{chunk-ZUCWDIGE.js → chunk-57Q6OQG4.js} +2 -2
- package/dist/{chunk-N4S4LVBN.js → chunk-72EQI7B6.js} +2 -2
- package/dist/{chunk-NBZV5TLE.js → chunk-A3FV2Y5F.js} +298 -481
- package/dist/{chunk-WYY5EJJ4.js → chunk-AKFTTMP7.js} +2 -2
- package/dist/{chunk-KXHYVBE7.js → chunk-D7FVBSG2.js} +2 -2
- package/dist/{chunk-ZUPUZB5E.js → chunk-DTZTWKIB.js} +3 -3
- package/dist/{chunk-Z5SR6RSK.js → chunk-EBDVIUOD.js} +7 -7
- package/dist/{chunk-SBI2O7OA.js → chunk-EV63EJKX.js} +3 -3
- package/dist/{chunk-VO4QHHT5.js → chunk-FE76VMCW.js} +3 -3
- package/dist/{chunk-USCL7RU6.js → chunk-FOC6QQ3Z.js} +7 -7
- package/dist/{chunk-YKGJG5NV.js → chunk-FTFP354F.js} +4 -4
- package/dist/{chunk-P3TB2SEC.js → chunk-G6KVL4TS.js} +4 -4
- package/dist/{chunk-2IZLMFQP.js → chunk-HDXBAFR4.js} +4 -4
- package/dist/{chunk-6QZPI7VX.js → chunk-HJMWM6XE.js} +5 -5
- package/dist/{chunk-3RLUCO75.js → chunk-HTPOBJEV.js} +5 -5
- package/dist/{chunk-TN2FKTOD.js → chunk-IRKPDUZE.js} +6 -6
- package/dist/{chunk-VE3Y2LOL.js → chunk-JHJEXKDW.js} +2 -2
- package/dist/{chunk-ECCBPHFN.js → chunk-JJMWQP2L.js} +5 -5
- package/dist/{chunk-JHPOVV6S.js → chunk-JR36QMOU.js} +6 -6
- package/dist/{chunk-ACD7OYBN.js → chunk-MIJF5LNA.js} +4 -4
- package/dist/{chunk-YS7IILO5.js → chunk-MJBSMK2E.js} +3 -3
- package/dist/{chunk-GT5A5BQA.js → chunk-NJDE4VHA.js} +3 -3
- package/dist/{chunk-5OVYR4FU.js → chunk-NPWBOQKI.js} +3 -3
- package/dist/{chunk-3XFGY3UH.js → chunk-NRAZQETL.js} +3 -3
- package/dist/{chunk-XEESJLXB.js → chunk-QXOOIYRJ.js} +2 -2
- package/dist/{chunk-UK4Z4LHC.js → chunk-RPVZXBFY.js} +4 -4
- package/dist/{chunk-MWSDIOYX.js → chunk-RTFBL435.js} +3 -3
- package/dist/{chunk-QGWSGS2C.js → chunk-Z4ZLMWHP.js} +6 -6
- package/dist/{chunk-Q3VYFTPI.js → chunk-Z7RQZ537.js} +3 -3
- package/dist/{chunk-LNQMCTHE.js → chunk-ZMQFWHEX.js} +5 -5
- package/dist/{chunk-ZUMJTXNY.js → chunk-ZVMNEYFH.js} +3 -3
- package/dist/cli/commands/auth/logout.js +12 -12
- package/dist/cli/commands/auth/logout.test.js +13 -13
- package/dist/cli/commands/cache/clear.js +11 -11
- package/dist/cli/commands/debug/command-flags.js +11 -11
- package/dist/cli/commands/docs/generate.js +11 -11
- package/dist/cli/commands/docs/generate.test.js +11 -11
- package/dist/cli/commands/help.js +11 -11
- package/dist/cli/commands/kitchen-sink/async.js +12 -12
- package/dist/cli/commands/kitchen-sink/async.test.js +12 -12
- package/dist/cli/commands/kitchen-sink/index.js +14 -14
- package/dist/cli/commands/kitchen-sink/index.test.js +14 -14
- package/dist/cli/commands/kitchen-sink/prompts.js +12 -12
- package/dist/cli/commands/kitchen-sink/prompts.test.js +12 -12
- package/dist/cli/commands/kitchen-sink/static.js +12 -12
- package/dist/cli/commands/kitchen-sink/static.test.js +12 -12
- package/dist/cli/commands/notifications/generate.js +12 -12
- package/dist/cli/commands/notifications/list.js +12 -12
- package/dist/cli/commands/search.js +12 -12
- package/dist/cli/commands/upgrade.js +12 -12
- package/dist/cli/commands/version.js +12 -12
- package/dist/cli/commands/version.test.js +12 -12
- package/dist/cli/services/commands/notifications.js +7 -7
- package/dist/cli/services/commands/search.js +3 -3
- package/dist/cli/services/commands/search.test.js +3 -3
- package/dist/cli/services/commands/version.js +4 -4
- package/dist/cli/services/commands/version.test.js +5 -5
- package/dist/cli/services/kitchen-sink/async.js +3 -3
- package/dist/cli/services/kitchen-sink/prompts.js +3 -3
- package/dist/cli/services/kitchen-sink/static.js +3 -3
- package/dist/cli/services/upgrade.js +4 -4
- package/dist/cli/services/upgrade.test.js +5 -5
- package/dist/{custom-oclif-loader-MHHSG7KE.js → custom-oclif-loader-FJYCRCHY.js} +3 -3
- package/dist/{error-handler-UIIZ6WY4.js → error-handler-ZFOBG3KZ.js} +9 -9
- package/dist/hooks/postrun.js +7 -7
- package/dist/hooks/prerun.js +8 -8
- package/dist/index.js +756 -1117
- package/dist/{local-U7P6SLN7.js → local-7CUVJHVC.js} +3 -3
- package/dist/{morph-EB6ON4RE.js → morph-EKLK7JWU.js} +9 -9
- package/dist/{node-package-manager-VJYZODW2.js → node-package-manager-KJ2WBUZP.js} +4 -4
- package/dist/{path-GWAZZN2N.js → path-2K5HIMHZ.js} +2 -2
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/{ui-WCKYO4TM.js → ui-5JYYJU2R.js} +3 -3
- package/dist/{workerd-EVZOUIC3.js → workerd-GXYWGSKC.js} +14 -14
- package/oclif.manifest.json +5 -26
- package/package.json +7 -7
- package/dist/assets/hydrogen/starter/.cursor/rules/cookbook-recipe-subscriptions.mdc +0 -921
- package/dist/chunk-NOSVFQH5.js +0 -107
- package/dist/node-MTMGWWAZ.js +0 -166
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: This Hydrogen project is based on react-router, NOT @remix-run/react!
|
|
3
|
+
globs: *
|
|
4
|
+
alwaysApply: false
|
|
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
|
+
## Common Import Examples
|
|
33
|
+
|
|
34
|
+
```js
|
|
35
|
+
// INCORRECT (Remix style)
|
|
36
|
+
import { useLoaderData, Link, Form, useActionData, useNavigation, useSubmit } from '@remix-run/react';
|
|
37
|
+
|
|
38
|
+
// CORRECT (React Router style)
|
|
39
|
+
import { useLoaderData, Link, Form, useActionData, useNavigation, useSubmit } from 'react-router';
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## Development Guidelines
|
|
43
|
+
|
|
44
|
+
1. Always check existing code in the project to understand which specific React Router hooks and components are being used
|
|
45
|
+
2. When generating new code or modifying existing code, ensure all routing-related imports come from the correct React Router packages
|
|
46
|
+
3. If following documentation or examples based on Remix, adapt the code to use React Router equivalents
|
|
47
|
+
|
|
48
|
+
When working in this codebase, always follow the React Router patterns that are already established in the existing code.
|
|
49
|
+
|
|
50
|
+
For more information, consult the official Remix to React Router upgrade guide: https://reactrouter.com/upgrading/remix
|
|
@@ -1,5 +1,28 @@
|
|
|
1
1
|
# skeleton
|
|
2
2
|
|
|
3
|
+
## 2025.5.0
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Migrating to React Router 7 ([#2866](https://github.com/Shopify/hydrogen/pull/2866)) by [@balazsbajorics](https://github.com/balazsbajorics)
|
|
8
|
+
|
|
9
|
+
- Updated dependencies [[`e9132d88`](https://github.com/Shopify/hydrogen/commit/e9132d8888ad090d3db41fe4d5d63569a30e9d8e), [`e9132d88`](https://github.com/Shopify/hydrogen/commit/e9132d8888ad090d3db41fe4d5d63569a30e9d8e)]:
|
|
10
|
+
- @shopify/remix-oxygen@3.0.0
|
|
11
|
+
- @shopify/hydrogen@2025.5.0
|
|
12
|
+
|
|
13
|
+
## 2025.4.0
|
|
14
|
+
|
|
15
|
+
### Patch Changes
|
|
16
|
+
|
|
17
|
+
- 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)
|
|
18
|
+
|
|
19
|
+
- Bump skeleton @shopify/cli and @shopify/mini-oxygen ([#2883](https://github.com/Shopify/hydrogen/pull/2883)) by [@juanpprieto](https://github.com/juanpprieto)
|
|
20
|
+
|
|
21
|
+
- Update SFAPI and CAAPI versions to 2025.04 ([#2886](https://github.com/Shopify/hydrogen/pull/2886)) by [@juanpprieto](https://github.com/juanpprieto)
|
|
22
|
+
|
|
23
|
+
- Updated dependencies [[`af23e710`](https://github.com/Shopify/hydrogen/commit/af23e710dac83bb57498d9c2ef1d8bcf9df55d34), [`9d8a6644`](https://github.com/Shopify/hydrogen/commit/9d8a6644a5b67dca890c6687df390aee78fc85c3)]:
|
|
24
|
+
- @shopify/hydrogen@2025.4.0
|
|
25
|
+
|
|
3
26
|
## 2025.1.7
|
|
4
27
|
|
|
5
28
|
### Patch Changes
|
|
@@ -137,13 +160,13 @@
|
|
|
137
160
|
1. Add a routes.ts file. This is your new Remix route configuration file.
|
|
138
161
|
|
|
139
162
|
```ts
|
|
140
|
-
import {
|
|
141
|
-
import {
|
|
142
|
-
import {
|
|
163
|
+
import {flatRoutes} from '@remix-run/fs-routes';
|
|
164
|
+
import {layout, type RouteConfig} from '@remix-run/route-config';
|
|
165
|
+
import {hydrogenRoutes} from '@shopify/hydrogen';
|
|
143
166
|
|
|
144
167
|
export default hydrogenRoutes([
|
|
145
168
|
// Your entire app reading from routes folder using Layout from layout.tsx
|
|
146
|
-
layout(
|
|
169
|
+
layout('./layout.tsx', await flatRoutes()),
|
|
147
170
|
]) satisfies RouteConfig;
|
|
148
171
|
```
|
|
149
172
|
|
|
@@ -734,25 +757,25 @@
|
|
|
734
757
|
8. Update the `ProductForm` component.
|
|
735
758
|
|
|
736
759
|
```tsx
|
|
737
|
-
import {
|
|
738
|
-
import {
|
|
760
|
+
import {Link, useNavigate} from '@remix-run/react';
|
|
761
|
+
import {type MappedProductOptions} from '@shopify/hydrogen';
|
|
739
762
|
import type {
|
|
740
763
|
Maybe,
|
|
741
764
|
ProductOptionValueSwatch,
|
|
742
|
-
} from
|
|
743
|
-
import {
|
|
744
|
-
import {
|
|
745
|
-
import type {
|
|
765
|
+
} from '@shopify/hydrogen/storefront-api-types';
|
|
766
|
+
import {AddToCartButton} from './AddToCartButton';
|
|
767
|
+
import {useAside} from './Aside';
|
|
768
|
+
import type {ProductFragment} from 'storefrontapi.generated';
|
|
746
769
|
|
|
747
770
|
export function ProductForm({
|
|
748
771
|
productOptions,
|
|
749
772
|
selectedVariant,
|
|
750
773
|
}: {
|
|
751
774
|
productOptions: MappedProductOptions[];
|
|
752
|
-
selectedVariant: ProductFragment[
|
|
775
|
+
selectedVariant: ProductFragment['selectedOrFirstAvailableVariant'];
|
|
753
776
|
}) {
|
|
754
777
|
const navigate = useNavigate();
|
|
755
|
-
const {
|
|
778
|
+
const {open} = useAside();
|
|
756
779
|
return (
|
|
757
780
|
<div className="product-form">
|
|
758
781
|
{productOptions.map((option) => (
|
|
@@ -786,8 +809,8 @@
|
|
|
786
809
|
to={`/products/${handle}?${variantUriQuery}`}
|
|
787
810
|
style={{
|
|
788
811
|
border: selected
|
|
789
|
-
?
|
|
790
|
-
:
|
|
812
|
+
? '1px solid black'
|
|
813
|
+
: '1px solid transparent',
|
|
791
814
|
opacity: available ? 1 : 0.3,
|
|
792
815
|
}}
|
|
793
816
|
>
|
|
@@ -804,13 +827,13 @@
|
|
|
804
827
|
<button
|
|
805
828
|
type="button"
|
|
806
829
|
className={`product-options-item${
|
|
807
|
-
exists && !selected ?
|
|
830
|
+
exists && !selected ? ' link' : ''
|
|
808
831
|
}`}
|
|
809
832
|
key={option.name + name}
|
|
810
833
|
style={{
|
|
811
834
|
border: selected
|
|
812
|
-
?
|
|
813
|
-
:
|
|
835
|
+
? '1px solid black'
|
|
836
|
+
: '1px solid transparent',
|
|
814
837
|
opacity: available ? 1 : 0.3,
|
|
815
838
|
}}
|
|
816
839
|
disabled={!exists}
|
|
@@ -834,7 +857,7 @@
|
|
|
834
857
|
<AddToCartButton
|
|
835
858
|
disabled={!selectedVariant || !selectedVariant.availableForSale}
|
|
836
859
|
onClick={() => {
|
|
837
|
-
open(
|
|
860
|
+
open('cart');
|
|
838
861
|
}}
|
|
839
862
|
lines={
|
|
840
863
|
selectedVariant
|
|
@@ -848,7 +871,7 @@
|
|
|
848
871
|
: []
|
|
849
872
|
}
|
|
850
873
|
>
|
|
851
|
-
{selectedVariant?.availableForSale ?
|
|
874
|
+
{selectedVariant?.availableForSale ? 'Add to cart' : 'Sold out'}
|
|
852
875
|
</AddToCartButton>
|
|
853
876
|
</div>
|
|
854
877
|
);
|
|
@@ -871,7 +894,7 @@
|
|
|
871
894
|
aria-label={name}
|
|
872
895
|
className="product-option-label-swatch"
|
|
873
896
|
style={{
|
|
874
|
-
backgroundColor: color ||
|
|
897
|
+
backgroundColor: color || 'transparent',
|
|
875
898
|
}}
|
|
876
899
|
>
|
|
877
900
|
{!!image && <img src={image} alt={name} />}
|
|
@@ -1372,21 +1395,21 @@
|
|
|
1372
1395
|
New `withCache.fetch` is for caching simple fetch requests. This method caches the responses if they are OK responses, and you can pass `shouldCacheResponse`, `cacheKey`, etc. to modify behavior. `data` is the consumed body of the response (we need to consume to cache it).
|
|
1373
1396
|
|
|
1374
1397
|
```ts
|
|
1375
|
-
const withCache = createWithCache({
|
|
1398
|
+
const withCache = createWithCache({cache, waitUntil, request});
|
|
1376
1399
|
|
|
1377
|
-
const {
|
|
1378
|
-
|
|
1400
|
+
const {data, response} = await withCache.fetch<{data: T; error: string}>(
|
|
1401
|
+
'my-cms.com/api',
|
|
1379
1402
|
{
|
|
1380
|
-
method:
|
|
1381
|
-
headers: {
|
|
1403
|
+
method: 'POST',
|
|
1404
|
+
headers: {'Content-type': 'application/json'},
|
|
1382
1405
|
body,
|
|
1383
1406
|
},
|
|
1384
1407
|
{
|
|
1385
1408
|
cacheStrategy: CacheLong(),
|
|
1386
1409
|
// Cache if there are no data errors or a specific data that make this result not suited for caching
|
|
1387
1410
|
shouldCacheResponse: (result) => !result?.error,
|
|
1388
|
-
cacheKey: [
|
|
1389
|
-
displayName:
|
|
1411
|
+
cacheKey: ['my-cms', body],
|
|
1412
|
+
displayName: 'My CMS query',
|
|
1390
1413
|
},
|
|
1391
1414
|
);
|
|
1392
1415
|
```
|
|
@@ -1962,9 +1985,9 @@
|
|
|
1962
1985
|
|
|
1963
1986
|
```tsx
|
|
1964
1987
|
// app/lib/root-data.ts
|
|
1965
|
-
import {
|
|
1966
|
-
import type {
|
|
1967
|
-
import type {
|
|
1988
|
+
import {useMatches} from '@remix-run/react';
|
|
1989
|
+
import type {SerializeFrom} from '@shopify/remix-oxygen';
|
|
1990
|
+
import type {loader} from '~/root';
|
|
1968
1991
|
|
|
1969
1992
|
/**
|
|
1970
1993
|
* Access the result of the root loader from a React component.
|
|
@@ -2126,10 +2149,10 @@
|
|
|
2126
2149
|
- This is an important fix to a bug with 404 routes and path-based i18n projects where some unknown routes would not properly render a 404. This fixes all new projects, but to fix existing projects, add a `($locale).tsx` route with the following contents: ([#1732](https://github.com/Shopify/hydrogen/pull/1732)) by [@blittle](https://github.com/blittle)
|
|
2127
2150
|
|
|
2128
2151
|
```ts
|
|
2129
|
-
import {
|
|
2152
|
+
import {type LoaderFunctionArgs} from '@remix-run/server-runtime';
|
|
2130
2153
|
|
|
2131
|
-
export async function loader({
|
|
2132
|
-
const {
|
|
2154
|
+
export async function loader({params, context}: LoaderFunctionArgs) {
|
|
2155
|
+
const {language, country} = context.storefront.i18n;
|
|
2133
2156
|
|
|
2134
2157
|
if (
|
|
2135
2158
|
params.locale &&
|
|
@@ -2137,7 +2160,7 @@
|
|
|
2137
2160
|
) {
|
|
2138
2161
|
// If the locale URL param is defined, yet we still are still at the default locale
|
|
2139
2162
|
// then the the locale param must be invalid, send to the 404 page
|
|
2140
|
-
throw new Response(null, {
|
|
2163
|
+
throw new Response(null, {status: 404});
|
|
2141
2164
|
}
|
|
2142
2165
|
|
|
2143
2166
|
return null;
|
|
@@ -2193,11 +2216,11 @@
|
|
|
2193
2216
|
```yaml
|
|
2194
2217
|
projects:
|
|
2195
2218
|
default:
|
|
2196
|
-
schema:
|
|
2219
|
+
schema: 'node_modules/@shopify/hydrogen/storefront.schema.json'
|
|
2197
2220
|
documents:
|
|
2198
|
-
-
|
|
2199
|
-
-
|
|
2200
|
-
-
|
|
2221
|
+
- '!*.d.ts'
|
|
2222
|
+
- '*.{ts,tsx,js,jsx}'
|
|
2223
|
+
- 'app/**/*.{ts,tsx,js,jsx}'
|
|
2201
2224
|
```
|
|
2202
2225
|
|
|
2203
2226
|
- Improve resiliency of `HydrogenSession` ([#1583](https://github.com/Shopify/hydrogen/pull/1583)) by [@blittle](https://github.com/blittle)
|
|
@@ -2412,8 +2435,8 @@
|
|
|
2412
2435
|
```ts
|
|
2413
2436
|
// root.tsx
|
|
2414
2437
|
|
|
2415
|
-
import {
|
|
2416
|
-
import {
|
|
2438
|
+
import {useMatches} from '@remix-run/react';
|
|
2439
|
+
import {type SerializeFrom} from '@shopify/remix-oxygen';
|
|
2417
2440
|
|
|
2418
2441
|
export const useRootLoaderData = () => {
|
|
2419
2442
|
const [root] = useMatches();
|
|
@@ -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 '
|
|
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 '
|
|
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 '
|
|
5
|
+
import { FetcherWithComponents } from 'react-router';
|
|
6
6
|
|
|
7
7
|
type CartSummaryProps = {
|
|
8
8
|
cart: OptimisticCart<CartApiQueryFragment | null>;
|
|
@@ -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 {
|
|
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
|
-
<
|
|
10
|
+
<HydratedRouter />
|
|
11
11
|
</StrictMode>,
|
|
12
12
|
);
|
|
13
13
|
});
|
|
@@ -1,14 +1,15 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import {
|
|
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
|
-
|
|
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
|
-
<
|
|
24
|
+
<ServerRouter
|
|
25
|
+
context={reactRouterContext}
|
|
26
|
+
url={request.url}
|
|
27
|
+
nonce={nonce}
|
|
28
|
+
/>
|
|
24
29
|
</NonceProvider>,
|
|
25
30
|
{
|
|
26
31
|
nonce,
|
|
@@ -10,7 +10,7 @@ import {
|
|
|
10
10
|
Scripts,
|
|
11
11
|
ScrollRestoration,
|
|
12
12
|
useRouteLoaderData,
|
|
13
|
-
} from '
|
|
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 '
|
|
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 {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import {redirect, type LoaderFunctionArgs} from '@shopify/remix-oxygen';
|
|
2
|
-
import {useLoaderData, type MetaFunction} from '
|
|
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
|
|
|
@@ -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 '
|
|
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 '
|
|
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 '
|
|
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 '
|
|
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 '
|
|
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 {
|
|
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 '
|
|
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 '
|
|
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 '
|
|
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 '
|
|
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 '
|
|
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<
|