Repository navigation
[ci] release 2026.10.3 - #4229
Open
shopify-github-actions-access[bot] wants to merge 1 commit into
Open
shopify-github-actions-access[bot] wants to merge 1 commit into
shopify-github-actions-access[bot] wants to merge 1 commit into
Conversation
shopify-github-actions-access
Bot
requested a review
from a team
as a code owner
October 20, 2026 23:57
Contributor
|
Oxygen deployed a preview of your
Learn more about Hydrogen's GitHub integration. |
shopify-github-actions-access
Bot
force-pushed
the
changeset-release/main
branch
12 times, most recently
from
October 24, 2026 02:25
edc41ab to
bc03e6d
Compare
shopify-github-actions-access
Bot
force-pushed
the
changeset-release/main
branch
from
October 26, 2026 19:20
bc03e6d to
c97a972
Compare
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.
Releases
@shopify/hydrogen@2026.10.3
Minor Changes
PredictiveSearchDataFromHandlersandSearchResultUrlOptionsfrom@shopify/hydrogen.PredictiveSearchDataFromHandlerstypesusePredictiveSearch()state from the same custom fragments as the server handlers:usePredictiveSearch<PredictiveSearchDataFromHandlers<typeof predictiveSearchHandlers>>().SearchResultUrlOptionsis the options type ofgetSearchResultUrl().requestContext.markResponseAsPersonalized(reason)is now public. Call it when a response holds customer data that Hydrogen can't see, such as a page that server-renders the buyer's cart.requestContext.applyResponseHeaders()then makes that response private and uncacheable, and removesSurrogate-Controland vendor*-Cache-Controlheaders. Responses that you don't mark stay cacheable.ShopifyRouteHandleraccepts an optional third type parameter for the handler's context, defaulting toShopifyRouteHandlerContext, andcreateShopifyRouteHandlernow returnsShopifyRouteHandler<TPathname, TMethod, TContext>. Use it to type a handler whose context omitssessionManager, for exampleShopifyRouteHandler<"/api/cart", "POST", Omit<ShopifyRouteHandlerContext, "sessionManager">>. Existing uses are unchanged.Patch Changes
105c0ab:
register("remove")now returnsformNoValidate: true, typed as the newRemoveButtonAttributes. Before, invalid text in a cart line's quantity input, such as letters, made the browser cancel the Remove button's submit, so the customer couldn't remove the line until they fixed the quantity. Removing a line reads only the line ID, so the button now skips form validation. If you spreadregister("remove")onto a component whose props don't acceptformNoValidate, add the prop to the component.4e7fdeb:
/checkoutand/cart/<permalink>redirects now sendCache-Control: private, no-store, max-age=0, must-revalidate, so shared caches can't store a buyer-specific checkout URL. The checkout redirect also no longer intercepts/account/login,/account/authorize,/account/refresh, or/account/logout, so apps that serve these routes with their own handlers now receive the requests.27c467a: The Customer Account client now fills an omitted
$languageonly when the document declares it as$language: LanguageCode, matching the Storefront client. A same-named variable of any other type, such as$language: String!, is left to the caller and keeps its declared requiredness in the variables type. A value you pass still wins over the request context.If a nullable
$languageof another type relied on the autofill, the client now leaves it out of the request when you omit it, so its GraphQL default ornullapplies. Declare it asLanguageCodeor pass the value explicitly.8cc32d8: Fix price filter parsing for shops whose locale uses a dot as the group separator (e.g. de, nl, tr). Canonical decimal values like
12.5from serialized URLs and number inputs now parse correctly regardless of shop locale.ddb7aa5: Give a collection-scoped product match without a collection handle the product's standard path. A
productInCollectiontemplate that leaves out:collectionHandleused to match with astandardPathnameof/collections/:collectionHandle/products/<handle>, placeholder included. It is now/products/<handle>, andtemplates.standardis the product template to match.1d99e40: A malformed
cartcookie is treated as a missing cart, and malformed percent sequences in collection filter keys stay literal, instead of failing the request.b2d0356: Responses that Hydrogen makes private, such as personalized, session, and checkout redirect responses, now also drop
Oxygen-Cache-Controland any other vendor*-Cache-Controlheader. Oxygen's full-page cache prefersOxygen-Cache-ControloverCache-Control, so before this change a route that opted into the full-page cache could still store a page with customer data and serve it to other visitors.8fe4e23:
hydrogen setupnow downloads the React Router template from thedistbranch instead ofdist-preview.f1b9b22: The
hydrogen-setupaccount-page step and thehydrogen-smoke-testaccount checks now point at thehydrogen-local-httpsskill when a real login needs a registered HTTPS origin. Because agent shells usually run withCIset and no TTY, they tell agents to ask the user to rundev:httpsin a real terminal on Vite-based frameworks, which serves trusted HTTPS and registers the Customer Account URLs, and note that Next.js uses its own HTTPS command with manual URL configuration. They note thatnpx hydrogen certs installonly provisions certificate files. If the user can't provide a registered HTTPS local origin, agents fall back to the signed-out checks and say so.93c0ccc: The
hydrogen-request-handlers,hydrogen-storefront-client,hydrogen-oxygen, andmigrate-to-hydrogen-2026-10skills no longer hardcode thefuture.v8_middlewareflag. They now tell agents to make sure middleware is enabled for the app's version of React Router. The migration skill also checks that the root middleware actually runs:GET /api/cartmust return JSON from the cart handler.7eecd1c: Since 2026.10.2, the Storefront client injects the request's market only into variables declared as
$country: CountryCodeor$language: LanguageCode. If your query declared a nullable$countryor$languagewith another type, such as$country: String, and relied on the client filling in the market, the client no longer injects it and leaves it out of the request unless you pass it, so its GraphQL default ornullapplies. The variables type doesn't flag this because the variable is optional. Declare it as$country: CountryCodeor$language: LanguageCodeto keep injection, or passclient.i18n.country/client.i18n.languageexplicitly.c4d7b05: The Storefront API client no longer follows redirects. Runtimes forward custom Shopify headers such as
Shopify-Storefront-Private-Tokenacross origins when they follow a redirect, so a3xxresponse from the Storefront API now throws aStorefrontApiErrorinstead. Rejected redirects no longer contributeSet-Cookieheaders to the response.createFetchWithCache()now returns opaque responses, such as a browserredirect: "manual"response, unchanged instead of failing with aRangeErrorwhile serializing their0status.c23444d: Resolve
@shopify/hydrogen/react,/vue,/customer-account, and/viteforrequire-based resolvers, such as Jest in its default CommonJS mode, the same way the root entry point already resolves. They still point at the ESM build, so those tools load them throughrequire(esm)or a transform, as with the root.@shopify/mini-oxygen@4.2.4
Patch Changes
undicifrom 7.24.0 to 7.30.1 to pick up upstream security fixes.