Skip to content

Conversation

renovate[bot]
Copy link
Contributor

@renovate renovate bot commented Apr 14, 2025

This PR contains the following updates:

Package Change Age Confidence
@shopify/hydrogen (source) ^2024.7.4 -> ^2025.0.0 age confidence

Release Notes

Shopify/hydrogen (@​shopify/hydrogen)

v2025.7.0

Compare Source

Major Changes
  • Update Storefront API and Customer Account API to version 2025-07 (#​3082) by @​juanpprieto

    This update includes:

    • Updated API version constants to 2025-07
    • Regenerated GraphQL types for both Storefront and Customer Account APIs
    • Updated all hardcoded API version references in documentation and tests
    • Regenerated skeleton template types
    • Updated skeleton's @​shopify/cli dependency to ~3.83.3

    Breaking changes may occur due to API schema changes between versions.

  • Add React Router 7.9.2 support infrastructure with full compatibility for both context access patterns. (#​3142) by @​juanpprieto

v2025.5.0

Compare Source

Patch Changes

v2025.4.1

Compare Source

Patch Changes
  • Add a buyerIdentity parameter to createHydrogenContext and createCartHandler. This buyer identity will be used as the default buyer identity for all new cart creations: (#​2927) by @​blittle

    const hydrogenContext = createHydrogenContext({
      // ...
      buyerIdentity: {
        companyLocationId: '...',
      },
    });

v2025.4.0

Compare Source

Patch Changes

v2025.1.4

Compare Source

Patch Changes
  • Fix the customer account implementation to clear all session data on logout. Previously we would only clear customer account credentials on logout. This change also clears any custom data in the session as well. You can opt out and keep custom data in the session by passing the keepSession option to logout: (#​2843) by @​blittle

    export async function action({context}: ActionFunctionArgs) {
      return context.customerAccount.logout({
        keepSession: true
      });
    }
  • Add support for cartDeliveryAddressesAdd, cartDeliveryAddressesRemove and cartDeliveryAddressesUpdate mutations (#​2850) by @​juanpprieto

  • Deprecation Notice: VariantSelector (#​2837) by @​juanpprieto

    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.

    1. 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.
    const PRODUCT_FRAGMENT = `#graphql
      fragment Product on Product {
        id
        title
        vendor
        handle
        descriptionHtml
        description
    +    encodedVariantExistence
    +    encodedVariantAvailability
        options {
          name
          optionValues {
            name
    +        firstSelectableVariant {
    +          ...ProductVariant
    +        }
    +        swatch {
    +          color
    +          image {
    +            previewImage {
    +              url
    +            }
    +          }
    +        }
          }
        }
    -    selectedVariant: selectedOrFirstAvailableVariant(selectedOptions: $selectedOptions, ignoreUnknownOptions: true, caseInsensitiveMatch: true) {
    +    selectedOrFirstAvailableVariant(selectedOptions: $selectedOptions, ignoreUnknownOptions: true, caseInsensitiveMatch: true) {
    +      ...ProductVariant
    +    }
    +    adjacentVariants (selectedOptions: $selectedOptions) {
    +      ...ProductVariant
    +    }
    -    variants(first: 1) {
    -      nodes {
    -        ...ProductVariant
    -      }
    -    }
        seo {
          description
          title
        }
      }
      ${PRODUCT_VARIANT_FRAGMENT}
    ` as const;
    1. 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.
    function loadDeferredData({context, params}: LoaderFunctionArgs) {
    +  // Put any API calls that is not critical to be available on first page render
    +  // For example: product reviews, product recommendations, social feeds.
    -  // In order to show which variants are available in the UI, we need to query
    -  // all of them. But there might be a *lot*, so instead separate the variants
    -  // into it's own separate query that is deferred. So there's a brief moment
    -  // where variant options might show as available when they're not, but after
    -  // this deferred query resolves, the UI will update.
    -  const variants = context.storefront
    -    .query(VARIANTS_QUERY, {
    -      variables: {handle: params.handle!},
    -    })
    -    .catch((error) => {
    -      // Log query errors, but don't throw them so the page can still render
    -      console.error(error);
    -      return null;
    -    });
    
    +  return {}
    -  return {
    -    variants,
    -  };
    }
    1. Update the Product component to use getAdjacentAndFirstAvailableVariants for determining the selected variant, improving handling of adjacent and available variants.
    import {
      getSelectedProductOptions,
      Analytics,
      useOptimisticVariant,
    +  getAdjacentAndFirstAvailableVariants,
    } from '@​shopify/hydrogen';
    
    export default function Product() {
    +  const {product} = useLoaderData<typeof loader>();
    -  const {product, variants} = useLoaderData<typeof loader>();
    
    +  // Optimistically selects a variant with given available variant information
    +  const selectedVariant = useOptimisticVariant(
    +    product.selectedOrFirstAvailableVariant,
    +    getAdjacentAndFirstAvailableVariants(product),
    +  );
    -  const selectedVariant = useOptimisticVariant(
    -    product.selectedVariant,
    -    variants,
    -  );
    1. 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.
    import {
      getSelectedProductOptions,
      Analytics,
      useOptimisticVariant,
      getAdjacentAndFirstAvailableVariants,
    +  mapSelectedProductOptionToObject,
    } from '@&#8203;shopify/hydrogen';
    
    export default function Product() {
      const {product} = useLoaderData<typeof loader>();
    
      // Optimistically selects a variant with given available variant information
      const selectedVariant = useOptimisticVariant(
        product.selectedOrFirstAvailableVariant,
        getAdjacentAndFirstAvailableVariants(product),
      );
    
    +  // Sets the search param to the selected variant without navigation
    +  // only when no search params are set in the url
    +  useEffect(() => {
    +    const searchParams = new URLSearchParams(
    +      mapSelectedProductOptionToObject(
    +        selectedVariant.selectedOptions || [],
    +      ),
    +    );
    
    +    if (window.location.search === '' && searchParams.toString() !== '') {
    +      window.history.replaceState(
    +        {},
    +        '',
    +        `${location.pathname}?${searchParams.toString()}`,
    +      );
    +    }
    +  }, [
    +    JSON.stringify(selectedVariant.selectedOptions),
    +  ]);
    1. Retrieve the product options array using getProductOptions, enabling efficient handling of product variants and their associated options.
    import {
      getSelectedProductOptions,
      Analytics,
      useOptimisticVariant,
    +  getProductOptions,
      getAdjacentAndFirstAvailableVariants,
      mapSelectedProductOptionToObject,
    } from '@&#8203;shopify/hydrogen';
    
    export default function Product() {
      const {product} = useLoaderData<typeof loader>();
    
      // Optimistically selects a variant with given available variant information
      const selectedVariant = useOptimisticVariant(
        product.selectedOrFirstAvailableVariant,
        getAdjacentAndFirstAvailableVariants(product),
      );
    
      // Sets the search param to the selected variant without navigation
      // only when no search params are set in the url
      useEffect(() => {
        // ...
      }, [
        JSON.stringify(selectedVariant.selectedOptions),
      ]);
    
    +  // Get the product options array
    +  const productOptions = getProductOptions({
    +    ...product,
    +    selectedOrFirstAvailableVariant: selectedVariant,
    +  });
    1. Remove Await and Suspense from ProductForm as there are no longer any asynchronous queries to wait for, simplifying the component structure.
    export default function Product() {
    
      ...
    
      return (
        ...
    +        <ProductForm
    +          productOptions={productOptions}
    +          selectedVariant={selectedVariant}
    +        />
    -        <Suspense
    -          fallback={
    -            <ProductForm
    -              product={product}
    -              selectedVariant={selectedVariant}
    -              variants={[]}
    -            />
    -          }
    -        >
    -          <Await
    -            errorElement="There was a problem loading product variants"
    -            resolve={variants}
    -          >
    -            {(data) => (
    -              <ProductForm
    -                product={product}
    -                selectedVariant={selectedVariant}
    -                variants={data?.product?.variants.nodes || []}
    -              />
    -            )}
    -          </Await>
    -        </Suspense>
    1. 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.
    import {Link, useNavigate} from '@&#8203;remix-run/react';
    import {type MappedProductOptions} from '@&#8203;shopify/hydrogen';
    import type {
      Maybe,
      ProductOptionValueSwatch,
    } from '@&#8203;shopify/hydrogen/storefront-api-types';
    import {AddToCartButton} from './AddToCartButton';
    import {useAside} from './Aside';
    import type {ProductFragment} from 'storefrontapi.generated';
    
    export function ProductForm({
      productOptions,
      selectedVariant,
    }: {
      productOptions: MappedProductOptions[];
      selectedVariant: ProductFragment['selectedOrFirstAvailableVariant'];
    }) {
      const navigate = useNavigate();
      const {open} = useAside();
      return (
        <div className="product-form">
          {productOptions.map((option) => (
            <div className="product-options" key={option.name}>
              <h5>{option.name}</h5>
              <div className="product-options-grid">
                {option.optionValues.map((value) => {
                  const {
                    name,
                    handle,
                    variantUriQuery,
                    selected,
                    available,
                    exists,
                    isDifferentProduct,
                    swatch,
                  } = value;
    
                  if (isDifferentProduct) {
                    // SEO
                    // When the variant is a combined listing child product
                    // that leads to a different URL, we need to render it
                    // as an anchor tag
                    return (
                      <Link
                        className="product-options-item"
                        key={option.name + name}
                        prefetch="intent"
                        preventScrollReset
                        replace
                        to={`/products/${handle}?${variantUriQuery}`}
                        style={{
                          border: selected
                            ? '1px solid black'
                            : '1px solid transparent',
                          opacity: available ? 1 : 0.3,
                        }}
                      >
                        <ProductOptionSwatch swatch={swatch} name={name} />
                      </Link>
                    );
                  } else {
                    // SEO
                    // When the variant is an update to the search param,
                    // render it as a button with JavaScript navigating to
                    // the variant so that SEO bots do not index these as
                    // duplicated links
                    return (
                      <button
                        type="button"
                        className={`product-options-item${
                          exists && !selected ? ' link' : ''
                        }`}
                        key={option.name + name}
                        style={{
                          border: selected
                            ? '1px solid black'
                            : '1px solid transparent',
                          opacity: available ? 1 : 0.3,
                        }}
                        disabled={!exists}
                        onClick={() => {
                          if (!selected) {
                            navigate(`?${variantUriQuery}`, {
                              replace: true,
                            });
                          }
                        }}
                      >
                        <ProductOptionSwatch swatch={swatch} name={name} />
                      </button>
                    );
                  }
                })}
              </div>
              <br />
            </div>
          ))}
          <AddToCartButton
            disabled={!selectedVariant || !selectedVariant.availableForSale}
            onClick={() => {
              open('cart');
            }}
            lines={
              selectedVariant
                ? [
                    {
                      merchandiseId: selectedVariant.id,
                      quantity: 1,
                      selectedVariant,
                    },
                  ]
                : []
            }
          >
            {selectedVariant?.availableForSale ? 'Add to cart' : 'Sold out'}
          </AddToCartButton>
        </div>
      );
    }
    
    function ProductOptionSwatch({
      swatch,
      name,
    }: {
      swatch?: Maybe<ProductOptionValueSwatch> | undefined;
      name: string;
    }) {
      const image = swatch?.image?.previewImage?.url;
      const color = swatch?.color;
    
      if (!image && !color) return name;
    
      return (
        <div
          aria-label={name}
          className="product-option-label-swatch"
          style={{
            backgroundColor: color || 'transparent',
          }}
        >
          {!!image && <img src={image} alt={name} />}
        </div>
      );
    }
    1. Make useVariantUrl and getVariantUrl functions more flexible by allowing selectedOptions to be optional. This ensures compatibility with cases where no options are provided.
    export function useVariantUrl(
      handle: string,
    -  selectedOptions: SelectedOption[],
    +  selectedOptions?: SelectedOption[],
    ) {
      const {pathname} = useLocation();
    
      return useMemo(() => {
        return getVariantUrl({
          handle,
          pathname,
          searchParams: new URLSearchParams(),
          selectedOptions,
        });
      }, [handle, selectedOptions, pathname]);
    }
    export function getVariantUrl({
      handle,
      pathname,
      searchParams,
      selectedOptions,
    }: {
      handle: string;
      pathname: string;
      searchParams: URLSearchParams;
    -  selectedOptions: SelectedOption[];
    +  selectedOptions?: SelectedOption[],
    }) {
      const match = /(\/[a-zA-Z]{2}-[a-zA-Z]{2}\/)/g.exec(pathname);
      const isLocalePathname = match && match.length > 0;
      const path = isLocalePathname
        ? `${match![0]}products/${handle}`
        : `/products/${handle}`;
    
    -  selectedOptions.forEach((option) => {
    +  selectedOptions?.forEach((option) => {
        searchParams.set(option.name, option.value);
      });
    1. 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.
    const PRODUCT_ITEM_FRAGMENT = `#graphql
      fragment MoneyProductItem on MoneyV2 {
        amount
        currencyCode
      }
      fragment ProductItem on Product {
        id
        handle
        title
        featuredImage {
          id
          altText
          url
          width
          height
        }
        priceRange {
          minVariantPrice {
            ...MoneyProductItem
          }
          maxVariantPrice {
            ...MoneyProductItem
          }
        }
    -    variants(first: 1) {
    -      nodes {
    -        selectedOptions {
    -          name
    -          value
    -        }
    -      }
    -    }
      }
    ` as const;

    and remove the variant reference

    function ProductItem({
      product,
      loading,
    }: {
      product: ProductItemFragment;
      loading?: 'eager' | 'lazy';
    }) {
    -  const variant = product.variants.nodes[0];
    -  const variantUrl = useVariantUrl(product.handle, variant.selectedOptions);
    +  const variantUrl = useVariantUrl(product.handle);
      return (
    1. Simplify the ProductItem component by removing variant-specific queries and logic. The useVariantUrl function now generates URLs without relying on variant options, reducing complexity.
    const PRODUCT_ITEM_FRAGMENT = `#graphql
      fragment MoneyProductItem on MoneyV2 {
        amount
        currencyCode
      }
      fragment ProductItem on Product {
        id
        handle
        title
        featuredImage {
          id
          altText
          url
          width
          height
        }
        priceRange {
          minVariantPrice {
            ...MoneyProductItem
          }
          maxVariantPrice {
            ...MoneyProductItem
          }
        }
    -    variants(first: 1) {
    -      nodes {
    -        selectedOptions {
    -          name
    -          value
    -        }
    -      }
    -    }
      }
    ` as const;

    and remove the variant reference

    function ProductItem({
      product,
      loading,
    }: {
      product: ProductItemFragment;
      loading?: 'eager' | 'lazy';
    }) {
    -  const variant = product.variants.nodes[0];
    -  const variantUrl = useVariantUrl(product.handle, variant.selectedOptions);
    +  const variantUrl = useVariantUrl(product.handle);
      return (
    1. Replace variants(first: 1) with selectedOrFirstAvailableVariant in GraphQL fragments to directly fetch the most relevant variant, improving query efficiency and clarity.
    const SEARCH_PRODUCT_FRAGMENT = `#graphql
      fragment SearchProduct on Product {
        __typename
        handle
        id
        publishedAt
        title
        trackingParameters
        vendor
    -    variants(first: 1) {
    -      nodes {
    +    selectedOrFirstAvailableVariant(
    +      selectedOptions: []
    +      ignoreUnknownOptions: true
    +      caseInsensitiveMatch: true
    +    ) {
            id
            image {
              url
              altText
              width
              height
            }
            price {
              amount
              currencyCode
            }
            compareAtPrice {
              amount
              currencyCode
            }
            selectedOptions {
              name
              value
            }
            product {
              handle
              title
            }
         }
    -    }
      }
    ` as const;
    const PREDICTIVE_SEARCH_PRODUCT_FRAGMENT = `#graphql
      fragment PredictiveProduct on Product {
        __typename
        id
        title
        handle
        trackingParameters
    -    variants(first: 1) {
    -      nodes {
    +    selectedOrFirstAvailableVariant(
    +      selectedOptions: []
    +      ignoreUnknownOptions: true
    +      caseInsensitiveMatch: true
    +    ) {
            id
            image {
              url
              altText
              width
              height
            }
            price {
              amount
              currencyCode
            }
         }
    -    }
      }
    1. Refactor SearchResultsProducts to use selectedOrFirstAvailableVariant for fetching product price and image, simplifying the logic and improving performance.
    function SearchResultsProducts({
      term,
      products,
    }: PartialSearchResult<'products'>) {
      if (!products?.nodes.length) {
        return null;
      }
    
      return (
        <div className="search-result">
          <h2>Products</h2>
          <Pagination connection={products}>
            {({nodes, isLoading, NextLink, PreviousLink}) => {
              const ItemsMarkup = nodes.map((product) => {
                const productUrl = urlWithTrackingParams({
                  baseUrl: `/products/${product.handle}`,
                  trackingParams: product.trackingParameters,
                  term,
                });
    
    +            const price = product?.selectedOrFirstAvailableVariant?.price;
    +            const image = product?.selectedOrFirstAvailableVariant?.image;
    
                return (
                  <div className="search-results-item" key={product.id}>
                    <Link prefetch="intent" to={productUrl}>
    -                  {product.variants.nodes[0].image && (
    +                  {image && (
                        <Image
    -                      data={product.variants.nodes[0].image}
    +                      data={image}
                          alt={product.title}
                          width={50}
                        />
                      )}
                      <div>
                        <p>{product.title}</p>
                        <small>
    -                      <Money data={product.variants.nodes[0].price} />
    +                      {price &&
    +                        <Money data={price} />
    +                      }
                        </small>
                      </div>
                    </Link>
                  </div>
                );
              });
    1. Update SearchResultsPredictive to use selectedOrFirstAvailableVariant for fetching product price and image, ensuring accurate and efficient data retrieval.
    function SearchResultsPredictiveProducts({
      term,
      products,
      closeSearch,
    }: PartialPredictiveSearchResult<'products'>) {
      if (!products.length) return null;
    
      return (
        <div className="predictive-search-result" key="products">
          <h5>Products</h5>
          <ul>
            {products.map((product) => {
              const productUrl = urlWithTrackingParams({
                baseUrl: `/products/${product.handle}`,
                trackingParams: product.trackingParameters,
                term: term.current,
              });
    
    +          const price = product?.selectedOrFirstAvailableVariant?.price;
    -          const image = product?.variants?.nodes?.[0].image;
    +          const image = product?.selectedOrFirstAvailableVariant?.image;
              return (
                <li className="predictive-search-result-item" key={product.id}>
                  <Link to={productUrl} onClick={closeSearch}>
                    {image && (
                      <Image
                        alt={image.altText ?? ''}
                        src={image.url}
                        width={50}
                        height={50}
                      />
                    )}
                    <div>
                      <p>{product.title}</p>
                      <small>
    -                    {product?.variants?.nodes?.[0].price && (
    +                    {price && (
    -                      <Money data={product.variants.nodes[0].price} />
    +                      <Money data={price} />
                        )}
                      </small>
                    </div>
                  </Link>
                </li>
              );
            })}
          </ul>
        </div>
      );
    }

v2025.1.3

Compare Source

Patch Changes
  • Bump Remix to 2.16.1 and vite to 6.2.0 (#​2784) by @​wizardlyhel

  • Support for the Remix future flag v3_routeConfig. (#​2722) by @​seanparsons

    Please refer to the Remix documentation for more details on v3_routeConfig future flag: https://remix.run/docs/en/main/start/future-flags#v3_routeconfig

    1. Add the following npm package dev dependencies:

        "devDependencies": {
          "@&#8203;remix-run/dev": "^2.16.1",
      +    "@&#8203;remix-run/fs-routes": "^2.16.1",
      +    "@&#8203;remix-run/route-config": "^2.16.1",
    2. If you have export function Layout in your root.tsx, move this export into its own file. For example:

      // /app/layout.tsx
      export default function Layout() {
        const nonce = useNonce();
        const data = useRouteLoaderData<RootLoader>('root');
      
        return (
          <html lang="en">
          ...
        );
      }
    3. Create a routes.ts file.

      import {flatRoutes} from '@&#8203;remix-run/fs-routes';
      import {layout, type RouteConfig} from '@&#8203;remix-run/route-config';
      import {hydrogenRoutes} from '@&#8203;shopify/hydrogen';
      
      export default hydrogenRoutes([
        // Your entire app reading from routes folder using Layout from layout.tsx
        layout('./layout.tsx', await flatRoutes()),
      ]) satisfies RouteConfig;
    4. Update your vite.config.ts.

      export default defineConfig({
        plugins: [
          hydrogen(),
          oxygen(),
          remix({
      -      presets: [hydrogen.preset()],
      +      presets: [hydrogen.v3preset()],
  • Updated dependencies [0425e50d]:

v2025.1.2

Compare Source

Patch Changes

v2025.1.1

Compare Source

Patch Changes
  • Update getProductOptions to handle divergent product options. (#​2747) by @​wizardlyhel

  • Added the ability to optionally provide language data to createCustomerAccountClient, and automatically pass it down to it from createHydrogenContext. (#​2746) by @​ruggishop

    If present, the provided language will be used to set the uilocales property in the Customer Account API request.

    // Optional: provide language data to the constructor
    const customerAccount = createCustomerAccountClient({
      // ...
      language,
    });

    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.

    export async function loader({request, context}: LoaderFunctionArgs) {
      return context.customerAccount.login({
        uiLocales: 'FR', // will be used instead of the one coming from the context
      });
    }
  • Upgrade eslint to version 9 and unify eslint config across all packages (with the exception of the skeleton, which still keeps its own config) (#​2716) by @​liady

  • Bump remix version (#​2740) by @​wizardlyhel

  • Turn on Remix v3_singleFetch future flag (#​2708) by @​wizardlyhel

  • B2B methods and props are now stable. Warnings are in place for unstable usages and will be removed completely in the next major version. (#​2736) by @​dustinfirman

    1. Search for anywhere using UNSTABLE_getBuyer and UNSTABLE_setBuyer is update accordingly.

      - customerAccount.UNSTABLE_getBuyer();
      + customerAccount.getBuyer()
      
      - customerAccount.UNSTABLE_setBuyer({
      + customerAccount.setBuyer({
          companyLocationId,
        });
    2. Update createHydrogenContext to remove the unstableB2b option

        const hydrogenContext = createHydrogenContext({
          env,
          request,
          cache,
          waitUntil,
          session,
          i18n: {language: 'EN', country: 'US'},
      -    customerAccount: {
      -      unstableB2b: true,
      -    },
          cart: {
            queryFragment: CART_QUERY_FRAGMENT,
          },
        });
  • Updated dependencies [3af2e453, cd65685c]:

v2025.1.0

Compare Source

Patch Changes

Configuration

📅 Schedule: Branch creation - Between 12:00 AM and 03:59 AM, only on Monday ( * 0-3 * * 1 ) (UTC), Automerge - At any time (no schedule defined).

🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 Ignore: Close this PR and you won't be reminded about this update again.


  • If you want to rebase/retry this PR, check this box

This PR was generated by Mend Renovate. View the repository job log.

@renovate renovate bot requested a review from a team as a code owner April 14, 2025 17:01
@renovate renovate bot added dependencies Pull requests that update a dependency file javascript labels Apr 14, 2025
Copy link

netlify bot commented Apr 14, 2025

Deploy Preview for remix-edge ready!

Name Link
🔨 Latest commit 15a6a76
🔍 Latest deploy log https://app.netlify.com/projects/remix-edge/deploys/6898bb3d97ae1200080f505c
😎 Deploy Preview https://deploy-preview-517--remix-edge.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

To edit notification comments on pull requests, go to your Netlify project configuration.

@github-actions github-actions bot added the type: chore work needed to keep the product and development running smoothly label Apr 14, 2025
Copy link

netlify bot commented Apr 14, 2025

Deploy Preview for remix-serverless ready!

Name Link
🔨 Latest commit 15a6a76
🔍 Latest deploy log https://app.netlify.com/projects/remix-serverless/deploys/6898bb3dfee6aa00089b6504
😎 Deploy Preview https://deploy-preview-517--remix-serverless.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

To edit notification comments on pull requests, go to your Netlify project configuration.

@renovate renovate bot force-pushed the renovate/shopify-hydrogen-2025.x branch from cb7439a to 15a6a76 Compare August 10, 2025 15:31
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependencies Pull requests that update a dependency file javascript type: chore work needed to keep the product and development running smoothly

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants