@shopify/cli 3.77.0 → 3.78.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assets/hydrogen/bundle/analyzer.html +21 -17
- package/dist/assets/hydrogen/starter/CHANGELOG.md +167 -36
- package/dist/assets/hydrogen/starter/app/root.tsx +11 -11
- package/dist/assets/hydrogen/starter/app/routes/search.tsx +4 -3
- package/dist/assets/hydrogen/starter/app/routes.ts +9 -0
- package/dist/assets/hydrogen/starter/package.json +17 -15
- package/dist/assets/hydrogen/starter/tsconfig.json +1 -1
- package/dist/assets/hydrogen/starter/vite.config.ts +2 -1
- package/dist/assets/hydrogen/tailwind/package.json +1 -1
- package/dist/assets/hydrogen/vanilla-extract/package.json +2 -2
- package/dist/assets/hydrogen/virtual-routes/assets/debug-network.css +27 -10
- package/dist/assets/hydrogen/virtual-routes/assets/styles.css +13 -2
- package/dist/assets/hydrogen/virtual-routes/layout.jsx +39 -0
- package/dist/assets/hydrogen/virtual-routes/virtual-root-with-layout.jsx +63 -0
- package/dist/assets/hydrogen/virtual-routes/virtual-root.jsx +10 -8
- package/dist/assets/hydrogen/vite/package.json +1 -1
- package/dist/assets/hydrogen/vite/vite.config.js +1 -0
- package/dist/{chunk-RA5UDHSI.js → chunk-2YVR2YAE.js} +3 -3
- package/dist/{chunk-O5U2T7LH.js → chunk-35A3HBTL.js} +4 -4
- package/dist/{chunk-CBLCYLJO.js → chunk-35XDICNP.js} +2 -2
- package/dist/{chunk-QVZW3IVL.js → chunk-5LKOKELK.js} +36 -32
- package/dist/{chunk-PHWPEUZI.js → chunk-A5LK333I.js} +3 -3
- package/dist/{chunk-LLYJXSNC.js → chunk-BV6PURBM.js} +3 -3
- package/dist/{chunk-GPICPOCE.js → chunk-C3Q6M5C3.js} +3 -3
- package/dist/{chunk-AW7SZYGV.js → chunk-D2R3AM3S.js} +6 -6
- package/dist/{chunk-3ARIMAIR.js → chunk-FIH2SHBE.js} +4 -4
- package/dist/{chunk-RWT677FV.js → chunk-GEAXCEGF.js} +4 -4
- package/dist/{chunk-7IKFEU6I.js → chunk-GRJWPHAK.js} +2 -2
- package/dist/{chunk-ACSVNEID.js → chunk-HLFLQFAO.js} +5 -5
- package/dist/{chunk-FJAIUBHO.js → chunk-HQF3OQCV.js} +6 -6
- package/dist/{chunk-5ZMRZCPZ.js → chunk-ICGAJSRH.js} +2 -2
- package/dist/{chunk-6ZKE2WPK.js → chunk-IJLYOQTB.js} +2 -2
- package/dist/{chunk-ZVNHCLRN.js → chunk-K6OZPDRE.js} +3 -3
- package/dist/{chunk-IX7XAR6F.js → chunk-KJNPOPZU.js} +3 -3
- package/dist/{chunk-SO33Y5TT.js → chunk-KKK42SBP.js} +3 -3
- package/dist/{chunk-AUBRXAVZ.js → chunk-KUVHPVGH.js} +3 -3
- package/dist/{chunk-DHO2PUCK.js → chunk-MLQTLKNQ.js} +2 -2
- package/dist/{chunk-S3PY2ULH.js → chunk-N2GQBM45.js} +13 -4
- package/dist/{chunk-V5G4FJZH.js → chunk-NCYK3NPS.js} +288 -241
- package/dist/{chunk-VSKRQ3JT.js → chunk-QAKYKTFV.js} +2 -1
- package/dist/{chunk-NZVJ77WD.js → chunk-QVDCZMPL.js} +3 -3
- package/dist/{chunk-J3C7BGUW.js → chunk-R2JN4S25.js} +4 -4
- package/dist/{chunk-YXR557PE.js → chunk-RYZBD47F.js} +3 -3
- package/dist/{chunk-AZ33PIX2.js → chunk-S6ZWGAX6.js} +8 -8
- package/dist/{chunk-ZKUNCSWD.js → chunk-TQMZLUGH.js} +5 -5
- package/dist/{chunk-YL7TDFFA.js → chunk-UDNM674J.js} +3 -3
- package/dist/{chunk-74V7KQLD.js → chunk-VAMD3FV3.js} +4 -4
- package/dist/{chunk-WN6OLVLP.js → chunk-VNCW4T6F.js} +4 -4
- package/dist/{chunk-4BPRKRYD.js → chunk-VNKMVUTV.js} +5 -5
- package/dist/{chunk-VTEM2QWG.js → chunk-VTV2W43J.js} +3 -3
- package/dist/{chunk-U7E5RRYF.js → chunk-WM4XS6OG.js} +3 -3
- package/dist/{chunk-MYIEKIZR.js → chunk-WVISX7R6.js} +2 -2
- package/dist/{chunk-NHMQOM7T.js → chunk-XSNERQSV.js} +2 -2
- 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-TE6EUPGI.js → custom-oclif-loader-URFPN7T5.js} +3 -3
- package/dist/data/default_setting_values.json +0 -56
- package/dist/data/latest.json +1 -1
- package/dist/{error-handler-WC4XSLZQ.js → error-handler-JMG43AG2.js} +9 -9
- package/dist/hooks/postrun.js +7 -7
- package/dist/hooks/prerun.js +8 -8
- package/dist/index.js +49586 -10952
- package/dist/{lib-SGEWXU7Z.js → lib-IZAG57CE.js} +2 -2
- package/dist/{local-7Q5JCU62.js → local-VNB4TMEI.js} +3 -3
- package/dist/{morph-WRZ7XCTF.js → morph-W4XLLZ47.js} +9 -9
- package/dist/{node-MNEYEH5U.js → node-4XPDXMES.js} +15 -15
- package/dist/{node-package-manager-3SFTB3BW.js → node-package-manager-GL4PGGZJ.js} +4 -4
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/{ui-NMP2SY3G.js → ui-LKIZMLKP.js} +3 -3
- package/dist/{workerd-NN737W52.js → workerd-RCIF7HOL.js} +14 -14
- package/oclif.manifest.json +1 -1
- package/package.json +10 -8
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<!
|
|
1
|
+
<!doctype html>
|
|
2
2
|
<!-- Open this file in your browser for an interactive view of your bundle -->
|
|
3
3
|
|
|
4
4
|
<!-- saved from url=(0034)https://esbuild.github.io/analyze/ -->
|
|
@@ -94,7 +94,9 @@
|
|
|
94
94
|
color: var(--fg-on);
|
|
95
95
|
}
|
|
96
96
|
code {
|
|
97
|
-
font:
|
|
97
|
+
font:
|
|
98
|
+
14px/20px Noto Sans Mono,
|
|
99
|
+
monospace;
|
|
98
100
|
background: rgba(127, 127, 127, 0.2);
|
|
99
101
|
padding: 2px 4px;
|
|
100
102
|
margin-bottom: -2px;
|
|
@@ -102,7 +104,9 @@
|
|
|
102
104
|
}
|
|
103
105
|
pre {
|
|
104
106
|
color: var(--pre);
|
|
105
|
-
font:
|
|
107
|
+
font:
|
|
108
|
+
14px/20px Noto Sans Mono,
|
|
109
|
+
monospace;
|
|
106
110
|
padding: 0;
|
|
107
111
|
margin: 0;
|
|
108
112
|
white-space: pre-wrap;
|
|
@@ -598,12 +602,12 @@
|
|
|
598
602
|
e === 1
|
|
599
603
|
? '1 byte'
|
|
600
604
|
: e < 1024
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
605
|
+
? xe(e) + ' bytes'
|
|
606
|
+
: e < 1024 * 1024
|
|
607
|
+
? Ke(e / 1024) + ' kb'
|
|
608
|
+
: e < 1024 * 1024 * 1024
|
|
609
|
+
? Ke(e / (1024 * 1024)) + ' mb'
|
|
610
|
+
: Ke(e / (1024 * 1024 * 1024)) + ' gb',
|
|
607
611
|
H = (e) =>
|
|
608
612
|
e
|
|
609
613
|
.replace(/&/g, '&')
|
|
@@ -873,10 +877,10 @@
|
|
|
873
877
|
e === Se
|
|
874
878
|
? ''
|
|
875
879
|
: e === we
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
+
? t + 'ESM'
|
|
881
|
+
: e === He
|
|
882
|
+
? t + 'CJS'
|
|
883
|
+
: t + 'ESM & CJS',
|
|
880
884
|
Ft = (e, t) => {
|
|
881
885
|
let r = t.o,
|
|
882
886
|
s = 0,
|
|
@@ -920,8 +924,8 @@
|
|
|
920
924
|
x === 'esm'
|
|
921
925
|
? (l += O.bytes)
|
|
922
926
|
: x === 'cjs'
|
|
923
|
-
|
|
924
|
-
|
|
927
|
+
? (o += O.bytes)
|
|
928
|
+
: (m += O.bytes),
|
|
925
929
|
n++,
|
|
926
930
|
(u += O.bytes);
|
|
927
931
|
}
|
|
@@ -1031,8 +1035,8 @@
|
|
|
1031
1035
|
(s.format === 'esm'
|
|
1032
1036
|
? '<br>Module format: <b>ESM</b>'
|
|
1033
1037
|
: s.format === 'cjs'
|
|
1034
|
-
|
|
1035
|
-
|
|
1038
|
+
? '<br>Module format: <b>CommonJS</b>'
|
|
1039
|
+
: '') +
|
|
1036
1040
|
'</p>'),
|
|
1037
1041
|
el(i, pt, t);
|
|
1038
1042
|
let u = d.createElement('a');
|
|
@@ -1,5 +1,136 @@
|
|
|
1
1
|
# skeleton
|
|
2
2
|
|
|
3
|
+
## 2025.1.6
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Moved the `Layout` component back into `root.tsx` to avoid issues with styled errors. ([#2829](https://github.com/Shopify/hydrogen/pull/2829)) by [@ruggishop](https://github.com/ruggishop)
|
|
8
|
+
|
|
9
|
+
1. If you have a separate `app/layout.tsx` file, delete it and move its default exported component into your `root.tsx`. For example:
|
|
10
|
+
|
|
11
|
+
```ts
|
|
12
|
+
// /app/root.tsx
|
|
13
|
+
export function Layout({children}: {children?: React.ReactNode}) {
|
|
14
|
+
const nonce = useNonce();
|
|
15
|
+
const data = useRouteLoaderData<RootLoader>('root');
|
|
16
|
+
|
|
17
|
+
return (
|
|
18
|
+
<html lang="en">
|
|
19
|
+
...
|
|
20
|
+
);
|
|
21
|
+
}
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## 2025.1.5
|
|
25
|
+
|
|
26
|
+
### Patch Changes
|
|
27
|
+
|
|
28
|
+
- Fixed an issue with the creation of JavaScript projects. ([#2818](https://github.com/Shopify/hydrogen/pull/2818)) by [@seanparsons](https://github.com/seanparsons)
|
|
29
|
+
|
|
30
|
+
## 2025.1.4
|
|
31
|
+
|
|
32
|
+
### Patch Changes
|
|
33
|
+
|
|
34
|
+
- Updates the `@shopify/cli`, `@shopify/cli-kit` and `@shopify/plugin-cloudflare` dependencies to 3.77.1. ([#2816](https://github.com/Shopify/hydrogen/pull/2816)) by [@seanparsons](https://github.com/seanparsons)
|
|
35
|
+
|
|
36
|
+
## 2025.1.3
|
|
37
|
+
|
|
38
|
+
### Patch Changes
|
|
39
|
+
|
|
40
|
+
- Bump Remix to 2.16.1 and vite to 6.2.0 ([#2784](https://github.com/Shopify/hydrogen/pull/2784)) by [@wizardlyhel](https://github.com/wizardlyhel)
|
|
41
|
+
|
|
42
|
+
- Update skeleton and create-hydrogen cli to 3.75.4 ([#2769](https://github.com/Shopify/hydrogen/pull/2769)) by [@juanpprieto](https://github.com/juanpprieto)
|
|
43
|
+
|
|
44
|
+
- Fixing typescript compile ([#2787](https://github.com/Shopify/hydrogen/pull/2787)) by [@balazsbajorics](https://github.com/balazsbajorics)
|
|
45
|
+
|
|
46
|
+
In tsconfig.json:
|
|
47
|
+
|
|
48
|
+
```diff
|
|
49
|
+
"types": [
|
|
50
|
+
"@shopify/oxygen-workers-types",
|
|
51
|
+
- "@remix-run/node",
|
|
52
|
+
+ "@remix-run/server-runtime",
|
|
53
|
+
"vite/client"
|
|
54
|
+
],
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
- Updates `@shopify/cli-kit`, `@shopify/cli` and `@shopify/plugin-cloudflare` to `3.77.0`. ([#2810](https://github.com/Shopify/hydrogen/pull/2810)) by [@seanparsons](https://github.com/seanparsons)
|
|
58
|
+
|
|
59
|
+
- Support for the Remix future flag `v3_routeConfig`. ([#2722](https://github.com/Shopify/hydrogen/pull/2722)) by [@seanparsons](https://github.com/seanparsons)
|
|
60
|
+
|
|
61
|
+
Please refer to the Remix documentation for more details on `v3_routeConfig` future flag: [https://remix.run/docs/en/main/start/future-flags#v3_routeconfig](https://remix.run/docs/en/main/start/future-flags#v3_routeconfig)
|
|
62
|
+
|
|
63
|
+
1. Update your `vite.config.ts`.
|
|
64
|
+
|
|
65
|
+
```diff
|
|
66
|
+
export default defineConfig({
|
|
67
|
+
plugins: [
|
|
68
|
+
hydrogen(),
|
|
69
|
+
oxygen(),
|
|
70
|
+
remix({
|
|
71
|
+
- presets: [hydrogen.preset()],
|
|
72
|
+
+ presets: [hydrogen.v3preset()],
|
|
73
|
+
future: {
|
|
74
|
+
v3_fetcherPersist: true,
|
|
75
|
+
v3_relativeSplatPath: true,
|
|
76
|
+
v3_throwAbortReason: true,
|
|
77
|
+
v3_lazyRouteDiscovery: true,
|
|
78
|
+
v3_singleFetch: true,
|
|
79
|
+
+ v3_routeConfig: true,
|
|
80
|
+
},
|
|
81
|
+
}),
|
|
82
|
+
tsconfigPaths(),
|
|
83
|
+
],
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
1. Update your `package.json` and install the new packages. Make sure to match the Remix version along with other Remix npm packages and ensure the versions are 2.16.1 or above:
|
|
87
|
+
|
|
88
|
+
```diff
|
|
89
|
+
"devDependencies": {
|
|
90
|
+
"@remix-run/dev": "^2.16.1",
|
|
91
|
+
+ "@remix-run/fs-routes": "^2.16.1",
|
|
92
|
+
+ "@remix-run/route-config": "^2.16.1",
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
1. Move the `Layout` component export from `root.tsx` into its own file. Make sure to supply an `<Outlet>` so Remix knows where to inject your route content.
|
|
96
|
+
|
|
97
|
+
```ts
|
|
98
|
+
// /app/layout.tsx
|
|
99
|
+
import {Outlet} from '@remix-run/react';
|
|
100
|
+
|
|
101
|
+
export default function Layout() {
|
|
102
|
+
const nonce = useNonce();
|
|
103
|
+
const data = useRouteLoaderData<RootLoader>('root');
|
|
104
|
+
|
|
105
|
+
return (
|
|
106
|
+
<html lang="en">
|
|
107
|
+
...
|
|
108
|
+
<Outlet />
|
|
109
|
+
...
|
|
110
|
+
</html>
|
|
111
|
+
);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// Remember to remove the Layout export from your root.tsx
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
1. Add a routes.ts file. This is your new Remix route configuration file.
|
|
118
|
+
|
|
119
|
+
```ts
|
|
120
|
+
import { flatRoutes } from "@remix-run/fs-routes";
|
|
121
|
+
import { layout, type RouteConfig } from "@remix-run/route-config";
|
|
122
|
+
import { hydrogenRoutes } from "@shopify/hydrogen";
|
|
123
|
+
|
|
124
|
+
export default hydrogenRoutes([
|
|
125
|
+
// Your entire app reading from routes folder using Layout from layout.tsx
|
|
126
|
+
layout("./layout.tsx", await flatRoutes()),
|
|
127
|
+
]) satisfies RouteConfig;
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
- Updated dependencies [[`0425e50d`](https://github.com/Shopify/hydrogen/commit/0425e50dafe2f42326cba67076e5fcea2905e885), [`74ef1ba7`](https://github.com/Shopify/hydrogen/commit/74ef1ba7d41988350e9d2c81731c90381943d1f0)]:
|
|
131
|
+
- @shopify/remix-oxygen@2.0.12
|
|
132
|
+
- @shopify/hydrogen@2025.1.3
|
|
133
|
+
|
|
3
134
|
## 2025.1.2
|
|
4
135
|
|
|
5
136
|
### Patch Changes
|
|
@@ -583,25 +714,25 @@
|
|
|
583
714
|
8. Update the `ProductForm` component.
|
|
584
715
|
|
|
585
716
|
```tsx
|
|
586
|
-
import {Link, useNavigate} from
|
|
587
|
-
import {type MappedProductOptions} from
|
|
717
|
+
import { Link, useNavigate } from "@remix-run/react";
|
|
718
|
+
import { type MappedProductOptions } from "@shopify/hydrogen";
|
|
588
719
|
import type {
|
|
589
720
|
Maybe,
|
|
590
721
|
ProductOptionValueSwatch,
|
|
591
|
-
} from
|
|
592
|
-
import {AddToCartButton} from
|
|
593
|
-
import {useAside} from
|
|
594
|
-
import type {ProductFragment} from
|
|
722
|
+
} from "@shopify/hydrogen/storefront-api-types";
|
|
723
|
+
import { AddToCartButton } from "./AddToCartButton";
|
|
724
|
+
import { useAside } from "./Aside";
|
|
725
|
+
import type { ProductFragment } from "storefrontapi.generated";
|
|
595
726
|
|
|
596
727
|
export function ProductForm({
|
|
597
728
|
productOptions,
|
|
598
729
|
selectedVariant,
|
|
599
730
|
}: {
|
|
600
731
|
productOptions: MappedProductOptions[];
|
|
601
|
-
selectedVariant: ProductFragment[
|
|
732
|
+
selectedVariant: ProductFragment["selectedOrFirstAvailableVariant"];
|
|
602
733
|
}) {
|
|
603
734
|
const navigate = useNavigate();
|
|
604
|
-
const {open} = useAside();
|
|
735
|
+
const { open } = useAside();
|
|
605
736
|
return (
|
|
606
737
|
<div className="product-form">
|
|
607
738
|
{productOptions.map((option) => (
|
|
@@ -635,8 +766,8 @@
|
|
|
635
766
|
to={`/products/${handle}?${variantUriQuery}`}
|
|
636
767
|
style={{
|
|
637
768
|
border: selected
|
|
638
|
-
?
|
|
639
|
-
:
|
|
769
|
+
? "1px solid black"
|
|
770
|
+
: "1px solid transparent",
|
|
640
771
|
opacity: available ? 1 : 0.3,
|
|
641
772
|
}}
|
|
642
773
|
>
|
|
@@ -653,13 +784,13 @@
|
|
|
653
784
|
<button
|
|
654
785
|
type="button"
|
|
655
786
|
className={`product-options-item${
|
|
656
|
-
exists && !selected ?
|
|
787
|
+
exists && !selected ? " link" : ""
|
|
657
788
|
}`}
|
|
658
789
|
key={option.name + name}
|
|
659
790
|
style={{
|
|
660
791
|
border: selected
|
|
661
|
-
?
|
|
662
|
-
:
|
|
792
|
+
? "1px solid black"
|
|
793
|
+
: "1px solid transparent",
|
|
663
794
|
opacity: available ? 1 : 0.3,
|
|
664
795
|
}}
|
|
665
796
|
disabled={!exists}
|
|
@@ -683,7 +814,7 @@
|
|
|
683
814
|
<AddToCartButton
|
|
684
815
|
disabled={!selectedVariant || !selectedVariant.availableForSale}
|
|
685
816
|
onClick={() => {
|
|
686
|
-
open(
|
|
817
|
+
open("cart");
|
|
687
818
|
}}
|
|
688
819
|
lines={
|
|
689
820
|
selectedVariant
|
|
@@ -697,7 +828,7 @@
|
|
|
697
828
|
: []
|
|
698
829
|
}
|
|
699
830
|
>
|
|
700
|
-
{selectedVariant?.availableForSale ?
|
|
831
|
+
{selectedVariant?.availableForSale ? "Add to cart" : "Sold out"}
|
|
701
832
|
</AddToCartButton>
|
|
702
833
|
</div>
|
|
703
834
|
);
|
|
@@ -720,7 +851,7 @@
|
|
|
720
851
|
aria-label={name}
|
|
721
852
|
className="product-option-label-swatch"
|
|
722
853
|
style={{
|
|
723
|
-
backgroundColor: color ||
|
|
854
|
+
backgroundColor: color || "transparent",
|
|
724
855
|
}}
|
|
725
856
|
>
|
|
726
857
|
{!!image && <img src={image} alt={name} />}
|
|
@@ -1221,21 +1352,21 @@
|
|
|
1221
1352
|
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).
|
|
1222
1353
|
|
|
1223
1354
|
```ts
|
|
1224
|
-
const withCache = createWithCache({cache, waitUntil, request});
|
|
1355
|
+
const withCache = createWithCache({ cache, waitUntil, request });
|
|
1225
1356
|
|
|
1226
|
-
const {data, response} = await withCache.fetch<{data: T; error: string}>(
|
|
1227
|
-
|
|
1357
|
+
const { data, response } = await withCache.fetch<{ data: T; error: string }>(
|
|
1358
|
+
"my-cms.com/api",
|
|
1228
1359
|
{
|
|
1229
|
-
method:
|
|
1230
|
-
headers: {
|
|
1360
|
+
method: "POST",
|
|
1361
|
+
headers: { "Content-type": "application/json" },
|
|
1231
1362
|
body,
|
|
1232
1363
|
},
|
|
1233
1364
|
{
|
|
1234
1365
|
cacheStrategy: CacheLong(),
|
|
1235
1366
|
// Cache if there are no data errors or a specific data that make this result not suited for caching
|
|
1236
1367
|
shouldCacheResponse: (result) => !result?.error,
|
|
1237
|
-
cacheKey: [
|
|
1238
|
-
displayName:
|
|
1368
|
+
cacheKey: ["my-cms", body],
|
|
1369
|
+
displayName: "My CMS query",
|
|
1239
1370
|
},
|
|
1240
1371
|
);
|
|
1241
1372
|
```
|
|
@@ -1811,9 +1942,9 @@
|
|
|
1811
1942
|
|
|
1812
1943
|
```tsx
|
|
1813
1944
|
// app/lib/root-data.ts
|
|
1814
|
-
import {useMatches} from
|
|
1815
|
-
import type {SerializeFrom} from
|
|
1816
|
-
import type {loader} from
|
|
1945
|
+
import { useMatches } from "@remix-run/react";
|
|
1946
|
+
import type { SerializeFrom } from "@shopify/remix-oxygen";
|
|
1947
|
+
import type { loader } from "~/root";
|
|
1817
1948
|
|
|
1818
1949
|
/**
|
|
1819
1950
|
* Access the result of the root loader from a React component.
|
|
@@ -1975,10 +2106,10 @@
|
|
|
1975
2106
|
- 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)
|
|
1976
2107
|
|
|
1977
2108
|
```ts
|
|
1978
|
-
import {type LoaderFunctionArgs} from
|
|
2109
|
+
import { type LoaderFunctionArgs } from "@remix-run/server-runtime";
|
|
1979
2110
|
|
|
1980
|
-
export async function loader({params, context}: LoaderFunctionArgs) {
|
|
1981
|
-
const {language, country} = context.storefront.i18n;
|
|
2111
|
+
export async function loader({ params, context }: LoaderFunctionArgs) {
|
|
2112
|
+
const { language, country } = context.storefront.i18n;
|
|
1982
2113
|
|
|
1983
2114
|
if (
|
|
1984
2115
|
params.locale &&
|
|
@@ -1986,7 +2117,7 @@
|
|
|
1986
2117
|
) {
|
|
1987
2118
|
// If the locale URL param is defined, yet we still are still at the default locale
|
|
1988
2119
|
// then the the locale param must be invalid, send to the 404 page
|
|
1989
|
-
throw new Response(null, {status: 404});
|
|
2120
|
+
throw new Response(null, { status: 404 });
|
|
1990
2121
|
}
|
|
1991
2122
|
|
|
1992
2123
|
return null;
|
|
@@ -2042,11 +2173,11 @@
|
|
|
2042
2173
|
```yaml
|
|
2043
2174
|
projects:
|
|
2044
2175
|
default:
|
|
2045
|
-
schema:
|
|
2176
|
+
schema: "node_modules/@shopify/hydrogen/storefront.schema.json"
|
|
2046
2177
|
documents:
|
|
2047
|
-
-
|
|
2048
|
-
-
|
|
2049
|
-
-
|
|
2178
|
+
- "!*.d.ts"
|
|
2179
|
+
- "*.{ts,tsx,js,jsx}"
|
|
2180
|
+
- "app/**/*.{ts,tsx,js,jsx}"
|
|
2050
2181
|
```
|
|
2051
2182
|
|
|
2052
2183
|
- Improve resiliency of `HydrogenSession` ([#1583](https://github.com/Shopify/hydrogen/pull/1583)) by [@blittle](https://github.com/blittle)
|
|
@@ -2261,8 +2392,8 @@
|
|
|
2261
2392
|
```ts
|
|
2262
2393
|
// root.tsx
|
|
2263
2394
|
|
|
2264
|
-
import {useMatches} from
|
|
2265
|
-
import {type SerializeFrom} from
|
|
2395
|
+
import { useMatches } from "@remix-run/react";
|
|
2396
|
+
import { type SerializeFrom } from "@shopify/remix-oxygen";
|
|
2266
2397
|
|
|
2267
2398
|
export const useRootLoaderData = () => {
|
|
2268
2399
|
const [root] = useMatches();
|
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {Analytics, getShopAnalytics, useNonce} from '@shopify/hydrogen';
|
|
2
2
|
import {type LoaderFunctionArgs} from '@shopify/remix-oxygen';
|
|
3
3
|
import {
|
|
4
|
-
Links,
|
|
5
|
-
Meta,
|
|
6
4
|
Outlet,
|
|
7
|
-
Scripts,
|
|
8
5
|
useRouteError,
|
|
9
|
-
useRouteLoaderData,
|
|
10
|
-
ScrollRestoration,
|
|
11
6
|
isRouteErrorResponse,
|
|
12
7
|
type ShouldRevalidateFunction,
|
|
8
|
+
Links,
|
|
9
|
+
Meta,
|
|
10
|
+
Scripts,
|
|
11
|
+
ScrollRestoration,
|
|
12
|
+
useRouteLoaderData,
|
|
13
13
|
} from '@remix-run/react';
|
|
14
14
|
import favicon from '~/assets/favicon.svg';
|
|
15
|
+
import {FOOTER_QUERY, HEADER_QUERY} from '~/lib/fragments';
|
|
15
16
|
import resetStyles from '~/styles/reset.css?url';
|
|
16
17
|
import appStyles from '~/styles/app.css?url';
|
|
17
|
-
import {PageLayout} from '
|
|
18
|
-
import {FOOTER_QUERY, HEADER_QUERY} from '~/lib/fragments';
|
|
18
|
+
import {PageLayout} from './components/PageLayout';
|
|
19
19
|
|
|
20
20
|
export type RootLoader = typeof loader;
|
|
21
21
|
|
|
@@ -33,9 +33,9 @@ export const shouldRevalidate: ShouldRevalidateFunction = ({
|
|
|
33
33
|
// revalidate when manually revalidating via useRevalidator
|
|
34
34
|
if (currentUrl.toString() === nextUrl.toString()) return true;
|
|
35
35
|
|
|
36
|
-
// Defaulting to no revalidation for root loader data to improve performance.
|
|
37
|
-
// When using this feature, you risk your UI getting out of sync with your server.
|
|
38
|
-
// Use with caution. If you are uncomfortable with this optimization, update the
|
|
36
|
+
// Defaulting to no revalidation for root loader data to improve performance.
|
|
37
|
+
// When using this feature, you risk your UI getting out of sync with your server.
|
|
38
|
+
// Use with caution. If you are uncomfortable with this optimization, update the
|
|
39
39
|
// line below to `return defaultShouldRevalidate` instead.
|
|
40
40
|
// For more details see: https://remix.run/docs/en/main/route/should-revalidate
|
|
41
41
|
return false;
|
|
@@ -19,9 +19,10 @@ export const meta: MetaFunction = () => {
|
|
|
19
19
|
export async function loader({request, context}: LoaderFunctionArgs) {
|
|
20
20
|
const url = new URL(request.url);
|
|
21
21
|
const isPredictive = url.searchParams.has('predictive');
|
|
22
|
-
const searchPromise =
|
|
23
|
-
|
|
24
|
-
|
|
22
|
+
const searchPromise: Promise<PredictiveSearchReturn | RegularSearchReturn> =
|
|
23
|
+
isPredictive
|
|
24
|
+
? predictiveSearch({request, context})
|
|
25
|
+
: regularSearch({request, context});
|
|
25
26
|
|
|
26
27
|
searchPromise.catch((error: Error) => {
|
|
27
28
|
console.error(error);
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import {flatRoutes} from '@remix-run/fs-routes';
|
|
2
|
+
import {type RouteConfig} from '@remix-run/route-config';
|
|
3
|
+
import {hydrogenRoutes} from '@shopify/hydrogen';
|
|
4
|
+
|
|
5
|
+
export default hydrogenRoutes([
|
|
6
|
+
...(await flatRoutes()),
|
|
7
|
+
// Manual route definitions can be added to this array, in addition to or instead of using the `flatRoutes` file-based routing convention.
|
|
8
|
+
// See https://remix.run/docs/en/main/guides/routing for more details
|
|
9
|
+
]) satisfies RouteConfig;
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "skeleton",
|
|
3
3
|
"private": true,
|
|
4
4
|
"sideEffects": false,
|
|
5
|
-
"version": "2025.1.
|
|
5
|
+
"version": "2025.1.6",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"scripts": {
|
|
8
8
|
"build": "shopify hydrogen build --codegen",
|
|
@@ -14,13 +14,13 @@
|
|
|
14
14
|
},
|
|
15
15
|
"prettier": "@shopify/prettier-config",
|
|
16
16
|
"dependencies": {
|
|
17
|
-
"@remix-run/react": "^2.
|
|
18
|
-
"@remix-run/server-runtime": "^2.
|
|
19
|
-
"
|
|
20
|
-
"@shopify/
|
|
21
|
-
"
|
|
17
|
+
"@remix-run/react": "^2.16.1",
|
|
18
|
+
"@remix-run/server-runtime": "^2.16.1",
|
|
19
|
+
"graphql": "^16.10.0",
|
|
20
|
+
"@shopify/hydrogen": "2025.1.3",
|
|
21
|
+
"@shopify/remix-oxygen": "^2.0.12",
|
|
22
22
|
"graphql-tag": "^2.12.6",
|
|
23
|
-
"isbot": "^5.1.
|
|
23
|
+
"isbot": "^5.1.22",
|
|
24
24
|
"react": "^18.2.0",
|
|
25
25
|
"react-dom": "^18.2.0"
|
|
26
26
|
},
|
|
@@ -29,13 +29,16 @@
|
|
|
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.
|
|
33
|
-
"@
|
|
34
|
-
"@
|
|
35
|
-
"@shopify/
|
|
36
|
-
"@shopify/
|
|
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.77.1",
|
|
36
|
+
"@shopify/hydrogen-codegen": "^0.3.3",
|
|
37
|
+
"@shopify/mini-oxygen": "^3.2.0",
|
|
38
|
+
"@shopify/oxygen-workers-types": "^4.1.6",
|
|
37
39
|
"@shopify/prettier-config": "^1.1.2",
|
|
38
|
-
"@total-typescript/ts-reset": "^0.
|
|
40
|
+
"@total-typescript/ts-reset": "^0.6.1",
|
|
41
|
+
"prettier": "^3.4.2",
|
|
39
42
|
"@types/eslint": "^9.6.1",
|
|
40
43
|
"@types/react": "^18.2.22",
|
|
41
44
|
"@types/react-dom": "^18.2.7",
|
|
@@ -51,9 +54,8 @@
|
|
|
51
54
|
"eslint-plugin-react": "^7.37.4",
|
|
52
55
|
"eslint-plugin-react-hooks": "^5.1.0",
|
|
53
56
|
"globals": "^15.14.0",
|
|
54
|
-
"prettier": "^2.8.4",
|
|
55
57
|
"typescript": "^5.2.2",
|
|
56
|
-
"vite": "^
|
|
58
|
+
"vite": "^6.2.0",
|
|
57
59
|
"vite-tsconfig-paths": "^4.3.1"
|
|
58
60
|
},
|
|
59
61
|
"engines": {
|
|
@@ -15,12 +15,13 @@ export default defineConfig({
|
|
|
15
15
|
hydrogen(),
|
|
16
16
|
oxygen(),
|
|
17
17
|
remix({
|
|
18
|
-
presets: [hydrogen.
|
|
18
|
+
presets: [hydrogen.v3preset()],
|
|
19
19
|
future: {
|
|
20
20
|
v3_fetcherPersist: true,
|
|
21
21
|
v3_relativeSplatPath: true,
|
|
22
22
|
v3_throwAbortReason: true,
|
|
23
23
|
v3_lazyRouteDiscovery: true,
|
|
24
|
+
v3_routeConfig: true,
|
|
24
25
|
v3_singleFetch: true,
|
|
25
26
|
},
|
|
26
27
|
}),
|
|
@@ -390,11 +390,8 @@ button:active.primary {
|
|
|
390
390
|
--gradient-color-end: transparent;
|
|
391
391
|
--background-color: transparent;
|
|
392
392
|
|
|
393
|
-
background-image:
|
|
394
|
-
|
|
395
|
-
var(--background-color),
|
|
396
|
-
var(--background-color)
|
|
397
|
-
),
|
|
393
|
+
background-image:
|
|
394
|
+
linear-gradient(to right, var(--background-color), var(--background-color)),
|
|
398
395
|
linear-gradient(to right, var(--background-color), var(--background-color)),
|
|
399
396
|
linear-gradient(
|
|
400
397
|
to right,
|
|
@@ -406,23 +403,43 @@ button:active.primary {
|
|
|
406
403
|
var(--gradient-color-start),
|
|
407
404
|
var(--gradient-color-end)
|
|
408
405
|
);
|
|
409
|
-
background-position:
|
|
406
|
+
background-position:
|
|
407
|
+
left center,
|
|
408
|
+
right center,
|
|
409
|
+
left center,
|
|
410
|
+
right center;
|
|
410
411
|
background-repeat: no-repeat;
|
|
411
412
|
background-color: var(--background-color);
|
|
412
|
-
background-size:
|
|
413
|
+
background-size:
|
|
414
|
+
20px 100%,
|
|
415
|
+
20px 100%,
|
|
416
|
+
0px 100%,
|
|
417
|
+
0px 100%;
|
|
413
418
|
background-attachment: local, local, scroll, scroll;
|
|
414
419
|
}
|
|
415
420
|
|
|
416
421
|
#tab-buttons-wrapper .fadCover.fadeLeft {
|
|
417
|
-
background-size:
|
|
422
|
+
background-size:
|
|
423
|
+
20px 100%,
|
|
424
|
+
20px 100%,
|
|
425
|
+
40px 100%,
|
|
426
|
+
0px 100%;
|
|
418
427
|
}
|
|
419
428
|
|
|
420
429
|
#tab-buttons-wrapper .fadCover.fadeRight {
|
|
421
|
-
background-size:
|
|
430
|
+
background-size:
|
|
431
|
+
20px 100%,
|
|
432
|
+
20px 100%,
|
|
433
|
+
0px 100%,
|
|
434
|
+
40px 100%;
|
|
422
435
|
}
|
|
423
436
|
|
|
424
437
|
#tab-buttons-wrapper .fadCover.fadeLeftRight {
|
|
425
|
-
background-size:
|
|
438
|
+
background-size:
|
|
439
|
+
20px 100%,
|
|
440
|
+
20px 100%,
|
|
441
|
+
40px 100%,
|
|
442
|
+
40px 100%;
|
|
426
443
|
}
|
|
427
444
|
|
|
428
445
|
.tabPanels .tabPanel {
|
|
@@ -40,8 +40,19 @@ body {
|
|
|
40
40
|
padding: 0;
|
|
41
41
|
margin: 0;
|
|
42
42
|
background: #fff;
|
|
43
|
-
font-family:
|
|
44
|
-
|
|
43
|
+
font-family:
|
|
44
|
+
'Inter',
|
|
45
|
+
system-ui,
|
|
46
|
+
-apple-system,
|
|
47
|
+
BlinkMacSystemFont,
|
|
48
|
+
'Segoe UI',
|
|
49
|
+
Roboto,
|
|
50
|
+
Oxygen,
|
|
51
|
+
Ubuntu,
|
|
52
|
+
Cantarell,
|
|
53
|
+
'Open Sans',
|
|
54
|
+
'Helvetica Neue',
|
|
55
|
+
sans-serif;
|
|
45
56
|
-webkit-font-smoothing: antialiased;
|
|
46
57
|
min-height: 100vh;
|
|
47
58
|
display: flex;
|