{ "url": "https://github.com/Shopify/hydrogen/pulls?q=is%3Apr+is%3Aclosed+%5Bci%5D+release+in%3Atitle+is%3Amerged", "version": "1", "releases": [ { "title": "New Shopify cookie system, React Router 7.12, and analytics improvements", "version": "2025.7.1", "date": "2026-01-08", "hash": "67a817cc843d1be3c0ef5515b9a4b6b9e940b6fe", "commit": "https://github.com/Shopify/hydrogen/commit/67a817cc843d1be3c0ef5515b9a4b6b9e940b6fe", "pr": "https://github.com/Shopify/hydrogen/pull/3237", "removeDependencies": [ "@shopify/hydrogen", "react-router", "react-router-dom" ], "removeDevDependencies": [ "@react-router/dev", "@react-router/fs-routes" ], "dependencies": { "@shopify/hydrogen": "2025.7.1", "react-router": "7.12.0", "react-router-dom": "7.12.0" }, "devDependencies": { "@react-router/dev": "7.12.0", "@react-router/fs-routes": "7.12.0" }, "fixes": [ { "title": "Fix upgrade notice showing incorrect versions", "info": "The shopify hydrogen dev command now correctly displays available upgrades using semver comparison when the current version doesn't exist in changelog.json.", "pr": "https://github.com/Shopify/hydrogen/pull/3251", "id": "3251" }, { "title": "Ensure SEO recommendations match Shopify Admin", "pr": "https://github.com/Shopify/hydrogen/pull/3303", "id": "3303" }, { "title": "Fix Privacy Banner and analytics event issues", "info": "Fixed irregular behaviors between Privacy Banner and Hydrogen's analytics events.", "pr": "https://github.com/Shopify/hydrogen/pull/3309", "id": "3309-privacy" }, { "title": "Remove regulation-specific privacy fields from public API", "info": "The generalized privacy fields (analyticsAllowed, marketingAllowed, saleOfDataAllowed) remain available.", "pr": "https://github.com/Shopify/hydrogen/pull/3236", "id": "3236" } ], "features": [ { "title": "Migrate to Shopify's new cookie system", "info": "Hydrogen now supports Shopify's new `_shopify_analytics` and `_shopify_marketing` http-only cookies while keeping the deprecated `_shopify_y` and `_shopify_s` cookies working as long as they remain active. This keeps analytics and privacy behavior aligned with Shopify Admin while preserving backward compatibility.", "breaking": false, "steps": [ { "title": "Understand the new cookie model and compatibility story", "info": "Shopify is deprecating `_shopify_y` and `_shopify_s` in favor of `_shopify_analytics` and `_shopify_marketing`, which are http-only cookies set via the Storefront API on your storefront domain. Hydrogen now reads and writes these cookies through a Storefront API proxy while still honoring the legacy cookies when present. You don't need to migrate values manually, but you must ensure that requests flow through the proxy so cookies are set before analytics run." }, { "title": "Set up a Storefront API proxy for your deployment", "info": "Depending on how you host your app, you must ensure Storefront API calls go through a proxy on your storefront domain.", "code": "IyMjIFJlYWN0IFJvdXRlciArIEh5ZHJvZ2VuIG9uIE94eWdlbgoKSWYgeW91IHNjYWZmb2xkZWQgZnJvbSB0aGUgZGVmYXVsdCBIeWRyb2dlbiBza2VsZXRvbiBhbmQgZGVwbG95IHRvIE94eWdlbiwgdGhlIGBjcmVhdGVSZXF1ZXN0SGFuZGxlcmAgdXRpbGl0eSBmcm9tIGBAc2hvcGlmeS9oeWRyb2dlbi9veHlnZW5gIChub3cgYWxzbyBleHBvcnRlZCBmcm9tIGBAc2hvcGlmeS9oeWRyb2dlbmApIGFscmVhZHkgc2V0cyB1cCBhIFN0b3JlZnJvbnQgQVBJIHByb3h5IG9uIHRoZSBzYW1lIGRvbWFpbiBhcyB5b3VyIHN0b3JlZnJvbnQuCgoqKkluIG1vc3QgY2FzZXMsIG5vIGNoYW5nZXMgYXJlIHJlcXVpcmVkKio7IGp1c3QgY29uZmlybSB5b3VyIHNlcnZlciBlbnRyeSBzdGlsbCB1c2VzIGl0OgoKYGBgdHMKLy8gc2VydmVyLnRzIChPeHlnZW4pCmltcG9ydCB7Y3JlYXRlUmVxdWVzdEhhbmRsZXIsIGNyZWF0ZUh5ZHJvZ2VuQ29udGV4dH0gZnJvbSAnQHNob3BpZnkvaHlkcm9nZW4nOwoKZXhwb3J0IGRlZmF1bHQgewogIGFzeW5jIGZldGNoKHJlcXVlc3QsIGVudikgewogICAgY29uc3QgaHlkcm9nZW5Db250ZXh0ID0gY3JlYXRlSHlkcm9nZW5Db250ZXh0KHsKICAgICAgZW52LAogICAgICByZXF1ZXN0LAogICAgICAvKiAuLi4gKi8KICAgIH0pOwoKICAgIGNvbnN0IGhhbmRsZVJlcXVlc3QgPSBjcmVhdGVSZXF1ZXN0SGFuZGxlcih7CiAgICAgIC8qIC4uLiAqLwogICAgICBnZXRMb2FkQ29udGV4dDogKCkgPT4gaHlkcm9nZW5Db250ZXh0LAogICAgICAvLyBBbHRlcm5hdGl2ZWx5LCBwYXNzIGF0IGxlYXN0IHN0b3JlZnJvbnQgY2xpZW50OgogICAgICAvLyBnZXRMb2FkQ29udGV4dDogKCkgPT4gKHtzdG9yZWZyb250OiBjcmVhdGVTdG9yZWZyb250Q2xpZW50KC4uLil9KQogICAgfSk7CgogICAgcmV0dXJuIGhhbmRsZVJlcXVlc3QocmVxdWVzdCk7CiAgfSwKfTsKYGBgCgpLZWVwIHVzaW5nIGA8QW5hbHl0aWNzLlByb3ZpZGVyPmAgY29tcG9uZW50IG9yIGB1c2VDdXN0b21lclByaXZhY3lgIGhvb2sgdG8gZ2V0IGNvb2tpZXMgaW4gdGhlIGJyb3dzZXIgYXV0b21hdGljYWxseS4KCkZvciBhIGZ1bGwgZXhhbXBsZSwgcmVmZXIgdG8gb3VyIFtza2VsZXRvbiB0ZW1wbGF0ZV0oaHR0cHM6Ly9naXRodWIuY29tL1Nob3BpZnkvaHlkcm9nZW4vYmxvYi9tYWluL3RlbXBsYXRlcy9za2VsZXRvbi9zZXJ2ZXIudHMpLgoKIyMjIFJlYWN0IFJvdXRlciArIEh5ZHJvZ2VuIG9uIG90aGVyIGhvc3RzCgojIyMjIEhvc3RzIHRoYXQgc3VwcG9ydCBXZWIgRmV0Y2ggQVBJIChSZXF1ZXN0L1Jlc3BvbnNlKQoKT24gaG9zdHMgdGhhdCBzdXBwb3J0IHRoZSBzdGFuZGFyZCBXZWIgRmV0Y2ggQVBJIChXb3JrZXJzLXN0eWxlIGVudmlyb25tZW50cyksIGltcG9ydCBgY3JlYXRlUmVxdWVzdEhhbmRsZXJgIGZyb20gYEBzaG9waWZ5L2h5ZHJvZ2VuYCAoaW5zdGVhZCBvZiBgcmVhY3Qtcm91dGVyYCkgYW5kIHJvdXRlIHJlcXVlc3RzIHRocm91Z2ggaXQ6CgpgYGB0cwppbXBvcnQge2NyZWF0ZVJlcXVlc3RIYW5kbGVyLCBjcmVhdGVIeWRyb2dlbkNvbnRleHR9IGZyb20gJ0BzaG9waWZ5L2h5ZHJvZ2VuJzsKCmNvbnN0IGh5ZHJvZ2VuQ29udGV4dCA9IGNyZWF0ZUh5ZHJvZ2VuQ29udGV4dCh7CiAgLyogLi4uICovCn0pOwoKY29uc3QgaGFuZGxlUmVxdWVzdCA9IGNyZWF0ZVJlcXVlc3RIYW5kbGVyKHsKICAvKiAuLi4gKi8KICBnZXRMb2FkQ29udGV4dDogKCkgPT4gaHlkcm9nZW5Db250ZXh0LAp9KTsKYGBgCgojIyMjIE5vZGUuanMgYW5kIG90aGVyIGhvc3RzCgpGb3IgTm9kZS1saWtlIGVudmlyb25tZW50cywgYWRhcHQgTm9kZSByZXF1ZXN0cyB0byBGZXRjaCB3aXRoIFtgQHJlbWl4LXJ1bi9ub2RlLWZldGNoLXNlcnZlcmBdKGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL0ByZW1peC1ydW4vbm9kZS1mZXRjaC1zZXJ2ZXIpLCB0aGVuIGRlbGVnYXRlIHRvIEh5ZHJvZ2VuJ3MgaGFuZGxlcjoKCmBgYHRzCmltcG9ydCB7Y3JlYXRlUmVxdWVzdEhhbmRsZXIsIGNyZWF0ZUh5ZHJvZ2VuQ29udGV4dH0gZnJvbSAnQHNob3BpZnkvaHlkcm9nZW4nOwppbXBvcnQge2NyZWF0ZVJlcXVlc3RMaXN0ZW5lcn0gZnJvbSAnQHJlbWl4LXJ1bi9ub2RlLWZldGNoLXNlcnZlcic7CmltcG9ydCBodHRwIGZyb20gJ2h0dHAnOwoKY29uc3QgaGFuZGxlTm9kZVJlcXVlc3QgPSBjcmVhdGVSZXF1ZXN0TGlzdGVuZXIoKHJlcXVlc3QpID0+IHsKICBjb25zdCBoeWRyb2dlbkNvbnRleHQgPSBjcmVhdGVIeWRyb2dlbkNvbnRleHQoewogICAgLyogLi4uICovCiAgfSk7CgogIGNvbnN0IGhhbmRsZVdlYlJlcXVlc3QgPSBjcmVhdGVSZXF1ZXN0SGFuZGxlcih7CiAgICAvKiAuLi4gKi8KICAgIGdldExvYWRDb250ZXh0OiAoKSA9PiBoeWRyb2dlbkNvbnRleHQsCiAgfSk7CgogIHJldHVybiBoYW5kbGVXZWJSZXF1ZXN0KHJlcXVlc3QpOwp9KTsKCmh0dHAuY3JlYXRlU2VydmVyKGhhbmRsZU5vZGVSZXF1ZXN0KTsKYGBgCgpBbHRlcm5hdGl2ZWx5LCBpZiB5b3UgY2FuJ3QgZGVsZWdhdGUgdG8gSHlkcm9nZW4ncyBgY3JlYXRlUmVxdWVzdEhhbmRsZXJgLCB5b3UgY2FuIHByb3ZpZGUgYSBjdXN0b20gU3RvcmVmcm9udCBBUEkgcHJveHkgaW4geW91ciBzZXJ2ZXIuIFNlZSBbSHlkcm9nZW4ncyBpbXBsZW1lbnRhdGlvbl0oaHR0cHM6Ly9naXRodWIuY29tL1Nob3BpZnkvaHlkcm9nZW4vYmxvYi8yNzA2NmEyODU3NzQ4NGY0MDYyMjIxMTZhOTU5ZWI0NjNkMjU1Njg1L3BhY2thZ2VzL2h5ZHJvZ2VuL3NyYy9zdG9yZWZyb250LnRzI0w1NDYtTDYxMSkgYXMgYSByZWZlcmVuY2UuIEluIHRoaXMgY2FzZSwgZW5zdXJlIHlvdSBtYW51YWxseSBwYXNzIGBzYW1lRG9tYWluRm9yU3RvcmVmcm9udEFwaTogdHJ1ZWAgaW4gdGhlIGBjb25zZW50YCBvYmplY3QgZm9yIGA8QW5hbHl0aWNzLlByb3ZpZGVyPmAgb3IgYXMgYSBwcm9wIHRvIHRoZSBgdXNlQ3VzdG9tZXJQcml2YWN5YCBob29rLgo=" } ], "pr": "https://github.com/Shopify/hydrogen/pull/3309", "id": "3309" }, { "title": "Improve development cold start time with static server build import", "info": "Moved server build in server.ts from a dynamic import to a static import to speed up first rendering during local development (2s => 200ms).", "breaking": false, "steps": [ { "title": "Update server.ts to use static import", "info": "Replace the dynamic import with a static import at the top of the file.", "code": "YGBgZGlmZgovLyBzZXJ2ZXIudHMKCitpbXBvcnQgKiBhcyBzZXJ2ZXJCdWlsZCBmcm9tICd2aXJ0dWFsOnJlYWN0LXJvdXRlci9zZXJ2ZXItYnVpbGQnOwoKY29uc3QgaGFuZGxlUmVxdWVzdCA9IGNyZWF0ZVJlcXVlc3RIYW5kbGVyKHsKLSAgYnVpbGQ6IGF3YWl0IGltcG9ydCgndmlydHVhbDpyZWFjdC1yb3V0ZXIvc2VydmVyLWJ1aWxkJyksCisgIGJ1aWxkOiBzZXJ2ZXJCdWlsZCwKICAgbW9kZTogcHJvY2Vzcy5lbnYuTk9ERV9FTlYsCiAgIGdldExvYWRDb250ZXh0OiAoKSA9PiBoeWRyb2dlbkNvbnRleHQsCn0pOwoKLy8gVGhpcyBjaGFuZ2UgaW1wcm92ZXMgY29sZCBzdGFydCB0aW1lIGluIGRldmVsb3BtZW50ICgycyA9PiAyMDBtcykKYGBgCg==" }, { "title": "Update ESLint config to allow virtual: imports", "info": "Add the virtual: prefix to the import/no-unresolved ignore list.", "code": "YGBgZGlmZgovLyBlc2xpbnQuY29uZmlnLmpzCgpydWxlczogeworICAnaW1wb3J0L25vLXVucmVzb2x2ZWQnOiBbJ2Vycm9yJywge2lnbm9yZTogWydedmlydHVhbDonXX1dLAp9CgovLyBBbGxvd3MgdmlydHVhbDogaW1wb3J0cyB1c2VkIGJ5IFJlYWN0IFJvdXRlcgpgYGAK" } ], "pr": "https://github.com/Shopify/hydrogen/pull/3331", "id": "3331" }, { "title": "React Router 7.12 stabilized APIs", "info": "React Router 7.12 stabilizes several previously unstable APIs. The following future flags in `react-router.config.ts` have been renamed:\n\n- `future.unstable_splitRouteModules` → `future.v8_splitRouteModules`\n- `future.unstable_viteEnvironmentApi` → `future.v8_viteEnvironmentApi`\n\nIf you're using these flags, update your config to use the new names.", "breaking": false, "steps": [ { "title": "Update fetcher reset calls", "info": "The `fetcher.unstable_reset()` method is now stable as `fetcher.reset()`. Update any usages in your code.", "code": "YGBgZGlmZgotIGZldGNoZXIudW5zdGFibGVfcmVzZXQoKQorIGZldGNoZXIucmVzZXQoKQpgYGAK" }, { "title": "Update RouterProvider onError prop", "info": "The `unstable_onError` prop on `` and `` is now stable as `onError`. Update any usages in your code.", "code": "YGBgZGlmZgovLyBGb3IgUm91dGVyUHJvdmlkZXIKLSA8Um91dGVyUHJvdmlkZXIgdW5zdGFibGVfb25FcnJvcj17aGFuZGxlRXJyb3J9IC8+CisgPFJvdXRlclByb3ZpZGVyIG9uRXJyb3I9e2hhbmRsZUVycm9yfSAvPgoKLy8gRm9yIEh5ZHJhdGVkUm91dGVyCi0gPEh5ZHJhdGVkUm91dGVyIHVuc3RhYmxlX29uRXJyb3I9e2hhbmRsZUVycm9yfSAvPgorIDxIeWRyYXRlZFJvdXRlciBvbkVycm9yPXtoYW5kbGVFcnJvcn0gLz4KYGBgCg==" } ], "pr": "https://github.com/Shopify/hydrogen/pull/3346", "id": "3346" } ] }, { "title": "Migrate to React Router 7 and API version 2025-07", "version": "2025.7.0", "date": "2025-09-17", "hash": "b09a1214b24251dbd48cd960d9ec8079a7c68d03", "commit": "https://github.com/Shopify/hydrogen/commit/b09a1214b24251dbd48cd960d9ec8079a7c68d03", "pr": "https://github.com/Shopify/hydrogen/pull/3166", "dependencies": { "@shopify/hydrogen": "2025.7.0", "react-router": "7.9.2", "react-router-dom": "7.9.2", "react": "18.3.1", "react-dom": "18.3.1" }, "devDependencies": { "@shopify/mini-oxygen": "4.0.0", "@shopify/cli": "3.85.4", "@react-router/dev": "7.9.2", "@react-router/fs-routes": "7.9.2" }, "removeDependencies": [ "@shopify/hydrogen", "@shopify/remix-oxygen", "@remix-run/react", "@remix-run/server-runtime", "react-router", "react-router-dom", "react", "react-dom", "@react-router/node" ], "removeDevDependencies": [ "@remix-run/dev", "@remix-run/fs-routes", "@remix-run/route-config", "@react-router/fs-routes", "@react-router/dev" ], "dependenciesMeta": { "@shopify/cli": { "required": true }, "react-router": { "required": true }, "@react-router/dev": { "required": true }, "@react-router/fs-routes": { "required": true }, "@shopify/mini-oxygen": { "required": true }, "@shopify/remix-oxygen": { "required": false }, "@remix-run/react": { "required": false }, "@remix-run/server-runtime": { "required": false }, "@remix-run/dev": { "required": false }, "@remix-run/fs-routes": { "required": false }, "@remix-run/route-config": { "required": false } }, "fixes": [ { "title": "Use stable Customer Account API development flag", "info": "The --customer-account-push flag is now stable. Use it to tunnel for local development with Customer Account API OAuth flows.", "steps": [ { "title": "Update command to use stable flag", "info": "Remove the __unstable suffix from the customer-account-push command", "code": "YGBgZGlmZgotIHNob3BpZnkgaHlkcm9nZW4gY3VzdG9tZXItYWNjb3VudC1wdXNoX191bnN0YWJsZSBbZmxhZ3NdCisgc2hvcGlmeSBoeWRyb2dlbiBjdXN0b21lci1hY2NvdW50LXB1c2ggW2ZsYWdzXQoKLy8gVGhlIC0tY3VzdG9tZXItYWNjb3VudC1wdXNoIGZsYWcgaXMgbm93IHN0YWJsZSBhbmQgbm8gbG9uZ2VyIHJlcXVpcmVzIF9fdW5zdGFibGUgc3VmZml4CmBgYAo=" } ], "pr": "https://github.com/Shopify/hydrogen/pull/3082", "id": "3082-flag" }, { "title": "Fix streaming issues in development and preview", "pr": "https://github.com/Shopify/hydrogen/pull/3039", "id": "3039" }, { "title": "Remove GraphQL client development warnings", "info": "Removes sourcemap warnings and stops unnecessary page reloads during development.", "pr": "https://github.com/Shopify/hydrogen/pull/3108", "id": "3108" }, { "title": "Handle unsupported currencies in Money component", "info": "The Money component now handles unsupported currency codes like USDC from Customer Account API.", "pr": "https://github.com/Shopify/hydrogen/pull/3082", "id": "3082-money" }, { "title": "Fix currency code format in parseMetafield", "info": "Transforms currency_code from Storefront API to currencyCode format expected by MoneyV2 type.", "pr": "https://github.com/Shopify/hydrogen/pull/3072", "id": "3072" }, { "title": "Fix TypeScript enum compatibility between APIs", "info": "Codegen now references Storefront API's LanguageCode and CurrencyCode enums for Customer Account API types.", "pr": "https://github.com/Shopify/hydrogen/pull/3139", "id": "3139" }, { "title": "Add TypeScript ESLint rules for promise handling", "info": "Adds TypeScript ESLint rules for promise handling to prevent deployment errors on Oxygen and Cloudflare Workers.", "steps": [ { "title": "Add promise handling rules to ESLint config", "info": "Enable no-floating-promises and no-misused-promises rules. These catch unhandled promises that cause deployment failures.", "code": "YGBgZGlmZgovLyBlc2xpbnQuY29uZmlnLmpzCmV4cG9ydCBkZWZhdWx0IHRzZXNsaW50LmNvbmZpZygKICB7CiAgICBydWxlczogewogICAgICAvLyAuLi4gZXhpc3RpbmcgcnVsZXMgLi4uCisgICAgICdAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZmxvYXRpbmctcHJvbWlzZXMnOiAnZXJyb3InLAorICAgICAnQHR5cGVzY3JpcHQtZXNsaW50L25vLW1pc3VzZWQtcHJvbWlzZXMnOiAnZXJyb3InLAogICAgfSwKICB9LAopOwoKLy8gVGhlc2UgcnVsZXMgcHJldmVudCB1bmhhbmRsZWQgcHJvbWlzZXMgYW5kIHByb21pc2UgbWlzdXNlCi8vIEhlbHBzIGF2b2lkICdUaGUgc2NyaXB0IHdpbGwgbmV2ZXIgZ2VuZXJhdGUgYSByZXNwb25zZScgZXJyb3JzIG9uIE94eWdlbi9DbG91ZGZsYXJlIFdvcmtlcnMKYGBgCg==" } ], "pr": "https://github.com/Shopify/hydrogen/pull/3146", "id": "3146" }, { "title": "Fix environment variable quoting in env pull command", "info": "Handles shell metacharacters in environment variables correctly.", "pr": "https://github.com/Shopify/hydrogen/pull/3050", "id": "3050" }, { "title": "Add --force-client-sourcemap flag to deploy command", "pr": "https://github.com/Shopify/hydrogen/pull/3039", "id": "3039-sourcemap" }, { "title": "Add Vite v7 exports support", "pr": "https://github.com/Shopify/hydrogen/pull/3039", "id": "3039-vite" }, { "title": "Fix and upgrade GraphiQL route", "pr": "https://github.com/Shopify/hydrogen/pull/3039", "id": "3039-graphiql" }, { "title": "Replace deprecated faker.internet.color()", "info": "Uses faker.color.rgb() instead.", "pr": "https://github.com/Shopify/hydrogen/pull/2985", "id": "2985" } ], "features": [ { "title": "Migrate to React Router 7.9.x", "info": "Move your Hydrogen app to React Router 7.9.x. You'll get automatic type generation, better type safety, and new context infrastructure. This removes the @shopify/remix-oxygen package. Check the complete skeleton template for reference: https://github.com/Shopify/hydrogen/tree/main/templates/skeleton", "breaking": true, "steps": [ { "title": "Run the automated migration codemod", "info": "This codemod will automatically update most imports and references from Remix to React Router", "code": "YGBgZGlmZgpucHggY29kZW1vZEBsYXRlc3QgcmVtaXgvMi9yZWFjdC1yb3V0ZXIvdXBncmFkZQpgYGAK" }, { "title": "Create react-router.config.ts with hydrogenPreset", "info": "Create your React Router configuration file using Hydrogen's optimized preset. This enhances routing and build performance.", "code": "YGBgdHlwZXNjcmlwdAovLyByZWFjdC1yb3V0ZXIuY29uZmlnLnRzCmltcG9ydCB0eXBlIHtDb25maWd9IGZyb20gIkByZWFjdC1yb3V0ZXIvZGV2L2NvbmZpZyI7CmltcG9ydCB7aHlkcm9nZW5QcmVzZXR9IGZyb20gIkBzaG9waWZ5L2h5ZHJvZ2VuL3JlYWN0LXJvdXRlci1wcmVzZXQiOwoKZXhwb3J0IGRlZmF1bHQgewogIHByZXNldHM6IFtoeWRyb2dlblByZXNldCgpXSwKfSBzYXRpc2ZpZXMgQ29uZmlnOwpgYGAK" }, { "title": "Update vite.config.ts to use React Router plugin", "info": "Replace the Remix Vite plugin with React Router's plugin. Add vite-tsconfig-paths for better path resolution.", "code": "YGBgZGlmZgovLyB2aXRlLmNvbmZpZy50cwppbXBvcnQge2RlZmluZUNvbmZpZ30gZnJvbSAndml0ZSc7Ci0gaW1wb3J0IHt2aXRlUGx1Z2luIGFzIHJlbWl4fSBmcm9tICdAcmVtaXgtcnVuL2Rldic7CisgaW1wb3J0IHtyZWFjdFJvdXRlcn0gZnJvbSAnQHJlYWN0LXJvdXRlci9kZXYvdml0ZSc7CmltcG9ydCB7aHlkcm9nZW59IGZyb20gJ0BzaG9waWZ5L2h5ZHJvZ2VuL3ZpdGUnOwppbXBvcnQge294eWdlbn0gZnJvbSAnQHNob3BpZnkvbWluaS1veHlnZW4vdml0ZSc7CisgaW1wb3J0IHRzY29uZmlnUGF0aHMgZnJvbSAndml0ZS10c2NvbmZpZy1wYXRocyc7CgpleHBvcnQgZGVmYXVsdCBkZWZpbmVDb25maWcoewogIHBsdWdpbnM6IFsKKyAgIGh5ZHJvZ2VuKCksCisgICBveHlnZW4oKSwKKyAgIHJlYWN0Um91dGVyKCksCisgICB0c2NvbmZpZ1BhdGhzKCkKLSAgIHJlbWl4KHsKLSAgICAgcHJlc2V0czogW2h5ZHJvZ2VuLnByZXNldCgpXSwKLSAgIH0pLAogIF0sCn0pOwpgYGAK" }, { "title": "Update tsconfig.json for React Router type generation", "info": "Update your TypeScript configuration to include React Router's generated types. This optimizes type checking.", "code": "YGBgZGlmZgovLyB0c2NvbmZpZy5qc29uCnsKICAiaW5jbHVkZSI6IFsKICAgICJlbnYuZC50cyIsCiAgICAiYXBwLyoqLyoudHMiLAogICAgImFwcC8qKi8qLnRzeCIsCisgICAiYXBwLyoqLyouZC50cyIsCisgICAiKi50cyIsCisgICAiKi50c3giLAorICAgIiouZC50cyIsCisgICAiLmdyYXBocWxyYy50cyIsCisgICAiLnJlYWN0LXJvdXRlci90eXBlcy8qKi8qIgotICAgIioqLyoudHMiLAotICAgIioqLyoudHN4IgogIF0sCiAgImNvbXBpbGVyT3B0aW9ucyI6IHsKICAgICJ0eXBlcyI6IFsKICAgICAgIkBzaG9waWZ5L294eWdlbi13b3JrZXJzLXR5cGVzIiwKKyAgICAgInJlYWN0LXJvdXRlciIsCisgICAgICJAc2hvcGlmeS9oeWRyb2dlbi9yZWFjdC1yb3V0ZXItdHlwZXMiLAorICAgICAidml0ZS9jbGllbnQiCi0gICAgICJAcmVtaXgtcnVuL25vZGUiLAotICAgICAidml0ZS9jbGllbnQiCiAgICBdLAorICAgInJvb3REaXJzIjogWyIuIiwgIi4vLnJlYWN0LXJvdXRlci90eXBlcyJdLAogICAgImJhc2VVcmwiOiAiLiIsCiAgICAicGF0aHMiOiB7CiAgICAgICJ+LyoiOiBbImFwcC8qIl0KICAgIH0KICB9Cn0KYGBgCg==" }, { "title": "Create app/lib/context.ts with createHydrogenRouterContext", "info": "Create a new context file that exports the createHydrogenRouterContext function. This supports additional context properties and type augmentation.", "code": "YGBgdHlwZXNjcmlwdAovLyBhcHAvbGliL2NvbnRleHQudHMKaW1wb3J0IHtjcmVhdGVIeWRyb2dlbkNvbnRleHR9IGZyb20gJ0BzaG9waWZ5L2h5ZHJvZ2VuJzsKaW1wb3J0IHtBcHBTZXNzaW9ufSBmcm9tICd+L2xpYi9zZXNzaW9uJzsKaW1wb3J0IHtDQVJUX1FVRVJZX0ZSQUdNRU5UfSBmcm9tICd+L2xpYi9mcmFnbWVudHMnOwoKY29uc3QgYWRkaXRpb25hbENvbnRleHQgPSB7CiAgLy8gQWRkaXRpb25hbCBjb250ZXh0IGZvciBjdXN0b20gcHJvcGVydGllcywgQ01TIGNsaWVudHMsIDNQIFNES3MsIGV0Yy4KfSBhcyBjb25zdDsKCnR5cGUgQWRkaXRpb25hbENvbnRleHRUeXBlID0gdHlwZW9mIGFkZGl0aW9uYWxDb250ZXh0OwoKZGVjbGFyZSBnbG9iYWwgewogIGludGVyZmFjZSBIeWRyb2dlbkFkZGl0aW9uYWxDb250ZXh0IGV4dGVuZHMgQWRkaXRpb25hbENvbnRleHRUeXBlIHt9Cn0KCmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVIeWRyb2dlblJvdXRlckNvbnRleHQoCiAgcmVxdWVzdDogUmVxdWVzdCwKICBlbnY6IEVudiwKICBleGVjdXRpb25Db250ZXh0OiBFeGVjdXRpb25Db250ZXh0LAopIHsKICBpZiAoIWVudj8uU0VTU0lPTl9TRUNSRVQpIHsKICAgIHRocm93IG5ldyBFcnJvcignU0VTU0lPTl9TRUNSRVQgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbm90IHNldCcpOwogIH0KCiAgY29uc3Qgd2FpdFVudGlsID0gZXhlY3V0aW9uQ29udGV4dC53YWl0VW50aWwuYmluZChleGVjdXRpb25Db250ZXh0KTsKICBjb25zdCBbY2FjaGUsIHNlc3Npb25dID0gYXdhaXQgUHJvbWlzZS5hbGwoWwogICAgY2FjaGVzLm9wZW4oJ2h5ZHJvZ2VuJyksCiAgICBBcHBTZXNzaW9uLmluaXQocmVxdWVzdCwgW2Vudi5TRVNTSU9OX1NFQ1JFVF0pLAogIF0pOwoKICBjb25zdCBoeWRyb2dlbkNvbnRleHQgPSBjcmVhdGVIeWRyb2dlbkNvbnRleHQoCiAgICB7CiAgICAgIGVudiwKICAgICAgcmVxdWVzdCwKICAgICAgY2FjaGUsCiAgICAgIHdhaXRVbnRpbCwKICAgICAgc2Vzc2lvbiwKICAgICAgaTE4bjoge2xhbmd1YWdlOiAnRU4nLCBjb3VudHJ5OiAnVVMnfSwKICAgICAgY2FydDogewogICAgICAgIHF1ZXJ5RnJhZ21lbnQ6IENBUlRfUVVFUllfRlJBR01FTlQsCiAgICAgIH0sCiAgICB9LAogICAgYWRkaXRpb25hbENvbnRleHQsCiAgKTsKCiAgcmV0dXJuIGh5ZHJvZ2VuQ29udGV4dDsKfQpgYGAK" }, { "title": "Update server.ts to use createHydrogenRouterContext", "info": "Replace @shopify/remix-oxygen with @shopify/hydrogen/oxygen. Use the new context creation function with session handling.", "code": "YGBgZGlmZgovLyBzZXJ2ZXIudHMKLSBpbXBvcnQge2NyZWF0ZVJlcXVlc3RIYW5kbGVyfSBmcm9tICJAc2hvcGlmeS9yZW1peC1veHlnZW4iOworIGltcG9ydCB7Y3JlYXRlUmVxdWVzdEhhbmRsZXJ9IGZyb20gIkBzaG9waWZ5L2h5ZHJvZ2VuL294eWdlbiI7CisgaW1wb3J0IHtjcmVhdGVIeWRyb2dlblJvdXRlckNvbnRleHR9IGZyb20gIn4vbGliL2NvbnRleHQiOwoKZXhwb3J0IGRlZmF1bHQgewogIGFzeW5jIGZldGNoKHJlcXVlc3Q6IFJlcXVlc3QsIGVudjogRW52LCBleGVjdXRpb25Db250ZXh0OiBFeGVjdXRpb25Db250ZXh0KTogUHJvbWlzZTxSZXNwb25zZT4geworICAgY29uc3QgaHlkcm9nZW5Db250ZXh0ID0gYXdhaXQgY3JlYXRlSHlkcm9nZW5Sb3V0ZXJDb250ZXh0KAorICAgICByZXF1ZXN0LAorICAgICBlbnYsCisgICAgIGV4ZWN1dGlvbkNvbnRleHQsCisgICApOwoKICAgIGNvbnN0IGhhbmRsZVJlcXVlc3QgPSBjcmVhdGVSZXF1ZXN0SGFuZGxlcih7Ci0gICAgIGJ1aWxkOiBhd2FpdCBpbXBvcnQoJ3ZpcnR1YWw6cmVtaXgvc2VydmVyLWJ1aWxkJyksCisgICAgIGJ1aWxkOiBhd2FpdCBpbXBvcnQoJ3ZpcnR1YWw6cmVhY3Qtcm91dGVyL3NlcnZlci1idWlsZCcpLAogICAgICBtb2RlOiBwcm9jZXNzLmVudi5OT0RFX0VOViwKLSAgICAgZ2V0TG9hZENvbnRleHQ6ICgpID0+ICh7Li4ufSksCisgICAgIGdldExvYWRDb250ZXh0OiAoKSA9PiBoeWRyb2dlbkNvbnRleHQsCiAgICB9KTsKCiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGhhbmRsZVJlcXVlc3QocmVxdWVzdCk7CisKKyAgIGlmIChoeWRyb2dlbkNvbnRleHQuc2Vzc2lvbi5pc1BlbmRpbmcpIHsKKyAgICAgcmVzcG9uc2UuaGVhZGVycy5zZXQoJ1NldC1Db29raWUnLCBhd2FpdCBoeWRyb2dlbkNvbnRleHQuc2Vzc2lvbi5jb21taXQoKSk7CisgICB9CgogICAgcmV0dXJuIHJlc3BvbnNlOwogIH0KfTsKYGBgCg==" }, { "title": "Update entry.server.tsx with new context types", "info": "Replace Remix types with React Router types. Use HydrogenRouterContextProvider for better type safety.", "code": "YGBgZGlmZgovLyBhcHAvZW50cnkuc2VydmVyLnRzeAotIGltcG9ydCB0eXBlIHtBcHBMb2FkQ29udGV4dH0gZnJvbSAiQHNob3BpZnkvcmVtaXgtb3h5Z2VuIjsKLSBpbXBvcnQgdHlwZSB7RW50cnlDb250ZXh0fSBmcm9tICJAcmVtaXgtcnVuL3NlcnZlci1ydW50aW1lIjsKKyBpbXBvcnQgdHlwZSB7RW50cnlDb250ZXh0fSBmcm9tICJyZWFjdC1yb3V0ZXIiOwppbXBvcnQgewogIGNyZWF0ZUNvbnRlbnRTZWN1cml0eVBvbGljeSwKKyB0eXBlIEh5ZHJvZ2VuUm91dGVyQ29udGV4dFByb3ZpZGVyLAp9IGZyb20gIkBzaG9waWZ5L2h5ZHJvZ2VuIjsKCmV4cG9ydCBkZWZhdWx0IGFzeW5jIGZ1bmN0aW9uIGhhbmRsZVJlcXVlc3QoCiAgcmVxdWVzdDogUmVxdWVzdCwKICByZXNwb25zZVN0YXR1c0NvZGU6IG51bWJlciwKICByZXNwb25zZUhlYWRlcnM6IEhlYWRlcnMsCi0gcmVtaXhDb250ZXh0OiBFbnRyeUNvbnRleHQsCisgcmVhY3RSb3V0ZXJDb250ZXh0OiBFbnRyeUNvbnRleHQsCi0gY29udGV4dDogQXBwTG9hZENvbnRleHQsCisgY29udGV4dDogSHlkcm9nZW5Sb3V0ZXJDb250ZXh0UHJvdmlkZXIsCikgewogIGNvbnN0IHtub25jZSwgaGVhZGVyLCBOb25jZVByb3ZpZGVyfSA9IGNyZWF0ZUNvbnRlbnRTZWN1cml0eVBvbGljeSh7Li4ufSk7CgogIGNvbnN0IGJvZHkgPSBhd2FpdCByZW5kZXJUb1JlYWRhYmxlU3RyZWFtKAogICAgPE5vbmNlUHJvdmlkZXI+CiAgICAgIDxTZXJ2ZXJSb3V0ZXIKLSAgICAgICBjb250ZXh0PXtyZW1peENvbnRleHR9CisgICAgICAgY29udGV4dD17cmVhY3RSb3V0ZXJDb250ZXh0fQogICAgICAgIHVybD17cmVxdWVzdC51cmx9CiAgICAgICAgbm9uY2U9e25vbmNlfQogICAgICAvPgogICAgPC9Ob25jZVByb3ZpZGVyPiwKICApOwp9CmBgYAo=" }, { "title": "Update entry.client.tsx with NonceProvider and HydratedRouter", "info": "Replace RemixBrowser with HydratedRouter. Wrap with NonceProvider for CSP support during client-side hydration.", "code": "YGBgZGlmZgovLyBhcHAvZW50cnkuY2xpZW50LnRzeAotIGltcG9ydCB7UmVtaXhCcm93c2VyfSBmcm9tICJAcmVtaXgtcnVuL3JlYWN0IjsKKyBpbXBvcnQge0h5ZHJhdGVkUm91dGVyfSBmcm9tICJyZWFjdC1yb3V0ZXIvZG9tIjsKaW1wb3J0IHtzdGFydFRyYW5zaXRpb24sIFN0cmljdE1vZGV9IGZyb20gInJlYWN0IjsKaW1wb3J0IHtoeWRyYXRlUm9vdH0gZnJvbSAicmVhY3QtZG9tL2NsaWVudCI7CisgaW1wb3J0IHtOb25jZVByb3ZpZGVyfSBmcm9tICJAc2hvcGlmeS9oeWRyb2dlbiI7CgppZiAoIXdpbmRvdy5sb2NhdGlvbi5vcmlnaW4uaW5jbHVkZXMoIndlYmNhY2hlLmdvb2dsZXVzZXJjb250ZW50LmNvbSIpKSB7CiAgc3RhcnRUcmFuc2l0aW9uKCgpID0+IHsKKyAgIGNvbnN0IGV4aXN0aW5nTm9uY2UgPSBkb2N1bWVudAorICAgICAucXVlcnlTZWxlY3RvcjxIVE1MU2NyaXB0RWxlbWVudD4oInNjcmlwdFtub25jZV0iKQorICAgICA/Lm5vbmNlOworCiAgICBoeWRyYXRlUm9vdCgKICAgICAgZG9jdW1lbnQsCiAgICAgIDxTdHJpY3RNb2RlPgotICAgICAgIDxSZW1peEJyb3dzZXIgLz4KKyAgICAgICA8Tm9uY2VQcm92aWRlciB2YWx1ZT17ZXhpc3RpbmdOb25jZX0+CisgICAgICAgICA8SHlkcmF0ZWRSb3V0ZXIgLz4KKyAgICAgICA8L05vbmNlUHJvdmlkZXI+CiAgICAgIDwvU3RyaWN0TW9kZT4sCiAgICApOwogIH0pOwp9CmBgYAo=" }, { "title": "Update @shopify/remix-oxygen imports in route files", "info": "Replace @shopify/remix-oxygen imports with react-router equivalents in your routes", "code": "YGBgZGlmZgotIGltcG9ydCB7cmVkaXJlY3QsIHR5cGUgTG9hZGVyRnVuY3Rpb25BcmdzfSBmcm9tICJAc2hvcGlmeS9yZW1peC1veHlnZW4iOworIGltcG9ydCB7cmVkaXJlY3R9IGZyb20gInJlYWN0LXJvdXRlciI7CisgaW1wb3J0IHR5cGUge0xvYWRlckZ1bmN0aW9uQXJnc30gZnJvbSAiQHNob3BpZnkvaHlkcm9nZW4vb3h5Z2VuIjsKYGBgCg==" }, { "title": "Update @remix-run/react imports in route files", "info": "Replace @remix-run/react imports with react-router equivalents in your routes", "code": "YGBgZGlmZgotIGltcG9ydCB7dXNlTG9hZGVyRGF0YSwgdHlwZSBNZXRhRnVuY3Rpb259IGZyb20gIkByZW1peC1ydW4vcmVhY3QiOworIGltcG9ydCB7dXNlTG9hZGVyRGF0YX0gZnJvbSAicmVhY3Qtcm91dGVyIjsKYGBgCg==" }, { "title": "Add React Router 7 route type imports", "info": "Import route-specific types from React Router 7's new type generation system", "code": "YGBgZGlmZgorIGltcG9ydCB0eXBlIHtSb3V0ZX0gZnJvbSAiLi8rdHlwZXMvcm91dGUtbmFtZSI7CmBgYAo=" }, { "title": "Add .react-router to .gitignore", "info": "React Router 7 generates type files that should not be committed to version control", "code": "YGBgZGlmZgplY2hvICIucmVhY3Qtcm91dGVyLyIgPj4gLmdpdGlnbm9yZQpgYGAK" }, { "title": "Update package.json scripts to use react-router typegen", "info": "Add React Router type generation to your dev script. This automatically updates types during development.", "code": "YGBgZGlmZgotICJkZXYiOiAic2hvcGlmeSBoeWRyb2dlbiBkZXYgLS1jb2RlZ2VuIiwKKyAiZGV2IjogInJlYWN0LXJvdXRlciB0eXBlZ2VuIC0td2F0Y2ggJiYgc2hvcGlmeSBoeWRyb2dlbiBkZXYgLS1jb2RlZ2VuIiwKYGBgCg==" }, { "title": "Verify your app starts and builds correctly", "info": "Test that your application runs without errors after the migration", "code": "YGBgZGlmZgpucG0gcnVuIGRldgpucG0gcnVuIGJ1aWxkCmBgYAo=" } ], "pr": "https://github.com/Shopify/hydrogen/pull/3141", "id": "3141" }, { "title": "Update to Storefront API and Customer Account API version 2025-07", "breaking": false, "pr": "https://github.com/Shopify/hydrogen/pull/3082", "id": "3082" }, { "title": "Add countryCode parameter to Customer Account API methods", "info": "You can now pass the countryCode parameter to all Customer Account API methods for better localization support.", "breaking": false, "steps": [ { "title": "Add countryCode parameter to Customer Account API method calls", "info": "Pass the customer account country code to any Customer Account API method. See login method example.", "code": "YGBgZGlmZgovLyBhcHAvcm91dGVzL2FjY291bnRfLmxvZ2luLnRzeCAoZXhhbXBsZSkKZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRlcih7cmVxdWVzdCwgY29udGV4dH06IFJvdXRlLkxvYWRlckFyZ3MpIHsKICByZXR1cm4gY29udGV4dC5jdXN0b21lckFjY291bnQubG9naW4oeworICAgY291bnRyeUNvZGU6IGNvbnRleHQuY3VzdG9tZXJBY2NvdW50LmkxOG4uY291bnRyeSwKICB9KTsKfQoKLy8gVGhlIGNvdW50cnlDb2RlIHBhcmFtZXRlciBpcyBub3cgYXZhaWxhYmxlIG9uIGFsbCBDdXN0b21lciBBY2NvdW50IEFQSSBtZXRob2RzCi8vIGFuZCBjYW4gYmUgcGFzc2VkIGZyb20gY29udGV4dC5jdXN0b21lckFjY291bnQuaTE4bi5jb3VudHJ5CmBgYAo=" } ], "pr": "https://github.com/Shopify/hydrogen/pull/3148", "id": "3148" }, { "title": "Remove individual gift cards from cart", "info": "Use the new CartForm.ACTIONS.GiftCardCodesRemove action to remove individual gift cards by their IDs. You no longer need to replace all gift cards.", "breaking": false, "steps": [ { "title": "Add GiftCardCodesRemove case to cart action handler", "info": "Handle the new GiftCardCodesRemove action in your cart route. This enables individual gift card removal.", "code": "YGBgZGlmZgovLyBhcHAvcm91dGVzL2NhcnQudHN4CmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhY3Rpb24oe3JlcXVlc3QsIGNvbnRleHR9OiBSb3V0ZS5BY3Rpb25BcmdzKSB7CiAgY29uc3Qge2NhcnR9ID0gY29udGV4dDsKICBjb25zdCBmb3JtRGF0YSA9IGF3YWl0IHJlcXVlc3QuZm9ybURhdGEoKTsKICBjb25zdCB7YWN0aW9uLCBpbnB1dHN9ID0gQ2FydEZvcm0uZ2V0Rm9ybUlucHV0KGZvcm1EYXRhKTsKCiAgc3dpdGNoIChhY3Rpb24pIHsKICAgIC8vIC4uLiBleGlzdGluZyBjYXNlcyAuLi4KKyAgIGNhc2UgQ2FydEZvcm0uQUNUSU9OUy5HaWZ0Q2FyZENvZGVzUmVtb3ZlOiB7CisgICAgIGNvbnN0IGFwcGxpZWRHaWZ0Q2FyZElkcyA9IGlucHV0cy5naWZ0Q2FyZENvZGVzIGFzIHN0cmluZ1tdOworICAgICByZXN1bHQgPSBhd2FpdCBjYXJ0LnJlbW92ZUdpZnRDYXJkQ29kZXMoYXBwbGllZEdpZnRDYXJkSWRzKTsKKyAgICAgYnJlYWs7CisgICB9CiAgfQp9CmBgYAo=" }, { "title": "Add RemoveGiftCardForm component", "info": "Create a new form component to handle individual gift card removal", "code": "YGBgZGlmZgovLyBhcHAvY29tcG9uZW50cy9DYXJ0U3VtbWFyeS50c3gKK2Z1bmN0aW9uIFJlbW92ZUdpZnRDYXJkRm9ybSh7CisgIGdpZnRDYXJkSWQsCisgIGNoaWxkcmVuLAorfTogeworICBnaWZ0Q2FyZElkOiBzdHJpbmc7CisgIGNoaWxkcmVuOiBSZWFjdC5SZWFjdE5vZGU7Cit9KSB7CisgIHJldHVybiAoCisgICAgPENhcnRGb3JtCisgICAgICByb3V0ZT0iL2NhcnQiCisgICAgICBhY3Rpb249e0NhcnRGb3JtLkFDVElPTlMuR2lmdENhcmRDb2Rlc1JlbW92ZX0KKyAgICAgIGlucHV0cz17eworICAgICAgICBnaWZ0Q2FyZENvZGVzOiBbZ2lmdENhcmRJZF0sCisgICAgICB9fQorICAgID4KKyAgICAgIHtjaGlsZHJlbn0KKyAgICA8L0NhcnRGb3JtPgorICApOworfQpgYGAK" }, { "title": "Update CartGiftCard to display gift cards with remove buttons", "info": "Render applied gift cards with individual remove buttons. This improves user experience.", "code": "YGBgZGlmZgovLyBhcHAvY29tcG9uZW50cy9DYXJ0U3VtbWFyeS50c3gKZnVuY3Rpb24gQ2FydEdpZnRDYXJkKHtnaWZ0Q2FyZENvZGVzfTogey4uLn0pIHsKICByZXR1cm4gKAogICAgPGRpdj4KKyAgICAge2dpZnRDYXJkQ29kZXMgJiYgZ2lmdENhcmRDb2Rlcy5sZW5ndGggPiAwICYmICgKKyAgICAgICA8ZGw+CisgICAgICAgICA8ZHQ+QXBwbGllZCBHaWZ0IENhcmQocyk8L2R0PgorICAgICAgICAge2dpZnRDYXJkQ29kZXMubWFwKChnaWZ0Q2FyZCkgPT4gKAorICAgICAgICAgICA8UmVtb3ZlR2lmdENhcmRGb3JtIGtleT17Z2lmdENhcmQuaWR9IGdpZnRDYXJkSWQ9e2dpZnRDYXJkLmlkfT4KKyAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0iY2FydC1kaXNjb3VudCI+CisgICAgICAgICAgICAgICA8Y29kZT4qKip7Z2lmdENhcmQubGFzdENoYXJhY3RlcnN9PC9jb2RlPgorICAgICAgICAgICAgICAgPE1vbmV5IGRhdGE9e2dpZnRDYXJkLmFtb3VudFVzZWR9IC8+CisgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9InN1Ym1pdCI+UmVtb3ZlPC9idXR0b24+CisgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgIDwvUmVtb3ZlR2lmdENhcmRGb3JtPgorICAgICAgICAgKSl9CisgICAgICAgPC9kbD4KKyAgICAgKX0KICAgIDwvZGl2PgogICk7Cn0KYGBgCg==" } ], "pr": "https://github.com/Shopify/hydrogen/pull/3128", "id": "3128" }, { "title": "Filter customer orders by number and confirmation", "info": "Filter your customer orders by order number and confirmation number using Customer Account API query parameters.", "breaking": false, "steps": [ { "title": "Create app/lib/orderFilters.ts utility", "info": "Create helper functions to parse URL parameters and build Customer Account API search queries.", "code": "YGBgdHlwZXNjcmlwdAovLyBhcHAvbGliL29yZGVyRmlsdGVycy50cwpleHBvcnQgY29uc3QgT1JERVJfRklMVEVSX0ZJRUxEUyA9IHsKICBOQU1FOiAnbmFtZScsCiAgQ09ORklSTUFUSU9OX05VTUJFUjogJ2NvbmZpcm1hdGlvbl9udW1iZXInLAp9IGFzIGNvbnN0OwoKZXhwb3J0IGludGVyZmFjZSBPcmRlckZpbHRlclBhcmFtcyB7CiAgbmFtZT86IHN0cmluZzsKICBjb25maXJtYXRpb25OdW1iZXI/OiBzdHJpbmc7Cn0KCmZ1bmN0aW9uIHNhbml0aXplRmlsdGVyVmFsdWUodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7CiAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoL1teYS16QS1aMC05X1wtXS9nLCAnJyk7Cn0KCmV4cG9ydCBmdW5jdGlvbiBidWlsZE9yZGVyU2VhcmNoUXVlcnkoCiAgZmlsdGVyczogT3JkZXJGaWx0ZXJQYXJhbXMsCik6IHN0cmluZyB8IHVuZGVmaW5lZCB7CiAgY29uc3QgcXVlcnlQYXJ0czogc3RyaW5nW10gPSBbXTsKCiAgaWYgKGZpbHRlcnMubmFtZSkgewogICAgY29uc3QgY2xlYW5OYW1lID0gZmlsdGVycy5uYW1lLnJlcGxhY2UoL14jLywgJycpLnRyaW0oKTsKICAgIGNvbnN0IHNhbml0aXplZE5hbWUgPSBzYW5pdGl6ZUZpbHRlclZhbHVlKGNsZWFuTmFtZSk7CiAgICBpZiAoc2FuaXRpemVkTmFtZSkgewogICAgICBxdWVyeVBhcnRzLnB1c2goYG5hbWU6JHtzYW5pdGl6ZWROYW1lfWApOwogICAgfQogIH0KCiAgaWYgKGZpbHRlcnMuY29uZmlybWF0aW9uTnVtYmVyKSB7CiAgICBjb25zdCBjbGVhbkNvbmZpcm1hdGlvbiA9IGZpbHRlcnMuY29uZmlybWF0aW9uTnVtYmVyLnRyaW0oKTsKICAgIGNvbnN0IHNhbml0aXplZENvbmZpcm1hdGlvbiA9IHNhbml0aXplRmlsdGVyVmFsdWUoY2xlYW5Db25maXJtYXRpb24pOwogICAgaWYgKHNhbml0aXplZENvbmZpcm1hdGlvbikgewogICAgICBxdWVyeVBhcnRzLnB1c2goYGNvbmZpcm1hdGlvbl9udW1iZXI6JHtzYW5pdGl6ZWRDb25maXJtYXRpb259YCk7CiAgICB9CiAgfQoKICByZXR1cm4gcXVlcnlQYXJ0cy5sZW5ndGggPiAwID8gcXVlcnlQYXJ0cy5qb2luKCcgQU5EICcpIDogdW5kZWZpbmVkOwp9CgpleHBvcnQgZnVuY3Rpb24gcGFyc2VPcmRlckZpbHRlcnMoCiAgc2VhcmNoUGFyYW1zOiBVUkxTZWFyY2hQYXJhbXMsCik6IE9yZGVyRmlsdGVyUGFyYW1zIHsKICBjb25zdCBmaWx0ZXJzOiBPcmRlckZpbHRlclBhcmFtcyA9IHt9OwoKICBjb25zdCBuYW1lID0gc2VhcmNoUGFyYW1zLmdldChPUkRFUl9GSUxURVJfRklFTERTLk5BTUUpOwogIGlmIChuYW1lKSBmaWx0ZXJzLm5hbWUgPSBuYW1lOwoKICBjb25zdCBjb25maXJtYXRpb25OdW1iZXIgPSBzZWFyY2hQYXJhbXMuZ2V0KE9SREVSX0ZJTFRFUl9GSUVMRFMuQ09ORklSTUFUSU9OX05VTUJFUik7CiAgaWYgKGNvbmZpcm1hdGlvbk51bWJlcikgZmlsdGVycy5jb25maXJtYXRpb25OdW1iZXIgPSBjb25maXJtYXRpb25OdW1iZXI7CgogIHJldHVybiBmaWx0ZXJzOwp9CmBgYAo=" }, { "title": "Update loader to parse filters and build search query", "info": "Parse URL search parameters and build the Customer Account API query string.", "code": "YGBgZGlmZgovLyBhcHAvcm91dGVzL2FjY291bnQub3JkZXJzLl9pbmRleC50c3gKK2ltcG9ydCB7CisgIGJ1aWxkT3JkZXJTZWFyY2hRdWVyeSwKKyAgcGFyc2VPcmRlckZpbHRlcnMsCisgIHR5cGUgT3JkZXJGaWx0ZXJQYXJhbXMsCit9IGZyb20gJ34vbGliL29yZGVyRmlsdGVycyc7CgpleHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZGVyKHtyZXF1ZXN0LCBjb250ZXh0fTogUm91dGUuTG9hZGVyQXJncykgewogIGNvbnN0IHtjdXN0b21lckFjY291bnR9ID0gY29udGV4dDsKICBjb25zdCBwYWdpbmF0aW9uVmFyaWFibGVzID0gZ2V0UGFnaW5hdGlvblZhcmlhYmxlcyhyZXF1ZXN0LCB7CiAgICBwYWdlQnk6IDIwLAogIH0pOwoKKyBjb25zdCB1cmwgPSBuZXcgVVJMKHJlcXVlc3QudXJsKTsKKyBjb25zdCBmaWx0ZXJzID0gcGFyc2VPcmRlckZpbHRlcnModXJsLnNlYXJjaFBhcmFtcyk7CisgY29uc3QgcXVlcnkgPSBidWlsZE9yZGVyU2VhcmNoUXVlcnkoZmlsdGVycyk7CgogIGNvbnN0IHtkYXRhLCBlcnJvcnN9ID0gYXdhaXQgY3VzdG9tZXJBY2NvdW50LnF1ZXJ5KENVU1RPTUVSX09SREVSU19RVUVSWSwgewogICAgdmFyaWFibGVzOiB7CiAgICAgIC4uLnBhZ2luYXRpb25WYXJpYWJsZXMsCisgICAgIHF1ZXJ5LAogICAgICBsYW5ndWFnZTogY3VzdG9tZXJBY2NvdW50LmkxOG4ubGFuZ3VhZ2UsCiAgICB9LAogIH0pOwoKICBpZiAoZXJyb3JzPy5sZW5ndGggfHwgIWRhdGE/LmN1c3RvbWVyKSB7CiAgICB0aHJvdyBFcnJvcignQ3VzdG9tZXIgb3JkZXJzIG5vdCBmb3VuZCcpOwogIH0KCi0gcmV0dXJuIHtjdXN0b21lcjogZGF0YS5jdXN0b21lcn07CisgcmV0dXJuIHtjdXN0b21lcjogZGF0YS5jdXN0b21lciwgZmlsdGVyc307Cn0KYGBgCg==" }, { "title": "Add OrderSearchForm component", "info": "Create a search form with order number and confirmation number inputs", "code": "YGBgZGlmZgovLyBhcHAvcm91dGVzL2FjY291bnQub3JkZXJzLl9pbmRleC50c3gKK2ltcG9ydCB7dXNlU2VhcmNoUGFyYW1zLCB1c2VOYXZpZ2F0aW9ufSBmcm9tICdyZWFjdC1yb3V0ZXInOworaW1wb3J0IHt1c2VSZWZ9IGZyb20gJ3JlYWN0JzsKK2ltcG9ydCB7T1JERVJfRklMVEVSX0ZJRUxEU30gZnJvbSAnfi9saWIvb3JkZXJGaWx0ZXJzJzsKCitmdW5jdGlvbiBPcmRlclNlYXJjaEZvcm0oe2N1cnJlbnRGaWx0ZXJzfToge2N1cnJlbnRGaWx0ZXJzOiBPcmRlckZpbHRlclBhcmFtc30pIHsKKyAgY29uc3QgW3NlYXJjaFBhcmFtcywgc2V0U2VhcmNoUGFyYW1zXSA9IHVzZVNlYXJjaFBhcmFtcygpOworICBjb25zdCBuYXZpZ2F0aW9uID0gdXNlTmF2aWdhdGlvbigpOworICBjb25zdCBpc1NlYXJjaGluZyA9IG5hdmlnYXRpb24uc3RhdGUgIT09ICdpZGxlJyAmJiBuYXZpZ2F0aW9uLmxvY2F0aW9uPy5wYXRobmFtZT8uaW5jbHVkZXMoJ29yZGVycycpOworICBjb25zdCBmb3JtUmVmID0gdXNlUmVmPEhUTUxGb3JtRWxlbWVudD4obnVsbCk7CisKKyAgY29uc3QgaGFuZGxlU3VibWl0ID0gKGV2ZW50OiBSZWFjdC5Gb3JtRXZlbnQ8SFRNTEZvcm1FbGVtZW50PikgPT4geworICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CisgICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoZXZlbnQuY3VycmVudFRhcmdldCk7CisgICAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpOworCisgICAgY29uc3QgbmFtZSA9IGZvcm1EYXRhLmdldChPUkRFUl9GSUxURVJfRklFTERTLk5BTUUpPy50b1N0cmluZygpLnRyaW0oKTsKKyAgICBjb25zdCBjb25maXJtYXRpb25OdW1iZXIgPSBmb3JtRGF0YS5nZXQoT1JERVJfRklMVEVSX0ZJRUxEUy5DT05GSVJNQVRJT05fTlVNQkVSKT8udG9TdHJpbmcoKS50cmltKCk7CisKKyAgICBpZiAobmFtZSkgcGFyYW1zLnNldChPUkRFUl9GSUxURVJfRklFTERTLk5BTUUsIG5hbWUpOworICAgIGlmIChjb25maXJtYXRpb25OdW1iZXIpIHBhcmFtcy5zZXQoT1JERVJfRklMVEVSX0ZJRUxEUy5DT05GSVJNQVRJT05fTlVNQkVSLCBjb25maXJtYXRpb25OdW1iZXIpOworCisgICAgc2V0U2VhcmNoUGFyYW1zKHBhcmFtcyk7CisgIH07CisKKyAgcmV0dXJuICgKKyAgICA8Zm9ybSByZWY9e2Zvcm1SZWZ9IG9uU3VibWl0PXtoYW5kbGVTdWJtaXR9PgorICAgICAgPGlucHV0IHR5cGU9InNlYXJjaCIgbmFtZT17T1JERVJfRklMVEVSX0ZJRUxEUy5OQU1FfSBwbGFjZWhvbGRlcj0iT3JkZXIgIyIgZGVmYXVsdFZhbHVlPXtjdXJyZW50RmlsdGVycy5uYW1lIHx8ICcnfSAvPgorICAgICAgPGlucHV0IHR5cGU9InNlYXJjaCIgbmFtZT17T1JERVJfRklMVEVSX0ZJRUxEUy5DT05GSVJNQVRJT05fTlVNQkVSfSBwbGFjZWhvbGRlcj0iQ29uZmlybWF0aW9uICMiIGRlZmF1bHRWYWx1ZT17Y3VycmVudEZpbHRlcnMuY29uZmlybWF0aW9uTnVtYmVyIHx8ICcnfSAvPgorICAgICAgPGJ1dHRvbiB0eXBlPSJzdWJtaXQiIGRpc2FibGVkPXtpc1NlYXJjaGluZ30+e2lzU2VhcmNoaW5nID8gJ1NlYXJjaGluZycgOiAnU2VhcmNoJ308L2J1dHRvbj4KKyAgICA8L2Zvcm0+CisgICk7Cit9CmBgYAo=" }, { "title": "Update Orders component to use filters and add EmptyOrders", "info": "Pass filters to components and add conditional empty state messaging.", "code": "YGBgZGlmZgovLyBhcHAvcm91dGVzL2FjY291bnQub3JkZXJzLl9pbmRleC50c3gKZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gT3JkZXJzKCkgewotIGNvbnN0IHtjdXN0b21lcn0gPSB1c2VMb2FkZXJEYXRhPE9yZGVyc0xvYWRlckRhdGE+KCk7CisgY29uc3Qge2N1c3RvbWVyLCBmaWx0ZXJzfSA9IHVzZUxvYWRlckRhdGE8T3JkZXJzTG9hZGVyRGF0YT4oKTsKICBjb25zdCB7b3JkZXJzfSA9IGN1c3RvbWVyOwoKICByZXR1cm4gKAogICAgPGRpdiBjbGFzc05hbWU9Im9yZGVycyI+CisgICAgIDxPcmRlclNlYXJjaEZvcm0gY3VycmVudEZpbHRlcnM9e2ZpbHRlcnN9IC8+Ci0gICAgIDxPcmRlcnNUYWJsZSBvcmRlcnM9e29yZGVyc30gLz4KKyAgICAgPE9yZGVyc1RhYmxlIG9yZGVycz17b3JkZXJzfSBmaWx0ZXJzPXtmaWx0ZXJzfSAvPgogICAgPC9kaXY+CiAgKTsKfQoKLWZ1bmN0aW9uIE9yZGVyc1RhYmxlKHtvcmRlcnN9OiB7b3JkZXJzOiBDdXN0b21lck9yZGVyc0ZyYWdtZW50WydvcmRlcnMnXX0pIHsKK2Z1bmN0aW9uIE9yZGVyc1RhYmxlKHtvcmRlcnMsIGZpbHRlcnN9OiB7b3JkZXJzOiBDdXN0b21lck9yZGVyc0ZyYWdtZW50WydvcmRlcnMnXTsgZmlsdGVyczogT3JkZXJGaWx0ZXJQYXJhbXN9KSB7CisgIGNvbnN0IGhhc0ZpbHRlcnMgPSAhIShmaWx0ZXJzLm5hbWUgfHwgZmlsdGVycy5jb25maXJtYXRpb25OdW1iZXIpOworCiAgcmV0dXJuICgKICAgIDxkaXY+CiAgICAgIHtvcmRlcnM/Lm5vZGVzLmxlbmd0aCA/ICgKICAgICAgICA8UGFnaW5hdGVkUmVzb3VyY2VTZWN0aW9uIGNvbm5lY3Rpb249e29yZGVyc30+CiAgICAgICAgICB7KHtub2RlOiBvcmRlcn0pID0+IDxPcmRlckl0ZW0ga2V5PXtvcmRlci5pZH0gb3JkZXI9e29yZGVyfSAvPn0KICAgICAgICA8L1BhZ2luYXRlZFJlc291cmNlU2VjdGlvbj4KICAgICAgKSA6ICgKLSAgICAgICA8cD5Zb3UgaGF2ZW4ndCBwbGFjZWQgYW55IG9yZGVycyB5ZXQuPC9wPgorICAgICAgIDxFbXB0eU9yZGVycyBoYXNGaWx0ZXJzPXtoYXNGaWx0ZXJzfSAvPgogICAgICApfQogICAgPC9kaXY+CiAgKTsKfQoKK2Z1bmN0aW9uIEVtcHR5T3JkZXJzKHtoYXNGaWx0ZXJzfToge2hhc0ZpbHRlcnM/OiBib29sZWFufSkgeworICByZXR1cm4gaGFzRmlsdGVycyA/ICgKKyAgICA8cD5ObyBvcmRlcnMgZm91bmQgbWF0Y2hpbmcgeW91ciBzZWFyY2guIDxMaW5rIHRvPSIvYWNjb3VudC9vcmRlcnMiPkNsZWFyIGZpbHRlcnM8L0xpbms+PC9wPgorICApIDogKAorICAgIDxwPllvdSBoYXZlbid0IHBsYWNlZCBhbnkgb3JkZXJzIHlldC48L3A+CisgICk7Cit9CmBgYAo=" } ], "pr": "https://github.com/Shopify/hydrogen/pull/3125", "id": "3125" }, { "title": "Get order fulfillment status from Customer Account API", "info": "You can now access fulfillmentStatus in your Order fragments for better order status tracking.", "breaking": false, "steps": [ { "title": "Add fulfillmentStatus field to Order fragment", "info": "Include fulfillmentStatus in your Customer Account API order queries.", "code": "YGBgZGlmZgovLyBhcHAvZ3JhcGhxbC9jdXN0b21lci1hY2NvdW50L0N1c3RvbWVyT3JkZXJRdWVyeS50cwpmcmFnbWVudCBPcmRlciBvbiBPcmRlciB7CiAgaWQKICBuYW1lCiAgY29uZmlybWF0aW9uTnVtYmVyCiAgc3RhdHVzUGFnZVVybAorIGZ1bGZpbGxtZW50U3RhdHVzCiAgcHJvY2Vzc2VkQXQKICBmdWxmaWxsbWVudHMoZmlyc3Q6IDEpIHsKICAgIG5vZGVzIHsKICAgICAgc3RhdHVzCiAgICB9CiAgfQp9CmBgYAo=" } ], "pr": "https://github.com/Shopify/hydrogen/pull/3039", "id": "3039-fulfillment" }, { "title": "Use language context in Customer Account API mutations", "info": "Your Customer Account API queries and mutations now support language context through the @inContext directive. This gives you proper localization.", "breaking": false, "steps": [ { "title": "Add @inContext directive to all Customer Account API operations", "info": "Add $language parameter and @inContext directive to your queries and mutations for localized content.", "code": "YGBgZGlmZgovLyBhcHAvZ3JhcGhxbC9jdXN0b21lci1hY2NvdW50LyoudHMgKGFwcGx5IHRvIGFsbCBxdWVyaWVzIGFuZCBtdXRhdGlvbnMpCi8vIEV4YW1wbGU6IEN1c3RvbWVyRGV0YWlsc1F1ZXJ5LnRzCi0gcXVlcnkgQ3VzdG9tZXJEZXRhaWxzIHsKKyBxdWVyeSBDdXN0b21lckRldGFpbHMoJGxhbmd1YWdlOiBMYW5ndWFnZUNvZGUpIEBpbkNvbnRleHQobGFuZ3VhZ2U6ICRsYW5ndWFnZSkgewogICAgY3VzdG9tZXIgewogICAgICAuLi5DdXN0b21lcgogICAgfQogIH0KCi8vIEV4YW1wbGU6IEN1c3RvbWVyQWRkcmVzc011dGF0aW9ucy50cyAgCiAgbXV0YXRpb24gQ3VzdG9tZXJBZGRyZXNzVXBkYXRlKAogICAgJGFkZHJlc3M6IE1haWxpbmdBZGRyZXNzSW5wdXQhCiAgICAkYWRkcmVzc0lkOiBJRCEKICAgICRkZWZhdWx0QWRkcmVzczogQm9vbGVhbgorICAgJGxhbmd1YWdlOiBMYW5ndWFnZUNvZGUKLSApIHsKKyApIEBpbkNvbnRleHQobGFuZ3VhZ2U6ICRsYW5ndWFnZSkgewogICAgY3VzdG9tZXJBZGRyZXNzVXBkYXRlKC4uLikKICB9CgovLyBBcHBseSB0aGlzIHBhdHRlcm4gdG8gYWxsIEN1c3RvbWVyIEFjY291bnQgQVBJIHF1ZXJpZXMgYW5kIG11dGF0aW9uczoKLy8gLSBDdXN0b21lckRldGFpbHNRdWVyeS50cwovLyAtIEN1c3RvbWVyT3JkZXJRdWVyeS50cwovLyAtIEN1c3RvbWVyT3JkZXJzUXVlcnkudHMKLy8gLSBDdXN0b21lclVwZGF0ZU11dGF0aW9uLnRzCi8vIC0gQ3VzdG9tZXJBZGRyZXNzTXV0YXRpb25zLnRzIChhbGwgMyBtdXRhdGlvbnMpCmBgYAo=" } ], "pr": "https://github.com/Shopify/hydrogen/pull/3039", "id": "3039-incontext" }, { "title": "Defer non-critical fields with GraphQL @defer directive", "info": "Your Storefront client now supports the @defer directive. Defer non-critical field loading to improve performance.", "breaking": false, "steps": [ { "title": "Use @defer directive in Storefront API queries", "info": "Wrap non-critical fields with @defer. This improves initial page load performance.", "code": "YGBgZGlmZgovLyBhcHAvcm91dGVzL3lvdXItcm91dGUudHN4IChleGFtcGxlKQoraW1wb3J0IHtMb2FkZXJGdW5jdGlvbkFyZ3MsIHVzZUxvYWRlckRhdGF9IGZyb20gJ3JlYWN0LXJvdXRlcic7CgpleHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZGVyKHtjb250ZXh0fTogTG9hZGVyRnVuY3Rpb25BcmdzKSB7CiAgY29uc3QgZGF0YSA9IGF3YWl0IGNvbnRleHQuc3RvcmVmcm9udC5xdWVyeSgKICAgIGAKICBxdWVyeSBQcm9kdWN0UXVlcnkoJGhhbmRsZTogU3RyaW5nKSB7CiAgICBwcm9kdWN0KGhhbmRsZTogJGhhbmRsZSkgewogICAgICBpZAogICAgICBoYW5kbGUKKyAgICAgLi4uIEBkZWZlcihsYWJlbDogImRlZmVycmVkRmllbGRzIikgeworICAgICAgIHRpdGxlCisgICAgICAgZGVzY3JpcHRpb24KKyAgICAgfQogICAgfQogIH0KYCwKICAgIHsKICAgICAgdmFyaWFibGVzOiB7CiAgICAgICAgaGFuZGxlOiAndjItc25vd2JvYXJkJywKICAgICAgfSwKICAgIH0sCiAgKTsKICByZXR1cm4gZGF0YTsKfQoKLy8gVGhlIEBkZWZlciBkaXJlY3RpdmUgYWxsb3dzIHlvdSB0byBkZWZlciBsb2FkaW5nIG9mIG5vbi1jcml0aWNhbCBmaWVsZHMKLy8gaW1wcm92aW5nIGluaXRpYWwgcGFnZSBsb2FkIHBlcmZvcm1hbmNlCmBgYAo=" } ], "pr": "https://github.com/Shopify/hydrogen/pull/2993", "id": "2993" }, { "title": "Include cdn.shopify.com by default in CSP connectSrc", "info": "Improves Content Security Policy defaults for Shopify CDN resources.", "pr": "https://github.com/Shopify/hydrogen/pull/3172", "id": "3172" }, { "title": "Upgrade Miniflare from v2 to v3", "info": "Internal MiniOxygen API refactored to work with Miniflare v3's new architecture, improving development server performance and compatibility.", "pr": "https://github.com/Shopify/hydrogen/pull/3039", "id": "3039" } ] }, { "title": "[ONLY USE IF YOU ARE CURRENTLY ON 2025.5.0; ELSE SKIP TO >=2025.7.0 UPGRADE] New Shopify cookie system and analytics improvements", "version": "2025.5.1", "date": "2026-01-13", "hash": "37373ce4903c32a215e7f1d22066634c7a909bab", "commit": "https://github.com/Shopify/hydrogen/commit/37373ce4903c32a215e7f1d22066634c7a909bab", "pr": "https://github.com/Shopify/hydrogen/pull/3368", "dependencies": { "@shopify/hydrogen": "2025.5.1" }, "devDependencies": { "@shopify/cli": "^3.83.3" }, "fixes": [ { "title": "Fix Privacy Banner and analytics event issues", "info": "Fixed irregular behaviors between Privacy Banner and Hydrogen's analytics events.", "pr": "https://github.com/Shopify/hydrogen/pull/3350", "id": "3350-privacy" } ], "features": [ { "title": "Migrate to Shopify's new cookie system", "info": "Hydrogen now supports Shopify's new `_shopify_analytics` and `_shopify_marketing` http-only cookies while keeping the deprecated `_shopify_y` and `_shopify_s` cookies working as long as they remain active. This keeps analytics and privacy behavior aligned with Shopify Admin while preserving backward compatibility.", "breaking": false, "steps": [ { "title": "Understand the new cookie model and compatibility story", "info": "Shopify is deprecating `_shopify_y` and `_shopify_s` in favor of `_shopify_analytics` and `_shopify_marketing`, which are http-only cookies set via the Storefront API on your storefront domain. Hydrogen now reads and writes these cookies through a Storefront API proxy while still honoring the legacy cookies when present. You don't need to migrate values manually, but you must ensure that requests flow through the proxy so cookies are set before analytics run." }, { "title": "Set up a Storefront API proxy for your deployment", "info": "Depending on how you host your app, you must ensure Storefront API calls go through a proxy on your storefront domain.", "code": "IyMjIFJlYWN0IFJvdXRlciArIEh5ZHJvZ2VuIG9uIE94eWdlbgoKSWYgeW91IHNjYWZmb2xkZWQgZnJvbSB0aGUgZGVmYXVsdCBIeWRyb2dlbiBza2VsZXRvbiBhbmQgZGVwbG95IHRvIE94eWdlbiwgdGhlIGBjcmVhdGVSZXF1ZXN0SGFuZGxlcmAgdXRpbGl0eSBmcm9tIGBAc2hvcGlmeS9oeWRyb2dlbi9veHlnZW5gIChub3cgYWxzbyBleHBvcnRlZCBmcm9tIGBAc2hvcGlmeS9oeWRyb2dlbmApIGFscmVhZHkgc2V0cyB1cCBhIFN0b3JlZnJvbnQgQVBJIHByb3h5IG9uIHRoZSBzYW1lIGRvbWFpbiBhcyB5b3VyIHN0b3JlZnJvbnQuCgoqKkluIG1vc3QgY2FzZXMsIG5vIGNoYW5nZXMgYXJlIHJlcXVpcmVkKio7IGp1c3QgY29uZmlybSB5b3VyIHNlcnZlciBlbnRyeSBzdGlsbCB1c2VzIGl0OgoKYGBgdHMKLy8gc2VydmVyLnRzIChPeHlnZW4pCmltcG9ydCB7Y3JlYXRlUmVxdWVzdEhhbmRsZXIsIGNyZWF0ZUh5ZHJvZ2VuQ29udGV4dH0gZnJvbSAnQHNob3BpZnkvaHlkcm9nZW4nOwoKZXhwb3J0IGRlZmF1bHQgewogIGFzeW5jIGZldGNoKHJlcXVlc3QsIGVudikgewogICAgY29uc3QgaHlkcm9nZW5Db250ZXh0ID0gY3JlYXRlSHlkcm9nZW5Db250ZXh0KHsKICAgICAgZW52LAogICAgICByZXF1ZXN0LAogICAgICAvKiAuLi4gKi8KICAgIH0pOwoKICAgIGNvbnN0IGhhbmRsZVJlcXVlc3QgPSBjcmVhdGVSZXF1ZXN0SGFuZGxlcih7CiAgICAgIC8qIC4uLiAqLwogICAgICBnZXRMb2FkQ29udGV4dDogKCkgPT4gaHlkcm9nZW5Db250ZXh0LAogICAgICAvLyBBbHRlcm5hdGl2ZWx5LCBwYXNzIGF0IGxlYXN0IHN0b3JlZnJvbnQgY2xpZW50OgogICAgICAvLyBnZXRMb2FkQ29udGV4dDogKCkgPT4gKHtzdG9yZWZyb250OiBjcmVhdGVTdG9yZWZyb250Q2xpZW50KC4uLil9KQogICAgfSk7CgogICAgcmV0dXJuIGhhbmRsZVJlcXVlc3QocmVxdWVzdCk7CiAgfSwKfTsKYGBgCgpLZWVwIHVzaW5nIGA8QW5hbHl0aWNzLlByb3ZpZGVyPmAgY29tcG9uZW50IG9yIGB1c2VDdXN0b21lclByaXZhY3lgIGhvb2sgdG8gZ2V0IGNvb2tpZXMgaW4gdGhlIGJyb3dzZXIgYXV0b21hdGljYWxseS4KCkZvciBhIGZ1bGwgZXhhbXBsZSwgcmVmZXIgdG8gb3VyIFtza2VsZXRvbiB0ZW1wbGF0ZV0oaHR0cHM6Ly9naXRodWIuY29tL1Nob3BpZnkvaHlkcm9nZW4vYmxvYi9tYWluL3RlbXBsYXRlcy9za2VsZXRvbi9zZXJ2ZXIudHMpLgoKIyMjIFJlYWN0IFJvdXRlciArIEh5ZHJvZ2VuIG9uIG90aGVyIGhvc3RzCgojIyMjIEhvc3RzIHRoYXQgc3VwcG9ydCBXZWIgRmV0Y2ggQVBJIChSZXF1ZXN0L1Jlc3BvbnNlKQoKT24gaG9zdHMgdGhhdCBzdXBwb3J0IHRoZSBzdGFuZGFyZCBXZWIgRmV0Y2ggQVBJIChXb3JrZXJzLXN0eWxlIGVudmlyb25tZW50cyksIGltcG9ydCBgY3JlYXRlUmVxdWVzdEhhbmRsZXJgIGZyb20gYEBzaG9waWZ5L2h5ZHJvZ2VuYCAoaW5zdGVhZCBvZiBgcmVhY3Qtcm91dGVyYCkgYW5kIHJvdXRlIHJlcXVlc3RzIHRocm91Z2ggaXQ6CgpgYGB0cwppbXBvcnQge2NyZWF0ZVJlcXVlc3RIYW5kbGVyLCBjcmVhdGVIeWRyb2dlbkNvbnRleHR9IGZyb20gJ0BzaG9waWZ5L2h5ZHJvZ2VuJzsKCmNvbnN0IGh5ZHJvZ2VuQ29udGV4dCA9IGNyZWF0ZUh5ZHJvZ2VuQ29udGV4dCh7CiAgLyogLi4uICovCn0pOwoKY29uc3QgaGFuZGxlUmVxdWVzdCA9IGNyZWF0ZVJlcXVlc3RIYW5kbGVyKHsKICAvKiAuLi4gKi8KICBnZXRMb2FkQ29udGV4dDogKCkgPT4gaHlkcm9nZW5Db250ZXh0LAp9KTsKYGBgCgojIyMjIE5vZGUuanMgYW5kIG90aGVyIGhvc3RzCgpGb3IgTm9kZS1saWtlIGVudmlyb25tZW50cywgYWRhcHQgTm9kZSByZXF1ZXN0cyB0byBGZXRjaCB3aXRoIFtgQHJlbWl4LXJ1bi9ub2RlLWZldGNoLXNlcnZlcmBdKGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL0ByZW1peC1ydW4vbm9kZS1mZXRjaC1zZXJ2ZXIpLCB0aGVuIGRlbGVnYXRlIHRvIEh5ZHJvZ2VuJ3MgaGFuZGxlcjoKCmBgYHRzCmltcG9ydCB7Y3JlYXRlUmVxdWVzdEhhbmRsZXIsIGNyZWF0ZUh5ZHJvZ2VuQ29udGV4dH0gZnJvbSAnQHNob3BpZnkvaHlkcm9nZW4nOwppbXBvcnQge2NyZWF0ZVJlcXVlc3RMaXN0ZW5lcn0gZnJvbSAnQHJlbWl4LXJ1bi9ub2RlLWZldGNoLXNlcnZlcic7CmltcG9ydCBodHRwIGZyb20gJ2h0dHAnOwoKY29uc3QgaGFuZGxlTm9kZVJlcXVlc3QgPSBjcmVhdGVSZXF1ZXN0TGlzdGVuZXIoKHJlcXVlc3QpID0+IHsKICBjb25zdCBoeWRyb2dlbkNvbnRleHQgPSBjcmVhdGVIeWRyb2dlbkNvbnRleHQoewogICAgLyogLi4uICovCiAgfSk7CgogIGNvbnN0IGhhbmRsZVdlYlJlcXVlc3QgPSBjcmVhdGVSZXF1ZXN0SGFuZGxlcih7CiAgICAvKiAuLi4gKi8KICAgIGdldExvYWRDb250ZXh0OiAoKSA9PiBoeWRyb2dlbkNvbnRleHQsCiAgfSk7CgogIHJldHVybiBoYW5kbGVXZWJSZXF1ZXN0KHJlcXVlc3QpOwp9KTsKCmh0dHAuY3JlYXRlU2VydmVyKGhhbmRsZU5vZGVSZXF1ZXN0KTsKYGBgCgpBbHRlcm5hdGl2ZWx5LCBpZiB5b3UgY2FuJ3QgZGVsZWdhdGUgdG8gSHlkcm9nZW4ncyBgY3JlYXRlUmVxdWVzdEhhbmRsZXJgLCB5b3UgY2FuIHByb3ZpZGUgYSBjdXN0b20gU3RvcmVmcm9udCBBUEkgcHJveHkgaW4geW91ciBzZXJ2ZXIuIFNlZSBbSHlkcm9nZW4ncyBpbXBsZW1lbnRhdGlvbl0oaHR0cHM6Ly9naXRodWIuY29tL1Nob3BpZnkvaHlkcm9nZW4vYmxvYi8yNzA2NmEyODU3NzQ4NGY0MDYyMjIxMTZhOTU5ZWI0NjNkMjU1Njg1L3BhY2thZ2VzL2h5ZHJvZ2VuL3NyYy9zdG9yZWZyb250LnRzI0w1NDYtTDYxMSkgYXMgYSByZWZlcmVuY2UuIEluIHRoaXMgY2FzZSwgZW5zdXJlIHlvdSBtYW51YWxseSBwYXNzIGBzYW1lRG9tYWluRm9yU3RvcmVmcm9udEFwaTogdHJ1ZWAgaW4gdGhlIGBjb25zZW50YCBvYmplY3QgZm9yIGA8QW5hbHl0aWNzLlByb3ZpZGVyPmAgb3IgYXMgYSBwcm9wIHRvIHRoZSBgdXNlQ3VzdG9tZXJQcml2YWN5YCBob29rLgo=" } ], "pr": "https://github.com/Shopify/hydrogen/pull/3350", "id": "3350" } ] }, { "title": "New Shopify cookie system and analytics improvements", "version": "2025.4.2", "date": "2026-01-14", "hash": "6a8d5ff69b87a66c1ddb771d733ce7a4a0460001", "commit": "https://github.com/Shopify/hydrogen/commit/6a8d5ff69b87a66c1ddb771d733ce7a4a0460001", "pr": "https://github.com/Shopify/hydrogen/pull/3343", "dependencies": { "@shopify/hydrogen": "2025.4.2" }, "devDependencies": { "@shopify/cli": "^3.83.3" }, "fixes": [ { "title": "Fix Privacy Banner and analytics event issues", "info": "Fixed irregular behaviors between Privacy Banner and Hydrogen's analytics events.", "pr": "https://github.com/Shopify/hydrogen/pull/3332", "id": "3332-privacy" } ], "features": [ { "title": "Migrate to Shopify's new cookie system", "info": "Hydrogen now supports Shopify's new `_shopify_analytics` and `_shopify_marketing` http-only cookies while keeping the deprecated `_shopify_y` and `_shopify_s` cookies working as long as they remain active. This keeps analytics and privacy behavior aligned with Shopify Admin while preserving backward compatibility.", "breaking": false, "steps": [ { "title": "Understand the new cookie model and compatibility story", "info": "Shopify is deprecating `_shopify_y` and `_shopify_s` in favor of `_shopify_analytics` and `_shopify_marketing`, which are http-only cookies set via the Storefront API on your storefront domain. Hydrogen now reads and writes these cookies through a Storefront API proxy while still honoring the legacy cookies when present. You don't need to migrate values manually, but you must ensure that requests flow through the proxy so cookies are set before analytics run." }, { "title": "Set up a Storefront API proxy for your deployment", "info": "Depending on how you host your app, you must ensure Storefront API calls go through a proxy on your storefront domain.", "code": "IyMjIFJlbWl4ICsgSHlkcm9nZW4gb24gT3h5Z2VuCgpJZiB5b3Ugc2NhZmZvbGRlZCBmcm9tIHRoZSBkZWZhdWx0IEh5ZHJvZ2VuIHNrZWxldG9uIGFuZCBkZXBsb3kgdG8gT3h5Z2VuLCB0aGUgYGNyZWF0ZVJlcXVlc3RIYW5kbGVyYCB1dGlsaXR5IGZyb20gYEBzaG9waWZ5L3JlbWl4LW94eWdlbmAgYWxyZWFkeSBzZXRzIHVwIGEgU3RvcmVmcm9udCBBUEkgcHJveHkgb24gdGhlIHNhbWUgZG9tYWluIGFzIHlvdXIgc3RvcmVmcm9udC4KCioqSW4gbW9zdCBjYXNlcywgbm8gY2hhbmdlcyBhcmUgcmVxdWlyZWQqKjsganVzdCBjb25maXJtIHlvdXIgc2VydmVyIGVudHJ5IHN0aWxsIHVzZXMgaXQ6CgpgYGB0cwovLyBzZXJ2ZXIudHMgKE94eWdlbikKaW1wb3J0IHtjcmVhdGVSZXF1ZXN0SGFuZGxlcn0gZnJvbSAnQHNob3BpZnkvcmVtaXgtb3h5Z2VuJzsKaW1wb3J0IHtjcmVhdGVIeWRyb2dlbkNvbnRleHR9IGZyb20gJ0BzaG9waWZ5L2h5ZHJvZ2VuJzsKCmV4cG9ydCBkZWZhdWx0IHsKICBhc3luYyBmZXRjaChyZXF1ZXN0LCBlbnYpIHsKICAgIGNvbnN0IGh5ZHJvZ2VuQ29udGV4dCA9IGNyZWF0ZUh5ZHJvZ2VuQ29udGV4dCh7CiAgICAgIGVudiwKICAgICAgcmVxdWVzdCwKICAgICAgLyogLi4uICovCiAgICB9KTsKCiAgICBjb25zdCBoYW5kbGVSZXF1ZXN0ID0gY3JlYXRlUmVxdWVzdEhhbmRsZXIoewogICAgICAvKiAuLi4gKi8KICAgICAgZ2V0TG9hZENvbnRleHQ6ICgpID0+IGh5ZHJvZ2VuQ29udGV4dCwKICAgIH0pOwoKICAgIHJldHVybiBoYW5kbGVSZXF1ZXN0KHJlcXVlc3QpOwogIH0sCn07CmBgYAoKS2VlcCB1c2luZyBgPEFuYWx5dGljcy5Qcm92aWRlcj5gIGNvbXBvbmVudCBvciBgdXNlQ3VzdG9tZXJQcml2YWN5YCBob29rIHRvIGdldCBjb29raWVzIGluIHRoZSBicm93c2VyIGF1dG9tYXRpY2FsbHkuCgpGb3IgYSBmdWxsIGV4YW1wbGUsIHJlZmVyIHRvIHlvdXIgc2tlbGV0b24gdGVtcGxhdGUncyBzZXJ2ZXIudHMuCgojIyMgUmVtaXggKyBIeWRyb2dlbiBvbiBvdGhlciBob3N0cwoKIyMjIyBIb3N0cyB0aGF0IHN1cHBvcnQgV2ViIEZldGNoIEFQSSAoUmVxdWVzdC9SZXNwb25zZSkKCk9uIGhvc3RzIHRoYXQgc3VwcG9ydCB0aGUgc3RhbmRhcmQgV2ViIEZldGNoIEFQSSAoV29ya2Vycy1zdHlsZSBlbnZpcm9ubWVudHMpLCBpbXBvcnQgYGNyZWF0ZVJlcXVlc3RIYW5kbGVyYCBmcm9tIGBAc2hvcGlmeS9oeWRyb2dlbmAgYW5kIHJvdXRlIHJlcXVlc3RzIHRocm91Z2ggaXQ6CgpgYGB0cwppbXBvcnQge2NyZWF0ZVJlcXVlc3RIYW5kbGVyLCBjcmVhdGVIeWRyb2dlbkNvbnRleHR9IGZyb20gJ0BzaG9waWZ5L2h5ZHJvZ2VuJzsKCmNvbnN0IGh5ZHJvZ2VuQ29udGV4dCA9IGNyZWF0ZUh5ZHJvZ2VuQ29udGV4dCh7CiAgLyogLi4uICovCn0pOwoKY29uc3QgaGFuZGxlUmVxdWVzdCA9IGNyZWF0ZVJlcXVlc3RIYW5kbGVyKHsKICAvKiAuLi4gKi8KICBnZXRMb2FkQ29udGV4dDogKCkgPT4gaHlkcm9nZW5Db250ZXh0LAp9KTsKYGBgCgojIyMjIE5vZGUuanMgYW5kIG90aGVyIGhvc3RzCgpGb3IgTm9kZS1saWtlIGVudmlyb25tZW50cywgYWRhcHQgTm9kZSByZXF1ZXN0cyB0byBGZXRjaCB3aXRoIFtgQHJlbWl4LXJ1bi9ub2RlLWZldGNoLXNlcnZlcmBdKGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL0ByZW1peC1ydW4vbm9kZS1mZXRjaC1zZXJ2ZXIpLCB0aGVuIGRlbGVnYXRlIHRvIEh5ZHJvZ2VuJ3MgaGFuZGxlcjoKCmBgYHRzCmltcG9ydCB7Y3JlYXRlUmVxdWVzdEhhbmRsZXIsIGNyZWF0ZUh5ZHJvZ2VuQ29udGV4dH0gZnJvbSAnQHNob3BpZnkvaHlkcm9nZW4nOwppbXBvcnQge2NyZWF0ZVJlcXVlc3RMaXN0ZW5lcn0gZnJvbSAnQHJlbWl4LXJ1bi9ub2RlLWZldGNoLXNlcnZlcic7CmltcG9ydCBodHRwIGZyb20gJ2h0dHAnOwoKY29uc3QgaGFuZGxlTm9kZVJlcXVlc3QgPSBjcmVhdGVSZXF1ZXN0TGlzdGVuZXIoKHJlcXVlc3QpID0+IHsKICBjb25zdCBoeWRyb2dlbkNvbnRleHQgPSBjcmVhdGVIeWRyb2dlbkNvbnRleHQoewogICAgLyogLi4uICovCiAgfSk7CgogIGNvbnN0IGhhbmRsZVdlYlJlcXVlc3QgPSBjcmVhdGVSZXF1ZXN0SGFuZGxlcih7CiAgICAvKiAuLi4gKi8KICAgIGdldExvYWRDb250ZXh0OiAoKSA9PiBoeWRyb2dlbkNvbnRleHQsCiAgfSk7CgogIHJldHVybiBoYW5kbGVXZWJSZXF1ZXN0KHJlcXVlc3QpOwp9KTsKCmh0dHAuY3JlYXRlU2VydmVyKGhhbmRsZU5vZGVSZXF1ZXN0KTsKYGBgCgpBbHRlcm5hdGl2ZWx5LCBpZiB5b3UgY2FuJ3QgZGVsZWdhdGUgdG8gSHlkcm9nZW4ncyBgY3JlYXRlUmVxdWVzdEhhbmRsZXJgLCB5b3UgY2FuIHByb3ZpZGUgYSBjdXN0b20gU3RvcmVmcm9udCBBUEkgcHJveHkgaW4geW91ciBzZXJ2ZXIuIFNlZSBbSHlkcm9nZW4ncyBpbXBsZW1lbnRhdGlvbl0oaHR0cHM6Ly9naXRodWIuY29tL1Nob3BpZnkvaHlkcm9nZW4vYmxvYi8yNzA2NmEyODU3NzQ4NGY0MDYyMjIxMTZhOTU5ZWI0NjNkMjU1Njg1L3BhY2thZ2VzL2h5ZHJvZ2VuL3NyYy9zdG9yZWZyb250LnRzI0w1NDYtTDYxMSkgYXMgYSByZWZlcmVuY2UuIEluIHRoaXMgY2FzZSwgZW5zdXJlIHlvdSBtYW51YWxseSBwYXNzIGBzYW1lRG9tYWluRm9yU3RvcmVmcm9udEFwaTogdHJ1ZWAgaW4gdGhlIGBjb25zZW50YCBvYmplY3QgZm9yIGA8QW5hbHl0aWNzLlByb3ZpZGVyPmAgb3IgYXMgYSBwcm9wIHRvIHRoZSBgdXNlQ3VzdG9tZXJQcml2YWN5YCBob29rLgo=" } ], "pr": "https://github.com/Shopify/hydrogen/pull/3332", "id": "3332" } ] }, { "title": "[COMPLETE BEFORE ATTEMPTING 2025.7.0 UPGRADE] Bump Shopify CLI version", "version": "2025.4.1", "hash": "e4f44954a5dc53e6dfccd1b7e96de593bbb0887a", "commit": "https://github.com/Shopify/hydrogen/commit/e4f44954a5dc53e6dfccd1b7e96de593bbb0887a", "dependencies": { "@shopify/hydrogen": "2025.4.1" }, "devDependencies": { "@shopify/cli": "~3.83.3", "vite": "^6.2.7" }, "dependenciesMeta": { "@shopify/cli": { "required": true }, "@remix-run/react": { "required": true }, "@remix-run/server-runtime": { "required": true }, "@remix-run/dev": { "required": true }, "@shopify/mini-oxygen": { "required": true }, "@shopify/remix-oxygen": { "required": true }, "@remix-run/fs-routes": { "required": true }, "@remix-run/route-config": { "required": true } }, "fixes": [ { "title": "Improve upgrade command to handle removal of dependencies", "desc": "Enhanced the CLI upgrade command to properly handle the removal of dependencies during upgrades. This improvement is essential for the next Hydrogen upgrade (from Remix to React Router 7) where certain dependencies need to be removed as part of the upgrade process.", "pr": "https://github.com/Shopify/hydrogen/pull/3023", "id": "3023" } ], "features": [] }, { "title": "New tokenless Storefront API route, add buyerIdentity to create handlers", "version": "2025.4.1", "hash": "fc2ad21f92c0125b29b0f51dc1c52353f42228dd", "commit": "https://github.com/Shopify/hydrogen/pull/2950/commits/fc2ad21f92c0125b29b0f51dc1c52353f42228dd", "dependencies": { "@remix-run/react": "^2.16.1", "@remix-run/server-runtime": "^2.16.1", "@shopify/hydrogen": "2025.4.1", "@shopify/remix-oxygen": "^2.0.12" }, "devDependencies": { "@remix-run/dev": "^2.16.1", "@shopify/cli": "~3.79.2", "@remix-run/route-config": "^2.16.1", "@remix-run/fs-routes": "^2.16.1", "@shopify/mini-oxygen": "^3.2.1", "@shopify/hydrogen-codegen": "^0.3.3", "@shopify/oxygen-workers-types": "^4.1.6", "vite": "^6.2.4" }, "dependenciesMeta": { "@shopify/cli": { "required": true }, "@remix-run/react": { "required": true }, "@remix-run/server-runtime": { "required": true }, "@remix-run/dev": { "required": true }, "@shopify/mini-oxygen": { "required": true }, "@shopify/remix-oxygen": { "required": true }, "@remix-run/fs-routes": { "required": true }, "@remix-run/route-config": { "required": true } }, "fixes": [ { "title": "Add a `buyerIdentity` parameter to `createHydrogenContext` and `createCartHandler`.", "desc": "This buyer identity will be used as the default buyer identity for all new cart creations. This allows you to create carts without needing a token, which is useful for anonymous users or when you want to create a cart without authentication.", "code": "YGBgZGlmZgogIGNvbnN0IGh5ZHJvZ2VuQ29udGV4dCA9IGNyZWF0ZUh5ZHJvZ2VuQ29udGV4dCh7CiAgICAvLyAuLi4KKyAgICBidXllcklkZW50aXR5OiB7CisgICAgIGNvbXBhbnlMb2NhdGlvbklkOiAnLi4uJywKKyAgICB9LAogIH0pOwpgYGA=", "pr": "https://github.com/Shopify/hydrogen/pull/2927", "id": "2927" }, { "title": "Bump skeleton @shopify/cli and @shopify/mini-oxygen versions", "pr": "https://github.com/Shopify/hydrogen/pull/2883", "id": "2883" } ], "features": [ { "title": "Add a new tokenless Storefront API route to the starter template", "pr": "https://github.com/Shopify/hydrogen/pull/2948", "id": "2948" } ] }, { "title": "Update Storefront and Customer Account API to 2025.4, new recipes and fixes", "version": "2025.4.0", "hash": "7eec679161a925538c7f905a090d756cb9ffbd7f", "commit": "https://github.com/Shopify/hydrogen/pull/2898/commits/7eec679161a925538c7f905a090d756cb9ffbd7f", "dependencies": { "@remix-run/react": "^2.16.1", "@remix-run/server-runtime": "^2.16.1", "@shopify/hydrogen": "2025.4.0", "@shopify/remix-oxygen": "^2.0.12" }, "devDependencies": { "@remix-run/dev": "^2.16.1", "@shopify/cli": "~3.79.2", "@remix-run/route-config": "^2.16.1", "@remix-run/fs-routes": "^2.16.1", "@shopify/mini-oxygen": "^3.2.1", "@shopify/hydrogen-codegen": "^0.3.3", "@shopify/oxygen-workers-types": "^4.1.6", "vite": "^6.2.4" }, "dependenciesMeta": { "@shopify/cli": { "required": true }, "@remix-run/react": { "required": true }, "@remix-run/server-runtime": { "required": true }, "@remix-run/dev": { "required": true }, "@shopify/mini-oxygen": { "required": true }, "@shopify/remix-oxygen": { "required": true }, "@remix-run/fs-routes": { "required": true }, "@remix-run/route-config": { "required": true } }, "fixes": [ { "title": "Moved the Cursor rules into more generic LLM prompt files.", "desc": "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", "pr": "https://github.com/Shopify/hydrogen/pull/2936", "id": "2936" }, { "title": "Bump skeleton @shopify/cli and @shopify/mini-oxygen versions", "pr": "https://github.com/Shopify/hydrogen/pull/2883", "id": "2883" } ], "features": [ { "title": "Added bundles recipe", "pr": "https://github.com/Shopify/hydrogen/pull/2915", "id": "2915", "desc": "CartForm and createCartHandler now support `addDeliveryAddresses`, `updateDeliveryAddresses` and `removeDeliveryAddresses`" }, { "title": "Add markets recipe", "pr": "https://github.com/Shopify/hydrogen/pull/2930", "id": "2930" }, { "title": "Add combined-listings recipe", "pr": "https://github.com/Shopify/hydrogen/pull/2876", "id": "2876" }, { "title": "Update SFAPI and CAAPI versions to 2025.04", "pr": "https://github.com/Shopify/hydrogen/pull/2886", "id": "2886" } ] }, { "title": "New Shopify cookie system and analytics improvements", "version": "2025.1.5", "date": "2026-01-14", "hash": "dba02cc0f67cef4f2495b6bb042f7a76e4149d4b", "commit": "https://github.com/Shopify/hydrogen/commit/dba02cc0f67cef4f2495b6bb042f7a76e4149d4b", "pr": "https://github.com/Shopify/hydrogen/pull/3369", "dependencies": { "@shopify/hydrogen": "2025.1.5" }, "devDependencies": {}, "fixes": [ { "title": "Fix Privacy Banner and analytics event issues", "info": "Fixed irregular behaviors between Privacy Banner and Hydrogen's analytics events.", "pr": "https://github.com/Shopify/hydrogen/pull/3354", "id": "3354-privacy" } ], "features": [ { "title": "Migrate to Shopify's new cookie system", "info": "Hydrogen now supports Shopify's new `_shopify_analytics` and `_shopify_marketing` http-only cookies while keeping the deprecated `_shopify_y` and `_shopify_s` cookies working as long as they remain active. This keeps analytics and privacy behavior aligned with Shopify Admin while preserving backward compatibility.", "breaking": false, "steps": [ { "title": "Understand the new cookie model and compatibility story", "info": "Shopify is deprecating `_shopify_y` and `_shopify_s` in favor of `_shopify_analytics` and `_shopify_marketing`, which are http-only cookies set via the Storefront API on your storefront domain. Hydrogen now reads and writes these cookies through a Storefront API proxy while still honoring the legacy cookies when present. You don't need to migrate values manually, but you must ensure that requests flow through the proxy so cookies are set before analytics run." }, { "title": "Set up a Storefront API proxy for your deployment", "info": "Depending on how you host your app, you must ensure Storefront API calls go through a proxy on your storefront domain.", "code": "IyMjIFJlbWl4ICsgSHlkcm9nZW4gb24gT3h5Z2VuCgpJZiB5b3Ugc2NhZmZvbGRlZCBmcm9tIHRoZSBkZWZhdWx0IEh5ZHJvZ2VuIHNrZWxldG9uIGFuZCBkZXBsb3kgdG8gT3h5Z2VuLCB0aGUgYGNyZWF0ZVJlcXVlc3RIYW5kbGVyYCB1dGlsaXR5IGZyb20gYEBzaG9waWZ5L3JlbWl4LW94eWdlbmAgYWxyZWFkeSBzZXRzIHVwIGEgU3RvcmVmcm9udCBBUEkgcHJveHkgb24gdGhlIHNhbWUgZG9tYWluIGFzIHlvdXIgc3RvcmVmcm9udC4KCioqSW4gbW9zdCBjYXNlcywgbm8gY2hhbmdlcyBhcmUgcmVxdWlyZWQqKjsganVzdCBjb25maXJtIHlvdXIgc2VydmVyIGVudHJ5IHN0aWxsIHVzZXMgaXQ6CgpgYGB0cwovLyBzZXJ2ZXIudHMgKE94eWdlbikKaW1wb3J0IHtjcmVhdGVSZXF1ZXN0SGFuZGxlcn0gZnJvbSAnQHNob3BpZnkvcmVtaXgtb3h5Z2VuJzsKaW1wb3J0IHtjcmVhdGVIeWRyb2dlbkNvbnRleHR9IGZyb20gJ0BzaG9waWZ5L2h5ZHJvZ2VuJzsKCmV4cG9ydCBkZWZhdWx0IHsKICBhc3luYyBmZXRjaChyZXF1ZXN0LCBlbnYpIHsKICAgIGNvbnN0IGh5ZHJvZ2VuQ29udGV4dCA9IGNyZWF0ZUh5ZHJvZ2VuQ29udGV4dCh7CiAgICAgIGVudiwKICAgICAgcmVxdWVzdCwKICAgICAgLyogLi4uICovCiAgICB9KTsKCiAgICBjb25zdCBoYW5kbGVSZXF1ZXN0ID0gY3JlYXRlUmVxdWVzdEhhbmRsZXIoewogICAgICAvKiAuLi4gKi8KICAgICAgZ2V0TG9hZENvbnRleHQ6ICgpID0+IGh5ZHJvZ2VuQ29udGV4dCwKICAgIH0pOwoKICAgIHJldHVybiBoYW5kbGVSZXF1ZXN0KHJlcXVlc3QpOwogIH0sCn07CmBgYAoKS2VlcCB1c2luZyBgPEFuYWx5dGljcy5Qcm92aWRlcj5gIGNvbXBvbmVudCBvciBgdXNlQ3VzdG9tZXJQcml2YWN5YCBob29rIHRvIGdldCBjb29raWVzIGluIHRoZSBicm93c2VyIGF1dG9tYXRpY2FsbHkuCgpGb3IgYSBmdWxsIGV4YW1wbGUsIHJlZmVyIHRvIHlvdXIgc2tlbGV0b24gdGVtcGxhdGUncyBzZXJ2ZXIudHMuCgojIyMgUmVtaXggKyBIeWRyb2dlbiBvbiBvdGhlciBob3N0cwoKIyMjIyBIb3N0cyB0aGF0IHN1cHBvcnQgV2ViIEZldGNoIEFQSSAoUmVxdWVzdC9SZXNwb25zZSkKCk9uIGhvc3RzIHRoYXQgc3VwcG9ydCB0aGUgc3RhbmRhcmQgV2ViIEZldGNoIEFQSSAoV29ya2Vycy1zdHlsZSBlbnZpcm9ubWVudHMpLCBpbXBvcnQgYGNyZWF0ZVJlcXVlc3RIYW5kbGVyYCBmcm9tIGBAc2hvcGlmeS9oeWRyb2dlbmAgYW5kIHJvdXRlIHJlcXVlc3RzIHRocm91Z2ggaXQ6CgpgYGB0cwppbXBvcnQge2NyZWF0ZVJlcXVlc3RIYW5kbGVyLCBjcmVhdGVIeWRyb2dlbkNvbnRleHR9IGZyb20gJ0BzaG9waWZ5L2h5ZHJvZ2VuJzsKCmNvbnN0IGh5ZHJvZ2VuQ29udGV4dCA9IGNyZWF0ZUh5ZHJvZ2VuQ29udGV4dCh7CiAgLyogLi4uICovCn0pOwoKY29uc3QgaGFuZGxlUmVxdWVzdCA9IGNyZWF0ZVJlcXVlc3RIYW5kbGVyKHsKICAvKiAuLi4gKi8KICBnZXRMb2FkQ29udGV4dDogKCkgPT4gaHlkcm9nZW5Db250ZXh0LAp9KTsKYGBgCgojIyMjIE5vZGUuanMgYW5kIG90aGVyIGhvc3RzCgpGb3IgTm9kZS1saWtlIGVudmlyb25tZW50cywgYWRhcHQgTm9kZSByZXF1ZXN0cyB0byBGZXRjaCB3aXRoIFtgQHJlbWl4LXJ1bi9ub2RlLWZldGNoLXNlcnZlcmBdKGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL0ByZW1peC1ydW4vbm9kZS1mZXRjaC1zZXJ2ZXIpLCB0aGVuIGRlbGVnYXRlIHRvIEh5ZHJvZ2VuJ3MgaGFuZGxlcjoKCmBgYHRzCmltcG9ydCB7Y3JlYXRlUmVxdWVzdEhhbmRsZXIsIGNyZWF0ZUh5ZHJvZ2VuQ29udGV4dH0gZnJvbSAnQHNob3BpZnkvaHlkcm9nZW4nOwppbXBvcnQge2NyZWF0ZVJlcXVlc3RMaXN0ZW5lcn0gZnJvbSAnQHJlbWl4LXJ1bi9ub2RlLWZldGNoLXNlcnZlcic7CmltcG9ydCBodHRwIGZyb20gJ2h0dHAnOwoKY29uc3QgaGFuZGxlTm9kZVJlcXVlc3QgPSBjcmVhdGVSZXF1ZXN0TGlzdGVuZXIoKHJlcXVlc3QpID0+IHsKICBjb25zdCBoeWRyb2dlbkNvbnRleHQgPSBjcmVhdGVIeWRyb2dlbkNvbnRleHQoewogICAgLyogLi4uICovCiAgfSk7CgogIGNvbnN0IGhhbmRsZVdlYlJlcXVlc3QgPSBjcmVhdGVSZXF1ZXN0SGFuZGxlcih7CiAgICAvKiAuLi4gKi8KICAgIGdldExvYWRDb250ZXh0OiAoKSA9PiBoeWRyb2dlbkNvbnRleHQsCiAgfSk7CgogIHJldHVybiBoYW5kbGVXZWJSZXF1ZXN0KHJlcXVlc3QpOwp9KTsKCmh0dHAuY3JlYXRlU2VydmVyKGhhbmRsZU5vZGVSZXF1ZXN0KTsKYGBgCgpBbHRlcm5hdGl2ZWx5LCBpZiB5b3UgY2FuJ3QgZGVsZWdhdGUgdG8gSHlkcm9nZW4ncyBgY3JlYXRlUmVxdWVzdEhhbmRsZXJgLCB5b3UgY2FuIHByb3ZpZGUgYSBjdXN0b20gU3RvcmVmcm9udCBBUEkgcHJveHkgaW4geW91ciBzZXJ2ZXIuIFNlZSBbSHlkcm9nZW4ncyBpbXBsZW1lbnRhdGlvbl0oaHR0cHM6Ly9naXRodWIuY29tL1Nob3BpZnkvaHlkcm9nZW4vYmxvYi8yNzA2NmEyODU3NzQ4NGY0MDYyMjIxMTZhOTU5ZWI0NjNkMjU1Njg1L3BhY2thZ2VzL2h5ZHJvZ2VuL3NyYy9zdG9yZWZyb250LnRzI0w1NDYtTDYxMSkgYXMgYSByZWZlcmVuY2UuIEluIHRoaXMgY2FzZSwgZW5zdXJlIHlvdSBtYW51YWxseSBwYXNzIGBzYW1lRG9tYWluRm9yU3RvcmVmcm9udEFwaTogdHJ1ZWAgaW4gdGhlIGBjb25zZW50YCBvYmplY3QgZm9yIGA8QW5hbHl0aWNzLlByb3ZpZGVyPmAgb3IgYXMgYSBwcm9wIHRvIHRoZSBgdXNlQ3VzdG9tZXJQcml2YWN5YCBob29rLgo=" } ], "pr": "https://github.com/Shopify/hydrogen/pull/3354", "id": "3354" } ] }, { "title": "Cart delivery adddress support, fixes in Vite 6 SSR conditions, Skeleton & Customer Accounts session", "version": "2025.1.4", "hash": "3be68ae72730e6780aa04fcd02ba586816b7f613", "commit": "https://github.com/Shopify/hydrogen/pull/2842/commits/3be68ae72730e6780aa04fcd02ba586816b7f613", "dependencies": { "@remix-run/react": "^2.16.1", "@remix-run/server-runtime": "^2.16.1", "@shopify/hydrogen": "2025.1.4", "@shopify/remix-oxygen": "^2.0.12" }, "devDependencies": { "@remix-run/dev": "^2.16.1", "@shopify/cli": "~3.79.0", "@remix-run/route-config": "^2.16.1", "@remix-run/fs-routes": "^2.16.1", "@shopify/mini-oxygen": "^3.2.1", "@shopify/hydrogen-codegen": "^0.3.3", "@shopify/oxygen-workers-types": "^4.1.6", "vite": "^6.2.4" }, "dependenciesMeta": { "@shopify/cli": { "required": true }, "@remix-run/react": { "required": true }, "@remix-run/server-runtime": { "required": true }, "@remix-run/dev": { "required": true }, "@shopify/mini-oxygen": { "required": true }, "@shopify/remix-oxygen": { "required": true }, "@remix-run/fs-routes": { "required": true }, "@remix-run/route-config": { "required": true } }, "fixes": [ { "title": "Fix Vite 6 SSR resolve conditions", "desc": "Fixes the SSR condition in mini-oxygen Vite causing some packages to import the wrong browser export", "pr": "https://github.com/Shopify/hydrogen/pull/2863", "id": "2863" }, { "title": "Fix duplicate urls in localized skeleton starter", "desc": "Fix an issue with our starter template where duplicate content can exist on URLs that use internationalized handles. For example, if you have a product handle in english of `the-havoc` and translate it to `das-chaos` in German, duplicate content exists at both: 1. https://hydrogen.shop/de-de/products/das-chaos 2. https://hydrogen.shop/de-de/products/the-havoc We've changed the starter template to make the second redirect to the first.", "pr": "https://github.com/Shopify/hydrogen/pull/2821", "id": "2821" }, { "title": "Fix the customer account implementation to clear all session data on logout", "desc": "Previously we would only clear customer account credentials on logout. This change also clears any custom data in the session as well", "steps": [ { "title": "You can opt out and keep custom data in the session by passing the `keepSession` option to logout", "code": "YGBganMKZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFjdGlvbih7Y29udGV4dH06IEFjdGlvbkZ1bmN0aW9uQXJncykgewogIHJldHVybiBjb250ZXh0LmN1c3RvbWVyQWNjb3VudC5sb2dvdXQoewogICAga2VlcFNlc3Npb246IHRydWUKICB9KTsKfQpgYGA=" } ], "pr": "https://github.com/Shopify/hydrogen/pull/2843", "id": "2843" }, { "title": "Fix faulty truthiness check for cart quantity", "pr": "https://github.com/Shopify/hydrogen/pull/2855", "id": "2855" }, { "title": "Deprecate `", "desc": "VariantSelector is deprecated because it does not supports 2k variants or combined listing products. Use `getProductOptions` for a streamlined migration to a modern scalable product form.", "pr": "https://github.com/Shopify/hydrogen/pull/2837", "id": "2837", "steps": [ { "title": "Update the SFAPI product query to request the new required fields encodedVariantExistence and encodedVariantAvailability. This will allow the product form to determine which variants are available for selection.", "code": "YGBgZGlmZgpjb25zdCBQUk9EVUNUX0ZSQUdNRU5UID0gYCNncmFwaHFsCiAgZnJhZ21lbnQgUHJvZHVjdCBvbiBQcm9kdWN0IHsKICAgIGlkCiAgICB0aXRsZQogICAgdmVuZG9yCiAgICBoYW5kbGUKICAgIGRlc2NyaXB0aW9uSHRtbAogICAgZGVzY3JpcHRpb24KKyAgICBlbmNvZGVkVmFyaWFudEV4aXN0ZW5jZQorICAgIGVuY29kZWRWYXJpYW50QXZhaWxhYmlsaXR5CiAgICBvcHRpb25zIHsKICAgICAgbmFtZQogICAgICBvcHRpb25WYWx1ZXMgewogICAgICAgIG5hbWUKKyAgICAgICAgZmlyc3RTZWxlY3RhYmxlVmFyaWFudCB7CisgICAgICAgICAgLi4uUHJvZHVjdFZhcmlhbnQKKyAgICAgICAgfQorICAgICAgICBzd2F0Y2ggeworICAgICAgICAgIGNvbG9yCisgICAgICAgICAgaW1hZ2UgeworICAgICAgICAgICAgcHJldmlld0ltYWdlIHsKKyAgICAgICAgICAgICAgdXJsCisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CiAgICAgIH0KICAgIH0KLSAgICBzZWxlY3RlZFZhcmlhbnQ6IHNlbGVjdGVkT3JGaXJzdEF2YWlsYWJsZVZhcmlhbnQoc2VsZWN0ZWRPcHRpb25zOiAkc2VsZWN0ZWRPcHRpb25zLCBpZ25vcmVVbmtub3duT3B0aW9uczogdHJ1ZSwgY2FzZUluc2Vuc2l0aXZlTWF0Y2g6IHRydWUpIHsKKyAgICBzZWxlY3RlZE9yRmlyc3RBdmFpbGFibGVWYXJpYW50KHNlbGVjdGVkT3B0aW9uczogJHNlbGVjdGVkT3B0aW9ucywgaWdub3JlVW5rbm93bk9wdGlvbnM6IHRydWUsIGNhc2VJbnNlbnNpdGl2ZU1hdGNoOiB0cnVlKSB7CisgICAgICAuLi5Qcm9kdWN0VmFyaWFudAorICAgIH0KKyAgICBhZGphY2VudFZhcmlhbnRzIChzZWxlY3RlZE9wdGlvbnM6ICRzZWxlY3RlZE9wdGlvbnMpIHsKKyAgICAgIC4uLlByb2R1Y3RWYXJpYW50CisgICAgfQotICAgIHZhcmlhbnRzKGZpcnN0OiAxKSB7Ci0gICAgICBub2RlcyB7Ci0gICAgICAgIC4uLlByb2R1Y3RWYXJpYW50Ci0gICAgICB9Ci0gICAgfQogICAgc2VvIHsKICAgICAgZGVzY3JpcHRpb24KICAgICAgdGl0bGUKICAgIH0KICB9CiAgJHtQUk9EVUNUX1ZBUklBTlRfRlJBR01FTlR9CmAgYXMgY29uc3Q7CmBgYA==" }, { "title": "Remove the `VARIANTS_QUERY` and related logic from `loadDeferredData`, as querying all variants is no longer necessary. Simplifies the function to return an empty object.", "code": "YGBgZGlmZgpmdW5jdGlvbiBsb2FkRGVmZXJyZWREYXRhKHtjb250ZXh0LCBwYXJhbXN9OiBMb2FkZXJGdW5jdGlvbkFyZ3MpIHsKKyAgLy8gUHV0IGFueSBBUEkgY2FsbHMgdGhhdCBpcyBub3QgY3JpdGljYWwgdG8gYmUgYXZhaWxhYmxlIG9uIGZpcnN0IHBhZ2UgcmVuZGVyCisgIC8vIEZvciBleGFtcGxlOiBwcm9kdWN0IHJldmlld3MsIHByb2R1Y3QgcmVjb21tZW5kYXRpb25zLCBzb2NpYWwgZmVlZHMuCi0gIC8vIEluIG9yZGVyIHRvIHNob3cgd2hpY2ggdmFyaWFudHMgYXJlIGF2YWlsYWJsZSBpbiB0aGUgVUksIHdlIG5lZWQgdG8gcXVlcnkKLSAgLy8gYWxsIG9mIHRoZW0uIEJ1dCB0aGVyZSBtaWdodCBiZSBhICpsb3QqLCBzbyBpbnN0ZWFkIHNlcGFyYXRlIHRoZSB2YXJpYW50cwotICAvLyBpbnRvIGl0J3Mgb3duIHNlcGFyYXRlIHF1ZXJ5IHRoYXQgaXMgZGVmZXJyZWQuIFNvIHRoZXJlJ3MgYSBicmllZiBtb21lbnQKLSAgLy8gd2hlcmUgdmFyaWFudCBvcHRpb25zIG1pZ2h0IHNob3cgYXMgYXZhaWxhYmxlIHdoZW4gdGhleSdyZSBub3QsIGJ1dCBhZnRlcgotICAvLyB0aGlzIGRlZmVycmVkIHF1ZXJ5IHJlc29sdmVzLCB0aGUgVUkgd2lsbCB1cGRhdGUuCi0gIGNvbnN0IHZhcmlhbnRzID0gY29udGV4dC5zdG9yZWZyb250Ci0gICAgLnF1ZXJ5KFZBUklBTlRTX1FVRVJZLCB7Ci0gICAgICB2YXJpYWJsZXM6IHtoYW5kbGU6IHBhcmFtcy5oYW5kbGUhfSwKLSAgICB9KQotICAgIC5jYXRjaCgoZXJyb3IpID0+IHsKLSAgICAgIC8vIExvZyBxdWVyeSBlcnJvcnMsIGJ1dCBkb24ndCB0aHJvdyB0aGVtIHNvIHRoZSBwYWdlIGNhbiBzdGlsbCByZW5kZXIKLSAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpOwotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfSk7CgorICByZXR1cm4ge30KLSAgcmV0dXJuIHsKLSAgICB2YXJpYW50cywKLSAgfTsKfQpgYGA=" }, { "title": "Update the `Product` component to use `getAdjacentAndFirstAvailableVariants` for determining the selected variant, improving handling of adjacent and available variants.", "code": "YGBgZGlmZgppbXBvcnQgewogIGdldFNlbGVjdGVkUHJvZHVjdE9wdGlvbnMsCiAgQW5hbHl0aWNzLAogIHVzZU9wdGltaXN0aWNWYXJpYW50LAorICBnZXRBZGphY2VudEFuZEZpcnN0QXZhaWxhYmxlVmFyaWFudHMsCn0gZnJvbSAnQHNob3BpZnkvaHlkcm9nZW4nOwoKZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gUHJvZHVjdCgpIHsKKyAgY29uc3Qge3Byb2R1Y3R9ID0gdXNlTG9hZGVyRGF0YTx0eXBlb2YgbG9hZGVyPigpOwotICBjb25zdCB7cHJvZHVjdCwgdmFyaWFudHN9ID0gdXNlTG9hZGVyRGF0YTx0eXBlb2YgbG9hZGVyPigpOwoKKyAgLy8gT3B0aW1pc3RpY2FsbHkgc2VsZWN0cyBhIHZhcmlhbnQgd2l0aCBnaXZlbiBhdmFpbGFibGUgdmFyaWFudCBpbmZvcm1hdGlvbgorICBjb25zdCBzZWxlY3RlZFZhcmlhbnQgPSB1c2VPcHRpbWlzdGljVmFyaWFudCgKKyAgICBwcm9kdWN0LnNlbGVjdGVkT3JGaXJzdEF2YWlsYWJsZVZhcmlhbnQsCisgICAgZ2V0QWRqYWNlbnRBbmRGaXJzdEF2YWlsYWJsZVZhcmlhbnRzKHByb2R1Y3QpLAorICApOwotICBjb25zdCBzZWxlY3RlZFZhcmlhbnQgPSB1c2VPcHRpbWlzdGljVmFyaWFudCgKLSAgICBwcm9kdWN0LnNlbGVjdGVkVmFyaWFudCwKLSAgICB2YXJpYW50cywKLSAgKTsKYGBg" }, { "title": "Automatically update the URL with search parameters based on the selected product variant's options when no search parameters are present, ensuring the URL reflects the current selection without triggering navigation.", "code": "YGBgZGlmZgppbXBvcnQgewogIGdldFNlbGVjdGVkUHJvZHVjdE9wdGlvbnMsCiAgQW5hbHl0aWNzLAogIHVzZU9wdGltaXN0aWNWYXJpYW50LAogIGdldEFkamFjZW50QW5kRmlyc3RBdmFpbGFibGVWYXJpYW50cywKKyAgbWFwU2VsZWN0ZWRQcm9kdWN0T3B0aW9uVG9PYmplY3QsCn0gZnJvbSAnQHNob3BpZnkvaHlkcm9nZW4nOwoKZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gUHJvZHVjdCgpIHsKICBjb25zdCB7cHJvZHVjdH0gPSB1c2VMb2FkZXJEYXRhPHR5cGVvZiBsb2FkZXI+KCk7CgogIC8vIE9wdGltaXN0aWNhbGx5IHNlbGVjdHMgYSB2YXJpYW50IHdpdGggZ2l2ZW4gYXZhaWxhYmxlIHZhcmlhbnQgaW5mb3JtYXRpb24KICBjb25zdCBzZWxlY3RlZFZhcmlhbnQgPSB1c2VPcHRpbWlzdGljVmFyaWFudCgKICAgIHByb2R1Y3Quc2VsZWN0ZWRPckZpcnN0QXZhaWxhYmxlVmFyaWFudCwKICAgIGdldEFkamFjZW50QW5kRmlyc3RBdmFpbGFibGVWYXJpYW50cyhwcm9kdWN0KSwKICApOwoKKyAgLy8gU2V0cyB0aGUgc2VhcmNoIHBhcmFtIHRvIHRoZSBzZWxlY3RlZCB2YXJpYW50IHdpdGhvdXQgbmF2aWdhdGlvbgorICAvLyBvbmx5IHdoZW4gbm8gc2VhcmNoIHBhcmFtcyBhcmUgc2V0IGluIHRoZSB1cmwKKyAgdXNlRWZmZWN0KCgpID0+IHsKKyAgICBjb25zdCBzZWFyY2hQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKAorICAgICAgbWFwU2VsZWN0ZWRQcm9kdWN0T3B0aW9uVG9PYmplY3QoCisgICAgICAgIHNlbGVjdGVkVmFyaWFudC5zZWxlY3RlZE9wdGlvbnMgfHwgW10sCisgICAgICApLAorICAgICk7CgorICAgIGlmICh3aW5kb3cubG9jYXRpb24uc2VhcmNoID09PSAnJyAmJiBzZWFyY2hQYXJhbXMudG9TdHJpbmcoKSAhPT0gJycpIHsKKyAgICAgIHdpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZSgKKyAgICAgICAge30sCisgICAgICAgICcnLAorICAgICAgICBgJHtsb2NhdGlvbi5wYXRobmFtZX0/JHtzZWFyY2hQYXJhbXMudG9TdHJpbmcoKX1gLAorICAgICAgKTsKKyAgICB9CisgIH0sIFsKKyAgICBKU09OLnN0cmluZ2lmeShzZWxlY3RlZFZhcmlhbnQuc2VsZWN0ZWRPcHRpb25zKSwKKyAgXSk7CmBgYA==" }, { "title": "Retrieve the product options array using `getProductOptions`, enabling efficient handling of product variants and their associated options.", "code": "YGBgZGlmZgppbXBvcnQgewogIGdldFNlbGVjdGVkUHJvZHVjdE9wdGlvbnMsCiAgQW5hbHl0aWNzLAogIHVzZU9wdGltaXN0aWNWYXJpYW50LAorICBnZXRQcm9kdWN0T3B0aW9ucywKICBnZXRBZGphY2VudEFuZEZpcnN0QXZhaWxhYmxlVmFyaWFudHMsCiAgbWFwU2VsZWN0ZWRQcm9kdWN0T3B0aW9uVG9PYmplY3QsCn0gZnJvbSAnQHNob3BpZnkvaHlkcm9nZW4nOwoKZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gUHJvZHVjdCgpIHsKICBjb25zdCB7cHJvZHVjdH0gPSB1c2VMb2FkZXJEYXRhPHR5cGVvZiBsb2FkZXI+KCk7CgogIC8vIE9wdGltaXN0aWNhbGx5IHNlbGVjdHMgYSB2YXJpYW50IHdpdGggZ2l2ZW4gYXZhaWxhYmxlIHZhcmlhbnQgaW5mb3JtYXRpb24KICBjb25zdCBzZWxlY3RlZFZhcmlhbnQgPSB1c2VPcHRpbWlzdGljVmFyaWFudCgKICAgIHByb2R1Y3Quc2VsZWN0ZWRPckZpcnN0QXZhaWxhYmxlVmFyaWFudCwKICAgIGdldEFkamFjZW50QW5kRmlyc3RBdmFpbGFibGVWYXJpYW50cyhwcm9kdWN0KSwKICApOwoKICAvLyBTZXRzIHRoZSBzZWFyY2ggcGFyYW0gdG8gdGhlIHNlbGVjdGVkIHZhcmlhbnQgd2l0aG91dCBuYXZpZ2F0aW9uCiAgLy8gb25seSB3aGVuIG5vIHNlYXJjaCBwYXJhbXMgYXJlIHNldCBpbiB0aGUgdXJsCiAgdXNlRWZmZWN0KCgpID0+IHsKICAgIC8vIC4uLgogIH0sIFsKICAgIEpTT04uc3RyaW5naWZ5KHNlbGVjdGVkVmFyaWFudC5zZWxlY3RlZE9wdGlvbnMpLAogIF0pOwoKKyAgLy8gR2V0IHRoZSBwcm9kdWN0IG9wdGlvbnMgYXJyYXkKKyAgY29uc3QgcHJvZHVjdE9wdGlvbnMgPSBnZXRQcm9kdWN0T3B0aW9ucyh7CisgICAgLi4ucHJvZHVjdCwKKyAgICBzZWxlY3RlZE9yRmlyc3RBdmFpbGFibGVWYXJpYW50OiBzZWxlY3RlZFZhcmlhbnQsCisgIH0pOwpgYGA=" }, { "title": "Remove `Await` and `Suspense` from `ProductForm` as there are no longer any asynchronous queries to wait for, simplifying the component structure.", "code": "YGBgZGlmZgpleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBQcm9kdWN0KCkgewogIC4uLgogIHJldHVybiAoCiAgICAuLi4KKyAgICAgICAgPFByb2R1Y3RGb3JtCisgICAgICAgICAgcHJvZHVjdE9wdGlvbnM9e3Byb2R1Y3RPcHRpb25zfQorICAgICAgICAgIHNlbGVjdGVkVmFyaWFudD17c2VsZWN0ZWRWYXJpYW50fQorICAgICAgICAvPgotICAgICAgICA8U3VzcGVuc2UKLSAgICAgICAgICBmYWxsYmFjaz17Ci0gICAgICAgICAgICA8UHJvZHVjdEZvcm0KLSAgICAgICAgICAgICAgcHJvZHVjdD17cHJvZHVjdH0KLSAgICAgICAgICAgICAgc2VsZWN0ZWRWYXJpYW50PXtzZWxlY3RlZFZhcmlhbnR9Ci0gICAgICAgICAgICAgIHZhcmlhbnRzPXtbXX0KLSAgICAgICAgICAgIC8+Ci0gICAgICAgICAgfQotICAgICAgICA+Ci0gICAgICAgICAgPEF3YWl0Ci0gICAgICAgICAgICBlcnJvckVsZW1lbnQ9IlRoZXJlIHdhcyBhIHByb2JsZW0gbG9hZGluZyBwcm9kdWN0IHZhcmlhbnRzIgotICAgICAgICAgICAgcmVzb2x2ZT17dmFyaWFudHN9Ci0gICAgICAgICAgPgotICAgICAgICAgICAgeyhkYXRhKSA9PiAoCi0gICAgICAgICAgICAgIDxQcm9kdWN0Rm9ybQotICAgICAgICAgICAgICAgIHByb2R1Y3Q9e3Byb2R1Y3R9Ci0gICAgICAgICAgICAgICAgc2VsZWN0ZWRWYXJpYW50PXtzZWxlY3RlZFZhcmlhbnR9Ci0gICAgICAgICAgICAgICAgdmFyaWFudHM9e2RhdGE/LnByb2R1Y3Q/LnZhcmlhbnRzLm5vZGVzIHx8IFtdfQotICAgICAgICAgICAgICAvPgotICAgICAgICAgICAgKX0KLSAgICAgICAgICA8L0F3YWl0PgotICAgICAgICA8L1N1c3BlbnNlPgpgYGA=" }, { "title": "Refactor `ProductForm` to handle combined listing products and variants efficiently. It uses links for different product URLs and buttons for variant updates, improving SEO and user experience.", "code": "YGBgdHN4CmltcG9ydCB7TGluaywgdXNlTmF2aWdhdGV9IGZyb20gJ0ByZW1peC1ydW4vcmVhY3QnOwppbXBvcnQge3R5cGUgTWFwcGVkUHJvZHVjdE9wdGlvbnN9IGZyb20gJ0BzaG9waWZ5L2h5ZHJvZ2VuJzsKaW1wb3J0IHR5cGUgewogIE1heWJlLAogIFByb2R1Y3RPcHRpb25WYWx1ZVN3YXRjaCwKfSBmcm9tICdAc2hvcGlmeS9oeWRyb2dlbi9zdG9yZWZyb250LWFwaS10eXBlcyc7CmltcG9ydCB7QWRkVG9DYXJ0QnV0dG9ufSBmcm9tICcuL0FkZFRvQ2FydEJ1dHRvbic7CmltcG9ydCB7dXNlQXNpZGV9IGZyb20gJy4vQXNpZGUnOwppbXBvcnQgdHlwZSB7UHJvZHVjdEZyYWdtZW50fSBmcm9tICdzdG9yZWZyb250YXBpLmdlbmVyYXRlZCc7CgpleHBvcnQgZnVuY3Rpb24gUHJvZHVjdEZvcm0oewogIHByb2R1Y3RPcHRpb25zLAogIHNlbGVjdGVkVmFyaWFudCwKfTogewogIHByb2R1Y3RPcHRpb25zOiBNYXBwZWRQcm9kdWN0T3B0aW9uc1tdOwogIHNlbGVjdGVkVmFyaWFudDogUHJvZHVjdEZyYWdtZW50WydzZWxlY3RlZE9yRmlyc3RBdmFpbGFibGVWYXJpYW50J107Cn0pIHsKICBjb25zdCBuYXZpZ2F0ZSA9IHVzZU5hdmlnYXRlKCk7CiAgY29uc3Qge29wZW59ID0gdXNlQXNpZGUoKTsKICByZXR1cm4gKAogICAgPGRpdiBjbGFzc05hbWU9InByb2R1Y3QtZm9ybSI+CiAgICAgIHtwcm9kdWN0T3B0aW9ucy5tYXAoKG9wdGlvbikgPT4gKAogICAgICAgIDxkaXYgY2xhc3NOYW1lPSJwcm9kdWN0LW9wdGlvbnMiIGtleT17b3B0aW9uLm5hbWV9PgogICAgICAgICAgPGg1PntvcHRpb24ubmFtZX08L2g1PgogICAgICAgICAgPGRpdiBjbGFzc05hbWU9InByb2R1Y3Qtb3B0aW9ucy1ncmlkIj4KICAgICAgICAgICAge29wdGlvbi5vcHRpb25WYWx1ZXMubWFwKCh2YWx1ZSkgPT4gewogICAgICAgICAgICAgIGNvbnN0IHsKICAgICAgICAgICAgICAgIG5hbWUsCiAgICAgICAgICAgICAgICBoYW5kbGUsCiAgICAgICAgICAgICAgICB2YXJpYW50VXJpUXVlcnksCiAgICAgICAgICAgICAgICBzZWxlY3RlZCwKICAgICAgICAgICAgICAgIGF2YWlsYWJsZSwKICAgICAgICAgICAgICAgIGV4aXN0cywKICAgICAgICAgICAgICAgIGlzRGlmZmVyZW50UHJvZHVjdCwKICAgICAgICAgICAgICAgIHN3YXRjaCwKICAgICAgICAgICAgICB9ID0gdmFsdWU7CgogICAgICAgICAgICAgIGlmIChpc0RpZmZlcmVudFByb2R1Y3QpIHsKICAgICAgICAgICAgICAgIC8vIFNFTwogICAgICAgICAgICAgICAgLy8gV2hlbiB0aGUgdmFyaWFudCBpcyBhIGNvbWJpbmVkIGxpc3RpbmcgY2hpbGQgcHJvZHVjdAogICAgICAgICAgICAgICAgLy8gdGhhdCBsZWFkcyB0byBhIGRpZmZlcmVudCBVUkwsIHdlIG5lZWQgdG8gcmVuZGVyIGl0CiAgICAgICAgICAgICAgICAvLyBhcyBhbiBhbmNob3IgdGFnCiAgICAgICAgICAgICAgICByZXR1cm4gKAogICAgICAgICAgICAgICAgICA8TGluawogICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT0icHJvZHVjdC1vcHRpb25zLWl0ZW0iCiAgICAgICAgICAgICAgICAgICAga2V5PXtvcHRpb24ubmFtZSArIG5hbWV9CiAgICAgICAgICAgICAgICAgICAgcHJlZmV0Y2g9ImludGVudCIKICAgICAgICAgICAgICAgICAgICBwcmV2ZW50U2Nyb2xsUmVzZXQKICAgICAgICAgICAgICAgICAgICByZXBsYWNlCiAgICAgICAgICAgICAgICAgICAgdG89e2AvcHJvZHVjdHMvJHtoYW5kbGV9PyR7dmFyaWFudFVyaVF1ZXJ5fWB9CiAgICAgICAgICAgICAgICAgICAgc3R5bGU9e3sKICAgICAgICAgICAgICAgICAgICAgIGJvcmRlcjogc2VsZWN0ZWQKICAgICAgICAgICAgICAgICAgICAgICAgPyAnMXB4IHNvbGlkIGJsYWNrJwogICAgICAgICAgICAgICAgICAgICAgICA6ICcxcHggc29saWQgdHJhbnNwYXJlbnQnLAogICAgICAgICAgICAgICAgICAgICAgb3BhY2l0eTogYXZhaWxhYmxlID8gMSA6IDAuMywKICAgICAgICAgICAgICAgICAgICB9fQogICAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICAgICAgPFByb2R1Y3RPcHRpb25Td2F0Y2ggc3dhdGNoPXtzd2F0Y2h9IG5hbWU9e25hbWV9IC8+CiAgICAgICAgICAgICAgICAgIDwvTGluaz4KICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIFNFTwogICAgICAgICAgICAgICAgLy8gV2hlbiB0aGUgdmFyaWFudCBpcyBhbiB1cGRhdGUgdG8gdGhlIHNlYXJjaCBwYXJhbSwKICAgICAgICAgICAgICAgIC8vIHJlbmRlciBpdCBhcyBhIGJ1dHRvbiB3aXRoIEphdmFTY3JpcHQgbmF2aWdhdGluZyB0bwogICAgICAgICAgICAgICAgLy8gdGhlIHZhcmlhbnQgc28gdGhhdCBTRU8gYm90cyBkbyBub3QgaW5kZXggdGhlc2UgYXMKICAgICAgICAgICAgICAgIC8vIGR1cGxpY2F0ZWQgbGlua3MKICAgICAgICAgICAgICAgIHJldHVybiAoCiAgICAgICAgICAgICAgICAgIDxidXR0b24KICAgICAgICAgICAgICAgICAgICB0eXBlPSJidXR0b24iCiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgcHJvZHVjdC1vcHRpb25zLWl0ZW0kewogICAgICAgICAgICAgICAgICAgICAgZXhpc3RzICYmICFzZWxlY3RlZCA/ICcgbGluaycgOiAnJwogICAgICAgICAgICAgICAgICAgIH1gfQogICAgICAgICAgICAgICAgICAgIGtleT17b3B0aW9uLm5hbWUgKyBuYW1lfQogICAgICAgICAgICAgICAgICAgIHN0eWxlPXt7CiAgICAgICAgICAgICAgICAgICAgICBib3JkZXI6IHNlbGVjdGVkCiAgICAgICAgICAgICAgICAgICAgICAgID8gJzFweCBzb2xpZCBibGFjaycKICAgICAgICAgICAgICAgICAgICAgICAgOiAnMXB4IHNvbGlkIHRyYW5zcGFyZW50JywKICAgICAgICAgICAgICAgICAgICAgIG9wYWNpdHk6IGF2YWlsYWJsZSA/IDEgOiAwLjMsCiAgICAgICAgICAgICAgICAgICAgfX0KICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17IWV4aXN0c30KICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGVjdGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRlKGA/JHt2YXJpYW50VXJpUXVlcnl9YCwgewogICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2U6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH19CiAgICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgICAgICA8UHJvZHVjdE9wdGlvblN3YXRjaCBzd2F0Y2g9e3N3YXRjaH0gbmFtZT17bmFtZX0gLz4KICAgICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSl9CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxiciAvPgogICAgICAgIDwvZGl2PgogICAgICApKX0KICAgICAgPEFkZFRvQ2FydEJ1dHRvbgogICAgICAgIGRpc2FibGVkPXshc2VsZWN0ZWRWYXJpYW50IHx8ICFzZWxlY3RlZFZhcmlhbnQuYXZhaWxhYmxlRm9yU2FsZX0KICAgICAgICBvbkNsaWNrPXsoKSA9PiB7CiAgICAgICAgICBvcGVuKCdjYXJ0Jyk7CiAgICAgICAgfX0KICAgICAgICBsaW5lcz17CiAgICAgICAgICBzZWxlY3RlZFZhcmlhbnQKICAgICAgICAgICAgPyBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgIG1lcmNoYW5kaXNlSWQ6IHNlbGVjdGVkVmFyaWFudC5pZCwKICAgICAgICAgICAgICAgICAgcXVhbnRpdHk6IDEsCiAgICAgICAgICAgICAgICAgIHNlbGVjdGVkVmFyaWFudCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgXQogICAgICAgICAgICA6IFtdCiAgICAgICAgfQogICAgICA+CiAgICAgICAge3NlbGVjdGVkVmFyaWFudD8uYXZhaWxhYmxlRm9yU2FsZSA/ICdBZGQgdG8gY2FydCcgOiAnU29sZCBvdXQnfQogICAgICA8L0FkZFRvQ2FydEJ1dHRvbj4KICAgIDwvZGl2PgogICk7Cn0KCmZ1bmN0aW9uIFByb2R1Y3RPcHRpb25Td2F0Y2goewogIHN3YXRjaCwKICBuYW1lLAp9OiB7CiAgc3dhdGNoPzogTWF5YmU8UHJvZHVjdE9wdGlvblZhbHVlU3dhdGNoPiB8IHVuZGVmaW5lZDsKICBuYW1lOiBzdHJpbmc7Cn0pIHsKICBjb25zdCBpbWFnZSA9IHN3YXRjaD8uaW1hZ2U/LnByZXZpZXdJbWFnZT8udXJsOwogIGNvbnN0IGNvbG9yID0gc3dhdGNoPy5jb2xvcjsKCiAgaWYgKCFpbWFnZSAmJiAhY29sb3IpIHJldHVybiBuYW1lOwoKICByZXR1cm4gKAogICAgPGRpdgogICAgICBhcmlhLWxhYmVsPXtuYW1lfQogICAgICBjbGFzc05hbWU9InByb2R1Y3Qtb3B0aW9uLWxhYmVsLXN3YXRjaCIKICAgICAgc3R5bGU9e3sKICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IGNvbG9yIHx8ICd0cmFuc3BhcmVudCcsCiAgICAgIH19CiAgICA+CiAgICAgIHshIWltYWdlICYmIDxpbWcgc3JjPXtpbWFnZX0gYWx0PXtuYW1lfSAvPn0KICAgIDwvZGl2PgogICk7Cn0KYGBg" }, { "title": "Make `useVariantUrl` and `getVariantUrl` functions more flexible by allowing `selectedOptions` to be optional. This ensures compatibility with cases where no options are provided.", "code": "YGBgZGlmZgpleHBvcnQgZnVuY3Rpb24gdXNlVmFyaWFudFVybCgKICBoYW5kbGU6IHN0cmluZywKLSAgc2VsZWN0ZWRPcHRpb25zOiBTZWxlY3RlZE9wdGlvbltdLAorICBzZWxlY3RlZE9wdGlvbnM/OiBTZWxlY3RlZE9wdGlvbltdLAopIHsKICBjb25zdCB7cGF0aG5hbWV9ID0gdXNlTG9jYXRpb24oKTsKCiAgcmV0dXJuIHVzZU1lbW8oKCkgPT4gewogICAgcmV0dXJuIGdldFZhcmlhbnRVcmwoewogICAgICBoYW5kbGUsCiAgICAgIHBhdGhuYW1lLAogICAgICBzZWFyY2hQYXJhbXM6IG5ldyBVUkxTZWFyY2hQYXJhbXMoKSwKICAgICAgc2VsZWN0ZWRPcHRpb25zLAogICAgfSk7CiAgfSwgW2hhbmRsZSwgc2VsZWN0ZWRPcHRpb25zLCBwYXRobmFtZV0pOwp9CmV4cG9ydCBmdW5jdGlvbiBnZXRWYXJpYW50VXJsKHsKICBoYW5kbGUsCiAgcGF0aG5hbWUsCiAgc2VhcmNoUGFyYW1zLAogIHNlbGVjdGVkT3B0aW9ucywKfTogewogIGhhbmRsZTogc3RyaW5nOwogIHBhdGhuYW1lOiBzdHJpbmc7CiAgc2VhcmNoUGFyYW1zOiBVUkxTZWFyY2hQYXJhbXM7Ci0gIHNlbGVjdGVkT3B0aW9uczogU2VsZWN0ZWRPcHRpb25bXTsKKyAgc2VsZWN0ZWRPcHRpb25zPzogU2VsZWN0ZWRPcHRpb25bXSwKfSkgewogIGNvbnN0IG1hdGNoID0gLyhcL1thLXpBLVpdezJ9LVthLXpBLVpdezJ9XC8pL2cuZXhlYyhwYXRobmFtZSk7CiAgY29uc3QgaXNMb2NhbGVQYXRobmFtZSA9IG1hdGNoICYmIG1hdGNoLmxlbmd0aCA+IDA7CiAgY29uc3QgcGF0aCA9IGlzTG9jYWxlUGF0aG5hbWUKICAgID8gYCR7bWF0Y2ghWzBdfXByb2R1Y3RzLyR7aGFuZGxlfWAKICAgIDogYC9wcm9kdWN0cy8ke2hhbmRsZX1gOwoKLSAgc2VsZWN0ZWRPcHRpb25zLmZvckVhY2goKG9wdGlvbikgPT4geworICBzZWxlY3RlZE9wdGlvbnM/LmZvckVhY2goKG9wdGlvbikgPT4gewogICAgc2VhcmNoUGFyYW1zLnNldChvcHRpb24ubmFtZSwgb3B0aW9uLnZhbHVlKTsKICB9KTsKYGBg" }, { "title": "Remove unnecessary variant queries and references in `routes/collections.$handle.tsx`, simplifying the code by relying on the product route to fetch the first available variant.", "code": "YGBgZGlmZgpjb25zdCBQUk9EVUNUX0lURU1fRlJBR01FTlQgPSBgI2dyYXBocWwKICBmcmFnbWVudCBNb25leVByb2R1Y3RJdGVtIG9uIE1vbmV5VjIgewogICAgYW1vdW50CiAgICBjdXJyZW5jeUNvZGUKICB9CiAgZnJhZ21lbnQgUHJvZHVjdEl0ZW0gb24gUHJvZHVjdCB7CiAgICBpZAogICAgaGFuZGxlCiAgICB0aXRsZQogICAgZmVhdHVyZWRJbWFnZSB7CiAgICAgIGlkCiAgICAgIGFsdFRleHQKICAgICAgdXJsCiAgICAgIHdpZHRoCiAgICAgIGhlaWdodAogICAgfQogICAgcHJpY2VSYW5nZSB7CiAgICAgIG1pblZhcmlhbnRQcmljZSB7CiAgICAgICAgLi4uTW9uZXlQcm9kdWN0SXRlbQogICAgICB9CiAgICAgIG1heFZhcmlhbnRQcmljZSB7CiAgICAgICAgLi4uTW9uZXlQcm9kdWN0SXRlbQogICAgICB9CiAgICB9Ci0gICAgdmFyaWFudHMoZmlyc3Q6IDEpIHsKLSAgICAgIG5vZGVzIHsKLSAgICAgICAgc2VsZWN0ZWRPcHRpb25zIHsKLSAgICAgICAgICBuYW1lCi0gICAgICAgICAgdmFsdWUKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KICB9CmAgYXMgY29uc3Q7CmBgYAoKYW5kIHJlbW92ZSB0aGUgdmFyaWFudCByZWZlcmVuY2UKCmBgYGRpZmYKZnVuY3Rpb24gUHJvZHVjdEl0ZW0oewogIHByb2R1Y3QsCiAgbG9hZGluZywKfTogewogIHByb2R1Y3Q6IFByb2R1Y3RJdGVtRnJhZ21lbnQ7CiAgbG9hZGluZz86ICdlYWdlcicgfCAnbGF6eSc7Cn0pIHsKLSAgY29uc3QgdmFyaWFudCA9IHByb2R1Y3QudmFyaWFudHMubm9kZXNbMF07Ci0gIGNvbnN0IHZhcmlhbnRVcmwgPSB1c2VWYXJpYW50VXJsKHByb2R1Y3QuaGFuZGxlLCB2YXJpYW50LnNlbGVjdGVkT3B0aW9ucyk7CisgIGNvbnN0IHZhcmlhbnRVcmwgPSB1c2VWYXJpYW50VXJsKHByb2R1Y3QuaGFuZGxlKTsKICByZXR1cm4gKApgYGA=" }, { "title": "Simplify the `ProductItem` component by removing variant-specific queries and logic. The `useVariantUrl` function now generates URLs without relying on variant options, reducing complexity.", "code": "YGBgZGlmZgpjb25zdCBQUk9EVUNUX0lURU1fRlJBR01FTlQgPSBgI2dyYXBocWwKICBmcmFnbWVudCBNb25leVByb2R1Y3RJdGVtIG9uIE1vbmV5VjIgewogICAgYW1vdW50CiAgICBjdXJyZW5jeUNvZGUKICB9CiAgZnJhZ21lbnQgUHJvZHVjdEl0ZW0gb24gUHJvZHVjdCB7CiAgICBpZAogICAgaGFuZGxlCiAgICB0aXRsZQogICAgZmVhdHVyZWRJbWFnZSB7CiAgICAgIGlkCiAgICAgIGFsdFRleHQKICAgICAgdXJsCiAgICAgIHdpZHRoCiAgICAgIGhlaWdodAogICAgfQogICAgcHJpY2VSYW5nZSB7CiAgICAgIG1pblZhcmlhbnRQcmljZSB7CiAgICAgICAgLi4uTW9uZXlQcm9kdWN0SXRlbQogICAgICB9CiAgICAgIG1heFZhcmlhbnRQcmljZSB7CiAgICAgICAgLi4uTW9uZXlQcm9kdWN0SXRlbQogICAgICB9CiAgICB9Ci0gICAgdmFyaWFudHMoZmlyc3Q6IDEpIHsKLSAgICAgIG5vZGVzIHsKLSAgICAgICAgc2VsZWN0ZWRPcHRpb25zIHsKLSAgICAgICAgICBuYW1lCi0gICAgICAgICAgdmFsdWUKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KICB9CmAgYXMgY29uc3Q7CmBgYAoKYW5kIHJlbW92ZSB0aGUgdmFyaWFudCByZWZlcmVuY2UKCmBgYGRpZmYKZnVuY3Rpb24gUHJvZHVjdEl0ZW0oewogIHByb2R1Y3QsCiAgbG9hZGluZywKfTogewogIHByb2R1Y3Q6IFByb2R1Y3RJdGVtRnJhZ21lbnQ7CiAgbG9hZGluZz86ICdlYWdlcicgfCAnbGF6eSc7Cn0pIHsKLSAgY29uc3QgdmFyaWFudCA9IHByb2R1Y3QudmFyaWFudHMubm9kZXNbMF07Ci0gIGNvbnN0IHZhcmlhbnRVcmwgPSB1c2VWYXJpYW50VXJsKHByb2R1Y3QuaGFuZGxlLCB2YXJpYW50LnNlbGVjdGVkT3B0aW9ucyk7CisgIGNvbnN0IHZhcmlhbnRVcmwgPSB1c2VWYXJpYW50VXJsKHByb2R1Y3QuaGFuZGxlKTsKICByZXR1cm4gKApgYGA=" }, { "title": "Replace `variants(first: 1)` with `selectedOrFirstAvailableVariant` in GraphQL fragments to directly fetch the most relevant variant, improving query efficiency and clarity.", "code": "YGBgZGlmZgpjb25zdCBTRUFSQ0hfUFJPRFVDVF9GUkFHTUVOVCA9IGAjZ3JhcGhxbAogIGZyYWdtZW50IFNlYXJjaFByb2R1Y3Qgb24gUHJvZHVjdCB7CiAgICBfX3R5cGVuYW1lCiAgICBoYW5kbGUKICAgIGlkCiAgICBwdWJsaXNoZWRBdAogICAgdGl0bGUKICAgIHRyYWNraW5nUGFyYW1ldGVycwogICAgdmVuZG9yCi0gICAgdmFyaWFudHMoZmlyc3Q6IDEpIHsKLSAgICAgIG5vZGVzIHsKKyAgICBzZWxlY3RlZE9yRmlyc3RBdmFpbGFibGVWYXJpYW50KAorICAgICAgc2VsZWN0ZWRPcHRpb25zOiBbXQorICAgICAgaWdub3JlVW5rbm93bk9wdGlvbnM6IHRydWUKKyAgICAgIGNhc2VJbnNlbnNpdGl2ZU1hdGNoOiB0cnVlCisgICAgKSB7CiAgICAgICAgaWQKICAgICAgICBpbWFnZSB7CiAgICAgICAgICB1cmwKICAgICAgICAgIGFsdFRleHQKICAgICAgICAgIHdpZHRoCiAgICAgICAgICBoZWlnaHQKICAgICAgICB9CiAgICAgICAgcHJpY2UgewogICAgICAgICAgYW1vdW50CiAgICAgICAgICBjdXJyZW5jeUNvZGUKICAgICAgICB9CiAgICAgICAgY29tcGFyZUF0UHJpY2UgewogICAgICAgICAgYW1vdW50CiAgICAgICAgICBjdXJyZW5jeUNvZGUKICAgICAgICB9CiAgICAgICAgc2VsZWN0ZWRPcHRpb25zIHsKICAgICAgICAgIG5hbWUKICAgICAgICAgIHZhbHVlCiAgICAgICAgfQogICAgICAgIHByb2R1Y3QgewogICAgICAgICAgaGFuZGxlCiAgICAgICAgICB0aXRsZQogICAgICAgIH0KICAgICB9Ci0gICAgfQogIH0KYCBhcyBjb25zdDsKYGBgCgpgYGBkaWZmCmNvbnN0IFBSRURJQ1RJVkVfU0VBUkNIX1BST0RVQ1RfRlJBR01FTlQgPSBgI2dyYXBocWwKICBmcmFnbWVudCBQcmVkaWN0aXZlUHJvZHVjdCBvbiBQcm9kdWN0IHsKICAgIF9fdHlwZW5hbWUKICAgIGlkCiAgICB0aXRsZQogICAgaGFuZGxlCiAgICB0cmFja2luZ1BhcmFtZXRlcnMKLSAgICB2YXJpYW50cyhmaXJzdDogMSkgewotICAgICAgbm9kZXMgeworICAgIHNlbGVjdGVkT3JGaXJzdEF2YWlsYWJsZVZhcmlhbnQoCisgICAgICBzZWxlY3RlZE9wdGlvbnM6IFtdCisgICAgICBpZ25vcmVVbmtub3duT3B0aW9uczogdHJ1ZQorICAgICAgY2FzZUluc2Vuc2l0aXZlTWF0Y2g6IHRydWUKKyAgICApIHsKICAgICAgICBpZAogICAgICAgIGltYWdlIHsKICAgICAgICAgIHVybAogICAgICAgICAgYWx0VGV4dAogICAgICAgICAgd2lkdGgKICAgICAgICAgIGhlaWdodAogICAgICAgIH0KICAgICAgICBwcmljZSB7CiAgICAgICAgICBhbW91bnQKICAgICAgICAgIGN1cnJlbmN5Q29kZQogICAgICAgIH0KICAgICB9Ci0gICAgfQogIH0KYGBg" }, { "title": "Refactor `SearchResultsProducts` to use `selectedOrFirstAvailableVariant` for fetching product price and image, simplifying the logic and improving performance.", "code": "YGBgZGlmZgpmdW5jdGlvbiBTZWFyY2hSZXN1bHRzUHJvZHVjdHMoewogIHRlcm0sCiAgcHJvZHVjdHMsCn06IFBhcnRpYWxTZWFyY2hSZXN1bHQ8J3Byb2R1Y3RzJz4pIHsKICBpZiAoIXByb2R1Y3RzPy5ub2Rlcy5sZW5ndGgpIHsKICAgIHJldHVybiBudWxsOwogIH0KCiAgcmV0dXJuICgKICAgIDxkaXYgY2xhc3NOYW1lPSJzZWFyY2gtcmVzdWx0Ij4KICAgICAgPGgyPlByb2R1Y3RzPC9oMj4KICAgICAgPFBhZ2luYXRpb24gY29ubmVjdGlvbj17cHJvZHVjdHN9PgogICAgICAgIHsoe25vZGVzLCBpc0xvYWRpbmcsIE5leHRMaW5rLCBQcmV2aW91c0xpbmt9KSA9PiB7CiAgICAgICAgICBjb25zdCBJdGVtc01hcmt1cCA9IG5vZGVzLm1hcCgocHJvZHVjdCkgPT4gewogICAgICAgICAgICBjb25zdCBwcm9kdWN0VXJsID0gdXJsV2l0aFRyYWNraW5nUGFyYW1zKHsKICAgICAgICAgICAgICBiYXNlVXJsOiBgL3Byb2R1Y3RzLyR7cHJvZHVjdC5oYW5kbGV9YCwKICAgICAgICAgICAgICB0cmFja2luZ1BhcmFtczogcHJvZHVjdC50cmFja2luZ1BhcmFtZXRlcnMsCiAgICAgICAgICAgICAgdGVybSwKICAgICAgICAgICAgfSk7CgorICAgICAgICAgICAgY29uc3QgcHJpY2UgPSBwcm9kdWN0Py5zZWxlY3RlZE9yRmlyc3RBdmFpbGFibGVWYXJpYW50Py5wcmljZTsKKyAgICAgICAgICAgIGNvbnN0IGltYWdlID0gcHJvZHVjdD8uc2VsZWN0ZWRPckZpcnN0QXZhaWxhYmxlVmFyaWFudD8uaW1hZ2U7CgogICAgICAgICAgICByZXR1cm4gKAogICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSJzZWFyY2gtcmVzdWx0cy1pdGVtIiBrZXk9e3Byb2R1Y3QuaWR9PgogICAgICAgICAgICAgICAgPExpbmsgcHJlZmV0Y2g9ImludGVudCIgdG89e3Byb2R1Y3RVcmx9PgotICAgICAgICAgICAgICAgICAge3Byb2R1Y3QudmFyaWFudHMubm9kZXNbMF0uaW1hZ2UgJiYgKAorICAgICAgICAgICAgICAgICAge2ltYWdlICYmICgKICAgICAgICAgICAgICAgICAgICA8SW1hZ2UKLSAgICAgICAgICAgICAgICAgICAgICBkYXRhPXtwcm9kdWN0LnZhcmlhbnRzLm5vZGVzWzBdLmltYWdlfQorICAgICAgICAgICAgICAgICAgICAgIGRhdGE9e2ltYWdlfQogICAgICAgICAgICAgICAgICAgICAgYWx0PXtwcm9kdWN0LnRpdGxlfQogICAgICAgICAgICAgICAgICAgICAgd2lkdGg9ezUwfQogICAgICAgICAgICAgICAgICAgIC8+CiAgICAgICAgICAgICAgICAgICl9CiAgICAgICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICAgICAgPHA+e3Byb2R1Y3QudGl0bGV9PC9wPgogICAgICAgICAgICAgICAgICAgIDxzbWFsbD4KLSAgICAgICAgICAgICAgICAgICAgICA8TW9uZXkgZGF0YT17cHJvZHVjdC52YXJpYW50cy5ub2Rlc1swXS5wcmljZX0gLz4KKyAgICAgICAgICAgICAgICAgICAgICB7cHJpY2UgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIDxNb25leSBkYXRhPXtwcmljZX0gLz4KKyAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD4KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L0xpbms+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICk7CiAgICAgICAgICB9KTsKYGBg" }, { "title": "Update `SearchResultsPredictive` to use `selectedOrFirstAvailableVariant` for fetching product price and image, ensuring accurate and efficient data retrieval.", "code": "YGBgZGlmZgpmdW5jdGlvbiBTZWFyY2hSZXN1bHRzUHJlZGljdGl2ZVByb2R1Y3RzKHsKICB0ZXJtLAogIHByb2R1Y3RzLAogIGNsb3NlU2VhcmNoLAp9OiBQYXJ0aWFsUHJlZGljdGl2ZVNlYXJjaFJlc3VsdDwncHJvZHVjdHMnPikgewogIGlmICghcHJvZHVjdHMubGVuZ3RoKSByZXR1cm4gbnVsbDsKCiAgcmV0dXJuICgKICAgIDxkaXYgY2xhc3NOYW1lPSJwcmVkaWN0aXZlLXNlYXJjaC1yZXN1bHQiIGtleT0icHJvZHVjdHMiPgogICAgICA8aDU+UHJvZHVjdHM8L2g1PgogICAgICA8dWw+CiAgICAgICAge3Byb2R1Y3RzLm1hcCgocHJvZHVjdCkgPT4gewogICAgICAgICAgY29uc3QgcHJvZHVjdFVybCA9IHVybFdpdGhUcmFja2luZ1BhcmFtcyh7CiAgICAgICAgICAgIGJhc2VVcmw6IGAvcHJvZHVjdHMvJHtwcm9kdWN0LmhhbmRsZX1gLAogICAgICAgICAgICB0cmFja2luZ1BhcmFtczogcHJvZHVjdC50cmFja2luZ1BhcmFtZXRlcnMsCiAgICAgICAgICAgIHRlcm06IHRlcm0uY3VycmVudCwKICAgICAgICAgIH0pOwoKKyAgICAgICAgICBjb25zdCBwcmljZSA9IHByb2R1Y3Q/LnNlbGVjdGVkT3JGaXJzdEF2YWlsYWJsZVZhcmlhbnQ/LnByaWNlOwotICAgICAgICAgIGNvbnN0IGltYWdlID0gcHJvZHVjdD8udmFyaWFudHM/Lm5vZGVzPy5bMF0uaW1hZ2U7CisgICAgICAgICAgY29uc3QgaW1hZ2UgPSBwcm9kdWN0Py5zZWxlY3RlZE9yRmlyc3RBdmFpbGFibGVWYXJpYW50Py5pbWFnZTsKICAgICAgICAgIHJldHVybiAoCiAgICAgICAgICAgIDxsaSBjbGFzc05hbWU9InByZWRpY3RpdmUtc2VhcmNoLXJlc3VsdC1pdGVtIiBrZXk9e3Byb2R1Y3QuaWR9PgogICAgICAgICAgICAgIDxMaW5rIHRvPXtwcm9kdWN0VXJsfSBvbkNsaWNrPXtjbG9zZVNlYXJjaH0+CiAgICAgICAgICAgICAgICB7aW1hZ2UgJiYgKAogICAgICAgICAgICAgICAgICA8SW1hZ2UKICAgICAgICAgICAgICAgICAgICBhbHQ9e2ltYWdlLmFsdFRleHQgPz8gJyd9CiAgICAgICAgICAgICAgICAgICAgc3JjPXtpbWFnZS51cmx9CiAgICAgICAgICAgICAgICAgICAgd2lkdGg9ezUwfQogICAgICAgICAgICAgICAgICAgIGhlaWdodD17NTB9CiAgICAgICAgICAgICAgICAgIC8+CiAgICAgICAgICAgICAgICApfQogICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgPHA+e3Byb2R1Y3QudGl0bGV9PC9wPgogICAgICAgICAgICAgICAgICA8c21hbGw+Ci0gICAgICAgICAgICAgICAgICAgIHtwcm9kdWN0Py52YXJpYW50cz8ubm9kZXM/LlswXS5wcmljZSAmJiAoCisgICAgICAgICAgICAgICAgICAgIHtwcmljZSAmJiAoCi0gICAgICAgICAgICAgICAgICAgICAgPE1vbmV5IGRhdGE9e3Byb2R1Y3QudmFyaWFudHMubm9kZXNbMF0ucHJpY2V9IC8+CisgICAgICAgICAgICAgICAgICAgICAgPE1vbmV5IGRhdGE9e3ByaWNlfSAvPgogICAgICAgICAgICAgICAgICAgICl9CiAgICAgICAgICAgICAgICAgIDwvc21hbGw+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8L0xpbms+CiAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICApOwogICAgICAgIH0pfQogICAgICA8L3VsPgogICAgPC9kaXY+CiAgKTsKfQpgYGA=" } ] }, { "title": "Refactor ProductItem into a separate component in Skeleton", "pr": "https://github.com/Shopify/hydrogen/pull/2872", "id": "2872" } ], "features": [ { "title": "Add support for CartDeliveryAddresses mutations to CartForm and context.cart", "pr": "https://github.com/Shopify/hydrogen/pull/2850", "id": "2850", "desc": "CartForm and createCartHandler now support `addDeliveryAddresses`, `updateDeliveryAddresses` and `removeDeliveryAddresses`" } ] }, { "title": "Remix routeConfig support, Remix and Vite updates.", "version": "2025.1.3", "hash": "d06cdc0442ac382fa37c3c572f0890499daa0c6d", "commit": "https://github.com/Shopify/hydrogen/pull/2819/commits/d06cdc0442ac382fa37c3c572f0890499daa0c6d", "pr": "https://github.com/Shopify/hydrogen/pull/2819", "dependencies": { "@remix-run/react": "^2.16.1", "@remix-run/server-runtime": "^2.16.1", "@shopify/hydrogen": "2025.1.3", "@shopify/remix-oxygen": "^2.0.12" }, "devDependencies": { "@remix-run/dev": "^2.16.1", "@shopify/cli": "3.77.1", "@shopify/mini-oxygen": "^3.1.2", "@shopify/hydrogen-codegen": "^0.3.3", "@shopify/oxygen-workers-types": "^4.1.6", "vite": "^6.2.1" }, "dependenciesMeta": { "@shopify/cli": { "required": true }, "@remix-run/react": { "required": true }, "@remix-run/server-runtime": { "required": true }, "@remix-run/dev": { "required": true }, "@shopify/mini-oxygen": { "required": true }, "@shopify/remix-oxygen": { "required": true } }, "fixes": [ { "title": "Upgrades Remix to 2.16.1 and Vite to 6.2.0.", "pr": "https://github.com/Shopify/hydrogen/pull/2784", "id": "2784" }, { "title": "Add description and provenance for codegen package.", "pr": "https://github.com/Shopify/hydrogen/pull/2801", "id": "2801" }, { "title": "Updated various smaller dependencies.", "pr": "https://github.com/Shopify/hydrogen/pull/2786", "id": "2786" }, { "title": "Removed unnecessary call to `exchangeAccessToken`.", "pr": "https://github.com/Shopify/hydrogen/pull/2788", "id": "2788" }, { "title": "Fix skeleton template's Typescript.", "pr": "https://github.com/Shopify/hydrogen/pull/2787", "id": "2787" } ], "features": [ { "title": "Add support for `v3_routeConfig` future flag.", "pr": "https://github.com/Shopify/hydrogen/pull/2722", "id": "2722", "docs": "https://remix.run/docs/en/main/start/future-flags#v3_routeconfig", "desc": "", "steps": [ { "title": "Update your `vite.config.ts`.", "code": "ZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29uZmlnKHsKIHBsdWdpbnM6IFsKICAgaHlkcm9nZW4oKSwKICAgb3h5Z2VuKCksCiAgIHJlbWl4KHsKICAgICBwcmVzZXRzOiBbaHlkcm9nZW4udjNwcmVzZXQoKV0sICAvLyBVcGRhdGUgdGhpcyB0byBoeWRyb2dlbi52M3ByZXNldCgpCiAgICAgZnV0dXJlOiB7CiAgICAgICB2M19mZXRjaGVyUGVyc2lzdDogdHJ1ZSwKICAgICAgIHYzX3JlbGF0aXZlU3BsYXRQYXRoOiB0cnVlLAogICAgICAgdjNfdGhyb3dBYm9ydFJlYXNvbjogdHJ1ZSwKICAgICAgIHYzX2xhenlSb3V0ZURpc2NvdmVyeTogdHJ1ZSwKICAgICAgIHYzX3NpbmdsZUZldGNoOiB0cnVlLAogICAgICAgdjNfcm91dGVDb25maWc6IHRydWUsIC8vIGFkZCB0aGlzIGZsYWcKICAgICB9LAogICB9KSwKICAgdHNjb25maWdQYXRocygpLAogXSw=" }, { "title": "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.", "code": "ImRldkRlcGVuZGVuY2llcyI6IHsKICAuLi4KICAiQHJlbWl4LXJ1bi9mcy1yb3V0ZXMiOiAiXjIuMTYuMSIsCiAgIkByZW1peC1ydW4vcm91dGUtY29uZmlnIjogIl4yLjE2LjEiLA==" }, { "title": "Add a `routes.ts` file. This is your new Remix route configuration file.", "code": "aW1wb3J0IHtmbGF0Um91dGVzfSBmcm9tICdAcmVtaXgtcnVuL2ZzLXJvdXRlcyc7CmltcG9ydCB7dHlwZSBSb3V0ZUNvbmZpZ30gZnJvbSAnQHJlbWl4LXJ1bi9yb3V0ZS1jb25maWcnOwppbXBvcnQge2h5ZHJvZ2VuUm91dGVzfSBmcm9tICdAc2hvcGlmeS9oeWRyb2dlbic7CgpleHBvcnQgZGVmYXVsdCBoeWRyb2dlblJvdXRlcyhbCiAgLi4uKGF3YWl0IGZsYXRSb3V0ZXMoKSksCiAgLy8gTWFudWFsIHJvdXRlIGRlZmluaXRpb25zIGNhbiBiZSBhZGRlZCB0byB0aGlzIGFycmF5LCBpbiBhZGRpdGlvbiB0byBvciBpbnN0ZWFkIG9mIHVzaW5nIHRoZSBgZmxhdFJvdXRlc2AgZmlsZS1iYXNlZCByb3V0aW5nIGNvbnZlbnRpb24uCiAgLy8gU2VlIGh0dHBzOi8vcmVtaXgucnVuL2RvY3MvZW4vbWFpbi9ndWlkZXMvcm91dGluZyBmb3IgbW9yZSBkZXRhaWxzCl0pIHNhdGlzZmllcyBSb3V0ZUNvbmZpZzs=" } ] } ] }, { "title": "Shopify CLI update", "version": "2025.1.2", "hash": "ea72e2417483fce0baeb68ac84a7e0b35c36b1ce", "commit": "https://github.com/Shopify/hydrogen/pull/2764/commits/ea72e2417483fce0baeb68ac84a7e0b35c36b1ce", "pr": "https://github.com/Shopify/hydrogen/pull/2764", "dependencies": { "@remix-run/react": "^2.15.3", "@remix-run/server-runtime": "^2.15.3", "@shopify/hydrogen": "2025.1.2", "@shopify/remix-oxygen": "^2.0.11" }, "devDependencies": { "@remix-run/dev": "^2.15.3", "@shopify/cli": "3.75.4", "@shopify/mini-oxygen": "^3.1.1" }, "dependenciesMeta": { "@shopify/cli": { "required": true }, "@remix-run/react": { "required": true }, "@remix-run/server-runtime": { "required": true }, "@remix-run/dev": { "required": true }, "@shopify/mini-oxygen": { "required": true }, "@shopify/remix-oxygen": { "required": true } }, "fixes": [ { "title": "Update @shopify/cli and cli-kit to 3.75.3", "pr": "https://github.com/Shopify/hydrogen/pull/2760", "id": "2760" }, { "title": "Update oxygen-cli to 4.6.10", "pr": "https://github.com/Shopify/hydrogen/pull/2763", "id": "2763" } ], "features": [] }, { "title": "Remix singleFetch, stable B2B methods, ESLint 9, and other fixes", "version": "2025.1.1", "hash": "eca3df8ce1f2fa436476d41730a3da123d65bc2e", "commit": "https://github.com/Shopify/hydrogen/commit/eca3df8ce1f2fa436476d41730a3da123d65bc2e", "pr": "https://github.com/Shopify/hydrogen/pull/2742", "dependencies": { "@remix-run/react": "^2.15.3", "@remix-run/server-runtime": "^2.15.3", "@shopify/hydrogen": "2025.1.1", "@shopify/remix-oxygen": "^2.0.10" }, "devDependencies": { "@remix-run/dev": "^2.15.3", "@shopify/cli": "3.75.3", "@shopify/mini-oxygen": "^3.1.1" }, "dependenciesMeta": { "@shopify/cli": { "required": true }, "@remix-run/react": { "required": true }, "@remix-run/server-runtime": { "required": true }, "@remix-run/dev": { "required": true }, "@shopify/mini-oxygen": { "required": true }, "@shopify/remix-oxygen": { "required": true } }, "fixes": [ { "title": "Upgrade eslint to version 9", "desc": "Upgrade eslint to version 9 and unify eslint config across all packages (with the exception of the skeleton, which still keeps its own config)", "pr": "https://github.com/Shopify/hydrogen/pull/2716", "id": "2716" }, { "title": "Upgrade Remix to 2.15.3", "pr": "https://github.com/Shopify/hydrogen/pull/2740", "id": "2740" } ], "features": [ { "title": "Enable Remix `v3_singleFetch` future flag", "pr": "https://github.com/Shopify/hydrogen/pull/2708", "id": "2708", "docs": "https://remix.run/docs/en/main/guides/single-fetch", "desc": "**Note:** If you have any routes that appends (or looks for) a search param named `_data`, make sure to rename it to something else.", "steps": [ { "title": "In your `vite.config.ts`, add the single fetch future flag", "code": "YGBgZGlmZgorICBkZWNsYXJlIG1vZHVsZSAiQHJlbWl4LXJ1bi9zZXJ2ZXItcnVudGltZSIgeworICAgIGludGVyZmFjZSBGdXR1cmUgeworICAgICB2M19zaW5nbGVGZXRjaDogdHJ1ZTsKKyAgICB9CisgIH0KCiAgZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29uZmlnKHsKICAgIHBsdWdpbnM6IFsKICAgICAgaHlkcm9nZW4oKSwKICAgICAgb3h5Z2VuKCksCiAgICAgIHJlbWl4KHsKICAgICAgICBwcmVzZXRzOiBbaHlkcm9nZW4ucHJlc2V0KCldLAogICAgICAgIGZ1dHVyZTogewogICAgICAgICAgdjNfZmV0Y2hlclBlcnNpc3Q6IHRydWUsCiAgICAgICAgICB2M19yZWxhdGl2ZVNwbGF0UGF0aDogdHJ1ZSwKICAgICAgICAgIHYzX3Rocm93QWJvcnRSZWFzb246IHRydWUsCiAgICAgICAgICB2M19sYXp5Um91dGVEaXNjb3Zlcnk6IHRydWUsCisgICAgICAgICB2M19zaW5nbGVGZXRjaDogdHJ1ZSwKICAgICAgICB9LAogICAgICB9KSwKICAgICAgdHNjb25maWdQYXRocygpLAogICAgXSwKYGBg" }, { "title": "In your `entry.server.tsx`, add `nonce` to the ``", "code": "YGBgZGlmZgpjb25zdCBib2R5ID0gYXdhaXQgcmVuZGVyVG9SZWFkYWJsZVN0cmVhbSgKIDxOb25jZVByb3ZpZGVyPgogICA8UmVtaXhTZXJ2ZXIKICAgICBjb250ZXh0PXtyZW1peENvbnRleHR9CiAgICAgdXJsPXtyZXF1ZXN0LnVybH0KKyAgICAgbm9uY2U9e25vbmNlfQogICAvPgogPC9Ob25jZVByb3ZpZGVyPiwKYGBg" }, { "title": "Update the shouldRevalidate function in root.tsx", "desc": "Defaulting to no revalidation for root loader data to improve performance. When using this feature, you risk your UI getting out of sync with your server. Use with caution. If you are uncomfortable with this optimization, update the return false; to `return defaultShouldRevalidate`; instead", "code": "YGBgZGlmZgpleHBvcnQgY29uc3Qgc2hvdWxkUmV2YWxpZGF0ZTogU2hvdWxkUmV2YWxpZGF0ZUZ1bmN0aW9uID0gKHsKICBmb3JtTWV0aG9kLAogIGN1cnJlbnRVcmwsCiAgbmV4dFVybCwKLSAgZGVmYXVsdFNob3VsZFJldmFsaWRhdGUsCn0pID0+IHsKICAvLyByZXZhbGlkYXRlIHdoZW4gYSBtdXRhdGlvbiBpcyBwZXJmb3JtZWQgZS5nIGFkZCB0byBjYXJ0LCBsb2dpbi4uLgogIGlmIChmb3JtTWV0aG9kICYmIGZvcm1NZXRob2QgIT09ICdHRVQnKSByZXR1cm4gdHJ1ZTsKCiAgLy8gcmV2YWxpZGF0ZSB3aGVuIG1hbnVhbGx5IHJldmFsaWRhdGluZyB2aWEgdXNlUmV2YWxpZGF0b3IKICBpZiAoY3VycmVudFVybC50b1N0cmluZygpID09PSBuZXh0VXJsLnRvU3RyaW5nKCkpIHJldHVybiB0cnVlOwoKLSAgcmV0dXJuIGRlZmF1bHRTaG91bGRSZXZhbGlkYXRlOworICByZXR1cm4gZmFsc2U7Cn07CmBgYA==", "docs": "For more details see: https://remix.run/docs/en/main/route/should-revalidate" }, { "title": "Update `cart.tsx` to add a headers export and update to `data` import usage", "code": "YGBgZGlmZgogICAgaW1wb3J0IHsKICAtICBqc29uLAogICsgIGRhdGEsCiAgICAgIHR5cGUgTG9hZGVyRnVuY3Rpb25BcmdzLAogICAgICB0eXBlIEFjdGlvbkZ1bmN0aW9uQXJncywKICAgICAgdHlwZSBIZWFkZXJzRnVuY3Rpb24KICAgIH0gZnJvbSAnQHNob3BpZnkvcmVtaXgtb3h5Z2VuJzsKICArIGV4cG9ydCBjb25zdCBoZWFkZXJzOiBIZWFkZXJzRnVuY3Rpb24gPSAoe2FjdGlvbkhlYWRlcnN9KSA9PiBhY3Rpb25IZWFkZXJzOwoKICAgIGV4cG9ydCBhc3luYyBmdW5jdGlvbiBhY3Rpb24oe3JlcXVlc3QsIGNvbnRleHR9OiBBY3Rpb25GdW5jdGlvbkFyZ3MpIHsKICAgICAgLi4uCiAgLSAgIHJldHVybiBqc29uKAogICsgICByZXR1cm4gZGF0YSgKICAgICAgICB7CiAgICAgICAgICBjYXJ0OiBjYXJ0UmVzdWx0LAogICAgICAgICAgZXJyb3JzLAogICAgICAgICAgd2FybmluZ3MsCiAgICAgICAgICBhbmFseXRpY3M6IHsKICAgICAgICAgICAgY2FydElkLAogICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIHtzdGF0dXMsIGhlYWRlcnN9LAogICAgICApOwogICAgfQoKICAgIGV4cG9ydCBhc3luYyBmdW5jdGlvbiBsb2FkZXIoe2NvbnRleHR9OiBMb2FkZXJGdW5jdGlvbkFyZ3MpIHsKICAgICAgY29uc3Qge2NhcnR9ID0gY29udGV4dDsKIC0gICAgcmV0dXJuIGpzb24oYXdhaXQgY2FydC5nZXQoKSk7CiArICAgIHJldHVybiBhd2FpdCBjYXJ0LmdldCgpOwogICAgfQogYGBg" }, { "title": "Deprecate `json` and `defer` import usage from `@shopify/remix-oxygen`", "desc": "Remove `json()`/`defer()` in favor of raw objects. Single Fetch supports JSON objects and Promises out of the box, so you can return the raw data from your loader/action functions:", "code": "YGBgZGlmZgotIGltcG9ydCB7anNvbn0gZnJvbSAiQHNob3BpZnkvcmVtaXgtb3h5Z2VuIjsKCiAgZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRlcih7fTogTG9hZGVyRnVuY3Rpb25BcmdzKSB7CiAgICBsZXQgdGFza3MgPSBhd2FpdCBmZXRjaFRhc2tzKCk7Ci0gICByZXR1cm4ganNvbih0YXNrcyk7CisgICByZXR1cm4gdGFza3M7CiAgfQpgYGAKCmBgYGRpZmYKLSBpbXBvcnQge2RlZmVyfSBmcm9tICJAc2hvcGlmeS9yZW1peC1veHlnZW4iOwoKICBleHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZGVyKHt9OiBMb2FkZXJGdW5jdGlvbkFyZ3MpIHsKICAgIGxldCBsYXp5U3R1ZmYgPSBmZXRjaExhenlTdHVmZigpOwogICAgbGV0IHRhc2tzID0gYXdhaXQgZmV0Y2hUYXNrcygpOwotICAgcmV0dXJuIGRlZmVyKHsgdGFza3MsIGxhenlTdHVmZiB9KTsKKyAgIHJldHVybiB7IHRhc2tzLCBsYXp5U3R1ZmYgfTsKICB9CmBgYAo=" }, { "title": "If you were using the second parameter of json/defer to set a custom status or headers on your response, you can continue doing so via the new data API:", "code": "YGBgZGlmZgotICBpbXBvcnQge2pzb259IGZyb20gIkBzaG9waWZ5L3JlbWl4LW94eWdlbiI7CisgIGltcG9ydCB7ZGF0YSwgdHlwZSBIZWFkZXJzRnVuY3Rpb259IGZyb20gIkBzaG9waWZ5L3JlbWl4LW94eWdlbiI7CgorICAvKioKKyAgICogSWYgeW91ciBsb2FkZXIgb3IgYWN0aW9uIGlzIHJldHVybmluZyBhIHJlc3BvbnNlIHdpdGggaGVhZGVycywKKyAgICogbWFrZSBzdXJlIHRvIGV4cG9ydCBhIGhlYWRlcnMgZnVuY3Rpb24gdGhhdCBtZXJnZXMgeW91ciBoZWFkZXJzCisgICAqIG9uIHlvdXIgcm91dGUuIE90aGVyd2lzZSwgeW91ciBoZWFkZXJzIG1heSBiZSBsb3N0LgorICAgKiBSZW1peCBkb2M6IGh0dHBzOi8vcmVtaXgucnVuL2RvY3MvZW4vbWFpbi9yb3V0ZS9oZWFkZXJzCisgICAqKi8KKyAgZXhwb3J0IGNvbnN0IGhlYWRlcnM6IEhlYWRlcnNGdW5jdGlvbiA9ICh7bG9hZGVySGVhZGVyc30pID0+IGxvYWRlckhlYWRlcnM7CgogIGV4cG9ydCBhc3luYyBmdW5jdGlvbiBsb2FkZXIoe306IExvYWRlckZ1bmN0aW9uQXJncykgewogICAgbGV0IHRhc2tzID0gYXdhaXQgZmV0Y2hUYXNrcygpOwotICAgIHJldHVybiBqc29uKHRhc2tzLCB7CisgICAgcmV0dXJuIGRhdGEodGFza3MsIHsKICAgICAgaGVhZGVyczogewogICAgICAgICJDYWNoZS1Db250cm9sIjogInB1YmxpYywgbWF4LWFnZT02MDQ4MDAiCiAgICAgIH0KICAgIH0pOwogIH0KYGBgCg==" }, { "title": "If you are using legacy customer account flow or multipass, there are a couple more files that requires updating:", "desc": "In `root.tsx` and `routes/account.tsx`, add a `headers` export for `loaderHeaders`", "code": "YGBgZGlmZgorIGV4cG9ydCBjb25zdCBoZWFkZXJzOiBIZWFkZXJzRnVuY3Rpb24gPSAoe2xvYWRlckhlYWRlcnN9KSA9PiBsb2FkZXJIZWFkZXJzOwpgYGAK" }, { "title": "In `routes/account_.register.tsx`, add a `headers` export for `actionHeaders`", "code": "YGBgZGlmZgorIGV4cG9ydCBjb25zdCBoZWFkZXJzOiBIZWFkZXJzRnVuY3Rpb24gPSAoe2FjdGlvbkhlYWRlcnN9KSA9PiBhY3Rpb25IZWFkZXJzOwpgYGAK" }, { "title": "If you are using multipass, in `routes/account_.login.multipass.tsx`", "desc": "Export `headers` for `actionHeaders`", "code": "YGBgZGlmZgorIGV4cG9ydCBjb25zdCBoZWFkZXJzOiBIZWFkZXJzRnVuY3Rpb24gPSAoe2FjdGlvbkhlYWRlcnN9KSA9PiBhY3Rpb25IZWFkZXJzOwpgYGAK" }, { "title": "Update all `json` response wrapper to `remixData`", "code": "YGBgZGlmZgppbXBvcnQgewotIGpzb24sCisgZGF0YSBhcyByZW1peERhdGEsCn0gZnJvbSAnQHNob3BpZnkvcmVtaXgtb3h5Z2VuJzsKCi0gIHJldHVybiBqc29uKAorICByZXR1cm4gcmVtaXhEYXRhKAogICAgLi4uCiAgKTsKYGBg" } ] }, { "title": "B2B methods and props are now stable", "desc": "Warnings are in place for unstable usages and will be removed completely in the next major version", "pr": "https://github.com/Shopify/hydrogen/pull/2736", "id": "2736", "steps": [ { "title": "Search for anywhere using `UNSTABLE_getBuyer` and `UNSTABLE_setBuyer` is update accordingly", "code": "YGBgZGlmZgotIGN1c3RvbWVyQWNjb3VudC5VTlNUQUJMRV9nZXRCdXllcigpOworIGN1c3RvbWVyQWNjb3VudC5nZXRCdXllcigpCgotIGN1c3RvbWVyQWNjb3VudC5VTlNUQUJMRV9zZXRCdXllcih7CisgY3VzdG9tZXJBY2NvdW50LnNldEJ1eWVyKHsKICAgIGNvbXBhbnlMb2NhdGlvbklkLAogIH0pOwpgYGA=" }, { "title": "Update `createHydrogenContext` to remove the `unstableB2b` option", "code": "YGBgZGlmZgogIGNvbnN0IGh5ZHJvZ2VuQ29udGV4dCA9IGNyZWF0ZUh5ZHJvZ2VuQ29udGV4dCh7CiAgICBlbnYsCiAgICByZXF1ZXN0LAogICAgY2FjaGUsCiAgICB3YWl0VW50aWwsCiAgICBzZXNzaW9uLAogICAgaTE4bjoge2xhbmd1YWdlOiAnRU4nLCBjb3VudHJ5OiAnVVMnfSwKLSAgICBjdXN0b21lckFjY291bnQ6IHsKLSAgICAgIHVuc3RhYmxlQjJiOiB0cnVlLAotICAgIH0sCiAgICBjYXJ0OiB7CiAgICAgIHF1ZXJ5RnJhZ21lbnQ6IENBUlRfUVVFUllfRlJBR01FTlQsCiAgICB9LAogIH0pOwpgYGA=" } ] }, { "title": "Update `getProductOptions` to handle divergent product options", "pr": "https://github.com/Shopify/hydrogen/pull/2747", "id": "2747" }, { "title": "Add `language` support to `createCustomerAccountClient` and `createHydrogenContext`", "desc": "Added the ability to optionally provide `language` data to `createCustomerAccountClient`, and automatically pass it down to it from `createHydrogenContext`", "pr": "https://github.com/Shopify/hydrogen/pull/2746", "id": "2746", "steps": [ { "title": "If present, the provided `language` will be used to set the `uilocales` property in the Customer Account API request. This will allow the API to return localized data for the provided language.", "code": "YGBgdHMKLy8gT3B0aW9uYWw6IHByb3ZpZGUgbGFuZ3VhZ2UgZGF0YSB0byB0aGUgY29uc3RydWN0b3IKY29uc3QgY3VzdG9tZXJBY2NvdW50ID0gY3JlYXRlQ3VzdG9tZXJBY2NvdW50Q2xpZW50KHsKICAvLyAuLi4KICBsYW5ndWFnZSwKfSk7CmBgYA==" }, { "title": "Calls to `login()` will use the provided `language` without having to pass it explicitly via `uiLocales`; however, if the `login()` method is already using its `uilocales` property, the `language` parameter coming from the context/constructor will be ignored. If nothing is explicitly passed, `login()` will default to `context.i18n.language`.", "code": "YGBgdHMKZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRlcih7cmVxdWVzdCwgY29udGV4dH06IExvYWRlckZ1bmN0aW9uQXJncykgewogIHJldHVybiBjb250ZXh0LmN1c3RvbWVyQWNjb3VudC5sb2dpbih7CiAgICB1aUxvY2FsZXM6ICdGUicsIC8vIHdpbGwgYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSBvbmUgY29taW5nIGZyb20gdGhlIGNvbnRleHQKICB9KTsKfQpgYGA=" } ] } ] }, { "title": "Remix v3_lazyRouteDiscovery future flag, various bug fixes and package version bumps.", "version": "2025.1.0", "hash": "7df8c2076a829d29cb5c0b0276729ddc7d0d4630", "pr": "https://github.com/Shopify/hydrogen/pull/2700", "commit": "https://github.com/Shopify/hydrogen/commit/7df8c2076a829d29cb5c0b0276729ddc7d0d4630", "dependencies": { "@remix-run/react": "^2.15.2", "@remix-run/server-runtime": "^2.15.2", "@shopify/hydrogen": "2025.1.0", "@shopify/remix-oxygen": "^2.0.10" }, "devDependencies": { "@remix-run/dev": "^2.15.2", "@shopify/cli": "3.74.1", "@shopify/mini-oxygen": "^3.1.1" }, "dependenciesMeta": { "@shopify/cli": { "required": true }, "@remix-run/react": { "required": true }, "@remix-run/server-runtime": { "required": true }, "@remix-run/dev": { "required": true }, "@shopify/mini-oxygen": { "required": true }, "@shopify/remix-oxygen": { "required": true } }, "fixes": [ { "title": "Update to Storefront API 2025-01", "pr": "https://github.com/Shopify/hydrogen/pull/2715", "id": "2715" }, { "title": "Workaround for \"Error: failed to execute 'insertBefore' on 'Node'\" that sometimes happen during development.", "pr": "https://github.com/Shopify/hydrogen/pull/2710", "id": "2710", "steps": [ { "title": "Update your root.tsx so that your style link tags are actual html link tags", "code": "YGBgZGlmZgovLyByb290LnRzeAoKLyoqCiAqIFRoZSBtYWluIGFuZCByZXNldCBzdHlsZXNoZWV0cyBhcmUgYWRkZWQgaW4gdGhlIExheW91dCBjb21wb25lbnQKICogdG8gcHJldmVudCBhIGJ1ZyBpbiBkZXZlbG9wbWVudCBITVIgdXBkYXRlcy4KICoKICogVGhpcyBhdm9pZHMgdGhlICJmYWlsZWQgdG8gZXhlY3V0ZSAnaW5zZXJ0QmVmb3JlJyBvbiAnTm9kZSciIGVycm9yCiAqIHRoYXQgb2NjdXJzIGFmdGVyIGVkaXRpbmcgYW5kIG5hdmlnYXRpbmcgdG8gYW5vdGhlciBwYWdlLgogKgogKiBJdCdzIGEgdGVtcG9yYXJ5IGZpeCB1bnRpbCB0aGUgaXNzdWUgaXMgcmVzb2x2ZWQuCiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9yZW1peC1ydW4vcmVtaXgvaXNzdWVzLzkyNDIKICovCmV4cG9ydCBmdW5jdGlvbiBsaW5rcygpIHsKICByZXR1cm4gWwotICAgIHtyZWw6ICdzdHlsZXNoZWV0JywgaHJlZjogcmVzZXRTdHlsZXN9LAotICAgIHtyZWw6ICdzdHlsZXNoZWV0JywgaHJlZjogYXBwU3R5bGVzfSwKICAgIHsKICAgICAgcmVsOiAncHJlY29ubmVjdCcsCiAgICAgIGhyZWY6ICdodHRwczovL2Nkbi5zaG9waWZ5LmNvbScsCiAgICB9LAogICAgewogICAgICByZWw6ICdwcmVjb25uZWN0JywKICAgICAgaHJlZjogJ2h0dHBzOi8vc2hvcC5hcHAnLAogICAgfSwKICAgIHtyZWw6ICdpY29uJywgdHlwZTogJ2ltYWdlL3N2Zyt4bWwnLCBocmVmOiBmYXZpY29ufSwKICBdOwp9CgouLi4KCmV4cG9ydCBmdW5jdGlvbiBMYXlvdXQoe2NoaWxkcmVufToge2NoaWxkcmVuPzogUmVhY3QuUmVhY3ROb2RlfSkgewogIGNvbnN0IG5vbmNlID0gdXNlTm9uY2UoKTsKICBjb25zdCBkYXRhID0gdXNlUm91dGVMb2FkZXJEYXRhPFJvb3RMb2FkZXI+KCdyb290Jyk7CgogIHJldHVybiAoCiAgICA8aHRtbCBsYW5nPSJlbiI+CiAgICAgIDxoZWFkPgogICAgICAgIDxtZXRhIGNoYXJTZXQ9InV0Zi04IiAvPgogICAgICAgIDxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsaW5pdGlhbC1zY2FsZT0xIiAvPgorICAgICAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9e3Jlc2V0U3R5bGVzfT48L2xpbms+CisgICAgICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj17YXBwU3R5bGVzfT48L2xpbms+CgpgYGA=" } ] }, { "title": "Bump Remix, vite, and Tailwind v4 alpha to v4 beta.", "pr": "https://github.com/Shopify/hydrogen/pull/2696", "id": "2696" }, { "title": "Fix image size warnings on collections page.", "pr": "https://github.com/Shopify/hydrogen/pull/2730", "id": "2730" }, { "title": "Bump Shopify cli version.", "pr": "https://github.com/Shopify/hydrogen/pull/2732", "id": "2732" }, { "title": "Bump undici version.", "pr": "https://github.com/Shopify/hydrogen/pull/2731", "id": "2731" }, { "title": "Update decodeEncodedVariant utility to fix bug if encoding ends with index.", "pr": "https://github.com/Shopify/hydrogen/pull/2721", "id": "2721" }, { "title": "Fix getProductOptions crashing when one of variants returns a null firstSelectableVariant.", "pr": "https://github.com/Shopify/hydrogen/pull/2704", "id": "2704" }, { "title": "Remove deprecated customerAccountUrl.", "pr": "https://github.com/Shopify/hydrogen/pull/2730", "id": "2730" }, { "title": "Make sure tailwind stylesheet is generated in a style tag.", "pr": "https://github.com/Shopify/hydrogen/pull/2734", "id": "2734" } ], "features": [ { "title": "Turn on Remix future flag v3_lazyRouteDiscovery", "pr": "https://github.com/Shopify/hydrogen/pull/2702", "id": "2702", "steps": [ { "title": "Add the following line to your vite.config.ts and test your app.", "code": "YGBgZGlmZgpleHBvcnQgZGVmYXVsdCBkZWZpbmVDb25maWcoewogIHBsdWdpbnM6IFsKICAgIGh5ZHJvZ2VuKCksCiAgICBveHlnZW4oKSwKICAgIHJlbWl4KHsKICAgICAgcHJlc2V0czogW2h5ZHJvZ2VuLnByZXNldCgpXSwKICAgICAgZnV0dXJlOiB7CiAgICAgICAgdjNfZmV0Y2hlclBlcnNpc3Q6IHRydWUsCiAgICAgICAgdjNfcmVsYXRpdmVTcGxhdFBhdGg6IHRydWUsCiAgICAgICAgdjNfdGhyb3dBYm9ydFJlYXNvbjogdHJ1ZSwKKyAgICAgICAgdjNfbGF6eVJvdXRlRGlzY292ZXJ5OiB0cnVlLAogICAgICB9LAogICAgfSksCiAgICB0c2NvbmZpZ1BhdGhzKCksCiAgXSwKYGBg" } ] } ] }, { "title": "New Shopify cookie system and analytics improvements", "version": "2024.10.2", "date": "2026-01-14", "hash": "d1aac68acbb53c875acf94788b91c38a009e24f2", "commit": "https://github.com/Shopify/hydrogen/commit/d1aac68acbb53c875acf94788b91c38a009e24f2", "pr": "https://github.com/Shopify/hydrogen/pull/3375", "dependencies": { "@shopify/hydrogen": "2024.10.2" }, "devDependencies": {}, "fixes": [ { "title": "Fix Privacy Banner and analytics event issues", "info": "Fixed irregular behaviors between Privacy Banner and Hydrogen's analytics events.", "pr": "https://github.com/Shopify/hydrogen/pull/3342", "id": "3342-privacy" } ], "features": [ { "title": "Migrate to Shopify's new cookie system", "info": "Hydrogen now supports Shopify's new `_shopify_analytics` and `_shopify_marketing` http-only cookies while keeping the deprecated `_shopify_y` and `_shopify_s` cookies working as long as they remain active. This keeps analytics and privacy behavior aligned with Shopify Admin while preserving backward compatibility.", "breaking": false, "steps": [ { "title": "Understand the new cookie model and compatibility story", "info": "Shopify is deprecating `_shopify_y` and `_shopify_s` in favor of `_shopify_analytics` and `_shopify_marketing`, which are http-only cookies set via the Storefront API on your storefront domain. Hydrogen now reads and writes these cookies through a Storefront API proxy while still honoring the legacy cookies when present. You don't need to migrate values manually, but you must ensure that requests flow through the proxy so cookies are set before analytics run." }, { "title": "Set up a Storefront API proxy for your deployment", "info": "Depending on how you host your app, you must ensure Storefront API calls go through a proxy on your storefront domain.", "code": "IyMjIFJlbWl4ICsgSHlkcm9nZW4gb24gT3h5Z2VuCgpJZiB5b3Ugc2NhZmZvbGRlZCBmcm9tIHRoZSBkZWZhdWx0IEh5ZHJvZ2VuIHNrZWxldG9uIGFuZCBkZXBsb3kgdG8gT3h5Z2VuLCB0aGUgYGNyZWF0ZVJlcXVlc3RIYW5kbGVyYCB1dGlsaXR5IGZyb20gYEBzaG9waWZ5L3JlbWl4LW94eWdlbmAgYWxyZWFkeSBzZXRzIHVwIGEgU3RvcmVmcm9udCBBUEkgcHJveHkgb24gdGhlIHNhbWUgZG9tYWluIGFzIHlvdXIgc3RvcmVmcm9udC4KCioqSW4gbW9zdCBjYXNlcywgbm8gY2hhbmdlcyBhcmUgcmVxdWlyZWQqKjsganVzdCBjb25maXJtIHlvdXIgc2VydmVyIGVudHJ5IHN0aWxsIHVzZXMgaXQ6CgpgYGB0cwovLyBzZXJ2ZXIudHMgKE94eWdlbikKaW1wb3J0IHtjcmVhdGVSZXF1ZXN0SGFuZGxlcn0gZnJvbSAnQHNob3BpZnkvcmVtaXgtb3h5Z2VuJzsKaW1wb3J0IHtjcmVhdGVIeWRyb2dlbkNvbnRleHR9IGZyb20gJ0BzaG9waWZ5L2h5ZHJvZ2VuJzsKCmV4cG9ydCBkZWZhdWx0IHsKICBhc3luYyBmZXRjaChyZXF1ZXN0LCBlbnYpIHsKICAgIGNvbnN0IGh5ZHJvZ2VuQ29udGV4dCA9IGNyZWF0ZUh5ZHJvZ2VuQ29udGV4dCh7CiAgICAgIGVudiwKICAgICAgcmVxdWVzdCwKICAgICAgLyogLi4uICovCiAgICB9KTsKCiAgICBjb25zdCBoYW5kbGVSZXF1ZXN0ID0gY3JlYXRlUmVxdWVzdEhhbmRsZXIoewogICAgICAvKiAuLi4gKi8KICAgICAgZ2V0TG9hZENvbnRleHQ6ICgpID0+IGh5ZHJvZ2VuQ29udGV4dCwKICAgIH0pOwoKICAgIHJldHVybiBoYW5kbGVSZXF1ZXN0KHJlcXVlc3QpOwogIH0sCn07CmBgYAoKS2VlcCB1c2luZyBgPEFuYWx5dGljcy5Qcm92aWRlcj5gIGNvbXBvbmVudCBvciBgdXNlQ3VzdG9tZXJQcml2YWN5YCBob29rIHRvIGdldCBjb29raWVzIGluIHRoZSBicm93c2VyIGF1dG9tYXRpY2FsbHkuCgpGb3IgYSBmdWxsIGV4YW1wbGUsIHJlZmVyIHRvIHlvdXIgc2tlbGV0b24gdGVtcGxhdGUncyBzZXJ2ZXIudHMuCgojIyMgUmVtaXggKyBIeWRyb2dlbiBvbiBvdGhlciBob3N0cwoKIyMjIyBIb3N0cyB0aGF0IHN1cHBvcnQgV2ViIEZldGNoIEFQSSAoUmVxdWVzdC9SZXNwb25zZSkKCk9uIGhvc3RzIHRoYXQgc3VwcG9ydCB0aGUgc3RhbmRhcmQgV2ViIEZldGNoIEFQSSAoV29ya2Vycy1zdHlsZSBlbnZpcm9ubWVudHMpLCBpbXBvcnQgYGNyZWF0ZVJlcXVlc3RIYW5kbGVyYCBmcm9tIGBAc2hvcGlmeS9oeWRyb2dlbmAgYW5kIHJvdXRlIHJlcXVlc3RzIHRocm91Z2ggaXQ6CgpgYGB0cwppbXBvcnQge2NyZWF0ZVJlcXVlc3RIYW5kbGVyLCBjcmVhdGVIeWRyb2dlbkNvbnRleHR9IGZyb20gJ0BzaG9waWZ5L2h5ZHJvZ2VuJzsKCmNvbnN0IGh5ZHJvZ2VuQ29udGV4dCA9IGNyZWF0ZUh5ZHJvZ2VuQ29udGV4dCh7CiAgLyogLi4uICovCn0pOwoKY29uc3QgaGFuZGxlUmVxdWVzdCA9IGNyZWF0ZVJlcXVlc3RIYW5kbGVyKHsKICAvKiAuLi4gKi8KICBnZXRMb2FkQ29udGV4dDogKCkgPT4gaHlkcm9nZW5Db250ZXh0LAp9KTsKYGBgCgojIyMjIE5vZGUuanMgYW5kIG90aGVyIGhvc3RzCgpGb3IgTm9kZS1saWtlIGVudmlyb25tZW50cywgYWRhcHQgTm9kZSByZXF1ZXN0cyB0byBGZXRjaCB3aXRoIFtgQHJlbWl4LXJ1bi9ub2RlLWZldGNoLXNlcnZlcmBdKGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL0ByZW1peC1ydW4vbm9kZS1mZXRjaC1zZXJ2ZXIpLCB0aGVuIGRlbGVnYXRlIHRvIEh5ZHJvZ2VuJ3MgaGFuZGxlcjoKCmBgYHRzCmltcG9ydCB7Y3JlYXRlUmVxdWVzdEhhbmRsZXIsIGNyZWF0ZUh5ZHJvZ2VuQ29udGV4dH0gZnJvbSAnQHNob3BpZnkvaHlkcm9nZW4nOwppbXBvcnQge2NyZWF0ZVJlcXVlc3RMaXN0ZW5lcn0gZnJvbSAnQHJlbWl4LXJ1bi9ub2RlLWZldGNoLXNlcnZlcic7CmltcG9ydCBodHRwIGZyb20gJ2h0dHAnOwoKY29uc3QgaGFuZGxlTm9kZVJlcXVlc3QgPSBjcmVhdGVSZXF1ZXN0TGlzdGVuZXIoKHJlcXVlc3QpID0+IHsKICBjb25zdCBoeWRyb2dlbkNvbnRleHQgPSBjcmVhdGVIeWRyb2dlbkNvbnRleHQoewogICAgLyogLi4uICovCiAgfSk7CgogIGNvbnN0IGhhbmRsZVdlYlJlcXVlc3QgPSBjcmVhdGVSZXF1ZXN0SGFuZGxlcih7CiAgICAvKiAuLi4gKi8KICAgIGdldExvYWRDb250ZXh0OiAoKSA9PiBoeWRyb2dlbkNvbnRleHQsCiAgfSk7CgogIHJldHVybiBoYW5kbGVXZWJSZXF1ZXN0KHJlcXVlc3QpOwp9KTsKCmh0dHAuY3JlYXRlU2VydmVyKGhhbmRsZU5vZGVSZXF1ZXN0KTsKYGBgCgpBbHRlcm5hdGl2ZWx5LCBpZiB5b3UgY2FuJ3QgZGVsZWdhdGUgdG8gSHlkcm9nZW4ncyBgY3JlYXRlUmVxdWVzdEhhbmRsZXJgLCB5b3UgY2FuIHByb3ZpZGUgYSBjdXN0b20gU3RvcmVmcm9udCBBUEkgcHJveHkgaW4geW91ciBzZXJ2ZXIuIFNlZSBbSHlkcm9nZW4ncyBpbXBsZW1lbnRhdGlvbl0oaHR0cHM6Ly9naXRodWIuY29tL1Nob3BpZnkvaHlkcm9nZW4vYmxvYi8yNzA2NmEyODU3NzQ4NGY0MDYyMjIxMTZhOTU5ZWI0NjNkMjU1Njg1L3BhY2thZ2VzL2h5ZHJvZ2VuL3NyYy9zdG9yZWZyb250LnRzI0w1NDYtTDYxMSkgYXMgYSByZWZlcmVuY2UuIEluIHRoaXMgY2FzZSwgZW5zdXJlIHlvdSBtYW51YWxseSBwYXNzIGBzYW1lRG9tYWluRm9yU3RvcmVmcm9udEFwaTogdHJ1ZWAgaW4gdGhlIGBjb25zZW50YCBvYmplY3QgZm9yIGA8QW5hbHl0aWNzLlByb3ZpZGVyPmAgb3IgYXMgYSBwcm9wIHRvIHRoZSBgdXNlQ3VzdG9tZXJQcml2YWN5YCBob29rLgo=" } ], "pr": "https://github.com/Shopify/hydrogen/pull/3342", "id": "3342" } ] }, { "title": "Support for 2,000 variants and combined listings", "version": "2024.10.1", "hash": "c915b67d81ff01e25eeefce8cf0510805d620d64", "pr": "https://github.com/Shopify/hydrogen/pull/2657", "commit": "https://github.com/Shopify/hydrogen/commit/c915b67d81ff01e25eeefce8cf0510805d620d64", "dependencies": { "@remix-run/react": "^2.13.1", "@remix-run/server-runtime": "^2.13.1", "@shopify/hydrogen": "2024.10.1", "@shopify/remix-oxygen": "^2.0.9" }, "devDependencies": { "@remix-run/dev": "^2.13.1", "@shopify/cli": "~3.73.0" }, "dependenciesMeta": { "typescript": { "required": true }, "@shopify/oxygen-workers-types": { "required": true }, "@shopify/cli": { "required": true }, "@remix-run/server-runtime": { "required": true } }, "fixes": [ { "title": "Support multiple components on a single page", "pr": "https://github.com/Shopify/hydrogen/pull/2649", "id": "2649" }, { "title": "Allow the default login and authorize path to be overridden", "pr": "https://github.com/Shopify/hydrogen/pull/2648", "id": "2648" }, { "title": " sets the url search param when landing on a product page", "pr": "https://github.com/Shopify/hydrogen/pull/2665", "id": "2665" }, { "title": "Hydrogen deployment contains Hydrogen meta data", "pr": "https://github.com/Shopify/hydrogen/pull/2645", "id": "2645" } ], "features": [ { "title": "Support combined listing and 2k variant", "pr": "https://github.com/Shopify/hydrogen/pull/2659", "id": "2659" } ] }, { "title": "SFAPI 2024.10, Cart mutation warnings, improved createWithCache, sitemap API stabilization, deprecations", "version": "2024.10.0", "hash": "845a7f61c87b5bbbffe7076814f0413163f72e72", "pr": "https://github.com/Shopify/hydrogen/pull/2612", "commit": "https://github.com/Shopify/hydrogen/commit/845a7f61c87b5bbbffe7076814f0413163f72e72", "dependencies": { "@remix-run/react": "^2.13.1", "@remix-run/server-runtime": "^2.13.1", "@shopify/hydrogen": "2024.10.0", "@shopify/remix-oxygen": "^2.0.9" }, "devDependencies": { "@remix-run/dev": "^2.13.1", "@shopify/cli": "~3.69.4", "@shopify/hydrogen-codegen": "^0.3.2", "@shopify/mini-oxygen": "^3.1.0" }, "dependenciesMeta": { "typescript": { "required": true }, "@shopify/oxygen-workers-types": { "required": true }, "@shopify/cli": { "required": true }, "@remix-run/server-runtime": { "required": true }, "@shopify/mini-oxygen": { "required": true } }, "fixes": [ { "title": "Add warnings to the Shopify CLI when your app uses reserved routes", "pr": "https://github.com/Shopify/hydrogen/pull/2613", "id": "2613" }, { "title": "Remove deprecated --worker cli flag", "pr": "https://github.com/Shopify/hydrogen/pull/2603", "id": "2603" }, { "title": "Remove deprecated code usage for priceV2 and compareAtPriceV2. Remove export for getCustomerPrivacy.", "pr": "https://github.com/Shopify/hydrogen/pull/2601", "id": "2601" }, { "title": "Make set up cookie banner by default to false", "pr": "https://github.com/Shopify/hydrogen/pull/2588", "id": "2588", "steps": [ { "title": "If you are using Shopify's cookie banner to handle user consent in your app, you need to set `withPrivacyBanner: true` to the consent config. Without this update, the Shopify cookie banner will not appear.", "code": "YGBgZGlmZgogIHJldHVybiBkZWZlcih7CiAgICAuLi4KICAgIGNvbnNlbnQ6IHsKICAgICAgY2hlY2tvdXREb21haW46IGVudi5QVUJMSUNfQ0hFQ0tPVVRfRE9NQUlOLAogICAgICBzdG9yZWZyb250QWNjZXNzVG9rZW46IGVudi5QVUJMSUNfU1RPUkVGUk9OVF9BUElfVE9LRU4sCisgICAgICB3aXRoUHJpdmFjeUJhbm5lcjogdHJ1ZSwKICAgICAgLy8gbG9jYWxpemUgdGhlIHByaXZhY3kgYmFubmVyCiAgICAgIGNvdW50cnk6IGFyZ3MuY29udGV4dC5zdG9yZWZyb250LmkxOG4uY291bnRyeSwKICAgICAgbGFuZ3VhZ2U6IGFyZ3MuY29udGV4dC5zdG9yZWZyb250LmkxOG4ubGFuZ3VhZ2UsCiAgICB9LAogIH0pOwpgYGAK" } ] }, { "title": "Deprecate usages of product.options.values and use product.options.optionValues instead", "pr": "https://github.com/Shopify/hydrogen/pull/2585", "id": "2585", "steps": [ { "title": "Update your product graphql query to use the new `optionValues` field", "code": "YGBgZGlmZgogIGNvbnN0IFBST0RVQ1RfRlJBR01FTlQgPSBgI2dyYXBocWwKICAgIGZyYWdtZW50IFByb2R1Y3Qgb24gUHJvZHVjdCB7CiAgICAgIGlkCiAgICAgIHRpdGxlCiAgICAgIG9wdGlvbnMgewogICAgICAgIG5hbWUKLSAgICAgICAgdmFsdWVzCisgICAgICAgIG9wdGlvblZhbHVlcyB7CisgICAgICAgICAgbmFtZQorICAgICAgICB9CiAgICAgIH0KYGBgCg==" }, { "title": "Update your `` to use the new `optionValues` field", "code": "YGBgZGlmZgogIDxWYXJpYW50U2VsZWN0b3IKICAgIGhhbmRsZT17cHJvZHVjdC5oYW5kbGV9Ci0gICAgb3B0aW9ucz17cHJvZHVjdC5vcHRpb25zLmZpbHRlcigob3B0aW9uKSA9PiBvcHRpb24udmFsdWVzLmxlbmd0aCA+IDEpfQorICAgIG9wdGlvbnM9e3Byb2R1Y3Qub3B0aW9ucy5maWx0ZXIoKG9wdGlvbikgPT4gb3B0aW9uLm9wdGlvblZhbHVlcy5sZW5ndGggPiAxKX0KICAgIHZhcmlhbnRzPXt2YXJpYW50c30KICA+CmBgYAo=" } ] }, { "title": "Update all cart mutation methods from createCartHandler to return cart warnings", "pr": "https://github.com/Shopify/hydrogen/pull/2572", "id": "2572", "steps": [ { "title": "Check warnings for stock levels", "docs": "https://shopify.dev/changelog/cart-warnings-in-storefront-api-cart", "desc": "As of API version 2024-10, inventory errors about stock levels will no longer be included in the `userErrors` of cart mutations. Inventory errors will now be available in a new return field `warnings` and will contain explicit code values of `MERCHANDISE_NOT_ENOUGH_STOCK`` or MERCHANDISE_OUT_OF_STOCK`." } ] }, { "title": "Update createWithCache to make it harder to accidentally cache undesired results", "pr": "https://github.com/Shopify/hydrogen/pull/2546", "id": "2546", "steps": [ { "title": "request is now a mandatory prop when initializing createWithCache.", "code": "YGBgZGlmZgovLyBzZXJ2ZXIudHMKZXhwb3J0IGRlZmF1bHQgewogIGFzeW5jIGZldGNoKAogICAgcmVxdWVzdDogUmVxdWVzdCwKICAgIGVudjogRW52LAogICAgZXhlY3V0aW9uQ29udGV4dDogRXhlY3V0aW9uQ29udGV4dCwKICApOiBQcm9taXNlPFJlc3BvbnNlPiB7CiAgICB0cnkgewogICAgICAvLyAuLi4KLSAgICAgY29uc3Qgd2l0aENhY2hlID0gY3JlYXRlV2l0aENhY2hlKHtjYWNoZSwgd2FpdFVudGlsfSk7CisgICAgIGNvbnN0IHdpdGhDYWNoZSA9IGNyZWF0ZVdpdGhDYWNoZSh7Y2FjaGUsIHdhaXRVbnRpbCwgcmVxdWVzdH0pOwpgYGAK" }, { "title": "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).", "code": "YGBgdHMKICBjb25zdCB3aXRoQ2FjaGUgPSBjcmVhdGVXaXRoQ2FjaGUoe2NhY2hlLCB3YWl0VW50aWwsIHJlcXVlc3R9KTsKCiAgY29uc3Qge2RhdGEsIHJlc3BvbnNlfSA9IGF3YWl0IHdpdGhDYWNoZS5mZXRjaDx7ZGF0YTogVDsgZXJyb3I6IHN0cmluZ30+KAogICAgJ215LWNtcy5jb20vYXBpJywKICAgIHsKICAgICAgbWV0aG9kOiAnUE9TVCcsCiAgICAgIGhlYWRlcnM6IHsnQ29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nfSwKICAgICAgYm9keSwKICAgIH0sCiAgICB7CiAgICAgIGNhY2hlU3RyYXRlZ3k6IENhY2hlTG9uZygpLAogICAgICAvLyBDYWNoZSBpZiB0aGVyZSBhcmUgbm8gZGF0YSBlcnJvcnMgb3IgYSBzcGVjaWZpYyBkYXRhIHRoYXQgbWFrZSB0aGlzIHJlc3VsdCBub3Qgc3VpdGVkIGZvciBjYWNoaW5nCiAgICAgIHNob3VsZENhY2hlUmVzcG9uc2U6IChyZXN1bHQpID0+ICFyZXN1bHQ/LmVycm9yLAogICAgICBjYWNoZUtleTogWydteS1jbXMnLCBib2R5XSwKICAgICAgZGlzcGxheU5hbWU6ICdNeSBDTVMgcXVlcnknLAogICAgfSwKICApOwpgYGAK" }, { "title": "The original `withCache` callback function is now `withCache.run`. This is useful to run *multiple* fetch calls and merge their responses, or run any arbitrary code. It caches anything you return, but you can throw if you don't want to cache anything.", "code": "YGBgZGlmZgogIGNvbnN0IHdpdGhDYWNoZSA9IGNyZWF0ZVdpdGhDYWNoZSh7Y2FjaGUsIHdhaXRVbnRpbCwgcmVxdWVzdH0pOwoKICBjb25zdCBmZXRjaE15Q01TID0gKHF1ZXJ5KSA9PiB7Ci0gICAgcmV0dXJuIHdpdGhDYWNoZShbJ215LWNtcycsIHF1ZXJ5XSwgQ2FjaGVMb25nKCksIGFzeW5jIChwYXJhbXMpID0+IHsKKyAgICByZXR1cm4gd2l0aENhY2hlLnJ1bih7CisgICAgICBjYWNoZUtleTogWydteS1jbXMnLCBxdWVyeV0sCisgICAgICBjYWNoZVN0cmF0ZWd5OiBDYWNoZUxvbmcoKSwKKyAgICAgIC8vIENhY2hlIGlmIHRoZXJlIGFyZSBubyBkYXRhIGVycm9ycyBvciBhIHNwZWNpZmljIGRhdGEgdGhhdCBtYWtlIHRoaXMgcmVzdWx0IG5vdCBzdWl0ZWQgZm9yIGNhY2hpbmcKKyAgICAgIHNob3VsZENhY2hlUmVzdWx0OiAocmVzdWx0KSA9PiAhcmVzdWx0Py5lcnJvcnMsCisgICAgfSwgYXN5bmMocGFyYW1zKSA9PiB7CiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJ215LWNtcy5jb20vYXBpJywgewogICAgICAgIG1ldGhvZDogJ1BPU1QnLAogICAgICAgIGJvZHk6IHF1ZXJ5LAogICAgICB9KTsKICAgICAgaWYgKCFyZXNwb25zZS5vaykgdGhyb3cgbmV3IEVycm9yKHJlc3BvbnNlLnN0YXR1c1RleHQpOwogICAgICBjb25zdCB7ZGF0YSwgZXJyb3J9ID0gYXdhaXQgcmVzcG9uc2UuanNvbigpOwogICAgICBpZiAoZXJyb3IgfHwgIWRhdGEpIHRocm93IG5ldyBFcnJvcihlcnJvciA/PyAnTWlzc2luZyBkYXRhJyk7CiAgICAgIHBhcmFtcy5hZGREZWJ1Z0RhdGEoe2Rpc3BsYXlOYW1lOiAnTXkgQ01TIHF1ZXJ5JywgcmVzcG9uc2V9KTsKICAgICAgcmV0dXJuIGRhdGE7CiAgICB9KTsKICB9OwpgYGAK" } ] }, { "title": "Add option value decoder utility functions", "pr": "https://github.com/Shopify/hydrogen/pull/2425", "id": "2425" } ], "features": [ { "title": "Add optional headers param for logout redirect", "pr": "https://github.com/Shopify/hydrogen/pull/2602", "id": "2602" }, { "title": "Support customer API codegen in directories", "pr": "https://github.com/Shopify/hydrogen/pull/2600", "id": "2600" }, { "title": "Stabilize getSitemap, getSitemapIndex and implement on skeleton", "pr": "https://github.com/Shopify/hydrogen/pull/2589", "id": "2589", "steps": [ { "title": "Update the getSitemapIndex at /app/routes/[sitemap.xml].tsx", "code": "YGBgZGlmZgotIGltcG9ydCB7dW5zdGFibGVfX2dldFNpdGVtYXBJbmRleCBhcyBnZXRTaXRlbWFwSW5kZXh9IGZyb20gJ0BzaG9waWZ5L2h5ZHJvZ2VuJzsKKyBpbXBvcnQge2dldFNpdGVtYXBJbmRleH0gZnJvbSAnQHNob3BpZnkvaHlkcm9nZW4nOwpgYGAK" }, { "title": "Update the getSitemap at /app/routes/sitemap.$type.$page[.xml].tsx", "code": "YGBgZGlmZgotIGltcG9ydCB7dW5zdGFibGVfX2dldFNpdGVtYXAgYXMgZ2V0U2l0ZW1hcH0gZnJvbSAnQHNob3BpZnkvaHlkcm9nZW4nOworIGltcG9ydCB7Z2V0U2l0ZW1hcH0gZnJvbSAnQHNob3BpZnkvaHlkcm9nZW4nOwpgYGAK" } ] }, { "title": "H2O compatibility date", "pr": "https://github.com/Shopify/hydrogen/pull/2380", "id": "2380", "steps": [ { "title": "Check your project is working properly in an Oxygen deployment", "desc": "Starting from this major version, on each deploy to Oxygen, Hydrogen will be on Cloudflare worker compatibility date `2024-10-01`. Onwards, Hydrogen will update worker compatibility date on every SFAPI release. There is no specific project update that needs to be done in order to get this feature. However, please ensure your project is working properly in an Oxygen deployment when updating to this Hydrogen version." } ] } ] }, { "title": "New Shopify cookie system and analytics improvements", "version": "2024.7.10", "date": "2026-01-14", "hash": "9568a1f71a924c56d0cc0c2a30803a773b731ad6", "commit": "https://github.com/Shopify/hydrogen/commit/9568a1f71a924c56d0cc0c2a30803a773b731ad6", "pr": "https://github.com/Shopify/hydrogen/pull/3374", "dependencies": { "@shopify/hydrogen": "2024.7.10" }, "devDependencies": {}, "fixes": [ { "title": "Fix Privacy Banner and analytics event issues", "info": "Fixed irregular behaviors between Privacy Banner and Hydrogen's analytics events.", "pr": "https://github.com/Shopify/hydrogen/pull/3355", "id": "3355-privacy" } ], "features": [ { "title": "Migrate to Shopify's new cookie system", "info": "Hydrogen now supports Shopify's new `_shopify_analytics` and `_shopify_marketing` http-only cookies while keeping the deprecated `_shopify_y` and `_shopify_s` cookies working as long as they remain active. This keeps analytics and privacy behavior aligned with Shopify Admin while preserving backward compatibility.", "breaking": false, "steps": [ { "title": "Understand the new cookie model and compatibility story", "info": "Shopify is deprecating `_shopify_y` and `_shopify_s` in favor of `_shopify_analytics` and `_shopify_marketing`, which are http-only cookies set via the Storefront API on your storefront domain. Hydrogen now reads and writes these cookies through a Storefront API proxy while still honoring the legacy cookies when present. You don't need to migrate values manually, but you must ensure that requests flow through the proxy so cookies are set before analytics run." }, { "title": "Set up a Storefront API proxy for your deployment", "info": "Depending on how you host your app, you must ensure Storefront API calls go through a proxy on your storefront domain.", "code": "IyMjIFJlbWl4ICsgSHlkcm9nZW4gb24gT3h5Z2VuCgpJZiB5b3Ugc2NhZmZvbGRlZCBmcm9tIHRoZSBkZWZhdWx0IEh5ZHJvZ2VuIHNrZWxldG9uIGFuZCBkZXBsb3kgdG8gT3h5Z2VuLCB0aGUgYGNyZWF0ZVJlcXVlc3RIYW5kbGVyYCB1dGlsaXR5IGZyb20gYEBzaG9waWZ5L3JlbWl4LW94eWdlbmAgYWxyZWFkeSBzZXRzIHVwIGEgU3RvcmVmcm9udCBBUEkgcHJveHkgb24gdGhlIHNhbWUgZG9tYWluIGFzIHlvdXIgc3RvcmVmcm9udC4KCioqSW4gbW9zdCBjYXNlcywgbm8gY2hhbmdlcyBhcmUgcmVxdWlyZWQqKjsganVzdCBjb25maXJtIHlvdXIgc2VydmVyIGVudHJ5IHN0aWxsIHVzZXMgaXQ6CgpgYGB0cwovLyBzZXJ2ZXIudHMgKE94eWdlbikKaW1wb3J0IHtjcmVhdGVSZXF1ZXN0SGFuZGxlcn0gZnJvbSAnQHNob3BpZnkvcmVtaXgtb3h5Z2VuJzsKaW1wb3J0IHtjcmVhdGVIeWRyb2dlbkNvbnRleHR9IGZyb20gJ0BzaG9waWZ5L2h5ZHJvZ2VuJzsKCmV4cG9ydCBkZWZhdWx0IHsKICBhc3luYyBmZXRjaChyZXF1ZXN0LCBlbnYpIHsKICAgIGNvbnN0IGh5ZHJvZ2VuQ29udGV4dCA9IGNyZWF0ZUh5ZHJvZ2VuQ29udGV4dCh7CiAgICAgIGVudiwKICAgICAgcmVxdWVzdCwKICAgICAgLyogLi4uICovCiAgICB9KTsKCiAgICBjb25zdCBoYW5kbGVSZXF1ZXN0ID0gY3JlYXRlUmVxdWVzdEhhbmRsZXIoewogICAgICAvKiAuLi4gKi8KICAgICAgZ2V0TG9hZENvbnRleHQ6ICgpID0+IGh5ZHJvZ2VuQ29udGV4dCwKICAgIH0pOwoKICAgIHJldHVybiBoYW5kbGVSZXF1ZXN0KHJlcXVlc3QpOwogIH0sCn07CmBgYAoKS2VlcCB1c2luZyBgPEFuYWx5dGljcy5Qcm92aWRlcj5gIGNvbXBvbmVudCBvciBgdXNlQ3VzdG9tZXJQcml2YWN5YCBob29rIHRvIGdldCBjb29raWVzIGluIHRoZSBicm93c2VyIGF1dG9tYXRpY2FsbHkuCgpGb3IgYSBmdWxsIGV4YW1wbGUsIHJlZmVyIHRvIHlvdXIgc2tlbGV0b24gdGVtcGxhdGUncyBzZXJ2ZXIudHMuCgojIyMgUmVtaXggKyBIeWRyb2dlbiBvbiBvdGhlciBob3N0cwoKIyMjIyBIb3N0cyB0aGF0IHN1cHBvcnQgV2ViIEZldGNoIEFQSSAoUmVxdWVzdC9SZXNwb25zZSkKCk9uIGhvc3RzIHRoYXQgc3VwcG9ydCB0aGUgc3RhbmRhcmQgV2ViIEZldGNoIEFQSSAoV29ya2Vycy1zdHlsZSBlbnZpcm9ubWVudHMpLCBpbXBvcnQgYGNyZWF0ZVJlcXVlc3RIYW5kbGVyYCBmcm9tIGBAc2hvcGlmeS9oeWRyb2dlbmAgYW5kIHJvdXRlIHJlcXVlc3RzIHRocm91Z2ggaXQ6CgpgYGB0cwppbXBvcnQge2NyZWF0ZVJlcXVlc3RIYW5kbGVyLCBjcmVhdGVIeWRyb2dlbkNvbnRleHR9IGZyb20gJ0BzaG9waWZ5L2h5ZHJvZ2VuJzsKCmNvbnN0IGh5ZHJvZ2VuQ29udGV4dCA9IGNyZWF0ZUh5ZHJvZ2VuQ29udGV4dCh7CiAgLyogLi4uICovCn0pOwoKY29uc3QgaGFuZGxlUmVxdWVzdCA9IGNyZWF0ZVJlcXVlc3RIYW5kbGVyKHsKICAvKiAuLi4gKi8KICBnZXRMb2FkQ29udGV4dDogKCkgPT4gaHlkcm9nZW5Db250ZXh0LAp9KTsKYGBgCgojIyMjIE5vZGUuanMgYW5kIG90aGVyIGhvc3RzCgpGb3IgTm9kZS1saWtlIGVudmlyb25tZW50cywgYWRhcHQgTm9kZSByZXF1ZXN0cyB0byBGZXRjaCB3aXRoIFtgQHJlbWl4LXJ1bi9ub2RlLWZldGNoLXNlcnZlcmBdKGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL0ByZW1peC1ydW4vbm9kZS1mZXRjaC1zZXJ2ZXIpLCB0aGVuIGRlbGVnYXRlIHRvIEh5ZHJvZ2VuJ3MgaGFuZGxlcjoKCmBgYHRzCmltcG9ydCB7Y3JlYXRlUmVxdWVzdEhhbmRsZXIsIGNyZWF0ZUh5ZHJvZ2VuQ29udGV4dH0gZnJvbSAnQHNob3BpZnkvaHlkcm9nZW4nOwppbXBvcnQge2NyZWF0ZVJlcXVlc3RMaXN0ZW5lcn0gZnJvbSAnQHJlbWl4LXJ1bi9ub2RlLWZldGNoLXNlcnZlcic7CmltcG9ydCBodHRwIGZyb20gJ2h0dHAnOwoKY29uc3QgaGFuZGxlTm9kZVJlcXVlc3QgPSBjcmVhdGVSZXF1ZXN0TGlzdGVuZXIoKHJlcXVlc3QpID0+IHsKICBjb25zdCBoeWRyb2dlbkNvbnRleHQgPSBjcmVhdGVIeWRyb2dlbkNvbnRleHQoewogICAgLyogLi4uICovCiAgfSk7CgogIGNvbnN0IGhhbmRsZVdlYlJlcXVlc3QgPSBjcmVhdGVSZXF1ZXN0SGFuZGxlcih7CiAgICAvKiAuLi4gKi8KICAgIGdldExvYWRDb250ZXh0OiAoKSA9PiBoeWRyb2dlbkNvbnRleHQsCiAgfSk7CgogIHJldHVybiBoYW5kbGVXZWJSZXF1ZXN0KHJlcXVlc3QpOwp9KTsKCmh0dHAuY3JlYXRlU2VydmVyKGhhbmRsZU5vZGVSZXF1ZXN0KTsKYGBgCgpBbHRlcm5hdGl2ZWx5LCBpZiB5b3UgY2FuJ3QgZGVsZWdhdGUgdG8gSHlkcm9nZW4ncyBgY3JlYXRlUmVxdWVzdEhhbmRsZXJgLCB5b3UgY2FuIHByb3ZpZGUgYSBjdXN0b20gU3RvcmVmcm9udCBBUEkgcHJveHkgaW4geW91ciBzZXJ2ZXIuIFNlZSBbSHlkcm9nZW4ncyBpbXBsZW1lbnRhdGlvbl0oaHR0cHM6Ly9naXRodWIuY29tL1Nob3BpZnkvaHlkcm9nZW4vYmxvYi8yNzA2NmEyODU3NzQ4NGY0MDYyMjIxMTZhOTU5ZWI0NjNkMjU1Njg1L3BhY2thZ2VzL2h5ZHJvZ2VuL3NyYy9zdG9yZWZyb250LnRzI0w1NDYtTDYxMSkgYXMgYSByZWZlcmVuY2UuIEluIHRoaXMgY2FzZSwgZW5zdXJlIHlvdSBtYW51YWxseSBwYXNzIGBzYW1lRG9tYWluRm9yU3RvcmVmcm9udEFwaTogdHJ1ZWAgaW4gdGhlIGBjb25zZW50YCBvYmplY3QgZm9yIGA8QW5hbHl0aWNzLlByb3ZpZGVyPmAgb3IgYXMgYSBwcm9wIHRvIHRoZSBgdXNlQ3VzdG9tZXJQcml2YWN5YCBob29rLgo=" } ], "pr": "https://github.com/Shopify/hydrogen/pull/3355", "id": "3355" } ] }, { "title": "Various Analytics.Provider fixes and support local assets for Image component.", "version": "2024.7.9", "hash": "1335c41b30026212f5db40abd01378e61960456d", "pr": "https://github.com/Shopify/hydrogen/pull/2583", "commit": "https://github.com/Shopify/hydrogen/commit/1335c41b30026212f5db40abd01378e61960456d", "dependencies": { "@remix-run/react": "^2.10.1", "@remix-run/server-runtime": "^2.10.1", "@shopify/hydrogen": "2024.7.9", "@shopify/remix-oxygen": "^2.0.8" }, "devDependencies": { "@remix-run/dev": "^2.10.1", "@shopify/cli": "3.68.0", "@shopify/oxygen-workers-types": "^4.1.2", "typescript": "^5.2.2", "@shopify/mini-oxygen": "^3.0.6" }, "dependenciesMeta": { "typescript": { "required": true }, "@shopify/oxygen-workers-types": { "required": true }, "@shopify/cli": { "required": true }, "@remix-run/server-runtime": { "required": true }, "@shopify/mini-oxygen": { "required": true } }, "fixes": [ { "title": "Fix provided canTrack function being override by ShopifyAnalytics", "pr": "https://github.com/Shopify/hydrogen/pull/2596", "id": "2596" }, { "title": "Fix analytics provider breaking after hitting a 404 page", "pr": "https://github.com/Shopify/hydrogen/pull/2590", "id": "2590" }, { "title": "Image component: support local assets in development", "pr": "https://github.com/Shopify/hydrogen/pull/2573", "id": "2573" }, { "title": "Use HTML datalist element for query suggestions for autocomplete experience", "pr": "https://github.com/Shopify/hydrogen/pull/2506", "id": "2506" } ], "features": [] }, { "title": "Remove unstable exports from remix-oxygen and update customer account buyer authentication exchange", "version": "2024.7.8", "hash": "094e3a6419ca5e7c680e31bf3733169d10ff60e3", "pr": "https://github.com/Shopify/hydrogen/pull/2563", "commit": "https://github.com/Shopify/hydrogen/commit/094e3a6419ca5e7c680e31bf3733169d10ff60e3", "dependencies": { "@remix-run/react": "^2.10.1", "@remix-run/server-runtime": "^2.10.1", "@shopify/hydrogen": "2024.7.8", "@shopify/remix-oxygen": "^2.0.8" }, "devDependencies": { "@remix-run/dev": "^2.10.1", "@shopify/cli": "3.66.1", "@shopify/oxygen-workers-types": "^4.1.2", "typescript": "^5.2.2" }, "dependenciesMeta": { "typescript": { "required": true }, "@shopify/oxygen-workers-types": { "required": true }, "@shopify/cli": { "required": true }, "@remix-run/server-runtime": { "required": true } }, "fixes": [ { "title": "Remove unstable re-exports from remix-oxygen package", "pr": "https://github.com/Shopify/hydrogen/pull/2551", "id": "2437" }, { "title": "Update customer account buyer authentication exchange", "pr": "https://github.com/Shopify/hydrogen/pull/2437", "id": "2437" } ], "features": [] }, { "title": "Consent override fix", "version": "2024.7.7", "hash": "924685c104701fd29562b93b0e9c61a313977c97", "pr": "https://github.com/Shopify/hydrogen/pull/2539", "commit": "https://github.com/Shopify/hydrogen/commit/924685c104701fd29562b93b0e9c61a313977c97", "dependencies": { "@remix-run/react": "^2.10.1", "@remix-run/server-runtime": "^2.10.1", "@shopify/hydrogen": "2024.7.7", "@shopify/remix-oxygen": "^2.0.6" }, "devDependencies": { "@remix-run/dev": "^2.10.1", "@shopify/cli": "3.66.1", "@shopify/oxygen-workers-types": "^4.1.2", "typescript": "^5.2.2" }, "dependenciesMeta": { "typescript": { "required": true }, "@shopify/oxygen-workers-types": { "required": true }, "@shopify/cli": { "required": true }, "@remix-run/server-runtime": { "required": true } }, "fixes": [ { "title": "Consent override fix", "pr": "https://github.com/Shopify/hydrogen/pull/2538", "id": "2538" } ], "features": [] }, { "title": "Shopify analytics fix", "version": "2024.7.6", "hash": "9e7a6a3bf75f137b5c6a536b2cfc57611f7100fb", "pr": "https://github.com/Shopify/hydrogen/pull/2529", "commit": "https://github.com/Shopify/hydrogen/commit/9e7a6a3bf75f137b5c6a536b2cfc57611f7100fb", "dependencies": { "@remix-run/react": "^2.10.1", "@remix-run/server-runtime": "^2.10.1", "@shopify/hydrogen": "2024.7.6", "@shopify/remix-oxygen": "^2.0.6" }, "devDependencies": { "@remix-run/dev": "^2.10.1", "@shopify/cli": "3.66.1", "@shopify/oxygen-workers-types": "^4.1.2", "typescript": "^5.2.2" }, "dependenciesMeta": { "typescript": { "required": true }, "@shopify/oxygen-workers-types": { "required": true }, "@shopify/cli": { "required": true }, "@remix-run/server-runtime": { "required": true } }, "fixes": [ { "title": "Update Shopify analytics events and emit a document event when customer privacy is ready", "pr": "https://github.com/Shopify/hydrogen/pull/2528", "id": "2528" } ], "features": [] }, { "title": "Improved sitemaps (unstable), search templates, cart gift cards, consent localization, CSP fix", "version": "2024.7.5", "hash": "5197eeff75926c3cf07ee9ff6b72e88980bfce35", "pr": "https://github.com/Shopify/hydrogen/pull/2438", "commit": "https://github.com/Shopify/hydrogen/commit/5197eeff75926c3cf07ee9ff6b72e88980bfce35", "dependencies": { "@remix-run/react": "^2.10.1", "@remix-run/server-runtime": "^2.10.1", "@shopify/hydrogen": "2024.7.5", "@shopify/remix-oxygen": "^2.0.6" }, "devDependencies": { "@remix-run/dev": "^2.10.1", "@shopify/cli": "3.66.1", "@shopify/oxygen-workers-types": "^4.1.2", "typescript": "^5.2.2" }, "dependenciesMeta": { "typescript": { "required": true }, "@shopify/oxygen-workers-types": { "required": true }, "@shopify/cli": { "required": true }, "@remix-run/server-runtime": { "required": true } }, "fixes": [ { "title": "Improved content security policy implementation", "pr": "https://github.com/Shopify/hydrogen/pull/2500", "id": "2500" }, { "title": "Infinite redirect fix when path contains double slashes", "pr": "https://github.com/Shopify/hydrogen/pull/2449", "id": "2449" }, { "title": "useOptimisticCart optimistically calculates total quantities", "pr": "https://github.com/Shopify/hydrogen/pull/2459", "id": "2459" }, { "title": "Utilities `privacyBanner` and `customerPrivacy` have been added to `useAnalytics` and `useCustomerPrivacy`", "pr": "https://github.com/Shopify/hydrogen/pull/2457", "id": "2457" }, { "title": "Skeleton side panel link fix for mobile devices", "pr": "https://github.com/Shopify/hydrogen/pull/2438", "id": "2438" } ], "features": [ { "title": "Unstable sitemap abstraction", "pr": "https://github.com/Shopify/hydrogen/pull/2478", "id": "2478" }, { "title": "Cart gift card support", "pr": "https://github.com/Shopify/hydrogen/pull/2478", "id": "2478" }, { "title": "Consent localization", "pr": "https://github.com/Shopify/hydrogen/pull/2457", "id": "2457" }, { "title": "Skeleton search & predictive search enhancements", "pr": "https://github.com/Shopify/hydrogen/pull/2363", "id": "2363" } ] }, { "title": "Fix a regression issue with the `Script` component.", "version": "2024.7.4", "hash": "8df49d7241f404e0b036c3c92bd0de11081ad889", "pr": "https://github.com/Shopify/hydrogen/pull/2431", "commit": "https://github.com/Shopify/hydrogen/commit/8df49d7241f404e0b036c3c92bd0de11081ad889", "dependencies": { "@remix-run/react": "^2.10.1", "@remix-run/server-runtime": "^2.10.1", "@shopify/hydrogen": "2024.7.4", "@shopify/remix-oxygen": "^2.0.6" }, "devDependencies": { "@remix-run/dev": "^2.10.1", "@shopify/cli": "3.65.3", "@shopify/oxygen-workers-types": "^4.1.2", "typescript": "^5.2.2" }, "dependenciesMeta": { "typescript": { "required": true }, "@shopify/oxygen-workers-types": { "required": true }, "@shopify/cli": { "required": true }, "@remix-run/server-runtime": { "required": true } }, "fixes": [ { "title": "Fix the `Script` component to not throw when using it for inline scripts with `dangerouslySetInnerHTML`", "pr": "https://github.com/Shopify/hydrogen/pull/2428", "id": "2428" } ], "features": [] }, { "title": "Support for custom .env files. Simplified creation of app context.", "version": "2024.7.3", "hash": "37ec3bd1be30ba0612fec4438f92c46015fc7efb", "pr": "https://github.com/Shopify/hydrogen/pull/2378", "commit": "https://github.com/Shopify/hydrogen/commit/37ec3bd1be30ba0612fec4438f92c46015fc7efb", "dependencies": { "@remix-run/react": "^2.10.1", "@remix-run/server-runtime": "^2.10.1", "@shopify/hydrogen": "2024.7.3", "@shopify/remix-oxygen": "^2.0.6" }, "devDependencies": { "@remix-run/dev": "^2.10.1", "@shopify/cli": "3.65.3", "@shopify/oxygen-workers-types": "^4.1.2", "typescript": "^5.2.2" }, "dependenciesMeta": { "typescript": { "required": true }, "@shopify/oxygen-workers-types": { "required": true }, "@shopify/cli": { "required": true }, "@remix-run/server-runtime": { "required": true } }, "fixes": [ { "title": "Allow passing `customLogger` to Vite", "pr": "https://github.com/Shopify/hydrogen/pull/2341", "id": "2341" }, { "title": "Prevent sending analytics data to Shopify when Chrome-Lighthouse user agent is detected", "pr": "https://github.com/Shopify/hydrogen/pull/2401", "id": "2401" }, { "title": "Fix the OptimisticCart type to properly retain the generic of line items. The OptimisticCartLine type now takes a cart or cart line item generic", "pr": "https://github.com/Shopify/hydrogen/pull/2327", "id": "2327" }, { "title": "Return a 400 BadRequest for HEAD and GET requests that include a body", "pr": "https://github.com/Shopify/hydrogen/pull/2360", "id": "2360" }, { "title": "Fix an infinite redirect when viewing the cached version of a Hydrogen site on Google Web Cache", "pr": "https://github.com/Shopify/hydrogen/pull/2334", "id": "2334", "steps": [ { "title": "Update your entry.client.jsx file to include this check", "code": "YGBgZGlmZgorIGlmICghd2luZG93LmxvY2F0aW9uLm9yaWdpbi5pbmNsdWRlcygid2ViY2FjaGUuZ29vZ2xldXNlcmNvbnRlbnQuY29tIikpIHsKICAgc3RhcnRUcmFuc2l0aW9uKCgpID0+IHsKICAgICBoeWRyYXRlUm9vdCgKICAgICAgIGRvY3VtZW50LAogICAgICAgPFN0cmljdE1vZGU+CiAgICAgICAgIDxSZW1peEJyb3dzZXIgLz4KICAgICAgIDwvU3RyaWN0TW9kZT4KICAgICApOwogICB9KTsKKyB9CmBgYA==" } ] } ], "features": [ { "title": "Support for custom .env files", "pr": "https://github.com/Shopify/hydrogen/pull/2392", "id": "2392" }, { "title": "Simplified creation of app context.", "pr": "https://github.com/Shopify/hydrogen/pull/2333", "id": "2333", "steps": [ { "title": "Create a app/lib/context file and use `createHydrogenContext` in it.", "code": "YGBgLnRzCi8vIGluIGFwcC9saWIvY29udGV4dAoKaW1wb3J0IHtjcmVhdGVIeWRyb2dlbkNvbnRleHR9IGZyb20gJ0BzaG9waWZ5L2h5ZHJvZ2VuJzsKCmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVBcHBMb2FkQ29udGV4dCgKICByZXF1ZXN0OiBSZXF1ZXN0LAogIGVudjogRW52LAogIGV4ZWN1dGlvbkNvbnRleHQ6IEV4ZWN1dGlvbkNvbnRleHQsCikgewogICAgY29uc3QgaHlkcm9nZW5Db250ZXh0ID0gY3JlYXRlSHlkcm9nZW5Db250ZXh0KHsKICAgICAgZW52LAogICAgICByZXF1ZXN0LAogICAgICBjYWNoZSwKICAgICAgd2FpdFVudGlsLAogICAgICBzZXNzaW9uLAogICAgICBpMThuOiB7bGFuZ3VhZ2U6ICdFTicsIGNvdW50cnk6ICdVUyd9LAogICAgICBjYXJ0OiB7CiAgICAgICAgcXVlcnlGcmFnbWVudDogQ0FSVF9RVUVSWV9GUkFHTUVOVCwKICAgICAgfSwKICAgICAgLy8gZW5zdXJlIHRvIG92ZXJ3cml0ZSBhbnkgb3B0aW9ucyB0aGF0IGlzIG5vdCB1c2luZyB0aGUgZGVmYXVsdCB2YWx1ZXMgZnJvbSB5b3VyIHNlcnZlci50cwogICAgfSk7CgogIHJldHVybiB7CiAgICAuLi5oeWRyb2dlbkNvbnRleHQsCiAgICAvLyBkZWNsYXJlIGFkZGl0aW9uYWwgUmVtaXggbG9hZGVyIGNvbnRleHQKICB9Owp9CgpgYGA=" }, { "title": "Use `createAppLoadContext` method in server.ts Ensure to overwrite any options that is not using the default values in `createHydrogenContext`", "code": "YGBgZGlmZgovLyBpbiBzZXJ2ZXIudHMKCi0gaW1wb3J0IHsKLSAgIGNyZWF0ZUNhcnRIYW5kbGVyLAotICAgY3JlYXRlU3RvcmVmcm9udENsaWVudCwKLSAgIGNyZWF0ZUN1c3RvbWVyQWNjb3VudENsaWVudCwKLSB9IGZyb20gJ0BzaG9waWZ5L2h5ZHJvZ2VuJzsKKyBpbXBvcnQge2NyZWF0ZUFwcExvYWRDb250ZXh0fSBmcm9tICd+L2xpYi9jb250ZXh0JzsKCmV4cG9ydCBkZWZhdWx0IHsKICBhc3luYyBmZXRjaCgKICAgIHJlcXVlc3Q6IFJlcXVlc3QsCiAgICBlbnY6IEVudiwKICAgIGV4ZWN1dGlvbkNvbnRleHQ6IEV4ZWN1dGlvbkNvbnRleHQsCiAgKTogUHJvbWlzZTxSZXNwb25zZT4gewoKLSAgIGNvbnN0IHtzdG9yZWZyb250fSA9IGNyZWF0ZVN0b3JlZnJvbnRDbGllbnQoCi0gICAgIC4uLgotICAgKTsKCi0gICBjb25zdCBjdXN0b21lckFjY291bnQgPSBjcmVhdGVDdXN0b21lckFjY291bnRDbGllbnQoCi0gICAgIC4uLgotICAgKTsKCi0gICBjb25zdCBjYXJ0ID0gY3JlYXRlQ2FydEhhbmRsZXIoCi0gICAgIC4uLgotICAgKTsKCisgICBjb25zdCBhcHBMb2FkQ29udGV4dCA9IGF3YWl0IGNyZWF0ZUFwcExvYWRDb250ZXh0KAorICAgICAgcmVxdWVzdCwKKyAgICAgIGVudiwKKyAgICAgIGV4ZWN1dGlvbkNvbnRleHQsCisgICApOwoKICAgIC8qKgogICAgICAqIENyZWF0ZSBhIFJlbWl4IHJlcXVlc3QgaGFuZGxlciBhbmQgcGFzcwogICAgICAqIEh5ZHJvZ2VuJ3MgU3RvcmVmcm9udCBjbGllbnQgdG8gdGhlIGxvYWRlciBjb250ZXh0LgogICAgICAqLwogICAgY29uc3QgaGFuZGxlUmVxdWVzdCA9IGNyZWF0ZVJlcXVlc3RIYW5kbGVyKHsKICAgICAgYnVpbGQ6IHJlbWl4QnVpbGQsCiAgICAgIG1vZGU6IHByb2Nlc3MuZW52Lk5PREVfRU5WLAotICAgICAgZ2V0TG9hZENvbnRleHQ6ICgpOiBBcHBMb2FkQ29udGV4dCA9PiAoewotICAgICAgICBzZXNzaW9uLAotICAgICAgICBzdG9yZWZyb250LAotICAgICAgICBjdXN0b21lckFjY291bnQsCi0gICAgICAgIGNhcnQsCi0gICAgICAgIGVudiwKLSAgICAgICAgd2FpdFVudGlsLAotICAgICAgfSksCisgICAgICBnZXRMb2FkQ29udGV4dDogKCkgPT4gYXBwTG9hZENvbnRleHQsCiAgICB9KTsKICB9CmBgYA==" }, { "title": "Use infer type for AppLoadContext in env.d.ts", "code": "YGBgZGlmZgovLyBpbiBlbnYuZC50cwoKKyBpbXBvcnQgdHlwZSB7Y3JlYXRlQXBwTG9hZENvbnRleHR9IGZyb20gJ34vbGliL2NvbnRleHQnOwoKKyBpbnRlcmZhY2UgQXBwTG9hZENvbnRleHQgZXh0ZW5kcyBBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIGNyZWF0ZUFwcExvYWRDb250ZXh0Pj4gewotIGludGVyZmFjZSBBcHBMb2FkQ29udGV4dCB7Ci0gIGVudjogRW52OwotICBjYXJ0OiBIeWRyb2dlbkNhcnQ7Ci0gIHN0b3JlZnJvbnQ6IFN0b3JlZnJvbnQ7Ci0gIGN1c3RvbWVyQWNjb3VudDogQ3VzdG9tZXJBY2NvdW50OwotICBzZXNzaW9uOiBBcHBTZXNzaW9uOwotICB3YWl0VW50aWw6IEV4ZWN1dGlvbkNvbnRleHRbJ3dhaXRVbnRpbCddOwp9CgpgYGA=YGBgZGlmZgovLyBpbiBlbnYuZC50cwoKKyBpbXBvcnQgdHlwZSB7Y3JlYXRlQXBwTG9hZENvbnRleHR9IGZyb20gJ34vbGliL2NvbnRleHQnOwoKKyBpbnRlcmZhY2UgQXBwTG9hZENvbnRleHQgZXh0ZW5kcyBBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIGNyZWF0ZUFwcExvYWRDb250ZXh0Pj4gewotIGludGVyZmFjZSBBcHBMb2FkQ29udGV4dCB7Ci0gIGVudjogRW52OwotICBjYXJ0OiBIeWRyb2dlbkNhcnQ7Ci0gIHN0b3JlZnJvbnQ6IFN0b3JlZnJvbnQ7Ci0gIGN1c3RvbWVyQWNjb3VudDogQ3VzdG9tZXJBY2NvdW50OwotICBzZXNzaW9uOiBBcHBTZXNzaW9uOwotICB3YWl0VW50aWw6IEV4ZWN1dGlvbkNvbnRleHRbJ3dhaXRVbnRpbCddOwp9CgpgYGA=" } ] }, { "title": "Add a waitForHydration prop to the Script component to delay loading until after hydration", "pr": "https://github.com/Shopify/hydrogen/pull/2389", "id": "2389" } ] }, { "title": "Codegen config support multiple formats. CLI auth flow fix. Subrequest Profiler styling fix.", "version": "2024.7.2", "hash": "f7c45adb763750798c631291ac3063479c3678ac", "pr": "https://github.com/Shopify/hydrogen/pull/2347", "commit": "https://github.com/Shopify/hydrogen/commit/f7c45adb763750798c631291ac3063479c3678ac", "dependencies": { "@remix-run/react": "^2.10.1", "@remix-run/server-runtime": "^2.10.1", "@shopify/hydrogen": "2024.7.2", "@shopify/remix-oxygen": "^2.0.5" }, "devDependencies": { "@remix-run/dev": "^2.10.1", "@shopify/cli": "~3.64.1", "@shopify/oxygen-workers-types": "^4.1.2", "typescript": "^5.2.2" }, "dependenciesMeta": { "typescript": { "required": true }, "@shopify/oxygen-workers-types": { "required": true }, "@shopify/cli": { "required": true }, "@remix-run/server-runtime": { "required": true } }, "fixes": [ { "title": "Fix CLI auth flow", "pr": "https://github.com/Shopify/hydrogen/pull/2331", "id": "2331" }, { "title": "The Hydrogen CLI can now read the Codegen configuration from the GraphQL config file (e.g. .graphqlrc.js or .graphqlrc.yml)", "pr": "https://github.com/Shopify/hydrogen/pull/2311", "id": "2311" }, { "title": "Force create-hydrogen update due to skeleton changes", "pr": "https://github.com/Shopify/hydrogen/pull/2346", "id": "2346" } ], "features": [] }, { "title": "Optimistic variant, Remix upgrade, new session commit pattern, CSS Options back in CLI, Vite bundle analyzer", "version": "2024.7.1", "hash": "b4884b6232383cbf7d64547f48540d0c2fcf56fe", "pr": "https://github.com/Shopify/hydrogen/pull/2236", "commit": "https://github.com/Shopify/hydrogen/commit/b4884b6232383cbf7d64547f48540d0c2fcf56fe", "dependencies": { "@remix-run/react": "^2.10.1", "@remix-run/server-runtime": "^2.10.1", "@shopify/hydrogen": "2024.7.1", "@shopify/remix-oxygen": "^2.0.5" }, "devDependencies": { "@remix-run/dev": "^2.10.1", "@shopify/cli": "~3.63.2", "@shopify/oxygen-workers-types": "^4.1.2", "typescript": "^5.2.2" }, "dependenciesMeta": { "typescript": { "required": true }, "@shopify/oxygen-workers-types": { "required": true }, "@shopify/cli": { "required": true }, "@remix-run/server-runtime": { "required": true } }, "fixes": [ { "title": "Remix upgrade and use Layout component in root file. This new pattern will eliminate the use of useLoaderData in ErrorBoundary and clean up the root file of duplicate code.", "pr": "https://github.com/Shopify/hydrogen/pull/2290", "id": "2290", "steps": [ { "title": "Refactor App export to become Layout export", "desc": "In root file, changed default App export to Layout export. This component will wrap both the app content and ErrorBoundary. Ensure to use `useRouteLoaderData` and handle the case when returned data doesn't exist.", "code": "YGBgZGlmZgotZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gQXBwKCkgeworZXhwb3J0IGZ1bmN0aW9uIExheW91dCh7Y2hpbGRyZW59OiB7Y2hpbGRyZW4/OiBSZWFjdC5SZWFjdE5vZGV9KSB7CiAgY29uc3Qgbm9uY2UgPSB1c2VOb25jZSgpOwotICBjb25zdCBkYXRhID0gdXNlTG9hZGVyRGF0YTx0eXBlb2YgbG9hZGVyPigpOworICBjb25zdCBkYXRhID0gdXNlUm91dGVMb2FkZXJEYXRhPHR5cGVvZiBsb2FkZXI+KCdyb290Jyk7CgogIHJldHVybiAoCiAgICA8aHRtbD4KICAgIC4uLgogICAgICA8Ym9keT4KLSAgICAgICAgPExheW91dCB7Li4uZGF0YX0+Ci0gICAgICAgICAgPE91dGxldCAvPgotICAgICAgICA8L0xheW91dD4KKyAgICAgICAge2RhdGE/ICgKKyAgICAgICAgICA8UGFnZUxheW91dCB7Li4uZGF0YX0+e2NoaWxkcmVufTwvUGFnZUxheW91dD4KKyAgICAgICAgICkgOiAoCisgICAgICAgICAgY2hpbGRyZW4KKyAgICAgICAgKX0KICAgICAgPC9ib2R5PgogICAgPC9odG1sPgogICk7Cn0KYGBg" }, { "title": "Simplify default App export", "code": "YGBgZGlmZgorZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gQXBwKCkgeworICByZXR1cm4gPE91dGxldCAvPjsKK30KYGBg" }, { "title": "Remove wrapping layout from ErrorBoundary", "code": "YGBgZGlmZgpleHBvcnQgZnVuY3Rpb24gRXJyb3JCb3VuZGFyeSgpIHsKLSBjb25zdCByb290RGF0YSA9IHVzZUxvYWRlckRhdGE8dHlwZW9mIGxvYWRlcj4oKTsKCiAgcmV0dXJuICgKLSAgICA8aHRtbD4KLSAgICAuLi4KLSAgICAgIDxib2R5PgotICAgICAgICA8TGF5b3V0IHsuLi5yb290RGF0YX0+Ci0gICAgICAgICAgPGRpdiBjbGFzc05hbWU9InJvdXRlLWVycm9yIj4KLSAgICAgICAgICAgIDxoMT5FcnJvcjwvaDE+Ci0gICAgICAgICAgICAuLi4KLSAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgPC9MYXlvdXQ+Ci0gICAgICA8L2JvZHk+Ci0gICAgPC9odG1sPgorICAgIDxkaXYgY2xhc3NOYW1lPSJyb3V0ZS1lcnJvciI+CisgICAgICA8aDE+RXJyb3I8L2gxPgorICAgICAgLi4uCisgICAgPC9kaXY+CiAgKTsKfQpgYGA=" } ] }, { "title": "Optimistic Cart type improvement", "pr": "https://github.com/Shopify/hydrogen/pull/2132", "id": "2132" }, { "title": "Fix Codegen config resolution when project directory contains dots", "pr": "https://github.com/Shopify/hydrogen/pull/2293", "id": "2293" }, { "title": "Allow `env-branch` to be passed when running h2 deploy in CI", "pr": "https://github.com/Shopify/hydrogen/pull/2281", "id": "2281" }, { "title": "Fix CLI upgrade notification when running from a global process.", "pr": "https://github.com/Shopify/hydrogen/pull/2281", "id": "2281" }, { "title": "Remove PUBLIC_STORE_DOMAIN environment variable from `.env` when creating new projects with mock.shop", "pr": "https://github.com/Shopify/hydrogen/pull/2221", "id": "2221" }, { "title": "Added an `--auth-bypass-token-duration` flag to the deploy command to allow for specified token duration between 1 to 12 hours", "pr": "https://github.com/Shopify/hydrogen/pull/2182", "id": "2182" }, { "title": "[Breaking Change] `` improved handling of options", "pr": "https://github.com/Shopify/hydrogen/pull/1198", "id": "1198", "steps": [ { "title": "Update options prop when using ", "desc": "Previously, the `VariantSelector` component would filter out options that only had one value. This is undesirable for some apps. We've removed that filter. If you'd like to retain the existing functionality, then simply filter the options prop before it is passed to the `VariantSelector` component", "code": "YGBgZGlmZgogPFZhcmlhbnRTZWxlY3RvcgogICBoYW5kbGU9e3Byb2R1Y3QuaGFuZGxlfQorICBvcHRpb25zPXtwcm9kdWN0Lm9wdGlvbnMuZmlsdGVyKChvcHRpb24pID0+IG9wdGlvbi52YWx1ZXMubGVuZ3RoID4gMSl9Ci0gIG9wdGlvbnM9e3Byb2R1Y3Qub3B0aW9uc30KICAgdmFyaWFudHM9e3ZhcmlhbnRzfT4KIDwvVmFyaWFudFNlbGVjdG9yPgpgYGA=" } ] }, { "title": "Add `sellingPlanId` support to ``", "pr": "https://github.com/Shopify/hydrogen/pull/2254", "id": "2254" }, { "title": "[Breaking Change] The @shopify/cli package now bundles the @shopify/cli-hydrogen plugin. Therefore, you can now remove the latter from your local dependencies", "pr": "https://github.com/Shopify/hydrogen/pull/2306", "id": "2306" } ], "features": [ { "title": "Optimistic variant", "pr": "https://github.com/Shopify/hydrogen/pull/2113", "id": "2113", "steps": [ { "title": "Example of product display page update", "desc": "Add a `useOptimisticVariant` hook for optimistically rendering product variant changes. This makes switching product variants instantaneous", "code": "YGBgLnRzeApmdW5jdGlvbiBQcm9kdWN0KCkgewogIGNvbnN0IHtwcm9kdWN0LCB2YXJpYW50c30gPSB1c2VMb2FkZXJEYXRhPHR5cGVvZiBsb2FkZXI+KCk7CgogIC8vIFRoZSBzZWxlY3RlZFZhcmlhbnQgb3B0aW1pc3RpY2FsbHkgY2hhbmdlcyBkdXJpbmcgcGFnZQogIC8vIHRyYW5zaXRpb25zIHdpdGggb25lIG9mIHRoZSBwcmVsb2FkZWQgcHJvZHVjdCB2YXJpYW50cwogIGNvbnN0IHNlbGVjdGVkVmFyaWFudCA9IHVzZU9wdGltaXN0aWNWYXJpYW50KAogICAgcHJvZHVjdC5zZWxlY3RlZFZhcmlhbnQsCiAgICB2YXJpYW50cywKICApOwoKICByZXR1cm4gPFByb2R1Y3RNYWluIHNlbGVjdGVkVmFyaWFudD17c2VsZWN0ZWRWYXJpYW50fSAvPjsKfQpgYGA=" }, { "title": "Optional update", "desc": "This also introduces a small breaking change to the `VariantSelector` component, which now immediately updates which variant is active. If you'd like to retain the current functionality, and have the `VariantSelector` wait for the page navigation to complete before updating, use the `waitForNavigation` prop.", "code": "YGBgZGlmZgo8VmFyaWFudFNlbGVjdG9yCiAgaGFuZGxlPXtwcm9kdWN0LmhhbmRsZX0KICBvcHRpb25zPXtwcm9kdWN0Lm9wdGlvbnN9CisgIHdhaXRGb3JOYXZpZ2F0aW9uCj4KICAuLi4KPC9WYXJpYW50U2VsZWN0b3I+CmBgYA==" } ] }, { "title": "[Breaking Change] New session commit pattern", "pr": "https://github.com/Shopify/hydrogen/pull/2137", "id": "2137", "steps": [ { "title": "Add isPending implementation in session", "code": "YGBgZGlmZgovLyBpbiBhcHAvbGliL3Nlc3Npb24udHMKZXhwb3J0IGNsYXNzIEFwcFNlc3Npb24gaW1wbGVtZW50cyBIeWRyb2dlblNlc3Npb24geworICBwdWJsaWMgaXNQZW5kaW5nID0gZmFsc2U7CgogIGdldCB1bnNldCgpIHsKKyAgICB0aGlzLmlzUGVuZGluZyA9IHRydWU7CiAgICByZXR1cm4gdGhpcy4jc2Vzc2lvbi51bnNldDsKICB9CgogIGdldCBzZXQoKSB7CisgICAgdGhpcy5pc1BlbmRpbmcgPSB0cnVlOwogICAgcmV0dXJuIHRoaXMuI3Nlc3Npb24uc2V0OwogIH0KCiAgY29tbWl0KCkgeworICAgIHRoaXMuaXNQZW5kaW5nID0gZmFsc2U7CiAgICByZXR1cm4gdGhpcy4jc2Vzc2lvblN0b3JhZ2UuY29tbWl0U2Vzc2lvbih0aGlzLiNzZXNzaW9uKTsKICB9Cn0KYGBg" }, { "title": "update response header if `session.isPending` is true", "code": "YGBgZGlmZgovLyBpbiBzZXJ2ZXIudHMKZXhwb3J0IGRlZmF1bHQgewogIGFzeW5jIGZldGNoKHJlcXVlc3Q6IFJlcXVlc3QpOiBQcm9taXNlPFJlc3BvbnNlPiB7CiAgICB0cnkgewogICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGhhbmRsZVJlcXVlc3QocmVxdWVzdCk7CgorICAgICAgaWYgKHNlc3Npb24uaXNQZW5kaW5nKSB7CisgICAgICAgIHJlc3BvbnNlLmhlYWRlcnMuc2V0KCdTZXQtQ29va2llJywgYXdhaXQgc2Vzc2lvbi5jb21taXQoKSk7CisgICAgICB9CgogICAgICByZXR1cm4gcmVzcG9uc2U7CiAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAuLi4KICAgIH0KICB9LAp9OwpgYGA=" }, { "title": "remove setting cookie with `session.commit()` in routes", "code": "YGBgZGlmZgovLyBpbiByb3V0ZSBmaWxlcwpleHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZGVyKHtjb250ZXh0fTogTG9hZGVyRnVuY3Rpb25BcmdzKSB7CiAgcmV0dXJuIGpzb24oe30sCi0gICAgewotICAgICAgaGVhZGVyczogewotICAgICAgICAnU2V0LUNvb2tpZSc6IGF3YWl0IGNvbnRleHQuc2Vzc2lvbi5jb21taXQoKSwKLSAgICAgIH0sCiAgICB9LAogICk7Cn0KYGBg" } ] }, { "title": "CSS Options back in CLI for Vite projects", "pr": "https://github.com/Shopify/hydrogen/pull/2138", "id": "2138" }, { "title": "Vite bundle analyzer", "pr": "https://github.com/Shopify/hydrogen/pull/2245", "id": "2245" } ] }, { "title": "Auto cookie domain detection for customer privacy api and better error message for missing analytics fields", "version": "2024.4.7", "hash": "156e869563b8a7b3616618a7a9c1bf471be655b3", "pr": "https://github.com/Shopify/hydrogen/pull/2264", "commit": "https://github.com/Shopify/hydrogen/commit/156e869563b8a7b3616618a7a9c1bf471be655b3", "dependencies": { "@remix-run/react": "^2.9.2", "@shopify/cli-hydrogen": "8.1.1", "@shopify/hydrogen": "^2024.4.7", "@shopify/remix-oxygen": "^2.0.4" }, "devDependencies": { "@remix-run/dev": "^2.9.2", "typescript": "^5.2.2", "@shopify/cli": "3.61.2", "@shopify/oxygen-workers-types": "^4.0.0", "@remix-run/server-runtime": "^2.9.2" }, "dependenciesMeta": { "typescript": { "required": true }, "@shopify/oxygen-workers-types": { "required": true }, "@shopify/cli": { "required": true }, "@remix-run/server-runtime": { "required": true } }, "fixes": [ { "title": "Auto cookie domain detection for customer privacy api and better error message for missing analytics fields", "pr": "https://github.com/Shopify/hydrogen/pull/2262", "id": "2262" } ], "features": [] }, { "title": "Fix shopify cookie creation and add auto top-level domain detection", "version": "2024.4.6", "hash": "af573bce7af2e51045dab6a2eaa27f33bfc59900", "pr": "https://github.com/Shopify/hydrogen/pull/2250", "commit": "https://github.com/Shopify/hydrogen/commit/af573bce7af2e51045dab6a2eaa27f33bfc59900", "dependencies": { "@remix-run/react": "^2.9.2", "@shopify/cli-hydrogen": "8.1.1", "@shopify/hydrogen": "^2024.4.6", "@shopify/remix-oxygen": "^2.0.4" }, "devDependencies": { "@remix-run/dev": "^2.9.2", "typescript": "^5.2.2", "@shopify/cli": "3.61.2", "@shopify/oxygen-workers-types": "^4.0.0", "@remix-run/server-runtime": "^2.9.2" }, "dependenciesMeta": { "typescript": { "required": true }, "@shopify/oxygen-workers-types": { "required": true }, "@shopify/cli": { "required": true }, "@remix-run/server-runtime": { "required": true } }, "fixes": [ { "title": "Fix analytics bugs", "pr": "https://github.com/Shopify/hydrogen/pull/2249", "id": "2249" } ], "features": [] }, { "title": "Fix paths on Windows", "version": "2024.4.5", "hash": "6c6b2ea31fc9646ab288362b9f3d06a588292bf7", "pr": "https://github.com/Shopify/hydrogen/pull/2244", "commit": "https://github.com/Shopify/hydrogen/pull/2244/commits/6c6b2ea31fc9646ab288362b9f3d06a588292bf7", "dependencies": { "@remix-run/react": "^2.9.2", "@shopify/cli-hydrogen": "8.1.1", "@shopify/hydrogen": "2024.4.5", "@shopify/remix-oxygen": "2.0.4" }, "devDependencies": { "@remix-run/dev": "^2.9.2", "@remix-run/server-runtime": "^2.9.2", "@shopify/cli": "3.60.0", "@shopify/oxygen-workers-types": "4.0.0", "typescript": "^5.2.2", "@graphql-codegen/cli": "5.0.2", "@shopify/mini-oxygen": "^3.0.3", "@shopify/hydrogen-codegen": "^0.3.1" }, "dependenciesMeta": { "typescript": { "required": true }, "@shopify/oxygen-workers-types": { "required": true }, "@shopify/cli": { "required": true }, "@remix-run/server-runtime": { "required": true }, "@graphql-codegen/cli": { "required": true }, "@shopify/mini-oxygen": { "required": true }, "@shopify/hydrogen-codegen": { "required": true } }, "fixes": [ { "title": "Fix paths on Windows", "pr": "https://github.com/Shopify/hydrogen/pull/2243", "id": "2243" } ], "features": [] }, { "title": "Fix infinite loop when checkoutDomain isn't supplied", "version": "2024.4.4", "hash": "ae7def1795b6c9a130b6d8b796fe6b30dfa40ea4", "pr": "https://github.com/Shopify/hydrogen/pull/2237", "commit": "https://github.com/Shopify/hydrogen/pull/2237/commits/ae7def1795b6c9a130b6d8b796fe6b30dfa40ea4", "dependencies": { "@remix-run/react": "^2.9.2", "@shopify/cli-hydrogen": "^8.1.0", "@shopify/hydrogen": "2024.4.4", "@shopify/remix-oxygen": "2.0.4" }, "devDependencies": { "@remix-run/dev": "^2.9.2", "@remix-run/server-runtime": "^2.9.2", "@shopify/cli": "3.60.0", "@shopify/oxygen-workers-types": "4.0.0", "typescript": "^5.2.2", "@graphql-codegen/cli": "5.0.2", "@shopify/mini-oxygen": "^3.0.3", "@shopify/hydrogen-codegen": "^0.3.1" }, "dependenciesMeta": { "typescript": { "required": true }, "@shopify/oxygen-workers-types": { "required": true }, "@shopify/cli": { "required": true }, "@remix-run/server-runtime": { "required": true }, "@graphql-codegen/cli": { "required": true }, "@shopify/mini-oxygen": { "required": true }, "@shopify/hydrogen-codegen": { "required": true } }, "fixes": [ { "title": "Fix infinite loop when checkoutDomain isn't supplied", "pr": "https://github.com/Shopify/hydrogen/pull/2235", "id": "2235" } ], "features": [] }, { "title": "Optimistic cart, RichText component, stable analytics", "version": "2024.4.3", "hash": "60534dc36d58e718d1e420c719aadf4602bf72d7", "pr": "https://github.com/Shopify/hydrogen/pull/2104", "commit": "https://github.com/Shopify/hydrogen/pull/2104/commits/60534dc36d58e718d1e420c719aadf4602bf72d7", "dependencies": { "@remix-run/react": "^2.9.2", "@shopify/cli-hydrogen": "^8.1.0", "@shopify/hydrogen": "2024.4.3", "@shopify/remix-oxygen": "2.0.4" }, "devDependencies": { "@remix-run/dev": "^2.9.2", "@remix-run/server-runtime": "^2.9.2", "@shopify/cli": "3.60.0", "@shopify/oxygen-workers-types": "4.0.0", "typescript": "^5.2.2", "@graphql-codegen/cli": "5.0.2", "@shopify/mini-oxygen": "^3.0.3", "@shopify/hydrogen-codegen": "^0.3.1" }, "dependenciesMeta": { "typescript": { "required": true }, "@shopify/oxygen-workers-types": { "required": true }, "@shopify/cli": { "required": true }, "@remix-run/server-runtime": { "required": true }, "@graphql-codegen/cli": { "required": true }, "@shopify/mini-oxygen": { "required": true }, "@shopify/hydrogen-codegen": { "required": true } }, "fixes": [ { "title": "Update Remix to 2.9.2", "pr": "https://github.com/Shopify/hydrogen/pull/2135", "id": "2135" }, { "title": "Auto-optimize dependencies in development", "pr": "https://github.com/Shopify/hydrogen/pull/2106", "id": "2106" }, { "title": "Support Vite projects with the debug cpu command", "pr": "https://github.com/Shopify/hydrogen/pull/2124", "id": "2124" }, { "title": "Fix storefrontRedirect to strip trailing slashes when querying for redirects", "pr": "https://github.com/Shopify/hydrogen/pull/2110", "id": "2110" }, { "title": "Improve VariantSelector to return variant object in option values", "pr": "https://github.com/Shopify/hydrogen/pull/2099", "id": "2099" }, { "title": "Fix shopify cookie with leading dot domain", "pr": "https://github.com/Shopify/hydrogen/pull/2142", "id": "2142" } ], "features": [ { "title": "Optimistic Cart", "pr": "https://github.com/Shopify/hydrogen/pull/2069", "id": "2069" }, { "title": "Rich Text Component", "pr": "https://github.com/Shopify/hydrogen/pull/2144", "id": "2144" }, { "title": "Stable Analytics", "pr": "https://github.com/Shopify/hydrogen/pull/2141", "id": "2141" } ] }, { "title": "B2B example, Analytics improvements, Fixes to upgrade command, CSP rules", "version": "2024.4.2", "hash": "6f809a8137650608dbc580387c5aaf9aed4abab9", "pr": "https://github.com/Shopify/hydrogen/pull/2070", "commit": "https://github.com/Shopify/hydrogen/pull/2070/commits/6f809a8137650608dbc580387c5aaf9aed4abab9", "dependencies": { "@remix-run/react": "^2.8.0", "@shopify/cli-hydrogen": "^8.0.4", "@shopify/hydrogen": "2024.4.2", "@shopify/remix-oxygen": "2.0.4" }, "devDependencies": { "@remix-run/dev": "^2.8.0", "@remix-run/server-runtime": "^2.8.0", "@shopify/cli": "3.59.2", "@shopify/oxygen-workers-types": "4.0.0", "typescript": "^5.2.2", "@graphql-codegen/cli": "5.0.2", "@shopify/mini-oxygen": "^3.0.2", "@shopify/hydrogen-codegen": "^0.3.1" }, "dependenciesMeta": { "typescript": { "required": true }, "@shopify/oxygen-workers-types": { "required": true }, "@shopify/cli": { "required": true }, "@remix-run/server-runtime": { "required": true }, "@graphql-codegen/cli": { "required": true }, "@shopify/mini-oxygen": { "required": true }, "@shopify/hydrogen-codegen": { "required": true } }, "fixes": [ { "title": "Fix Analytics. Provider for error checking and working without privacy banner.", "pr": "https://github.com/Shopify/hydrogen/pull/2025", "id": "2025" }, { "title": "Update content-security-policy-builder subdependency to ESM version to avoid preprocessing in Vite.", "pr": "https://github.com/Shopify/hydrogen/pull/2057", "id": "2057" }, { "title": "When extending the content security policy, if the default directive is 'none' then the default won't be merged into the final directive.", "pr": "https://github.com/Shopify/hydrogen/pull/2076", "id": "2076" }, { "title": "Fix schema issue where @shopify/hydrogen-react is not being use but require in dependencies", "pr": "https://github.com/Shopify/hydrogen/pull/2086", "id": "2086" }, { "title": "Ensure the getShopifyDomain method from the useShop hook always includes the HTTPS protocol.", "pr": "https://github.com/Shopify/hydrogen/pull/2079", "id": "2079" } ], "features": [ { "title": "Adding support for B2B to the customer account client and cart handler to store and manage buyer context. Currently Unstable.", "pr": "https://github.com/Shopify/hydrogen/pull/2059", "id": "2059" } ] }, { "title": "Dependencies update to avoid React version mismatches. Fixes HIT/STALE items display in Subrequest Profiler, noteUpdate scalar type change, Vite improvements", "version": "2024.4.1", "hash": "0131d8d0abe471fec458a1211a1ba8eda01f2403", "pr": "https://github.com/Shopify/hydrogen/pull/2060", "commit": "https://github.com/Shopify/hydrogen/pull/2060/commits/0131d8d0abe471fec458a1211a1ba8eda01f2403", "dependencies": { "@remix-run/react": "^2.8.0", "@shopify/cli-hydrogen": "8.0.3", "@shopify/hydrogen": "2024.4.1", "@shopify/remix-oxygen": "2.0.4" }, "devDependencies": { "@remix-run/dev": "^2.8.0", "@remix-run/server-runtime": "^2.8.0", "@shopify/cli": "3.58.0", "@shopify/oxygen-workers-types": "4.0.0", "typescript": "^5.2.2", "@graphql-codegen/cli": "5.0.2", "@shopify/mini-oxygen": "3.0.1", "@shopify/hydrogen-codegen": "0.3.0" }, "dependenciesMeta": { "typescript": { "required": true }, "@shopify/oxygen-workers-types": { "required": true }, "@shopify/cli": { "required": true }, "@remix-run/server-runtime": { "required": true }, "@graphql-codegen/cli": { "required": true }, "@shopify/mini-oxygen": { "required": true }, "@shopify/hydrogen-codegen": { "required": true } }, "fixes": [ { "title": "Update @shopify/cli dependency to avoid React version mismatches in your project", "pr": "https://github.com/Shopify/hydrogen/pull/2059", "id": "2059" }, { "title": "Warn when using the deprecated Seo component", "pr": "https://github.com/Shopify/hydrogen/pull/1983", "id": "1983" }, { "title": "Fix names and URLs shown for HIT/STALE items in the Subrequest Profiler", "pr": "https://github.com/Shopify/hydrogen/pull/2021", "id": "2021" }, { "title": "Fix noteUpdate scalar to be required", "pr": "https://github.com/Shopify/hydrogen/pull/2008", "id": "2008" }, { "title": "Stop inlining favicon to avoid CSP issue", "pr": "https://github.com/Shopify/hydrogen/pull/2006", "id": "2006" }, { "title": "HMR improvement by avoiding circular imports", "pr": "https://github.com/Shopify/hydrogen/pull/2014", "id": "2014" } ], "features": [] }, { "title": "SFAPI 2024.4, Vite, Analytics (unstable), Remix 2.8.0, CLI improvements", "version": "2024.4.0", "hash": "e93ba60ce7dd2ab017d72c0fd600efea04ade76b", "pr": "https://github.com/Shopify/hydrogen/pull/1855", "commit": "https://github.com/Shopify/hydrogen/pull/1855/commits/e93ba60ce7dd2ab017d72c0fd600efea04ade76b", "dependencies": { "@remix-run/react": "^2.8.0", "@shopify/cli-hydrogen": "8.0.0", "@shopify/hydrogen": "2024.4.0", "@shopify/remix-oxygen": "2.0.4" }, "devDependencies": { "@remix-run/dev": "^2.8.0", "@remix-run/server-runtime": "^2.8.0", "@shopify/cli": "3.58.0", "@shopify/oxygen-workers-types": "4.0.0", "typescript": "^5.2.2", "@graphql-codegen/cli": "5.0.2", "@shopify/mini-oxygen": "3.0.0", "@shopify/hydrogen-codegen": "0.3.0" }, "dependenciesMeta": { "typescript": { "required": true }, "@shopify/oxygen-workers-types": { "required": true }, "@shopify/cli": { "required": true }, "@remix-run/server-runtime": { "required": true }, "@graphql-codegen/cli": { "required": true }, "@shopify/mini-oxygen": { "required": true }, "@shopify/hydrogen-codegen": { "required": true } }, "fixes": [ { "title": "Update @shopify/cli to 3.58.0", "pr": "https://github.com/Shopify/hydrogen/pull/1946", "id": "1946" }, { "title": "Make `StorefrontRedirect` case insensitive when querying redirect URLs from the Storefront API", "pr": "https://github.com/Shopify/hydrogen/pull/1941", "id": "1941" }, { "title": "Avoid throwing error in h2 dev --codegen when the Customer Account schema is not found", "pr": "https://github.com/Shopify/hydrogen/pull/1962", "id": "1962" }, { "title": "Fix bug where storefrontRedirect would return an error on soft page navigations.", "pr": "https://github.com/Shopify/hydrogen/pull/1900", "id": "1900" }, { "title": "Fix a bug where cart could be null, even though a new cart was created by adding a line item.", "description": "This allows calling the cart .get() method right after creating a new cart with one of the mutation methods: create(), addLines(), updateDiscountCodes(), updateBuyerIdentity(), updateNote(), updateAttributes(), setMetafields().", "pr": "https://github.com/Shopify/hydrogen/pull/1865", "id": "1865", "steps": [ { "title": "Example", "code": "YGBgdHMKaW1wb3J0IHsKICBjcmVhdGVDYXJ0SGFuZGxlciwKICBjYXJ0R2V0SWREZWZhdWx0LAogIGNhcnRTZXRJZERlZmF1bHQsCn0gZnJvbSAnQHNob3BpZnkvaHlkcm9nZW4nOwoKY29uc3QgY2FydEhhbmRsZXIgPSBjcmVhdGVDYXJ0SGFuZGxlcih7CiAgc3RvcmVmcm9udCwKICBnZXRDYXJ0SWQ6IGNhcnRHZXRJZERlZmF1bHQocmVxdWVzdC5oZWFkZXJzKSwKICBzZXRDYXJ0SWQ6IGNhcnRTZXRJZERlZmF1bHQoKSwKICBjYXJ0UXVlcnlGcmFnbWVudDogQ0FSVF9RVUVSWV9GUkFHTUVOVCwKICBjYXJ0TXV0YXRlRnJhZ21lbnQ6IENBUlRfTVVUQVRFX0ZSQUdNRU5ULAp9KTsKCmF3YWl0IGNhcnRIYW5kbGVyLmFkZExpbmVzKFt7bWVyY2hhbmRpc2VJZDogJy4uLid9XSk7Ci8vIC5nZXQoKSBub3cgcmV0dXJucyB0aGUgY2FydCBhcyBleHBlY3RlZApjb25zdCBjYXJ0ID0gYXdhaXQgY2FydEhhbmRsZXIuZ2V0KCk7CmBgYA==" } ] }, { "title": "Update Vite plugin imports, and how their options are passed to Remix", "pr": "https://github.com/Shopify/hydrogen/pull/1935", "id": "1935", "steps": [ { "title": "vite.config.js", "code": "YGBgZGlmZgotaW1wb3J0IHtoeWRyb2dlbiwgb3h5Z2VufSBmcm9tICdAc2hvcGlmeS9jbGktaHlkcm9nZW4vZXhwZXJpbWVudGFsLXZpdGUnOworaW1wb3J0IHtoeWRyb2dlbn0gZnJvbSAnQHNob3BpZnkvaHlkcm9nZW4vdml0ZSc7CitpbXBvcnQge294eWdlbn0gZnJvbSAnQHNob3BpZnkvbWluaS1veHlnZW4vdml0ZSc7CmltcG9ydCB7dml0ZVBsdWdpbiBhcyByZW1peH0gZnJvbSAnQHJlbWl4LXJ1bi9kZXYnOwoKZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29uZmlnKHsKICAgIGh5ZHJvZ2VuKCksCiAgICBveHlnZW4oKSwKICAgIHJlbWl4KHsKLSAgICAgYnVpbGREaXJlY3Rvcnk6ICdkaXN0JywKKyAgICAgcHJlc2V0czogW2h5ZHJvZ2VuLnByZXNldCgpXSwKICAgICAgZnV0dXJlOiB7CmBgYA==" } ] }, { "title": "Deprecate the --env-branch flag, in favor of --env", "description": "--env accepts the environment's handle, instead of the environment's associated branch name. Run env list to display all environments and their handles.", "pr": "https://github.com/Shopify/hydrogen/pull/1841", "id": "1841" }, { "title": "Hydrogen CLI now requires `@shopify/mini-oxygen` to be installed separately as a dev dependency.", "description": "It is still used automatically under the hood so there is no need to change your application code aside from installing the dependency.\nAlso, if a port provided via --port or --inspector-port flags is already in use, the CLI will now exit with an error message instead of finding a new open port. When the flags are not provided, the CLI will still find an open port.", "pr": "https://github.com/Shopify/hydrogen/pull/1891", "id": "1891" }, { "title": "Change `storefrontRedirect` to ignore query parameters when matching redirects", "description": "For example, a redirect in the admin from `/snowboards` to `/collections/snowboards` will now match on the URL `/snowboards?utm_campaign=buffer` and redirect the user to `/collections/snowboards?utm_campaign=buffer`", "pr": "https://github.com/Shopify/hydrogen/pull/1900", "id": "1900", "steps": [ { "title": "This is a breaking change. If you want to retain the legacy functionality that is query parameter sensitive, pass matchQueryParams to storefrontRedirect():", "code": "YGBganMKc3RvcmVmcm9udFJlZGlyZWN0KHsKICByZXF1ZXN0LAogIHJlc3BvbnNlLAogIHN0b3JlZnJvbnQsCisgIG1hdGNoUXVlcnlQYXJhbXM6IHRydWUsCn0pOwpgYGA=" } ] }, { "title": "Fix compatibility of /subrequest-profiler with Vite", "pr": "https://github.com/Shopify/hydrogen/pull/1935", "id": "1935" }, { "title": "Fix default content security policy directive for frameAncestors", "pr": "https://github.com/Shopify/hydrogen/pull/1883", "id": "1883" }, { "title": "Fall back to `mock.shop` when no value is passed in `storeDomain` to `createStorefrontClient` in development", "pr": "https://github.com/Shopify/hydrogen/pull/1971", "id": "1971" }, { "title": "Fix the --markets flag when using npm create @shopify/hydrogen", "pr": "https://github.com/Shopify/hydrogen/pull/1916", "id": "1916" }, { "title": "Fix types returned by the session object", "pr": "https://github.com/Shopify/hydrogen/pull/1869", "id": "1869", "steps": [ { "title": "In remix.env.d.ts or env.d.ts, add the following types", "code": "YGBgZGlmZgppbXBvcnQgdHlwZSB7CiAgLy8gLi4uCiAgSHlkcm9nZW5DYXJ0LAorIEh5ZHJvZ2VuU2Vzc2lvbkRhdGEsCn0gZnJvbSAnQHNob3BpZnkvaHlkcm9nZW4nOwoKLy8gLi4uCgpkZWNsYXJlIG1vZHVsZSAnQHNob3BpZnkvcmVtaXgtb3h5Z2VuJyB7CiAgLy8gLi4uCgorIGludGVyZmFjZSBTZXNzaW9uRGF0YSBleHRlbmRzIEh5ZHJvZ2VuU2Vzc2lvbkRhdGEge30KfQpgYGA=" } ] } ], "features": [ { "title": "Update to 2024.4 Storefront API version", "pr": "https://github.com/Shopify/hydrogen/pull/1951", "id": "1951" }, { "title": "Update to Remix 2.8.0", "pr": "https://github.com/Shopify/hydrogen/pull/1781", "id": "1781" }, { "title": "Move the Hydrogen CLI's `env push` command to stable", "pr": "https://github.com/Shopify/hydrogen/pull/1946", "id": "1946", "docs": "https://shopify.dev/docs/custom-storefronts/hydrogen/cli#env-push" }, { "title": "Add magic catalog route `/collections/all` to the Skeleton template", "pr": "https://github.com/Shopify/hydrogen/pull/1967", "id": "1967" }, { "title": "Add postLogoutRedirectUri option to the Customer Account API client's logout method", "pr": "https://github.com/Shopify/hydrogen/pull/1871", "id": "1871" }, { "title": "Add `@shopify/mini-oxygen` as a dev dependency for local development", "pr": "https://github.com/Shopify/hydrogen/pull/1891", "id": "1891", "steps": [ { "title": "package.json", "code": "YGBgZGlmZgogImRldkRlcGVuZGVuY2llcyI6IHsKICAgICJAcmVtaXgtcnVuL2RldiI6ICJeMi44LjAiLAogICAgIkByZW1peC1ydW4vZXNsaW50LWNvbmZpZyI6ICJeMi44LjAiLAorICAgIkBzaG9waWZ5L21pbmktb3h5Z2VuIjogIl4zLjAuMCIsCiAgICAiQHNob3BpZnkvb3h5Z2VuLXdvcmtlcnMtdHlwZXMiOiAiXjQuMC4wIiwKICAgIC4uLgogIH0KYGBg" } ] }, { "title": "Introduce that also includes support for Shopify analytics, Customer Privacy API and Privacy banner", "description": "Adds the following compoonents and utilities, `UNSTABLE_Analytics`, `getShopAnalytics`, `unstable_useAnalytics` and more", "pr": "https://github.com/Shopify/hydrogen/pull/1789", "id": "1789" }, { "title": "Add new analytics example (unstable)", "pr": "https://github.com/Shopify/hydrogen/pull/1789", "docs": "https://github.com/Shopify/hydrogen/blob/main/examples/analytics/README.md", "id": "1789" }, { "title": "Export new Hydrogen Vite plugin from `@shopify/hydrogen/vite`", "pr": "https://github.com/Shopify/hydrogen/pull/1935", "id": "1935" }, { "title": "Support scaffolding projects from external repositories using the `--template` flag", "pr": "https://github.com/Shopify/hydrogen/pull/1867", "id": "1867", "steps": [ { "title": "The following examples are equivalent", "code": "YGBgYmFzaApucG0gY3JlYXRlIEBzaG9waWZ5L2h5ZHJvZ2VuIC0tIC0tdGVtcGxhdGUgc2hvcGlmeS9oeWRyb2dlbi1kZW1vLXN0b3JlCm5wbSBjcmVhdGUgQHNob3BpZnkvaHlkcm9nZW4gLS0gLS10ZW1wbGF0ZSBnaXRodWIuY29tL3Nob3BpZnkvaHlkcm9nZW4tZGVtby1zdG9yZQpucG0gY3JlYXRlIEBzaG9waWZ5L2h5ZHJvZ2VuIC0tIC0tdGVtcGxhdGUgaHR0cHM6Ly9naXRodWIuY29tL3Nob3BpZnkvaHlkcm9nZW4tZGVtby1zdG9yZQpgYGA=" } ] }, { "title": "Add `--quickstart` flag option to init/create command", "pr": "https://github.com/Shopify/hydrogen/pull/1822", "id": "1822" }, { "title": "Add the unstable `--customer-account-push` flag to the Hydrogen CLI", "description": "This allows you to push the current `--dev-origin` URL to the Shopify admin to enable secure connection to the Customer Account API for local development", "pr": "https://github.com/Shopify/hydrogen/pull/1961", "id": "1961" }, { "title": "Export new Vite plugin from `@shopify/mini-oxygen/vite`", "description": "It integrates Vite with MiniOxygen by running the application code within a worker", "pr": "https://github.com/Shopify/hydrogen/pull/1935", "id": "1935" }, { "title": "Allow `ui_locale` to be passed to the customer account login page", "pr": "https://github.com/Shopify/hydrogen/pull/1842", "id": "1842" }, { "title": "Expose `cartReady` state from the cart context inb hydrogen-react", "pr": "https://github.com/Shopify/hydrogen/pull/1885", "id": "1885" }, { "title": "Deprecate the `` component in favor of directly using Remix meta route exports", "description": "Use the `getSeoMeta` utility to make migration easier", "pr": "https://github.com/Shopify/hydrogen/pull/1875", "id": "1875", "steps": [ { "title": "Remove the `` component from `root.jsx`", "code": "YGBgZGlmZgpleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBBcHAoKSB7CiAgIGNvbnN0IG5vbmNlID0gdXNlTm9uY2UoKTsKICAgY29uc3QgZGF0YSA9IHVzZUxvYWRlckRhdGE8dHlwZW9mIGxvYWRlcj4oKTsKCiAgIHJldHVybiAoCiAgICAgPGh0bWwgbGFuZz0iZW4iPgogICAgICAgPGhlYWQ+CiAgICAgICAgIDxtZXRhIGNoYXJTZXQ9InV0Zi04IiAvPgogICAgICAgICA8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLGluaXRpYWwtc2NhbGU9MSIgLz4KLSAgICAgICAgPFNlbyAvPgogICAgICAgICA8TWV0YSAvPgogICAgICAgICA8TGlua3MgLz4KICAgICAgIDwvaGVhZD4KICAgICAgIDxib2R5PgogICAgICAgICA8TGF5b3V0IHsuLi5kYXRhfT4KICAgICAgICAgICA8T3V0bGV0IC8+CiAgICAgICAgIDwvTGF5b3V0PgogICAgICAgICA8U2Nyb2xsUmVzdG9yYXRpb24gbm9uY2U9e25vbmNlfSAvPgogICAgICAgICA8U2NyaXB0cyBub25jZT17bm9uY2V9IC8+CiAgICAgICAgIDxMaXZlUmVsb2FkIG5vbmNlPXtub25jZX0gLz4KICAgICAgIDwvYm9keT4KICAgICA8L2h0bWw+CiAgICk7CiB9CmBgYA==" }, { "title": "Add a Remix meta export to each route that returns an seo property from a loader or handle:", "code": "YGBgZGlmZgoraW1wb3J0IHtnZXRTZW9NZXRhfSBmcm9tICdAc2hvcGlmeS9oeWRyb2dlbic7CgogZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRlcih7Y29udGV4dH0pIHsKICAgY29uc3Qge3Nob3B9ID0gYXdhaXQgY29udGV4dC5zdG9yZWZyb250LnF1ZXJ5KGAKICAgICBxdWVyeSBsYXlvdXQgewogICAgICAgc2hvcCB7CiAgICAgICAgIG5hbWUKICAgICAgICAgZGVzY3JpcHRpb24KICAgICAgIH0KICAgICB9CiAgIGApOwoKICAgcmV0dXJuIHsKICAgICBzZW86IHsKICAgICAgIHRpdGxlOiBzaG9wLnRpdGxlLAogICAgICAgZGVzY3JpcHRpb246IHNob3AuZGVzY3JpcHRpb24sCiAgICAgfSwKICAgfTsKIH0KCitleHBvcnQgY29uc3QgbWV0YSA9ICh7ZGF0YX0pID0+IHsKKyAgIHJldHVybiBnZXRTZW9NZXRhKGRhdGEuc2VvKTsKK307CmBgYA==" }, { "title": "Merge root route meta data", "code": "SWYgeW91ciByb290IHJvdXRlIGxvYWRlciBhbHNvIHJldHVybnMgYW4gc2VvIHByb3BlcnR5LCBtYWtlIHN1cmUgdG8gbWVyZ2UgdGhhdCBkYXRhOgoKYGBganMKZXhwb3J0IGNvbnN0IG1ldGEgPSAoe2RhdGEsIG1hdGNoZXN9KSA9PiB7CiAgcmV0dXJuIGdldFNlb01ldGEoCiAgICBtYXRjaGVzWzBdLmRhdGEuc2VvLAogICAgLy8gdGhlIGN1cnJlbnQgcm91dGUgc2VvIGRhdGEgb3ZlcnJpZGVzIHRoZSByb290IHJvdXRlIGRhdGEKICAgIGRhdGEuc2VvLAogICk7Cn07CmBgYApPciBtb3JlIHNpbXBseToKCmBgYGpzCmV4cG9ydCBjb25zdCBtZXRhID0gKHtkYXRhLCBtYXRjaGVzfSkgPT4gewogIHJldHVybiBnZXRTZW9NZXRhKC4uLm1hdGNoZXMubWFwKChtYXRjaCkgPT4gbWF0Y2guZGF0YS5zZW8pKTsKfTsKYGBg" }, { "title": "Override meta", "code": "U29tZXRpbWVzIGdldFNlb01ldGEgbWlnaHQgcHJvZHVjZSBhIHByb3BlcnR5IGluIGEgd2F5IHlvdSdkIGxpa2UgdG8gY2hhbmdlLiBNYXAgb3ZlciB0aGUgcmVzdWx0aW5nIGFycmF5IHRvIGNoYW5nZSBpdC4gRm9yIGV4YW1wbGUsIEh5ZHJvZ2VuIHJlbW92ZXMgcXVlcnkgcGFyYW1ldGVycyBmcm9tIGNhbm9uaWNhbCBVUkxzLCBhZGQgdGhlbSBiYWNrOgoKYGBganMKZXhwb3J0IGNvbnN0IG1ldGEgPSAoe2RhdGEsIGxvY2F0aW9ufSkgPT4gewogIHJldHVybiBnZXRTZW9NZXRhKGRhdGEuc2VvKS5tYXAoKG1ldGEpID0+IHsKICAgIGlmIChtZXRhLnJlbCA9PT0gJ2Nhbm9uaWNhbCcpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICAuLi5tZXRhLAogICAgICAgIGhyZWY6IG1ldGEuaHJlZiArIGxvY2F0aW9uLnNlYXJjaCwKICAgICAgfTsKICAgIH0KCiAgICByZXR1cm4gbWV0YTsKICB9KTsKfTsKYGBg" } ] }, { "title": "Codegen dependencies must be now listed explicitly in package.json", "pr": "https://github.com/Shopify/hydrogen/pull/1962", "id": "1962", "steps": [ { "title": "Update package.json", "code": "YGBgZGlmZgp7CiAgImRldkRlcGVuZGVuY2llcyI6IHsKKyAgICJAZ3JhcGhxbC1jb2RlZ2VuL2NsaSI6ICI1LjAuMiIsCiAgICAiQHJlbWl4LXJ1bi9kZXYiOiAiXjIuOC4wIiwKICAgICJAcmVtaXgtcnVuL2VzbGludC1jb25maWciOiAiXjIuOC4wIiwKKyAgICJAc2hvcGlmeS9oeWRyb2dlbi1jb2RlZ2VuIjogIl4wLjMuMCIsCiAgICAiQHNob3BpZnkvbWluaS1veHlnZW4iOiAiXjIuMi41IiwKICAgICJAc2hvcGlmeS9veHlnZW4td29ya2Vycy10eXBlcyI6ICJeNC4wLjAiLAogICAgLi4uCiAgfQp9CmBgYA==" } ] }, { "title": "Add `--verbose` flag to `h2 dev` and `h2 preview` commands to enable verbose logging", "description": "Only CLI logs become verbose by default. If you also want to see verbose logs from Vite as well, use DEBUG=* h2 dev instead", "pr": "https://github.com/Shopify/hydrogen/pull/1928", "id": "1928" } ] }, { "title": "Fix bug in storefrontRedirect", "version": "2024.1.5", "hash": "e382e7252ea45807923b2a56fd86e74ee8d28ef9", "pr": "https://github.com/Shopify/hydrogen/pull/1889", "commit": "https://github.com/Shopify/hydrogen/pull/1837/commits/ceda89e85581c96f6947eca1a81b7a87e3cd7280", "dependencies": { "@remix-run/react": "2.8.0", "@shopify/cli-hydrogen": "^7.1.2", "@shopify/hydrogen": "^2024.1.5", "@shopify/remix-oxygen": "^2.0.3" }, "devDependencies": { "@remix-run/dev": "2.8.0", "typescript": "^5.2.2", "@shopify/cli": "3.56.3", "@shopify/oxygen-workers-types": "^4.0.0", "@remix-run/server-runtime": "2.8.0" }, "dependenciesMeta": { "typescript": { "required": true }, "@shopify/oxygen-workers-types": { "required": true }, "@shopify/cli": { "required": true }, "@remix-run/server-runtime": { "required": true } }, "fixes": [ { "title": "Fix storefrontRedirect error", "pr": "Fix bug in storefrontRedirect", "id": "1880" } ], "features": [] }, { "title": "Fix XSS vulnerability in the SEO component", "version": "2024.1.4", "hash": "e3398352c48d1e703d7600f49fae2895764a8677", "pr": "https://github.com/Shopify/hydrogen/pull/1837", "commit": "https://github.com/Shopify/hydrogen/pull/1837/commits/31dcac4dfd8f45153541e856d56350dfa16475b4", "dependencies": { "@remix-run/react": "2.8.0", "@shopify/cli-hydrogen": "^7.1.2", "@shopify/hydrogen": "^2024.1.4", "@shopify/remix-oxygen": "^2.0.3" }, "devDependencies": { "@remix-run/dev": "2.8.0", "typescript": "^5.2.2", "@shopify/cli": "3.56.3", "@shopify/oxygen-workers-types": "^4.0.0", "@remix-run/server-runtime": "2.8.0" }, "dependenciesMeta": { "typescript": { "required": true }, "@shopify/oxygen-workers-types": { "required": true }, "@shopify/cli": { "required": true }, "@remix-run/server-runtime": { "required": true } }, "fixes": [ { "title": "Fix XSS vulnerability in the SEO component", "pr": "https://github.com/Shopify/hydrogen/pull/1839", "id": "1839" } ], "features": [ { "title": "Add optional fetcher key to the CartForm component", "pr": "https://github.com/Shopify/hydrogen/pull/1792", "id": "1792" }, { "title": "Improve performance of the predictive search in the starter template", "pr": "https://github.com/Shopify/hydrogen/pull/1823", "id": "1823" } ] }, { "title": "Experimental Vite support, Remix 2.8.0, fixed Pagination and runtime freezes, extracted Codegen", "version": "2024.1.3", "date": "", "hash": "499c2917e2ba0e3884972f649e526f5040112404", "pr": "https://github.com/Shopify/hydrogen/pull/1796", "commit": "https://github.com/Shopify/hydrogen/pull/1796/commits/499c2917e2ba0e3884972f649e526f5040112404", "dependencies": { "@remix-run/react": "2.8.0", "@shopify/cli-hydrogen": "^7.1.1", "@shopify/hydrogen": "^2024.1.3", "@shopify/remix-oxygen": "^2.0.3" }, "devDependencies": { "@remix-run/dev": "2.8.0", "typescript": "^5.2.2", "@shopify/cli": "3.56.3", "@shopify/oxygen-workers-types": "^4.0.0", "@remix-run/server-runtime": "2.8.0" }, "dependenciesMeta": { "typescript": { "required": true }, "@shopify/oxygen-workers-types": { "required": true }, "@shopify/cli": { "required": true }, "@remix-run/server-runtime": { "required": true } }, "fixes": [ { "title": "Fix PreviousLink and NextLink types in the Pagination component", "pr": "https://github.com/Shopify/hydrogen/pull/1774", "id": "1774" }, { "title": "Fix an issue that could cause the local worker runtime to freeze", "pr": "https://github.com/Shopify/hydrogen/pull/1819", "id": "1819" } ], "features": [ { "title": "Extract Codegen to a separate package", "description": "Codegen is now an agnostic `@shopify/graphql-codegen` package. `@shopify/hydrogen-codegen` now simply wraps this package with a set of Hydrogen defaults.", "id": "1799", "pr": "https://github.com/Shopify/hydrogen/pull/1799" }, { "title": "Upgrade to Remix 2.8.0", "pr": "https://github.com/Shopify/hydrogen/pull/1781", "id": "1781" }, { "title": "Add experimental support for Vite projects", "description": "To test this unstable feature, make sure you're running the latest version of the Hydrogen CLI, then run `npx shopify hydrogen setup vite` in your Hydrogen project. This command edits existing files and creates some new ones required to run Vite.", "id": "1728", "pr": "https://github.com/Shopify/hydrogen/pull/1728" }, { "title": "Improve h2 --help messaging", "pr": "https://github.com/Shopify/hydrogen/pull/1786", "id": "1786" } ] }, { "title": "`deploy` command enhancements and bug fixes", "version": "2024.1.2", "date": "", "hash": "06b6724e9c079d5e4842f0343adb8f63a2b564a4", "pr": "https://github.com/Shopify/hydrogen/pull/1739", "commit": "https://github.com/Shopify/hydrogen/pull/1739/commits/06b6724e9c079d5e4842f0343adb8f63a2b564a4", "dependencies": { "@remix-run/react": "2.6.0", "@shopify/cli-hydrogen": "^7.1.0", "@shopify/hydrogen": "^2024.1.2", "@shopify/remix-oxygen": "^2.0.3" }, "devDependencies": { "@remix-run/dev": "2.6.0", "typescript": "^5.2.2", "@shopify/cli": "3.52.0", "@shopify/oxygen-workers-types": "^4.0.0", "@remix-run/server-runtime": "2.6.0" }, "dependenciesMeta": { "typescript": { "required": true }, "@shopify/oxygen-workers-types": { "required": true }, "@shopify/cli": { "required": true }, "@remix-run/server-runtime": { "required": true } }, "fixes": [ { "title": "Adds `--build-command` and `--no-lockfile-check` flags to the build command", "description": "`build-command`: Allows users to specify which command is used to build the project (instead of the default build function). This provides more flexibility for projects that have custom build processes.\n `no-lockfile-check`: Allows users to skip the lockfile check during the build process. This can be useful in scenarios where you want to bypass the lockfile check for certain reasons, such as in monorepos, where the lockfile resides in the root folder.", "pr": "https://github.com/Shopify/hydrogen/pull/1736", "docs": "https://shopify.dev/docs/custom-storefronts/hydrogen/cli#deploy", "id": "1736" }, { "title": "Adds `--skip-verification` flag to the build command", "description": "Adding flag to h2 deploy to skip the verification step after the deployment has been completed", "pr": "https://github.com/Shopify/hydrogen/pull/1770", "docs": "https://shopify.dev/docs/custom-storefronts/hydrogen/cli#deploy", "id": "1770" }, { "title": "Adds `--env-file` flag to the build command", "description": "Allowing users to deploy using locally stored environment variables in environment file. Optionally provide the path to a local .env file to override the environment variables set on Admin.", "pr": "https://github.com/Shopify/hydrogen/pull/1743", "docs": "https://shopify.dev/docs/custom-storefronts/hydrogen/cli#deploy", "id": "1743" }, { "title": "Fix issue where customer login does not persist to checkout", "description": "Add `customerAccount` option to `createCartHandler`. `?logged_in=true` will be added to the checkoutUrl for cart query if a customer is logged in", "pr": "https://github.com/Shopify/hydrogen/pull/1719", "id": "1719" }, { "title": "Customer Account API client's query & mutate method now returns errors", "description": "Errors are now an array of GraphQLError(s) that is better formatted. Log GraphQL errors automatically in Customer Account API client, with a new `logErrors: boolean` option to disable it.", "pr": "https://github.com/Shopify/hydrogen/pull/1765", "id": "1765" }, { "title": "Fix `useLoadScript` to avoid infinite re-renders when using its second parameter", "pr": "https://github.com/Shopify/hydrogen/pull/1775", "id": "1775" }, { "title": "Fix 404 not working on certain unknown and i18n routes", "pr": "https://github.com/Shopify/hydrogen/pull/1732", "id": "1732", "steps": [ { "title": "Add a `($locale).tsx` route with the following contents", "code": "YGBganMKaW1wb3J0IHt0eXBlIExvYWRlckZ1bmN0aW9uQXJnc30gZnJvbSAnQHJlbWl4LXJ1bi9zZXJ2ZXItcnVudGltZSc7CgpleHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZGVyKHtwYXJhbXMsIGNvbnRleHR9OiBMb2FkZXJGdW5jdGlvbkFyZ3MpIHsKICBjb25zdCB7bGFuZ3VhZ2UsIGNvdW50cnl9ID0gY29udGV4dC5zdG9yZWZyb250LmkxOG47CgogIGlmICgKICAgIHBhcmFtcy5sb2NhbGUgJiYKICAgIHBhcmFtcy5sb2NhbGUudG9Mb3dlckNhc2UoKSAhPT0gYCR7bGFuZ3VhZ2V9LSR7Y291bnRyeX1gLnRvTG93ZXJDYXNlKCkKICApIHsKICAgIC8vIElmIHRoZSBsb2NhbGUgVVJMIHBhcmFtIGlzIGRlZmluZWQsIHlldCB3ZSBzdGlsbCBhcmUgc3RpbGwgYXQgdGhlIGRlZmF1bHQgbG9jYWxlCiAgICAvLyB0aGVuIHRoZSB0aGUgbG9jYWxlIHBhcmFtIG11c3QgYmUgaW52YWxpZCwgc2VuZCB0byB0aGUgNDA0IHBhZ2UKICAgIHRocm93IG5ldyBSZXNwb25zZShudWxsLCB7c3RhdHVzOiA0MDR9KTsKICB9CgogIHJldHVybiBudWxsOwp9CmBgYA==" } ] }, { "title": "Fix predictive search in skeleton", "pr": "https://github.com/Shopify/hydrogen/pull/1783", "id": "1783" } ], "features": [] }, { "title": "Bug fixes and improvements", "version": "2024.1.1", "date": "", "hash": "49a167e825e8ce49a8a65078a87bd35d53f18c34", "pr": "https://github.com/Shopify/hydrogen/pull/1696", "commit": "https://github.com/Shopify/hydrogen/commit/49a167e825e8ce49a8a65078a87bd35d53f18c34", "dependencies": { "@remix-run/react": "2.5.1", "@shopify/cli-hydrogen": "^7.0.1", "@shopify/hydrogen": "^2024.1.1", "@shopify/remix-oxygen": "^2.0.3" }, "devDependencies": { "@remix-run/dev": "2.5.1", "typescript": "^5.2.2", "@shopify/cli": "3.52.0", "@shopify/oxygen-workers-types": "^4.0.0", "@remix-run/server-runtime": "2.5.1" }, "dependenciesMeta": { "typescript": { "required": true }, "@shopify/oxygen-workers-types": { "required": true }, "@shopify/cli": { "required": true }, "@remix-run/server-runtime": { "required": true } }, "fixes": [ { "title": "Add support for multiple schemas in GraphiQL. Fix GraphiQL links in Subrequest Profiler.", "pr": "https://github.com/Shopify/hydrogen/pull/1693", "id": "1693" }, { "title": "CustomerClient type is deprecated and replaced by CustomerAccount", "pr": "https://github.com/Shopify/hydrogen/pull/1692", "id": "1692" }, { "title": "Skip prompt about creating h2 shortcut during init flow if it has been already added to the environment", "pr": "https://github.com/Shopify/hydrogen/pull/1718", "id": "1718" }, { "title": "Bump Codegen dependencies to fix known bugs and remove patches", "pr": "https://github.com/Shopify/hydrogen/pull/1705", "id": "1705" }, { "title": "Fix local asset path to Oxygen to return valid preflight headers", "pr": "https://github.com/Shopify/hydrogen/pull/1709", "id": "1709" }, { "title": "Log GraphQL errors automatically in Storefront client, with a new logErrors: boolean option to disable it. Add back a link to GraphiQL in the error message.", "pr": "https://github.com/Shopify/hydrogen/pull/1690", "id": "1690" } ], "features": [] }, { "title": "SFAPI 2024-01, Remix 2.51, Customer Account API, Examples, and more", "version": "2024.1.0", "date": "", "hash": "c1e66ef0071de0040da16eefb69b3b34ac5729b4", "pr": "https://github.com/Shopify/hydrogen/pull/1631", "commit": "https://github.com/Shopify/hydrogen/commit/c1e66ef0071de0040da16eefb69b3b34ac5729b4", "dependencies": { "@remix-run/react": "2.5.1", "@shopify/cli-hydrogen": "^7.0.0", "@shopify/hydrogen": "^2024.1.0", "@shopify/remix-oxygen": "^2.0.3" }, "devDependencies": { "@remix-run/dev": "2.5.1", "typescript": "^5.2.2", "@shopify/cli": "3.52.0", "@shopify/oxygen-workers-types": "^4.0.0", "@remix-run/server-runtime": "2.5.1" }, "dependenciesMeta": { "typescript": { "required": true }, "@shopify/oxygen-workers-types": { "required": true }, "@shopify/cli": { "required": true }, "@remix-run/server-runtime": { "required": true } }, "fixes": [ { "title": "Remove deprecated build command flags `--base`, `--entry`, `--target`. Additionally, `--codegen-unstable` is now `--codegen`", "pr": "https://github.com/Shopify/hydrogen/pull/1640", "id": "1640" }, { "title": "Fix step-debugging when running in the Node.js sandbox", "pr": "https://github.com/Shopify/hydrogen/pull/1501", "id": "1501" }, { "title": "Generate sourcemaps by default when running the deploy command", "pr": "https://github.com/Shopify/hydrogen/pull/1623", "id": "1623" }, { "title": "Fix the component to render canonical URLs without trailing slashes", "pr": "https://github.com/Shopify/hydrogen/pull/1622", "id": "1622" }, { "title": "Fix error stack traces thrown by API clients if promises are not awaited", "pr": "https://github.com/Shopify/hydrogen/pull/1656", "id": "1656" }, { "title": "Fix 's onPause event listener, with improved readability", "pr": "https://github.com/Shopify/hydrogen/pull/1669", "id": "1669" }, { "title": "Add React.forwardRef to Video and ExternalVideo components", "pr": "https://github.com/Shopify/hydrogen/pull/1415", "id": "1415" }, { "title": "Fix step-debugging when running in the Node.js sandbox", "pr": "https://github.com/Shopify/hydrogen/pull/1501", "id": "1501" }, { "title": "Use new `variantBySelectedOptions` parameters introduced in Storefront API v2024-01 to fix redirection to the product's default variant when there are unknown query params in the URL.", "pr": "https://github.com/Shopify/hydrogen/pull/1642", "id": "1642", "steps": [ { "title": "Update the `product` query to include the `variantBySelectedOptions` parameters `ignoreUnknownOptions` and `caseInsensitiveMatch`", "code": "YGBgZGlmZgotICAgc2VsZWN0ZWRWYXJpYW50OiB2YXJpYW50QnlTZWxlY3RlZE9wdGlvbnMoc2VsZWN0ZWRPcHRpb25zOiAkc2VsZWN0ZWRPcHRpb25zKSB7CisgICBzZWxlY3RlZFZhcmlhbnQ6IHZhcmlhbnRCeVNlbGVjdGVkT3B0aW9ucyhzZWxlY3RlZE9wdGlvbnM6ICRzZWxlY3RlZE9wdGlvbnMsIGlnbm9yZVVua25vd25PcHRpb25zOiB0cnVlLCBjYXNlSW5zZW5zaXRpdmVNYXRjaDogdHJ1ZSkgewogICAgICAuLi5Qcm9kdWN0VmFyaWFudAogICAgfQpgYGA=" } ] } ], "features": [ { "title": "Use Customer Account API in templates/skeleton & template/demo-store", "pr": "https://github.com/Shopify/hydrogen/pull/1576", "id": "1576" }, { "title": "Add Subscriptions / Selling Plans example", "pr": "https://github.com/Shopify/hydrogen/pull/1582", "id": "1582" }, { "title": "Add Optimistic Cart UI item remove example", "pr": "https://github.com/Shopify/hydrogen/pull/1557", "id": "1557" }, { "title": "Add multipass example", "pr": "https://github.com/Shopify/hydrogen/pull/1540", "id": "1540" }, { "title": "Add Third-party Queries and Caching example", "pr": "https://github.com/Shopify/hydrogen/pull/1559", "id": "1559" }, { "title": "Update the GraphQL config in .graphqlrc.yml to use the more modern projects structure:", "pr": "https://github.com/Shopify/hydrogen/pull/1577", "id": "1577", "steps": [ { "title": "This allows you to add additional projects to the GraphQL config, such as third party CMS schemas.", "code": "YGBgZGlmZgotc2NoZW1hOiBub2RlX21vZHVsZXMvQHNob3BpZnkvaHlkcm9nZW4vc3RvcmVmcm9udC5zY2hlbWEuanNvbgorcHJvamVjdHM6CisgZGVmYXVsdDoKKyAgICBzY2hlbWE6ICdub2RlX21vZHVsZXMvQHNob3BpZnkvaHlkcm9nZW4vc3RvcmVmcm9udC5zY2hlbWEuanNvbgpgYGA=" }, { "title": "Also, you can modify the document paths used for the Storefront API queries. This is useful if you have a large codebase and want to exclude certain files from being used for codegen or other GraphQL utilities:", "code": "IGBgYHlhbWwKICAgIHByb2plY3RzOgogICAgICBkZWZhdWx0OgogICAgICAgIHNjaGVtYTogJ25vZGVfbW9kdWxlcy9Ac2hvcGlmeS9oeWRyb2dlbi9zdG9yZWZyb250LnNjaGVtYS5qc29uJwogICAgICAgIGRvY3VtZW50czoKICAgICAgICAgIC0gJyEqLmQudHMnCiAgICAgICAgICAtICcqLnt0cyx0c3gsanMsanN4fScKICAgICAgICAgIC0gJ2FwcC8qKi8qLnt0cyx0c3gsanMsanN4fScKICAgIGBgYA==" } ] }, { "title": "Use new `variantBySelectedOptions` parameters introduced in Storefront API v2024-01 to fix redirection to the product's default variant when there are unknown query params in the URL.", "pr": "https://github.com/Shopify/hydrogen/pull/1642", "id": "1642", "steps": [ { "title": "Update the `product` query to include the `variantBySelectedOptions` parameters `ignoreUnknownOptions` and `caseInsensitiveMatch`", "code": "YGBgZGlmZgotICAgc2VsZWN0ZWRWYXJpYW50OiB2YXJpYW50QnlTZWxlY3RlZE9wdGlvbnMoc2VsZWN0ZWRPcHRpb25zOiAkc2VsZWN0ZWRPcHRpb25zKSB7CisgICBzZWxlY3RlZFZhcmlhbnQ6IHZhcmlhbnRCeVNlbGVjdGVkT3B0aW9ucyhzZWxlY3RlZE9wdGlvbnM6ICRzZWxlY3RlZE9wdGlvbnMsIGlnbm9yZVVua25vd25PcHRpb25zOiB0cnVlLCBjYXNlSW5zZW5zaXRpdmVNYXRjaDogdHJ1ZSkgewogICAgICAuLi5Qcm9kdWN0VmFyaWFudAogICAgfQpgYGA=" } ] }, { "title": "Add `createCustomerAccountClient` for interacting with the Customer Account API", "pr": "https://github.com/Shopify/hydrogen/pull/1606", "id": "1606", "docs": "https://shopify.dev/docs/api/hydrogen/2024-01/utilities/createcustomeraccountclient" }, { "title": "Enhanced Subrequest Profiler developer tool to enable better observability of server-side network requests and caching behaviors", "pr": "https://github.com/Shopify/hydrogen/pull/1511", "id": "1511", "docs": "https://shopify.dev/docs/custom-storefronts/hydrogen/debugging/subrequest-profiler" }, { "title": "Upgrade to Storefront API v2024-01", "pr": "https://github.com/Shopify/hydrogen/pull/1642", "id": "1642" }, { "title": "Custom createContentSecurityPolicy directives now extend the default domains, instead of overriding them", "pr": "https://github.com/Shopify/hydrogen/pull/1593", "id": "1593" }, { "title": "Better Hydrogen error handling", "pr": "https://github.com/Shopify/hydrogen/pull/1645", "id": "1645", "steps": [ { "title": "Changed the shape of the error objects returned by createCartHandler. Previously, mutations could return an errors array that contained a userErrors array. With this change, these arrays are no longer nested. The response can contain both an errors array and a userErrors array. errors contains GraphQL execution errors. userErrors contains errors caused by the cart mutation itself (such as adding a product that has zero inventory). storefront.isApiError is deprecated.", "code": "YGBgZGlmZgotIGNvbnN0IGRhdGEgPSBhd2FpdCBjb250ZXh0LnN0b3JlZnJvbnQucXVlcnkoRVhBTVBMRV9RVUVSWSkKKyBjb25zdCB7ZGF0YSwgZXJyb3JzLCB1c2VyRXJyb3JzfSA9IGF3YWl0IGNvbnRleHQuc3RvcmVmcm9udC5xdWVyeShFWEFNUExFX1FVRVJZKSAKYGBgCgpgYGBkaWZmCi0gY29uc3QgY2FydCA9IGF3YWl0IGNvbnRleHQuY2FydC5nZXQoKQorIGNvbnN0IHtjYXJ0LCBlcnJvcnMsIHVzZXJFcnJvcnN9ID0gYXdhaXQgY29udGV4dC5jYXJ0LmdldCgpCmBgYA==" } ] }, { "title": "Allow creating new storefront when running the init command", "pr": "https://github.com/Shopify/hydrogen/pull/1681", "id": "1681" }, { "title": "Update to Remix version ^2.5.1 and enable `v3_fetcherPersist` and `v3_relativeSplatpath` future flags", "pr": "https://github.com/Shopify/hydrogen/pull/1639", "id": "1639" }, { "title": "Add deploy command to Hydrogen CLI", "pr": "https://github.com/Shopify/hydrogen/pull/1628", "id": "1628", "steps": [ { "title": "Use the new `h2 deploy` command to deploy your app", "code": "YGBgYmFzaApucHggc2hvcGlmeSBoeWRyb2dlbiBkZXBsb3kgLS1oZWxwCmBgYA==" } ] }, { "title": "Add `--template` flag to enable scaffolding projects based on examples from the Hydrogen repo", "pr": "https://github.com/Shopify/hydrogen/pull/1608", "id": "1608", "steps": [ { "title": "Use the new `--template` flag to scaffold your app", "code": "YGBgYmFzaApucG0gY3JlYXRlIEBzaG9waWZ5L2h5ZHJvZ2VuQGxhdGVzdCAtLSAtLXRlbXBsYXRlIG11bHRpcGFzcwpgYGA=" } ] }, { "title": "Add --diff flag to dev and build commands, used for building Hydrogen app examples", "pr": "https://github.com/Shopify/hydrogen/pull/1549", "id": "1549" }, { "title": "Make the worker runtime the default environment for the local dev and preview.", "pr": "https://github.com/Shopify/hydrogen/pull/1625", "id": "1625", "steps": [ { "title": "To access the legacy Node.js runtime, pass the --legacy-runtime flag. The legacy runtime will be deprecated and removed in a future release.", "code": "YGBgZGlmZgoic2NyaXB0cyI6IHsKLSAgICJkZXYiOiAic2hvcGlmeSBoeWRyb2dlbiBkZXYgLS1jb2RlZ2VuIiwKKyAgICJkZXYiOiAic2hvcGlmeSBoeWRyb2dlbiBkZXYgLS1jb2RlZ2VuIC0tbGVnYWN5LXJ1bnRpbWUiLAotICAgICJwcmV2aWV3IjogIm5wbSBydW4gYnVpbGQgJiYgc2hvcGlmeSBoeWRyb2dlbiBwcmV2aWV3IiwKKyAgICAicHJldmlldyI6ICJucG0gcnVuIGJ1aWxkICYmIHNob3BpZnkgaHlkcm9nZW4gcHJldmlldyAtLWxlZ2FjeS1ydW50aW1lIiwKfQpgYGA=" } ] }, { "title": "Make default HydrogenSession type extensible", "pr": "https://github.com/Shopify/hydrogen/pull/1590", "id": "1590", "steps": [ { "title": "New HydrogenSession type", "code": "YGBgZGlmZgppbXBvcnQgeworIHR5cGUgSHlkcm9nZW5TZXNzaW9uLAp9IGZyb20gJ0BzaG9waWZ5L2h5ZHJvZ2VuJzsKCi0gY2xhc3MgSHlkcm9nZW5TZXNzaW9uIHsKKyBjbGFzcyBBcHBTZXNzaW9uIGltcGxlbWVudHMgSHlkcm9nZW5TZXNzaW9uIHsKICAgIC4uLgp9CmBgYA==" } ] } ] }, { "title": "Fix XSS vulnerability in the SEO component", "version": "2023.10.5", "date": "", "hash": "65662a048a97b81206bc062f6412d5e62278ebb6", "pr": "https://github.com/Shopify/hydrogen/pull/1843", "commit": "https://github.com/Shopify/hydrogen/pull/1843/commits/65662a048a97b81206bc062f6412d5e62278ebb6", "dependencies": { "@remix-run/react": "2.1.0", "@shopify/cli-hydrogen": "^6.1.0", "@shopify/hydrogen": "^2023.10.4", "@shopify/remix-oxygen": "^2.0.2" }, "devDependencies": { "@remix-run/dev": "2.1.0", "typescript": "^5.2.2", "@shopify/cli": "3.51.0", "@shopify/oxygen-workers-types": "^4.0.0", "@remix-run/server-runtime": "2.1.0" }, "dependenciesMeta": { "typescript": { "required": true }, "@shopify/oxygen-workers-types": { "required": true }, "@shopify/cli": { "required": true }, "@remix-run/server-runtime": { "required": true } }, "fixes": [ { "title": "Fix XSS vulnerability in the SEO component", "pr": "https://github.com/Shopify/hydrogen/pull/1843", "id": "1843" } ], "features": [] }, { "title": "Fix redirect bug", "version": "2023.10.4", "date": "", "hash": "c1e66ef0071de0040da16eefb69b3b34ac5729b4", "pr": "https://github.com/Shopify/hydrogen/pull/1631", "commit": "https://github.com/Shopify/hydrogen/commit/c1e66ef0071de0040da16eefb69b3b34ac5729b4", "dependencies": { "@remix-run/react": "2.1.0", "@shopify/cli-hydrogen": "^6.1.0", "@shopify/hydrogen": "^2023.10.4", "@shopify/remix-oxygen": "^2.0.2" }, "devDependencies": { "@remix-run/dev": "2.1.0", "typescript": "^5.2.2", "@shopify/cli": "3.51.0", "@shopify/oxygen-workers-types": "^4.0.0", "@remix-run/server-runtime": "2.1.0" }, "dependenciesMeta": { "typescript": { "required": true }, "@shopify/oxygen-workers-types": { "required": true }, "@shopify/cli": { "required": true }, "@remix-run/server-runtime": { "required": true } }, "fixes": [ { "title": "Fix redirect bug", "pr": "https://github.com/Shopify/hydrogen/pull/1631", "id": "1631" } ], "features": [] }, { "title": "New upgrade command, enhanced dev --debug, Pagination component fix and `ShopPayButton` attribution prop", "version": "2023.10.3", "date": "", "hash": "727baacf60090a29fc58c91e75cf3efa7a0bdf7d", "pr": "https://github.com/Shopify/hydrogen/pull/1491", "commit": "https://github.com/Shopify/hydrogen/commit/727baacf60090a29fc58c91e75cf3efa7a0bdf7d", "dependencies": { "@remix-run/react": "2.1.0", "@shopify/cli-hydrogen": "^6.1.0", "@shopify/hydrogen": "^2023.10.3", "@shopify/remix-oxygen": "^2.0.2" }, "devDependencies": { "@remix-run/dev": "2.1.0", "typescript": "^5.2.2", "@shopify/cli": "3.51.0", "@shopify/oxygen-workers-types": "^4.0.0", "@remix-run/server-runtime": "2.1.0" }, "dependenciesMeta": { "typescript": { "required": true }, "@shopify/oxygen-workers-types": { "required": true }, "@shopify/cli": { "required": true }, "@remix-run/server-runtime": { "required": true } }, "fixes": [ { "title": "Update the return types of the Customer Account API query and mutation methods", "pr": "https://github.com/Shopify/hydrogen/pull/1537", "id": "1537" }, { "title": "Remove error boundary from robots.txt in hydrogen template", "pr": "https://github.com/Shopify/hydrogen/pull/1492", "id": "1492" }, { "title": "Fix the Pagination component to always restore scroll correctly on back/forth navigation", "description": "This has the side effect of causing a hydration error _only_ when the user refreshes an already paginated page. This is because during refresh the Paginated list is rendered with navigation state, _not_ the state returned by the server. Navigation state might contain many pages of data, so all of it is necessary to properly render the page height and restore scroll. The side effect of this is the hydration mismatch. We feel it isn't often the user would hard refresh the page, and when doing so, a hydration mismatch and flash of rendered content is an acceptable downside to accurately maintaining scroll location", "pr": "https://github.com/Shopify/hydrogen/pull/1508", "id": "1508" }, { "title": "In TypeScript projects, when updating to the latest `@shopify/remix-oxygen` adapter release, please update also to the latest version of `@shopify/oxygen-workers-types`", "pr": "https://github.com/Shopify/hydrogen/pull/1494", "id": "1494", "steps": [ { "title": "Upgrade @shopify/oxygen-workers-types dependency", "code": "YGBgZGlmZgoiZGV2RGVwZW5kZW5jaWVzIjogewogICJAcmVtaXgtcnVuL2RldiI6ICIyLjEuMCIsCiAgIkByZW1peC1ydW4vZXNsaW50LWNvbmZpZyI6ICIyLjEuMCIsCi0gIkBzaG9waWZ5L294eWdlbi13b3JrZXJzLXR5cGVzIjogIl4zLjE3LjMiLAorICJAc2hvcGlmeS9veHlnZW4td29ya2Vycy10eXBlcyI6ICJeNC4wLjAiLAogICJAc2hvcGlmeS9wcmV0dGllci1jb25maWciOiAiXjEuMS4yIiwKICAuLi4KfSwKYGBg" } ] }, { "title": "Add `multipass` example for checkout login persistence in Shopify Plus", "pr": "https://github.com/Shopify/hydrogen/pull/1427", "id": "1427" }, { "title": "Export caching types to make creating custom clients easier in typescript", "pr": "https://github.com/Shopify/hydrogen/pull/1507", "id": "1507" }, { "title": "Update all Node.js dependencies to version 18", "pr": "https://github.com/Shopify/hydrogen/pull/1543", "id": "1543" }, { "title": "Updated internal dependencies for bug resolution", "pr": "https://github.com/Shopify/hydrogen/pull/1496", "id": "1496", "steps": [ { "title": "Update the `@shopify/cli` dependency in your app to avoid duplicated subdependencies: ", "code": "YGBgZGlmZgogICJkZXBlbmRlbmNpZXMiOiB7Ci0gICAiQHNob3BpZnkvY2xpIjogIjMuNTAuMiIsCisgICAiQHNob3BpZnkvY2xpIjogIjMuNTEuMCIsCiAgfQpgYGA=" } ] }, { "title": "Fix peer dependencies across packages", "pr": "https://github.com/Shopify/hydrogen/pull/1489", "id": "1489" }, { "title": "Add `@remix-run/server-runtime` as a dev dependency. ", "id": "1489", "pr": "https://github.com/Shopify/hydrogen/pull/1489", "steps": [ { "title": "Since Remix is now a peer dependency of `@shopify/remix-oxygen`, you need to add `@remix-run/server-runtime` to your dependencies with the same version you have for the rest of Remix dependencies", "code": "YGBgZGlmZgoiZGVwZW5kZW5jaWVzIjogewogICJAcmVtaXgtcnVuL3JlYWN0IjogIjIuMS4wIgorICJAcmVtaXgtcnVuL3NlcnZlci1ydW50aW1lIjogIjIuMS4wIgogIC4uLgp9CmBgYA==" } ] } ], "features": [ { "title": "New `h2 upgrade` command", "docs": "https://shopify.dev/docs/custom-storefronts/hydrogen/cli#upgrade", "pr": "https://github.com/Shopify/hydrogen/pull/1458", "id": "1458", "steps": [ { "title": "Try the upgrade command via", "code": "YGBgYmFzaAojIGZyb20gdGhlIGJhc2Ugb2YgdGhlIHByb2plY3QgcnVuCmgyIHVwZ3JhZGUKYGBg" }, { "title": "Upgrade to a specific Hydrogen version with the --version flag", "code": "YGBgYmFzaApoMiB1cGdyYWRlIC0tdmVyc2lvbiAyMDIzLjEwLjMKYGBg" } ] }, { "title": "Serve assets from a separate domain that mimicks production during dev", "pr": "https://github.com/Shopify/hydrogen/pull/1503", "id": "1503" }, { "title": "Enable debugger connections by passing `--debug` flag to the `h2 dev` command", "description": "You can then connect to the port `9229` (configurable with the new `--inspector-port` flag) to start step debugging. When using `--worker`, an improved version of the DevTools will be available in `localhost:9229`. Otherwise, in Chrome you can go to `chrome://inspect` to open the DevTools -- make sure the inspector port is added to the network targets.", "pr": "https://github.com/Shopify/hydrogen/pull/1480", "id": "1480", "steps": [ { "title": "Debugging on the default runtime (Node.js sandbox):", "code": "YGBgYmFzaApoMiBkZXYgLS1kZWJ1ZwpgYGA=" }, { "title": "Debugging on the new worker runtime:", "code": "YGBgYmFzaApoMiBkZXYgLS1kZWJ1ZyAtLXdvcmtlci11bnN0YWJsZQpgYGA=" } ] }, { "title": "Added an optional prop to the `ShopPayButton` to enable order attribution support for either the Headless or Hydrogen sales channel.", "id": "1447", "pr": "https://github.com/Shopify/hydrogen/pull/1447", "steps": [ { "title": "Customize the order attribution via the `channel` prop", "docs": "https://shopify.dev/docs/api/hydrogen-react/latest/components/shoppaybutton", "code": "YGBgZGlmZgo8U2hvcFBheUJ1dHRvbgogICAgdmFyaWFudElkcz17W3ZhcmlhbnRJZF19CiAgICBzdG9yZURvbWFpbj17c3RvcmVEb21haW59CisgIGNoYW5uZWw9ImhlYWRsZXNzIHx8IGh5ZHJvZ2VuIgovPgpgYGA=" } ] } ] }, { "title": "Moved @remix-run/server-runtime to peer dependency", "version": "2023.10.2", "date": "", "hash": "875d35f52fcfd8006e78217cfac0096122f98a54", "pr": "https://github.com/Shopify/hydrogen/pull/1486", "commit": "https://github.com/Shopify/hydrogen/pull/1486/commits/875d35f52fcfd8006e78217cfac0096122f98a54", "dependencies": { "@remix-run/react": "2.1.0", "@shopify/cli-hydrogen": "^6.0.2", "@shopify/hydrogen": "^2023.10.2", "@shopify/remix-oxygen": "^2.0.1" }, "devDependencies": { "@remix-run/dev": "2.1.0", "typescript": "^5.2.2" }, "dependenciesMeta": { "typescript": { "required": true } }, "fixes": [ { "title": "Moved @remix-run/server-runtime to peer dependency", "pr": "https://github.com/Shopify/hydrogen/pull/1484", "id": "1484" } ], "features": [] }, { "title": "Fix h2 init flow and SEO canonical tags", "version": "2023.10.1", "date": "", "hash": "58e63ce4ebda28dedb82fd8e2b461927fee68fb3", "pr": "https://github.com/Shopify/hydrogen/pull/1479", "commit": "https://github.com/Shopify/hydrogen/pull/1453/commits/58e63ce4ebda28dedb82fd8e2b461927fee68fb3", "dependencies": { "@remix-run/react": "2.1.0", "@shopify/cli-hydrogen": "^6.0.1", "@shopify/hydrogen": "^2023.10.1", "@shopify/remix-oxygen": "^2.0.0" }, "devDependencies": { "@remix-run/dev": "2.1.0", "typescript": "^5.2.2" }, "dependenciesMeta": { "typescript": { "required": true } }, "fixes": [ { "title": "Fix Shopify login during the init flow where the process would just exit when awaiting for a keypress", "pr": "https://github.com/Shopify/hydrogen/pull/1481", "id": "1481" }, { "title": "Removed URL params from canonical tags in SEO component", "pr": "https://github.com/Shopify/hydrogen/pull/1478", "id": "1478" } ], "features": [] }, { "title": "Storefront API version 2023.10, Remix v2, Customer API client and more", "version": "2023.10.0", "date": "", "hash": "2e4afc2f88a2ed2e280c8845bef7c037d453a28e", "pr": "https://github.com/Shopify/hydrogen/pull/1453", "commit": "https://github.com/Shopify/hydrogen/pull/1453/commits/2e4afc2f88a2ed2e280c8845bef7c037d453a28e", "dependencies": { "@remix-run/react": "2.1.0", "@shopify/cli-hydrogen": "^6.0.0", "@shopify/hydrogen": "^2023.10.0", "@shopify/remix-oxygen": "^2.0.0" }, "devDependencies": { "@remix-run/dev": "2.1.0", "typescript": "^5.2.2" }, "dependenciesMeta": { "typescript": { "required": true } }, "fixes": [ { "title": "Fix template dist package due to CI error", "pr": "https://github.com/Shopify/hydrogen/pull/1451", "id": "1451" }, { "title": "Custom cart methods are now stable", "pr": "https://github.com/Shopify/hydrogen/pull/1440", "id": "1440", "steps": [ { "title": "Update `createCartHandler` if needed", "code": "Ly8gc2VydmVyLnRzCgpgYGBkaWZmCmNvbnN0IGNhcnQgPSBjcmVhdGVDYXJ0SGFuZGxlcih7CiAgIHN0b3JlZnJvbnQsCiAgIGdldENhcnRJZCwKICAgc2V0Q2FydElkOiBjYXJ0U2V0SWREZWZhdWx0KCksCi0gIGN1c3RvbU1ldGhvZHNfX3Vuc3RhYmxlOiB7CisgIGN1c3RvbU1ldGhvZHM6IHsKICAgICBhZGRMaW5lczogYXN5bmMgKGxpbmVzLCBvcHRpb25hbFBhcmFtcykgPT4gewogICAgICAvLyAuLi4KICAgICB9LAogICB9LAogfSk7CmBgYA==" } ] }, { "title": "Remove deprecated parameters and props", "info": "`createStorefrontClient` parameters `buyerIp` and `requestGroupId`. props `loaderOptions` and `widths`", "pr": "https://github.com/Shopify/hydrogen/pull/1435", "id": "1435" }, { "title": "Updated CLI dependencies to improve terminal output.", "pr": "https://github.com/Shopify/hydrogen/pull/1456", "id": "1456", "breaking": true, "steps": [ { "title": "Upgrade `@shopify/cli dependency`", "code": "YGBgYmFzaApucG0gYWRkIEBzaG9waWZ5L2NsaUAzLjUwLjAKYGBg" } ] }, { "title": "Updated the starter template `Header` and `Footer` menu components for 2023.10.0", "pr": "https://github.com/Shopify/hydrogen/pull/1465", "id": "1465", "breaking": true, "info": "The Storefront API 2023-10 now returns menu item URLs that include the `primaryDomainUrl`, instead of defaulting to the Shopify store ID URL (example.myshopify.com). The skeleton template requires changes to check for the `primaryDomainUrl`:", "steps": [ { "title": "Update the HeaderMenu component to accept a primaryDomainUrl and include it in the internal url check", "code": "YGBgZGlmZgovLyBhcHAvY29tcG9uZW50cy9IZWFkZXIudHN4CgorIGltcG9ydCB0eXBlIHtIZWFkZXJRdWVyeX0gZnJvbSAnc3RvcmVmcm9udGFwaS5nZW5lcmF0ZWQnOwoKZXhwb3J0IGZ1bmN0aW9uIEhlYWRlck1lbnUoewogIG1lbnUsCisgIHByaW1hcnlEb21haW5VcmwsCiAgdmlld3BvcnQsCn06IHsKICBtZW51OiBIZWFkZXJQcm9wc1snaGVhZGVyJ11bJ21lbnUnXTsKKyAgcHJpbWFyeURvbWFpblVybDogSGVhZGVyUXVlcnlbJ3Nob3AnXVsncHJpbWFyeURvbWFpbiddWyd1cmwnXTsKICB2aWV3cG9ydDogVmlld3BvcnQ7Cn0pIHsKCiAgLy8gLi4uY29kZQoKICAvLyBpZiB0aGUgdXJsIGlzIGludGVybmFsLCB3ZSBzdHJpcCB0aGUgZG9tYWluCiAgY29uc3QgdXJsID0KICAgIGl0ZW0udXJsLmluY2x1ZGVzKCdteXNob3BpZnkuY29tJykgfHwKICAgIGl0ZW0udXJsLmluY2x1ZGVzKHB1YmxpY1N0b3JlRG9tYWluKSB8fAorICAgaXRlbS51cmwuaW5jbHVkZXMocHJpbWFyeURvbWFpblVybCkKICAgICAgPyBuZXcgVVJMKGl0ZW0udXJsKS5wYXRobmFtZQogICAgICA6IGl0ZW0udXJsOwoKICAgLy8gLi4uY29kZQoKfQpgYGA=", "file": "app/components/Header.tsx" }, { "title": "Update the FooterMenu component to accept a primaryDomainUrl prop and include it in the internal url check", "code": "YGBgZGlmZgovLyBhcHAvY29tcG9uZW50cy9Gb290ZXIudHN4CgotIGltcG9ydCB0eXBlIHtGb290ZXJRdWVyeX0gZnJvbSAnc3RvcmVmcm9udGFwaS5nZW5lcmF0ZWQnOworIGltcG9ydCB0eXBlIHtGb290ZXJRdWVyeSwgSGVhZGVyUXVlcnl9IGZyb20gJ3N0b3JlZnJvbnRhcGkuZ2VuZXJhdGVkJzsKCmZ1bmN0aW9uIEZvb3Rlck1lbnUoewogIG1lbnUsCisgIHByaW1hcnlEb21haW5VcmwsCn06IHsKICBtZW51OiBGb290ZXJRdWVyeVsnbWVudSddOworICBwcmltYXJ5RG9tYWluVXJsOiBIZWFkZXJRdWVyeVsnc2hvcCddWydwcmltYXJ5RG9tYWluJ11bJ3VybCddOwp9KSB7CiAgLy8gY29kZS4uLgoKICAvLyBpZiB0aGUgdXJsIGlzIGludGVybmFsLCB3ZSBzdHJpcCB0aGUgZG9tYWluCiAgY29uc3QgdXJsID0KICAgIGl0ZW0udXJsLmluY2x1ZGVzKCdteXNob3BpZnkuY29tJykgfHwKICAgIGl0ZW0udXJsLmluY2x1ZGVzKHB1YmxpY1N0b3JlRG9tYWluKSB8fAorICAgaXRlbS51cmwuaW5jbHVkZXMocHJpbWFyeURvbWFpblVybCkKICAgICAgPyBuZXcgVVJMKGl0ZW0udXJsKS5wYXRobmFtZQogICAgICA6IGl0ZW0udXJsOwoKICAgLy8gLi4uY29kZQoKICApOwp9CmBgYA==", "file": "app/components/Footer.tsx" }, { "title": "Update the Footer component to accept a shop prop", "code": "YGBgZGlmZgpleHBvcnQgZnVuY3Rpb24gRm9vdGVyKHsKICBtZW51LAorIHNob3AsCn06IEZvb3RlclF1ZXJ5ICYge3Nob3A6IEhlYWRlclF1ZXJ5WydzaG9wJ119KSB7CiAgcmV0dXJuICgKICAgIDxmb290ZXIgY2xhc3NOYW1lPSJmb290ZXIiPgotICAgICAgPEZvb3Rlck1lbnUgbWVudT17bWVudX0gLz4KKyAgICAgIDxGb290ZXJNZW51IG1lbnU9e21lbnV9IHByaW1hcnlEb21haW5Vcmw9e3Nob3AucHJpbWFyeURvbWFpbi51cmx9IC8+CiAgICA8L2Zvb3Rlcj4KICApOwp9CmBgYA==", "file": "app/components/Footer.tsx" }, { "title": "Update Layout.tsx to pass the shop prop", "code": "YGBgZGlmZgpleHBvcnQgZnVuY3Rpb24gTGF5b3V0KHsKICBjYXJ0LAogIGNoaWxkcmVuID0gbnVsbCwKICBmb290ZXIsCiAgaGVhZGVyLAogIGlzTG9nZ2VkSW4sCn06IExheW91dFByb3BzKSB7CiAgcmV0dXJuICgKICAgIDw+CiAgICAgIDxDYXJ0QXNpZGUgY2FydD17Y2FydH0gLz4KICAgICAgPFNlYXJjaEFzaWRlIC8+CiAgICAgIDxNb2JpbGVNZW51QXNpZGUgbWVudT17aGVhZGVyLm1lbnV9IHNob3A9e2hlYWRlci5zaG9wfSAvPgogICAgICA8SGVhZGVyIGhlYWRlcj17aGVhZGVyfSBjYXJ0PXtjYXJ0fSBpc0xvZ2dlZEluPXtpc0xvZ2dlZElufSAvPgogICAgICA8bWFpbj57Y2hpbGRyZW59PC9tYWluPgogICAgICA8U3VzcGVuc2U+CiAgICAgICAgPEF3YWl0IHJlc29sdmU9e2Zvb3Rlcn0+Ci0gICAgICAgICAgeyhmb290ZXIpID0+IDxGb290ZXIgbWVudT17Zm9vdGVyLm1lbnV9ICAvPn0KKyAgICAgICAgICB7KGZvb3RlcikgPT4gPEZvb3RlciBtZW51PXtmb290ZXIubWVudX0gc2hvcD17aGVhZGVyLnNob3B9IC8+fQogICAgICAgIDwvQXdhaXQ+CiAgICAgIDwvU3VzcGVuc2U+CiAgICA8Lz4KICApOwp9CmBgYA==", "file": "app/components/Layout.tsx" } ] }, { "title": "Enhance useMatches returned type inference", "pr": "https://github.com/Shopify/hydrogen/pull/1289", "id": "1289", "steps": [ { "title": "If you are calling `useMatches()` in different places of your app to access the data returned by the root loader, you may want to update it to the following pattern to enhance types:", "code": "YGBgdHMKLy8gcm9vdC50c3gKCmltcG9ydCB7dXNlTWF0Y2hlc30gZnJvbSAnQHJlbWl4LXJ1bi9yZWFjdCc7CmltcG9ydCB7dHlwZSBTZXJpYWxpemVGcm9tfSBmcm9tICdAc2hvcGlmeS9yZW1peC1veHlnZW4nOwoKZXhwb3J0IGNvbnN0IHVzZVJvb3RMb2FkZXJEYXRhID0gKCkgPT4gewogIGNvbnN0IFtyb290XSA9IHVzZU1hdGNoZXMoKTsKICByZXR1cm4gcm9vdD8uZGF0YSBhcyBTZXJpYWxpemVGcm9tPHR5cGVvZiBsb2FkZXI+Owp9OwoKZXhwb3J0IGZ1bmN0aW9uIGxvYWRlcihjb250ZXh0KSB7CiAgLy8gLi4uCn0KYGBg" } ] } ], "features": [ { "title": "Added a client to query the Customer Account API", "pr": "https://github.com/Shopify/hydrogen/pull/1430", "id": "1430", "docs": "https://shopify.dev/docs/api/hydrogen/latest/utilities/createcustomerclient" }, { "title": "Update Storefront API version to 2023-10", "pr": "https://github.com/Shopify/hydrogen/pull/1431", "id": "1431", "docs": "https://shopify.dev/docs/api/release-notes/2023-10#graphql-storefront-api-changes" }, { "title": "Add query explorer plugin to GraphiQL", "pr": "https://github.com/Shopify/hydrogen/pull/1470", "id": "1470", "info": "Start your dev server and load `http://localhost:3000/graphiql` to use GraphiQL" }, { "title": "Added support for Remix v2.1.0 and now a peer dependency", "pr": "https://github.com/Shopify/hydrogen/pull/1289", "id": "1289", "breaking": true, "info": "Remix is now a peer dependency. This means that you can upgrade to newer Remix 2.x versions without upgrading Hydrogen", "docs": "https://github.com/remix-run/remix/releases/tag/remix%402.0.0" }, { "title": "The Codegen feature is now considered stable and related dependencies have been updated", "pr": "https://github.com/Shopify/hydrogen/pull/1108", "id": "1108", "breaking": true, "info": "Use --codegen flag instead of --codegen-unstable to generate code from your GraphQL queries", "steps": [ { "title": "Update the `dev` script", "code": "Ly8gcGFja2FnZS5qc29uCgpgYGBkaWZmCiJzY3JpcHRzIjogewogICAgIC8vLi4uLi4uCi0gICAgICJkZXYiOiAic2hvcGlmeSBoeWRyb2dlbiBkZXYgLS1jb2RlZ2VuLXVuc3RhYmxlIiwKKyAgICAiZGV2IjogInNob3BpZnkgaHlkcm9nZW4gZGV2IC0tY29kZWdlbiIsCn0KYGBg" }, { "title": "Update the `codegen` script", "code": "Ly8gcGFja2FnZS5qc29uCgpgYGBkaWZmCiJzY3JpcHRzIjogewogICAgIC8vLi4uLi4uCi0gICAgImNvZGVnZW4iOiAic2hvcGlmeSBoeWRyb2dlbiBjb2RlZ2VuLXVuc3RhYmxlIiwKKyAgICJjb2RlZ2VuIjogInNob3BpZnkgaHlkcm9nZW4gY29kZWdlbiIKfQpgYGA=" } ] }, { "title": "The Storefront API types included are now generated using @graphql-codegen/typescript@4", "docs": "https://github.com/dotansimha/graphql-code-generator/blob/master/packages/plugins/typescript/typescript/CHANGELOG.md#400", "pr": "https://github.com/Shopify/hydrogen/pull/1108", "id": "1108", "breaking": true, "steps": [ { "title": "This results in a breaking change if you were importing `Scalars` directly from `@shopify/hydrogen-react` or `@shopify/hydrogen`", "code": "Ly8gYWxsIGluc3RhbmNlcyBvZiBgU2NhbGFyc2AgaW1wb3J0cwoKYGBgZGlmZgppbXBvcnQgdHlwZSB7U2NhbGFyc30gZnJvbSAnQHNob3BpZnkvaHlkcm9nZW4vc3RvcmVmcm9udC1hcGktdHlwZXMnOwoKdHlwZSBQcm9wcyA9IHsKLSAgaWQ6IFNjYWxhcnNbJ0lEJ107IC8vIFRoaXMgd2FzIGEgc3RyaW5nCisgIGlkOiBTY2FsYXJzWydJRCddWydpbnB1dCddOyAvLyBOZWVkIHRvIGFjY2VzcyAnaW5wdXQnIG9yICdvdXRwdXQnIHRvIGdldCB0aGUgc3RyaW5nCiB9OwpgYGA=" } ] }, { "title": "The skeleton starter template is now versioned instead of the demo-store template", "pr": null, "id": null }, { "title": "Storefront client the default caching strategy has been updated ", "pr": "https://github.com/Shopify/hydrogen/pull/1336", "id": "1336", "steps": [ { "title": "The new default caching strategy provides a max-age value of 1 second, and a stale-while-revalidate value of 1 day. If you would keep the old caching values, update your queries to use `CacheShort`", "code": "Ly8gYWxsIGluc3RhbmNlcyBvZiBzdG9yZWZyb250LnF1ZXJ5CgpgYGBkaWZmCiBjb25zdCB7cHJvZHVjdH0gPSBhd2FpdCBzdG9yZWZyb250LnF1ZXJ5KAogICBgI2dyYXBocWwKICAgICBxdWVyeSBQcm9kdWN0KCRoYW5kbGU6IFN0cmluZyEpIHsKICAgICAgIHByb2R1Y3QoaGFuZGxlOiAkaGFuZGxlKSB7IGlkIHRpdGxlIH0KICAgICB9CiAgIGAsCiAgIHsKICAgICB2YXJpYWJsZXM6IHtoYW5kbGU6IHBhcmFtcy5wcm9kdWN0SGFuZGxlfSwKKyAgICAvKioKKyAgICAgKiBPdmVycmlkZSB0aGUgZGVmYXVsdCBjYWNoaW5nIHN0cmF0ZWd5IHdpdGggdGhlIG9sZCBjYWNoaW5nIHZhbHVlcworICAgICAqLworICAgIGNhY2hlOiBzdG9yZWZyb250LkNhY2hlU2hvcnQoKSwKICAgfSwKICk7CmBgYA==" } ] } ] }, { "title": "Fix build dist package", "version": "2023.7.13", "date": "", "hash": "8bc00c931c7c7a3a32b0f2b9d322c0c373f75240", "pr": "https://github.com/Shopify/hydrogen/pull/1452", "commit": "https://github.com/Shopify/hydrogen/pull/1452/commits/8bc00c931c7c7a3a32b0f2b9d322c0c373f75240", "dependencies": { "@remix-run/react": "1.19.1", "@shopify/cli-hydrogen": "^5.5.1", "@shopify/hydrogen": "^2023.7.13", "@shopify/remix-oxygen": "^1.1.8" }, "devDependencies": { "@remix-run/dev": "1.19.1" }, "fixes": [ { "title": "Fix template dist package due to CI error", "pr": "https://github.com/Shopify/hydrogen/pull/1451", "id": "1451" } ], "features": [] }, { "title": "JSDoc support, `h2 debug cpu`, `withCache` support in debug-network, and more", "version": "2023.7.12", "date": "", "hash": "40f7d0fbc295976d405e58b1cbed2fc11715ef1e", "pr": "https://github.com/Shopify/hydrogen/pull/1423", "commit": "https://github.com/Shopify/hydrogen/pull/1423/commits/40f7d0fbc295976d405e58b1cbed2fc11715ef1e", "dependencies": { "@remix-run/react": "1.19.1", "@shopify/cli-hydrogen": "^5.5.0", "@shopify/hydrogen": "^2023.7.12", "@shopify/remix-oxygen": "^1.1.8" }, "devDependencies": { "@remix-run/dev": "1.19.1" }, "features": [ { "title": "JavaScript projects now use Codegen and JSDoc to enhance editor autocompletion", "pr": "https://github.com/Shopify/hydrogen/pull/1334", "id": "1334" }, { "title": "Added `h2 debug cpu` command to profile CPU startup times (experimental)", "pr": "https://github.com/Shopify/hydrogen/pull/1352", "info": "This is useful for debugging slow startup times when Oxygen deployments fail with related errors.", "id": "1352", "steps": [ { "title": "Run `h2 debug cpu`", "code": "YGBgYmFzaApoMiBkZWJ1ZyBjcHUKYGBg", "info": "This command builds + watches your app and generates a `startup.cpuprofile` file that you can open in DevTools or VSCode to see a flamegraph of CPU usage" } ] }, { "title": "Added support for `withCache` request in debug-network tool", "pr": "https://github.com/Shopify/hydrogen/pull/1438", "id": "1438", "steps": [ { "title": "Calls to withCache can now be shown in the `/debug-network` tool when using the Worker runtime. For this to work, use the new `request` parameter in `createWithCache`", "code": "Ly8gc2VydmVyLnRzCgpgYGBkaWZmCmV4cG9ydCBkZWZhdWx0IHsKICBmZXRjaChyZXF1ZXN0LCBlbnYsIGV4ZWN1dGlvbkNvbnRleHQpIHsKICAgIC8vIC4uLgogICAgY29uc3Qgd2l0aENhY2hlID0gY3JlYXRlV2l0aENhY2hlKHsKICAgICAgY2FjaGUsCiAgICAgIHdhaXRVbnRpbCwKKyAgICAgcmVxdWVzdCwKICAgIH0pOwogICAgLy8gLi4uCiAgfSwKfQpgYGA=", "file": "server.ts" } ] }, { "title": "Add LanguageCode support to hdyrogen-react CartProvider", "pr": "https://github.com/Shopify/hydrogen/pull/1408", "id": "1408" }, { "title": "Support custom attributes with `useLoadScript`", "pr": "https://github.com/Shopify/hydrogen/pull/1442", "id": "1442", "steps": [ { "title": "Pass `attributes` to any script", "code": "Ly8gYW55IGluc3RhbmNlIG9mIHVzZUxvYWRTY3JpcHQKCmBgYGRpZmYKKyBjb25zdCBhdHRyaWJ1dGVzID0geworICAgICdkYXRhLXRlc3QnOiAndGVzdCcsCisgICAgdGVzdDogJ3Rlc3QnLAorICB9CgotIGNvbnN0IHNjcmlwdFN0YXR1cyA9IHVzZUxvYWRTY3JpcHQoJ3Rlc3QuanMnICkKY29uc3Qgc2NyaXB0U3RhdHVzID0gdXNlTG9hZFNjcmlwdCgndGVzdC5qcycsIHsgIGF0dHJpYnV0ZXMgfSApCmBgYA==" }, { "title": "Would append a DOM element", "code": "YGBgaHRtbAo8c2NyaXB0IHNyYz0idGVzdC5qcyIgZGF0YS10ZXN0PSJ0ZXN0IiB0ZXN0PSJ0ZXN0IiAvPgpgYGA=" } ] }, { "title": "Unlock hydrogen-react package.json exports to make it easier to use with NextJS and other frameworks.", "info": "Note: Using Hydrogen internals is not officially supported, and those internal APIs could change at anytime outside our usual calendar versioning.", "pr": "https://github.com/Shopify/hydrogen/pull/994", "id": "994" } ], "fixes": [ { "title": "Integrate the debug-network tooling with the new --worker-unstable runtime CLI flag", "pr": "https://github.com/Shopify/hydrogen/pull/1387", "id": "1387" }, { "title": "Fix the starter template blog route to include a required startCursor in the GraphQL query", "pr": "https://github.com/Shopify/hydrogen/pull/1441", "id": "1441" }, { "title": "Move react to peer dependencies", "pr": "https://github.com/Shopify/hydrogen/pull/1439", "id": "1439" } ] }, { "title": "Increase dev request body size limit to 100mb", "version": "2023.7.11", "date": "", "hash": "5188d86f18793d85af9a4e10a6c88700c24d946a", "pr": "https://github.com/Shopify/hydrogen/pull/1420", "commit": "https://github.com/Shopify/hydrogen/pull/1420/commits/5188d86f18793d85af9a4e10a6c88700c24d946a", "dependencies": { "@remix-run/react": "1.19.1", "@shopify/cli-hydrogen": "^5.4.3", "@shopify/hydrogen": "^2023.7.11", "@shopify/remix-oxygen": "^1.1.7" }, "devDependencies": { "@remix-run/dev": "1.19.1" }, "features": [], "fixes": [ { "title": "Fix subrequest performance in development", "pr": "https://github.com/Shopify/hydrogen/pull/1411", "id": "1411" }, { "title": "Increase request body size limit to 100mb in development", "pr": "https://github.com/Shopify/hydrogen/pull/1421", "id": "1421" } ] }, { "title": "Improved error traces and redirect logic", "version": "2023.7.10", "date": "", "hash": "45366a247a94044f037e55fae1f96987af0655ca", "pr": "https://github.com/Shopify/hydrogen/pull/1409", "commit": "https://github.com/Shopify/hydrogen/pull/1409/commits/45366a247a94044f037e55fae1f96987af0655ca", "dependencies": { "@remix-run/react": "1.19.1", "@shopify/cli-hydrogen": "^5.4.2", "@shopify/hydrogen": "^2023.7.10", "@shopify/remix-oxygen": "^1.1.6" }, "devDependencies": { "@remix-run/dev": "1.19.1" }, "features": [], "fixes": [ { "title": "Ensure `storefrontRedirect` fallback only redirects to relative URLs.", "pr": "https://github.com/Shopify/hydrogen/pull/1399", "id": "1399" }, { "title": "Ensure that the `/discount?redirect=...` route only redirects to relative URLs.", "pr": "https://github.com/Shopify/hydrogen/pull/1399", "id": "1399" }, { "title": "Ensure Oxygen adapter logs stack traces in production.", "pr": "https://github.com/Shopify/hydrogen/pull/1393", "id": "1393" } ] }, { "title": "Remove duplicate network debug logs", "version": "2023.7.9", "date": "", "hash": "f244e4e47328c7082c3d7d2f7940eeb7f806f9ef", "pr": "https://github.com/Shopify/hydrogen/pull/1397", "commit": "https://github.com/Shopify/hydrogen/pull/1397/commits/f244e4e47328c7082c3d7d2f7940eeb7f806f9ef", "dependencies": { "@remix-run/react": "1.19.1", "@shopify/cli-hydrogen": "^5.4.1", "@shopify/hydrogen": "^2023.7.9", "@shopify/remix-oxygen": "^1.1.5" }, "devDependencies": { "@remix-run/dev": "1.19.1" }, "fixes": [ { "title": "Enhancements to the deploy command", "pr": "https://github.com/Shopify/hydrogen/pull/1381", "id": "1381" }, { "title": "Prevent logging debug-network errors multiple times", "pr": "https://github.com/Shopify/hydrogen/pull/1400", "id": "1400" } ], "features": [] }, { "title": "Cart Optimistic UI helpers, improved lockfile validation, sourcemaps and withCache type inference", "version": "2023.7.9", "date": "", "hash": "e15dd790e922d9e4befcca54fac0dad7344c481f", "pr": "https://github.com/Shopify/hydrogen/pull/1374", "commit": "https://github.com/Shopify/hydrogen/pull/1374/commits/e15dd790e922d9e4befcca54fac0dad7344c481f", "dependencies": { "@remix-run/react": "1.19.1", "@shopify/cli-hydrogen": "^5.4.0", "@shopify/hydrogen": "^2023.7.9", "@shopify/remix-oxygen": "^1.1.4" }, "devDependencies": { "@remix-run/dev": "1.19.1" }, "features": [ { "title": "Allow generic inference in standalone usage of WithCache type", "pr": "https://github.com/Shopify/hydrogen/pull/1363", "id": "1363" }, { "title": "Cart Optimistic UI helpers useOptimisticData and OptimisticInput", "pr": "https://github.com/Shopify/hydrogen/pull/1366", "id": "1366" } ], "fixes": [ { "title": "Fix storefront sub request cache key", "pr": "https://github.com/Shopify/hydrogen/pull/1375", "id": "1375" }, { "title": "Fix Pagination component", "pr": "https://github.com/Shopify/hydrogen/pull/1362", "id": "1362" }, { "title": "Remove sourcemap annotations from client bundles", "pr": "https://github.com/Shopify/hydrogen/pull/1364", "id": "1364" }, { "title": "Build command throws error if no valid lockfile is found", "pr": "https://github.com/Shopify/hydrogen/pull/1370", "info": "This behavior can be disabled with the flag --no-lockfile-check, which might be useful in monorepos or other setups where the lockfile is not available in the project directory.", "id": "1370" } ] }, { "title": "Fixed bundle analysis", "version": "2023.7.8", "date": "2023-08-31 10:36:12 -0400", "hash": "0fa2287310368ad421b95b580c6fa0cdd17b83f", "pr": "https://github.com/Shopify/hydrogen/pull/1359", "commit": "https://github.com/Shopify/hydrogen/pull/1359/commits/0fa2287310368ad421b95b580c6fa0cdd17b83f7", "dependencies": { "@remix-run/react": "1.19.1", "@shopify/cli-hydrogen": "^5.3.1", "@shopify/hydrogen": "^2023.7.8", "@shopify/remix-oxygen": "^1.1.4" }, "devDependencies": { "@remix-run/dev": "1.19.1" }, "features": [], "fixes": [ { "title": "Backwards compatible bundle analysis", "pr": "https://github.com/Shopify/hydrogen/pull/1357", "id": "1357" } ] }, { "title": "Deploy command, Bundle Analysis, Worker dev server runtime", "version": "2023.7.8", "date": "2023-09-21 01:24:39 +0000", "hash": "c977f21860e86d6735493596ea7ec84f73fd1de0", "pr": "https://github.com/Shopify/hydrogen/pull/1335", "commit": "https://github.com/Shopify/hydrogen/pull/1335/commits/c977f21860e86d6735493596ea7ec84f73fd1de0", "dependencies": { "@remix-run/react": "1.19.1", "@shopify/cli-hydrogen": "^5.3.0", "@shopify/hydrogen": "^2023.7.8", "@shopify/remix-oxygen": "^1.1.4" }, "devDependencies": { "@remix-run/dev": "1.19.1" }, "features": [ { "title": "Adds worker-unstable flag", "pr": "https://github.com/Shopify/hydrogen/pull/1184", "info": "Add --worker-unstable flag to h2 dev and h2 preview commands. This flag enables the use of the new experimental worker runtime for local development, which is closer to Oxygen production than the current Node.js sandbox. Please report any issues you encounter with this flag.", "id": "1184" }, { "title": "Added deploy command", "pr": "https://github.com/Shopify/hydrogen/pull/1019", "id": "1019" }, { "title": "Added magic cart and discount routes to skeleton", "pr": "https://github.com/Shopify/hydrogen/pull/1309", "id": "1309" }, { "title": "Added bundle analysis tool", "pr": "https://github.com/Shopify/hydrogen/pull/1306", "info": "We've added a tool for analyzing bundle sizes. You should try to keep your worker bundle small. The larger it gets effects the cold startup time of your app. We now include client-bundle-analyzer.html and worker-bundle-analyzer.html files in the build output. Open these in your browser to view an interactive analysis of your bundles. The CLI output also includes links to each file. Hydrogen also fails to build if your bundle size is over 10 MB. This is because Oxygen only supports worker bundles less than 10 MB.", "id": "1306" }, { "title": "Generate sourcemaps by default", "info": "Make sourcemaps to default be turned on. They were off to prevent sourcemaps leaking server code to the client. Oxygen now makes sure to not serve the sourcemaps, so it's okay to generate them. Also, when sourcemaps are present, we hope to enable sourcemapped stack traces in error logs on Oxygen.", "pr": "https://github.com/Shopify/hydrogen/pull/1339", "id": "1339" } ], "fixes": [ { "title": "Enhanced h2 preview command", "pr": "https://github.com/Shopify/hydrogen/pull/1184", "id": "1184" }, { "title": "Raise the subrequest limit to 100 for development", "pr": "https://github.com/Shopify/hydrogen/pull/1348", "id": "1348" } ] }, { "title": "Server-side network requests debugger (unstable)", "version": "2023.7.7", "date": "2023-09-07 20:32:18 +00", "hash": "cfc6de7f9af9ed992577c10afaea4d422f276401", "pr": "https://github.com/Shopify/hydrogen/pull/1307", "commit": "https://github.com/Shopify/hydrogen/pull/1307/commits/cfc6de7f9af9ed992577c10afaea4d422f276401", "dependencies": { "@remix-run/react": "1.19.1", "@shopify/cli-hydrogen": "^5.2.3", "@shopify/hydrogen": "^2023.7.7", "@shopify/remix-oxygen": "^1.1.4" }, "devDependencies": { "@remix-run/dev": "1.19.1" }, "features": [ { "title": "Reduce project initialization time", "pr": "https://github.com/Shopify/hydrogen/pull/1272", "id": "1272" }, { "title": "Add server-side network requests debugger (unstable)", "pr": "https://github.com/Shopify/hydrogen/pull/1284", "id": "1284", "steps": [ { "title": "Update server.ts so that it also passes in waitUntil and env", "file": "server.ts", "code": "YGBgZGlmZgpjb25zdCBoYW5kbGVSZXF1ZXN0ID0gY3JlYXRlUmVxdWVzdEhhbmRsZXIoewogICAgYnVpbGQ6IHJlbWl4QnVpbGQsCiAgICBtb2RlOiBwcm9jZXNzLmVudi5OT0RFX0VOViwKKyAgICBnZXRMb2FkQ29udGV4dDogKCkgPT4gKHtzZXNzaW9uLCBzdG9yZWZyb250LCBlbnYsIHdhaXRVbnRpbH0pLAp9KTsKYGBg", "reel": "2023.7.7-1284-1.mp4" }, { "title": "If using typescript, also update `remix.env.d.ts`", "file": "remix.env.d.ts", "code": "YGBgZGlmZgogIGRlY2xhcmUgbW9kdWxlICdAc2hvcGlmeS9yZW1peC1veHlnZW4nIHsKICAgIGV4cG9ydCBpbnRlcmZhY2UgQXBwTG9hZENvbnRleHQgeworICAgICBlbnY6IEVudjsKICAgICAgY2FydDogSHlkcm9nZW5DYXJ0OwogICAgICBzdG9yZWZyb250OiBTdG9yZWZyb250OwogICAgICBzZXNzaW9uOiBIeWRyb2dlblNlc3Npb247CisgICAgICB3YWl0VW50aWw6IEV4ZWN1dGlvbkNvbnRleHRbJ3dhaXRVbnRpbCddOwogICAgfQogIH0KYGBg", "reel": "2023.7.7-1284-2.mp4" } ] } ], "fixes": [] }, { "title": "Improved stack traces and cookie token creation", "version": "2023.7.6", "date": "", "hash": "8f7b03e5bc06e89288b572f5399b7da723a8383a", "pr": "https://github.com/Shopify/hydrogen/pull/1295", "commit": "https://github.com/Shopify/hydrogen/pull/1295/commits/8f7b03e5bc06e89288b572f5399b7da723a8383a", "dependencies": { "@remix-run/react": "1.19.1", "@shopify/cli-hydrogen": "^5.2.2", "@shopify/hydrogen": "^2023.7.6", "@shopify/remix-oxygen": "^1.1.3" }, "devDependencies": { "@remix-run/dev": "1.19.1" }, "features": [], "fixes": [ { "title": "Fix error stack traces in development mode", "pr": "https://github.com/Shopify/hydrogen/pull/1297", "id": "1297" }, { "title": "Fix incorrect creation of cookie token", "pr": "https://github.com/Shopify/hydrogen/pull/1294", "id": "1294" } ] }, { "title": "Pagination component fixes", "version": "2023.7.5", "date": "", "hash": "9bf4e4afcf86e961252135a7d45b5f19f9958d36", "pr": "https://github.com/Shopify/hydrogen/pull/1293", "commit": "https://github.com/Shopify/hydrogen/pull/1293/commits/9bf4e4afcf86e961252135a7d45b5f19f9958d36", "dependencies": { "@remix-run/react": "1.19.1", "@shopify/cli-hydrogen": "^5.2.1", "@shopify/hydrogen": "^2023.7.5", "@shopify/remix-oxygen": "^1.1.3" }, "devDependencies": { "@remix-run/dev": "1.19.1" }, "fixes": [ { "title": "Fix the Pagination component to reset internal state when the URL changes", "pr": "https://github.com/Shopify/hydrogen/pull/1291", "id": "1291", "steps": [ { "info": "Update pageInfo in all pagination queries. Here is an example route with a pagination query", "title": "Add `startCursor` to the query pageInfo", "code": "YGBgZGlmZgpxdWVyeSBDb2xsZWN0aW9uRGV0YWlscyB7CiAgIGNvbGxlY3Rpb24oaGFuZGxlOiAkaGFuZGxlKSB7CiAgICAgLi4uCiAgICAgcGFnZUluZm8gewogICAgICAgaGFzUHJldmlvdXNQYWdlCiAgICAgICBoYXNOZXh0UGFnZQogICAgICAgaGFzTmV4dFBhZ2UKICAgICAgIGVuZEN1cnNvcgorICAgICAgc3RhcnRDdXJzb3IKICAgICB9CiAgIH0KfQpgYGA=", "reel": "2023.7.5-1293-1.mp4", "file": "All files with pagination queries" } ] } ], "features": [] }, { "title": "Typescript 5, Content Security Policy", "version": "2023.7.4", "date": "", "hash": "5d8550ee14ef3a72129b1a4d6aacb27629044071", "pr": "https://github.com/Shopify/hydrogen/pull/1263", "commit": "https://github.com/Shopify/hydrogen/pull/1263/commits/5d8550ee14ef3a72129b1a4d6aacb27629044071", "dependencies": { "@remix-run/react": "1.19.1", "@shopify/cli-hydrogen": "^5.2.1", "@shopify/hydrogen": "^2023.7.4", "@shopify/remix-oxygen": "^1.1.3" }, "devDependencies": { "@remix-run/dev": "1.19.1" }, "features": [ { "title": "Add TypeScript v5 compatibility", "pr": "https://github.com/Shopify/hydrogen/pull/1240", "id": "1240", "steps": [ { "title": "Update typescript", "info": "If you have typescript as a dev dependency in your app, it is recommended to change its version as follows:", "code": "YGBgZGlmZgogICJkZXZEZXBlbmRlbmNpZXMiOiB7CiAgICAuLi4KLSAgICJ0eXBlc2NyaXB0IjogIl40LjkuNSIsCisgICAidHlwZXNjcmlwdCI6ICJeNS4yLjIiLAogIH0KfQpgYGA=", "reel": "2023.7.1263-1.mp4", "file": "package.json" } ] }, { "title": "Add Content Security Policy (CSP)", "docs": "https://shopify.dev/docs/custom-storefronts/hydrogen/content-security-policy", "pr": "https://github.com/Shopify/hydrogen/pull/1235", "id": "1235" } ], "fixes": [ { "title": "Fix development server port", "pr": "https://github.com/Shopify/hydrogen/pull/1267", "id": "1267" }, { "title": "Add custom product paths to VariantSelector", "pr": "https://github.com/Shopify/hydrogen/pull/1271", "id": "1271" } ] }, { "title": "HMR & HDR, shouldRevalidate, Windows Codegen", "version": "2023.7.3", "date": "", "hash": "695b145f95c50b1c9fece587a300c038995110ee", "pr": "https://github.com/Shopify/hydrogen/pull/1212", "commit": "https://github.com/Shopify/hydrogen/pull/1212/commits/695b145f95c50b1c9fece587a300c038995110ee", "dependencies": { "@remix-run/react": "1.19.1", "@shopify/cli-hydrogen": "^5.2.0", "@shopify/hydrogen": "^2023.7.3", "@shopify/remix-oxygen": "^1.1.3" }, "devDependencies": { "@remix-run/dev": "1.19.1" }, "features": [ { "breaking": true, "title": "Support Hot Module Replacement (HMR) and Hot Data Revalidation (HDR)", "pr": "https://github.com/Shopify/hydrogen/pull/1187", "id": "1187", "steps": [ { "title": "Enable the v2 dev server in remix.config.js", "file": "remix.config.js", "code": "YGBgZGlmZgpmdXR1cmU6IHsKKyB2Ml9kZXY6IHRydWUsCiAgdjJfbWV0YTogdHJ1ZSwKICB2Ml9oZWFkZXJzOiB0cnVlLAogIC8vIC4uLgp9CmBgYA==", "reel": "2023.7.3-1187-1.mp4" }, { "title": "Add Remix `` component if you don't have it to your `root.jsx` or `root.tsx` file", "file": "root.tsx", "code": "YGBgZGlmZgppbXBvcnQgewogIE91dGxldCwKICBTY3JpcHRzLAorIExpdmVSZWxvYWQsCiAgU2Nyb2xsUmVzdG9yYXRpb24sCn0gZnJvbSAnQHJlbWl4LXJ1bi9yZWFjdCc7CgovLyAuLi4KCmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIEFwcCgpIHsKICAvLyAuLi4KICByZXR1cm4gKAogICAgPGh0bWw+CiAgICAgIDxoZWFkPgogICAgICAgey8qIC4uLiAgKi99CiAgICAgIDwvaGVhZD4KICAgICAgPGJvZHk+CiAgICAgICAgPE91dGxldCAvPgogICAgICAgIDxTY3JvbGxSZXN0b3JhdGlvbiAvPgogICAgICAgIDxTY3JpcHRzIC8+CisgICAgICAgPExpdmVSZWxvYWQgLz4KICAgICAgPC9ib2R5PgogICAgPC9odG1sPgogICk7Cn0KCmV4cG9ydCBmdW5jdGlvbiBFcnJvckJvdW5kYXJ5KCkgewogIC8vIC4uLgogIHJldHVybiAoCiAgICA8aHRtbD4KICAgICAgPGhlYWQ+CiAgICAgICAgey8qIC4uLiAqL30KICAgICAgPC9oZWFkPgogICAgICA8Ym9keT4KICAgICAgICBFcnJvciEKICAgICAgICA8U2NyaXB0cyAvPgorICAgICAgIDxMaXZlUmVsb2FkIC8+CiAgICAgIDwvYm9keT4KICAgIDwvaHRtbD4KICApOwp9CmBgYA==", "reel": "2023.7.3-1187-2.mp4" } ] }, { "title": "Add shouldRevalidate to improve performance", "pr": "https://github.com/Shopify/hydrogen/pull/1237", "id": "1237" }, { "title": "Export the type CookieOptions from cartSetIdDefault", "pr": "https://github.com/Shopify/hydrogen/pull/1153", "id": "1153" } ], "fixes": [ { "title": "Improve error handling", "pr": "https://github.com/Shopify/hydrogen/pull/1225", "id": "1225" }, { "title": "Fix GraphQL Codegen on Windows", "pr": "https://github.com/Shopify/hydrogen/pull/1253", "id": "1253" } ] }, { "title": "Fixed analytics, Updated types, Better error handling", "version": "2023.7.2", "date": "", "hash": "ede660217b469205c2022099e1c92081f17cb19d", "pr": "https://github.com/Shopify/hydrogen/pull/1188", "commit": "https://github.com/Shopify/hydrogen/pull/1188/commits/ede660217b469205c2022099e1c92081f17cb19d", "dependencies": { "@remix-run/react": "1.19.1", "@shopify/cli-hydrogen": "^5.1.2", "@shopify/hydrogen": "^2023.7.2", "@shopify/remix-oxygen": "^1.1.3" }, "devDependencies": { "@remix-run/dev": "1.19.1" }, "fixes": [ { "title": "Update @shopify/oxygen-workers-types", "pr": "https://github.com/Shopify/hydrogen/pull/1208", "id": "1208" }, { "title": "Surface storefront api response errors", "pr": "https://github.com/Shopify/hydrogen/pull/1205", "id": "1205" }, { "title": "Fix demo-store analytics", "pr": "https://github.com/Shopify/hydrogen/pull/1177", "id": "1177" } ], "features": [] }, { "title": "Remix 1.19.1, Skeleton fixes, Better warnings", "version": "2023.7.1", "date": "", "hash": "20f4ef21e42c33e975641b263a5edc76c38491fe", "pr": "https://github.com/Shopify/hydrogen/pull/1170", "commit": "https://github.com/Shopify/hydrogen/pull/1170/commits/20f4ef21e42c33e975641b263a5edc76c38491fe", "dependencies": { "@remix-run/react": "1.19.1", "@shopify/cli-hydrogen": "^5.1.1", "@shopify/hydrogen": "^2023.7.1", "@shopify/remix-oxygen": "^1.1.2" }, "devDependencies": { "@remix-run/dev": "1.19.1" }, "fixes": [ { "title": "Fix the starter template cart aside to cover everything on larger pages", "pr": "https://github.com/Shopify/hydrogen/pull/1163", "id": "1163" }, { "title": "Warn in development when Remix packages are out of sync", "pr": "https://github.com/Shopify/hydrogen/pull/1173", "id": "1173" }, { "title": "Skip Oxygen requirement checks of remix.config.js when @shopify/remix-oxygen is not installed.", "pr": "https://github.com/Shopify/hydrogen/pull/1137", "id": "1137" } ], "features": [ { "title": "Update to Remix v1.19.1", "pr": "https://github.com/Shopify/hydrogen/pull/1172", "id": "1172", "docs": "https://github.com/remix-run/remix/releases/tag/remix%401.19.1" } ] }, { "title": "New CLI flow, Login/Logout commands, Auto-reload env vars and more", "version": "2023.7.0", "date": "", "hash": "ce199d5c47e4a27c779bd711ee619739019d74e7", "pr": "https://github.com/Shopify/hydrogen/pull/1152", "commit": "https://github.com/Shopify/hydrogen/pull/1152/commits/ce199d5c47e4a27c779bd711ee619739019d74e7", "dependencies": { "@remix-run/react": "1.17.1", "@shopify/cli-hydrogen": "^5.1.0", "@shopify/hydrogen": "^2023.7.0", "@shopify/remix-oxygen": "^1.1.1" }, "devDependencies": { "@remix-run/dev": "1.17.1" }, "features": [ { "title": "Add @total-typescript/ts-reset to demo-store and skeleton templates", "pr": "https://github.com/Shopify/hydrogen/pull/1042", "id": "1042" }, { "title": "Reworked CLI scaffolding flow", "info": "The onboarding process when creating new Hydrogen apps has been reworked. Now you can: 1. Create a new Shopify storefront and connect it to the local project, or use Mock.shop. 2. Scaffold CSS strategies: Tailwind, CSS Modules, Vanilla Extract, PostCSS. Scaffold i18n strategies: subfolders, domains, subdomains. 3. Automatically generate core routes", "pr": "https://github.com/Shopify/hydrogen/pull/913", "id": "913" }, { "title": "Add login and logout commands", "pr": "https://github.com/Shopify/hydrogen/pull/1022", "id": "1022" }, { "title": "Auto-reload environment variables in the development server", "pr": "https://github.com/Shopify/hydrogen/pull/997", "id": "997" }, { "title": "Support creating new storefronts from the link command", "pr": "https://github.com/Shopify/hydrogen/pull/1022", "id": "1022" }, { "title": "Add CartForm and createCartHandler", "pr": "https://github.com/Shopify/hydrogen/pull/786", "id": "786", "docs": "https://shopify.dev/docs/custom-storefronts/hydrogen/cart" }, { "title": "Export useLoadScript", "pr": "https://github.com/Shopify/hydrogen/pull/1080", "id": "1080", "docs": "https://shopify.dev/docs/api/hydrogen-react/2023-07/hooks/useloadscript" }, { "title": "Add an example using the new Customer Account API", "pr": "https://github.com/Shopify/hydrogen/pull/1126", "id": "1126", "docs": "https://shopify.dev/docs/api/customer" }, { "title": "Add a and get component to build product forms.", "pr": "https://github.com/Shopify/hydrogen/pull/1027", "id": "1027", "docs": "https://gist.github.com/blittle/d9205d4ac72528005dc6f3104c328ecd" }, { "title": "Added getFirstAvailableVariant and getSelectedProductOptions helper functions", "pr": "https://github.com/Shopify/hydrogen/pull/1027", "id": "1027", "docs": "https://gist.github.com/blittle/d9205d4ac72528005dc6f3104c328ecd" }, { "title": "Stabilize Pagination and getPaginationVariables", "pr": "https://github.com/Shopify/hydrogen/pull/1129", "id": "1129", "steps": [ { "title": "Rename getPaginationVariables_unstable to getPaginationVariables", "file": "All files that use getPaginationVariables", "code": "YGBgZGlmZgotIGltcG9ydCB7Z2V0UGFnaW5hdGlvblZhcmlhYmxlc19fdW5zdGFibGV9IGZyb20gJ0BzaG9waWZ5L2h5ZHJvZ2VuJzsKKyBpbXBvcnQge2dldFBhZ2luYXRpb25WYXJpYWJsZXN9IGZyb20gJ0BzaG9waWZ5L2h5ZHJvZ2VuJzsKYGBg", "reel": "2023.7.0-1129-1.mp4" }, { "title": "Rename Pagination_unstable to Pagination", "file": "All files that use Pagination", "code": "YGBgZGlmZgotIGltcG9ydCB7UGFnaWF0aW5vbl9fdW5zdGFibGV9IGZyb20gJ0BzaG9waWZ5L2h5ZHJvZ2VuJzsKKyBpbXBvcnQge1BhZ2lhdGlub259IGZyb20gJ0BzaG9waWZ5L2h5ZHJvZ2VuJzsKYGBg", "reel": "2023.7.0-1129-2.mp4" } ] }, { "title": "Add login and logout commands. Rework how other commands interact with auth", "pr": "https://github.com/Shopify/hydrogen/pull/1022", "id": "1022" } ], "fixes": [ { "title": "Show error message when Hydrogen App isn’t installed", "pr": "https://github.com/Shopify/hydrogen/pull/1075", "id": "1075" }, { "title": "Improve warning and error format for known Hydrogen messages", "pr": "https://github.com/Shopify/hydrogen/pull/1093", "id": "1093" }, { "title": "Stabilize the createWithCache function", "pr": "https://github.com/Shopify/hydrogen/pull/1151", "id": "1151", "steps": [ { "title": "Rename createWithCache_unstable to createWithCache", "file": "All files that use createWithCache", "code": "YGBgZGlmZgotIGltcG9ydCB7Y3JlYXRlV2l0aENhY2hlX3Vuc3RhYmxlfSBmcm9tICdAc2hvcGlmeS9oeWRyb2dlbic7CisgaW1wb3J0IHtjcmVhdGVXaXRoQ2FjaGV9IGZyb20gJ0BzaG9waWZ5L2h5ZHJvZ2VuJzsKYGBg", "reel": "2023.7.0-1151-1.mp4" } ] } ] }, { "title": "Fixes to --codegen and --sourcemap flags", "version": "2023.4.6", "date": "", "hash": "c6445ac572bba7006f0c90b99287701662fbffe7", "pr": "https://github.com/Shopify/hydrogen/pull/1020", "commit": "https://github.com/Shopify/hydrogen/pull/1020/commits/c6445ac572bba7006f0c90b99287701662fbffe7", "dependencies": { "@remix-run/react": "1.17.1", "@shopify/cli-hydrogen": "^5.0.2", "@shopify/hydrogen": "^2023.4.6", "@shopify/remix-oxygen": "^1.1.1" }, "devDependencies": { "@remix-run/dev": "1.17.1" }, "fixes": [ { "title": "Fix --sourcemap flag for build command", "pr": "https://github.com/Shopify/hydrogen/pull/1032", "id": "1032" }, { "title": "Fix dev --codegen-unstable flag", "pr": "https://github.com/Shopify/hydrogen/pull/1018", "id": "1018" } ], "features": [] }, { "title": "Upgrade to Remix 1.17.1", "version": "2023.4.5", "date": "", "hash": "ab7501fb37c154fa4214542f6f0b37f987639de2", "pr": "https://github.com/Shopify/hydrogen/pull/1008", "commit": "https://github.com/Shopify/hydrogen/pull/1008/commits/ab7501fb37c154fa4214542f6f0b37f987639de2", "dependencies": { "@remix-run/react": "1.17.1", "@shopify/cli-hydrogen": "^5.0.1", "@shopify/hydrogen": "^2023.4.5", "@shopify/remix-oxygen": "^1.1.1" }, "devDependencies": { "@remix-run/dev": "1.17.1" }, "fixes": [], "features": [ { "title": "Upgrade Remix to 1.17.1", "docs": "https://github.com/remix-run/remix/releases/tag/remix%401.17.1", "pr": null, "id": null, "steps": [ { "title": "When updating your app, remember to also update your Remix dependencies to 1.17.1 in your package.json file:", "file": "package.json", "code": "YGBgZGlmZgotIkByZW1peC1ydW4vcmVhY3QiOiAiMS4xNS4wIiwKKyJAcmVtaXgtcnVuL3JlYWN0IjogIjEuMTcuMSIsCgotIkByZW1peC1ydW4vZGV2IjogIjEuMTUuMCIsCi0iQHJlbWl4LXJ1bi9lc2xpbnQtY29uZmlnIjogIjEuMTUuMCIsCisiQHJlbWl4LXJ1bi9kZXYiOiAiMS4xNy4xIiwKKyJAcmVtaXgtcnVuL2VzbGludC1jb25maWciOiAiMS4xNy4xIiwKYGBg", "reel": "2023.4.5-1008-1.mp4" } ] } ] }, { "title": "Added /admin route, fix and --no-sourcemap flag", "version": "2023.4.4", "date": "", "hash": "f5f897ce72aac7bc205e917392a2f3c9f8a697a7", "pr": "https://github.com/Shopify/hydrogen/pull/947", "commit": "https://github.com/Shopify/hydrogen/pull/947/commits/f5f897ce72aac7bc205e917392a2f3c9f8a697a7", "dependencies": { "@remix-run/react": "1.15.0", "@shopify/cli-hydrogen": "^5.0.0", "@shopify/hydrogen": "^2023.4.4", "@shopify/remix-oxygen": "^1.1.0" }, "devDependencies": { "@remix-run/dev": "1.15.0" }, "fixes": [ { "title": "Updates default powered-by header to Shopify, Hydrogen", "pr": "https://github.com/Shopify/hydrogen/pull/961", "id": "961" }, { "title": "Make storefrontApiVersion parameter optional", "pr": "https://github.com/Shopify/hydrogen/pull/984", "id": "984" }, { "title": "Fix to properly set className", "pr": "https://github.com/Shopify/hydrogen/pull/966", "id": "966" }, { "title": "Skip reading and writing cache in sub-requests when the strategy is CacheNone", "pr": "https://github.com/Shopify/hydrogen/pull/964", "id": "964" } ], "features": [ { "title": "Add a /admin route that redirects to the Shopify admin", "pr": "https://github.com/Shopify/hydrogen/pull/989", "id": "989", "steps": [ { "title": "This redirect can be disabled by passing noAdminRedirect: true to storefrontRedirect", "code": "YGBgZGlmZgpzdG9yZWZyb250UmVkaXJlY3QoewogIHJlZGlyZWN0LAogIHJlc3BvbnNlLAogIHN0b3JlZnJvbnQsCisgbm9BZG1pblJlZGlyZWN0OiB0cnVlLAp9KTsKYGBg", "file": "All files that use storefrontRedirect" } ] }, { "title": "Allow disabling sourcemaps with shopify hydrogen build --no-sourcemap", "pr": "https://github.com/Shopify/hydrogen/pull/975", "id": "975" } ] }, { "title": "Maintenance release", "version": "2023.4.3", "date": "", "hash": "b6a3d970d9ac0c604d5ec776e2924596eced61c4", "pr": "https://github.com/Shopify/hydrogen/pull/927", "commit": "https://github.com/Shopify/hydrogen/pull/927/commits/b6a3d970d9ac0c604d5ec776e2924596eced61c4", "dependencies": { "@remix-run/react": "1.15.0", "@shopify/cli": "3.45.0", "@shopify/cli-hydrogen": "^4.2.1", "@shopify/hydrogen": "^2023.4.3", "@shopify/remix-oxygen": "^1.0.7" }, "devDependencies": { "@remix-run/dev": "1.15.0" }, "fixes": [ { "title": "Maintenance release", "pr": "https://github.com/Shopify/hydrogen/pull/926", "id": "926" } ], "features": [] }, { "title": "Added GraphQL codegen, Pagination, BuyNowButton fixes", "version": "2023.4.2", "date": "", "hash": "76b484139e8816e68cf3fb32329403fcee61cccf", "pr": "https://github.com/Shopify/hydrogen/pull/897", "commit": "https://github.com/Shopify/hydrogen/pull/897/commits/76b484139e8816e68cf3fb32329403fcee61cccf", "dependencies": { "@remix-run/react": "1.15.0", "@shopify/cli-hydrogen": "^4.2.0", "@shopify/hydrogen": "^2023.4.2", "@shopify/remix-oxygen": "^1.0.6" }, "devDependencies": { "@remix-run/dev": "1.15.0" }, "fixes": [ { "title": "Fix issue where the would incorrectly redirect to checkout", "pr": "https://github.com/Shopify/hydrogen/pull/827", "id": "827" }, { "title": "Fix the load more results button on the /search route", "pr": "https://github.com/Shopify/hydrogen/pull/909", "id": "909" } ], "features": [ { "title": "Add UNSTABLE support for GraphQL Codegen", "info": "Add UNSTABLE support for GraphQL Codegen to automatically generate types for every Storefront API query in the project via @shopify/hydrogen-codegenj", "pr": "https://github.com/Shopify/hydrogen/pull/707", "id": "707", "docs": "https://github.com/Shopify/hydrogen/pull/707" }, { "title": "Add command to list environments from a linked Hydrogen storefront", "pr": "https://github.com/Shopify/hydrogen/pull/889", "id": "889" }, { "title": "Auto-inject environment variables from a linked storefront", "pr": "https://github.com/Shopify/hydrogen/pull/861", "id": "861" }, { "title": "Add a component and getPaginationVariables__unstable helper", "pr": "https://github.com/Shopify/hydrogen/pull/755", "id": "755", "docs": "https://shopify.dev/docs/api/hydrogen/latest/components/pagination" }, { "title": "Adds pagination support on /search results", "pr": "https://github.com/Shopify/hydrogen/pull/918", "id": "918" } ] }, { "title": "Added --debug flag, pull command, parseGid, Powered-By header", "version": "2023.4.1", "date": "", "hash": "dcfbb24c321b01ff80b11f1d0802457e17394c35", "pr": "https://github.com/Shopify/hydrogen/pull/817", "commit": "https://github.com/Shopify/hydrogen/pull/817/commits/dcfbb24c321b01ff80b11f1d0802457e17394c35", "dependencies": { "@remix-run/react": "1.15.0", "@shopify/cli-hydrogen": "^4.1.2", "@shopify/hydrogen": "^2023.4.1", "@shopify/remix-oxygen": "^1.0.6" }, "devDependencies": { "@remix-run/dev": "1.15.0" }, "fixes": [ { "title": "Add a default Powered-By: Shopify-Hydrogen header", "pr": "https://github.com/Shopify/hydrogen/pull/872", "id": "872", "steps": [ { "title": " It can be disabled by passing poweredByHeader: false in the configuration object of createRequestHandler", "code": "YGBgdHMKaW1wb3J0IHtjcmVhdGVSZXF1ZXN0SGFuZGxlcn0gZnJvbSAnQHNob3BpZnkvcmVtaXgtb3h5Z2VuJzsKCmV4cG9ydCBkZWZhdWx0IHsKICBhc3luYyBmZXRjaChyZXF1ZXN0KSB7CiAgICAvLyAuLi4KICAgIGNvbnN0IGhhbmRsZVJlcXVlc3QgPSBjcmVhdGVSZXF1ZXN0SGFuZGxlcih7CiAgICAgIC8vIC4uLiBvdGhlciBwcm9wZXJ0aWVzIGluY2x1ZGVkCiAgICAgIHBvd2VyZWRCeUhlYWRlcjogZmFsc2UsCiAgICB9KTsKICAgIC8vIC4uLgogIH0sCn07CmBgYA", "file": "server.ts" } ] } ], "features": [ { "title": "Add command to pull environment variables from a Hydrogen storefront", "pr": "https://github.com/Shopify/hydrogen/pull/809", "id": "809" }, { "title": "New --debug flag for the dev command that attaches a Node inspector to the development server", "pr": "https://github.com/Shopify/hydrogen/pull/869", "id": "869" }, { "title": "Add new commands for merchants to be able to list and link Hydrogen storefronts", "pr": "https://github.com/Shopify/hydrogen/pull/784", "id": "784" }, { "title": "Added parseGid() utility", "pr": "https://github.com/Shopify/hydrogen/pull/845", "id": "845", "steps": [ { "title": "Example usage", "code": "YGBgdHMKaW1wb3J0IHtwYXJzZUdpZH0gZnJvbSAnQHNob3BpZnkvaHlkcm9nZW4tcmVhY3QnOwoKY29uc3Qge2lkLCByZXNvdXJjZX0gPSBwYXJzZUdpZCgnZ2lkOi8vc2hvcGlmeS9PcmRlci8xMjMnKTsKCmNvbnNvbGUubG9nKGlkKTsgLy8gMTIzCmNvbnNvbGUubG9nKHJlc291cmNlKTsgLy8gT3JkZXIKYGBg" } ] } ] }, { "title": "Upgraded CLI dependencies", "version": "2023.4.0", "date": "", "hash": "c14dde60e76f7d3bdb582e6be64b64109921e4db", "pr": "https://github.com/Shopify/hydrogen/pull/754", "commit": "https://github.com/Shopify/hydrogen/pull/754/commits/c14dde60e76f7d3bdb582e6be64b64109921e4db", "dependencies": { "@remix-run/react": "1.15.0", "@shopify/cli-hydrogen": "^4.1.1", "@shopify/hydrogen": "^2023.4.0", "@shopify/remix-oxygen": "^1.0.5" }, "devDependencies": { "@remix-run/dev": "1.15.1" }, "features": [], "fixes": [] }, { "title": "h2 alias, new CLI prompts, Remix future flags, SEO data generators", "version": "2023.1.7", "date": "", "hash": "d5f3e779e3ac7b22b78771dfb50f412c93a2d133", "pr": "https://github.com/Shopify/hydrogen/pull/727", "commit": "https://github.com/Shopify/hydrogen/pull/727/commits/d5f3e779e3ac7b22b78771dfb50f412c93a2d133", "dependencies": { "@remix-run/react": "1.15.0", "@shopify/cli-hydrogen": "^4.1.0", "@shopify/hydrogen": "^2023.1.7", "@shopify/remix-oxygen": "^1.0.5" }, "devDependencies": { "@remix-run/dev": "1.15.0" }, "fixes": [ { "title": "Updated CLI prompts", "pr": "https://github.com/Shopify/hydrogen/pull/733", "id": "733", "steps": [ { "title": "Update package.json", "code": "YGBgZGlmZgoiZGVwZW5kZW5jaWVzIjogewotICAiQHNob3BpZnkvY2xpIjogIjMueC54IiwKKyAgIkBzaG9waWZ5L2NsaSI6ICIzLjQ1LjAiLAp9CmBgYA==", "file": "package.json" } ] }, { "title": "Added support for the Remix future flags v2_meta, v2_errorBoundary and v2_routeConvention to the generate command", "pr": "https://github.com/Shopify/hydrogen/pull/756", "id": "756" }, { "title": "Update virtual route to use Remix V2 route name conventions", "pr": "https://github.com/Shopify/hydrogen/pull/792", "id": "792" }, { "title": "Update internal Remix dependencies to 1.15.0", "pr": "https://github.com/Shopify/hydrogen/pull/728", "id": "728", "docs": "https://github.com/remix-run/remix/releases/tag/remix%401.15.0" }, { "title": "Improve type safety in SEO data generators", "pr": "https://github.com/Shopify/hydrogen/pull/763", "id": "763" } ], "features": [ { "title": "Added a new shortcut command that creates a global h2 alias for the Hydrogen CLI", "pr": "https://github.com/Shopify/hydrogen/pull/679", "id": "679", "steps": [ { "title": "Create the h2 alias", "code": "YGBgYmFzaApucHggc2hvcGlmeSBoeWRyb2dlbiBzaG9ydGN1dApgYGA=" }, { "title": "After that, you can run commands using the new alias:", "code": "YGBgYmFzaApoMiBnZW5lcmF0ZSByb3V0ZSBob21lCmgyIGcgciBob21lICMgU2FtZSBhcyB0aGUgYWJvdmUKaDIgY2hlY2sgcm91dGVzCmBgYA==" } ] }, { "title": "Add an experimental createWithCache_unstable", "info": "This utility creates a function similar to useQuery from Hydrogen v1. Use this utility to query third-party APIs and apply custom cache options", "pr": "https://github.com/Shopify/hydrogen/pull/600", "id": "600", "steps": [ { "title": "To setup the utility, update your server.ts", "file": "server.ts", "code": "YGBgdHMKaW1wb3J0IHsKICBjcmVhdGVTdG9yZWZyb250Q2xpZW50LAogIGNyZWF0ZVdpdGhDYWNoZV91bnN0YWJsZSwKICBDYWNoZUxvbmcsCn0gZnJvbSAnQHNob3BpZnkvaHlkcm9nZW4nOwoKLy8gLi4uCgogIGNvbnN0IGNhY2hlID0gYXdhaXQgY2FjaGVzLm9wZW4oJ2h5ZHJvZ2VuJyk7CiAgY29uc3Qgd2l0aENhY2hlID0gY3JlYXRlV2l0aENhY2hlX3Vuc3RhYmxlKHtjYWNoZSwgd2FpdFVudGlsfSk7CgogIC8vIENyZWF0ZSBjdXN0b20gdXRpbGl0aWVzIHRvIHF1ZXJ5IHRoaXJkLXBhcnR5IEFQSXM6CiAgY29uc3QgZmV0Y2hNeUNNUyA9IChxdWVyeSkgPT4gewogICAgLy8gUHJlZml4IHRoZSBjYWNoZSBrZXkgYW5kIG1ha2UgaXQgdW5pcXVlIGJhc2VkIG9uIGFyZ3VtZW50cy4KICAgIHJldHVybiB3aXRoQ2FjaGUoWydteS1jbXMnLCBxdWVyeV0sIENhY2hlTG9uZygpLCAoKSA9PiB7CiAgICAgIGNvbnN0IGNtc0RhdGEgPSBhd2FpdCAoYXdhaXQgZmV0Y2goJ215LWNtcy5jb20vYXBpJywgewogICAgICAgIG1ldGhvZDogJ1BPU1QnLAogICAgICAgIGJvZHk6IHF1ZXJ5CiAgICAgIH0pKS5qc29uKCk7CgogICAgICBjb25zdCBuZXh0UGFnZSA9IChhd2FpdCBmZXRjaCgnbXktY21zLmNvbS9hcGknLCB7CiAgICAgICAgbWV0aG9kOiAnUE9TVCcsCiAgICAgICAgYm9keTogY21zRGF0YTEubmV4dFBhZ2VRdWVyeSwKICAgICAgfSkpLmpzb24oKTsKCiAgICAgIHJldHVybiB7Li4uY21zRGF0YSwgbmV4dFBhZ2V9CiAgICB9KTsKICB9OwoKICBjb25zdCBoYW5kbGVSZXF1ZXN0ID0gY3JlYXRlUmVxdWVzdEhhbmRsZXIoewogICAgYnVpbGQ6IHJlbWl4QnVpbGQsCiAgICBtb2RlOiBwcm9jZXNzLmVudi5OT0RFX0VOViwKICAgIGdldExvYWRDb250ZXh0OiAoKSA9PiAoewogICAgICBzZXNzaW9uLAogICAgICB3YWl0VW50aWwsCiAgICAgIHN0b3JlZnJvbnQsCiAgICAgIGVudiwKICAgICAgZmV0Y2hNeUNNUywKICAgIH0pLAogIH0pOwpgYGA=" } ] } ] }, { "title": "Upgrade to Remix 1.14.0, Cache-Control defaults, ShopPayButton, SEO config", "version": "2023.1.6", "date": "", "hash": "d5a7eeb659628254ee7ec4b35459cd9b3d52008f", "pr": "https://github.com/Shopify/hydrogen/pull/574", "commit": "https://github.com/Shopify/hydrogen/pull/574/commits/d5a7eeb659628254ee7ec4b35459cd9b3d52008f", "dependencies": { "@remix-run/react": "1.14.0", "@shopify/cli-hydrogen": "^4.0.9", "@shopify/hydrogen": "^2023.1.6", "@shopify/remix-oxygen": "^1.0.4" }, "devDependencies": { "@remix-run/dev": "1.14.0" }, "fixes": [ { "title": "Stop hydrating with requestIdleCallback", "pr": "https://github.com/Shopify/hydrogen/pull/667", "id": "667" }, { "title": "Fix active cart session event in Live View", "pr": "https://github.com/Shopify/hydrogen/pull/614", "id": "614", "steps": [ { "title": "Introducing getStorefrontHeaders that collects the required Shopify headers for making a Storefront API call.", "code": "YGBgdHMKKyBpbXBvcnQge2dldFN0b3JlZnJvbnRIZWFkZXJzfSBmcm9tICdAc2hvcGlmeS9yZW1peC1veHlnZW4nOwppbXBvcnQge2NyZWF0ZVN0b3JlZnJvbnRDbGllbnQsIHN0b3JlZnJvbnRSZWRpcmVjdH0gZnJvbSAnQHNob3BpZnkvaHlkcm9nZW4nOwoKZXhwb3J0IGRlZmF1bHQgewogIGFzeW5jIGZldGNoKAogICAgcmVxdWVzdDogUmVxdWVzdCwKICAgIGVudjogRW52LAogICAgZXhlY3V0aW9uQ29udGV4dDogRXhlY3V0aW9uQ29udGV4dCwKICApOiBQcm9taXNlPFJlc3BvbnNlPiB7CgogICAgY29uc3Qge3N0b3JlZnJvbnR9ID0gY3JlYXRlU3RvcmVmcm9udENsaWVudCh7CiAgICAgIGNhY2hlLAogICAgICB3YWl0VW50aWwsCi0gICAgIGJ1eWVySXA6IGdldEJ1eWVySXAocmVxdWVzdCksCiAgICAgIGkxOG46IHtsYW5ndWFnZTogJ0VOJywgY291bnRyeTogJ1VTJ30sCiAgICAgIHB1YmxpY1N0b3JlZnJvbnRUb2tlbjogZW52LlBVQkxJQ19TVE9SRUZST05UX0FQSV9UT0tFTiwKICAgICAgcHJpdmF0ZVN0b3JlZnJvbnRUb2tlbjogZW52LlBSSVZBVEVfU1RPUkVGUk9OVF9BUElfVE9LRU4sCiAgICAgIHN0b3JlRG9tYWluOiBgaHR0cHM6Ly8ke2Vudi5QVUJMSUNfU1RPUkVfRE9NQUlOfWAsCiAgICAgIHN0b3JlZnJvbnRBcGlWZXJzaW9uOiBlbnYuUFVCTElDX1NUT1JFRlJPTlRfQVBJX1ZFUlNJT04gfHwgJzIwMjMtMDEnLAogICAgICBzdG9yZWZyb250SWQ6IGVudi5QVUJMSUNfU1RPUkVGUk9OVF9JRCwKLSAgICAgcmVxdWVzdEdyb3VwSWQ6IHJlcXVlc3QuaGVhZGVycy5nZXQoJ3JlcXVlc3QtaWQnKSwKKyAgICAgc3RvcmVmcm9udEhlYWRlcnM6IGdldFN0b3JlZnJvbnRIZWFkZXJzKHJlcXVlc3QpLAogICAgfSk7CmBgYA==", "file": "server.ts" } ] } ], "features": [ { "title": "Update Remix to 1.14.0", "pr": "https://github.com/Shopify/hydrogen/pull/599", "id": "599" }, { "title": "Added Cache-Control defaults to all the demo store routes", "pr": "https://github.com/Shopify/hydrogen/pull/599", "id": "599" }, { "title": "Added new loader API for setting SEO tags within route module", "pr": "https://github.com/Shopify/hydrogen/pull/591", "id": "591" }, { "title": "ShopPayButton component now can receive a storeDomain", "pr": "https://github.com/Shopify/hydrogen/pull/645", "id": "645" }, { "title": "Added robots option to SEO config that allows users granular control over the robots meta tag.", "pr": "https://github.com/Shopify/hydrogen/pull/572", "id": "572", "steps": [ { "title": "Example usage", "code": "YGBgdHMKZXhwb3J0IGhhbmRsZSA9IHsKICBzZW86IHsKICAgIHJvYm90czogewogICAgICBub0luZGV4OiBmYWxzZSwKICAgICAgbm9Gb2xsb3c6IGZhbHNlLAogICAgfQogIH0KfQpgYGA=", "file": "All files that use SEO config" } ] }, { "title": "Added decoding prop to the SpreadMedia component", "pr": "https://github.com/Shopify/hydrogen/pull/642", "id": "642" } ] }, { "title": "Improved error handling", "version": "2023.1.5", "date": "", "hash": "b38f68558f088533846f1cd27de2eb9a97e7e9e7", "pr": "https://github.com/Shopify/hydrogen/pull/565", "commit": "https://github.com/Shopify/hydrogen/pull/565/commits/b38f68558f088533846f1cd27de2eb9a97e7e9e7", "dependencies": { "@remix-run/react": "1.12.0", "@shopify/cli-hydrogen": "^4.0.8", "@shopify/hydrogen": "^2023.1.5", "@shopify/remix-oxygen": "^1.0.3" }, "devDependencies": { "@remix-run/dev": "1.12.0" }, "fixes": [ { "title": "Improve rate limit error messages when creating new projects", "pr": "https://github.com/Shopify/hydrogen/pull/553", "id": "553" }, { "title": "Show better errors when initial build fails, and recover when fixing it.", "pr": "https://github.com/Shopify/hydrogen/pull/514", "id": "514" } ], "features": [] }, { "title": "Fix the latest tag release", "version": "2023.1.5", "date": "", "hash": "f2adc542e9ed00c113942597334f0e679a1176c8", "pr": "https://github.com/Shopify/hydrogen/pull/563", "commit": "https://github.com/Shopify/hydrogen/pull/563/commits/f2adc542e9ed00c113942597334f0e679a1176c8", "dependencies": { "@remix-run/react": "1.12.0", "@shopify/cli-hydrogen": "^4.0.7", "@shopify/hydrogen": "^2023.1.5", "@shopify/remix-oxygen": "^1.0.3" }, "devDependencies": { "@remix-run/dev": "1.12.0" }, "fixes": [ { "title": "Fix the latest tag", "pr": "https://github.com/Shopify/hydrogen/pull/562", "id": "562" } ], "features": [] }, { "title": "Use woff2 in onboarding routes, show available upgrades", "version": "2023.1.4", "date": "", "hash": "41c7592eefded147a5b6f9c61f7f92e6e01e79eb", "pr": "https://github.com/Shopify/hydrogen/pull/556", "commit": "https://github.com/Shopify/hydrogen/pull/556/commits/41c7592eefded147a5b6f9c61f7f92e6e01e79eb", "dependencies": { "@remix-run/react": "1.12.0", "@shopify/cli-hydrogen": "^4.0.7", "@shopify/hydrogen": "^2023.1.4", "@shopify/remix-oxygen": "^1.0.3" }, "devDependencies": { "@remix-run/dev": "1.12.0" }, "fixes": [ { "title": "Use woff2 format instead of ttf in onboarding routes", "pr": "https://github.com/Shopify/hydrogen/pull/538", "id": "538" }, { "title": "Show available upgrades for CLI when creating new projects", "pr": "https://github.com/Shopify/hydrogen/pull/518", "id": "518" } ], "features": [] }, { "title": "Fix imports and improve onboarding styling", "version": "2023.1.4", "date": "", "hash": "bf1014339ad0e48e621ecf60ebde7cf81894eda6", "pr": "https://github.com/Shopify/hydrogen/pull/522", "commit": "https://github.com/Shopify/hydrogen/pull/522/commits/bf1014339ad0e48e621ecf60ebde7cf81894eda6", "dependencies": { "@remix-run/react": "1.12.0", "@shopify/cli-hydrogen": "^4.0.6", "@shopify/hydrogen": "^2023.1.4", "@shopify/remix-oxygen": "^1.0.3" }, "devDependencies": { "@remix-run/dev": "1.12.0" }, "fixes": [ { "title": "Fix CLI flags for init command, and add --install-deps", "pr": "https://github.com/Shopify/hydrogen/pull/516", "id": "516" }, { "title": "Fix template imports to only reference @shopify/hydrogen", "pr": "https://github.com/Shopify/hydrogen/pull/523", "id": "523" }, { "title": "Improve onboarding style and links", "pr": "https://github.com/Shopify/hydrogen/pull/525", "id": "525" } ], "features": [] }, { "title": "Fix missing assets in virtual routes", "version": "2023.1.3", "date": "", "hash": "9e25ee653f6d76057bc9876eebbc5a58e711a25b", "pr": "https://github.com/Shopify/hydrogen/pull/504", "commit": "https://github.com/Shopify/hydrogen/pull/504/commits/9e25ee653f6d76057bc9876eebbc5a58e711a25b", "dependencies": { "@remix-run/react": "1.12.0", "@shopify/cli-hydrogen": "^4.0.5", "@shopify/hydrogen": "^2023.1.3", "@shopify/remix-oxygen": "^1.0.2" }, "devDependencies": { "@remix-run/dev": "1.12.0" }, "fixes": [ { "title": "Fix missing assets in virtual routes.", "pr": "https://github.com/Shopify/hydrogen/pull/503", "id": "503" } ], "features": [] }, { "title": "Improved Windows support, Send Hydrogen version in requests", "version": "2023.1.3", "date": "", "hash": "5a178b6175e20ec1f92ad60e90f2c7293a0e065e", "pr": "https://github.com/Shopify/hydrogen/pull/481", "commit": "https://github.com/Shopify/hydrogen/pull/481/commits/5a178b6175e20ec1f92ad60e90f2c7293a0e065e", "dependencies": { "@remix-run/react": "1.12.0", "@shopify/cli-hydrogen": "^4.0.4", "@shopify/hydrogen": "^2023.1.3", "@shopify/remix-oxygen": "^1.0.2" }, "devDependencies": { "@remix-run/dev": "1.12.0" }, "fixes": [ { "title": "Fix pathnames in Windows when creating projects and generating routes", "pr": "https://github.com/Shopify/hydrogen/pull/495", "id": "495" }, { "title": "Send Hydrogen version in Storefront API requests", "pr": "https://github.com/Shopify/hydrogen/pull/471", "id": "471" }, { "title": "Fix default Storefront type in LoaderArgs", "pr": "https://github.com/Shopify/hydrogen/pull/496", "id": "496" } ], "features": [] }, { "title": "Fix init flow on Windows", "version": "2023.1.2", "date": "", "hash": "86b9cd9d6f80b804907c6c394970c43fe077a7e0", "pr": "https://github.com/Shopify/hydrogen/pull/479", "commit": "https://github.com/Shopify/hydrogen/pull/479/commits/86b9cd9d6f80b804907c6c394970c43fe077a7e0", "dependencies": { "@remix-run/react": "1.12.0", "@shopify/cli-hydrogen": "^4.0.3", "@shopify/hydrogen": "^2023.1.2", "@shopify/remix-oxygen": "^1.0.2" }, "devDependencies": { "@remix-run/dev": "1.12.0" }, "fixes": [ { "title": "Fix initialization a new Hydrogen project on Windows", "pr": "https://github.com/Shopify/hydrogen/pull/478", "id": "478" } ], "features": [] }, { "title": "Add license files and readmes for all packages", "version": "2023.1.2", "date": "", "hash": "73e3ff46bad87d48e60609faeaa0e3c0b5a3c23b", "pr": "https://github.com/Shopify/hydrogen/pull/464", "commit": "https://github.com/Shopify/hydrogen/pull/464/commits/73e3ff46bad87d48e60609faeaa0e3c0b5a3c23b", "dependencies": { "@remix-run/react": "1.12.0", "@shopify/cli-hydrogen": "^4.0.2", "@shopify/hydrogen": "^2023.1.2", "@shopify/remix-oxygen": "^1.0.2" }, "devDependencies": { "@remix-run/dev": "1.12.0" }, "fixes": [ { "title": "Add license files and readmes for all packages ", "pr": "https://github.com/Shopify/hydrogen/pull/463", "id": "463" } ], "features": [] }, { "title": "Update dependencies", "version": "2023.1.1", "date": "", "hash": "7dff568d84a0754fa8cc9f763b5deed259eb6841", "pr": "https://github.com/Shopify/hydrogen/pull/462", "commit": "https://github.com/Shopify/hydrogen/pull/462/commits/7dff568d84a0754fa8cc9f763b5deed259eb6841", "dependencies": { "@remix-run/react": "1.12.0", "@shopify/cli-hydrogen": "^4.0.1", "@shopify/hydrogen": "^2023.1.1", "@shopify/remix-oxygen": "^1.0.1" }, "devDependencies": { "@remix-run/dev": "1.12.0" }, "fixes": [ { "title": "Update all dependencies", "pr": "https://github.com/Shopify/hydrogen/pull/461", "id": "461" } ], "features": [] }, { "title": "Remix 1.12.0, New Onboarding flow, Cart and create-app", "version": "2023.1.0", "date": "", "hash": "a2130c7e0b9821d3830964177720a7574761d5ea", "pr": "https://github.com/Shopify/hydrogen/pull/445", "commit": "https://github.com/Shopify/hydrogen/pull/445/commits/a2130c7e0b9821d3830964177720a7574761d5ea", "dependencies": { "@remix-run/react": "1.12.0", "@shopify/cli-hydrogen": "^4.0.0", "@shopify/hydrogen": "^2023.1.0", "@shopify/remix-oxygen": "^1.0.0" }, "devDependencies": { "@remix-run/dev": "1.12.0" }, "fixes": [ { "title": "Upgrade to Remix 1.12.0", "pr": "https://github.com/Shopify/h2/pull/371", "id": "371" }, { "title": "Change environment variable names to use what Oxygen will populate", "pr": "https://github.com/Shopify/h2/pull/354", "id": "354" }, { "title": "Create onboarding virtual route", "pr": "https://github.com/Shopify/h2/pull/414", "id": "414" }, { "title": "Introduce create-app CLI package", "pr": "https://github.com/Shopify/h2/pull/397", "id": "397" }, { "title": "Improve the onboarding experience for the CLI", "pr": null, "id": null }, { "title": "Refactor the cart implementation", "pr": "https://github.com/Shopify/h2/pull/311", "id": "311" }, { "title": "Use the new version of GraphiQL instead of GraphQL Playground", "pr": "https://github.com/Shopify/h2/pull/410", "id": "410" }, { "title": "Add Hydrogen utils function and update demo store to send shopify analytics", "pr": "https://github.com/Shopify/h2/pull/376", "id": "376" }, { "title": "Rename the notFoundMaybeRedirect utility to storefrontRedirect", "pr": "https://github.com/Shopify/h2/pull/362", "id": "362" }, { "title": "Use new versioning schema", "pr": null, "id": null }, { "title": "Initial release of @shopify/remix-oxygen", "pr": null, "id": null } ], "features": [] } ] }