@shopify/create-hydrogen 5.0.23 → 5.0.25

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 (103) hide show
  1. package/dist/assets/hydrogen/bundle/analyzer.html +155 -148
  2. package/dist/assets/hydrogen/starter/.cursor/rules/hydrogen-react-router.mdc +5 -3
  3. package/dist/assets/hydrogen/starter/CHANGELOG.md +97 -9
  4. package/dist/assets/hydrogen/starter/app/components/AddToCartButton.tsx +1 -1
  5. package/dist/assets/hydrogen/starter/app/components/CartLineItem.tsx +1 -1
  6. package/dist/assets/hydrogen/starter/app/components/CartMain.tsx +1 -1
  7. package/dist/assets/hydrogen/starter/app/components/CartSummary.tsx +62 -29
  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 +2 -2
  11. package/dist/assets/hydrogen/starter/app/components/SearchForm.tsx +1 -1
  12. package/dist/assets/hydrogen/starter/app/components/SearchFormPredictive.tsx +8 -3
  13. package/dist/assets/hydrogen/starter/app/components/SearchResults.tsx +3 -11
  14. package/dist/assets/hydrogen/starter/app/components/SearchResultsPredictive.tsx +2 -6
  15. package/dist/assets/hydrogen/starter/app/entry.client.tsx +10 -2
  16. package/dist/assets/hydrogen/starter/app/entry.server.tsx +5 -3
  17. package/dist/assets/hydrogen/starter/app/graphql/customer-account/CustomerAddressMutations.ts +7 -4
  18. package/dist/assets/hydrogen/starter/app/graphql/customer-account/CustomerDetailsQuery.ts +1 -1
  19. package/dist/assets/hydrogen/starter/app/graphql/customer-account/CustomerOrderQuery.ts +4 -1
  20. package/dist/assets/hydrogen/starter/app/graphql/customer-account/CustomerOrdersQuery.ts +10 -5
  21. package/dist/assets/hydrogen/starter/app/graphql/customer-account/CustomerUpdateMutation.ts +3 -2
  22. package/dist/assets/hydrogen/starter/app/lib/context.ts +34 -17
  23. package/dist/assets/hydrogen/starter/app/lib/fragments.ts +1 -0
  24. package/dist/assets/hydrogen/starter/app/lib/orderFilters.ts +90 -0
  25. package/dist/assets/hydrogen/starter/app/lib/redirect.ts +1 -1
  26. package/dist/assets/hydrogen/starter/app/lib/session.ts +1 -1
  27. package/dist/assets/hydrogen/starter/app/lib/variants.ts +1 -1
  28. package/dist/assets/hydrogen/starter/app/root.tsx +23 -18
  29. package/dist/assets/hydrogen/starter/app/routes/$.tsx +2 -2
  30. package/dist/assets/hydrogen/starter/app/routes/[robots.txt].tsx +2 -2
  31. package/dist/assets/hydrogen/starter/app/routes/[sitemap.xml].tsx +2 -3
  32. package/dist/assets/hydrogen/starter/app/routes/_index.tsx +12 -8
  33. package/dist/assets/hydrogen/starter/app/routes/account.$.tsx +4 -3
  34. package/dist/assets/hydrogen/starter/app/routes/account._index.tsx +1 -1
  35. package/dist/assets/hydrogen/starter/app/routes/account.addresses.tsx +15 -11
  36. package/dist/assets/hydrogen/starter/app/routes/account.orders.$id.tsx +47 -22
  37. package/dist/assets/hydrogen/starter/app/routes/account.orders._index.tsx +152 -23
  38. package/dist/assets/hydrogen/starter/app/routes/account.profile.tsx +11 -8
  39. package/dist/assets/hydrogen/starter/app/routes/account.tsx +16 -4
  40. package/dist/assets/hydrogen/starter/app/routes/account_.authorize.tsx +2 -2
  41. package/dist/assets/hydrogen/starter/app/routes/account_.login.tsx +5 -3
  42. package/dist/assets/hydrogen/starter/app/routes/account_.logout.tsx +3 -2
  43. package/dist/assets/hydrogen/starter/app/routes/api.$version.[graphql.json].tsx +2 -2
  44. package/dist/assets/hydrogen/starter/app/routes/blogs.$blogHandle.$articleHandle.tsx +6 -10
  45. package/dist/assets/hydrogen/starter/app/routes/blogs.$blogHandle._index.tsx +10 -7
  46. package/dist/assets/hydrogen/starter/app/routes/blogs._index.tsx +13 -7
  47. package/dist/assets/hydrogen/starter/app/routes/cart.$lines.tsx +3 -2
  48. package/dist/assets/hydrogen/starter/app/routes/cart.tsx +13 -9
  49. package/dist/assets/hydrogen/starter/app/routes/collections.$handle.tsx +8 -11
  50. package/dist/assets/hydrogen/starter/app/routes/collections._index.tsx +6 -6
  51. package/dist/assets/hydrogen/starter/app/routes/collections.all.tsx +10 -7
  52. package/dist/assets/hydrogen/starter/app/routes/discount.$code.tsx +3 -2
  53. package/dist/assets/hydrogen/starter/app/routes/pages.$handle.tsx +8 -6
  54. package/dist/assets/hydrogen/starter/app/routes/policies.$handle.tsx +7 -4
  55. package/dist/assets/hydrogen/starter/app/routes/policies._index.tsx +19 -13
  56. package/dist/assets/hydrogen/starter/app/routes/products.$handle.tsx +9 -6
  57. package/dist/assets/hydrogen/starter/app/routes/search.tsx +14 -14
  58. package/dist/assets/hydrogen/starter/app/routes/sitemap.$type.$page[.xml].tsx +2 -3
  59. package/dist/assets/hydrogen/starter/app/routes.ts +1 -1
  60. package/dist/assets/hydrogen/starter/app/styles/app.css +53 -1
  61. package/dist/assets/hydrogen/starter/customer-accountapi.generated.d.ts +47 -13
  62. package/dist/assets/hydrogen/starter/env.d.ts +1 -39
  63. package/dist/assets/hydrogen/starter/eslint.config.js +35 -52
  64. package/dist/assets/hydrogen/starter/package.json +14 -15
  65. package/dist/assets/hydrogen/starter/react-router.config.ts +9 -3
  66. package/dist/assets/hydrogen/starter/server.ts +7 -7
  67. package/dist/assets/hydrogen/starter/storefrontapi.generated.d.ts +1 -1
  68. package/dist/assets/hydrogen/starter/tsconfig.json +17 -13
  69. package/dist/assets/hydrogen/starter/vite.config.ts +4 -1
  70. package/dist/assets/hydrogen/virtual-routes/components/RequestDetails.jsx +13 -20
  71. package/dist/assets/hydrogen/virtual-routes/routes/[.]well-known.appspecific.com[.]chrome[.]devtools[.]json.jsx +37 -0
  72. package/dist/chunk-2LZQLWDR.js +1189 -0
  73. package/dist/{chunk-EO6F7WJJ.js → chunk-6YUUFKYO.js} +1 -1
  74. package/dist/chunk-AUULK6IN.js +5 -0
  75. package/dist/chunk-CJKPLQJ7.js +51 -0
  76. package/dist/{chunk-MNT4XW23.js → chunk-LBUW5UHX.js} +1 -1
  77. package/dist/chunk-RUCJI22O.js +3 -0
  78. package/dist/{chunk-PMDMUCNY.js → chunk-VXJIQGAB.js} +1 -1
  79. package/dist/chunk-Y5VZE2FH.js +32 -0
  80. package/dist/chunk-ZLNTSIDN.js +2 -0
  81. package/dist/create-app.js +293 -288
  82. package/dist/{del-72VO4HYK.js → del-VDYQZFAQ.js} +1 -1
  83. package/dist/devtools-3BYEW2L2.js +8 -0
  84. package/dist/error-handler-XRI3ZDLO.js +2 -0
  85. package/dist/is-wsl-52AELLDM.js +2 -0
  86. package/dist/{morph-3JSBLNUD.js → morph-S2LU6PQ4.js} +7 -7
  87. package/dist/{multipart-parser-QIHQVIZA.js → multipart-parser-MX4R5XJM.js} +1 -1
  88. package/dist/open-PMJ32HTM.js +2 -0
  89. package/dist/out-U7AI7XUQ.js +2 -0
  90. package/package.json +4 -2
  91. package/dist/chokidar-FXMI63T6.js +0 -12
  92. package/dist/chunk-3LZ6M5C2.js +0 -3
  93. package/dist/chunk-D7CI46F7.js +0 -10
  94. package/dist/chunk-FB327AH7.js +0 -5
  95. package/dist/chunk-MZPD7BFF.js +0 -23
  96. package/dist/chunk-NIHY2BIB.js +0 -1180
  97. package/dist/chunk-UASQ33JG.js +0 -45
  98. package/dist/chunk-VMIOG46Y.js +0 -2
  99. package/dist/devtools-DGRGSZU7.js +0 -8
  100. package/dist/error-handler-O653XSNU.js +0 -2
  101. package/dist/is-wsl-LL6KGQIK.js +0 -2
  102. package/dist/open-OD6DRFEG.js +0 -2
  103. package/dist/out-DXB3K325.js +0 -2
@@ -26,6 +26,7 @@ export default [
26
26
  ignores: [
27
27
  '**/node_modules/',
28
28
  '**/build/',
29
+ '**/dist/',
29
30
  '**/*.graphql.d.ts',
30
31
  '**/*.graphql.ts',
31
32
  '**/*.generated.d.ts',
@@ -152,9 +153,7 @@ export default [
152
153
  languageOptions: {
153
154
  parser: tsParser,
154
155
  parserOptions: {
155
- projectService: {
156
- allowDefaultProject: ['.graphqlrc.ts'],
157
- },
156
+ project: './tsconfig.json',
158
157
  tsconfigRootDir: __dirname,
159
158
  ecmaFeatures: {
160
159
  jsx: true,
@@ -175,55 +174,6 @@ export default [
175
174
  },
176
175
  rules: {
177
176
  '@typescript-eslint/ban-ts-comment': 'off',
178
- '@typescript-eslint/naming-convention': 'off',
179
- '@typescript-eslint/no-non-null-asserted-optional-chain': 'off',
180
- },
181
- },
182
- {
183
- files: ['**/.eslintrc.cjs'],
184
- languageOptions: {
185
- globals: {
186
- ...globals.node,
187
- },
188
- },
189
- },
190
- ...compat.extends('plugin:jest/recommended').map((config) => ({
191
- ...config,
192
- files: ['**/*.test.*'],
193
- })),
194
- {
195
- files: ['**/*.test.*'],
196
- plugins: {
197
- jest,
198
- },
199
- languageOptions: {
200
- globals: {
201
- ...globals.node,
202
- ...globals.jest,
203
- },
204
- },
205
- },
206
- {
207
- files: ['**/*.server.*'],
208
- rules: {
209
- 'react-hooks/rules-of-hooks': 'off',
210
- },
211
- },
212
- ...fixupConfigRules(
213
- compat.extends(
214
- 'plugin:@typescript-eslint/eslint-recommended',
215
- 'plugin:@typescript-eslint/recommended',
216
- ),
217
- ).map((config) => ({
218
- ...config,
219
- files: ['**/*.ts', '**/*.tsx'],
220
- })),
221
- {
222
- files: ['**/*.ts', '**/*.tsx'],
223
- languageOptions: {
224
- parser: tsParser,
225
- },
226
- rules: {
227
177
  '@typescript-eslint/explicit-module-boundary-types': 'off',
228
178
  '@typescript-eslint/naming-convention': [
229
179
  'error',
@@ -256,8 +206,41 @@ export default [
256
206
  '@typescript-eslint/no-empty-object-type': 'off',
257
207
  '@typescript-eslint/no-explicit-any': 'off',
258
208
  '@typescript-eslint/no-non-null-assertion': 'off',
209
+ '@typescript-eslint/no-non-null-asserted-optional-chain': 'off',
259
210
  '@typescript-eslint/no-unused-vars': 'off',
211
+ '@typescript-eslint/no-floating-promises': 'error',
212
+ '@typescript-eslint/no-misused-promises': 'error',
260
213
  'react/prop-types': 'off',
261
214
  },
262
215
  },
216
+ {
217
+ files: ['**/.eslintrc.cjs'],
218
+ languageOptions: {
219
+ globals: {
220
+ ...globals.node,
221
+ },
222
+ },
223
+ },
224
+ ...compat.extends('plugin:jest/recommended').map((config) => ({
225
+ ...config,
226
+ files: ['**/*.test.*'],
227
+ })),
228
+ {
229
+ files: ['**/*.test.*'],
230
+ plugins: {
231
+ jest,
232
+ },
233
+ languageOptions: {
234
+ globals: {
235
+ ...globals.node,
236
+ ...globals.jest,
237
+ },
238
+ },
239
+ },
240
+ {
241
+ files: ['**/*.server.*'],
242
+ rules: {
243
+ 'react-hooks/rules-of-hooks': 'off',
244
+ },
245
+ },
263
246
  ];
@@ -2,38 +2,37 @@
2
2
  "name": "skeleton",
3
3
  "private": true,
4
4
  "sideEffects": false,
5
- "version": "2025.5.0",
5
+ "version": "2025.7.0",
6
6
  "type": "module",
7
7
  "scripts": {
8
8
  "build": "shopify hydrogen build --codegen",
9
9
  "dev": "shopify hydrogen dev --codegen",
10
10
  "preview": "shopify hydrogen preview --build",
11
11
  "lint": "eslint --no-error-on-unmatched-pattern .",
12
- "typecheck": "tsc --noEmit",
13
- "codegen": "shopify hydrogen codegen"
12
+ "typecheck": "react-router typegen && tsc --noEmit",
13
+ "codegen": "shopify hydrogen codegen && react-router typegen"
14
14
  },
15
15
  "prettier": "@shopify/prettier-config",
16
16
  "dependencies": {
17
- "@shopify/hydrogen": "2025.5.0",
18
- "@shopify/remix-oxygen": "^3.0.0",
17
+ "@shopify/hydrogen": "2025.7.0",
19
18
  "graphql": "^16.10.0",
20
19
  "graphql-tag": "^2.12.6",
21
20
  "isbot": "^5.1.22",
22
- "react": "^18.2.0",
23
- "react-dom": "^18.2.0",
24
- "react-router": "7.6.0",
25
- "react-router-dom": "7.6.0"
21
+ "react": "18.3.1",
22
+ "react-dom": "18.3.1",
23
+ "react-router": "7.9.2",
24
+ "react-router-dom": "7.9.2"
26
25
  },
27
26
  "devDependencies": {
28
27
  "@eslint/compat": "^1.2.5",
29
28
  "@eslint/eslintrc": "^3.2.0",
30
29
  "@eslint/js": "^9.18.0",
31
30
  "@graphql-codegen/cli": "5.0.2",
32
- "@react-router/dev": "7.6.0",
33
- "@react-router/fs-routes": "7.6.0",
34
- "@shopify/cli": "~3.79.2",
31
+ "@react-router/dev": "7.9.2",
32
+ "@react-router/fs-routes": "7.9.2",
33
+ "@shopify/cli": "3.84.1",
35
34
  "@shopify/hydrogen-codegen": "^0.3.3",
36
- "@shopify/mini-oxygen": "^3.2.1",
35
+ "@shopify/mini-oxygen": "^4.0.0",
37
36
  "@shopify/oxygen-workers-types": "^4.1.6",
38
37
  "@shopify/prettier-config": "^1.1.2",
39
38
  "@total-typescript/ts-reset": "^0.6.1",
@@ -53,11 +52,11 @@
53
52
  "eslint-plugin-react-hooks": "^5.1.0",
54
53
  "globals": "^15.14.0",
55
54
  "prettier": "^3.4.2",
56
- "typescript": "^5.2.2",
55
+ "typescript": "^5.9.2",
57
56
  "vite": "^6.2.4",
58
57
  "vite-tsconfig-paths": "^4.3.1"
59
58
  },
60
59
  "engines": {
61
60
  "node": ">=18.0.0"
62
61
  }
63
- }
62
+ }
@@ -1,7 +1,13 @@
1
1
  import type {Config} from '@react-router/dev/config';
2
+ import {hydrogenPreset} from '@shopify/hydrogen/react-router-preset';
2
3
 
4
+ /**
5
+ * React Router 7.9.x Configuration for Hydrogen
6
+ *
7
+ * This configuration uses the official Hydrogen preset to provide optimal
8
+ * React Router settings for Shopify Oxygen deployment. The preset enables
9
+ * validated performance optimizations while ensuring compatibility.
10
+ */
3
11
  export default {
4
- appDirectory: 'app',
5
- buildDirectory: 'dist',
6
- ssr: true,
12
+ presets: [hydrogenPreset()],
7
13
  } satisfies Config;
@@ -1,7 +1,7 @@
1
1
  // Virtual entry point for the app
2
2
  import {storefrontRedirect} from '@shopify/hydrogen';
3
- import {createRequestHandler} from '@shopify/remix-oxygen';
4
- import {createAppLoadContext} from '~/lib/context';
3
+ import {createRequestHandler} from '@shopify/hydrogen/oxygen';
4
+ import {createHydrogenRouterContext} from '~/lib/context';
5
5
 
6
6
  /**
7
7
  * Export a fetch handler in module format.
@@ -13,7 +13,7 @@ export default {
13
13
  executionContext: ExecutionContext,
14
14
  ): Promise<Response> {
15
15
  try {
16
- const appLoadContext = await createAppLoadContext(
16
+ const hydrogenContext = await createHydrogenRouterContext(
17
17
  request,
18
18
  env,
19
19
  executionContext,
@@ -27,15 +27,15 @@ export default {
27
27
  // eslint-disable-next-line import/no-unresolved
28
28
  build: await import('virtual:react-router/server-build'),
29
29
  mode: process.env.NODE_ENV,
30
- getLoadContext: () => appLoadContext,
30
+ getLoadContext: () => hydrogenContext,
31
31
  });
32
32
 
33
33
  const response = await handleRequest(request);
34
34
 
35
- if (appLoadContext.session.isPending) {
35
+ if (hydrogenContext.session.isPending) {
36
36
  response.headers.set(
37
37
  'Set-Cookie',
38
- await appLoadContext.session.commit(),
38
+ await hydrogenContext.session.commit(),
39
39
  );
40
40
  }
41
41
 
@@ -48,7 +48,7 @@ export default {
48
48
  return storefrontRedirect({
49
49
  request,
50
50
  response,
51
- storefront: appLoadContext.storefront,
51
+ storefront: hydrogenContext.storefront,
52
52
  });
53
53
  }
54
54
 
@@ -73,7 +73,7 @@ export type CartApiQueryFragment = Pick<
73
73
  'updatedAt' | 'id' | 'checkoutUrl' | 'totalQuantity' | 'note'
74
74
  > & {
75
75
  appliedGiftCards: Array<
76
- Pick<StorefrontAPI.AppliedGiftCard, 'lastCharacters'> & {
76
+ Pick<StorefrontAPI.AppliedGiftCard, 'id' | 'lastCharacters'> & {
77
77
  amountUsed: Pick<StorefrontAPI.MoneyV2, 'currencyCode' | 'amount'>;
78
78
  }
79
79
  >;
@@ -1,16 +1,18 @@
1
1
  {
2
2
  "include": [
3
- "./**/*.d.ts",
4
- "./**/*.ts",
5
- "./**/*.tsx",
3
+ "env.d.ts",
4
+ "app/**/*.ts",
5
+ "app/**/*.tsx",
6
+ "app/**/*.d.ts",
7
+ "*.ts",
8
+ "*.tsx",
9
+ "*.d.ts",
10
+ ".graphqlrc.ts",
6
11
  ".react-router/types/**/*"
7
12
  ],
13
+ "exclude": ["node_modules", "dist", "build", "packages/**/dist/**/*"],
8
14
  "compilerOptions": {
9
- "lib": [
10
- "DOM",
11
- "DOM.Iterable",
12
- "ES2022"
13
- ],
15
+ "lib": ["DOM", "DOM.Iterable", "ES2022"],
14
16
  "isolatedModules": true,
15
17
  "esModuleInterop": true,
16
18
  "jsx": "react-jsx",
@@ -26,14 +28,16 @@
26
28
  "types": [
27
29
  "@shopify/oxygen-workers-types",
28
30
  "react-router",
31
+ "@shopify/hydrogen/react-router-types",
29
32
  "vite/client"
30
33
  ],
31
34
  "paths": {
32
- "~/*": [
33
- "app/*"
34
- ]
35
+ "~/*": ["app/*"]
35
36
  },
36
37
  "noEmit": true,
37
- "rootDirs": [".", "./.react-router/types"]
38
+ "rootDirs": [".", "./.react-router/types"],
39
+ "incremental": true,
40
+ "composite": false,
41
+ "verbatimModuleSyntax": true
38
42
  }
39
- }
43
+ }
@@ -23,7 +23,10 @@ export default defineConfig({
23
23
  * Include 'example-dep' in the array below.
24
24
  * @see https://vitejs.dev/config/dep-optimization-options
25
25
  */
26
- include: [],
26
+ include: ['set-cookie-parser', 'cookie', 'react-router'],
27
27
  },
28
28
  },
29
+ server: {
30
+ allowedHosts: ['.tryhydrogen.dev'],
31
+ },
29
32
  });
@@ -137,26 +137,19 @@ function TabButtonsBar({ children }) {
137
137
  setFadeClass("fadeLeft");
138
138
  }
139
139
  }
140
- return /* @__PURE__ */ jsxs(
141
- "div",
142
- {
143
- id: "tab-buttons-wrapper",
144
- onResize: (event) => setFade(event.currentTarget),
145
- children: [
146
- /* @__PURE__ */ jsx(
147
- "div",
148
- {
149
- id: "tabButtons",
150
- ref: scrollBarRef,
151
- className: "flex-row gap-tiny",
152
- onScroll: (event) => setFade(event.currentTarget),
153
- children
154
- }
155
- ),
156
- /* @__PURE__ */ jsx("div", { className: `fadCover ${fadeClass}` })
157
- ]
158
- }
159
- );
140
+ return /* @__PURE__ */ jsxs("div", { id: "tab-buttons-wrapper", children: [
141
+ /* @__PURE__ */ jsx(
142
+ "div",
143
+ {
144
+ id: "tabButtons",
145
+ ref: scrollBarRef,
146
+ className: "flex-row gap-tiny",
147
+ onScroll: (event) => setFade(event.currentTarget),
148
+ children
149
+ }
150
+ ),
151
+ /* @__PURE__ */ jsx("div", { className: `fadCover ${fadeClass}` })
152
+ ] });
160
153
  }
161
154
  function DetailsRow({
162
155
  rowName,
@@ -0,0 +1,37 @@
1
+ async function generateProjectUuid(root) {
2
+ const encoder = new TextEncoder();
3
+ const data = encoder.encode(root);
4
+ const hashBuffer = await crypto.subtle.digest("SHA-256", data);
5
+ const hashArray = Array.from(new Uint8Array(hashBuffer));
6
+ const hashHex = hashArray.map((b) => b.toString(16).padStart(2, "0")).join("");
7
+ return [
8
+ hashHex.slice(0, 8),
9
+ hashHex.slice(8, 12),
10
+ "4" + hashHex.slice(13, 16),
11
+ // Version 4
12
+ (parseInt(hashHex.slice(16, 18), 16) & 63 | 128).toString(16) + hashHex.slice(18, 20),
13
+ // Variant bits
14
+ hashHex.slice(20, 32)
15
+ ].join("-");
16
+ }
17
+ async function loader({ request, context }) {
18
+ let root = context?.env?.HYDROGEN_PROJECT_ROOT || "/workspace/hydrogen-dev";
19
+ root = root.replace(/\\/g, "/");
20
+ const uuid = await generateProjectUuid(root);
21
+ const responseData = {
22
+ workspace: {
23
+ root,
24
+ uuid
25
+ }
26
+ };
27
+ return new Response(JSON.stringify(responseData), {
28
+ status: 200,
29
+ headers: {
30
+ "Content-Type": "application/json",
31
+ "Cache-Control": "no-cache"
32
+ }
33
+ });
34
+ }
35
+ export {
36
+ loader
37
+ };