From db63db13318e0bb4a70d0d18944974a0396fda08 Mon Sep 17 00:00:00 2001
From: Kristian Arvidsson <124673544+arvidsson-geins@users.noreply.github.com>
Date: Thu, 28 Nov 2024 11:24:28 +0100
Subject: [PATCH] feat/add-geins-as-provider (#1)
* feat: add geins as provider
---
.env.example | 22 +-
README.md | 95 +-
app/[page]/opengraph-image.tsx | 2 +-
app/[page]/page.tsx | 6 +-
app/api/revalidate/route.ts | 2 +-
app/layout.tsx | 2 +-
app/product/[handle]/page.tsx | 12 +-
app/search/[collection]/opengraph-image.tsx | 2 +-
app/search/[collection]/page.tsx | 4 +-
app/search/page.tsx | 2 +-
app/sitemap.ts | 11 +-
components/carousel.tsx | 4 +-
components/cart/actions.ts | 4 +-
components/cart/add-to-cart.tsx | 8 +-
components/cart/cart-context.tsx | 31 +-
components/cart/delete-item-button.tsx | 4 +-
components/cart/edit-item-quantity-button.tsx | 4 +-
components/grid/three-items.tsx | 6 +-
components/icons/geins.tsx | 81 +
components/layout/footer-menu.tsx | 8 +-
components/layout/footer.tsx | 11 +-
components/layout/navbar/index.tsx | 6 +-
components/layout/navbar/mobile-menu.tsx | 6 +-
components/layout/product-grid-items.tsx | 4 +-
components/layout/search/collections.tsx | 2 +-
components/price.tsx | 4 +-
components/product/product-description.tsx | 4 +-
components/product/variant-selector.tsx | 6 +-
components/prose.tsx | 1 +
components/welcome-toast.tsx | 2 +-
lib/geins/cms.ts | 26 +
lib/geins/constants.ts | 9 +
lib/geins/index.ts | 214 ++
lib/geins/oms.ts | 102 +
lib/geins/pim.ts | 151 +
lib/geins/queries/fragments/campaign.ts | 7 +
lib/geins/queries/fragments/cart.ts | 107 +
lib/geins/queries/fragments/list-info.ts | 26 +
lib/geins/queries/fragments/list-product.ts | 32 +
lib/geins/queries/fragments/meta.ts | 7 +
lib/geins/queries/fragments/price.ts | 16 +
lib/geins/queries/fragments/sku.ts | 14 +
lib/geins/queries/fragments/stock.ts | 10 +
lib/geins/queries/fragments/variant.ts | 22 +
lib/geins/queries/mutations/cart-add.ts | 22 +
.../queries/mutations/cart-line-update.ts | 22 +
lib/geins/queries/mutations/checkout.ts | 21 +
lib/geins/queries/queries/cart-create.ts | 10 +
lib/geins/queries/queries/cart-get.ts | 10 +
lib/geins/queries/queries/categories.ts | 22 +
lib/geins/queries/queries/listPageInfo.ts | 10 +
lib/geins/queries/queries/product.ts | 92 +
lib/geins/queries/queries/products-related.ts | 43 +
lib/geins/queries/queries/products.ts | 38 +
lib/geins/reshape.ts | 439 +++
lib/geins/types.ts | 184 ++
lib/shopify/fragments/cart.ts | 53 -
lib/shopify/fragments/image.ts | 10 -
lib/shopify/fragments/product.ts | 64 -
lib/shopify/fragments/seo.ts | 8 -
lib/shopify/index.ts | 455 ---
lib/shopify/mutations/cart.ts | 45 -
lib/shopify/queries/cart.ts | 10 -
lib/shopify/queries/collection.ts | 56 -
lib/shopify/queries/menu.ts | 10 -
lib/shopify/queries/page.ts | 41 -
lib/shopify/queries/product.ts | 32 -
lib/shopify/types.ts | 272 --
next.config.ts | 9 +-
package.json | 8 +-
pnpm-lock.yaml | 991 ++++--
repopack-output.txt | 164 +
yarn.lock | 2927 +++++++++++++++++
73 files changed, 5702 insertions(+), 1465 deletions(-)
create mode 100644 components/icons/geins.tsx
create mode 100644 lib/geins/cms.ts
create mode 100644 lib/geins/constants.ts
create mode 100644 lib/geins/index.ts
create mode 100644 lib/geins/oms.ts
create mode 100644 lib/geins/pim.ts
create mode 100644 lib/geins/queries/fragments/campaign.ts
create mode 100644 lib/geins/queries/fragments/cart.ts
create mode 100644 lib/geins/queries/fragments/list-info.ts
create mode 100644 lib/geins/queries/fragments/list-product.ts
create mode 100644 lib/geins/queries/fragments/meta.ts
create mode 100644 lib/geins/queries/fragments/price.ts
create mode 100644 lib/geins/queries/fragments/sku.ts
create mode 100644 lib/geins/queries/fragments/stock.ts
create mode 100644 lib/geins/queries/fragments/variant.ts
create mode 100644 lib/geins/queries/mutations/cart-add.ts
create mode 100644 lib/geins/queries/mutations/cart-line-update.ts
create mode 100644 lib/geins/queries/mutations/checkout.ts
create mode 100644 lib/geins/queries/queries/cart-create.ts
create mode 100644 lib/geins/queries/queries/cart-get.ts
create mode 100644 lib/geins/queries/queries/categories.ts
create mode 100644 lib/geins/queries/queries/listPageInfo.ts
create mode 100644 lib/geins/queries/queries/product.ts
create mode 100644 lib/geins/queries/queries/products-related.ts
create mode 100644 lib/geins/queries/queries/products.ts
create mode 100644 lib/geins/reshape.ts
create mode 100644 lib/geins/types.ts
delete mode 100644 lib/shopify/fragments/cart.ts
delete mode 100644 lib/shopify/fragments/image.ts
delete mode 100644 lib/shopify/fragments/product.ts
delete mode 100644 lib/shopify/fragments/seo.ts
delete mode 100644 lib/shopify/index.ts
delete mode 100644 lib/shopify/mutations/cart.ts
delete mode 100644 lib/shopify/queries/cart.ts
delete mode 100644 lib/shopify/queries/collection.ts
delete mode 100644 lib/shopify/queries/menu.ts
delete mode 100644 lib/shopify/queries/page.ts
delete mode 100644 lib/shopify/queries/product.ts
delete mode 100644 lib/shopify/types.ts
create mode 100644 repopack-output.txt
create mode 100644 yarn.lock
diff --git a/.env.example b/.env.example
index 9ff0463db..8d5d70b69 100644
--- a/.env.example
+++ b/.env.example
@@ -1,7 +1,15 @@
-COMPANY_NAME="Vercel Inc."
-TWITTER_CREATOR="@vercel"
-TWITTER_SITE="https://nextjs.org/commerce"
-SITE_NAME="Next.js Commerce"
-SHOPIFY_REVALIDATION_SECRET=""
-SHOPIFY_STOREFRONT_ACCESS_TOKEN=""
-SHOPIFY_STORE_DOMAIN="[your-shopify-store-subdomain].myshopify.com"
+COMPANY_NAME= # Company name for eg. Geins
+SITE_NAME= # Site name for eg. Geins Store
+GEINS_API_KEY= # API key from Geins for eg. XXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXX
+GEINS_ACCOUNT_NAME= # Account name from geins for eg. acme
+GEINS_CHANNEL= # Channel Id from Geins for eg. 1
+GEINS_TLD= # Top-level domain for eg. com
+GEINS_LOCALE= # Locale for eg. en-US
+GEINS_MARKET= # Market for eg. us
+GEINS_ENVIRONMENT= # Environment for eg. qa, prod
+GEINS_PRODUCT_DESCRIPTION_SHORT_TEXT= # Property for Product description from Geins for eg. text1, text2, text3 default is text2
+GEINS_CURRENCY_CODE= # Currency code for eg. USD
+GEINS_PAYMENT_ID= # Payment ID from Geins for desired checkout for eg. 23
+GEINS_USE_CATEGORY_FOR_RECOMMENDATIONS_BACKUP= # Use category for recommendations backup on PDP true/false defalut is true
+GEINS_SKU_DEFAULT_VARIATION= # Default variation for SKU for eg. Size
+GEINS_REVALIDATION_SECRET= # Revalidation secret from your Geins webhook for eg. XYZ123-123-123
\ No newline at end of file
diff --git a/README.md b/README.md
index 6fcd72685..89cda3633 100644
--- a/README.md
+++ b/README.md
@@ -1,73 +1,72 @@
-[](https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2Fvercel%2Fcommerce&project-name=commerce&repo-name=commerce&demo-title=Next.js%20Commerce&demo-url=https%3A%2F%2Fdemo.vercel.store&demo-image=https%3A%2F%2Fbigcommerce-demo-asset-ksvtgfvnd.vercel.app%2Fbigcommerce.png&env=COMPANY_NAME,SHOPIFY_REVALIDATION_SECRET,SHOPIFY_STORE_DOMAIN,SHOPIFY_STOREFRONT_ACCESS_TOKEN,SITE_NAME,TWITTER_CREATOR,TWITTER_SITE)
+[](https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2Fgeins-io%2Fvercel-nextjs-commerce&env=GEINS_API_KEY,GEINS_ACCOUNT_NAME,GEINS_CHANNEL,GEINS_TLD,GEINS_LOCALE,GEINS_MARKET,GEINS_IMAGE_URL,GEINS_CURRENCY_CODE,GEINS_CHECKOUT_ID&envDescription=Read%20more%20about%20environment%20varibles%20in%20the%20example%20file&envLink=https%3A%2F%2Fgithub.com%2Fgeins-io%2Fvercel-nextjs-commerce%2Fblob%2Fmain%2F.env.example&project-name=geins-nextjs-commerce-starter&repository-name=geins-nextjs-commerce-starter&demo-title=Geins%20Next.js%20Commerce%20Starter&demo-description=Commerce%20website%20created%20with%20Next.js&demo-url=http%3A%2F%2Fgeins.io&demo-image=avatars.githubusercontent.com%2Fu%2F123540473)
-# Next.js Commerce
+# Next.js Commerce x Geins
-A high-performance, server-rendered Next.js App Router ecommerce application.
+A high-performance, server-rendered Next.js (15 RC) App Router ecommerce application.
-This template uses React Server Components, Server Actions, `Suspense`, `useOptimistic`, and more.
+This template showcases the integration of [Geins Commerce API](https://docs.geins.io) with [Next.js Commerce](https://github.com/vercel/commerce), leveraging the open-source [Geins SDK](https://github.com/geins-io/geins).
-
+## Features
-> Note: Looking for Next.js Commerce v1? View the [code](https://github.com/vercel/commerce/tree/v1), [demo](https://commerce-v1.vercel.store), and [release notes](https://github.com/vercel/commerce/releases/tag/v1).
+- **React Server Components**: Build fast and scalable UIs with Next.js's server-first approach.
+- **Server Actions**: Simplify backend logic and data fetching.
+- **Modern React APIs**: Including `Suspense` and `useOptimistic`.
+- **Integration with Geins**: Harness the power of Geins for exceptional ecommerce capabilities.
-## Providers
+## What is Geins?
-Vercel will only be actively maintaining a Shopify version [as outlined in our vision and strategy for Next.js Commerce](https://github.com/vercel/commerce/pull/966).
+[Geins](https://geins.io/) is the ultimate toolkit for modern commerce. With Geins, developers and agencies can craft unique, tailored shopping experiences using:
-Vercel is happy to partner and work with any commerce provider to help them get a similar template up and running and listed below. Alternative providers should be able to fork this repository and swap out the `lib/shopify` file with their own implementation while leaving the rest of the template mostly unchanged.
+- A hybrid model combining the reliability of a managed platform with open-source flexibility.
+- A robust API-first approach enabling precise customization.
+- Features for managing channels, content, CRM, events, and more.
-- Shopify (this repository)
-- [BigCommerce](https://github.com/bigcommerce/nextjs-commerce) ([Demo](https://next-commerce-v2.vercel.app/))
-- [Ecwid by Lightspeed](https://github.com/Ecwid/ecwid-nextjs-commerce/) ([Demo](https://ecwid-nextjs-commerce.vercel.app/))
-- [Medusa](https://github.com/medusajs/vercel-commerce) ([Demo](https://medusa-nextjs-commerce.vercel.app/))
-- [Saleor](https://github.com/saleor/nextjs-commerce) ([Demo](https://saleor-commerce.vercel.app/))
-- [Shopware](https://github.com/shopwareLabs/vercel-commerce) ([Demo](https://shopware-vercel-commerce-react.vercel.app/))
-- [Swell](https://github.com/swellstores/verswell-commerce) ([Demo](https://verswell-commerce.vercel.app/))
-- [Umbraco](https://github.com/umbraco/Umbraco.VercelCommerce.Demo) ([Demo](https://vercel-commerce-demo.umbraco.com/))
-- [Wix](https://github.com/wix/nextjs-commerce) ([Demo](https://wix-nextjs-commerce.vercel.app/))
-- [Fourthwall](https://github.com/FourthwallHQ/vercel-commerce) ([Demo](https://vercel-storefront.fourthwall.app/))
+Explore the [Geins Commerce API documentation](https://docs.geins.io) for detailed usage instructions and capabilities.
-> Note: Providers, if you are looking to use similar products for your demo, you can [download these assets](https://drive.google.com/file/d/1q_bKerjrwZgHwCw0ovfUMW6He9VtepO_/view?usp=sharing).
+## Getting Started
-## Integrations
+To run this application locally, follow these steps:
-Integrations enable upgraded or additional functionality for Next.js Commerce
+### Prerequisites
-- [Orama](https://github.com/oramasearch/nextjs-commerce) ([Demo](https://vercel-commerce.oramasearch.com/))
+Ensure you have the following installed:
- - Upgrades search to include typeahead with dynamic re-rendering, vector-based similarity search, and JS-based configuration.
- - Search runs entirely in the browser for smaller catalogs or on a CDN for larger.
+- [Node.js](https://nodejs.org/) (v20 or later)
+- [Geins API-Key](https://geins.io/)
-- [React Bricks](https://github.com/ReactBricks/nextjs-commerce-rb) ([Demo](https://nextjs-commerce.reactbricks.com/))
- - Edit pages, product details, and footer content visually using [React Bricks](https://www.reactbricks.com) visual headless CMS.
+### Environment Variables
-## Running locally
+Set up your environment variables as defined in `.env.example`. It's recommended to use [Vercel's Environment Variables](https://vercel.com/docs/concepts/projects/environment-variables) for secure storage.
-You will need to use the environment variables [defined in `.env.example`](.env.example) to run Next.js Commerce. It's recommended you use [Vercel Environment Variables](https://vercel.com/docs/concepts/projects/environment-variables) for this, but a `.env` file is all that is necessary.
+> ⚠️ **Important**: Never commit your `.env` file to version control.
-> Note: You should not commit your `.env` file or it will expose secrets that will allow others to control your Shopify store.
+### Steps to Run Locally
-1. Install Vercel CLI: `npm i -g vercel`
-2. Link local instance with Vercel and GitHub accounts (creates `.vercel` directory): `vercel link`
-3. Download your environment variables: `vercel env pull`
+1. Clone this repository:
-```bash
-pnpm install
-pnpm dev
-```
+ ```bash
+ git clone https://github.com/geins-io/vercel-nextjs-commerce.git
+ cd
+ ```
-Your app should now be running on [localhost:3000](http://localhost:3000/).
+2. Install dependencies:
-
- Expand if you work at Vercel and want to run locally and / or contribute
+ ```bash
+ pnpm install
+ ```
-1. Run `vc link`.
-1. Select the `Vercel Solutions` scope.
-1. Connect to the existing `commerce-shopify` project.
-1. Run `vc env pull` to get environment variables.
-1. Run `pnpm dev` to ensure everything is working correctly.
-
+3. Link your local instance with Vercel and pull environment variables:
-## Vercel, Next.js Commerce, and Shopify Integration Guide
+ ```bash
+ npm i -g vercel
+ vercel link
+ vercel env pull
+ ```
-You can use this comprehensive [integration guide](https://vercel.com/docs/integrations/ecommerce/shopify) with step-by-step instructions on how to configure Shopify as a headless CMS using Next.js Commerce as your headless Shopify storefront on Vercel.
+4. Start the development server:
+
+ ```bash
+ pnpm dev
+ ```
+
+5. Access the app on [http://localhost:3000](http://localhost:3000).
diff --git a/app/[page]/opengraph-image.tsx b/app/[page]/opengraph-image.tsx
index 2fd59281e..70e9a057e 100644
--- a/app/[page]/opengraph-image.tsx
+++ b/app/[page]/opengraph-image.tsx
@@ -1,5 +1,5 @@
import OpengraphImage from 'components/opengraph-image';
-import { getPage } from 'lib/shopify';
+import { getPage } from 'lib/geins';
export const runtime = 'edge';
diff --git a/app/[page]/page.tsx b/app/[page]/page.tsx
index aa0c15603..7a2ef51ab 100644
--- a/app/[page]/page.tsx
+++ b/app/[page]/page.tsx
@@ -1,7 +1,6 @@
-import type { Metadata } from 'next';
-
import Prose from 'components/prose';
-import { getPage } from 'lib/shopify';
+import { getPage } from 'lib/geins';
+import type { Metadata } from 'next';
import { notFound } from 'next/navigation';
export async function generateMetadata(props: {
@@ -33,6 +32,7 @@ export default async function Page(props: { params: Promise<{ page: string }> })
<>
{page.title}
+
{`This document was last updated on ${new Intl.DateTimeFormat(undefined, {
year: 'numeric',
diff --git a/app/api/revalidate/route.ts b/app/api/revalidate/route.ts
index 4ecc0b45d..275bac9e1 100644
--- a/app/api/revalidate/route.ts
+++ b/app/api/revalidate/route.ts
@@ -1,4 +1,4 @@
-import { revalidate } from 'lib/shopify';
+import { revalidate } from 'lib/geins';
import { NextRequest, NextResponse } from 'next/server';
export async function POST(req: NextRequest): Promise {
diff --git a/app/layout.tsx b/app/layout.tsx
index 348adcecb..d71d08115 100644
--- a/app/layout.tsx
+++ b/app/layout.tsx
@@ -2,7 +2,7 @@ import { CartProvider } from 'components/cart/cart-context';
import { Navbar } from 'components/layout/navbar';
import { WelcomeToast } from 'components/welcome-toast';
import { GeistSans } from 'geist/font/sans';
-import { getCart } from 'lib/shopify';
+import { getCart } from 'lib/geins';
import { ensureStartsWith } from 'lib/utils';
import { cookies } from 'next/headers';
import { ReactNode } from 'react';
diff --git a/app/product/[handle]/page.tsx b/app/product/[handle]/page.tsx
index 295b8b005..6d04987f9 100644
--- a/app/product/[handle]/page.tsx
+++ b/app/product/[handle]/page.tsx
@@ -7,8 +7,8 @@ import { Gallery } from 'components/product/gallery';
import { ProductProvider } from 'components/product/product-context';
import { ProductDescription } from 'components/product/product-description';
import { HIDDEN_PRODUCT_TAG } from 'lib/constants';
-import { getProduct, getProductRecommendations } from 'lib/shopify';
-import { Image } from 'lib/shopify/types';
+import { getProduct, getProductRecommendations } from 'lib/geins';
+import { ProductImageType, ProductType } from 'lib/geins/types';
import Link from 'next/link';
import { Suspense } from 'react';
@@ -89,7 +89,7 @@ export default async function ProductPage(props: { params: Promise<{ handle: str
}
>
({
+ images={product.images.slice(0, 5).map((image: ProductImageType) => ({
src: image.url,
altText: image.altText
}))}
@@ -103,15 +103,15 @@ export default async function ProductPage(props: { params: Promise<{ handle: str
-
+
);
}
-async function RelatedProducts({ id }: { id: string }) {
- const relatedProducts = await getProductRecommendations(id);
+async function RelatedProducts({ product }: { product: ProductType }) {
+ const relatedProducts = await getProductRecommendations(product);
if (!relatedProducts.length) return null;
diff --git a/app/search/[collection]/opengraph-image.tsx b/app/search/[collection]/opengraph-image.tsx
index 9eb9c47f7..80bdaad63 100644
--- a/app/search/[collection]/opengraph-image.tsx
+++ b/app/search/[collection]/opengraph-image.tsx
@@ -1,5 +1,5 @@
import OpengraphImage from 'components/opengraph-image';
-import { getCollection } from 'lib/shopify';
+import { getCollection } from 'lib/geins';
export const runtime = 'edge';
diff --git a/app/search/[collection]/page.tsx b/app/search/[collection]/page.tsx
index dfb07e3c0..dae6b2cbf 100644
--- a/app/search/[collection]/page.tsx
+++ b/app/search/[collection]/page.tsx
@@ -1,4 +1,4 @@
-import { getCollection, getCollectionProducts } from 'lib/shopify';
+import { getCollection, getCollectionProducts } from 'lib/geins';
import { Metadata } from 'next';
import { notFound } from 'next/navigation';
@@ -11,7 +11,6 @@ export async function generateMetadata(props: {
}): Promise {
const params = await props.params;
const collection = await getCollection(params.collection);
-
if (!collection) return notFound();
return {
@@ -29,6 +28,7 @@ export default async function CategoryPage(props: {
const params = await props.params;
const { sort } = searchParams as { [key: string]: string };
const { sortKey, reverse } = sorting.find((item) => item.slug === sort) || defaultSort;
+
const products = await getCollectionProducts({ collection: params.collection, sortKey, reverse });
return (
diff --git a/app/search/page.tsx b/app/search/page.tsx
index dce5f0556..76e2fc08f 100644
--- a/app/search/page.tsx
+++ b/app/search/page.tsx
@@ -1,7 +1,7 @@
import Grid from 'components/grid';
import ProductGridItems from 'components/layout/product-grid-items';
import { defaultSort, sorting } from 'lib/constants';
-import { getProducts } from 'lib/shopify';
+import { getProducts } from 'lib/geins';
export const metadata = {
title: 'Search',
diff --git a/app/sitemap.ts b/app/sitemap.ts
index 8f31ee94f..f41a74d58 100644
--- a/app/sitemap.ts
+++ b/app/sitemap.ts
@@ -1,5 +1,4 @@
-import { getCollections, getPages, getProducts } from 'lib/shopify';
-import { validateEnvironmentVariables } from 'lib/utils';
+import { getCollections, getPages, getProducts } from 'lib/geins';
import { MetadataRoute } from 'next';
type Route = {
@@ -14,7 +13,7 @@ const baseUrl = process.env.NEXT_PUBLIC_VERCEL_URL
export const dynamic = 'force-dynamic';
export default async function sitemap(): Promise {
- validateEnvironmentVariables();
+ // validateEnvironmentVariables();
const routesMap = [''].map((route) => ({
url: `${baseUrl}${route}`,
@@ -24,21 +23,21 @@ export default async function sitemap(): Promise {
const collectionsPromise = getCollections().then((collections) =>
collections.map((collection) => ({
url: `${baseUrl}${collection.path}`,
- lastModified: collection.updatedAt
+ lastModified: collection.updatedAt ?? new Date().toISOString()
}))
);
const productsPromise = getProducts({}).then((products) =>
products.map((product) => ({
url: `${baseUrl}/product/${product.handle}`,
- lastModified: product.updatedAt
+ lastModified: product.updatedAt ?? new Date().toISOString()
}))
);
const pagesPromise = getPages().then((pages) =>
pages.map((page) => ({
url: `${baseUrl}/${page.handle}`,
- lastModified: page.updatedAt
+ lastModified: page.updatedAt ?? new Date().toISOString()
}))
);
diff --git a/components/carousel.tsx b/components/carousel.tsx
index 751cf4b48..5cc31a38c 100644
--- a/components/carousel.tsx
+++ b/components/carousel.tsx
@@ -1,4 +1,4 @@
-import { getCollectionProducts } from 'lib/shopify';
+import { getCollectionProducts } from 'lib/geins';
import Link from 'next/link';
import { GridTileImage } from './grid/tile';
@@ -27,7 +27,7 @@ export async function Carousel() {
amount: product.priceRange.maxVariantPrice.amount,
currencyCode: product.priceRange.maxVariantPrice.currencyCode
}}
- src={product.featuredImage?.url}
+ src={product.featuredImage?.url || ''}
fill
sizes="(min-width: 1024px) 25vw, (min-width: 768px) 33vw, 50vw"
/>
diff --git a/components/cart/actions.ts b/components/cart/actions.ts
index 1649c34cb..b71011b2b 100644
--- a/components/cart/actions.ts
+++ b/components/cart/actions.ts
@@ -1,14 +1,14 @@
'use server';
import { TAGS } from 'lib/constants';
-import { addToCart, createCart, getCart, removeFromCart, updateCart } from 'lib/shopify';
+import { addToCart, createCart, getCart, removeFromCart, updateCart } from 'lib/geins';
+
import { revalidateTag } from 'next/cache';
import { cookies } from 'next/headers';
import { redirect } from 'next/navigation';
export async function addItem(prevState: any, selectedVariantId: string | undefined) {
let cartId = (await cookies()).get('cartId')?.value;
-
if (!cartId || !selectedVariantId) {
return 'Error adding item to cart';
}
diff --git a/components/cart/add-to-cart.tsx b/components/cart/add-to-cart.tsx
index dc7ca596b..e808fe381 100644
--- a/components/cart/add-to-cart.tsx
+++ b/components/cart/add-to-cart.tsx
@@ -4,7 +4,7 @@ import { PlusIcon } from '@heroicons/react/24/outline';
import clsx from 'clsx';
import { addItem } from 'components/cart/actions';
import { useProduct } from 'components/product/product-context';
-import { Product, ProductVariant } from 'lib/shopify/types';
+import { ProductType, ProductVariantType } from 'lib/geins/types';
import { useActionState } from 'react';
import { useCart } from './cart-context';
@@ -27,7 +27,6 @@ function SubmitButton({
);
}
- console.log(selectedVariantId);
if (!selectedVariantId) {
return (
+ const variant = variants.find((variant: ProductVariantType) =>
variant.selectedOptions.every((option) => option.value === state[option.name.toLowerCase()])
);
const defaultVariantId = variants.length === 1 ? variants[0]?.id : undefined;
const selectedVariantId = variant?.id || defaultVariantId;
const actionWithVariant = formAction.bind(null, selectedVariantId);
const finalVariant = variants.find((variant) => variant.id === selectedVariantId)!;
-
return (
- View the source
+ View the source
-
- Created by ▲ Vercel
+
+ Powered by
diff --git a/components/layout/navbar/index.tsx b/components/layout/navbar/index.tsx
index 6c7f3dead..d3d2118f1 100644
--- a/components/layout/navbar/index.tsx
+++ b/components/layout/navbar/index.tsx
@@ -1,7 +1,7 @@
import CartModal from 'components/cart/modal';
import LogoSquare from 'components/logo-square';
-import { getMenu } from 'lib/shopify';
-import { Menu } from 'lib/shopify/types';
+import { getMenu } from 'lib/geins';
+import { MenuItemType } from 'lib/geins/types';
import Link from 'next/link';
import { Suspense } from 'react';
import MobileMenu from './mobile-menu';
@@ -33,7 +33,7 @@ export async function Navbar() {
{menu.length ? (
- {menu.map((item: Menu) => (
+ {menu.map((item: MenuItemType) => (
{menu.length ? (
- {menu.map((item: Menu) => (
+ {menu.map((item: MenuItemType) => (
{products.map((product) => (
diff --git a/components/layout/search/collections.tsx b/components/layout/search/collections.tsx
index c45833a39..b65d0114e 100644
--- a/components/layout/search/collections.tsx
+++ b/components/layout/search/collections.tsx
@@ -1,7 +1,7 @@
import clsx from 'clsx';
import { Suspense } from 'react';
-import { getCollections } from 'lib/shopify';
+import { getCollections } from 'lib/geins';
import FilterList from './filter';
async function CollectionList() {
diff --git a/components/price.tsx b/components/price.tsx
index e7090148d..c2010a251 100644
--- a/components/price.tsx
+++ b/components/price.tsx
@@ -1,5 +1,5 @@
import clsx from 'clsx';
-
+const locale = process.env.GEINS_LOCALE || 'en-US';
const Price = ({
amount,
className,
@@ -12,7 +12,7 @@ const Price = ({
currencyCodeClassName?: string;
} & React.ComponentProps<'p'>) => (
- {`${new Intl.NumberFormat(undefined, {
+ {`${new Intl.NumberFormat(locale, {
style: 'currency',
currency: currencyCode,
currencyDisplay: 'narrowSymbol'
diff --git a/components/product/product-description.tsx b/components/product/product-description.tsx
index 427916a84..45c9c0cae 100644
--- a/components/product/product-description.tsx
+++ b/components/product/product-description.tsx
@@ -1,10 +1,10 @@
import { AddToCart } from 'components/cart/add-to-cart';
import Price from 'components/price';
import Prose from 'components/prose';
-import { Product } from 'lib/shopify/types';
+import { ProductType } from 'lib/geins/types';
import { VariantSelector } from './variant-selector';
-export function ProductDescription({ product }: { product: Product }) {
+export function ProductDescription({ product }: { product: ProductType }) {
return (
<>
diff --git a/components/product/variant-selector.tsx b/components/product/variant-selector.tsx
index e4b1dd0c5..52489120b 100644
--- a/components/product/variant-selector.tsx
+++ b/components/product/variant-selector.tsx
@@ -2,7 +2,7 @@
import clsx from 'clsx';
import { useProduct, useUpdateURL } from 'components/product/product-context';
-import { ProductOption, ProductVariant } from 'lib/shopify/types';
+import { ProductOptionType, ProductVariantType } from 'lib/geins/types';
type Combination = {
id: string;
@@ -14,8 +14,8 @@ export function VariantSelector({
options,
variants
}: {
- options: ProductOption[];
- variants: ProductVariant[];
+ options: ProductOptionType[];
+ variants: ProductVariantType[];
}) {
const { state, updateOption } = useProduct();
const updateURL = useUpdateURL();
diff --git a/components/prose.tsx b/components/prose.tsx
index 0cf460f8b..1f53c799a 100644
--- a/components/prose.tsx
+++ b/components/prose.tsx
@@ -3,6 +3,7 @@ import clsx from 'clsx';
const Prose = ({ html, className }: { html: string; className?: string }) => {
return (
- This is a high-performance, SSR storefront powered by Shopify, Next.js, and Vercel.{' '}
+ This is a high-performance, SSR storefront powered by Geins, Next.js, and Vercel.{' '}
=> {
+ const geinsCMS = new GeinsCMS(geinsCore);
+ const menu = await geinsCMS.menu.get({ menuLocationId: locationId }).then((result) => {
+ return result as GeinsMenuType;
+ });
+
+ return reshapeMenu(menu, locationId);
+};
+
+export const getPage = async (geinsCore: GeinsCore, alias: string) => {
+ const geinsCMS = new GeinsCMS(geinsCore);
+ const data = await geinsCMS.page.get({ alias }).then((result) => {
+ return result;
+ });
+
+ return reshapePage(data, alias);
+};
diff --git a/lib/geins/constants.ts b/lib/geins/constants.ts
new file mode 100644
index 000000000..a1f0d1700
--- /dev/null
+++ b/lib/geins/constants.ts
@@ -0,0 +1,9 @@
+export const USE_CATEGORY_FOR_RECOMMENDATIONS_BACKUP =
+ process.env.GEINS_USE_CATEGORY_FOR_RECOMMENDATIONS_BACKUP || true;
+export const IMAGE_URL =
+ process.env.GEINS_IMAGE_URL || `https://${process.env.GEINS_ACCOUNT_NAME}.commerce.services`;
+export const DEFAULT_SKU_VARIATION = process.env.GEINS_SKU_DEFAULT_VARIATION || 'Size';
+export const CURRENCY_CODE = process.env.GEINS_CURRENCY_CODE || 'USD';
+export const PAYMENT_ID = parseInt(process.env.GEINS_PAYMENT_ID ?? '0');
+export const SHORT_DESCRIPTION = process.env.GEINS_PRODUCT_DESCRIPTION_SHORT_TEXT || 'text2';
+export const LONG_DESCRIPTION = process.env.GEINS_PRODUCT_DESCRIPTION_LONG_TEXT || 'text1';
diff --git a/lib/geins/index.ts b/lib/geins/index.ts
new file mode 100644
index 000000000..37f545064
--- /dev/null
+++ b/lib/geins/index.ts
@@ -0,0 +1,214 @@
+import { GeinsCore, GeinsSettings } from '@geins/core';
+import { TAGS } from 'lib/constants';
+import { revalidateTag } from 'next/cache';
+import { cookies, headers } from 'next/headers';
+import { NextRequest, NextResponse } from 'next/server';
+import * as cms from './cms';
+import * as oms from './oms';
+import * as pim from './pim';
+import { CartItemInputType, CartType, MenuItemType, PageType, ProductType } from './types';
+
+const geinsSettings: GeinsSettings = {
+ apiKey: process.env.GEINS_API_KEY || '',
+ accountName: process.env.GEINS_ACCOUNT_NAME || '',
+ channel: process.env.GEINS_CHANNEL || '',
+ tld: process.env.GEINS_TLD || '',
+ locale: process.env.GEINS_LOCALE || '',
+ market: process.env.GEINS_MARKET || '',
+ environment: 'qa'
+};
+const geinsCore = new GeinsCore(geinsSettings);
+
+/*
+ COLLECTIONS / CATEFORIES
+*/
+export const getCollections = async (parentNodeId: number = 0) => {
+ const data = await pim.getCategories(geinsCore, parentNodeId);
+ data.forEach((item) => {
+ item.path = `/search/${item.slug}`;
+ });
+ return data;
+};
+
+export const getCollection = async (slug: string): Promise => {
+ return pim.getCategoryMetadata(geinsCore, slug);
+};
+
+/*
+ PRODUCT LISTS
+*/
+export async function getProducts({
+ query,
+ reverse,
+ sortKey
+}: {
+ query?: string;
+ reverse?: boolean;
+ sortKey?: string;
+}): Promise {
+ return await pim.getProducts(geinsCore, { query: query, reverse, sortKey });
+}
+
+export async function getCollectionProducts({
+ collection,
+ reverse,
+ sortKey
+}: {
+ collection: string;
+ reverse?: boolean;
+ sortKey?: string;
+}): Promise {
+ let category = collection;
+ if (collection === 'hidden-homepage-featured-items') {
+ category = 'start';
+ } else if (collection === 'hidden-homepage-carousel') {
+ category = 'carousel-on-start';
+ }
+
+ return await pim.getCategoryProducts(geinsCore, { category, reverse, sortKey });
+}
+
+/*
+ PRODUCT
+*/
+export const getProduct = async (slug: string) => {
+ return pim.getProduct(geinsCore, slug);
+};
+
+export async function getProductRecommendations(product: ProductType): Promise {
+ return pim.getProductRecommendations(geinsCore, product);
+}
+
+/*
+ CMS
+*/
+export const getMenu = async (id: string): Promise => {
+ let menuId = '';
+ if (id === 'next-js-frontend-footer-menu') {
+ menuId = 'footer-first';
+ } else if (id === 'next-js-frontend-header-menu') {
+ menuId = 'main-desktop';
+ }
+ const data: MenuItemType[] = await cms.getMenu(geinsCore, menuId);
+ return data.filter((item) => item.title !== '');
+};
+
+export async function getPages(): Promise {
+ return [] as PageType[];
+}
+
+export async function getPage(handle: string): Promise {
+ if (handle === 'checkout') {
+ let cartId = (await cookies()).get('cartId')?.value;
+ if (!cartId) {
+ return {} as PageType;
+ }
+ return oms.getCheckoutPage(geinsCore, cartId);
+ }
+ return cms.getPage(geinsCore, handle);
+}
+
+/*
+ CART
+*/
+export async function createCart(): Promise {
+ return await oms.createCart(geinsCore);
+}
+
+export async function getCart(cartId: string | undefined): Promise {
+ if (!cartId) {
+ return undefined;
+ }
+ return await oms.getCart(geinsCore, cartId);
+}
+
+export async function addToCart(
+ cartId: string,
+ lines: { merchandiseId: string; quantity: number }[]
+): Promise {
+ if (!cartId) {
+ return undefined;
+ }
+
+ const items = lines.map((item) => {
+ return {
+ skuId: parseInt(item.merchandiseId),
+ quantity: item.quantity
+ };
+ });
+
+ let cart = {} as CartType;
+ for (let i = 0; i < items.length; i++) {
+ cart = await oms.addToCart(geinsCore, cartId, items[i] as CartItemInputType);
+ }
+ return cart;
+}
+
+export async function updateCart(
+ cartId: string,
+ lines: { id: string; merchandiseId: string; quantity: number }[]
+): Promise {
+ if (!cartId) {
+ return undefined;
+ }
+
+ // create geins item to add from lines
+ const items = lines.map((item) => {
+ return {
+ id: item.id,
+ quantity: item.quantity
+ };
+ });
+ let cart = {} as CartType;
+ for (let i = 0; i < items.length; i++) {
+ cart = await oms.updateCart(geinsCore, cartId, items[i] as CartItemInputType);
+ }
+ return cart;
+}
+
+export async function removeFromCart(
+ cartId: string,
+ lineIds: string[]
+): Promise {
+ if (!cartId) {
+ return undefined;
+ }
+
+ let cart = {} as CartType;
+ for (let i = 0; i < lineIds.length; i++) {
+ cart = await oms.removeFromCart(geinsCore, cartId, lineIds[i] as string);
+ }
+ return cart;
+}
+
+// This is called from `app/api/revalidate.ts` so providers can control revalidation logic.
+export async function revalidate(req: NextRequest): Promise {
+ // We always need to respond with a 200 status code to Geins,
+ // otherwise it will continue to retry the request.
+ const collectionWebhooks = ['collections/create', 'collections/delete', 'collections/update'];
+ const productWebhooks = ['products/create', 'products/delete', 'products/update'];
+ const topic = (await headers()).get('x-geins-topic') || 'unknown';
+ const secret = req.nextUrl.searchParams.get('secret');
+ const isCollectionUpdate = collectionWebhooks.includes(topic);
+ const isProductUpdate = productWebhooks.includes(topic);
+
+ if (!secret || secret !== process.env.GEINS_REVALIDATION_SECRET) {
+ console.error('Invalid revalidation secret.');
+ return NextResponse.json({ status: 401 });
+ }
+
+ if (!isCollectionUpdate && !isProductUpdate) {
+ // We don't need to revalidate anything for any other topics.
+ return NextResponse.json({ status: 200 });
+ }
+
+ if (isCollectionUpdate) {
+ revalidateTag(TAGS.collections);
+ }
+
+ if (isProductUpdate) {
+ revalidateTag(TAGS.products);
+ }
+
+ return NextResponse.json({ status: 200, revalidated: true, now: Date.now() });
+}
diff --git a/lib/geins/oms.ts b/lib/geins/oms.ts
new file mode 100644
index 000000000..0b5474c11
--- /dev/null
+++ b/lib/geins/oms.ts
@@ -0,0 +1,102 @@
+'use server';
+
+import { GeinsCore } from '@geins/core';
+import { PAYMENT_ID } from './constants';
+import { cartAddMutation } from './queries/mutations/cart-add';
+import { cartUpdateMutation } from './queries/mutations/cart-line-update';
+import { checkoutMutation } from './queries/mutations/checkout';
+import { cartCreateQuery } from './queries/queries/cart-create';
+import { cartGetQuery } from './queries/queries/cart-get';
+import { reshapeCart, reshapeCheckout } from './reshape';
+import { CartItemInputType, PageType } from './types';
+
+export const createCart = async (geinsCore: GeinsCore): Promise => {
+ const data = await geinsCore.graphql.query({
+ queryAsString: cartCreateQuery,
+ variables: {},
+ requestOptions: { fetchPolicy: 'no-cache' }
+ });
+ if (!data || !data.getCart) {
+ return {};
+ }
+ return reshapeCart(data.getCart);
+};
+
+export const getCart = async (geinsCore: GeinsCore, id: string | undefined): Promise => {
+ const data = await geinsCore.graphql.query({
+ queryAsString: cartGetQuery,
+ variables: { id },
+ requestOptions: { fetchPolicy: 'no-cache' }
+ });
+ if (!data || !data.getCart) {
+ return {};
+ }
+ return reshapeCart(data.getCart);
+};
+
+export const addToCart = async (
+ geinsCore: GeinsCore,
+ id: string,
+ item: CartItemInputType
+): Promise => {
+ const data = await geinsCore.graphql.mutation({
+ queryAsString: cartAddMutation,
+ variables: { id: id, item: item },
+ requestOptions: { fetchPolicy: 'no-cache' }
+ });
+ if (!data || !data.addToCart) {
+ return {};
+ }
+ return reshapeCart(data.addToCart);
+};
+
+export const removeFromCart = async (
+ geinsCore: GeinsCore,
+ id: string,
+ itemId: string
+): Promise => {
+ const item = {
+ id: itemId,
+ quantity: 0
+ };
+ const data = await geinsCore.graphql.mutation({
+ queryAsString: cartUpdateMutation,
+ variables: { id, item },
+ requestOptions: { fetchPolicy: 'no-cache' }
+ });
+ if (!data || !data.updateCartItem) {
+ return {};
+ }
+ return reshapeCart(data.updateCartItem);
+};
+
+export const updateCart = async (
+ geinsCore: GeinsCore,
+ id: string,
+ item: CartItemInputType
+): Promise => {
+ const data = await geinsCore.graphql.mutation({
+ queryAsString: cartUpdateMutation,
+ variables: { id, item },
+ requestOptions: { fetchPolicy: 'no-cache' }
+ });
+ if (!data || !data.updateCartItem) {
+ return {};
+ }
+ return reshapeCart(data.updateCartItem);
+};
+
+export const getCheckoutPage = async (geinsCore: GeinsCore, cartId: string): Promise => {
+ const variables = {
+ cartId: cartId,
+ checkout: {
+ paymentId: PAYMENT_ID
+ }
+ };
+ const data = await geinsCore.graphql.mutation({
+ queryAsString: checkoutMutation,
+ variables,
+ requestOptions: { fetchPolicy: 'no-cache' }
+ });
+ return reshapeCheckout(data);
+};
diff --git a/lib/geins/pim.ts b/lib/geins/pim.ts
new file mode 100644
index 000000000..d21b26645
--- /dev/null
+++ b/lib/geins/pim.ts
@@ -0,0 +1,151 @@
+import { GeinsCore } from '@geins/core';
+import { USE_CATEGORY_FOR_RECOMMENDATIONS_BACKUP } from './constants';
+import { categoriesQuery } from './queries/queries/categories';
+import { listPageInfoQuery } from './queries/queries/listPageInfo';
+import { productQuery } from './queries/queries/product';
+import { productsQuery } from './queries/queries/products';
+import { relatedProductsQuery } from './queries/queries/products-related';
+import {
+ reshapeCategories,
+ reshapeListPageMetadata,
+ reshapeProduct,
+ reshapeProducts,
+ translateSortKey
+} from './reshape';
+import {
+ CategoryItemType,
+ CollectionType,
+ ProductRelationType,
+ ProductRelationTypeEnum,
+ ProductType
+} from './types';
+
+export const getCategoryMetadata = async (
+ geinsCore: GeinsCore,
+ slug: string
+): Promise => {
+ const data = await geinsCore.graphql.query({
+ queryAsString: listPageInfoQuery,
+ variables: { url: slug }
+ });
+ return reshapeListPageMetadata(data);
+};
+
+export const getCategories = async (
+ geinsCore: GeinsCore,
+ parentNodeId?: number
+): Promise => {
+ const variables = {
+ includeHidden: false,
+ parentCategoryId: parentNodeId
+ };
+ const data = await geinsCore.graphql.query({ queryAsString: categoriesQuery, variables });
+ return reshapeCategories(data);
+};
+
+export const getProduct = async (
+ geinsCore: GeinsCore,
+ slug: string
+): Promise => {
+ const variables = {
+ alias: slug
+ };
+ const data = await geinsCore.graphql.query({ queryAsString: productQuery, variables });
+ if (!data.product) {
+ return undefined;
+ }
+ return reshapeProduct(data.product);
+};
+
+export const getProducts = async (
+ geinsCore: GeinsCore,
+ {
+ query,
+ reverse,
+ sortKey
+ }: {
+ query?: string;
+ reverse?: boolean;
+ sortKey?: string;
+ }
+): Promise => {
+ const variables = {
+ filter: {
+ sort: translateSortKey(sortKey || '', reverse || false),
+ includeCollapsed: true,
+ filterMode: 'CURRENT',
+ searchText: query
+ }
+ };
+
+ const data = await geinsCore.graphql.query({ queryAsString: productsQuery, variables });
+ if (!data || !data.products || !data.products.products) {
+ return [];
+ }
+
+ return reshapeProducts(data.products.products);
+};
+
+export const getProductRecommendations = async (
+ geinsCore: GeinsCore,
+ product: ProductType
+): Promise => {
+ const variables = {
+ alias: product.slug
+ };
+
+ const data = await geinsCore.graphql.query({ queryAsString: relatedProductsQuery, variables });
+
+ if (data?.relatedProducts && data.relatedProducts.length > 0) {
+ return reshapeProducts(data.relatedProducts);
+ }
+
+ if (USE_CATEGORY_FOR_RECOMMENDATIONS_BACKUP) {
+ const categoryAlias = product.relations?.filter(
+ (relation: ProductRelationType) => relation.type === ProductRelationTypeEnum.CATEGORY
+ );
+ if (categoryAlias && categoryAlias[0]) {
+ return getCategoryProducts(geinsCore, { category: categoryAlias[0].alias, take: 4 });
+ }
+ }
+
+ return [];
+};
+
+export const getCategoryProducts = async (
+ geinsCore: GeinsCore,
+ {
+ category,
+ reverse,
+ sortKey,
+ take,
+ skip
+ }: {
+ category: string;
+ reverse?: boolean;
+ sortKey?: string;
+ take?: number;
+ skip?: number;
+ }
+): Promise => {
+ const variables = {
+ categoryAlias: category,
+ filter: {
+ sort: translateSortKey(sortKey || '', reverse || false),
+ includeCollapsed: false
+ },
+ ...(take && { take }),
+ ...(skip && { skip })
+ };
+ const data = await geinsCore.graphql.query({
+ queryAsString: productsQuery,
+ variables,
+ requestOptions: { fetchPolicy: 'no-cache' }
+ });
+
+ if (!data || !data.products || !data.products.products) {
+ return [];
+ }
+
+ return reshapeProducts(data.products.products);
+};
diff --git a/lib/geins/queries/fragments/campaign.ts b/lib/geins/queries/fragments/campaign.ts
new file mode 100644
index 000000000..b8d8c94b1
--- /dev/null
+++ b/lib/geins/queries/fragments/campaign.ts
@@ -0,0 +1,7 @@
+const campaignFragment = /* GraphQL */ `
+ fragment Campaign on CampaignRuleType {
+ name
+ hideTitle
+ }
+`;
+export default campaignFragment;
diff --git a/lib/geins/queries/fragments/cart.ts b/lib/geins/queries/fragments/cart.ts
new file mode 100644
index 000000000..19421121c
--- /dev/null
+++ b/lib/geins/queries/fragments/cart.ts
@@ -0,0 +1,107 @@
+import campaignFragment from './campaign';
+import priceFragment from './price';
+import stockFragment from './stock';
+
+const cartFragment = /* GraphQL */ `
+ fragment Cart on CartType {
+ id
+ promoCode
+ appliedCampaigns {
+ ...Campaign
+ }
+ items {
+ id
+ campaign {
+ appliedCampaigns {
+ ...Campaign
+ }
+ prices {
+ price {
+ ...Price
+ }
+ quantity
+ }
+ }
+ unitPrice {
+ ...Price
+ }
+ product {
+ productId
+ articleNumber
+ brand {
+ name
+ }
+ name
+ productImages {
+ fileName
+ }
+ alias
+ canonicalUrl
+ primaryCategory {
+ name
+ }
+ skus {
+ skuId
+ name
+ stock {
+ ...Stock
+ }
+ }
+ unitPrice {
+ ...Price
+ }
+ }
+ quantity
+ skuId
+ totalPrice {
+ ...Price
+ }
+ }
+ summary {
+ fixedAmountDiscountIncVat
+ fixedAmountDiscountExVat
+ balance {
+ pending
+ pendingFormatted
+ totalSellingPriceExBalanceExVat
+ totalSellingPriceExBalanceIncVat
+ totalSellingPriceExBalanceIncVatFormatted
+ }
+ subTotal {
+ regularPriceIncVatFormatted
+ regularPriceExVatFormatted
+ sellingPriceIncVatFormatted
+ sellingPriceExVatFormatted
+ sellingPriceExVat
+ sellingPriceIncVat
+ vat
+ }
+ shipping {
+ amountLeftToFreeShipping
+ amountLeftToFreeShippingFormatted
+ feeExVatFormatted
+ feeIncVatFormatted
+ feeIncVat
+ feeExVat
+ isDefault
+ }
+ total {
+ isDiscounted
+ sellingPriceIncVatFormatted
+ sellingPriceExVatFormatted
+ sellingPriceIncVat
+ sellingPriceExVat
+ discountIncVatFormatted
+ discountExVatFormatted
+ discountExVat
+ discountIncVat
+ vatFormatted
+ vat
+ }
+ }
+ }
+ ${priceFragment}
+ ${stockFragment}
+ ${campaignFragment}
+`;
+export default cartFragment;
diff --git a/lib/geins/queries/fragments/list-info.ts b/lib/geins/queries/fragments/list-info.ts
new file mode 100644
index 000000000..a36c981ef
--- /dev/null
+++ b/lib/geins/queries/fragments/list-info.ts
@@ -0,0 +1,26 @@
+import metaFragment from './meta';
+
+const listInfoFragment = /* GraphQL */ `
+ fragment ListInfo on PageInfoType {
+ id
+ alias
+ canonicalUrl
+ primaryImage
+ name
+ primaryDescription
+ secondaryDescription
+ hideTitle
+ hideDescription
+ logo
+ meta {
+ ...Meta
+ }
+ subCategories {
+ name
+ alias
+ canonicalUrl
+ }
+ }
+ ${metaFragment}
+`;
+export default listInfoFragment;
diff --git a/lib/geins/queries/fragments/list-product.ts b/lib/geins/queries/fragments/list-product.ts
new file mode 100644
index 000000000..6410bcfaf
--- /dev/null
+++ b/lib/geins/queries/fragments/list-product.ts
@@ -0,0 +1,32 @@
+import priceFragment from './price';
+import stockFragment from './stock';
+
+const listProductFragment = /* GraphQL */ `
+ fragment ListProduct on ProductType {
+ brand {
+ name
+ alias
+ }
+ name
+ productId
+ articleNumber
+ alias
+ canonicalUrl
+ unitPrice {
+ ...Price
+ }
+ productImages {
+ fileName
+ }
+ primaryCategory {
+ name
+ alias
+ }
+ totalStock {
+ ...Stock
+ }
+ }
+ ${priceFragment}
+ ${stockFragment}
+`;
+export default listProductFragment;
diff --git a/lib/geins/queries/fragments/meta.ts b/lib/geins/queries/fragments/meta.ts
new file mode 100644
index 000000000..18eb45bb3
--- /dev/null
+++ b/lib/geins/queries/fragments/meta.ts
@@ -0,0 +1,7 @@
+const metaFragment = /* GraphQL */ `
+ fragment Meta on MetadataType {
+ title
+ description
+ }
+`;
+export default metaFragment;
diff --git a/lib/geins/queries/fragments/price.ts b/lib/geins/queries/fragments/price.ts
new file mode 100644
index 000000000..1a758fccc
--- /dev/null
+++ b/lib/geins/queries/fragments/price.ts
@@ -0,0 +1,16 @@
+const priceFragment = /* GraphQL */ `
+ fragment Price on PriceType {
+ isDiscounted
+ regularPriceIncVatFormatted
+ sellingPriceIncVatFormatted
+ regularPriceExVatFormatted
+ sellingPriceExVatFormatted
+ sellingPriceIncVat
+ sellingPriceExVat
+ regularPriceIncVat
+ regularPriceExVat
+ vat
+ discountPercentage
+ }
+`;
+export default priceFragment;
diff --git a/lib/geins/queries/fragments/sku.ts b/lib/geins/queries/fragments/sku.ts
new file mode 100644
index 000000000..2b5fd09f7
--- /dev/null
+++ b/lib/geins/queries/fragments/sku.ts
@@ -0,0 +1,14 @@
+import stockFragment from './stock';
+const skuFragment = /* GraphQL */ `
+ fragment Sku on SkuType {
+ skuId
+ gtin
+ name
+ productId
+ stock {
+ ...Stock
+ }
+ }
+ ${stockFragment}
+`;
+export default skuFragment;
diff --git a/lib/geins/queries/fragments/stock.ts b/lib/geins/queries/fragments/stock.ts
new file mode 100644
index 000000000..9e6060a9a
--- /dev/null
+++ b/lib/geins/queries/fragments/stock.ts
@@ -0,0 +1,10 @@
+const stockFragment = /* GraphQL */ `
+ fragment Stock on StockType {
+ inStock
+ oversellable
+ totalStock
+ static
+ incoming
+ }
+`;
+export default stockFragment;
diff --git a/lib/geins/queries/fragments/variant.ts b/lib/geins/queries/fragments/variant.ts
new file mode 100644
index 000000000..f284449b8
--- /dev/null
+++ b/lib/geins/queries/fragments/variant.ts
@@ -0,0 +1,22 @@
+import stockFragment from './stock';
+const variantFragment = /* GraphQL */ `
+ fragment Variant on VariantType {
+ alias
+ level
+ attributes {
+ key
+ value
+ }
+ label
+ value
+ dimension
+ skuId
+ productId
+ stock {
+ ...Stock
+ }
+ primaryImage
+ }
+ ${stockFragment}
+`;
+export default variantFragment;
diff --git a/lib/geins/queries/mutations/cart-add.ts b/lib/geins/queries/mutations/cart-add.ts
new file mode 100644
index 000000000..8d8a68a29
--- /dev/null
+++ b/lib/geins/queries/mutations/cart-add.ts
@@ -0,0 +1,22 @@
+import cartFragment from '../fragments/cart';
+
+export const cartAddMutation = /* GraphQL */ `
+ mutation addToCart(
+ $id: String!
+ $item: CartItemInputType!
+ $channelId: String
+ $languageId: String
+ $marketId: String
+ ) {
+ addToCart(
+ id: $id
+ item: $item
+ channelId: $channelId
+ languageId: $languageId
+ marketId: $marketId
+ ) {
+ ...Cart
+ }
+ }
+ ${cartFragment}
+`;
diff --git a/lib/geins/queries/mutations/cart-line-update.ts b/lib/geins/queries/mutations/cart-line-update.ts
new file mode 100644
index 000000000..ba842fe16
--- /dev/null
+++ b/lib/geins/queries/mutations/cart-line-update.ts
@@ -0,0 +1,22 @@
+import cartFragment from '../fragments/cart';
+
+export const cartUpdateMutation = /* GraphQL */ `
+ mutation updateCartItem(
+ $id: String!
+ $item: CartItemInputType!
+ $channelId: String
+ $languageId: String
+ $marketId: String
+ ) {
+ updateCartItem(
+ id: $id
+ item: $item
+ channelId: $channelId
+ languageId: $languageId
+ marketId: $marketId
+ ) {
+ ...Cart
+ }
+ }
+ ${cartFragment}
+`;
diff --git a/lib/geins/queries/mutations/checkout.ts b/lib/geins/queries/mutations/checkout.ts
new file mode 100644
index 000000000..5f360c801
--- /dev/null
+++ b/lib/geins/queries/mutations/checkout.ts
@@ -0,0 +1,21 @@
+export const checkoutMutation = /* GraphQL */ `
+ mutation createOrUpdateCheckout(
+ $cartId: String!
+ $checkout: CheckoutInputType
+ $channelId: String
+ $languageId: String
+ $marketId: String
+ ) {
+ createOrUpdateCheckout(
+ cartId: $cartId
+ checkout: $checkout
+ channelId: $channelId
+ languageId: $languageId
+ marketId: $marketId
+ ) {
+ paymentOptions {
+ paymentData
+ }
+ }
+ }
+`;
diff --git a/lib/geins/queries/queries/cart-create.ts b/lib/geins/queries/queries/cart-create.ts
new file mode 100644
index 000000000..28a73e431
--- /dev/null
+++ b/lib/geins/queries/queries/cart-create.ts
@@ -0,0 +1,10 @@
+import cartFragment from '../fragments/cart';
+
+export const cartCreateQuery = /* GraphQL */ `
+ query getCart($channelId: String, $languageId: String, $marketId: String) {
+ getCart(channelId: $channelId, languageId: $languageId, marketId: $marketId) {
+ ...Cart
+ }
+ }
+ ${cartFragment}
+`;
diff --git a/lib/geins/queries/queries/cart-get.ts b/lib/geins/queries/queries/cart-get.ts
new file mode 100644
index 000000000..cdf967380
--- /dev/null
+++ b/lib/geins/queries/queries/cart-get.ts
@@ -0,0 +1,10 @@
+import cartFragment from '../fragments/cart';
+
+export const cartGetQuery = /* GraphQL */ `
+ query getCart($id: String, $channelId: String, $languageId: String, $marketId: String) {
+ getCart(id: $id, channelId: $channelId, languageId: $languageId, marketId: $marketId) {
+ ...Cart
+ }
+ }
+ ${cartFragment}
+`;
diff --git a/lib/geins/queries/queries/categories.ts b/lib/geins/queries/queries/categories.ts
new file mode 100644
index 000000000..8ca149731
--- /dev/null
+++ b/lib/geins/queries/queries/categories.ts
@@ -0,0 +1,22 @@
+export const categoriesQuery = /* GraphQL */ `
+ query categories(
+ $parentCategoryId: Int
+ $channelId: String
+ $languageId: String
+ $marketId: String
+ ) {
+ categories(
+ parentCategoryId: $parentCategoryId
+ channelId: $channelId
+ languageId: $languageId
+ marketId: $marketId
+ ) {
+ alias
+ canonicalUrl
+ name
+ categoryId
+ parentCategoryId
+ order
+ }
+ }
+`;
diff --git a/lib/geins/queries/queries/listPageInfo.ts b/lib/geins/queries/queries/listPageInfo.ts
new file mode 100644
index 000000000..4c1bbe599
--- /dev/null
+++ b/lib/geins/queries/queries/listPageInfo.ts
@@ -0,0 +1,10 @@
+import listInfoFragment from '../fragments/list-info';
+
+export const listPageInfoQuery = /* GraphQL */ `
+ query listPageInfo($url: String!, $channelId: String, $languageId: String, $marketId: String) {
+ listPageInfo(url: $url, channelId: $channelId, languageId: $languageId, marketId: $marketId) {
+ ...ListInfo
+ }
+ }
+ ${listInfoFragment}
+`;
diff --git a/lib/geins/queries/queries/product.ts b/lib/geins/queries/queries/product.ts
new file mode 100644
index 000000000..a2b49c5ea
--- /dev/null
+++ b/lib/geins/queries/queries/product.ts
@@ -0,0 +1,92 @@
+import campaignFragment from '../fragments/campaign';
+import metaFragment from '../fragments/meta';
+import priceFragment from '../fragments/price';
+import skuFragment from '../fragments/sku';
+import stockFragment from '../fragments/stock';
+import variantFragment from '../fragments/variant';
+
+export const productQuery = /* GraphQL */ `
+ query product($alias: String!, $channelId: String, $languageId: String, $marketId: String) {
+ product(alias: $alias, channelId: $channelId, languageId: $languageId, marketId: $marketId) {
+ productId
+ alias
+ articleNumber
+ canonicalUrl
+ name
+ meta {
+ ...Meta
+ }
+ brand {
+ name
+ alias
+ canonicalUrl
+ }
+ productImages {
+ fileName
+ }
+ primaryCategory {
+ name
+ alias
+ canonicalUrl
+ }
+ categories {
+ name
+ alias
+ }
+ unitPrice {
+ ...Price
+ }
+ texts {
+ text1
+ text2
+ text3
+ }
+ parameterGroups {
+ name
+ parameterGroupId
+ parameters {
+ name
+ value
+ show
+ identifier
+ }
+ }
+ skus {
+ ...Sku
+ }
+ totalStock {
+ ...Stock
+ }
+ variantDimensions {
+ dimension
+ value
+ level
+ label
+ }
+ variantGroup {
+ variants {
+ variants {
+ variants {
+ ...Variant
+ }
+ ...Variant
+ }
+ ...Variant
+ }
+ }
+ discountCampaigns {
+ ...Campaign
+ }
+ rating {
+ score
+ voteCount
+ }
+ }
+ }
+ ${priceFragment}
+ ${stockFragment}
+ ${skuFragment}
+ ${variantFragment}
+ ${metaFragment}
+ ${campaignFragment}
+`;
diff --git a/lib/geins/queries/queries/products-related.ts b/lib/geins/queries/queries/products-related.ts
new file mode 100644
index 000000000..b1e9c95bb
--- /dev/null
+++ b/lib/geins/queries/queries/products-related.ts
@@ -0,0 +1,43 @@
+//import relatedProductFragment from './fragments/related-product';
+// ${relatedProductFragment}
+import priceFragment from '../fragments/price';
+import skuFragment from '../fragments/sku';
+
+export const relatedProductsQuery = /* GraphQL */ `
+ query relatedProducts(
+ $alias: String!
+ $channelId: String
+ $languageId: String
+ $marketId: String
+ ) {
+ relatedProducts(
+ alias: $alias
+ channelId: $channelId
+ languageId: $languageId
+ marketId: $marketId
+ ) {
+ alias
+ name
+ canonicalUrl
+ brand {
+ name
+ }
+ unitPrice {
+ ...Price
+ }
+ relationType
+ productImages {
+ fileName
+ }
+ primaryImage
+ primaryCategory {
+ name
+ }
+ skus {
+ ...Sku
+ }
+ }
+ }
+ ${priceFragment}
+ ${skuFragment}
+`;
diff --git a/lib/geins/queries/queries/products.ts b/lib/geins/queries/queries/products.ts
new file mode 100644
index 000000000..a3c9917ca
--- /dev/null
+++ b/lib/geins/queries/queries/products.ts
@@ -0,0 +1,38 @@
+import listProductFragment from '../fragments/list-product';
+
+export const productsQuery = /* GraphQL */ `
+ query products(
+ $skip: Int = null
+ $take: Int = null
+ $categoryAlias: String = null
+ $brandAlias: String = null
+ $discountCampaignAlias: String = null
+ $url: String = null
+ $filter: FilterInputType = null
+ $channelId: String
+ $languageId: String
+ $marketId: String
+ ) {
+ products(
+ skip: $skip
+ take: $take
+ categoryAlias: $categoryAlias
+ brandAlias: $brandAlias
+ discountCampaignAlias: $discountCampaignAlias
+ url: $url
+ filter: $filter
+ channelId: $channelId
+ languageId: $languageId
+ marketId: $marketId
+ ) {
+ products {
+ brand {
+ name
+ }
+ ...ListProduct
+ }
+ count
+ }
+ }
+ ${listProductFragment}
+`;
diff --git a/lib/geins/reshape.ts b/lib/geins/reshape.ts
new file mode 100644
index 000000000..d8ef130f1
--- /dev/null
+++ b/lib/geins/reshape.ts
@@ -0,0 +1,439 @@
+import { GeinsMenuType } from '@geins/types';
+import {
+ CURRENCY_CODE,
+ DEFAULT_SKU_VARIATION,
+ IMAGE_URL,
+ LONG_DESCRIPTION,
+ SHORT_DESCRIPTION
+} from './constants';
+import {
+ CartItemType,
+ CartType,
+ CategoryItemType,
+ CollectionType,
+ PageType,
+ ProductImageType,
+ ProductOptionType,
+ ProductRelationType,
+ ProductRelationTypeEnum,
+ ProductType,
+ ProductVariantType
+} from './types';
+
+export const translateSortKey = (sortKey: string, reverse: boolean): string => {
+ switch (sortKey) {
+ case 'BEST_SELLING':
+ return 'MOST_SOLD';
+ case 'CREATED_AT':
+ return 'LATEST';
+ case 'PRICE':
+ if (reverse) {
+ return 'PRICE';
+ }
+ return 'PRICE_DESC';
+ default:
+ return 'RELEVANCE';
+ }
+};
+
+export const reshapeCategories = (geinsCategories: any): CategoryItemType[] => {
+ if (!geinsCategories || !geinsCategories?.categories.length) {
+ return [];
+ }
+
+ return geinsCategories.categories.map((item: any) => ({
+ id: item?.categoryId ?? '',
+ title: item?.name ?? '',
+ name: item?.name ?? '',
+ parentId: item?.parentCategoryId || '',
+ path: item?.canonicalUrl?.split('/').pop() || '',
+ slug: item?.alias ?? ''
+ }));
+};
+
+export const reshapeListPageMetadata = (geinsCategoryMetadata: any): CollectionType => {
+ const rawCategory = geinsCategoryMetadata?.listPageInfo;
+ if (!rawCategory) {
+ return {} as CollectionType;
+ }
+
+ let seoTitle = rawCategory?.meta?.title || rawCategory?.name || '';
+ seoTitle = seoTitle.replace(/\[name\]/g, rawCategory?.name || '');
+
+ const seoDescription = rawCategory?.meta?.description || '';
+ return {
+ id: rawCategory?.id || '',
+ title: rawCategory?.name || '',
+ handle: rawCategory?.alias || '',
+ seo: {
+ title: seoTitle,
+ description: seoDescription
+ },
+ description: rawCategory?.primaryDescription || ''
+ };
+};
+
+export const reshapeProducts = (geinsData: any): ProductType[] => {
+ if (!geinsData) {
+ throw new Error('Invalid products query response');
+ }
+ const rawProducts = geinsData;
+ if (!rawProducts) {
+ return [];
+ }
+ return rawProducts.map((product: any) => reshapeProduct(product));
+};
+
+export const reshapeProduct = (geinsProductData: any): ProductType => {
+ const rawProduct = geinsProductData;
+
+ const tags: string[] = [];
+ const relations: ProductRelationType[] = [];
+ if (rawProduct.primaryCategory) {
+ tags.push(rawProduct.primaryCategory.name);
+ relations.push({
+ type: ProductRelationTypeEnum.CATEGORY,
+ name: rawProduct.primaryCategory.name,
+ alias: rawProduct.primaryCategory.alias
+ });
+ }
+
+ if (rawProduct.brand) {
+ tags.push(rawProduct.brand.name);
+ relations.push({
+ type: ProductRelationTypeEnum.BRAND,
+ name: rawProduct.brand.name,
+ alias: rawProduct.brand.alias
+ });
+ }
+ if (rawProduct.categories) {
+ rawProduct.categories.forEach((category: any) => {
+ tags.push(category.name);
+ });
+ }
+ // remove duplicates
+ const uniqueTags = [...new Set(tags)];
+ tags.push(...uniqueTags);
+
+ // add descriptions from environment variables
+ const shortDescription = rawProduct.texts?.[SHORT_DESCRIPTION] || '';
+ const longDescription = rawProduct.texts?.[LONG_DESCRIPTION] || '';
+
+ // add images
+ const images = rawProduct.productImages?.map(
+ (image: any): ProductImageType => ({
+ caption: rawProduct.name,
+ altText: rawProduct.name,
+ src: `${IMAGE_URL}/product/1200f1500/${image.fileName}`,
+ url: `${IMAGE_URL}/product/1200f1500/${image.fileName}`,
+ height: 1600,
+ width: 2000
+ })
+ );
+
+ // add variations and options
+ let variations: ProductVariantType[] = [];
+ let options: ProductOptionType[] = [];
+
+ if (rawProduct.variantGroup) {
+ variations = [...reshapeProductVariations(rawProduct)];
+ options = [...reshapeProductOptions(variations)];
+ }
+
+ return {
+ id: rawProduct.productId,
+ seo: {
+ title: rawProduct.meta?.title,
+ description: rawProduct.meta?.description
+ },
+ metaTitle: rawProduct.meta?.title || rawProduct.name,
+ metaDescription: rawProduct.meta?.description || shortDescription,
+ name: rawProduct.name,
+ title: rawProduct.name,
+ slug: rawProduct.alias,
+ handle: rawProduct.alias,
+ description: shortDescription,
+ descriptionHtml: rawProduct.texts?.text1 || '',
+ priceRange: {
+ minVariantPrice: {
+ amount: rawProduct.unitPrice?.sellingPriceIncVat,
+ currencyCode: CURRENCY_CODE
+ },
+ maxVariantPrice: {
+ amount: rawProduct.unitPrice?.sellingPriceIncVat,
+ currencyCode: CURRENCY_CODE
+ }
+ },
+ price: rawProduct.unitPrice.sellingPriceIncVat,
+ currency: CURRENCY_CODE,
+ stockTracking: !!rawProduct.totalStock,
+ stockPurchasable: rawProduct.totalStock?.inStock || false,
+ stockLevel: rawProduct.totalStock?.totalStock || 0,
+ availableForSale: true,
+ tags: tags || [],
+ options: [...options] || [],
+ variants: variations || [],
+ featuredImage: images[0],
+ images: images,
+ relations: relations
+ };
+};
+
+const reshapeProductOptions = (variants: any[]): ProductOptionType[] => {
+ const optionsMap: Record }> = {};
+
+ variants.forEach((variant) => {
+ if (variant.selectedOptions && Array.isArray(variant.selectedOptions)) {
+ variant.selectedOptions.forEach((option: { name: string; value: string }) => {
+ // Ensure `optionsMap[option.name]` is initialized
+ if (!optionsMap[option.name]) {
+ optionsMap[option.name] = {
+ id: option.name.toLowerCase(),
+ name: option.name,
+ values: new Set()
+ };
+ }
+ // Now it is safe to access `optionsMap[option.name].values`
+ optionsMap[option.name]?.values.add(option.value);
+ });
+ }
+ });
+
+ // Convert the map to an array and transform the Set of values to an array
+ return Object.values(optionsMap).map((option) => ({
+ id: option.id,
+ name: option.name,
+ values: Array.from(option.values)
+ }));
+};
+
+const reshapeSkusToVariants = (skus: any[]): ProductVariantType[] => {
+ return skus.map((sku) => ({
+ id: sku.skuId.toString(),
+ title: sku.name,
+ availableForSale: sku.stock?.totalStock > 0 || false,
+ selectedOptions: [{ name: DEFAULT_SKU_VARIATION, value: sku.name }],
+ price: {
+ amount: '0',
+ currencyCode: CURRENCY_CODE
+ }
+ }));
+};
+
+const reshapeProductVariations = (geinsProductData: any): ProductVariantType[] => {
+ // filter out the default product from dimensions
+ const dimensions = geinsProductData.variantDimensions.filter(
+ (dimension: any) => dimension.dimension !== 'DefaultProduct'
+ );
+ if (dimensions.length === 0) {
+ return reshapeSkusToVariants(geinsProductData.skus);
+ }
+
+ const buildVariantsArray = (
+ variants: any[],
+ selectedOptions: any[] = [],
+ parent: any = undefined
+ ): any[] => {
+ const result: any[] = []; // Collect the final results here
+
+ if (!Array.isArray(variants)) {
+ return result; // Safeguard against invalid input
+ }
+
+ for (const variant of variants) {
+ // Look ahead to check if the current variant is DefaultSku with a single value
+ const hasNextLevel = Array.isArray(variant.variants) && variant.variants.length > 0;
+
+ // Create the current option
+ const newSelectedOptions = [...selectedOptions];
+ const currentOption = {
+ name: variant.dimension,
+ value: variant.value
+ };
+ newSelectedOptions.push(currentOption);
+
+ if (hasNextLevel) {
+ const nestedResults = buildVariantsArray(variant.variants, newSelectedOptions, variant);
+ result.push(...nestedResults);
+ } else {
+ const hasOnlyOneOption =
+ (parent && parent.variants.length === 1 && variant.dimension === 'DefaultSku') || false;
+ if (hasOnlyOneOption) {
+ newSelectedOptions.pop();
+ }
+
+ result.push({
+ id: variant.skuId.toString(),
+ title: newSelectedOptions.map((opt) => opt.value).join(','),
+ availableForSale: variant.stock?.totalStock > 0 || false, // Handle stock availability
+ selectedOptions: newSelectedOptions,
+ price: {
+ amount: '',
+ currencyCode: CURRENCY_CODE // Replace with actual currency code
+ }
+ });
+ }
+ }
+
+ return result;
+ };
+ const reshapedVariants = buildVariantsArray(geinsProductData.variantGroup.variants);
+
+ return reshapedVariants;
+};
+
+export const reshapeCart = (geinsData: any): CartType => {
+ if (!geinsData) {
+ return {} as CartType;
+ }
+
+ const items: CartItemType[] = [];
+ let totalQuantity = 0;
+ geinsData.items?.forEach((item: any) => {
+ totalQuantity += item.quantity;
+ const sku = item.product.skus[0];
+ items.push({
+ id: item.id,
+ quantity: item.quantity,
+ cost: {
+ totalAmount: {
+ amount: item.totalPrice.sellingPriceIncVat + '',
+ currencyCode: CURRENCY_CODE
+ }
+ },
+ merchandise: {
+ id: item.skuId,
+ title: sku.name,
+ selectedOptions: [{ name: 'Size', value: sku.name }],
+ product: {
+ id: item.product.productId,
+ handle: item.product.alias,
+ title: item.product.name,
+ featuredImage: {
+ caption: item.product.name,
+ altText: item.product.name,
+ url: `${IMAGE_URL}/product/100f125/${item.product.productImages[0].fileName}`,
+ src: `${IMAGE_URL}/product/100f125/${item.product.productImages[0].fileName}`,
+ height: 1600,
+ width: 2000
+ }
+ }
+ }
+ });
+ });
+
+ const vatSum =
+ geinsData.summary.total.sellingPriceIncVat - geinsData.summary.total.sellingPriceExVat;
+ const data = {
+ id: geinsData.id || 'no-cart-id',
+ lines: items || [],
+ totalQuantity: totalQuantity,
+ cost: {
+ subtotalAmount: {
+ amount: geinsData.summary.total.sellingPriceExVat + '',
+ currencyCode: CURRENCY_CODE
+ },
+ totalTaxAmount: {
+ amount: vatSum + '',
+ currencyCode: CURRENCY_CODE
+ },
+ totalAmount: {
+ amount: geinsData.summary.total.sellingPriceIncVat + '',
+ currencyCode: CURRENCY_CODE
+ }
+ },
+
+ checkoutUrl: '/checkout'
+ };
+ return data;
+};
+
+export const reshapeCheckout = (geinsData: any): PageType => {
+ const checkoutPage: PageType = {
+ id: 'checkout',
+ title: 'Checkout example',
+ handle: 'checkout',
+ body: '',
+ bodySummary: '',
+ seo: {
+ title: 'Checkout',
+ description: 'Checkout page'
+ },
+ createdAt: new Date().toISOString(),
+ updatedAt: new Date().toISOString()
+ };
+
+ if (!geinsData || !geinsData.createOrUpdateCheckout) {
+ checkoutPage.body = 'No payment options available';
+ return checkoutPage;
+ }
+ if (
+ !geinsData.createOrUpdateCheckout.paymentOptions ||
+ geinsData.createOrUpdateCheckout.paymentOptions.length === 0
+ ) {
+ checkoutPage.body = 'No payment options available';
+ return checkoutPage;
+ }
+ checkoutPage.body = geinsData.createOrUpdateCheckout.paymentOptions[0].paymentData;
+ return checkoutPage;
+};
+
+export const reshapeMenu = (geinsMenu: GeinsMenuType, locationId: string) => {
+ if (!geinsMenu.menuItems) {
+ return [];
+ }
+ return geinsMenu.menuItems.map((item) => {
+ let itemPath = item?.canonicalUrl?.split('/').pop() || '';
+ if (item?.type === 'category') {
+ itemPath = '/search/' + itemPath;
+ } else if (item?.type === 'custom') {
+ itemPath = item?.canonicalUrl || '';
+ }
+ return {
+ id: locationId + ':' + item?.id || '',
+ title: item?.title || '',
+ path: itemPath || ''
+ };
+ });
+};
+
+export const reshapePage = (geinsPage: any, alias: string): PageType => {
+ if (!geinsPage) {
+ undefined;
+ }
+
+ const title = geinsPage.meta.title || '';
+ const today = new Date().toISOString();
+
+ const body = geinsPage.containers.map((container: any) => {
+ const content = container.content.map((item: any) => {
+ if (item.config.type === 'TextPageWidget') {
+ return `
+ ${item.data.title}
+
+ ${item.data.text}
+
+ `;
+ }
+ if (item.config.type === 'HTMLPageWidget') {
+ return `${item.data.html}`;
+ }
+ if (item.config.type === 'ImagePageWidget') {
+ return ` `;
+ }
+ return '';
+ });
+ return content.join(' ');
+ });
+
+ return {
+ id: geinsPage.id || '',
+ title: geinsPage.title || title,
+ handle: alias || '',
+ body: body || '',
+ bodySummary: geinsPage?.bodySummary || '',
+ seo: geinsPage?.seo || '',
+ createdAt: geinsPage?.createdAt || today,
+ updatedAt: geinsPage?.updatedAt || today
+ };
+};
diff --git a/lib/geins/types.ts b/lib/geins/types.ts
new file mode 100644
index 000000000..4e451fb68
--- /dev/null
+++ b/lib/geins/types.ts
@@ -0,0 +1,184 @@
+export type Maybe = T | null;
+
+export type Connection = {
+ edges: Array>;
+};
+
+export type Edge = {
+ node: T;
+};
+
+export type CartType = {
+ id: string | undefined;
+ checkoutUrl: string;
+ cost: {
+ subtotalAmount: MoneyType;
+ totalAmount: MoneyType;
+ totalTaxAmount: MoneyType;
+ };
+ totalQuantity: number;
+ lines: CartItemType[];
+};
+
+export type CartProductType = {
+ id: string;
+ handle: string;
+ title: string;
+ featuredImage: ProductImageType;
+};
+
+export type CartItemType = {
+ id: string | undefined;
+ quantity: number;
+ cost: {
+ totalAmount: MoneyType;
+ };
+ merchandise: {
+ id: string;
+ title: string;
+ selectedOptions: {
+ name: string;
+ value: string;
+ }[];
+ product: CartProductType;
+ };
+};
+
+export type CartItemInputType = {
+ id?: string;
+ skuId?: number;
+ quantity: number;
+};
+
+export type SeoType = {
+ title: string;
+ description: string;
+};
+
+export type CollectionType = {
+ id: string;
+ title: string;
+ description: string;
+ handle: string;
+ seo?: SeoType;
+};
+
+export type PageType = {
+ id: string;
+ title: string;
+ handle: string;
+ body: string;
+ bodySummary: string;
+ seo?: SeoType;
+ createdAt: string;
+ updatedAt: string;
+};
+
+export type MenuType = {
+ id: string;
+ title?: string;
+ name: string;
+ items: MenuItemType[];
+};
+
+export type MenuItemType = {
+ id: string;
+ title: string;
+ path: string;
+ slug?: string;
+};
+
+export type CategoryItemType = {
+ id: string;
+ parentId: string;
+ title: string;
+ path: string;
+ slug?: string;
+ updatedAt?: string;
+};
+
+export enum ProductRelationTypeEnum {
+ BRAND = 'BRAND',
+ CATEGORY = 'CATEGORY',
+ RELATED = 'RELATED',
+ SIMILAR = 'SIMILAR',
+ CROSS_SELL = 'CROSS_SELL',
+ UP_SELL = 'UP_SELL'
+}
+
+export type ProductRelationType = {
+ type: ProductRelationTypeEnum;
+ name: string;
+ alias: string;
+};
+
+export type MoneyType = {
+ amount: string;
+ currencyCode: string;
+};
+
+export type ProductType = {
+ id: string;
+ seo: {
+ title?: string;
+ description?: string;
+ };
+ currency: string;
+ slug: string;
+ handle: string;
+ stockTracking: boolean;
+ stockPurchasable: boolean;
+ stockLevel: number;
+ title: string;
+ name: string;
+ description: string;
+ price: string;
+ priceRange: {
+ maxVariantPrice: MoneyType;
+ minVariantPrice: MoneyType;
+ };
+ metaTitle: string;
+ metaDescription: string;
+ tags: string[];
+ options: ProductOptionType[];
+ variants: ProductVariantType[];
+ featuredImage: ProductImageType;
+ images: ProductImageType[];
+ updatedAt?: string;
+ availableForSale: boolean;
+ descriptionHtml?: string;
+ relations?: ProductRelationType[];
+};
+
+export type ProductOptionType = {
+ id: string;
+ name: string;
+ values: string[];
+};
+
+export type ProductVariantType = {
+ id: string;
+ title: string;
+ availableForSale: boolean;
+ selectedOptions: {
+ name: string;
+ value: string;
+ }[];
+ price: MoneyType;
+};
+
+export type ProductImageType = {
+ caption: string;
+ altText: string;
+ url: string;
+ src: string;
+ width: number;
+ height: number;
+};
+
+export type ImageType = {
+ url: string;
+ altText: string;
+ width: number;
+ height: number;
+};
diff --git a/lib/shopify/fragments/cart.ts b/lib/shopify/fragments/cart.ts
deleted file mode 100644
index fc5c838dd..000000000
--- a/lib/shopify/fragments/cart.ts
+++ /dev/null
@@ -1,53 +0,0 @@
-import productFragment from './product';
-
-const cartFragment = /* GraphQL */ `
- fragment cart on Cart {
- id
- checkoutUrl
- cost {
- subtotalAmount {
- amount
- currencyCode
- }
- totalAmount {
- amount
- currencyCode
- }
- totalTaxAmount {
- amount
- currencyCode
- }
- }
- lines(first: 100) {
- edges {
- node {
- id
- quantity
- cost {
- totalAmount {
- amount
- currencyCode
- }
- }
- merchandise {
- ... on ProductVariant {
- id
- title
- selectedOptions {
- name
- value
- }
- product {
- ...product
- }
- }
- }
- }
- }
- }
- totalQuantity
- }
- ${productFragment}
-`;
-
-export default cartFragment;
diff --git a/lib/shopify/fragments/image.ts b/lib/shopify/fragments/image.ts
deleted file mode 100644
index 5d002f175..000000000
--- a/lib/shopify/fragments/image.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-const imageFragment = /* GraphQL */ `
- fragment image on Image {
- url
- altText
- width
- height
- }
-`;
-
-export default imageFragment;
diff --git a/lib/shopify/fragments/product.ts b/lib/shopify/fragments/product.ts
deleted file mode 100644
index be14dedca..000000000
--- a/lib/shopify/fragments/product.ts
+++ /dev/null
@@ -1,64 +0,0 @@
-import imageFragment from './image';
-import seoFragment from './seo';
-
-const productFragment = /* GraphQL */ `
- fragment product on Product {
- id
- handle
- availableForSale
- title
- description
- descriptionHtml
- options {
- id
- name
- values
- }
- priceRange {
- maxVariantPrice {
- amount
- currencyCode
- }
- minVariantPrice {
- amount
- currencyCode
- }
- }
- variants(first: 250) {
- edges {
- node {
- id
- title
- availableForSale
- selectedOptions {
- name
- value
- }
- price {
- amount
- currencyCode
- }
- }
- }
- }
- featuredImage {
- ...image
- }
- images(first: 20) {
- edges {
- node {
- ...image
- }
- }
- }
- seo {
- ...seo
- }
- tags
- updatedAt
- }
- ${imageFragment}
- ${seoFragment}
-`;
-
-export default productFragment;
diff --git a/lib/shopify/fragments/seo.ts b/lib/shopify/fragments/seo.ts
deleted file mode 100644
index 2d4786c4f..000000000
--- a/lib/shopify/fragments/seo.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-const seoFragment = /* GraphQL */ `
- fragment seo on SEO {
- description
- title
- }
-`;
-
-export default seoFragment;
diff --git a/lib/shopify/index.ts b/lib/shopify/index.ts
deleted file mode 100644
index 1970d94e0..000000000
--- a/lib/shopify/index.ts
+++ /dev/null
@@ -1,455 +0,0 @@
-import { HIDDEN_PRODUCT_TAG, SHOPIFY_GRAPHQL_API_ENDPOINT, TAGS } from 'lib/constants';
-import { isShopifyError } from 'lib/type-guards';
-import { ensureStartsWith } from 'lib/utils';
-import { revalidateTag } from 'next/cache';
-import { headers } from 'next/headers';
-import { NextRequest, NextResponse } from 'next/server';
-import {
- addToCartMutation,
- createCartMutation,
- editCartItemsMutation,
- removeFromCartMutation
-} from './mutations/cart';
-import { getCartQuery } from './queries/cart';
-import {
- getCollectionProductsQuery,
- getCollectionQuery,
- getCollectionsQuery
-} from './queries/collection';
-import { getMenuQuery } from './queries/menu';
-import { getPageQuery, getPagesQuery } from './queries/page';
-import {
- getProductQuery,
- getProductRecommendationsQuery,
- getProductsQuery
-} from './queries/product';
-import {
- Cart,
- Collection,
- Connection,
- Image,
- Menu,
- Page,
- Product,
- ShopifyAddToCartOperation,
- ShopifyCart,
- ShopifyCartOperation,
- ShopifyCollection,
- ShopifyCollectionOperation,
- ShopifyCollectionProductsOperation,
- ShopifyCollectionsOperation,
- ShopifyCreateCartOperation,
- ShopifyMenuOperation,
- ShopifyPageOperation,
- ShopifyPagesOperation,
- ShopifyProduct,
- ShopifyProductOperation,
- ShopifyProductRecommendationsOperation,
- ShopifyProductsOperation,
- ShopifyRemoveFromCartOperation,
- ShopifyUpdateCartOperation
-} from './types';
-
-const domain = process.env.SHOPIFY_STORE_DOMAIN
- ? ensureStartsWith(process.env.SHOPIFY_STORE_DOMAIN, 'https://')
- : '';
-const endpoint = `${domain}${SHOPIFY_GRAPHQL_API_ENDPOINT}`;
-const key = process.env.SHOPIFY_STOREFRONT_ACCESS_TOKEN!;
-
-type ExtractVariables = T extends { variables: object } ? T['variables'] : never;
-
-export async function shopifyFetch({
- cache = 'force-cache',
- headers,
- query,
- tags,
- variables
-}: {
- cache?: RequestCache;
- headers?: HeadersInit;
- query: string;
- tags?: string[];
- variables?: ExtractVariables;
-}): Promise<{ status: number; body: T } | never> {
- try {
- const result = await fetch(endpoint, {
- method: 'POST',
- headers: {
- 'Content-Type': 'application/json',
- 'X-Shopify-Storefront-Access-Token': key,
- ...headers
- },
- body: JSON.stringify({
- ...(query && { query }),
- ...(variables && { variables })
- }),
- cache,
- ...(tags && { next: { tags } })
- });
-
- const body = await result.json();
-
- if (body.errors) {
- throw body.errors[0];
- }
-
- return {
- status: result.status,
- body
- };
- } catch (e) {
- if (isShopifyError(e)) {
- throw {
- cause: e.cause?.toString() || 'unknown',
- status: e.status || 500,
- message: e.message,
- query
- };
- }
-
- throw {
- error: e,
- query
- };
- }
-}
-
-const removeEdgesAndNodes = (array: Connection): T[] => {
- return array.edges.map((edge) => edge?.node);
-};
-
-const reshapeCart = (cart: ShopifyCart): Cart => {
- if (!cart.cost?.totalTaxAmount) {
- cart.cost.totalTaxAmount = {
- amount: '0.0',
- currencyCode: cart.cost.totalAmount.currencyCode
- };
- }
-
- return {
- ...cart,
- lines: removeEdgesAndNodes(cart.lines)
- };
-};
-
-const reshapeCollection = (collection: ShopifyCollection): Collection | undefined => {
- if (!collection) {
- return undefined;
- }
-
- return {
- ...collection,
- path: `/search/${collection.handle}`
- };
-};
-
-const reshapeCollections = (collections: ShopifyCollection[]) => {
- const reshapedCollections = [];
-
- for (const collection of collections) {
- if (collection) {
- const reshapedCollection = reshapeCollection(collection);
-
- if (reshapedCollection) {
- reshapedCollections.push(reshapedCollection);
- }
- }
- }
-
- return reshapedCollections;
-};
-
-const reshapeImages = (images: Connection, productTitle: string) => {
- const flattened = removeEdgesAndNodes(images);
-
- return flattened.map((image) => {
- const filename = image.url.match(/.*\/(.*)\..*/)?.[1];
- return {
- ...image,
- altText: image.altText || `${productTitle} - ${filename}`
- };
- });
-};
-
-const reshapeProduct = (product: ShopifyProduct, filterHiddenProducts: boolean = true) => {
- if (!product || (filterHiddenProducts && product.tags.includes(HIDDEN_PRODUCT_TAG))) {
- return undefined;
- }
-
- const { images, variants, ...rest } = product;
-
- return {
- ...rest,
- images: reshapeImages(images, product.title),
- variants: removeEdgesAndNodes(variants)
- };
-};
-
-const reshapeProducts = (products: ShopifyProduct[]) => {
- const reshapedProducts = [];
-
- for (const product of products) {
- if (product) {
- const reshapedProduct = reshapeProduct(product);
-
- if (reshapedProduct) {
- reshapedProducts.push(reshapedProduct);
- }
- }
- }
-
- return reshapedProducts;
-};
-
-export async function createCart(): Promise {
- const res = await shopifyFetch({
- query: createCartMutation,
- cache: 'no-store'
- });
-
- return reshapeCart(res.body.data.cartCreate.cart);
-}
-
-export async function addToCart(
- cartId: string,
- lines: { merchandiseId: string; quantity: number }[]
-): Promise {
- const res = await shopifyFetch({
- query: addToCartMutation,
- variables: {
- cartId,
- lines
- },
- cache: 'no-store'
- });
- return reshapeCart(res.body.data.cartLinesAdd.cart);
-}
-
-export async function removeFromCart(cartId: string, lineIds: string[]): Promise {
- const res = await shopifyFetch({
- query: removeFromCartMutation,
- variables: {
- cartId,
- lineIds
- },
- cache: 'no-store'
- });
-
- return reshapeCart(res.body.data.cartLinesRemove.cart);
-}
-
-export async function updateCart(
- cartId: string,
- lines: { id: string; merchandiseId: string; quantity: number }[]
-): Promise {
- const res = await shopifyFetch({
- query: editCartItemsMutation,
- variables: {
- cartId,
- lines
- },
- cache: 'no-store'
- });
-
- return reshapeCart(res.body.data.cartLinesUpdate.cart);
-}
-
-export async function getCart(cartId: string | undefined): Promise {
- if (!cartId) {
- return undefined;
- }
-
- const res = await shopifyFetch({
- query: getCartQuery,
- variables: { cartId },
- tags: [TAGS.cart]
- });
-
- // Old carts becomes `null` when you checkout.
- if (!res.body.data.cart) {
- return undefined;
- }
-
- return reshapeCart(res.body.data.cart);
-}
-
-export async function getCollection(handle: string): Promise {
- const res = await shopifyFetch({
- query: getCollectionQuery,
- tags: [TAGS.collections],
- variables: {
- handle
- }
- });
-
- return reshapeCollection(res.body.data.collection);
-}
-
-export async function getCollectionProducts({
- collection,
- reverse,
- sortKey
-}: {
- collection: string;
- reverse?: boolean;
- sortKey?: string;
-}): Promise {
- const res = await shopifyFetch({
- query: getCollectionProductsQuery,
- tags: [TAGS.collections, TAGS.products],
- variables: {
- handle: collection,
- reverse,
- sortKey: sortKey === 'CREATED_AT' ? 'CREATED' : sortKey
- }
- });
-
- if (!res.body.data.collection) {
- console.log(`No collection found for \`${collection}\``);
- return [];
- }
-
- return reshapeProducts(removeEdgesAndNodes(res.body.data.collection.products));
-}
-
-export async function getCollections(): Promise {
- const res = await shopifyFetch({
- query: getCollectionsQuery,
- tags: [TAGS.collections]
- });
- const shopifyCollections = removeEdgesAndNodes(res.body?.data?.collections);
- const collections = [
- {
- handle: '',
- title: 'All',
- description: 'All products',
- seo: {
- title: 'All',
- description: 'All products'
- },
- path: '/search',
- updatedAt: new Date().toISOString()
- },
- // Filter out the `hidden` collections.
- // Collections that start with `hidden-*` need to be hidden on the search page.
- ...reshapeCollections(shopifyCollections).filter(
- (collection) => !collection.handle.startsWith('hidden')
- )
- ];
-
- return collections;
-}
-
-export async function getMenu(handle: string): Promise {
- const res = await shopifyFetch({
- query: getMenuQuery,
- tags: [TAGS.collections],
- variables: {
- handle
- }
- });
-
- return (
- res.body?.data?.menu?.items.map((item: { title: string; url: string }) => ({
- title: item.title,
- path: item.url.replace(domain, '').replace('/collections', '/search').replace('/pages', '')
- })) || []
- );
-}
-
-export async function getPage(handle: string): Promise {
- const res = await shopifyFetch({
- query: getPageQuery,
- cache: 'no-store',
- variables: { handle }
- });
-
- return res.body.data.pageByHandle;
-}
-
-export async function getPages(): Promise {
- const res = await shopifyFetch({
- query: getPagesQuery,
- cache: 'no-store'
- });
-
- return removeEdgesAndNodes(res.body.data.pages);
-}
-
-export async function getProduct(handle: string): Promise {
- const res = await shopifyFetch({
- query: getProductQuery,
- tags: [TAGS.products],
- variables: {
- handle
- }
- });
-
- return reshapeProduct(res.body.data.product, false);
-}
-
-export async function getProductRecommendations(productId: string): Promise {
- const res = await shopifyFetch({
- query: getProductRecommendationsQuery,
- tags: [TAGS.products],
- variables: {
- productId
- }
- });
-
- return reshapeProducts(res.body.data.productRecommendations);
-}
-
-export async function getProducts({
- query,
- reverse,
- sortKey
-}: {
- query?: string;
- reverse?: boolean;
- sortKey?: string;
-}): Promise {
- const res = await shopifyFetch({
- query: getProductsQuery,
- tags: [TAGS.products],
- variables: {
- query,
- reverse,
- sortKey
- }
- });
-
- return reshapeProducts(removeEdgesAndNodes(res.body.data.products));
-}
-
-// This is called from `app/api/revalidate.ts` so providers can control revalidation logic.
-export async function revalidate(req: NextRequest): Promise {
- // We always need to respond with a 200 status code to Shopify,
- // otherwise it will continue to retry the request.
- const collectionWebhooks = ['collections/create', 'collections/delete', 'collections/update'];
- const productWebhooks = ['products/create', 'products/delete', 'products/update'];
- const topic = (await headers()).get('x-shopify-topic') || 'unknown';
- const secret = req.nextUrl.searchParams.get('secret');
- const isCollectionUpdate = collectionWebhooks.includes(topic);
- const isProductUpdate = productWebhooks.includes(topic);
-
- if (!secret || secret !== process.env.SHOPIFY_REVALIDATION_SECRET) {
- console.error('Invalid revalidation secret.');
- return NextResponse.json({ status: 401 });
- }
-
- if (!isCollectionUpdate && !isProductUpdate) {
- // We don't need to revalidate anything for any other topics.
- return NextResponse.json({ status: 200 });
- }
-
- if (isCollectionUpdate) {
- revalidateTag(TAGS.collections);
- }
-
- if (isProductUpdate) {
- revalidateTag(TAGS.products);
- }
-
- return NextResponse.json({ status: 200, revalidated: true, now: Date.now() });
-}
diff --git a/lib/shopify/mutations/cart.ts b/lib/shopify/mutations/cart.ts
deleted file mode 100644
index 4cc1b5ac6..000000000
--- a/lib/shopify/mutations/cart.ts
+++ /dev/null
@@ -1,45 +0,0 @@
-import cartFragment from '../fragments/cart';
-
-export const addToCartMutation = /* GraphQL */ `
- mutation addToCart($cartId: ID!, $lines: [CartLineInput!]!) {
- cartLinesAdd(cartId: $cartId, lines: $lines) {
- cart {
- ...cart
- }
- }
- }
- ${cartFragment}
-`;
-
-export const createCartMutation = /* GraphQL */ `
- mutation createCart($lineItems: [CartLineInput!]) {
- cartCreate(input: { lines: $lineItems }) {
- cart {
- ...cart
- }
- }
- }
- ${cartFragment}
-`;
-
-export const editCartItemsMutation = /* GraphQL */ `
- mutation editCartItems($cartId: ID!, $lines: [CartLineUpdateInput!]!) {
- cartLinesUpdate(cartId: $cartId, lines: $lines) {
- cart {
- ...cart
- }
- }
- }
- ${cartFragment}
-`;
-
-export const removeFromCartMutation = /* GraphQL */ `
- mutation removeFromCart($cartId: ID!, $lineIds: [ID!]!) {
- cartLinesRemove(cartId: $cartId, lineIds: $lineIds) {
- cart {
- ...cart
- }
- }
- }
- ${cartFragment}
-`;
diff --git a/lib/shopify/queries/cart.ts b/lib/shopify/queries/cart.ts
deleted file mode 100644
index 044e47f66..000000000
--- a/lib/shopify/queries/cart.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import cartFragment from '../fragments/cart';
-
-export const getCartQuery = /* GraphQL */ `
- query getCart($cartId: ID!) {
- cart(id: $cartId) {
- ...cart
- }
- }
- ${cartFragment}
-`;
diff --git a/lib/shopify/queries/collection.ts b/lib/shopify/queries/collection.ts
deleted file mode 100644
index 6396ff8eb..000000000
--- a/lib/shopify/queries/collection.ts
+++ /dev/null
@@ -1,56 +0,0 @@
-import productFragment from '../fragments/product';
-import seoFragment from '../fragments/seo';
-
-const collectionFragment = /* GraphQL */ `
- fragment collection on Collection {
- handle
- title
- description
- seo {
- ...seo
- }
- updatedAt
- }
- ${seoFragment}
-`;
-
-export const getCollectionQuery = /* GraphQL */ `
- query getCollection($handle: String!) {
- collection(handle: $handle) {
- ...collection
- }
- }
- ${collectionFragment}
-`;
-
-export const getCollectionsQuery = /* GraphQL */ `
- query getCollections {
- collections(first: 100, sortKey: TITLE) {
- edges {
- node {
- ...collection
- }
- }
- }
- }
- ${collectionFragment}
-`;
-
-export const getCollectionProductsQuery = /* GraphQL */ `
- query getCollectionProducts(
- $handle: String!
- $sortKey: ProductCollectionSortKeys
- $reverse: Boolean
- ) {
- collection(handle: $handle) {
- products(sortKey: $sortKey, reverse: $reverse, first: 100) {
- edges {
- node {
- ...product
- }
- }
- }
- }
- }
- ${productFragment}
-`;
diff --git a/lib/shopify/queries/menu.ts b/lib/shopify/queries/menu.ts
deleted file mode 100644
index d05b09949..000000000
--- a/lib/shopify/queries/menu.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-export const getMenuQuery = /* GraphQL */ `
- query getMenu($handle: String!) {
- menu(handle: $handle) {
- items {
- title
- url
- }
- }
- }
-`;
diff --git a/lib/shopify/queries/page.ts b/lib/shopify/queries/page.ts
deleted file mode 100644
index ac6f6f986..000000000
--- a/lib/shopify/queries/page.ts
+++ /dev/null
@@ -1,41 +0,0 @@
-import seoFragment from '../fragments/seo';
-
-const pageFragment = /* GraphQL */ `
- fragment page on Page {
- ... on Page {
- id
- title
- handle
- body
- bodySummary
- seo {
- ...seo
- }
- createdAt
- updatedAt
- }
- }
- ${seoFragment}
-`;
-
-export const getPageQuery = /* GraphQL */ `
- query getPage($handle: String!) {
- pageByHandle(handle: $handle) {
- ...page
- }
- }
- ${pageFragment}
-`;
-
-export const getPagesQuery = /* GraphQL */ `
- query getPages {
- pages(first: 100) {
- edges {
- node {
- ...page
- }
- }
- }
- }
- ${pageFragment}
-`;
diff --git a/lib/shopify/queries/product.ts b/lib/shopify/queries/product.ts
deleted file mode 100644
index d3f12bd0f..000000000
--- a/lib/shopify/queries/product.ts
+++ /dev/null
@@ -1,32 +0,0 @@
-import productFragment from '../fragments/product';
-
-export const getProductQuery = /* GraphQL */ `
- query getProduct($handle: String!) {
- product(handle: $handle) {
- ...product
- }
- }
- ${productFragment}
-`;
-
-export const getProductsQuery = /* GraphQL */ `
- query getProducts($sortKey: ProductSortKeys, $reverse: Boolean, $query: String) {
- products(sortKey: $sortKey, reverse: $reverse, query: $query, first: 100) {
- edges {
- node {
- ...product
- }
- }
- }
- }
- ${productFragment}
-`;
-
-export const getProductRecommendationsQuery = /* GraphQL */ `
- query getProductRecommendations($productId: ID!) {
- productRecommendations(productId: $productId) {
- ...product
- }
- }
- ${productFragment}
-`;
diff --git a/lib/shopify/types.ts b/lib/shopify/types.ts
deleted file mode 100644
index 9b443559e..000000000
--- a/lib/shopify/types.ts
+++ /dev/null
@@ -1,272 +0,0 @@
-export type Maybe = T | null;
-
-export type Connection = {
- edges: Array>;
-};
-
-export type Edge = {
- node: T;
-};
-
-export type Cart = Omit & {
- lines: CartItem[];
-};
-
-export type CartProduct = {
- id: string;
- handle: string;
- title: string;
- featuredImage: Image;
-};
-
-export type CartItem = {
- id: string | undefined;
- quantity: number;
- cost: {
- totalAmount: Money;
- };
- merchandise: {
- id: string;
- title: string;
- selectedOptions: {
- name: string;
- value: string;
- }[];
- product: CartProduct;
- };
-};
-
-export type Collection = ShopifyCollection & {
- path: string;
-};
-
-export type Image = {
- url: string;
- altText: string;
- width: number;
- height: number;
-};
-
-export type Menu = {
- title: string;
- path: string;
-};
-
-export type Money = {
- amount: string;
- currencyCode: string;
-};
-
-export type Page = {
- id: string;
- title: string;
- handle: string;
- body: string;
- bodySummary: string;
- seo?: SEO;
- createdAt: string;
- updatedAt: string;
-};
-
-export type Product = Omit & {
- variants: ProductVariant[];
- images: Image[];
-};
-
-export type ProductOption = {
- id: string;
- name: string;
- values: string[];
-};
-
-export type ProductVariant = {
- id: string;
- title: string;
- availableForSale: boolean;
- selectedOptions: {
- name: string;
- value: string;
- }[];
- price: Money;
-};
-
-export type SEO = {
- title: string;
- description: string;
-};
-
-export type ShopifyCart = {
- id: string | undefined;
- checkoutUrl: string;
- cost: {
- subtotalAmount: Money;
- totalAmount: Money;
- totalTaxAmount: Money;
- };
- lines: Connection;
- totalQuantity: number;
-};
-
-export type ShopifyCollection = {
- handle: string;
- title: string;
- description: string;
- seo: SEO;
- updatedAt: string;
-};
-
-export type ShopifyProduct = {
- id: string;
- handle: string;
- availableForSale: boolean;
- title: string;
- description: string;
- descriptionHtml: string;
- options: ProductOption[];
- priceRange: {
- maxVariantPrice: Money;
- minVariantPrice: Money;
- };
- variants: Connection;
- featuredImage: Image;
- images: Connection;
- seo: SEO;
- tags: string[];
- updatedAt: string;
-};
-
-export type ShopifyCartOperation = {
- data: {
- cart: ShopifyCart;
- };
- variables: {
- cartId: string;
- };
-};
-
-export type ShopifyCreateCartOperation = {
- data: { cartCreate: { cart: ShopifyCart } };
-};
-
-export type ShopifyAddToCartOperation = {
- data: {
- cartLinesAdd: {
- cart: ShopifyCart;
- };
- };
- variables: {
- cartId: string;
- lines: {
- merchandiseId: string;
- quantity: number;
- }[];
- };
-};
-
-export type ShopifyRemoveFromCartOperation = {
- data: {
- cartLinesRemove: {
- cart: ShopifyCart;
- };
- };
- variables: {
- cartId: string;
- lineIds: string[];
- };
-};
-
-export type ShopifyUpdateCartOperation = {
- data: {
- cartLinesUpdate: {
- cart: ShopifyCart;
- };
- };
- variables: {
- cartId: string;
- lines: {
- id: string;
- merchandiseId: string;
- quantity: number;
- }[];
- };
-};
-
-export type ShopifyCollectionOperation = {
- data: {
- collection: ShopifyCollection;
- };
- variables: {
- handle: string;
- };
-};
-
-export type ShopifyCollectionProductsOperation = {
- data: {
- collection: {
- products: Connection;
- };
- };
- variables: {
- handle: string;
- reverse?: boolean;
- sortKey?: string;
- };
-};
-
-export type ShopifyCollectionsOperation = {
- data: {
- collections: Connection;
- };
-};
-
-export type ShopifyMenuOperation = {
- data: {
- menu?: {
- items: {
- title: string;
- url: string;
- }[];
- };
- };
- variables: {
- handle: string;
- };
-};
-
-export type ShopifyPageOperation = {
- data: { pageByHandle: Page };
- variables: { handle: string };
-};
-
-export type ShopifyPagesOperation = {
- data: {
- pages: Connection;
- };
-};
-
-export type ShopifyProductOperation = {
- data: { product: ShopifyProduct };
- variables: {
- handle: string;
- };
-};
-
-export type ShopifyProductRecommendationsOperation = {
- data: {
- productRecommendations: ShopifyProduct[];
- };
- variables: {
- productId: string;
- };
-};
-
-export type ShopifyProductsOperation = {
- data: {
- products: Connection;
- };
- variables: {
- query?: string;
- reverse?: boolean;
- sortKey?: string;
- };
-};
diff --git a/next.config.ts b/next.config.ts
index 08fafaaf2..9f99a7daf 100644
--- a/next.config.ts
+++ b/next.config.ts
@@ -4,8 +4,13 @@ export default {
remotePatterns: [
{
protocol: 'https',
- hostname: 'cdn.shopify.com',
- pathname: '/s/files/**'
+ hostname: 'labs.commerce.services',
+ pathname: '/product/**'
+ },
+ {
+ protocol: 'https',
+ hostname: 'labs.commerce.services',
+ pathname: '/pagewidget/**'
}
]
}
diff --git a/package.json b/package.json
index 663f7f60d..d5848abf8 100644
--- a/package.json
+++ b/package.json
@@ -13,19 +13,23 @@
"test": "pnpm prettier:check"
},
"dependencies": {
+ "@geins/cms": "^0.3.6",
+ "@geins/core": "^0.3.6",
"@headlessui/react": "^2.1.2",
"@heroicons/react": "^2.1.5",
"clsx": "^2.1.1",
"geist": "^1.3.1",
- "next": "15.0.0-rc.1",
+ "graphql-tag": "^2.12.6",
+ "next": "15.0.3",
"react": "19.0.0-rc-cd22717c-20241013",
"react-dom": "19.0.0-rc-cd22717c-20241013",
"sonner": "^1.5.0"
},
"devDependencies": {
+ "@geins/types": "^0.3.6",
"@tailwindcss/container-queries": "^0.1.1",
"@tailwindcss/typography": "^0.5.13",
- "@types/node": "20.14.12",
+ "@types/node": "22.9.0",
"@types/react": "npm:types-react@19.0.0-rc.1",
"@types/react-dom": "npm:types-react-dom@19.0.0-rc.1",
"autoprefixer": "^10.4.19",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 9ffc6fd49..e91806291 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -11,21 +11,30 @@ overrides:
importers:
.:
dependencies:
+ '@geins/cms':
+ specifier: ^0.3.6
+ version: 0.3.6(react-dom@19.0.0-rc-cd22717c-20241013(react@19.0.0-rc-cd22717c-20241013))(react@19.0.0-rc-cd22717c-20241013)(types-react@19.0.0-rc.1)
+ '@geins/core':
+ specifier: ^0.3.6
+ version: 0.3.6(react-dom@19.0.0-rc-cd22717c-20241013(react@19.0.0-rc-cd22717c-20241013))(react@19.0.0-rc-cd22717c-20241013)(types-react@19.0.0-rc.1)
'@headlessui/react':
specifier: ^2.1.2
- version: 2.1.2(react-dom@19.0.0-rc-cd22717c-20241013(react@19.0.0-rc-cd22717c-20241013))(react@19.0.0-rc-cd22717c-20241013)
+ version: 2.2.0(react-dom@19.0.0-rc-cd22717c-20241013(react@19.0.0-rc-cd22717c-20241013))(react@19.0.0-rc-cd22717c-20241013)
'@heroicons/react':
specifier: ^2.1.5
- version: 2.1.5(react@19.0.0-rc-cd22717c-20241013)
+ version: 2.2.0(react@19.0.0-rc-cd22717c-20241013)
clsx:
specifier: ^2.1.1
version: 2.1.1
geist:
specifier: ^1.3.1
- version: 1.3.1(next@15.0.0-rc.1(react-dom@19.0.0-rc-cd22717c-20241013(react@19.0.0-rc-cd22717c-20241013))(react@19.0.0-rc-cd22717c-20241013))
+ version: 1.3.1(next@15.0.3(react-dom@19.0.0-rc-cd22717c-20241013(react@19.0.0-rc-cd22717c-20241013))(react@19.0.0-rc-cd22717c-20241013))
+ graphql-tag:
+ specifier: ^2.12.6
+ version: 2.12.6(graphql@16.9.0)
next:
- specifier: 15.0.0-rc.1
- version: 15.0.0-rc.1(react-dom@19.0.0-rc-cd22717c-20241013(react@19.0.0-rc-cd22717c-20241013))(react@19.0.0-rc-cd22717c-20241013)
+ specifier: 15.0.3
+ version: 15.0.3(react-dom@19.0.0-rc-cd22717c-20241013(react@19.0.0-rc-cd22717c-20241013))(react@19.0.0-rc-cd22717c-20241013)
react:
specifier: 19.0.0-rc-cd22717c-20241013
version: 19.0.0-rc-cd22717c-20241013
@@ -34,17 +43,20 @@ importers:
version: 19.0.0-rc-cd22717c-20241013(react@19.0.0-rc-cd22717c-20241013)
sonner:
specifier: ^1.5.0
- version: 1.5.0(react-dom@19.0.0-rc-cd22717c-20241013(react@19.0.0-rc-cd22717c-20241013))(react@19.0.0-rc-cd22717c-20241013)
+ version: 1.7.0(react-dom@19.0.0-rc-cd22717c-20241013(react@19.0.0-rc-cd22717c-20241013))(react@19.0.0-rc-cd22717c-20241013)
devDependencies:
+ '@geins/types':
+ specifier: ^0.3.6
+ version: 0.3.6
'@tailwindcss/container-queries':
specifier: ^0.1.1
- version: 0.1.1(tailwindcss@3.4.6)
+ version: 0.1.1(tailwindcss@3.4.15)
'@tailwindcss/typography':
specifier: ^0.5.13
- version: 0.5.13(tailwindcss@3.4.6)
+ version: 0.5.15(tailwindcss@3.4.15)
'@types/node':
- specifier: 20.14.12
- version: 20.14.12
+ specifier: 22.9.0
+ version: 22.9.0
'@types/react':
specifier: npm:types-react@19.0.0-rc.1
version: types-react@19.0.0-rc.1
@@ -53,19 +65,19 @@ importers:
version: types-react-dom@19.0.0-rc.1
autoprefixer:
specifier: ^10.4.19
- version: 10.4.19(postcss@8.4.39)
+ version: 10.4.20(postcss@8.4.49)
postcss:
specifier: ^8.4.39
- version: 8.4.39
+ version: 8.4.49
prettier:
specifier: 3.3.3
version: 3.3.3
prettier-plugin-tailwindcss:
specifier: ^0.6.5
- version: 0.6.5(prettier@3.3.3)
+ version: 0.6.9(prettier@3.3.3)
tailwindcss:
specifier: ^3.4.6
- version: 3.4.6
+ version: 3.4.15
typescript:
specifier: 5.5.4
version: 5.5.4
@@ -78,65 +90,119 @@ packages:
}
engines: { node: '>=10' }
- '@emnapi/runtime@1.2.0':
+ '@apollo/client@3.11.10':
resolution:
{
- integrity: sha512-bV21/9LQmcQeCPEg3BDFtvwL6cwiTMksYNWQQ4KOxCZikEGalWtenoZ0wCiukJINlGCIi2KXx01g4FoH/LxpzQ==
+ integrity: sha512-IfGc+X4il0rDqVQBBWdxIKM+ciDCiDzBq9+Bg9z4tJMi87uF6po4v+ddiac1wP0ARgVPsFwEIGxK7jhN4pW8jg==
+ }
+ peerDependencies:
+ graphql: ^15.0.0 || ^16.0.0
+ graphql-ws: ^5.5.5
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0
+ react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0
+ subscriptions-transport-ws: ^0.9.0 || ^0.11.0
+ peerDependenciesMeta:
+ graphql-ws:
+ optional: true
+ react:
+ optional: true
+ react-dom:
+ optional: true
+ subscriptions-transport-ws:
+ optional: true
+
+ '@babel/runtime@7.23.4':
+ resolution:
+ {
+ integrity: sha512-2Yv65nlWnWlSpe3fXEyX5i7fx5kIKo4Qbcj+hMO0odwaneFjfXw5fdum+4yL20O0QiaHpia0cYQ9xpNMqrBwHg==
+ }
+ engines: { node: '>=6.9.0' }
+
+ '@emnapi/runtime@1.3.1':
+ resolution:
+ {
+ integrity: sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==
}
- '@floating-ui/core@1.6.5':
+ '@floating-ui/core@1.6.8':
resolution:
{
- integrity: sha512-8GrTWmoFhm5BsMZOTHeGD2/0FLKLQQHvO/ZmQga4tKempYRLz8aqJGqXVuQgisnMObq2YZ2SgkwctN1LOOxcqA==
+ integrity: sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==
}
- '@floating-ui/dom@1.6.8':
+ '@floating-ui/dom@1.6.12':
resolution:
{
- integrity: sha512-kx62rP19VZ767Q653wsP1XZCGIirkE09E0QUGNYTM/ttbbQHqcGPdSfWFxUyyNLc/W6aoJRBajOSXhP6GXjC0Q==
+ integrity: sha512-NP83c0HjokcGVEMeoStg317VD9W7eDlGK7457dMBANbKA6GJZdc7rjujdgqzTaz93jkGgc5P/jeWbaCHnMNc+w==
}
- '@floating-ui/react-dom@2.1.1':
+ '@floating-ui/react-dom@2.1.2':
resolution:
{
- integrity: sha512-4h84MJt3CHrtG18mGsXuLCHMrug49d7DFkU0RMIyshRveBeyV2hmV/pDaF2Uxtu8kgq5r46llp5E5FQiR0K2Yg==
+ integrity: sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==
}
peerDependencies:
react: '>=16.8.0'
react-dom: '>=16.8.0'
- '@floating-ui/react@0.26.20':
+ '@floating-ui/react@0.26.28':
resolution:
{
- integrity: sha512-RixKJJG92fcIsVoqrFr4Onpzh7hlOx4U7NV4aLhMLmtvjZ5oTB/WzXaANYUZATKqXvvW7t9sCxtzejip26N5Ag==
+ integrity: sha512-yORQuuAtVpiRjpMhdc0wJj06b9JFjrYF4qp96j++v2NBpbi6SEGF7donUJ3TMieerQ6qVkAv1tgr7L4r5roTqw==
}
peerDependencies:
react: '>=16.8.0'
react-dom: '>=16.8.0'
- '@floating-ui/utils@0.2.5':
+ '@floating-ui/utils@0.2.8':
resolution:
{
- integrity: sha512-sTcG+QZ6fdEUObICavU+aB3Mp8HY4n14wYHdxK4fXjPmv3PXZZeY5RaguJmGyeH/CJQhX3fqKUtS4qc1LoHwhQ==
+ integrity: sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==
}
- '@headlessui/react@2.1.2':
+ '@geins/cms@0.3.6':
resolution:
{
- integrity: sha512-Kb3hgk9gRNRcTZktBrKdHhF3xFhYkca1Rk6e1/im2ENf83dgN54orMW0uSKTXFnUpZOUFZ+wcY05LlipwgZIFQ==
+ integrity: sha512-4o0xHpz3nLpj0LNPMb1Xvev52CtsNBBvl9BjlKqPMZLChk6nwWebCZvQ4caFFWPv3TRq4EEoZSIenBuhexLVVQ==
+ }
+
+ '@geins/core@0.3.6':
+ resolution:
+ {
+ integrity: sha512-+9epg57KrshyOGdTv02JXPp5wzyf/jcXEya0lBgZyoafRZ3FWxVq+vQ+m9bJT/C8R0ik1GChRP6jQaYQLvMd+g==
+ }
+
+ '@geins/types@0.3.6':
+ resolution:
+ {
+ integrity: sha512-01ubntt1hY20leZo45XQOvKn5P1h+XhzHvc+4XxZ8fRi4RIy1/+PpFgiJG+gUK321QGsjTkdall0Szwof2naSA==
+ }
+
+ '@graphql-typed-document-node/core@3.2.0':
+ resolution:
+ {
+ integrity: sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==
+ }
+ peerDependencies:
+ graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
+
+ '@headlessui/react@2.2.0':
+ resolution:
+ {
+ integrity: sha512-RzCEg+LXsuI7mHiSomsu/gBJSjpupm6A1qIZ5sWjd7JhARNlMiSA4kKfJpCKwU9tE+zMRterhhrP74PvfJrpXQ==
}
engines: { node: '>=10' }
peerDependencies:
- react: ^18
- react-dom: ^18
+ react: ^18 || ^19 || ^19.0.0-rc
+ react-dom: ^18 || ^19 || ^19.0.0-rc
- '@heroicons/react@2.1.5':
+ '@heroicons/react@2.2.0':
resolution:
{
- integrity: sha512-FuzFN+BsHa+7OxbvAERtgBTNeZpUjgM/MIizfVkSCL2/edriN0Hx/DWRCR//aPYwO5QX/YlgLGXk+E3PcfZwjA==
+ integrity: sha512-LMcepvRaS9LYHJGsF0zzmgKCUim/X3N/DQKc4jepAXJ7l8QxJ1PmxJzqplF2Z3FE4PqBAIGyJAQ/w4B5dsqbtQ==
}
peerDependencies:
- react: '>= 16'
+ react: '>= 16 || ^19.0.0-rc'
'@img/sharp-darwin-arm64@0.33.5':
resolution:
@@ -340,79 +406,79 @@ packages:
integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==
}
- '@next/env@15.0.0-rc.1':
+ '@next/env@15.0.3':
resolution:
{
- integrity: sha512-4neDwowyr+9DfgickGjNATp6Lm3rJ/Y83ulg8irVXUoN+mLikrInYSzFDnwpkflO/wokFR4z5A171RVPnapZ/Q==
+ integrity: sha512-t9Xy32pjNOvVn2AS+Utt6VmyrshbpfUMhIjFO60gI58deSo/KgLOp31XZ4O+kY/Is8WAGYwA5gR7kOb1eORDBA==
}
- '@next/swc-darwin-arm64@15.0.0-rc.1':
+ '@next/swc-darwin-arm64@15.0.3':
resolution:
{
- integrity: sha512-YqDdpE3vgcDSiq9oJcFp0YUsLXCfIa3BpAHOZnVfbXNPBz1JcDtIGFsoz2w6l5jmjU9+41l7oeagY8KAWtYdpA==
+ integrity: sha512-s3Q/NOorCsLYdCKvQlWU+a+GeAd3C8Rb3L1YnetsgwXzhc3UTWrtQpB/3eCjFOdGUj5QmXfRak12uocd1ZiiQw==
}
engines: { node: '>= 10' }
cpu: [arm64]
os: [darwin]
- '@next/swc-darwin-x64@15.0.0-rc.1':
+ '@next/swc-darwin-x64@15.0.3':
resolution:
{
- integrity: sha512-mM7rwGB9xuPM9dIAcInlmHpIOaFyBkOsUjj9ytUBANPNEqPkW8C06RITiPJ3toKAiocEcGdLuJeaYPS8MDgf6g==
+ integrity: sha512-Zxl/TwyXVZPCFSf0u2BNj5sE0F2uR6iSKxWpq4Wlk/Sv9Ob6YCKByQTkV2y6BCic+fkabp9190hyrDdPA/dNrw==
}
engines: { node: '>= 10' }
cpu: [x64]
os: [darwin]
- '@next/swc-linux-arm64-gnu@15.0.0-rc.1':
+ '@next/swc-linux-arm64-gnu@15.0.3':
resolution:
{
- integrity: sha512-4V3PSaqvjW00qac6Pd7rWAv+zE3HGXv02JAac7TpwOvNIYuneqUq82HLGZe9aZTDtT+zhOS2RnCUuXE7v3BO2Q==
+ integrity: sha512-T5+gg2EwpsY3OoaLxUIofmMb7ohAUlcNZW0fPQ6YAutaWJaxt1Z1h+8zdl4FRIOr5ABAAhXtBcpkZNwUcKI2fw==
}
engines: { node: '>= 10' }
cpu: [arm64]
os: [linux]
- '@next/swc-linux-arm64-musl@15.0.0-rc.1':
+ '@next/swc-linux-arm64-musl@15.0.3':
resolution:
{
- integrity: sha512-0xUM0jRNgezRT0F/wCMs2HJ5uuV/WDajYWWeBDSSOLKB8zfTMho+QiZtLqsGG1OjALIPttpKr1E2IDNWoUgXZQ==
+ integrity: sha512-WkAk6R60mwDjH4lG/JBpb2xHl2/0Vj0ZRu1TIzWuOYfQ9tt9NFsIinI1Epma77JVgy81F32X/AeD+B2cBu/YQA==
}
engines: { node: '>= 10' }
cpu: [arm64]
os: [linux]
- '@next/swc-linux-x64-gnu@15.0.0-rc.1':
+ '@next/swc-linux-x64-gnu@15.0.3':
resolution:
{
- integrity: sha512-xCusIy4TN9tS5CoZVk1bs6XUqSy1H6/BMco71/LA64oPKO/MsnFv6tbmzVlBKmriASCdedrgPlREE6AXVANRaA==
+ integrity: sha512-gWL/Cta1aPVqIGgDb6nxkqy06DkwJ9gAnKORdHWX1QBbSZZB+biFYPFti8aKIQL7otCE1pjyPaXpFzGeG2OS2w==
}
engines: { node: '>= 10' }
cpu: [x64]
os: [linux]
- '@next/swc-linux-x64-musl@15.0.0-rc.1':
+ '@next/swc-linux-x64-musl@15.0.3':
resolution:
{
- integrity: sha512-eNiz8+boojGEVkTJYOC1BzuT2Wl9Nqoz91rHkZityAW2kd4KpeMEuxXj5Y+IPoRQXRFDfOi39hw7qpj+Nt0LXg==
+ integrity: sha512-QQEMwFd8r7C0GxQS62Zcdy6GKx999I/rTO2ubdXEe+MlZk9ZiinsrjwoiBL5/57tfyjikgh6GOU2WRQVUej3UA==
}
engines: { node: '>= 10' }
cpu: [x64]
os: [linux]
- '@next/swc-win32-arm64-msvc@15.0.0-rc.1':
+ '@next/swc-win32-arm64-msvc@15.0.3':
resolution:
{
- integrity: sha512-KcH0BWiFqinwfb8dBbIvAT51oWmZqiGHoPOP8yjkEzJK2pVxwKm4mk4WM4Y17EgCSmfAtdT0xklM9bcAm3cD3Q==
+ integrity: sha512-9TEp47AAd/ms9fPNgtgnT7F3M1Hf7koIYYWCMQ9neOwjbVWJsHZxrFbI3iEDJ8rf1TDGpmHbKxXf2IFpAvheIQ==
}
engines: { node: '>= 10' }
cpu: [arm64]
os: [win32]
- '@next/swc-win32-x64-msvc@15.0.0-rc.1':
+ '@next/swc-win32-x64-msvc@15.0.3':
resolution:
{
- integrity: sha512-mkw4njN+kXYJo1/+V3BxogTwVXRDdHzxBO9gTEEZzZVnxXTdD5TMiPPQuH5hdkZxdcx3O0qhob3j7wdH7gaZ2A==
+ integrity: sha512-VNAz+HN4OGgvZs6MOoVfnn41kBzT+M+tB+OK4cww6DNyWS6wKaDpaAm/qLeOUbnMh0oVx1+mg0uoYARF69dJyA==
}
engines: { node: '>= 10' }
cpu: [x64]
@@ -446,54 +512,54 @@ packages:
}
engines: { node: '>=14' }
- '@react-aria/focus@3.18.1':
+ '@react-aria/focus@3.19.0':
resolution:
{
- integrity: sha512-N0Cy61WCIv+57mbqC7hiZAsB+3rF5n4JKabxUmg/2RTJL6lq7hJ5N4gx75ymKxkN8GnVDwt4pKZah48Wopa5jw==
+ integrity: sha512-hPF9EXoUQeQl1Y21/rbV2H4FdUR2v+4/I0/vB+8U3bT1CJ+1AFj1hc/rqx2DqEwDlEwOHN+E4+mRahQmlybq0A==
}
peerDependencies:
- react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
- '@react-aria/interactions@3.22.1':
+ '@react-aria/interactions@3.22.5':
resolution:
{
- integrity: sha512-5TLzQaDAQQ5C70yG8GInbO4wIylKY67RfTIIwQPGR/4n5OIjbUD8BOj3NuSsuZ/frUPaBXo1VEBBmSO23fxkjw==
+ integrity: sha512-kMwiAD9E0TQp+XNnOs13yVJghiy8ET8L0cbkeuTgNI96sOAp/63EJ1FSrDf17iD8sdjt41LafwX/dKXW9nCcLQ==
}
peerDependencies:
- react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
- '@react-aria/ssr@3.9.5':
+ '@react-aria/ssr@3.9.7':
resolution:
{
- integrity: sha512-xEwGKoysu+oXulibNUSkXf8itW0npHHTa6c4AyYeZIJyRoegeteYuFpZUBPtIDE8RfHdNsSmE1ssOkxRnwbkuQ==
+ integrity: sha512-GQygZaGlmYjmYM+tiNBA5C6acmiDWF52Nqd40bBp0Znk4M4hP+LTmI0lpI1BuKMw45T8RIhrAsICIfKwZvi2Gg==
}
engines: { node: '>= 12' }
peerDependencies:
- react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
- '@react-aria/utils@3.25.1':
+ '@react-aria/utils@3.26.0':
resolution:
{
- integrity: sha512-5Uj864e7T5+yj78ZfLnfHqmypLiqW2mN+nsdslog2z5ssunTqjolVeM15ootXskjISlZ7MojLpq97kIC4nlnAw==
+ integrity: sha512-LkZouGSjjQ0rEqo4XJosS4L3YC/zzQkfRM3KoqK6fUOmUJ9t0jQ09WjiF+uOoG9u+p30AVg3TrZRUWmoTS+koQ==
}
peerDependencies:
- react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
- '@react-stately/utils@3.10.2':
+ '@react-stately/utils@3.10.5':
resolution:
{
- integrity: sha512-fh6OTQtbeQC0ywp6LJuuKs6tKIgFvt/DlIZEcIpGho6/oZG229UnIk6TUekwxnDbumuYyan6D9EgUtEMmT8UIg==
+ integrity: sha512-iMQSGcpaecghDIh3mZEpZfoFH3ExBwTtuBEcvZ2XnGzCgQjeYXcMdIUwAfVQLXFTdHUHGF6Gu6/dFrYsCzySBQ==
}
peerDependencies:
- react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
- '@react-types/shared@3.24.1':
+ '@react-types/shared@3.26.0':
resolution:
{
- integrity: sha512-AUQeGYEm/zDTN6zLzdXolDxz3Jk5dDL7f506F07U8tBwxNNI3WRdhU84G0/AaFikOZzDXhOZDr3MhQMzyE7Ydw==
+ integrity: sha512-6FuPqvhmjjlpEDLTiYx29IJCbCNWPlsyO+ZUmCUXzhUv2ttShOXfw8CmeHWHftT/b2KweAWuzqSlfeXPR76jpw==
}
peerDependencies:
- react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
'@swc/counter@0.1.3':
resolution:
@@ -501,18 +567,18 @@ packages:
integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==
}
- '@swc/helpers@0.5.12':
- resolution:
- {
- integrity: sha512-KMZNXiGibsW9kvZAO1Pam2JPTDBm+KSHMMHWdsyI/1DbIZjT2A6Gy3hblVXUMEDvUAKq+e0vL0X0o54owWji7g==
- }
-
'@swc/helpers@0.5.13':
resolution:
{
integrity: sha512-UoKGxQ3r5kYI9dALKJapMmuK+1zWM/H17Z1+iwnNmzcJRnfFuevZs375TA5rW31pu4BS4NoSy1fRsexDXfWn5w==
}
+ '@swc/helpers@0.5.15':
+ resolution:
+ {
+ integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==
+ }
+
'@tailwindcss/container-queries@0.1.1':
resolution:
{
@@ -521,35 +587,69 @@ packages:
peerDependencies:
tailwindcss: '>=3.2.0'
- '@tailwindcss/typography@0.5.13':
+ '@tailwindcss/typography@0.5.15':
resolution:
{
- integrity: sha512-ADGcJ8dX21dVVHIwTRgzrcunY6YY9uSlAHHGVKvkA+vLc5qLwEszvKts40lx7z0qc4clpjclwLeK5rVCV2P/uw==
+ integrity: sha512-AqhlCXl+8grUz8uqExv5OTtgpjuVIwFTSXTrh8y9/pw6q2ek7fJ+Y8ZEVw7EB2DCcuCOtEjf9w3+J3rzts01uA==
}
peerDependencies:
- tailwindcss: '>=3.0.0 || insiders'
+ tailwindcss: '>=3.0.0 || insiders || >=4.0.0-alpha.20'
- '@tanstack/react-virtual@3.8.3':
+ '@tanstack/react-virtual@3.10.9':
resolution:
{
- integrity: sha512-9ICwbDUUzN99CJIGc373i8NLoj6zFTKI2Hlcmo0+lCSAhPQ5mxq4dGOMKmLYoEFyHcGQ64Bd6ZVbnPpM6lNK5w==
+ integrity: sha512-OXO2uBjFqA4Ibr2O3y0YMnkrRWGVNqcvHQXmGvMu6IK8chZl3PrDxFXdGZ2iZkSrKh3/qUYoFqYe+Rx23RoU0g==
}
peerDependencies:
react: ^16.8.0 || ^17.0.0 || ^18.0.0
react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0
- '@tanstack/virtual-core@3.8.3':
+ '@tanstack/virtual-core@3.10.9':
resolution:
{
- integrity: sha512-vd2A2TnM5lbnWZnHi9B+L2gPtkSeOtJOAw358JqokIH1+v2J7vUAzFVPwB/wrye12RFOurffXu33plm4uQ+JBQ==
+ integrity: sha512-kBknKOKzmeR7lN+vSadaKWXaLS0SZZG+oqpQ/k80Q6g9REn6zRHS/ZYdrIzHnpHgy/eWs00SujveUN/GJT2qTw==
}
- '@types/node@20.14.12':
+ '@types/cookie@0.3.3':
resolution:
{
- integrity: sha512-r7wNXakLeSsGT0H1AU863vS2wa5wBOK4bWMjZz2wj+8nBx+m5PeIn0k8AloSLpRuiwdRQZwarZqHE4FNArPuJQ==
+ integrity: sha512-LKVP3cgXBT9RYj+t+9FDKwS5tdI+rPBXaNSkma7hvqy35lc7mAokC2zsqWJH0LaqIt3B962nuYI77hsJoT1gow==
}
+ '@types/node@22.9.0':
+ resolution:
+ {
+ integrity: sha512-vuyHg81vvWA1Z1ELfvLko2c8f34gyA0zaic0+Rllc5lbCnbSyuvb2Oxpm6TAUAC/2xZN3QGqxBNggD1nNR2AfQ==
+ }
+
+ '@wry/caches@1.0.1':
+ resolution:
+ {
+ integrity: sha512-bXuaUNLVVkD20wcGBWRyo7j9N3TxePEWFZj2Y+r9OoUzfqmavM84+mFykRicNsBqatba5JLay1t48wxaXaWnlA==
+ }
+ engines: { node: '>=8' }
+
+ '@wry/context@0.7.4':
+ resolution:
+ {
+ integrity: sha512-jmT7Sb4ZQWI5iyu3lobQxICu2nC/vbUhP0vIdd6tHC9PTfenmRmuIFqktc6GH9cgi+ZHnsLWPvfSvc4DrYmKiQ==
+ }
+ engines: { node: '>=8' }
+
+ '@wry/equality@0.5.7':
+ resolution:
+ {
+ integrity: sha512-BRFORjsTuQv5gxcXsuDXx6oGRhuVsEGwZy6LOzRRfgu+eSfxbhUQ9L9YtSEIuIjY/o7g3iWFjrc5eSY1GXP2Dw==
+ }
+ engines: { node: '>=8' }
+
+ '@wry/trie@0.5.0':
+ resolution:
+ {
+ integrity: sha512-FNoYzHawTMk/6KMQoEG5O4PuioX19UbwdQKF44yw0nLfOypfQdjtfZzo/UIJWAJ23sNIFbD1Ug9lbaDGMwbqQA==
+ }
+ engines: { node: '>=8' }
+
ansi-regex@5.0.1:
resolution:
{
@@ -557,10 +657,10 @@ packages:
}
engines: { node: '>=8' }
- ansi-regex@6.0.1:
+ ansi-regex@6.1.0:
resolution:
{
- integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==
+ integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==
}
engines: { node: '>=12' }
@@ -597,10 +697,10 @@ packages:
integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==
}
- autoprefixer@10.4.19:
+ autoprefixer@10.4.20:
resolution:
{
- integrity: sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==
+ integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==
}
engines: { node: ^10 || ^12 || >=14 }
hasBin: true
@@ -633,10 +733,16 @@ packages:
}
engines: { node: '>=8' }
- browserslist@4.23.2:
+ broadcast-channel@7.0.0:
resolution:
{
- integrity: sha512-qkqSyistMYdxAcw+CzbZwlBy8AGmS/eEWs+sEV5TnLRGDOL+C5M2EnH6tlZyg0YoAxGJAFKh61En9BR941GnHA==
+ integrity: sha512-a2tW0Ia1pajcPBOGUF2jXlDnvE9d5/dg6BG9h60OmRUcZVr/veUrU8vEQFwwQIhwG3KVzYwSk3v2nRRGFgQDXQ==
+ }
+
+ browserslist@4.24.2:
+ resolution:
+ {
+ integrity: sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==
}
engines: { node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7 }
hasBin: true
@@ -655,10 +761,10 @@ packages:
}
engines: { node: '>= 6' }
- caniuse-lite@1.0.30001643:
+ caniuse-lite@1.0.30001684:
resolution:
{
- integrity: sha512-ERgWGNleEilSrHM6iUz/zJNSQTP8Mr21wDWpdgvRwcTXGAq6jMtOUPP4dqFPTdKqZ2wKTdtB+uucZ3MRpAUSmg==
+ integrity: sha512-G1LRwLIQjBQoyq0ZJGqGIJUXzJ8irpbjHLpVRXDvBEScFJ9b17sgK6vlx0GAJFE21okD7zXl08rRRUfq6HdoEQ==
}
chokidar@3.6.0:
@@ -674,6 +780,13 @@ packages:
integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==
}
+ clone@2.1.2:
+ resolution:
+ {
+ integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==
+ }
+ engines: { node: '>=0.8' }
+
clsx@2.1.1:
resolution:
{
@@ -714,10 +827,23 @@ packages:
}
engines: { node: '>= 6' }
- cross-spawn@7.0.3:
+ cookie-universal@2.2.2:
resolution:
{
- integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
+ integrity: sha512-nUXF6HH2YKbn8vGcdSzWJhjRkDHbnbekuVu2nsRu00zYsX7o/H3xGJRlPVoM4wX/8cpJYpyi9nDt+boER0Wjug==
+ }
+
+ cookie@0.4.2:
+ resolution:
+ {
+ integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==
+ }
+ engines: { node: '>= 0.6' }
+
+ cross-spawn@7.0.6:
+ resolution:
+ {
+ integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==
}
engines: { node: '>= 8' }
@@ -760,10 +886,10 @@ packages:
integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==
}
- electron-to-chromium@1.5.0:
+ electron-to-chromium@1.5.65:
resolution:
{
- integrity: sha512-Vb3xHHYnLseK8vlMJQKJYXJ++t4u1/qJ3vykuVrVjvdiOEhYyT1AuP4x03G8EnPmYvYOhe9T+dADTmthjRQMkA==
+ integrity: sha512-PWVzBjghx7/wop6n22vS2MLU8tKGd4Q91aCEGhG/TYmW6PP5OcSXcdnxTe1NNt0T66N8D6jxh4kC8UsdzOGaIw==
}
emoji-regex@8.0.0:
@@ -778,13 +904,19 @@ packages:
integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==
}
- escalade@3.1.2:
+ escalade@3.2.0:
resolution:
{
- integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==
+ integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==
}
engines: { node: '>=6' }
+ eventemitter3@4.0.7:
+ resolution:
+ {
+ integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==
+ }
+
fast-glob@3.3.2:
resolution:
{
@@ -805,10 +937,10 @@ packages:
}
engines: { node: '>=8' }
- foreground-child@3.2.1:
+ foreground-child@3.3.0:
resolution:
{
- integrity: sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==
+ integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==
}
engines: { node: '>=14' }
@@ -861,6 +993,22 @@ packages:
}
hasBin: true
+ graphql-tag@2.12.6:
+ resolution:
+ {
+ integrity: sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==
+ }
+ engines: { node: '>=10' }
+ peerDependencies:
+ graphql: ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0
+
+ graphql@16.9.0:
+ resolution:
+ {
+ integrity: sha512-GGTKBX4SD7Wdb8mqeDLni2oaRGYQWjWHGKPQ24ZMnUtKfcsVoiv4uX8+LJr1K6U5VW2Lu1BwJnj7uiori0YtRw==
+ }
+ engines: { node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0 }
+
hasown@2.0.2:
resolution:
{
@@ -868,6 +1016,12 @@ packages:
}
engines: { node: '>= 0.4' }
+ hoist-non-react-statics@3.3.2:
+ resolution:
+ {
+ integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==
+ }
+
is-arrayish@0.3.2:
resolution:
{
@@ -881,10 +1035,10 @@ packages:
}
engines: { node: '>=8' }
- is-core-module@2.15.0:
+ is-core-module@2.15.1:
resolution:
{
- integrity: sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==
+ integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==
}
engines: { node: '>= 0.4' }
@@ -935,6 +1089,12 @@ packages:
}
hasBin: true
+ js-tokens@4.0.0:
+ resolution:
+ {
+ integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
+ }
+
lilconfig@2.1.0:
resolution:
{
@@ -973,6 +1133,13 @@ packages:
integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
}
+ loose-envify@1.4.0:
+ resolution:
+ {
+ integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
+ }
+ hasBin: true
+
lru-cache@10.4.3:
resolution:
{
@@ -986,10 +1153,10 @@ packages:
}
engines: { node: '>= 8' }
- micromatch@4.0.7:
+ micromatch@4.0.8:
resolution:
{
- integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==
+ integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==
}
engines: { node: '>=8.6' }
@@ -1021,19 +1188,19 @@ packages:
engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 }
hasBin: true
- next@15.0.0-rc.1:
+ next@15.0.3:
resolution:
{
- integrity: sha512-MUoMUM7u6lh5zx1fRbze2jGESj4VIqc0dplx03wN5cLbpW3RhrVD7I3+sDW1khJxi+bayAZuGx03R5qNV9y/EA==
+ integrity: sha512-ontCbCRKJUIoivAdGB34yCaOcPgYXr9AAkV/IwqFfWWTXEPUgLYkSkqBhIk9KK7gGmgjc64B+RdoeIDM13Irnw==
}
- engines: { node: '>=18.18.0' }
+ engines: { node: ^18.18.0 || ^19.8.0 || >= 20.0.0 }
hasBin: true
peerDependencies:
'@opentelemetry/api': ^1.1.0
'@playwright/test': ^1.41.2
babel-plugin-react-compiler: '*'
- react: ^18.2.0 || 19.0.0-rc-cd22717c-20241013
- react-dom: ^18.2.0 || 19.0.0-rc-cd22717c-20241013
+ react: ^18.2.0 || 19.0.0-rc-66855b96-20241106
+ react-dom: ^18.2.0 || 19.0.0-rc-66855b96-20241106
sass: ^1.3.0
peerDependenciesMeta:
'@opentelemetry/api':
@@ -1045,6 +1212,13 @@ packages:
sass:
optional: true
+ node-cache@5.1.2:
+ resolution:
+ {
+ integrity: sha512-t1QzWwnk4sjLWaQAS8CHgOJ+RAfmHpxFWmc36IWTiWHQfs0w5JDMBS1b1ZxQteo0vVVuWJvIUKHDkkeK7vIGCg==
+ }
+ engines: { node: '>= 8.0.0' }
+
node-releases@2.0.18:
resolution:
{
@@ -1079,10 +1253,44 @@ packages:
}
engines: { node: '>= 6' }
- package-json-from-dist@1.0.0:
+ oblivious-set@1.4.0:
resolution:
{
- integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==
+ integrity: sha512-szyd0ou0T8nsAqHtprRcP3WidfsN1TnAR5yWXf2mFCEr5ek3LEOkT6EZ/92Xfs74HIdyhG5WkGxIssMU0jBaeg==
+ }
+ engines: { node: '>=16' }
+
+ optimism@0.18.1:
+ resolution:
+ {
+ integrity: sha512-mLXNwWPa9dgFyDqkNi54sjDyNJ9/fTI6WGBLgnXku1vdKY/jovHfZT5r+aiVeFFLOz+foPNOm5YJ4mqgld2GBQ==
+ }
+
+ p-finally@1.0.0:
+ resolution:
+ {
+ integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==
+ }
+ engines: { node: '>=4' }
+
+ p-queue@6.6.2:
+ resolution:
+ {
+ integrity: sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==
+ }
+ engines: { node: '>=8' }
+
+ p-timeout@3.2.0:
+ resolution:
+ {
+ integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==
+ }
+ engines: { node: '>=8' }
+
+ package-json-from-dist@1.0.1:
+ resolution:
+ {
+ integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==
}
path-key@3.1.1:
@@ -1105,10 +1313,10 @@ packages:
}
engines: { node: '>=16 || 14 >=14.18' }
- picocolors@1.0.1:
+ picocolors@1.1.1:
resolution:
{
- integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==
+ integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==
}
picomatch@2.3.1:
@@ -1181,10 +1389,10 @@ packages:
}
engines: { node: '>=4' }
- postcss-selector-parser@6.1.1:
+ postcss-selector-parser@6.1.2:
resolution:
{
- integrity: sha512-b4dlw/9V8A71rLIDsSwVmak9z2DuBUB7CA1/wSdelNEzqsjoSPeADTWNO09lpH49Diy3/JIZ2bSPB1dI3LJCHg==
+ integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==
}
engines: { node: '>=4' }
@@ -1201,17 +1409,17 @@ packages:
}
engines: { node: ^10 || ^12 || >=14 }
- postcss@8.4.39:
+ postcss@8.4.49:
resolution:
{
- integrity: sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==
+ integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==
}
engines: { node: ^10 || ^12 || >=14 }
- prettier-plugin-tailwindcss@0.6.5:
+ prettier-plugin-tailwindcss@0.6.9:
resolution:
{
- integrity: sha512-axfeOArc/RiGHjOIy9HytehlC0ZLeMaqY09mm8YCkMzznKiDkwFzOpBvtuhuv3xG5qB73+Mj7OCe2j/L1ryfuQ==
+ integrity: sha512-r0i3uhaZAXYP0At5xGfJH876W3HHGHDp+LCRUJrs57PBeQ6mYHMwr25KH8NPX44F2yGTvdnH7OqCshlQx183Eg==
}
engines: { node: '>=14.21.3' }
peerDependencies:
@@ -1226,6 +1434,7 @@ packages:
prettier-plugin-import-sort: '*'
prettier-plugin-jsdoc: '*'
prettier-plugin-marko: '*'
+ prettier-plugin-multiline-arrays: '*'
prettier-plugin-organize-attributes: '*'
prettier-plugin-organize-imports: '*'
prettier-plugin-sort-imports: '*'
@@ -1252,6 +1461,8 @@ packages:
optional: true
prettier-plugin-marko:
optional: true
+ prettier-plugin-multiline-arrays:
+ optional: true
prettier-plugin-organize-attributes:
optional: true
prettier-plugin-organize-imports:
@@ -1271,6 +1482,12 @@ packages:
engines: { node: '>=14' }
hasBin: true
+ prop-types@15.8.1:
+ resolution:
+ {
+ integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==
+ }
+
queue-microtask@1.2.3:
resolution:
{
@@ -1285,6 +1502,12 @@ packages:
peerDependencies:
react: 19.0.0-rc-cd22717c-20241013
+ react-is@16.13.1:
+ resolution:
+ {
+ integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
+ }
+
react@19.0.0-rc-cd22717c-20241013:
resolution:
{
@@ -1305,6 +1528,26 @@ packages:
}
engines: { node: '>=8.10.0' }
+ regenerator-runtime@0.14.1:
+ resolution:
+ {
+ integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==
+ }
+
+ rehackt@0.1.0:
+ resolution:
+ {
+ integrity: sha512-7kRDOuLHB87D/JESKxQoRwv4DzbIdwkAGQ7p6QKGdVlY1IZheUnVhlk/4UZlNUVxdAXpyxikE3URsG067ybVzw==
+ }
+ peerDependencies:
+ '@types/react': npm:types-react@19.0.0-rc.1
+ react: '*'
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ react:
+ optional: true
+
resolve@1.22.8:
resolution:
{
@@ -1312,6 +1555,13 @@ packages:
}
hasBin: true
+ response-iterator@0.2.6:
+ resolution:
+ {
+ integrity: sha512-pVzEEzrsg23Sh053rmDUvLSkGXluZio0qu8VT6ukrYuvtjVfCbDZH9d6PGXb8HZfzdNZt8feXv/jvUzlhRgLnw==
+ }
+ engines: { node: '>=0.8' }
+
reusify@1.0.4:
resolution:
{
@@ -1373,19 +1623,19 @@ packages:
integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==
}
- sonner@1.5.0:
+ sonner@1.7.0:
resolution:
{
- integrity: sha512-FBjhG/gnnbN6FY0jaNnqZOMmB73R+5IiyYAw8yBj7L54ER7HB3fOSE5OFiQiE2iXWxeXKvg6fIP4LtVppHEdJA==
+ integrity: sha512-W6dH7m5MujEPyug3lpI2l3TC3Pp1+LTgK0Efg+IHDrBbtEjyCmCHHo6yfNBOsf1tFZ6zf+jceWwB38baC8yO9g==
}
peerDependencies:
- react: ^18.0.0
- react-dom: ^18.0.0
+ react: ^18.0.0 || ^19.0.0 || ^19.0.0-rc
+ react-dom: ^18.0.0 || ^19.0.0 || ^19.0.0-rc
- source-map-js@1.2.0:
+ source-map-js@1.2.1:
resolution:
{
- integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==
+ integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==
}
engines: { node: '>=0.10.0' }
@@ -1455,16 +1705,23 @@ packages:
}
engines: { node: '>= 0.4' }
+ symbol-observable@4.0.0:
+ resolution:
+ {
+ integrity: sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==
+ }
+ engines: { node: '>=0.10' }
+
tabbable@6.2.0:
resolution:
{
integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==
}
- tailwindcss@3.4.6:
+ tailwindcss@3.4.15:
resolution:
{
- integrity: sha512-1uRHzPB+Vzu57ocybfZ4jh5Q3SdlH7XW23J5sQoM9LhE9eIOlzxer/3XPSsycvih3rboRsvt0QCmzSrqyOYUIA==
+ integrity: sha512-r4MeXnfBmSOuKUWmXe6h2CcyfzJCEk4F0pptO5jlnYSIViUkVmsawj80N5h2lO3gwcmSb4n3PuN+e+GC1Guylw==
}
engines: { node: '>=14.0.0' }
hasBin: true
@@ -1495,10 +1752,17 @@ packages:
integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==
}
- tslib@2.6.3:
+ ts-invariant@0.10.3:
resolution:
{
- integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==
+ integrity: sha512-uivwYcQaxAucv1CzRp2n/QdYPo4ILf9VXgH19zEIjFx2EJufV16P0JtJVpYHy89DItG6Kwj2oIUjrcK5au+4tQ==
+ }
+ engines: { node: '>=8' }
+
+ tslib@2.8.1:
+ resolution:
+ {
+ integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==
}
types-react-dom@19.0.0-rc.1:
@@ -1521,16 +1785,22 @@ packages:
engines: { node: '>=14.17' }
hasBin: true
- undici-types@5.26.5:
+ undici-types@6.19.8:
resolution:
{
- integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==
+ integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==
}
- update-browserslist-db@1.1.0:
+ unload@2.4.1:
resolution:
{
- integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==
+ integrity: sha512-IViSAm8Z3sRBYA+9wc0fLQmU9Nrxb16rcDmIiR6Y9LJSZzI7QY5QsDhqPpKOjAn0O9/kfK1TfNEMMAGPTIraPw==
+ }
+
+ update-browserslist-db@1.1.1:
+ resolution:
+ {
+ integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==
}
hasBin: true
peerDependencies:
@@ -1564,57 +1834,128 @@ packages:
}
engines: { node: '>=12' }
- yaml@2.5.0:
+ yaml@2.6.1:
resolution:
{
- integrity: sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==
+ integrity: sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==
}
engines: { node: '>= 14' }
hasBin: true
+ zen-observable-ts@1.2.5:
+ resolution:
+ {
+ integrity: sha512-QZWQekv6iB72Naeake9hS1KxHlotfRpe+WGNbNx5/ta+R3DNjVO2bswf63gXlWDcs+EMd7XY8HfVQyP1X6T4Zg==
+ }
+
+ zen-observable@0.8.15:
+ resolution:
+ {
+ integrity: sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==
+ }
+
snapshots:
'@alloc/quick-lru@5.2.0': {}
- '@emnapi/runtime@1.2.0':
+ '@apollo/client@3.11.10(graphql@16.9.0)(react-dom@19.0.0-rc-cd22717c-20241013(react@19.0.0-rc-cd22717c-20241013))(react@19.0.0-rc-cd22717c-20241013)(types-react@19.0.0-rc.1)':
dependencies:
- tslib: 2.6.3
+ '@graphql-typed-document-node/core': 3.2.0(graphql@16.9.0)
+ '@wry/caches': 1.0.1
+ '@wry/equality': 0.5.7
+ '@wry/trie': 0.5.0
+ graphql: 16.9.0
+ graphql-tag: 2.12.6(graphql@16.9.0)
+ hoist-non-react-statics: 3.3.2
+ optimism: 0.18.1
+ prop-types: 15.8.1
+ rehackt: 0.1.0(react@19.0.0-rc-cd22717c-20241013)(types-react@19.0.0-rc.1)
+ response-iterator: 0.2.6
+ symbol-observable: 4.0.0
+ ts-invariant: 0.10.3
+ tslib: 2.8.1
+ zen-observable-ts: 1.2.5
+ optionalDependencies:
+ react: 19.0.0-rc-cd22717c-20241013
+ react-dom: 19.0.0-rc-cd22717c-20241013(react@19.0.0-rc-cd22717c-20241013)
+ transitivePeerDependencies:
+ - '@types/react'
+
+ '@babel/runtime@7.23.4':
+ dependencies:
+ regenerator-runtime: 0.14.1
+
+ '@emnapi/runtime@1.3.1':
+ dependencies:
+ tslib: 2.8.1
optional: true
- '@floating-ui/core@1.6.5':
+ '@floating-ui/core@1.6.8':
dependencies:
- '@floating-ui/utils': 0.2.5
+ '@floating-ui/utils': 0.2.8
- '@floating-ui/dom@1.6.8':
+ '@floating-ui/dom@1.6.12':
dependencies:
- '@floating-ui/core': 1.6.5
- '@floating-ui/utils': 0.2.5
+ '@floating-ui/core': 1.6.8
+ '@floating-ui/utils': 0.2.8
- '@floating-ui/react-dom@2.1.1(react-dom@19.0.0-rc-cd22717c-20241013(react@19.0.0-rc-cd22717c-20241013))(react@19.0.0-rc-cd22717c-20241013)':
+ '@floating-ui/react-dom@2.1.2(react-dom@19.0.0-rc-cd22717c-20241013(react@19.0.0-rc-cd22717c-20241013))(react@19.0.0-rc-cd22717c-20241013)':
dependencies:
- '@floating-ui/dom': 1.6.8
+ '@floating-ui/dom': 1.6.12
react: 19.0.0-rc-cd22717c-20241013
react-dom: 19.0.0-rc-cd22717c-20241013(react@19.0.0-rc-cd22717c-20241013)
- '@floating-ui/react@0.26.20(react-dom@19.0.0-rc-cd22717c-20241013(react@19.0.0-rc-cd22717c-20241013))(react@19.0.0-rc-cd22717c-20241013)':
+ '@floating-ui/react@0.26.28(react-dom@19.0.0-rc-cd22717c-20241013(react@19.0.0-rc-cd22717c-20241013))(react@19.0.0-rc-cd22717c-20241013)':
dependencies:
- '@floating-ui/react-dom': 2.1.1(react-dom@19.0.0-rc-cd22717c-20241013(react@19.0.0-rc-cd22717c-20241013))(react@19.0.0-rc-cd22717c-20241013)
- '@floating-ui/utils': 0.2.5
+ '@floating-ui/react-dom': 2.1.2(react-dom@19.0.0-rc-cd22717c-20241013(react@19.0.0-rc-cd22717c-20241013))(react@19.0.0-rc-cd22717c-20241013)
+ '@floating-ui/utils': 0.2.8
react: 19.0.0-rc-cd22717c-20241013
react-dom: 19.0.0-rc-cd22717c-20241013(react@19.0.0-rc-cd22717c-20241013)
tabbable: 6.2.0
- '@floating-ui/utils@0.2.5': {}
+ '@floating-ui/utils@0.2.8': {}
- '@headlessui/react@2.1.2(react-dom@19.0.0-rc-cd22717c-20241013(react@19.0.0-rc-cd22717c-20241013))(react@19.0.0-rc-cd22717c-20241013)':
+ '@geins/cms@0.3.6(react-dom@19.0.0-rc-cd22717c-20241013(react@19.0.0-rc-cd22717c-20241013))(react@19.0.0-rc-cd22717c-20241013)(types-react@19.0.0-rc.1)':
dependencies:
- '@floating-ui/react': 0.26.20(react-dom@19.0.0-rc-cd22717c-20241013(react@19.0.0-rc-cd22717c-20241013))(react@19.0.0-rc-cd22717c-20241013)
- '@react-aria/focus': 3.18.1(react@19.0.0-rc-cd22717c-20241013)
- '@react-aria/interactions': 3.22.1(react@19.0.0-rc-cd22717c-20241013)
- '@tanstack/react-virtual': 3.8.3(react-dom@19.0.0-rc-cd22717c-20241013(react@19.0.0-rc-cd22717c-20241013))(react@19.0.0-rc-cd22717c-20241013)
+ '@apollo/client': 3.11.10(graphql@16.9.0)(react-dom@19.0.0-rc-cd22717c-20241013(react@19.0.0-rc-cd22717c-20241013))(react@19.0.0-rc-cd22717c-20241013)(types-react@19.0.0-rc.1)
+ '@geins/core': 0.3.6(react-dom@19.0.0-rc-cd22717c-20241013(react@19.0.0-rc-cd22717c-20241013))(react@19.0.0-rc-cd22717c-20241013)(types-react@19.0.0-rc.1)
+ graphql: 16.9.0
+ transitivePeerDependencies:
+ - '@types/react'
+ - graphql-ws
+ - react
+ - react-dom
+ - subscriptions-transport-ws
+
+ '@geins/core@0.3.6(react-dom@19.0.0-rc-cd22717c-20241013(react@19.0.0-rc-cd22717c-20241013))(react@19.0.0-rc-cd22717c-20241013)(types-react@19.0.0-rc.1)':
+ dependencies:
+ '@apollo/client': 3.11.10(graphql@16.9.0)(react-dom@19.0.0-rc-cd22717c-20241013(react@19.0.0-rc-cd22717c-20241013))(react@19.0.0-rc-cd22717c-20241013)(types-react@19.0.0-rc.1)
+ broadcast-channel: 7.0.0
+ cookie-universal: 2.2.2
+ graphql: 16.9.0
+ node-cache: 5.1.2
+ transitivePeerDependencies:
+ - '@types/react'
+ - graphql-ws
+ - react
+ - react-dom
+ - subscriptions-transport-ws
+
+ '@geins/types@0.3.6': {}
+
+ '@graphql-typed-document-node/core@3.2.0(graphql@16.9.0)':
+ dependencies:
+ graphql: 16.9.0
+
+ '@headlessui/react@2.2.0(react-dom@19.0.0-rc-cd22717c-20241013(react@19.0.0-rc-cd22717c-20241013))(react@19.0.0-rc-cd22717c-20241013)':
+ dependencies:
+ '@floating-ui/react': 0.26.28(react-dom@19.0.0-rc-cd22717c-20241013(react@19.0.0-rc-cd22717c-20241013))(react@19.0.0-rc-cd22717c-20241013)
+ '@react-aria/focus': 3.19.0(react@19.0.0-rc-cd22717c-20241013)
+ '@react-aria/interactions': 3.22.5(react@19.0.0-rc-cd22717c-20241013)
+ '@tanstack/react-virtual': 3.10.9(react-dom@19.0.0-rc-cd22717c-20241013(react@19.0.0-rc-cd22717c-20241013))(react@19.0.0-rc-cd22717c-20241013)
react: 19.0.0-rc-cd22717c-20241013
react-dom: 19.0.0-rc-cd22717c-20241013(react@19.0.0-rc-cd22717c-20241013)
- '@heroicons/react@2.1.5(react@19.0.0-rc-cd22717c-20241013)':
+ '@heroicons/react@2.2.0(react@19.0.0-rc-cd22717c-20241013)':
dependencies:
react: 19.0.0-rc-cd22717c-20241013
@@ -1684,7 +2025,7 @@ snapshots:
'@img/sharp-wasm32@0.33.5':
dependencies:
- '@emnapi/runtime': 1.2.0
+ '@emnapi/runtime': 1.3.1
optional: true
'@img/sharp-win32-ia32@0.33.5':
@@ -1719,30 +2060,30 @@ snapshots:
'@jridgewell/resolve-uri': 3.1.2
'@jridgewell/sourcemap-codec': 1.5.0
- '@next/env@15.0.0-rc.1': {}
+ '@next/env@15.0.3': {}
- '@next/swc-darwin-arm64@15.0.0-rc.1':
+ '@next/swc-darwin-arm64@15.0.3':
optional: true
- '@next/swc-darwin-x64@15.0.0-rc.1':
+ '@next/swc-darwin-x64@15.0.3':
optional: true
- '@next/swc-linux-arm64-gnu@15.0.0-rc.1':
+ '@next/swc-linux-arm64-gnu@15.0.3':
optional: true
- '@next/swc-linux-arm64-musl@15.0.0-rc.1':
+ '@next/swc-linux-arm64-musl@15.0.3':
optional: true
- '@next/swc-linux-x64-gnu@15.0.0-rc.1':
+ '@next/swc-linux-x64-gnu@15.0.3':
optional: true
- '@next/swc-linux-x64-musl@15.0.0-rc.1':
+ '@next/swc-linux-x64-musl@15.0.3':
optional: true
- '@next/swc-win32-arm64-msvc@15.0.0-rc.1':
+ '@next/swc-win32-arm64-msvc@15.0.3':
optional: true
- '@next/swc-win32-x64-msvc@15.0.0-rc.1':
+ '@next/swc-win32-x64-msvc@15.0.3':
optional: true
'@nodelib/fs.scandir@2.1.5':
@@ -1760,83 +2101,101 @@ snapshots:
'@pkgjs/parseargs@0.11.0':
optional: true
- '@react-aria/focus@3.18.1(react@19.0.0-rc-cd22717c-20241013)':
+ '@react-aria/focus@3.19.0(react@19.0.0-rc-cd22717c-20241013)':
dependencies:
- '@react-aria/interactions': 3.22.1(react@19.0.0-rc-cd22717c-20241013)
- '@react-aria/utils': 3.25.1(react@19.0.0-rc-cd22717c-20241013)
- '@react-types/shared': 3.24.1(react@19.0.0-rc-cd22717c-20241013)
- '@swc/helpers': 0.5.12
+ '@react-aria/interactions': 3.22.5(react@19.0.0-rc-cd22717c-20241013)
+ '@react-aria/utils': 3.26.0(react@19.0.0-rc-cd22717c-20241013)
+ '@react-types/shared': 3.26.0(react@19.0.0-rc-cd22717c-20241013)
+ '@swc/helpers': 0.5.15
clsx: 2.1.1
react: 19.0.0-rc-cd22717c-20241013
- '@react-aria/interactions@3.22.1(react@19.0.0-rc-cd22717c-20241013)':
+ '@react-aria/interactions@3.22.5(react@19.0.0-rc-cd22717c-20241013)':
dependencies:
- '@react-aria/ssr': 3.9.5(react@19.0.0-rc-cd22717c-20241013)
- '@react-aria/utils': 3.25.1(react@19.0.0-rc-cd22717c-20241013)
- '@react-types/shared': 3.24.1(react@19.0.0-rc-cd22717c-20241013)
- '@swc/helpers': 0.5.12
+ '@react-aria/ssr': 3.9.7(react@19.0.0-rc-cd22717c-20241013)
+ '@react-aria/utils': 3.26.0(react@19.0.0-rc-cd22717c-20241013)
+ '@react-types/shared': 3.26.0(react@19.0.0-rc-cd22717c-20241013)
+ '@swc/helpers': 0.5.15
react: 19.0.0-rc-cd22717c-20241013
- '@react-aria/ssr@3.9.5(react@19.0.0-rc-cd22717c-20241013)':
+ '@react-aria/ssr@3.9.7(react@19.0.0-rc-cd22717c-20241013)':
dependencies:
- '@swc/helpers': 0.5.12
+ '@swc/helpers': 0.5.15
react: 19.0.0-rc-cd22717c-20241013
- '@react-aria/utils@3.25.1(react@19.0.0-rc-cd22717c-20241013)':
+ '@react-aria/utils@3.26.0(react@19.0.0-rc-cd22717c-20241013)':
dependencies:
- '@react-aria/ssr': 3.9.5(react@19.0.0-rc-cd22717c-20241013)
- '@react-stately/utils': 3.10.2(react@19.0.0-rc-cd22717c-20241013)
- '@react-types/shared': 3.24.1(react@19.0.0-rc-cd22717c-20241013)
- '@swc/helpers': 0.5.12
+ '@react-aria/ssr': 3.9.7(react@19.0.0-rc-cd22717c-20241013)
+ '@react-stately/utils': 3.10.5(react@19.0.0-rc-cd22717c-20241013)
+ '@react-types/shared': 3.26.0(react@19.0.0-rc-cd22717c-20241013)
+ '@swc/helpers': 0.5.15
clsx: 2.1.1
react: 19.0.0-rc-cd22717c-20241013
- '@react-stately/utils@3.10.2(react@19.0.0-rc-cd22717c-20241013)':
+ '@react-stately/utils@3.10.5(react@19.0.0-rc-cd22717c-20241013)':
dependencies:
- '@swc/helpers': 0.5.12
+ '@swc/helpers': 0.5.15
react: 19.0.0-rc-cd22717c-20241013
- '@react-types/shared@3.24.1(react@19.0.0-rc-cd22717c-20241013)':
+ '@react-types/shared@3.26.0(react@19.0.0-rc-cd22717c-20241013)':
dependencies:
react: 19.0.0-rc-cd22717c-20241013
'@swc/counter@0.1.3': {}
- '@swc/helpers@0.5.12':
- dependencies:
- tslib: 2.6.3
-
'@swc/helpers@0.5.13':
dependencies:
- tslib: 2.6.3
+ tslib: 2.8.1
- '@tailwindcss/container-queries@0.1.1(tailwindcss@3.4.6)':
+ '@swc/helpers@0.5.15':
dependencies:
- tailwindcss: 3.4.6
+ tslib: 2.8.1
- '@tailwindcss/typography@0.5.13(tailwindcss@3.4.6)':
+ '@tailwindcss/container-queries@0.1.1(tailwindcss@3.4.15)':
+ dependencies:
+ tailwindcss: 3.4.15
+
+ '@tailwindcss/typography@0.5.15(tailwindcss@3.4.15)':
dependencies:
lodash.castarray: 4.4.0
lodash.isplainobject: 4.0.6
lodash.merge: 4.6.2
postcss-selector-parser: 6.0.10
- tailwindcss: 3.4.6
+ tailwindcss: 3.4.15
- '@tanstack/react-virtual@3.8.3(react-dom@19.0.0-rc-cd22717c-20241013(react@19.0.0-rc-cd22717c-20241013))(react@19.0.0-rc-cd22717c-20241013)':
+ '@tanstack/react-virtual@3.10.9(react-dom@19.0.0-rc-cd22717c-20241013(react@19.0.0-rc-cd22717c-20241013))(react@19.0.0-rc-cd22717c-20241013)':
dependencies:
- '@tanstack/virtual-core': 3.8.3
+ '@tanstack/virtual-core': 3.10.9
react: 19.0.0-rc-cd22717c-20241013
react-dom: 19.0.0-rc-cd22717c-20241013(react@19.0.0-rc-cd22717c-20241013)
- '@tanstack/virtual-core@3.8.3': {}
+ '@tanstack/virtual-core@3.10.9': {}
- '@types/node@20.14.12':
+ '@types/cookie@0.3.3': {}
+
+ '@types/node@22.9.0':
dependencies:
- undici-types: 5.26.5
+ undici-types: 6.19.8
+
+ '@wry/caches@1.0.1':
+ dependencies:
+ tslib: 2.8.1
+
+ '@wry/context@0.7.4':
+ dependencies:
+ tslib: 2.8.1
+
+ '@wry/equality@0.5.7':
+ dependencies:
+ tslib: 2.8.1
+
+ '@wry/trie@0.5.0':
+ dependencies:
+ tslib: 2.8.1
ansi-regex@5.0.1: {}
- ansi-regex@6.0.1: {}
+ ansi-regex@6.1.0: {}
ansi-styles@4.3.0:
dependencies:
@@ -1853,14 +2212,14 @@ snapshots:
arg@5.0.2: {}
- autoprefixer@10.4.19(postcss@8.4.39):
+ autoprefixer@10.4.20(postcss@8.4.49):
dependencies:
- browserslist: 4.23.2
- caniuse-lite: 1.0.30001643
+ browserslist: 4.24.2
+ caniuse-lite: 1.0.30001684
fraction.js: 4.3.7
normalize-range: 0.1.2
- picocolors: 1.0.1
- postcss: 8.4.39
+ picocolors: 1.1.1
+ postcss: 8.4.49
postcss-value-parser: 4.2.0
balanced-match@1.0.2: {}
@@ -1875,12 +2234,19 @@ snapshots:
dependencies:
fill-range: 7.1.1
- browserslist@4.23.2:
+ broadcast-channel@7.0.0:
dependencies:
- caniuse-lite: 1.0.30001643
- electron-to-chromium: 1.5.0
+ '@babel/runtime': 7.23.4
+ oblivious-set: 1.4.0
+ p-queue: 6.6.2
+ unload: 2.4.1
+
+ browserslist@4.24.2:
+ dependencies:
+ caniuse-lite: 1.0.30001684
+ electron-to-chromium: 1.5.65
node-releases: 2.0.18
- update-browserslist-db: 1.1.0(browserslist@4.23.2)
+ update-browserslist-db: 1.1.1(browserslist@4.24.2)
busboy@1.6.0:
dependencies:
@@ -1888,7 +2254,7 @@ snapshots:
camelcase-css@2.0.1: {}
- caniuse-lite@1.0.30001643: {}
+ caniuse-lite@1.0.30001684: {}
chokidar@3.6.0:
dependencies:
@@ -1904,6 +2270,8 @@ snapshots:
client-only@0.0.1: {}
+ clone@2.1.2: {}
+
clsx@2.1.1: {}
color-convert@2.0.1:
@@ -1926,7 +2294,14 @@ snapshots:
commander@4.1.1: {}
- cross-spawn@7.0.3:
+ cookie-universal@2.2.2:
+ dependencies:
+ '@types/cookie': 0.3.3
+ cookie: 0.4.2
+
+ cookie@0.4.2: {}
+
+ cross-spawn@7.0.6:
dependencies:
path-key: 3.1.1
shebang-command: 2.0.0
@@ -1945,13 +2320,15 @@ snapshots:
eastasianwidth@0.2.0: {}
- electron-to-chromium@1.5.0: {}
+ electron-to-chromium@1.5.65: {}
emoji-regex@8.0.0: {}
emoji-regex@9.2.2: {}
- escalade@3.1.2: {}
+ escalade@3.2.0: {}
+
+ eventemitter3@4.0.7: {}
fast-glob@3.3.2:
dependencies:
@@ -1959,7 +2336,7 @@ snapshots:
'@nodelib/fs.walk': 1.2.8
glob-parent: 5.1.2
merge2: 1.4.1
- micromatch: 4.0.7
+ micromatch: 4.0.8
fastq@1.17.1:
dependencies:
@@ -1969,9 +2346,9 @@ snapshots:
dependencies:
to-regex-range: 5.0.1
- foreground-child@3.2.1:
+ foreground-child@3.3.0:
dependencies:
- cross-spawn: 7.0.3
+ cross-spawn: 7.0.6
signal-exit: 4.1.0
fraction.js@4.3.7: {}
@@ -1981,9 +2358,9 @@ snapshots:
function-bind@1.1.2: {}
- geist@1.3.1(next@15.0.0-rc.1(react-dom@19.0.0-rc-cd22717c-20241013(react@19.0.0-rc-cd22717c-20241013))(react@19.0.0-rc-cd22717c-20241013)):
+ geist@1.3.1(next@15.0.3(react-dom@19.0.0-rc-cd22717c-20241013(react@19.0.0-rc-cd22717c-20241013))(react@19.0.0-rc-cd22717c-20241013)):
dependencies:
- next: 15.0.0-rc.1(react-dom@19.0.0-rc-cd22717c-20241013(react@19.0.0-rc-cd22717c-20241013))(react@19.0.0-rc-cd22717c-20241013)
+ next: 15.0.3(react-dom@19.0.0-rc-cd22717c-20241013(react@19.0.0-rc-cd22717c-20241013))(react@19.0.0-rc-cd22717c-20241013)
glob-parent@5.1.2:
dependencies:
@@ -1995,17 +2372,28 @@ snapshots:
glob@10.4.5:
dependencies:
- foreground-child: 3.2.1
+ foreground-child: 3.3.0
jackspeak: 3.4.3
minimatch: 9.0.5
minipass: 7.1.2
- package-json-from-dist: 1.0.0
+ package-json-from-dist: 1.0.1
path-scurry: 1.11.1
+ graphql-tag@2.12.6(graphql@16.9.0):
+ dependencies:
+ graphql: 16.9.0
+ tslib: 2.8.1
+
+ graphql@16.9.0: {}
+
hasown@2.0.2:
dependencies:
function-bind: 1.1.2
+ hoist-non-react-statics@3.3.2:
+ dependencies:
+ react-is: 16.13.1
+
is-arrayish@0.3.2:
optional: true
@@ -2013,7 +2401,7 @@ snapshots:
dependencies:
binary-extensions: 2.3.0
- is-core-module@2.15.0:
+ is-core-module@2.15.1:
dependencies:
hasown: 2.0.2
@@ -2037,6 +2425,8 @@ snapshots:
jiti@1.21.6: {}
+ js-tokens@4.0.0: {}
+
lilconfig@2.1.0: {}
lilconfig@3.1.2: {}
@@ -2049,11 +2439,15 @@ snapshots:
lodash.merge@4.6.2: {}
+ loose-envify@1.4.0:
+ dependencies:
+ js-tokens: 4.0.0
+
lru-cache@10.4.3: {}
merge2@1.4.1: {}
- micromatch@4.0.7:
+ micromatch@4.0.8:
dependencies:
braces: 3.0.3
picomatch: 2.3.1
@@ -2072,31 +2466,35 @@ snapshots:
nanoid@3.3.7: {}
- next@15.0.0-rc.1(react-dom@19.0.0-rc-cd22717c-20241013(react@19.0.0-rc-cd22717c-20241013))(react@19.0.0-rc-cd22717c-20241013):
+ next@15.0.3(react-dom@19.0.0-rc-cd22717c-20241013(react@19.0.0-rc-cd22717c-20241013))(react@19.0.0-rc-cd22717c-20241013):
dependencies:
- '@next/env': 15.0.0-rc.1
+ '@next/env': 15.0.3
'@swc/counter': 0.1.3
'@swc/helpers': 0.5.13
busboy: 1.6.0
- caniuse-lite: 1.0.30001643
+ caniuse-lite: 1.0.30001684
postcss: 8.4.31
react: 19.0.0-rc-cd22717c-20241013
react-dom: 19.0.0-rc-cd22717c-20241013(react@19.0.0-rc-cd22717c-20241013)
styled-jsx: 5.1.6(react@19.0.0-rc-cd22717c-20241013)
optionalDependencies:
- '@next/swc-darwin-arm64': 15.0.0-rc.1
- '@next/swc-darwin-x64': 15.0.0-rc.1
- '@next/swc-linux-arm64-gnu': 15.0.0-rc.1
- '@next/swc-linux-arm64-musl': 15.0.0-rc.1
- '@next/swc-linux-x64-gnu': 15.0.0-rc.1
- '@next/swc-linux-x64-musl': 15.0.0-rc.1
- '@next/swc-win32-arm64-msvc': 15.0.0-rc.1
- '@next/swc-win32-x64-msvc': 15.0.0-rc.1
+ '@next/swc-darwin-arm64': 15.0.3
+ '@next/swc-darwin-x64': 15.0.3
+ '@next/swc-linux-arm64-gnu': 15.0.3
+ '@next/swc-linux-arm64-musl': 15.0.3
+ '@next/swc-linux-x64-gnu': 15.0.3
+ '@next/swc-linux-x64-musl': 15.0.3
+ '@next/swc-win32-arm64-msvc': 15.0.3
+ '@next/swc-win32-x64-msvc': 15.0.3
sharp: 0.33.5
transitivePeerDependencies:
- '@babel/core'
- babel-plugin-macros
+ node-cache@5.1.2:
+ dependencies:
+ clone: 2.1.2
+
node-releases@2.0.18: {}
normalize-path@3.0.0: {}
@@ -2107,7 +2505,27 @@ snapshots:
object-hash@3.0.0: {}
- package-json-from-dist@1.0.0: {}
+ oblivious-set@1.4.0: {}
+
+ optimism@0.18.1:
+ dependencies:
+ '@wry/caches': 1.0.1
+ '@wry/context': 0.7.4
+ '@wry/trie': 0.5.0
+ tslib: 2.8.1
+
+ p-finally@1.0.0: {}
+
+ p-queue@6.6.2:
+ dependencies:
+ eventemitter3: 4.0.7
+ p-timeout: 3.2.0
+
+ p-timeout@3.2.0:
+ dependencies:
+ p-finally: 1.0.0
+
+ package-json-from-dist@1.0.1: {}
path-key@3.1.1: {}
@@ -2118,7 +2536,7 @@ snapshots:
lru-cache: 10.4.3
minipass: 7.1.2
- picocolors@1.0.1: {}
+ picocolors@1.1.1: {}
picomatch@2.3.1: {}
@@ -2126,36 +2544,36 @@ snapshots:
pirates@4.0.6: {}
- postcss-import@15.1.0(postcss@8.4.39):
+ postcss-import@15.1.0(postcss@8.4.49):
dependencies:
- postcss: 8.4.39
+ postcss: 8.4.49
postcss-value-parser: 4.2.0
read-cache: 1.0.0
resolve: 1.22.8
- postcss-js@4.0.1(postcss@8.4.39):
+ postcss-js@4.0.1(postcss@8.4.49):
dependencies:
camelcase-css: 2.0.1
- postcss: 8.4.39
+ postcss: 8.4.49
- postcss-load-config@4.0.2(postcss@8.4.39):
+ postcss-load-config@4.0.2(postcss@8.4.49):
dependencies:
lilconfig: 3.1.2
- yaml: 2.5.0
+ yaml: 2.6.1
optionalDependencies:
- postcss: 8.4.39
+ postcss: 8.4.49
- postcss-nested@6.2.0(postcss@8.4.39):
+ postcss-nested@6.2.0(postcss@8.4.49):
dependencies:
- postcss: 8.4.39
- postcss-selector-parser: 6.1.1
+ postcss: 8.4.49
+ postcss-selector-parser: 6.1.2
postcss-selector-parser@6.0.10:
dependencies:
cssesc: 3.0.0
util-deprecate: 1.0.2
- postcss-selector-parser@6.1.1:
+ postcss-selector-parser@6.1.2:
dependencies:
cssesc: 3.0.0
util-deprecate: 1.0.2
@@ -2165,21 +2583,27 @@ snapshots:
postcss@8.4.31:
dependencies:
nanoid: 3.3.7
- picocolors: 1.0.1
- source-map-js: 1.2.0
+ picocolors: 1.1.1
+ source-map-js: 1.2.1
- postcss@8.4.39:
+ postcss@8.4.49:
dependencies:
nanoid: 3.3.7
- picocolors: 1.0.1
- source-map-js: 1.2.0
+ picocolors: 1.1.1
+ source-map-js: 1.2.1
- prettier-plugin-tailwindcss@0.6.5(prettier@3.3.3):
+ prettier-plugin-tailwindcss@0.6.9(prettier@3.3.3):
dependencies:
prettier: 3.3.3
prettier@3.3.3: {}
+ prop-types@15.8.1:
+ dependencies:
+ loose-envify: 1.4.0
+ object-assign: 4.1.1
+ react-is: 16.13.1
+
queue-microtask@1.2.3: {}
react-dom@19.0.0-rc-cd22717c-20241013(react@19.0.0-rc-cd22717c-20241013):
@@ -2187,6 +2611,8 @@ snapshots:
react: 19.0.0-rc-cd22717c-20241013
scheduler: 0.25.0-rc-cd22717c-20241013
+ react-is@16.13.1: {}
+
react@19.0.0-rc-cd22717c-20241013: {}
read-cache@1.0.0:
@@ -2197,12 +2623,21 @@ snapshots:
dependencies:
picomatch: 2.3.1
+ regenerator-runtime@0.14.1: {}
+
+ rehackt@0.1.0(react@19.0.0-rc-cd22717c-20241013)(types-react@19.0.0-rc.1):
+ optionalDependencies:
+ '@types/react': types-react@19.0.0-rc.1
+ react: 19.0.0-rc-cd22717c-20241013
+
resolve@1.22.8:
dependencies:
- is-core-module: 2.15.0
+ is-core-module: 2.15.1
path-parse: 1.0.7
supports-preserve-symlinks-flag: 1.0.0
+ response-iterator@0.2.6: {}
+
reusify@1.0.4: {}
run-parallel@1.2.0:
@@ -2254,12 +2689,12 @@ snapshots:
is-arrayish: 0.3.2
optional: true
- sonner@1.5.0(react-dom@19.0.0-rc-cd22717c-20241013(react@19.0.0-rc-cd22717c-20241013))(react@19.0.0-rc-cd22717c-20241013):
+ sonner@1.7.0(react-dom@19.0.0-rc-cd22717c-20241013(react@19.0.0-rc-cd22717c-20241013))(react@19.0.0-rc-cd22717c-20241013):
dependencies:
react: 19.0.0-rc-cd22717c-20241013
react-dom: 19.0.0-rc-cd22717c-20241013(react@19.0.0-rc-cd22717c-20241013)
- source-map-js@1.2.0: {}
+ source-map-js@1.2.1: {}
streamsearch@1.1.0: {}
@@ -2281,7 +2716,7 @@ snapshots:
strip-ansi@7.1.0:
dependencies:
- ansi-regex: 6.0.1
+ ansi-regex: 6.1.0
styled-jsx@5.1.6(react@19.0.0-rc-cd22717c-20241013):
dependencies:
@@ -2300,9 +2735,11 @@ snapshots:
supports-preserve-symlinks-flag@1.0.0: {}
+ symbol-observable@4.0.0: {}
+
tabbable@6.2.0: {}
- tailwindcss@3.4.6:
+ tailwindcss@3.4.15:
dependencies:
'@alloc/quick-lru': 5.2.0
arg: 5.0.2
@@ -2314,16 +2751,16 @@ snapshots:
is-glob: 4.0.3
jiti: 1.21.6
lilconfig: 2.1.0
- micromatch: 4.0.7
+ micromatch: 4.0.8
normalize-path: 3.0.0
object-hash: 3.0.0
- picocolors: 1.0.1
- postcss: 8.4.39
- postcss-import: 15.1.0(postcss@8.4.39)
- postcss-js: 4.0.1(postcss@8.4.39)
- postcss-load-config: 4.0.2(postcss@8.4.39)
- postcss-nested: 6.2.0(postcss@8.4.39)
- postcss-selector-parser: 6.1.1
+ picocolors: 1.1.1
+ postcss: 8.4.49
+ postcss-import: 15.1.0(postcss@8.4.49)
+ postcss-js: 4.0.1(postcss@8.4.49)
+ postcss-load-config: 4.0.2(postcss@8.4.49)
+ postcss-nested: 6.2.0(postcss@8.4.49)
+ postcss-selector-parser: 6.1.2
resolve: 1.22.8
sucrase: 3.35.0
transitivePeerDependencies:
@@ -2343,7 +2780,11 @@ snapshots:
ts-interface-checker@0.1.13: {}
- tslib@2.6.3: {}
+ ts-invariant@0.10.3:
+ dependencies:
+ tslib: 2.8.1
+
+ tslib@2.8.1: {}
types-react-dom@19.0.0-rc.1:
dependencies:
@@ -2355,13 +2796,15 @@ snapshots:
typescript@5.5.4: {}
- undici-types@5.26.5: {}
+ undici-types@6.19.8: {}
- update-browserslist-db@1.1.0(browserslist@4.23.2):
+ unload@2.4.1: {}
+
+ update-browserslist-db@1.1.1(browserslist@4.24.2):
dependencies:
- browserslist: 4.23.2
- escalade: 3.1.2
- picocolors: 1.0.1
+ browserslist: 4.24.2
+ escalade: 3.2.0
+ picocolors: 1.1.1
util-deprecate@1.0.2: {}
@@ -2381,4 +2824,10 @@ snapshots:
string-width: 5.1.2
strip-ansi: 7.1.0
- yaml@2.5.0: {}
+ yaml@2.6.1: {}
+
+ zen-observable-ts@1.2.5:
+ dependencies:
+ zen-observable: 0.8.15
+
+ zen-observable@0.8.15: {}
diff --git a/repopack-output.txt b/repopack-output.txt
new file mode 100644
index 000000000..c1059aa55
--- /dev/null
+++ b/repopack-output.txt
@@ -0,0 +1,164 @@
+Help me finnish this reshaping of a product for a product card.
+
+Here is the Types:
+
+export type ProductType = {
+ id: string;
+ seo: {
+ title?: string;
+ description?: string;
+ };
+ currency: string;
+ slug: string;
+ handle: string;
+ stockTracking: boolean;
+ stockPurchasable: boolean;
+ stockLevel: number;
+ title: string;
+ name: string;
+ description: string;
+ price: string;
+ priceRange: {
+ maxVariantPrice: MoneyType;
+ minVariantPrice: MoneyType;
+ };
+ metaTitle: string;
+ metaDescription: string;
+ tags: string[];
+ options: ProductOptionType[];
+ variants: ProductVariantType[];
+ featuredImage: ProductImageType;
+ images: ProductImageType[];
+ updatedAt?: string;
+ availableForSale: boolean;
+ descriptionHtml?: string;
+ relations?: ProductRelationType[];
+};
+
+
+export type ProductOptionType = {
+ id: string;
+ name: string;
+ values: string[];
+};
+
+export type ProductOptionValueType = {
+ id: string;
+ name: string;
+ price: number;
+};
+
+
+export type ProductVariantType = {
+ id: string;
+ title: string;
+ availableForSale: boolean;
+ selectedOptions: {
+ name: string;
+ value: string;
+ }[];
+ price: MoneyType;
+};
+
+Here is what i got so far:
+const reshapeProduct = (geinsProductData: any): ProductType => {
+ const rawProduct = geinsProductData;
+
+
+ const tags: string[] = [];
+ const relations: ProductRelationType[] = [];
+ if (rawProduct.primaryCategory) {
+ tags.push(rawProduct.primaryCategory.name);
+ relations.push({
+ type: ProductRelationTypeEnum.CATEGORY,
+ name: rawProduct.primaryCategory.name,
+ alias: rawProduct.primaryCategory.alias,
+ });
+ }
+
+ if (rawProduct.brand) {
+ tags.push(rawProduct.brand.name);
+ relations.push({
+ type: ProductRelationTypeEnum.BRAND,
+ name: rawProduct.brand.name,
+ alias: rawProduct.brand.alias,
+ });
+ }
+ if(rawProduct.categories) {
+ rawProduct.categories.forEach((category: any) => {
+ tags.push(category.name);
+
+ });
+ }
+ // remove duplicates
+ const uniqueTags = [...new Set(tags)];
+ tags.push(...uniqueTags);
+
+
+ // add descriptions from environment variables
+ const shortDescription = rawProduct.texts?.[SHORT_DESCRIPTION] || '';
+ const longDescription = rawProduct.texts?.[LONG_DESCRIPTION] || '';
+
+ // add images
+ const images = rawProduct.productImages?.map((image: any): ProductImageType => ({
+ caption: rawProduct.name,
+ altText: rawProduct.name,
+ src: `${IMAGE_URL}/product/1200f1500/${image.fileName}`,
+ url: `${IMAGE_URL}/product/1200f1500/${image.fileName}`,
+ height: 1600,
+ width: 2000,
+ }));
+
+ // add variations and options
+ const variations: ProductVariantType[] = reshapeProductVariations(rawProduct);
+ const options: ProductOptionType[] = reshapeProductOptions(rawProduct);
+
+
+ return {
+ id: rawProduct.productId,
+ seo: {
+ title: rawProduct.meta?.title,
+ description: rawProduct.meta?.description,
+ },
+ metaTitle: rawProduct.meta?.title || rawProduct.name,
+ metaDescription: rawProduct.meta?.description || shortDescription,
+ name: rawProduct.name,
+ title: rawProduct.name,
+ slug: rawProduct.alias,
+ handle: rawProduct.alias,
+ description: shortDescription,
+ descriptionHtml: rawProduct.texts?.text1 || '',
+ priceRange: {
+ minVariantPrice: {
+ amount: rawProduct.unitPrice?.sellingPriceIncVat,
+ currencyCode: CURRENCY_CODE,
+ },
+ maxVariantPrice: {
+ amount: rawProduct.unitPrice?.sellingPriceIncVat,
+ currencyCode: CURRENCY_CODE,
+ },
+ },
+ price: rawProduct.unitPrice.sellingPriceIncVat,
+ currency: CURRENCY_CODE,
+ stockTracking: !!rawProduct.totalStock,
+ stockPurchasable: rawProduct.totalStock?.inStock || false,
+ stockLevel: rawProduct.totalStock?.totalStock || 0,
+ availableForSale: true,
+ tags: tags || [],
+ options: [...options]|| [],
+ variants: variations || [],
+ featuredImage: images[0],
+ images: images,
+ relations: relations,
+ };
+};
+
+const reshapeProductVariations = (geinsProductData: any): ProductVariantType[] => {
+ return [];
+};
+
+const reshapeProductOptions = (geinsProductData: any): ProductOptionType[] => {
+ return [];
+};
+
+And here is the query to API in graphql
\ No newline at end of file
diff --git a/yarn.lock b/yarn.lock
new file mode 100644
index 000000000..f17726027
--- /dev/null
+++ b/yarn.lock
@@ -0,0 +1,2927 @@
+# This file is generated by running "yarn install" inside your project.
+# Manual changes might be lost - proceed with caution!
+
+__metadata:
+ version: 6
+ cacheKey: 8
+
+"@alloc/quick-lru@npm:^5.2.0":
+ version: 5.2.0
+ resolution: "@alloc/quick-lru@npm:5.2.0"
+ checksum: bdc35758b552bcf045733ac047fb7f9a07c4678b944c641adfbd41f798b4b91fffd0fdc0df2578d9b0afc7b4d636aa6e110ead5d6281a2adc1ab90efd7f057f8
+ languageName: node
+ linkType: hard
+
+"@apollo/client@npm:^3.11.8":
+ version: 3.11.10
+ resolution: "@apollo/client@npm:3.11.10"
+ dependencies:
+ "@graphql-typed-document-node/core": ^3.1.1
+ "@wry/caches": ^1.0.0
+ "@wry/equality": ^0.5.6
+ "@wry/trie": ^0.5.0
+ graphql-tag: ^2.12.6
+ hoist-non-react-statics: ^3.3.2
+ optimism: ^0.18.0
+ prop-types: ^15.7.2
+ rehackt: ^0.1.0
+ response-iterator: ^0.2.6
+ symbol-observable: ^4.0.0
+ ts-invariant: ^0.10.3
+ tslib: ^2.3.0
+ zen-observable-ts: ^1.2.5
+ peerDependencies:
+ graphql: ^15.0.0 || ^16.0.0
+ graphql-ws: ^5.5.5
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0
+ react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0
+ subscriptions-transport-ws: ^0.9.0 || ^0.11.0
+ peerDependenciesMeta:
+ graphql-ws:
+ optional: true
+ react:
+ optional: true
+ react-dom:
+ optional: true
+ subscriptions-transport-ws:
+ optional: true
+ checksum: fb0bdcbc6cd2411c5ecf74bfeaf9c31d60865b454b2cd0f08876597402d26bcb49facb273de152517f3faf2b21f0a8f06d628cc7130a7231624918c4fb99a6db
+ languageName: node
+ linkType: hard
+
+"@babel/runtime@npm:7.23.4":
+ version: 7.23.4
+ resolution: "@babel/runtime@npm:7.23.4"
+ dependencies:
+ regenerator-runtime: ^0.14.0
+ checksum: 8eb6a6b2367f7d60e7f7dd83f477cc2e2fdb169e5460694d7614ce5c730e83324bcf29251b70940068e757ad1ee56ff8073a372260d90cad55f18a825caf97cd
+ languageName: node
+ linkType: hard
+
+"@emnapi/runtime@npm:^1.2.0":
+ version: 1.3.1
+ resolution: "@emnapi/runtime@npm:1.3.1"
+ dependencies:
+ tslib: ^2.4.0
+ checksum: 9a16ae7905a9c0e8956cf1854ef74e5087fbf36739abdba7aa6b308485aafdc993da07c19d7af104cd5f8e425121120852851bb3a0f78e2160e420a36d47f42f
+ languageName: node
+ linkType: hard
+
+"@floating-ui/core@npm:^1.6.0":
+ version: 1.6.8
+ resolution: "@floating-ui/core@npm:1.6.8"
+ dependencies:
+ "@floating-ui/utils": ^0.2.8
+ checksum: 82faa6ea9d57e466779324e51308d6d49c098fb9d184a08d9bb7f4fad83f08cc070fc491f8d56f0cad44a16215fb43f9f829524288413e6c33afcb17303698de
+ languageName: node
+ linkType: hard
+
+"@floating-ui/dom@npm:^1.0.0":
+ version: 1.6.12
+ resolution: "@floating-ui/dom@npm:1.6.12"
+ dependencies:
+ "@floating-ui/core": ^1.6.0
+ "@floating-ui/utils": ^0.2.8
+ checksum: 956514ed100c0c853e73ace9e3c877b7e535444d7c31326f687a7690d49cb1e59ef457e9c93b76141aea0d280e83ed5a983bb852718b62eea581f755454660f6
+ languageName: node
+ linkType: hard
+
+"@floating-ui/react-dom@npm:^2.1.2":
+ version: 2.1.2
+ resolution: "@floating-ui/react-dom@npm:2.1.2"
+ dependencies:
+ "@floating-ui/dom": ^1.0.0
+ peerDependencies:
+ react: ">=16.8.0"
+ react-dom: ">=16.8.0"
+ checksum: 25bb031686e23062ed4222a8946e76b3f9021d40a48437bd747233c4964a766204b8a55f34fa8b259839af96e60db7c6e3714d81f1de06914294f90e86ffbc48
+ languageName: node
+ linkType: hard
+
+"@floating-ui/react@npm:^0.26.16":
+ version: 0.26.28
+ resolution: "@floating-ui/react@npm:0.26.28"
+ dependencies:
+ "@floating-ui/react-dom": ^2.1.2
+ "@floating-ui/utils": ^0.2.8
+ tabbable: ^6.0.0
+ peerDependencies:
+ react: ">=16.8.0"
+ react-dom: ">=16.8.0"
+ checksum: 1bfcccdb1f388ceb0075dc3e46934f4f04ef10bff2f971e1bf79067391c8729b366025caca0a42f5ca80854820a621a9edecbacdc046c33eb428f508fd6ce1f3
+ languageName: node
+ linkType: hard
+
+"@floating-ui/utils@npm:^0.2.8":
+ version: 0.2.8
+ resolution: "@floating-ui/utils@npm:0.2.8"
+ checksum: deb98bba017c4e073c7ad5740d4dec33a4d3e0942d412e677ac0504f3dade15a68fc6fd164d43c93c0bb0bcc5dc5015c1f4080dfb1a6161140fe660624f7c875
+ languageName: node
+ linkType: hard
+
+"@geins/cms@npm:^0.3.4":
+ version: 0.3.4
+ resolution: "@geins/cms@npm:0.3.4"
+ dependencies:
+ "@apollo/client": ^3.11.8
+ "@geins/core": 0.3.4
+ graphql: ^16.9.0
+ checksum: 06950c51a3fdb8c3552f322f72108d4ad63072ddcdf76b0374c8c73659a9e2830f99a00b51ce5cfd4e8b499e08418955df63e8ee51f7712d49ccec1f7044fc47
+ languageName: node
+ linkType: hard
+
+"@geins/core@npm:0.3.4, @geins/core@npm:^0.3.4":
+ version: 0.3.4
+ resolution: "@geins/core@npm:0.3.4"
+ dependencies:
+ "@apollo/client": ^3.11.8
+ broadcast-channel: ^7.0.0
+ cookie-universal: ^2.2.2
+ graphql: ^16.9.0
+ node-cache: ^5.1.2
+ checksum: 378ba248164d81c983c163d14fbb6255b75aa0edf5e0cf4c32a6ee66fa276f9eb8012b3c4777f581b7c80309bbd1cd41013485b1e921edd2f40e6bdec583d710
+ languageName: node
+ linkType: hard
+
+"@geins/types@npm:^0.3.4":
+ version: 0.3.4
+ resolution: "@geins/types@npm:0.3.4"
+ checksum: 6cdd8f5d7ee3e8a9af7f836b69e89819830bafc852afdb3f8cee32538fd6b0ac51317d54f695de62a1818e7e70cd67ab9940357acda20e4db9a7c81a5209a82f
+ languageName: node
+ linkType: hard
+
+"@graphql-typed-document-node/core@npm:^3.1.1":
+ version: 3.2.0
+ resolution: "@graphql-typed-document-node/core@npm:3.2.0"
+ peerDependencies:
+ graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
+ checksum: fa44443accd28c8cf4cb96aaaf39d144a22e8b091b13366843f4e97d19c7bfeaf609ce3c7603a4aeffe385081eaf8ea245d078633a7324c11c5ec4b2011bb76d
+ languageName: node
+ linkType: hard
+
+"@headlessui/react@npm:^2.1.2":
+ version: 2.2.0
+ resolution: "@headlessui/react@npm:2.2.0"
+ dependencies:
+ "@floating-ui/react": ^0.26.16
+ "@react-aria/focus": ^3.17.1
+ "@react-aria/interactions": ^3.21.3
+ "@tanstack/react-virtual": ^3.8.1
+ peerDependencies:
+ react: ^18 || ^19 || ^19.0.0-rc
+ react-dom: ^18 || ^19 || ^19.0.0-rc
+ checksum: d64b23108e3f0ad4a28753aba5bc3c08ad771d2b9f5a2f3a7a8b4dec5b96fbbcce39fe9404a050af2c1ceafdc29837f5c3dc51ca03ea58c7ee2e30cf8b9b8d16
+ languageName: node
+ linkType: hard
+
+"@heroicons/react@npm:^2.1.5":
+ version: 2.2.0
+ resolution: "@heroicons/react@npm:2.2.0"
+ peerDependencies:
+ react: ">= 16 || ^19.0.0-rc"
+ checksum: ff4dbfa98dacc41f86db82be9102d0c2cd0b8652b428f0b49ffd2580bee8f36fca43937a3d3d5e8f209c7303f5317a32163c018dfa13a3730d79dec43addac93
+ languageName: node
+ linkType: hard
+
+"@img/sharp-darwin-arm64@npm:0.33.5":
+ version: 0.33.5
+ resolution: "@img/sharp-darwin-arm64@npm:0.33.5"
+ dependencies:
+ "@img/sharp-libvips-darwin-arm64": 1.0.4
+ dependenciesMeta:
+ "@img/sharp-libvips-darwin-arm64":
+ optional: true
+ conditions: os=darwin & cpu=arm64
+ languageName: node
+ linkType: hard
+
+"@img/sharp-darwin-x64@npm:0.33.5":
+ version: 0.33.5
+ resolution: "@img/sharp-darwin-x64@npm:0.33.5"
+ dependencies:
+ "@img/sharp-libvips-darwin-x64": 1.0.4
+ dependenciesMeta:
+ "@img/sharp-libvips-darwin-x64":
+ optional: true
+ conditions: os=darwin & cpu=x64
+ languageName: node
+ linkType: hard
+
+"@img/sharp-libvips-darwin-arm64@npm:1.0.4":
+ version: 1.0.4
+ resolution: "@img/sharp-libvips-darwin-arm64@npm:1.0.4"
+ conditions: os=darwin & cpu=arm64
+ languageName: node
+ linkType: hard
+
+"@img/sharp-libvips-darwin-x64@npm:1.0.4":
+ version: 1.0.4
+ resolution: "@img/sharp-libvips-darwin-x64@npm:1.0.4"
+ conditions: os=darwin & cpu=x64
+ languageName: node
+ linkType: hard
+
+"@img/sharp-libvips-linux-arm64@npm:1.0.4":
+ version: 1.0.4
+ resolution: "@img/sharp-libvips-linux-arm64@npm:1.0.4"
+ conditions: os=linux & cpu=arm64 & libc=glibc
+ languageName: node
+ linkType: hard
+
+"@img/sharp-libvips-linux-arm@npm:1.0.5":
+ version: 1.0.5
+ resolution: "@img/sharp-libvips-linux-arm@npm:1.0.5"
+ conditions: os=linux & cpu=arm & libc=glibc
+ languageName: node
+ linkType: hard
+
+"@img/sharp-libvips-linux-s390x@npm:1.0.4":
+ version: 1.0.4
+ resolution: "@img/sharp-libvips-linux-s390x@npm:1.0.4"
+ conditions: os=linux & cpu=s390x & libc=glibc
+ languageName: node
+ linkType: hard
+
+"@img/sharp-libvips-linux-x64@npm:1.0.4":
+ version: 1.0.4
+ resolution: "@img/sharp-libvips-linux-x64@npm:1.0.4"
+ conditions: os=linux & cpu=x64 & libc=glibc
+ languageName: node
+ linkType: hard
+
+"@img/sharp-libvips-linuxmusl-arm64@npm:1.0.4":
+ version: 1.0.4
+ resolution: "@img/sharp-libvips-linuxmusl-arm64@npm:1.0.4"
+ conditions: os=linux & cpu=arm64 & libc=musl
+ languageName: node
+ linkType: hard
+
+"@img/sharp-libvips-linuxmusl-x64@npm:1.0.4":
+ version: 1.0.4
+ resolution: "@img/sharp-libvips-linuxmusl-x64@npm:1.0.4"
+ conditions: os=linux & cpu=x64 & libc=musl
+ languageName: node
+ linkType: hard
+
+"@img/sharp-linux-arm64@npm:0.33.5":
+ version: 0.33.5
+ resolution: "@img/sharp-linux-arm64@npm:0.33.5"
+ dependencies:
+ "@img/sharp-libvips-linux-arm64": 1.0.4
+ dependenciesMeta:
+ "@img/sharp-libvips-linux-arm64":
+ optional: true
+ conditions: os=linux & cpu=arm64 & libc=glibc
+ languageName: node
+ linkType: hard
+
+"@img/sharp-linux-arm@npm:0.33.5":
+ version: 0.33.5
+ resolution: "@img/sharp-linux-arm@npm:0.33.5"
+ dependencies:
+ "@img/sharp-libvips-linux-arm": 1.0.5
+ dependenciesMeta:
+ "@img/sharp-libvips-linux-arm":
+ optional: true
+ conditions: os=linux & cpu=arm & libc=glibc
+ languageName: node
+ linkType: hard
+
+"@img/sharp-linux-s390x@npm:0.33.5":
+ version: 0.33.5
+ resolution: "@img/sharp-linux-s390x@npm:0.33.5"
+ dependencies:
+ "@img/sharp-libvips-linux-s390x": 1.0.4
+ dependenciesMeta:
+ "@img/sharp-libvips-linux-s390x":
+ optional: true
+ conditions: os=linux & cpu=s390x & libc=glibc
+ languageName: node
+ linkType: hard
+
+"@img/sharp-linux-x64@npm:0.33.5":
+ version: 0.33.5
+ resolution: "@img/sharp-linux-x64@npm:0.33.5"
+ dependencies:
+ "@img/sharp-libvips-linux-x64": 1.0.4
+ dependenciesMeta:
+ "@img/sharp-libvips-linux-x64":
+ optional: true
+ conditions: os=linux & cpu=x64 & libc=glibc
+ languageName: node
+ linkType: hard
+
+"@img/sharp-linuxmusl-arm64@npm:0.33.5":
+ version: 0.33.5
+ resolution: "@img/sharp-linuxmusl-arm64@npm:0.33.5"
+ dependencies:
+ "@img/sharp-libvips-linuxmusl-arm64": 1.0.4
+ dependenciesMeta:
+ "@img/sharp-libvips-linuxmusl-arm64":
+ optional: true
+ conditions: os=linux & cpu=arm64 & libc=musl
+ languageName: node
+ linkType: hard
+
+"@img/sharp-linuxmusl-x64@npm:0.33.5":
+ version: 0.33.5
+ resolution: "@img/sharp-linuxmusl-x64@npm:0.33.5"
+ dependencies:
+ "@img/sharp-libvips-linuxmusl-x64": 1.0.4
+ dependenciesMeta:
+ "@img/sharp-libvips-linuxmusl-x64":
+ optional: true
+ conditions: os=linux & cpu=x64 & libc=musl
+ languageName: node
+ linkType: hard
+
+"@img/sharp-wasm32@npm:0.33.5":
+ version: 0.33.5
+ resolution: "@img/sharp-wasm32@npm:0.33.5"
+ dependencies:
+ "@emnapi/runtime": ^1.2.0
+ conditions: cpu=wasm32
+ languageName: node
+ linkType: hard
+
+"@img/sharp-win32-ia32@npm:0.33.5":
+ version: 0.33.5
+ resolution: "@img/sharp-win32-ia32@npm:0.33.5"
+ conditions: os=win32 & cpu=ia32
+ languageName: node
+ linkType: hard
+
+"@img/sharp-win32-x64@npm:0.33.5":
+ version: 0.33.5
+ resolution: "@img/sharp-win32-x64@npm:0.33.5"
+ conditions: os=win32 & cpu=x64
+ languageName: node
+ linkType: hard
+
+"@isaacs/cliui@npm:^8.0.2":
+ version: 8.0.2
+ resolution: "@isaacs/cliui@npm:8.0.2"
+ dependencies:
+ string-width: ^5.1.2
+ string-width-cjs: "npm:string-width@^4.2.0"
+ strip-ansi: ^7.0.1
+ strip-ansi-cjs: "npm:strip-ansi@^6.0.1"
+ wrap-ansi: ^8.1.0
+ wrap-ansi-cjs: "npm:wrap-ansi@^7.0.0"
+ checksum: 4a473b9b32a7d4d3cfb7a614226e555091ff0c5a29a1734c28c72a182c2f6699b26fc6b5c2131dfd841e86b185aea714c72201d7c98c2fba5f17709333a67aeb
+ languageName: node
+ linkType: hard
+
+"@jridgewell/gen-mapping@npm:^0.3.2":
+ version: 0.3.5
+ resolution: "@jridgewell/gen-mapping@npm:0.3.5"
+ dependencies:
+ "@jridgewell/set-array": ^1.2.1
+ "@jridgewell/sourcemap-codec": ^1.4.10
+ "@jridgewell/trace-mapping": ^0.3.24
+ checksum: ff7a1764ebd76a5e129c8890aa3e2f46045109dabde62b0b6c6a250152227647178ff2069ea234753a690d8f3c4ac8b5e7b267bbee272bffb7f3b0a370ab6e52
+ languageName: node
+ linkType: hard
+
+"@jridgewell/resolve-uri@npm:^3.1.0":
+ version: 3.1.2
+ resolution: "@jridgewell/resolve-uri@npm:3.1.2"
+ checksum: 83b85f72c59d1c080b4cbec0fef84528963a1b5db34e4370fa4bd1e3ff64a0d80e0cee7369d11d73c704e0286fb2865b530acac7a871088fbe92b5edf1000870
+ languageName: node
+ linkType: hard
+
+"@jridgewell/set-array@npm:^1.2.1":
+ version: 1.2.1
+ resolution: "@jridgewell/set-array@npm:1.2.1"
+ checksum: 832e513a85a588f8ed4f27d1279420d8547743cc37fcad5a5a76fc74bb895b013dfe614d0eed9cb860048e6546b798f8f2652020b4b2ba0561b05caa8c654b10
+ languageName: node
+ linkType: hard
+
+"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14":
+ version: 1.5.0
+ resolution: "@jridgewell/sourcemap-codec@npm:1.5.0"
+ checksum: 05df4f2538b3b0f998ea4c1cd34574d0feba216fa5d4ccaef0187d12abf82eafe6021cec8b49f9bb4d90f2ba4582ccc581e72986a5fcf4176ae0cfeb04cf52ec
+ languageName: node
+ linkType: hard
+
+"@jridgewell/trace-mapping@npm:^0.3.24":
+ version: 0.3.25
+ resolution: "@jridgewell/trace-mapping@npm:0.3.25"
+ dependencies:
+ "@jridgewell/resolve-uri": ^3.1.0
+ "@jridgewell/sourcemap-codec": ^1.4.14
+ checksum: 9d3c40d225e139987b50c48988f8717a54a8c994d8a948ee42e1412e08988761d0754d7d10b803061cc3aebf35f92a5dbbab493bd0e1a9ef9e89a2130e83ba34
+ languageName: node
+ linkType: hard
+
+"@next/env@npm:15.0.3":
+ version: 15.0.3
+ resolution: "@next/env@npm:15.0.3"
+ checksum: 8a805f594f4da85f5070c1c0def8946e5c32620ac401b72f7cb5710db7a7fd1a085d23b40f3ea6c6ef7ef437d91c600786c7361c98ad83771e39d3a460aa30d4
+ languageName: node
+ linkType: hard
+
+"@next/swc-darwin-arm64@npm:15.0.3":
+ version: 15.0.3
+ resolution: "@next/swc-darwin-arm64@npm:15.0.3"
+ conditions: os=darwin & cpu=arm64
+ languageName: node
+ linkType: hard
+
+"@next/swc-darwin-x64@npm:15.0.3":
+ version: 15.0.3
+ resolution: "@next/swc-darwin-x64@npm:15.0.3"
+ conditions: os=darwin & cpu=x64
+ languageName: node
+ linkType: hard
+
+"@next/swc-linux-arm64-gnu@npm:15.0.3":
+ version: 15.0.3
+ resolution: "@next/swc-linux-arm64-gnu@npm:15.0.3"
+ conditions: os=linux & cpu=arm64 & libc=glibc
+ languageName: node
+ linkType: hard
+
+"@next/swc-linux-arm64-musl@npm:15.0.3":
+ version: 15.0.3
+ resolution: "@next/swc-linux-arm64-musl@npm:15.0.3"
+ conditions: os=linux & cpu=arm64 & libc=musl
+ languageName: node
+ linkType: hard
+
+"@next/swc-linux-x64-gnu@npm:15.0.3":
+ version: 15.0.3
+ resolution: "@next/swc-linux-x64-gnu@npm:15.0.3"
+ conditions: os=linux & cpu=x64 & libc=glibc
+ languageName: node
+ linkType: hard
+
+"@next/swc-linux-x64-musl@npm:15.0.3":
+ version: 15.0.3
+ resolution: "@next/swc-linux-x64-musl@npm:15.0.3"
+ conditions: os=linux & cpu=x64 & libc=musl
+ languageName: node
+ linkType: hard
+
+"@next/swc-win32-arm64-msvc@npm:15.0.3":
+ version: 15.0.3
+ resolution: "@next/swc-win32-arm64-msvc@npm:15.0.3"
+ conditions: os=win32 & cpu=arm64
+ languageName: node
+ linkType: hard
+
+"@next/swc-win32-x64-msvc@npm:15.0.3":
+ version: 15.0.3
+ resolution: "@next/swc-win32-x64-msvc@npm:15.0.3"
+ conditions: os=win32 & cpu=x64
+ languageName: node
+ linkType: hard
+
+"@nodelib/fs.scandir@npm:2.1.5":
+ version: 2.1.5
+ resolution: "@nodelib/fs.scandir@npm:2.1.5"
+ dependencies:
+ "@nodelib/fs.stat": 2.0.5
+ run-parallel: ^1.1.9
+ checksum: a970d595bd23c66c880e0ef1817791432dbb7acbb8d44b7e7d0e7a22f4521260d4a83f7f9fd61d44fda4610105577f8f58a60718105fb38352baed612fd79e59
+ languageName: node
+ linkType: hard
+
+"@nodelib/fs.stat@npm:2.0.5, @nodelib/fs.stat@npm:^2.0.2":
+ version: 2.0.5
+ resolution: "@nodelib/fs.stat@npm:2.0.5"
+ checksum: 012480b5ca9d97bff9261571dbbec7bbc6033f69cc92908bc1ecfad0792361a5a1994bc48674b9ef76419d056a03efadfce5a6cf6dbc0a36559571a7a483f6f0
+ languageName: node
+ linkType: hard
+
+"@nodelib/fs.walk@npm:^1.2.3":
+ version: 1.2.8
+ resolution: "@nodelib/fs.walk@npm:1.2.8"
+ dependencies:
+ "@nodelib/fs.scandir": 2.1.5
+ fastq: ^1.6.0
+ checksum: 190c643f156d8f8f277bf2a6078af1ffde1fd43f498f187c2db24d35b4b4b5785c02c7dc52e356497b9a1b65b13edc996de08de0b961c32844364da02986dc53
+ languageName: node
+ linkType: hard
+
+"@npmcli/agent@npm:^2.0.0":
+ version: 2.2.2
+ resolution: "@npmcli/agent@npm:2.2.2"
+ dependencies:
+ agent-base: ^7.1.0
+ http-proxy-agent: ^7.0.0
+ https-proxy-agent: ^7.0.1
+ lru-cache: ^10.0.1
+ socks-proxy-agent: ^8.0.3
+ checksum: 67de7b88cc627a79743c88bab35e023e23daf13831a8aa4e15f998b92f5507b644d8ffc3788afc8e64423c612e0785a6a92b74782ce368f49a6746084b50d874
+ languageName: node
+ linkType: hard
+
+"@npmcli/fs@npm:^3.1.0":
+ version: 3.1.1
+ resolution: "@npmcli/fs@npm:3.1.1"
+ dependencies:
+ semver: ^7.3.5
+ checksum: d960cab4b93adcb31ce223bfb75c5714edbd55747342efb67dcc2f25e023d930a7af6ece3e75f2f459b6f38fc14d031c766f116cd124fdc937fd33112579e820
+ languageName: node
+ linkType: hard
+
+"@pkgjs/parseargs@npm:^0.11.0":
+ version: 0.11.0
+ resolution: "@pkgjs/parseargs@npm:0.11.0"
+ checksum: 6ad6a00fc4f2f2cfc6bff76fb1d88b8ee20bc0601e18ebb01b6d4be583733a860239a521a7fbca73b612e66705078809483549d2b18f370eb346c5155c8e4a0f
+ languageName: node
+ linkType: hard
+
+"@react-aria/focus@npm:^3.17.1":
+ version: 3.18.4
+ resolution: "@react-aria/focus@npm:3.18.4"
+ dependencies:
+ "@react-aria/interactions": ^3.22.4
+ "@react-aria/utils": ^3.25.3
+ "@react-types/shared": ^3.25.0
+ "@swc/helpers": ^0.5.0
+ clsx: ^2.0.0
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0
+ checksum: b201eaacaa19e38c736ae2a4a94245526c8e738b1e74bec3cd9924999cf9d6edd2b35ca2ee2993c56e3db0fe8d528843300eb5d5b394e187595f21fb8ad1f4f7
+ languageName: node
+ linkType: hard
+
+"@react-aria/interactions@npm:^3.21.3, @react-aria/interactions@npm:^3.22.4":
+ version: 3.22.4
+ resolution: "@react-aria/interactions@npm:3.22.4"
+ dependencies:
+ "@react-aria/ssr": ^3.9.6
+ "@react-aria/utils": ^3.25.3
+ "@react-types/shared": ^3.25.0
+ "@swc/helpers": ^0.5.0
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0
+ checksum: a62cbc9658c79a342553f4307b80dfff3de0edae0e3c2654754b847081ef5e1623f3aa945210690d3107efb06a4417e49977991a3f2badf04b6e437b2b17b33b
+ languageName: node
+ linkType: hard
+
+"@react-aria/ssr@npm:^3.9.6":
+ version: 3.9.6
+ resolution: "@react-aria/ssr@npm:3.9.6"
+ dependencies:
+ "@swc/helpers": ^0.5.0
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0
+ checksum: 90645c0da673de555cc1221286980c713d79d5a9328e43adf19121be03a1ba8ebb11e87a3564cd1e1034e00674ee5f95db3d3db263a0109239502d093ebe6862
+ languageName: node
+ linkType: hard
+
+"@react-aria/utils@npm:^3.25.3":
+ version: 3.25.3
+ resolution: "@react-aria/utils@npm:3.25.3"
+ dependencies:
+ "@react-aria/ssr": ^3.9.6
+ "@react-stately/utils": ^3.10.4
+ "@react-types/shared": ^3.25.0
+ "@swc/helpers": ^0.5.0
+ clsx: ^2.0.0
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0
+ checksum: dfb0dc06c8941cb959f021fbd6287ab12e20d958a9ba52307cade8e0586df12472664ca5574086a8f96501128db5cbdd5c9a625b0bc378e43a92165f920824bf
+ languageName: node
+ linkType: hard
+
+"@react-stately/utils@npm:^3.10.4":
+ version: 3.10.4
+ resolution: "@react-stately/utils@npm:3.10.4"
+ dependencies:
+ "@swc/helpers": ^0.5.0
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0
+ checksum: dd00776f1d0e858c62de2f18551faffe91a53547ea4fe0a0ae2e5ff0ca9dac289b68bf06db09e978dab72e9b10a41160ab195186fb07fd7843aecbf60fba801d
+ languageName: node
+ linkType: hard
+
+"@react-types/shared@npm:^3.25.0":
+ version: 3.25.0
+ resolution: "@react-types/shared@npm:3.25.0"
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0
+ checksum: 3fb971b74d913bf4dc933e78f5d5c418574fca7313198ef7b0e77c528f8a2e5f76324fb8a5a2be52b5ed997018a6819457e70f964eb1c80dc62941eb8b678710
+ languageName: node
+ linkType: hard
+
+"@swc/counter@npm:0.1.3":
+ version: 0.1.3
+ resolution: "@swc/counter@npm:0.1.3"
+ checksum: df8f9cfba9904d3d60f511664c70d23bb323b3a0803ec9890f60133954173047ba9bdeabce28cd70ba89ccd3fd6c71c7b0bd58be85f611e1ffbe5d5c18616598
+ languageName: node
+ linkType: hard
+
+"@swc/helpers@npm:0.5.13":
+ version: 0.5.13
+ resolution: "@swc/helpers@npm:0.5.13"
+ dependencies:
+ tslib: ^2.4.0
+ checksum: d50c2c10da6ef940af423c6b03ad9c3c94cf9de59314b1e921a7d1bcc081a6074481c9d67b655fc8fe66a73288f98b25950743792a63882bfb5793b362494fc0
+ languageName: node
+ linkType: hard
+
+"@swc/helpers@npm:^0.5.0":
+ version: 0.5.15
+ resolution: "@swc/helpers@npm:0.5.15"
+ dependencies:
+ tslib: ^2.8.0
+ checksum: 1a9e0dbb792b2d1e0c914d69c201dbc96af3a0e6e6e8cf5a7f7d6a5d7b0e8b762915cd4447acb6b040e2ecc1ed49822875a7239f99a2d63c96c3c3407fb6fccf
+ languageName: node
+ linkType: hard
+
+"@tailwindcss/container-queries@npm:^0.1.1":
+ version: 0.1.1
+ resolution: "@tailwindcss/container-queries@npm:0.1.1"
+ peerDependencies:
+ tailwindcss: ">=3.2.0"
+ checksum: 2515ae0ce3ca5f3eb2a54116e97cbf4bce45d5fc7ad4b01f3204f51937461ff099c878048afbca22ca422ea3a9c1779df68a7cfe320ca155da47a8dde3257f4b
+ languageName: node
+ linkType: hard
+
+"@tailwindcss/typography@npm:^0.5.13":
+ version: 0.5.15
+ resolution: "@tailwindcss/typography@npm:0.5.15"
+ dependencies:
+ lodash.castarray: ^4.4.0
+ lodash.isplainobject: ^4.0.6
+ lodash.merge: ^4.6.2
+ postcss-selector-parser: 6.0.10
+ peerDependencies:
+ tailwindcss: "*"
+ checksum: 4e7ad4f7cf0e290030de63f123b53b431fdc3b0fc76e43b9abe21945cf9eca59b7d0d557bb6c7ebd16769586b22ca8cf40e75dc6db069a3afac4c678f4e4ed1e
+ languageName: node
+ linkType: hard
+
+"@tanstack/react-virtual@npm:^3.8.1":
+ version: 3.10.9
+ resolution: "@tanstack/react-virtual@npm:3.10.9"
+ dependencies:
+ "@tanstack/virtual-core": 3.10.9
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0
+ react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0
+ checksum: a6c90118d0b084aedf0a2b02bc718df5cc1e594fb60d1dededf8a393d3e519e574e2ba67bb7adcaf8b4d6b206f6a10b37166f006bc7e50ad566475323d545b8c
+ languageName: node
+ linkType: hard
+
+"@tanstack/virtual-core@npm:3.10.9":
+ version: 3.10.9
+ resolution: "@tanstack/virtual-core@npm:3.10.9"
+ checksum: df1c673040e3700ba12774ef1fec775f84342e80fb5f1586096a1ed347ee9d35b6db6829e665fed86fa3f08e86235a68bbd331fd5aedec4314c2a565384199ba
+ languageName: node
+ linkType: hard
+
+"@types/cookie@npm:^0.3.3":
+ version: 0.3.3
+ resolution: "@types/cookie@npm:0.3.3"
+ checksum: 450c930d792a4fd5a93645b4123f02596368f904dbb1fe6fbb5043bce8f6ecf877a08511c6ba11c8e28168f62bc278e68d214f002fab927c9056c0bc69f21370
+ languageName: node
+ linkType: hard
+
+"@types/node@npm:22.9.0":
+ version: 22.9.0
+ resolution: "@types/node@npm:22.9.0"
+ dependencies:
+ undici-types: ~6.19.8
+ checksum: c014eb3b8a110f1b87b614a40ef288d13e6b08ae9d5dafbd38951a2eebc24d352dc55330ed9d00c97ee9e64483c3cc14c4aa914c5df7ca7b9eaa1a30b2340dbd
+ languageName: node
+ linkType: hard
+
+"@types/prop-types@npm:*":
+ version: 15.7.13
+ resolution: "@types/prop-types@npm:15.7.13"
+ checksum: 8935cad87c683c665d09a055919d617fe951cb3b2d5c00544e3a913f861a2bd8d2145b51c9aa6d2457d19f3107ab40784c40205e757232f6a80cc8b1c815513c
+ languageName: node
+ linkType: hard
+
+"@types/react-dom@npm:types-react-dom@19.0.0-rc.1":
+ version: 19.0.0-rc.1
+ resolution: "types-react-dom@npm:19.0.0-rc.1"
+ dependencies:
+ "@types/react": "*"
+ checksum: 76a67a2bd3318ce07546647358da68480b8217463cb9e85803fd1b8d899371c64e6601fd49aea35e7a40f997a95a08786b01ef61437f805650842f8a367f4d17
+ languageName: node
+ linkType: hard
+
+"@types/react@npm:*":
+ version: 18.3.12
+ resolution: "@types/react@npm:18.3.12"
+ dependencies:
+ "@types/prop-types": "*"
+ csstype: ^3.0.2
+ checksum: 4ab1577a8c2105a5e316536f724117c90eee5f4bd5c137fc82a2253d8c1fd299dedaa07e8dfc95d6e2f04a4be3cb8b0e1b06098c6233ebd55c508d88099395b7
+ languageName: node
+ linkType: hard
+
+"@types/react@npm:types-react@19.0.0-rc.1":
+ version: 19.0.0-rc.1
+ resolution: "types-react@npm:19.0.0-rc.1"
+ dependencies:
+ csstype: ^3.0.2
+ checksum: 1754f9075cc4a3cdaf64dbe494252c81ab637297d94932cb3ed02fea4066addcdca7acbf25cca0f19fe0a69ecb5d37eac7403bebc0ceb587e3276e61b17b69e9
+ languageName: node
+ linkType: hard
+
+"@wry/caches@npm:^1.0.0":
+ version: 1.0.1
+ resolution: "@wry/caches@npm:1.0.1"
+ dependencies:
+ tslib: ^2.3.0
+ checksum: 9e89aa8e9e08577b2e4acbe805f406b141ae49c2ac4a2e22acf21fbee68339fa0550e0dee28cf2158799f35bb812326e80212e49e2afd169f39f02ad56ae4ef4
+ languageName: node
+ linkType: hard
+
+"@wry/context@npm:^0.7.0":
+ version: 0.7.4
+ resolution: "@wry/context@npm:0.7.4"
+ dependencies:
+ tslib: ^2.3.0
+ checksum: 9bc8c30a31f9c7d36b616e89daa9280c03d196576a4f9fef800e9bd5de9434ba70216322faeeacc7ef1ab95f59185599d702538114045df729a5ceea50aef4e2
+ languageName: node
+ linkType: hard
+
+"@wry/equality@npm:^0.5.6":
+ version: 0.5.7
+ resolution: "@wry/equality@npm:0.5.7"
+ dependencies:
+ tslib: ^2.3.0
+ checksum: 892f262fae362df80f199b12658ea6966949539d4a3a50c1acf00d94a367d673a38f8efa1abcb726ae9e5cc5e62fce50c540c70f797b7c8a2c4308b401dfd903
+ languageName: node
+ linkType: hard
+
+"@wry/trie@npm:^0.5.0":
+ version: 0.5.0
+ resolution: "@wry/trie@npm:0.5.0"
+ dependencies:
+ tslib: ^2.3.0
+ checksum: 92aeea34152bd8485184236fe328d3d05fc98ee3b431d82ee60cf3584dbf68155419c3d65d0ff3731b204ee79c149440a9b7672784a545afddc8d4342fbf21c9
+ languageName: node
+ linkType: hard
+
+"abbrev@npm:^2.0.0":
+ version: 2.0.0
+ resolution: "abbrev@npm:2.0.0"
+ checksum: 0e994ad2aa6575f94670d8a2149afe94465de9cedaaaac364e7fb43a40c3691c980ff74899f682f4ca58fa96b4cbd7421a015d3a6defe43a442117d7821a2f36
+ languageName: node
+ linkType: hard
+
+"agent-base@npm:^7.0.2, agent-base@npm:^7.1.0, agent-base@npm:^7.1.1":
+ version: 7.1.1
+ resolution: "agent-base@npm:7.1.1"
+ dependencies:
+ debug: ^4.3.4
+ checksum: 51c158769c5c051482f9ca2e6e1ec085ac72b5a418a9b31b4e82fe6c0a6699adb94c1c42d246699a587b3335215037091c79e0de512c516f73b6ea844202f037
+ languageName: node
+ linkType: hard
+
+"aggregate-error@npm:^3.0.0":
+ version: 3.1.0
+ resolution: "aggregate-error@npm:3.1.0"
+ dependencies:
+ clean-stack: ^2.0.0
+ indent-string: ^4.0.0
+ checksum: 1101a33f21baa27a2fa8e04b698271e64616b886795fd43c31068c07533c7b3facfcaf4e9e0cab3624bd88f729a592f1c901a1a229c9e490eafce411a8644b79
+ languageName: node
+ linkType: hard
+
+"ansi-regex@npm:^5.0.1":
+ version: 5.0.1
+ resolution: "ansi-regex@npm:5.0.1"
+ checksum: 2aa4bb54caf2d622f1afdad09441695af2a83aa3fe8b8afa581d205e57ed4261c183c4d3877cee25794443fde5876417d859c108078ab788d6af7e4fe52eb66b
+ languageName: node
+ linkType: hard
+
+"ansi-regex@npm:^6.0.1":
+ version: 6.1.0
+ resolution: "ansi-regex@npm:6.1.0"
+ checksum: 495834a53b0856c02acd40446f7130cb0f8284f4a39afdab20d5dc42b2e198b1196119fe887beed8f9055c4ff2055e3b2f6d4641d0be018cdfb64fedf6fc1aac
+ languageName: node
+ linkType: hard
+
+"ansi-styles@npm:^4.0.0":
+ version: 4.3.0
+ resolution: "ansi-styles@npm:4.3.0"
+ dependencies:
+ color-convert: ^2.0.1
+ checksum: 513b44c3b2105dd14cc42a19271e80f386466c4be574bccf60b627432f9198571ebf4ab1e4c3ba17347658f4ee1711c163d574248c0c1cdc2d5917a0ad582ec4
+ languageName: node
+ linkType: hard
+
+"ansi-styles@npm:^6.1.0":
+ version: 6.2.1
+ resolution: "ansi-styles@npm:6.2.1"
+ checksum: ef940f2f0ced1a6347398da88a91da7930c33ecac3c77b72c5905f8b8fe402c52e6fde304ff5347f616e27a742da3f1dc76de98f6866c69251ad0b07a66776d9
+ languageName: node
+ linkType: hard
+
+"any-promise@npm:^1.0.0":
+ version: 1.3.0
+ resolution: "any-promise@npm:1.3.0"
+ checksum: 0ee8a9bdbe882c90464d75d1f55cf027f5458650c4bd1f0467e65aec38ccccda07ca5844969ee77ed46d04e7dded3eaceb027e8d32f385688523fe305fa7e1de
+ languageName: node
+ linkType: hard
+
+"anymatch@npm:~3.1.2":
+ version: 3.1.3
+ resolution: "anymatch@npm:3.1.3"
+ dependencies:
+ normalize-path: ^3.0.0
+ picomatch: ^2.0.4
+ checksum: 3e044fd6d1d26545f235a9fe4d7a534e2029d8e59fa7fd9f2a6eb21230f6b5380ea1eaf55136e60cbf8e613544b3b766e7a6fa2102e2a3a117505466e3025dc2
+ languageName: node
+ linkType: hard
+
+"arg@npm:^5.0.2":
+ version: 5.0.2
+ resolution: "arg@npm:5.0.2"
+ checksum: 6c69ada1a9943d332d9e5382393e897c500908d91d5cb735a01120d5f71daf1b339b7b8980cbeaba8fd1afc68e658a739746179e4315a26e8a28951ff9930078
+ languageName: node
+ linkType: hard
+
+"autoprefixer@npm:^10.4.19":
+ version: 10.4.20
+ resolution: "autoprefixer@npm:10.4.20"
+ dependencies:
+ browserslist: ^4.23.3
+ caniuse-lite: ^1.0.30001646
+ fraction.js: ^4.3.7
+ normalize-range: ^0.1.2
+ picocolors: ^1.0.1
+ postcss-value-parser: ^4.2.0
+ peerDependencies:
+ postcss: ^8.1.0
+ bin:
+ autoprefixer: bin/autoprefixer
+ checksum: 187cec2ec356631932b212f76dc64f4419c117fdb2fb9eeeb40867d38ba5ca5ba734e6ceefc9e3af4eec8258e60accdf5cbf2b7708798598fde35cdc3de562d6
+ languageName: node
+ linkType: hard
+
+"balanced-match@npm:^1.0.0":
+ version: 1.0.2
+ resolution: "balanced-match@npm:1.0.2"
+ checksum: 9706c088a283058a8a99e0bf91b0a2f75497f185980d9ffa8b304de1d9e58ebda7c72c07ebf01dadedaac5b2907b2c6f566f660d62bd336c3468e960403b9d65
+ languageName: node
+ linkType: hard
+
+"binary-extensions@npm:^2.0.0":
+ version: 2.3.0
+ resolution: "binary-extensions@npm:2.3.0"
+ checksum: bcad01494e8a9283abf18c1b967af65ee79b0c6a9e6fcfafebfe91dbe6e0fc7272bafb73389e198b310516ae04f7ad17d79aacf6cb4c0d5d5202a7e2e52c7d98
+ languageName: node
+ linkType: hard
+
+"brace-expansion@npm:^2.0.1":
+ version: 2.0.1
+ resolution: "brace-expansion@npm:2.0.1"
+ dependencies:
+ balanced-match: ^1.0.0
+ checksum: a61e7cd2e8a8505e9f0036b3b6108ba5e926b4b55089eeb5550cd04a471fe216c96d4fe7e4c7f995c728c554ae20ddfc4244cad10aef255e72b62930afd233d1
+ languageName: node
+ linkType: hard
+
+"braces@npm:^3.0.3, braces@npm:~3.0.2":
+ version: 3.0.3
+ resolution: "braces@npm:3.0.3"
+ dependencies:
+ fill-range: ^7.1.1
+ checksum: b95aa0b3bd909f6cd1720ffcf031aeaf46154dd88b4da01f9a1d3f7ea866a79eba76a6d01cbc3c422b2ee5cdc39a4f02491058d5df0d7bf6e6a162a832df1f69
+ languageName: node
+ linkType: hard
+
+"broadcast-channel@npm:^7.0.0":
+ version: 7.0.0
+ resolution: "broadcast-channel@npm:7.0.0"
+ dependencies:
+ "@babel/runtime": 7.23.4
+ oblivious-set: 1.4.0
+ p-queue: 6.6.2
+ unload: 2.4.1
+ checksum: 6285d0796d01541f36a845dcea828f6eabd67a3bca0995c48d8bea35bc583abe23db609284a5f990fad4394c695587e6cb9c9e25afbbc82444b9f2b74a88ff7d
+ languageName: node
+ linkType: hard
+
+"browserslist@npm:^4.23.3":
+ version: 4.24.2
+ resolution: "browserslist@npm:4.24.2"
+ dependencies:
+ caniuse-lite: ^1.0.30001669
+ electron-to-chromium: ^1.5.41
+ node-releases: ^2.0.18
+ update-browserslist-db: ^1.1.1
+ bin:
+ browserslist: cli.js
+ checksum: cf64085f12132d38638f38937a255edb82c7551b164a98577b055dd79719187a816112f7b97b9739e400c4954cd66479c0d7a843cb816e346f4795dc24fd5d97
+ languageName: node
+ linkType: hard
+
+"busboy@npm:1.6.0":
+ version: 1.6.0
+ resolution: "busboy@npm:1.6.0"
+ dependencies:
+ streamsearch: ^1.1.0
+ checksum: 32801e2c0164e12106bf236291a00795c3c4e4b709ae02132883fe8478ba2ae23743b11c5735a0aae8afe65ac4b6ca4568b91f0d9fed1fdbc32ede824a73746e
+ languageName: node
+ linkType: hard
+
+"cacache@npm:^18.0.0":
+ version: 18.0.4
+ resolution: "cacache@npm:18.0.4"
+ dependencies:
+ "@npmcli/fs": ^3.1.0
+ fs-minipass: ^3.0.0
+ glob: ^10.2.2
+ lru-cache: ^10.0.1
+ minipass: ^7.0.3
+ minipass-collect: ^2.0.1
+ minipass-flush: ^1.0.5
+ minipass-pipeline: ^1.2.4
+ p-map: ^4.0.0
+ ssri: ^10.0.0
+ tar: ^6.1.11
+ unique-filename: ^3.0.0
+ checksum: b7422c113b4ec750f33beeca0f426a0024c28e3172f332218f48f963e5b970647fa1ac05679fe5bb448832c51efea9fda4456b9a95c3a1af1105fe6c1833cde2
+ languageName: node
+ linkType: hard
+
+"camelcase-css@npm:^2.0.1":
+ version: 2.0.1
+ resolution: "camelcase-css@npm:2.0.1"
+ checksum: 1cec2b3b3dcb5026688a470b00299a8db7d904c4802845c353dbd12d9d248d3346949a814d83bfd988d4d2e5b9904c07efe76fecd195a1d4f05b543e7c0b56b1
+ languageName: node
+ linkType: hard
+
+"caniuse-lite@npm:^1.0.30001579, caniuse-lite@npm:^1.0.30001646, caniuse-lite@npm:^1.0.30001669":
+ version: 1.0.30001683
+ resolution: "caniuse-lite@npm:1.0.30001683"
+ checksum: 66c5d4882f1e1a251b1fe63f8dc530165e980f11681cd96851c3da68d3464e66dc28479c4c0aaa6a1a781f96db451207688f4b57904b3d07cfd28ae306d34122
+ languageName: node
+ linkType: hard
+
+"chokidar@npm:^3.6.0":
+ version: 3.6.0
+ resolution: "chokidar@npm:3.6.0"
+ dependencies:
+ anymatch: ~3.1.2
+ braces: ~3.0.2
+ fsevents: ~2.3.2
+ glob-parent: ~5.1.2
+ is-binary-path: ~2.1.0
+ is-glob: ~4.0.1
+ normalize-path: ~3.0.0
+ readdirp: ~3.6.0
+ dependenciesMeta:
+ fsevents:
+ optional: true
+ checksum: d2f29f499705dcd4f6f3bbed79a9ce2388cf530460122eed3b9c48efeab7a4e28739c6551fd15bec9245c6b9eeca7a32baa64694d64d9b6faeb74ddb8c4a413d
+ languageName: node
+ linkType: hard
+
+"chownr@npm:^2.0.0":
+ version: 2.0.0
+ resolution: "chownr@npm:2.0.0"
+ checksum: c57cf9dd0791e2f18a5ee9c1a299ae6e801ff58fee96dc8bfd0dcb4738a6ce58dd252a3605b1c93c6418fe4f9d5093b28ffbf4d66648cb2a9c67eaef9679be2f
+ languageName: node
+ linkType: hard
+
+"clean-stack@npm:^2.0.0":
+ version: 2.2.0
+ resolution: "clean-stack@npm:2.2.0"
+ checksum: 2ac8cd2b2f5ec986a3c743935ec85b07bc174d5421a5efc8017e1f146a1cf5f781ae962618f416352103b32c9cd7e203276e8c28241bbe946160cab16149fb68
+ languageName: node
+ linkType: hard
+
+"client-only@npm:0.0.1":
+ version: 0.0.1
+ resolution: "client-only@npm:0.0.1"
+ checksum: 0c16bf660dadb90610553c1d8946a7fdfb81d624adea073b8440b7d795d5b5b08beb3c950c6a2cf16279365a3265158a236876d92bce16423c485c322d7dfaf8
+ languageName: node
+ linkType: hard
+
+"clone@npm:2.x":
+ version: 2.1.2
+ resolution: "clone@npm:2.1.2"
+ checksum: aaf106e9bc025b21333e2f4c12da539b568db4925c0501a1bf4070836c9e848c892fa22c35548ce0d1132b08bbbfa17a00144fe58fccdab6fa900fec4250f67d
+ languageName: node
+ linkType: hard
+
+"clsx@npm:^2.0.0, clsx@npm:^2.1.1":
+ version: 2.1.1
+ resolution: "clsx@npm:2.1.1"
+ checksum: acd3e1ab9d8a433ecb3cc2f6a05ab95fe50b4a3cfc5ba47abb6cbf3754585fcb87b84e90c822a1f256c4198e3b41c7f6c391577ffc8678ad587fc0976b24fd57
+ languageName: node
+ linkType: hard
+
+"color-convert@npm:^2.0.1":
+ version: 2.0.1
+ resolution: "color-convert@npm:2.0.1"
+ dependencies:
+ color-name: ~1.1.4
+ checksum: 79e6bdb9fd479a205c71d89574fccfb22bd9053bd98c6c4d870d65c132e5e904e6034978e55b43d69fcaa7433af2016ee203ce76eeba9cfa554b373e7f7db336
+ languageName: node
+ linkType: hard
+
+"color-name@npm:^1.0.0, color-name@npm:~1.1.4":
+ version: 1.1.4
+ resolution: "color-name@npm:1.1.4"
+ checksum: b0445859521eb4021cd0fb0cc1a75cecf67fceecae89b63f62b201cca8d345baf8b952c966862a9d9a2632987d4f6581f0ec8d957dfacece86f0a7919316f610
+ languageName: node
+ linkType: hard
+
+"color-string@npm:^1.9.0":
+ version: 1.9.1
+ resolution: "color-string@npm:1.9.1"
+ dependencies:
+ color-name: ^1.0.0
+ simple-swizzle: ^0.2.2
+ checksum: c13fe7cff7885f603f49105827d621ce87f4571d78ba28ef4a3f1a104304748f620615e6bf065ecd2145d0d9dad83a3553f52bb25ede7239d18e9f81622f1cc5
+ languageName: node
+ linkType: hard
+
+"color@npm:^4.2.3":
+ version: 4.2.3
+ resolution: "color@npm:4.2.3"
+ dependencies:
+ color-convert: ^2.0.1
+ color-string: ^1.9.0
+ checksum: 0579629c02c631b426780038da929cca8e8d80a40158b09811a0112a107c62e10e4aad719843b791b1e658ab4e800558f2e87ca4522c8b32349d497ecb6adeb4
+ languageName: node
+ linkType: hard
+
+"commander@npm:^4.0.0":
+ version: 4.1.1
+ resolution: "commander@npm:4.1.1"
+ checksum: d7b9913ff92cae20cb577a4ac6fcc121bd6223319e54a40f51a14740a681ad5c574fd29a57da478a5f234a6fa6c52cbf0b7c641353e03c648b1ae85ba670b977
+ languageName: node
+ linkType: hard
+
+"cookie-universal@npm:^2.2.2":
+ version: 2.2.2
+ resolution: "cookie-universal@npm:2.2.2"
+ dependencies:
+ "@types/cookie": ^0.3.3
+ cookie: ^0.4.0
+ checksum: deda97bf2da282075172956279720cd18a8995a8844ab74e489588f0b6ac40de8ee7152ab84a753ddef65ea7b7feef1abe28736593bba337cefd7f6975f89fcd
+ languageName: node
+ linkType: hard
+
+"cookie@npm:^0.4.0":
+ version: 0.4.2
+ resolution: "cookie@npm:0.4.2"
+ checksum: a00833c998bedf8e787b4c342defe5fa419abd96b32f4464f718b91022586b8f1bafbddd499288e75c037642493c83083da426c6a9080d309e3bd90fd11baa9b
+ languageName: node
+ linkType: hard
+
+"cross-spawn@npm:^7.0.0":
+ version: 7.0.6
+ resolution: "cross-spawn@npm:7.0.6"
+ dependencies:
+ path-key: ^3.1.0
+ shebang-command: ^2.0.0
+ which: ^2.0.1
+ checksum: 8d306efacaf6f3f60e0224c287664093fa9185680b2d195852ba9a863f85d02dcc737094c6e512175f8ee0161f9b87c73c6826034c2422e39de7d6569cf4503b
+ languageName: node
+ linkType: hard
+
+"cssesc@npm:^3.0.0":
+ version: 3.0.0
+ resolution: "cssesc@npm:3.0.0"
+ bin:
+ cssesc: bin/cssesc
+ checksum: f8c4ababffbc5e2ddf2fa9957dda1ee4af6048e22aeda1869d0d00843223c1b13ad3f5d88b51caa46c994225eacb636b764eb807a8883e2fb6f99b4f4e8c48b2
+ languageName: node
+ linkType: hard
+
+"csstype@npm:^3.0.2":
+ version: 3.1.3
+ resolution: "csstype@npm:3.1.3"
+ checksum: 8db785cc92d259102725b3c694ec0c823f5619a84741b5c7991b8ad135dfaa66093038a1cc63e03361a6cd28d122be48f2106ae72334e067dd619a51f49eddf7
+ languageName: node
+ linkType: hard
+
+"debug@npm:4, debug@npm:^4.3.4":
+ version: 4.3.7
+ resolution: "debug@npm:4.3.7"
+ dependencies:
+ ms: ^2.1.3
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+ checksum: 822d74e209cd910ef0802d261b150314bbcf36c582ccdbb3e70f0894823c17e49a50d3e66d96b633524263975ca16b6a833f3e3b7e030c157169a5fabac63160
+ languageName: node
+ linkType: hard
+
+"detect-libc@npm:^2.0.3":
+ version: 2.0.3
+ resolution: "detect-libc@npm:2.0.3"
+ checksum: 2ba6a939ae55f189aea996ac67afceb650413c7a34726ee92c40fb0deb2400d57ef94631a8a3f052055eea7efb0f99a9b5e6ce923415daa3e68221f963cfc27d
+ languageName: node
+ linkType: hard
+
+"didyoumean@npm:^1.2.2":
+ version: 1.2.2
+ resolution: "didyoumean@npm:1.2.2"
+ checksum: d5d98719d58b3c2fa59663c4c42ba9716f1fd01245c31d5fce31915bd3aa26e6aac149788e007358f778ebbd68a2256eb5973e8ca6f221df221ba060115acf2e
+ languageName: node
+ linkType: hard
+
+"dlv@npm:^1.1.3":
+ version: 1.1.3
+ resolution: "dlv@npm:1.1.3"
+ checksum: d7381bca22ed11933a1ccf376db7a94bee2c57aa61e490f680124fa2d1cd27e94eba641d9f45be57caab4f9a6579de0983466f620a2cd6230d7ec93312105ae7
+ languageName: node
+ linkType: hard
+
+"eastasianwidth@npm:^0.2.0":
+ version: 0.2.0
+ resolution: "eastasianwidth@npm:0.2.0"
+ checksum: 7d00d7cd8e49b9afa762a813faac332dee781932d6f2c848dc348939c4253f1d4564341b7af1d041853bc3f32c2ef141b58e0a4d9862c17a7f08f68df1e0f1ed
+ languageName: node
+ linkType: hard
+
+"electron-to-chromium@npm:^1.5.41":
+ version: 1.5.63
+ resolution: "electron-to-chromium@npm:1.5.63"
+ checksum: aa3d0a48753af052158ef3e46d65042b91f1934a4ab02732a0ce27429ba989dea7e4badbf991e58dff8acf5e64b967a964b61985c05ce45e03457c4f917a06f8
+ languageName: node
+ linkType: hard
+
+"emoji-regex@npm:^8.0.0":
+ version: 8.0.0
+ resolution: "emoji-regex@npm:8.0.0"
+ checksum: d4c5c39d5a9868b5fa152f00cada8a936868fd3367f33f71be515ecee4c803132d11b31a6222b2571b1e5f7e13890156a94880345594d0ce7e3c9895f560f192
+ languageName: node
+ linkType: hard
+
+"emoji-regex@npm:^9.2.2":
+ version: 9.2.2
+ resolution: "emoji-regex@npm:9.2.2"
+ checksum: 8487182da74aabd810ac6d6f1994111dfc0e331b01271ae01ec1eb0ad7b5ecc2bbbbd2f053c05cb55a1ac30449527d819bbfbf0e3de1023db308cbcb47f86601
+ languageName: node
+ linkType: hard
+
+"encoding@npm:^0.1.13":
+ version: 0.1.13
+ resolution: "encoding@npm:0.1.13"
+ dependencies:
+ iconv-lite: ^0.6.2
+ checksum: bb98632f8ffa823996e508ce6a58ffcf5856330fde839ae42c9e1f436cc3b5cc651d4aeae72222916545428e54fd0f6aa8862fd8d25bdbcc4589f1e3f3715e7f
+ languageName: node
+ linkType: hard
+
+"env-paths@npm:^2.2.0":
+ version: 2.2.1
+ resolution: "env-paths@npm:2.2.1"
+ checksum: 65b5df55a8bab92229ab2b40dad3b387fad24613263d103a97f91c9fe43ceb21965cd3392b1ccb5d77088021e525c4e0481adb309625d0cb94ade1d1fb8dc17e
+ languageName: node
+ linkType: hard
+
+"err-code@npm:^2.0.2":
+ version: 2.0.3
+ resolution: "err-code@npm:2.0.3"
+ checksum: 8b7b1be20d2de12d2255c0bc2ca638b7af5171142693299416e6a9339bd7d88fc8d7707d913d78e0993176005405a236b066b45666b27b797252c771156ace54
+ languageName: node
+ linkType: hard
+
+"escalade@npm:^3.2.0":
+ version: 3.2.0
+ resolution: "escalade@npm:3.2.0"
+ checksum: 47b029c83de01b0d17ad99ed766347b974b0d628e848de404018f3abee728e987da0d2d370ad4574aa3d5b5bfc368754fd085d69a30f8e75903486ec4b5b709e
+ languageName: node
+ linkType: hard
+
+"eventemitter3@npm:^4.0.4":
+ version: 4.0.7
+ resolution: "eventemitter3@npm:4.0.7"
+ checksum: 1875311c42fcfe9c707b2712c32664a245629b42bb0a5a84439762dd0fd637fc54d078155ea83c2af9e0323c9ac13687e03cfba79b03af9f40c89b4960099374
+ languageName: node
+ linkType: hard
+
+"exponential-backoff@npm:^3.1.1":
+ version: 3.1.1
+ resolution: "exponential-backoff@npm:3.1.1"
+ checksum: 3d21519a4f8207c99f7457287291316306255a328770d320b401114ec8481986e4e467e854cb9914dd965e0a1ca810a23ccb559c642c88f4c7f55c55778a9b48
+ languageName: node
+ linkType: hard
+
+"fast-glob@npm:^3.3.2":
+ version: 3.3.2
+ resolution: "fast-glob@npm:3.3.2"
+ dependencies:
+ "@nodelib/fs.stat": ^2.0.2
+ "@nodelib/fs.walk": ^1.2.3
+ glob-parent: ^5.1.2
+ merge2: ^1.3.0
+ micromatch: ^4.0.4
+ checksum: 900e4979f4dbc3313840078419245621259f349950411ca2fa445a2f9a1a6d98c3b5e7e0660c5ccd563aa61abe133a21765c6c0dec8e57da1ba71d8000b05ec1
+ languageName: node
+ linkType: hard
+
+"fastq@npm:^1.6.0":
+ version: 1.17.1
+ resolution: "fastq@npm:1.17.1"
+ dependencies:
+ reusify: ^1.0.4
+ checksum: a8c5b26788d5a1763f88bae56a8ddeee579f935a831c5fe7a8268cea5b0a91fbfe705f612209e02d639b881d7b48e461a50da4a10cfaa40da5ca7cc9da098d88
+ languageName: node
+ linkType: hard
+
+"fill-range@npm:^7.1.1":
+ version: 7.1.1
+ resolution: "fill-range@npm:7.1.1"
+ dependencies:
+ to-regex-range: ^5.0.1
+ checksum: b4abfbca3839a3d55e4ae5ec62e131e2e356bf4859ce8480c64c4876100f4df292a63e5bb1618e1d7460282ca2b305653064f01654474aa35c68000980f17798
+ languageName: node
+ linkType: hard
+
+"foreground-child@npm:^3.1.0":
+ version: 3.3.0
+ resolution: "foreground-child@npm:3.3.0"
+ dependencies:
+ cross-spawn: ^7.0.0
+ signal-exit: ^4.0.1
+ checksum: 1989698488f725b05b26bc9afc8a08f08ec41807cd7b92ad85d96004ddf8243fd3e79486b8348c64a3011ae5cc2c9f0936af989e1f28339805d8bc178a75b451
+ languageName: node
+ linkType: hard
+
+"fraction.js@npm:^4.3.7":
+ version: 4.3.7
+ resolution: "fraction.js@npm:4.3.7"
+ checksum: e1553ae3f08e3ba0e8c06e43a3ab20b319966dfb7ddb96fd9b5d0ee11a66571af7f993229c88ebbb0d4a816eb813a24ed48207b140d442a8f76f33763b8d1f3f
+ languageName: node
+ linkType: hard
+
+"fs-minipass@npm:^2.0.0":
+ version: 2.1.0
+ resolution: "fs-minipass@npm:2.1.0"
+ dependencies:
+ minipass: ^3.0.0
+ checksum: 1b8d128dae2ac6cc94230cc5ead341ba3e0efaef82dab46a33d171c044caaa6ca001364178d42069b2809c35a1c3c35079a32107c770e9ffab3901b59af8c8b1
+ languageName: node
+ linkType: hard
+
+"fs-minipass@npm:^3.0.0":
+ version: 3.0.3
+ resolution: "fs-minipass@npm:3.0.3"
+ dependencies:
+ minipass: ^7.0.3
+ checksum: 8722a41109130851d979222d3ec88aabaceeaaf8f57b2a8f744ef8bd2d1ce95453b04a61daa0078822bc5cd21e008814f06fe6586f56fef511e71b8d2394d802
+ languageName: node
+ linkType: hard
+
+"fsevents@npm:~2.3.2":
+ version: 2.3.3
+ resolution: "fsevents@npm:2.3.3"
+ dependencies:
+ node-gyp: latest
+ checksum: 11e6ea6fea15e42461fc55b4b0e4a0a3c654faa567f1877dbd353f39156f69def97a69936d1746619d656c4b93de2238bf731f6085a03a50cabf287c9d024317
+ conditions: os=darwin
+ languageName: node
+ linkType: hard
+
+"fsevents@patch:fsevents@~2.3.2#~builtin":
+ version: 2.3.3
+ resolution: "fsevents@patch:fsevents@npm%3A2.3.3#~builtin::version=2.3.3&hash=df0bf1"
+ dependencies:
+ node-gyp: latest
+ conditions: os=darwin
+ languageName: node
+ linkType: hard
+
+"function-bind@npm:^1.1.2":
+ version: 1.1.2
+ resolution: "function-bind@npm:1.1.2"
+ checksum: 2b0ff4ce708d99715ad14a6d1f894e2a83242e4a52ccfcefaee5e40050562e5f6dafc1adbb4ce2d4ab47279a45dc736ab91ea5042d843c3c092820dfe032efb1
+ languageName: node
+ linkType: hard
+
+"geist@npm:^1.3.1":
+ version: 1.3.1
+ resolution: "geist@npm:1.3.1"
+ peerDependencies:
+ next: ">=13.2.0"
+ checksum: d8e420a6a139a88e1787c807553fe7719b86c625b0dc0ec1fdac484825b6048d6814f4f577668101cc3cb26f2371eb3d9866855a0b273fa0764400130165243d
+ languageName: node
+ linkType: hard
+
+"glob-parent@npm:^5.1.2, glob-parent@npm:~5.1.2":
+ version: 5.1.2
+ resolution: "glob-parent@npm:5.1.2"
+ dependencies:
+ is-glob: ^4.0.1
+ checksum: f4f2bfe2425296e8a47e36864e4f42be38a996db40420fe434565e4480e3322f18eb37589617a98640c5dc8fdec1a387007ee18dbb1f3f5553409c34d17f425e
+ languageName: node
+ linkType: hard
+
+"glob-parent@npm:^6.0.2":
+ version: 6.0.2
+ resolution: "glob-parent@npm:6.0.2"
+ dependencies:
+ is-glob: ^4.0.3
+ checksum: c13ee97978bef4f55106b71e66428eb1512e71a7466ba49025fc2aec59a5bfb0954d5abd58fc5ee6c9b076eef4e1f6d3375c2e964b88466ca390da4419a786a8
+ languageName: node
+ linkType: hard
+
+"glob@npm:^10.2.2, glob@npm:^10.3.10":
+ version: 10.4.5
+ resolution: "glob@npm:10.4.5"
+ dependencies:
+ foreground-child: ^3.1.0
+ jackspeak: ^3.1.2
+ minimatch: ^9.0.4
+ minipass: ^7.1.2
+ package-json-from-dist: ^1.0.0
+ path-scurry: ^1.11.1
+ bin:
+ glob: dist/esm/bin.mjs
+ checksum: 0bc725de5e4862f9f387fd0f2b274baf16850dcd2714502ccf471ee401803997983e2c05590cb65f9675a3c6f2a58e7a53f9e365704108c6ad3cbf1d60934c4a
+ languageName: node
+ linkType: hard
+
+"graceful-fs@npm:^4.2.6":
+ version: 4.2.11
+ resolution: "graceful-fs@npm:4.2.11"
+ checksum: ac85f94da92d8eb6b7f5a8b20ce65e43d66761c55ce85ac96df6865308390da45a8d3f0296dd3a663de65d30ba497bd46c696cc1e248c72b13d6d567138a4fc7
+ languageName: node
+ linkType: hard
+
+"graphql-tag@npm:^2.12.6":
+ version: 2.12.6
+ resolution: "graphql-tag@npm:2.12.6"
+ dependencies:
+ tslib: ^2.1.0
+ peerDependencies:
+ graphql: ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0
+ checksum: b15162a3d62f17b9b79302445b9ee330e041582f1c7faca74b9dec5daa74272c906ec1c34e1c50592bb6215e5c3eba80a309103f6ba9e4c1cddc350c46f010df
+ languageName: node
+ linkType: hard
+
+"graphql@npm:^16.9.0":
+ version: 16.9.0
+ resolution: "graphql@npm:16.9.0"
+ checksum: 8cb3d54100e9227310383ce7f791ca48d12f15ed9f2021f23f8735f1121aafe4e5e611a853081dd935ce221724ea1ae4638faef5d2921fb1ad7c26b5f46611e9
+ languageName: node
+ linkType: hard
+
+"hasown@npm:^2.0.2":
+ version: 2.0.2
+ resolution: "hasown@npm:2.0.2"
+ dependencies:
+ function-bind: ^1.1.2
+ checksum: e8516f776a15149ca6c6ed2ae3110c417a00b62260e222590e54aa367cbcd6ed99122020b37b7fbdf05748df57b265e70095d7bf35a47660587619b15ffb93db
+ languageName: node
+ linkType: hard
+
+"hoist-non-react-statics@npm:^3.3.2":
+ version: 3.3.2
+ resolution: "hoist-non-react-statics@npm:3.3.2"
+ dependencies:
+ react-is: ^16.7.0
+ checksum: b1538270429b13901ee586aa44f4cc3ecd8831c061d06cb8322e50ea17b3f5ce4d0e2e66394761e6c8e152cd8c34fb3b4b690116c6ce2bd45b18c746516cb9e8
+ languageName: node
+ linkType: hard
+
+"http-cache-semantics@npm:^4.1.1":
+ version: 4.1.1
+ resolution: "http-cache-semantics@npm:4.1.1"
+ checksum: 83ac0bc60b17a3a36f9953e7be55e5c8f41acc61b22583060e8dedc9dd5e3607c823a88d0926f9150e571f90946835c7fe150732801010845c72cd8bbff1a236
+ languageName: node
+ linkType: hard
+
+"http-proxy-agent@npm:^7.0.0":
+ version: 7.0.2
+ resolution: "http-proxy-agent@npm:7.0.2"
+ dependencies:
+ agent-base: ^7.1.0
+ debug: ^4.3.4
+ checksum: 670858c8f8f3146db5889e1fa117630910101db601fff7d5a8aa637da0abedf68c899f03d3451cac2f83bcc4c3d2dabf339b3aa00ff8080571cceb02c3ce02f3
+ languageName: node
+ linkType: hard
+
+"https-proxy-agent@npm:^7.0.1":
+ version: 7.0.5
+ resolution: "https-proxy-agent@npm:7.0.5"
+ dependencies:
+ agent-base: ^7.0.2
+ debug: 4
+ checksum: 2e1a28960f13b041a50702ee74f240add8e75146a5c37fc98f1960f0496710f6918b3a9fe1e5aba41e50f58e6df48d107edd9c405c5f0d73ac260dabf2210857
+ languageName: node
+ linkType: hard
+
+"iconv-lite@npm:^0.6.2":
+ version: 0.6.3
+ resolution: "iconv-lite@npm:0.6.3"
+ dependencies:
+ safer-buffer: ">= 2.1.2 < 3.0.0"
+ checksum: 3f60d47a5c8fc3313317edfd29a00a692cc87a19cac0159e2ce711d0ebc9019064108323b5e493625e25594f11c6236647d8e256fbe7a58f4a3b33b89e6d30bf
+ languageName: node
+ linkType: hard
+
+"imurmurhash@npm:^0.1.4":
+ version: 0.1.4
+ resolution: "imurmurhash@npm:0.1.4"
+ checksum: 7cae75c8cd9a50f57dadd77482359f659eaebac0319dd9368bcd1714f55e65badd6929ca58569da2b6494ef13fdd5598cd700b1eba23f8b79c5f19d195a3ecf7
+ languageName: node
+ linkType: hard
+
+"indent-string@npm:^4.0.0":
+ version: 4.0.0
+ resolution: "indent-string@npm:4.0.0"
+ checksum: 824cfb9929d031dabf059bebfe08cf3137365e112019086ed3dcff6a0a7b698cb80cf67ccccde0e25b9e2d7527aa6cc1fed1ac490c752162496caba3e6699612
+ languageName: node
+ linkType: hard
+
+"ip-address@npm:^9.0.5":
+ version: 9.0.5
+ resolution: "ip-address@npm:9.0.5"
+ dependencies:
+ jsbn: 1.1.0
+ sprintf-js: ^1.1.3
+ checksum: aa15f12cfd0ef5e38349744e3654bae649a34c3b10c77a674a167e99925d1549486c5b14730eebce9fea26f6db9d5e42097b00aa4f9f612e68c79121c71652dc
+ languageName: node
+ linkType: hard
+
+"is-arrayish@npm:^0.3.1":
+ version: 0.3.2
+ resolution: "is-arrayish@npm:0.3.2"
+ checksum: 977e64f54d91c8f169b59afcd80ff19227e9f5c791fa28fa2e5bce355cbaf6c2c356711b734656e80c9dd4a854dd7efcf7894402f1031dfc5de5d620775b4d5f
+ languageName: node
+ linkType: hard
+
+"is-binary-path@npm:~2.1.0":
+ version: 2.1.0
+ resolution: "is-binary-path@npm:2.1.0"
+ dependencies:
+ binary-extensions: ^2.0.0
+ checksum: 84192eb88cff70d320426f35ecd63c3d6d495da9d805b19bc65b518984b7c0760280e57dbf119b7e9be6b161784a5a673ab2c6abe83abb5198a432232ad5b35c
+ languageName: node
+ linkType: hard
+
+"is-core-module@npm:^2.13.0":
+ version: 2.15.1
+ resolution: "is-core-module@npm:2.15.1"
+ dependencies:
+ hasown: ^2.0.2
+ checksum: df134c168115690724b62018c37b2f5bba0d5745fa16960b329c5a00883a8bea6a5632fdb1e3efcce237c201826ba09f93197b7cd95577ea56b0df335be23633
+ languageName: node
+ linkType: hard
+
+"is-extglob@npm:^2.1.1":
+ version: 2.1.1
+ resolution: "is-extglob@npm:2.1.1"
+ checksum: df033653d06d0eb567461e58a7a8c9f940bd8c22274b94bf7671ab36df5719791aae15eef6d83bbb5e23283967f2f984b8914559d4449efda578c775c4be6f85
+ languageName: node
+ linkType: hard
+
+"is-fullwidth-code-point@npm:^3.0.0":
+ version: 3.0.0
+ resolution: "is-fullwidth-code-point@npm:3.0.0"
+ checksum: 44a30c29457c7fb8f00297bce733f0a64cd22eca270f83e58c105e0d015e45c019491a4ab2faef91ab51d4738c670daff901c799f6a700e27f7314029e99e348
+ languageName: node
+ linkType: hard
+
+"is-glob@npm:^4.0.1, is-glob@npm:^4.0.3, is-glob@npm:~4.0.1":
+ version: 4.0.3
+ resolution: "is-glob@npm:4.0.3"
+ dependencies:
+ is-extglob: ^2.1.1
+ checksum: d381c1319fcb69d341cc6e6c7cd588e17cd94722d9a32dbd60660b993c4fb7d0f19438674e68dfec686d09b7c73139c9166b47597f846af387450224a8101ab4
+ languageName: node
+ linkType: hard
+
+"is-lambda@npm:^1.0.1":
+ version: 1.0.1
+ resolution: "is-lambda@npm:1.0.1"
+ checksum: 93a32f01940220532e5948538699ad610d5924ac86093fcee83022252b363eb0cc99ba53ab084a04e4fb62bf7b5731f55496257a4c38adf87af9c4d352c71c35
+ languageName: node
+ linkType: hard
+
+"is-number@npm:^7.0.0":
+ version: 7.0.0
+ resolution: "is-number@npm:7.0.0"
+ checksum: 456ac6f8e0f3111ed34668a624e45315201dff921e5ac181f8ec24923b99e9f32ca1a194912dc79d539c97d33dba17dc635202ff0b2cf98326f608323276d27a
+ languageName: node
+ linkType: hard
+
+"isexe@npm:^2.0.0":
+ version: 2.0.0
+ resolution: "isexe@npm:2.0.0"
+ checksum: 26bf6c5480dda5161c820c5b5c751ae1e766c587b1f951ea3fcfc973bafb7831ae5b54a31a69bd670220e42e99ec154475025a468eae58ea262f813fdc8d1c62
+ languageName: node
+ linkType: hard
+
+"isexe@npm:^3.1.1":
+ version: 3.1.1
+ resolution: "isexe@npm:3.1.1"
+ checksum: 7fe1931ee4e88eb5aa524cd3ceb8c882537bc3a81b02e438b240e47012eef49c86904d0f0e593ea7c3a9996d18d0f1f3be8d3eaa92333977b0c3a9d353d5563e
+ languageName: node
+ linkType: hard
+
+"jackspeak@npm:^3.1.2":
+ version: 3.4.3
+ resolution: "jackspeak@npm:3.4.3"
+ dependencies:
+ "@isaacs/cliui": ^8.0.2
+ "@pkgjs/parseargs": ^0.11.0
+ dependenciesMeta:
+ "@pkgjs/parseargs":
+ optional: true
+ checksum: be31027fc72e7cc726206b9f560395604b82e0fddb46c4cbf9f97d049bcef607491a5afc0699612eaa4213ca5be8fd3e1e7cd187b3040988b65c9489838a7c00
+ languageName: node
+ linkType: hard
+
+"jiti@npm:^1.21.6":
+ version: 1.21.6
+ resolution: "jiti@npm:1.21.6"
+ bin:
+ jiti: bin/jiti.js
+ checksum: 9ea4a70a7bb950794824683ed1c632e2ede26949fbd348e2ba5ec8dc5efa54dc42022d85ae229cadaa60d4b95012e80ea07d625797199b688cc22ab0e8891d32
+ languageName: node
+ linkType: hard
+
+"js-tokens@npm:^3.0.0 || ^4.0.0":
+ version: 4.0.0
+ resolution: "js-tokens@npm:4.0.0"
+ checksum: 8a95213a5a77deb6cbe94d86340e8d9ace2b93bc367790b260101d2f36a2eaf4e4e22d9fa9cf459b38af3a32fb4190e638024cf82ec95ef708680e405ea7cc78
+ languageName: node
+ linkType: hard
+
+"jsbn@npm:1.1.0":
+ version: 1.1.0
+ resolution: "jsbn@npm:1.1.0"
+ checksum: 944f924f2bd67ad533b3850eee47603eed0f6ae425fd1ee8c760f477e8c34a05f144c1bd4f5a5dd1963141dc79a2c55f89ccc5ab77d039e7077f3ad196b64965
+ languageName: node
+ linkType: hard
+
+"lilconfig@npm:^2.1.0":
+ version: 2.1.0
+ resolution: "lilconfig@npm:2.1.0"
+ checksum: 8549bb352b8192375fed4a74694cd61ad293904eee33f9d4866c2192865c44c4eb35d10782966242634e0cbc1e91fe62b1247f148dc5514918e3a966da7ea117
+ languageName: node
+ linkType: hard
+
+"lilconfig@npm:^3.0.0":
+ version: 3.1.2
+ resolution: "lilconfig@npm:3.1.2"
+ checksum: 4e8b83ddd1d0ad722600994e6ba5d858ddca14f0587aa6b9c8185e17548149b5e13d4d583d811e9e9323157fa8c6a527e827739794c7502b59243c58e210b8c3
+ languageName: node
+ linkType: hard
+
+"lines-and-columns@npm:^1.1.6":
+ version: 1.2.4
+ resolution: "lines-and-columns@npm:1.2.4"
+ checksum: 0c37f9f7fa212b38912b7145e1cd16a5f3cd34d782441c3e6ca653485d326f58b3caccda66efce1c5812bde4961bbde3374fae4b0d11bf1226152337f3894aa5
+ languageName: node
+ linkType: hard
+
+"lodash.castarray@npm:^4.4.0":
+ version: 4.4.0
+ resolution: "lodash.castarray@npm:4.4.0"
+ checksum: fca8c7047e0ae2738b0b2503fb00157ae0ff6d8a1b716f87ed715b22560e09de438c75b65e01a7e44ceb41c5b31dce2eb576e46db04beb9c699c498e03cbd00f
+ languageName: node
+ linkType: hard
+
+"lodash.isplainobject@npm:^4.0.6":
+ version: 4.0.6
+ resolution: "lodash.isplainobject@npm:4.0.6"
+ checksum: 29c6351f281e0d9a1d58f1a4c8f4400924b4c79f18dfc4613624d7d54784df07efaff97c1ff2659f3e085ecf4fff493300adc4837553104cef2634110b0d5337
+ languageName: node
+ linkType: hard
+
+"lodash.merge@npm:^4.6.2":
+ version: 4.6.2
+ resolution: "lodash.merge@npm:4.6.2"
+ checksum: ad580b4bdbb7ca1f7abf7e1bce63a9a0b98e370cf40194b03380a46b4ed799c9573029599caebc1b14e3f24b111aef72b96674a56cfa105e0f5ac70546cdc005
+ languageName: node
+ linkType: hard
+
+"loose-envify@npm:^1.4.0":
+ version: 1.4.0
+ resolution: "loose-envify@npm:1.4.0"
+ dependencies:
+ js-tokens: ^3.0.0 || ^4.0.0
+ bin:
+ loose-envify: cli.js
+ checksum: 6517e24e0cad87ec9888f500c5b5947032cdfe6ef65e1c1936a0c48a524b81e65542c9c3edc91c97d5bddc806ee2a985dbc79be89215d613b1de5db6d1cfe6f4
+ languageName: node
+ linkType: hard
+
+"lru-cache@npm:^10.0.1, lru-cache@npm:^10.2.0":
+ version: 10.4.3
+ resolution: "lru-cache@npm:10.4.3"
+ checksum: 6476138d2125387a6d20f100608c2583d415a4f64a0fecf30c9e2dda976614f09cad4baa0842447bd37dd459a7bd27f57d9d8f8ce558805abd487c583f3d774a
+ languageName: node
+ linkType: hard
+
+"make-fetch-happen@npm:^13.0.0":
+ version: 13.0.1
+ resolution: "make-fetch-happen@npm:13.0.1"
+ dependencies:
+ "@npmcli/agent": ^2.0.0
+ cacache: ^18.0.0
+ http-cache-semantics: ^4.1.1
+ is-lambda: ^1.0.1
+ minipass: ^7.0.2
+ minipass-fetch: ^3.0.0
+ minipass-flush: ^1.0.5
+ minipass-pipeline: ^1.2.4
+ negotiator: ^0.6.3
+ proc-log: ^4.2.0
+ promise-retry: ^2.0.1
+ ssri: ^10.0.0
+ checksum: 5c9fad695579b79488fa100da05777213dd9365222f85e4757630f8dd2a21a79ddd3206c78cfd6f9b37346819681782b67900ac847a57cf04190f52dda5343fd
+ languageName: node
+ linkType: hard
+
+"merge2@npm:^1.3.0":
+ version: 1.4.1
+ resolution: "merge2@npm:1.4.1"
+ checksum: 7268db63ed5169466540b6fb947aec313200bcf6d40c5ab722c22e242f651994619bcd85601602972d3c85bd2cc45a358a4c61937e9f11a061919a1da569b0c2
+ languageName: node
+ linkType: hard
+
+"micromatch@npm:^4.0.4, micromatch@npm:^4.0.8":
+ version: 4.0.8
+ resolution: "micromatch@npm:4.0.8"
+ dependencies:
+ braces: ^3.0.3
+ picomatch: ^2.3.1
+ checksum: 79920eb634e6f400b464a954fcfa589c4e7c7143209488e44baf627f9affc8b1e306f41f4f0deedde97e69cb725920879462d3e750ab3bd3c1aed675bb3a8966
+ languageName: node
+ linkType: hard
+
+"minimatch@npm:^9.0.4":
+ version: 9.0.5
+ resolution: "minimatch@npm:9.0.5"
+ dependencies:
+ brace-expansion: ^2.0.1
+ checksum: 2c035575eda1e50623c731ec6c14f65a85296268f749b9337005210bb2b34e2705f8ef1a358b188f69892286ab99dc42c8fb98a57bde55c8d81b3023c19cea28
+ languageName: node
+ linkType: hard
+
+"minipass-collect@npm:^2.0.1":
+ version: 2.0.1
+ resolution: "minipass-collect@npm:2.0.1"
+ dependencies:
+ minipass: ^7.0.3
+ checksum: b251bceea62090f67a6cced7a446a36f4cd61ee2d5cea9aee7fff79ba8030e416327a1c5aa2908dc22629d06214b46d88fdab8c51ac76bacbf5703851b5ad342
+ languageName: node
+ linkType: hard
+
+"minipass-fetch@npm:^3.0.0":
+ version: 3.0.5
+ resolution: "minipass-fetch@npm:3.0.5"
+ dependencies:
+ encoding: ^0.1.13
+ minipass: ^7.0.3
+ minipass-sized: ^1.0.3
+ minizlib: ^2.1.2
+ dependenciesMeta:
+ encoding:
+ optional: true
+ checksum: 8047d273236157aab27ab7cd8eab7ea79e6ecd63e8f80c3366ec076cb9a0fed550a6935bab51764369027c414647fd8256c2a20c5445fb250c483de43350de83
+ languageName: node
+ linkType: hard
+
+"minipass-flush@npm:^1.0.5":
+ version: 1.0.5
+ resolution: "minipass-flush@npm:1.0.5"
+ dependencies:
+ minipass: ^3.0.0
+ checksum: 56269a0b22bad756a08a94b1ffc36b7c9c5de0735a4dd1ab2b06c066d795cfd1f0ac44a0fcae13eece5589b908ecddc867f04c745c7009be0b566421ea0944cf
+ languageName: node
+ linkType: hard
+
+"minipass-pipeline@npm:^1.2.4":
+ version: 1.2.4
+ resolution: "minipass-pipeline@npm:1.2.4"
+ dependencies:
+ minipass: ^3.0.0
+ checksum: b14240dac0d29823c3d5911c286069e36d0b81173d7bdf07a7e4a91ecdef92cdff4baaf31ea3746f1c61e0957f652e641223970870e2353593f382112257971b
+ languageName: node
+ linkType: hard
+
+"minipass-sized@npm:^1.0.3":
+ version: 1.0.3
+ resolution: "minipass-sized@npm:1.0.3"
+ dependencies:
+ minipass: ^3.0.0
+ checksum: 79076749fcacf21b5d16dd596d32c3b6bf4d6e62abb43868fac21674078505c8b15eaca4e47ed844985a4514854f917d78f588fcd029693709417d8f98b2bd60
+ languageName: node
+ linkType: hard
+
+"minipass@npm:^3.0.0":
+ version: 3.3.6
+ resolution: "minipass@npm:3.3.6"
+ dependencies:
+ yallist: ^4.0.0
+ checksum: a30d083c8054cee83cdcdc97f97e4641a3f58ae743970457b1489ce38ee1167b3aaf7d815cd39ec7a99b9c40397fd4f686e83750e73e652b21cb516f6d845e48
+ languageName: node
+ linkType: hard
+
+"minipass@npm:^5.0.0":
+ version: 5.0.0
+ resolution: "minipass@npm:5.0.0"
+ checksum: 425dab288738853fded43da3314a0b5c035844d6f3097a8e3b5b29b328da8f3c1af6fc70618b32c29ff906284cf6406b6841376f21caaadd0793c1d5a6a620ea
+ languageName: node
+ linkType: hard
+
+"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3, minipass@npm:^7.1.2":
+ version: 7.1.2
+ resolution: "minipass@npm:7.1.2"
+ checksum: 2bfd325b95c555f2b4d2814d49325691c7bee937d753814861b0b49d5edcda55cbbf22b6b6a60bb91eddac8668771f03c5ff647dcd9d0f798e9548b9cdc46ee3
+ languageName: node
+ linkType: hard
+
+"minizlib@npm:^2.1.1, minizlib@npm:^2.1.2":
+ version: 2.1.2
+ resolution: "minizlib@npm:2.1.2"
+ dependencies:
+ minipass: ^3.0.0
+ yallist: ^4.0.0
+ checksum: f1fdeac0b07cf8f30fcf12f4b586795b97be856edea22b5e9072707be51fc95d41487faec3f265b42973a304fe3a64acd91a44a3826a963e37b37bafde0212c3
+ languageName: node
+ linkType: hard
+
+"mkdirp@npm:^1.0.3":
+ version: 1.0.4
+ resolution: "mkdirp@npm:1.0.4"
+ bin:
+ mkdirp: bin/cmd.js
+ checksum: a96865108c6c3b1b8e1d5e9f11843de1e077e57737602de1b82030815f311be11f96f09cce59bd5b903d0b29834733e5313f9301e3ed6d6f6fba2eae0df4298f
+ languageName: node
+ linkType: hard
+
+"ms@npm:^2.1.3":
+ version: 2.1.3
+ resolution: "ms@npm:2.1.3"
+ checksum: aa92de608021b242401676e35cfa5aa42dd70cbdc082b916da7fb925c542173e36bce97ea3e804923fe92c0ad991434e4a38327e15a1b5b5f945d66df615ae6d
+ languageName: node
+ linkType: hard
+
+"mz@npm:^2.7.0":
+ version: 2.7.0
+ resolution: "mz@npm:2.7.0"
+ dependencies:
+ any-promise: ^1.0.0
+ object-assign: ^4.0.1
+ thenify-all: ^1.0.0
+ checksum: 8427de0ece99a07e9faed3c0c6778820d7543e3776f9a84d22cf0ec0a8eb65f6e9aee9c9d353ff9a105ff62d33a9463c6ca638974cc652ee8140cd1e35951c87
+ languageName: node
+ linkType: hard
+
+"nanoid@npm:^3.3.6, nanoid@npm:^3.3.7":
+ version: 3.3.7
+ resolution: "nanoid@npm:3.3.7"
+ bin:
+ nanoid: bin/nanoid.cjs
+ checksum: d36c427e530713e4ac6567d488b489a36582ef89da1d6d4e3b87eded11eb10d7042a877958c6f104929809b2ab0bafa17652b076cdf84324aa75b30b722204f2
+ languageName: node
+ linkType: hard
+
+"negotiator@npm:^0.6.3":
+ version: 0.6.4
+ resolution: "negotiator@npm:0.6.4"
+ checksum: 7ded10aa02a0707d1d12a9973fdb5954f98547ca7beb60e31cb3a403cc6e8f11138db7a3b0128425cf836fc85d145ec4ce983b2bdf83dca436af879c2d683510
+ languageName: node
+ linkType: hard
+
+"next@npm:15.0.3":
+ version: 15.0.3
+ resolution: "next@npm:15.0.3"
+ dependencies:
+ "@next/env": 15.0.3
+ "@next/swc-darwin-arm64": 15.0.3
+ "@next/swc-darwin-x64": 15.0.3
+ "@next/swc-linux-arm64-gnu": 15.0.3
+ "@next/swc-linux-arm64-musl": 15.0.3
+ "@next/swc-linux-x64-gnu": 15.0.3
+ "@next/swc-linux-x64-musl": 15.0.3
+ "@next/swc-win32-arm64-msvc": 15.0.3
+ "@next/swc-win32-x64-msvc": 15.0.3
+ "@swc/counter": 0.1.3
+ "@swc/helpers": 0.5.13
+ busboy: 1.6.0
+ caniuse-lite: ^1.0.30001579
+ postcss: 8.4.31
+ sharp: ^0.33.5
+ styled-jsx: 5.1.6
+ peerDependencies:
+ "@opentelemetry/api": ^1.1.0
+ "@playwright/test": ^1.41.2
+ babel-plugin-react-compiler: "*"
+ react: ^18.2.0 || 19.0.0-rc-66855b96-20241106
+ react-dom: ^18.2.0 || 19.0.0-rc-66855b96-20241106
+ sass: ^1.3.0
+ dependenciesMeta:
+ "@next/swc-darwin-arm64":
+ optional: true
+ "@next/swc-darwin-x64":
+ optional: true
+ "@next/swc-linux-arm64-gnu":
+ optional: true
+ "@next/swc-linux-arm64-musl":
+ optional: true
+ "@next/swc-linux-x64-gnu":
+ optional: true
+ "@next/swc-linux-x64-musl":
+ optional: true
+ "@next/swc-win32-arm64-msvc":
+ optional: true
+ "@next/swc-win32-x64-msvc":
+ optional: true
+ sharp:
+ optional: true
+ peerDependenciesMeta:
+ "@opentelemetry/api":
+ optional: true
+ "@playwright/test":
+ optional: true
+ babel-plugin-react-compiler:
+ optional: true
+ sass:
+ optional: true
+ bin:
+ next: dist/bin/next
+ checksum: 7c37c0fd05c4044fa89dabdac62a81de5300b387411cc9862341f45bd68da180cba7125ef6d2c3961e3409cbf8afd03b6c835cb4a6142c8988b5fc3741e72871
+ languageName: node
+ linkType: hard
+
+"node-cache@npm:^5.1.2":
+ version: 5.1.2
+ resolution: "node-cache@npm:5.1.2"
+ dependencies:
+ clone: 2.x
+ checksum: b0bdd81a6fee4754fb984a05246b510bb35dc54721116d465899bf4229ee3287fdafb47da526900ee9924fb402ed5c7d8050049d37d8bf2d26dbafc23a2c3205
+ languageName: node
+ linkType: hard
+
+"node-gyp@npm:latest":
+ version: 10.2.0
+ resolution: "node-gyp@npm:10.2.0"
+ dependencies:
+ env-paths: ^2.2.0
+ exponential-backoff: ^3.1.1
+ glob: ^10.3.10
+ graceful-fs: ^4.2.6
+ make-fetch-happen: ^13.0.0
+ nopt: ^7.0.0
+ proc-log: ^4.1.0
+ semver: ^7.3.5
+ tar: ^6.2.1
+ which: ^4.0.0
+ bin:
+ node-gyp: bin/node-gyp.js
+ checksum: 0233759d8c19765f7fdc259a35eb046ad86c3d09e22f7384613ae2b89647dd27fcf833fdf5293d9335041e91f9b1c539494225959cdb312a5c8080b7534b926f
+ languageName: node
+ linkType: hard
+
+"node-releases@npm:^2.0.18":
+ version: 2.0.18
+ resolution: "node-releases@npm:2.0.18"
+ checksum: ef55a3d853e1269a6d6279b7692cd6ff3e40bc74947945101138745bfdc9a5edabfe72cb19a31a8e45752e1910c4c65c77d931866af6357f242b172b7283f5b3
+ languageName: node
+ linkType: hard
+
+"nopt@npm:^7.0.0":
+ version: 7.2.1
+ resolution: "nopt@npm:7.2.1"
+ dependencies:
+ abbrev: ^2.0.0
+ bin:
+ nopt: bin/nopt.js
+ checksum: 6fa729cc77ce4162cfad8abbc9ba31d4a0ff6850c3af61d59b505653bef4781ec059f8890ecfe93ee8aa0c511093369cca88bfc998101616a2904e715bbbb7c9
+ languageName: node
+ linkType: hard
+
+"normalize-path@npm:^3.0.0, normalize-path@npm:~3.0.0":
+ version: 3.0.0
+ resolution: "normalize-path@npm:3.0.0"
+ checksum: 88eeb4da891e10b1318c4b2476b6e2ecbeb5ff97d946815ffea7794c31a89017c70d7f34b3c2ebf23ef4e9fc9fb99f7dffe36da22011b5b5c6ffa34f4873ec20
+ languageName: node
+ linkType: hard
+
+"normalize-range@npm:^0.1.2":
+ version: 0.1.2
+ resolution: "normalize-range@npm:0.1.2"
+ checksum: 9b2f14f093593f367a7a0834267c24f3cb3e887a2d9809c77d8a7e5fd08738bcd15af46f0ab01cc3a3d660386f015816b5c922cea8bf2ee79777f40874063184
+ languageName: node
+ linkType: hard
+
+"object-assign@npm:^4.0.1, object-assign@npm:^4.1.1":
+ version: 4.1.1
+ resolution: "object-assign@npm:4.1.1"
+ checksum: fcc6e4ea8c7fe48abfbb552578b1c53e0d194086e2e6bbbf59e0a536381a292f39943c6e9628af05b5528aa5e3318bb30d6b2e53cadaf5b8fe9e12c4b69af23f
+ languageName: node
+ linkType: hard
+
+"object-hash@npm:^3.0.0":
+ version: 3.0.0
+ resolution: "object-hash@npm:3.0.0"
+ checksum: 80b4904bb3857c52cc1bfd0b52c0352532ca12ed3b8a6ff06a90cd209dfda1b95cee059a7625eb9da29537027f68ac4619363491eedb2f5d3dddbba97494fd6c
+ languageName: node
+ linkType: hard
+
+"oblivious-set@npm:1.4.0":
+ version: 1.4.0
+ resolution: "oblivious-set@npm:1.4.0"
+ checksum: 4503772b19eda65d18afca528a35f73b68956833f88b64c528516159a190f61c5c0c5f7f33a7882aad267ecec67097c11729e497b0bbb34e093a3aa84679cc33
+ languageName: node
+ linkType: hard
+
+"optimism@npm:^0.18.0":
+ version: 0.18.1
+ resolution: "optimism@npm:0.18.1"
+ dependencies:
+ "@wry/caches": ^1.0.0
+ "@wry/context": ^0.7.0
+ "@wry/trie": ^0.5.0
+ tslib: ^2.3.0
+ checksum: bb913a2ac28e3c39fc829bf7b219cc877a085f45f8e5778f25113b251fe26b53a3c2a0e65ce29c3b294dc35e323ede3f52052a3bc2f96caaaec70f9d76cd9622
+ languageName: node
+ linkType: hard
+
+"p-finally@npm:^1.0.0":
+ version: 1.0.0
+ resolution: "p-finally@npm:1.0.0"
+ checksum: 93a654c53dc805dd5b5891bab16eb0ea46db8f66c4bfd99336ae929323b1af2b70a8b0654f8f1eae924b2b73d037031366d645f1fd18b3d30cbd15950cc4b1d4
+ languageName: node
+ linkType: hard
+
+"p-map@npm:^4.0.0":
+ version: 4.0.0
+ resolution: "p-map@npm:4.0.0"
+ dependencies:
+ aggregate-error: ^3.0.0
+ checksum: cb0ab21ec0f32ddffd31dfc250e3afa61e103ef43d957cc45497afe37513634589316de4eb88abdfd969fe6410c22c0b93ab24328833b8eb1ccc087fc0442a1c
+ languageName: node
+ linkType: hard
+
+"p-queue@npm:6.6.2":
+ version: 6.6.2
+ resolution: "p-queue@npm:6.6.2"
+ dependencies:
+ eventemitter3: ^4.0.4
+ p-timeout: ^3.2.0
+ checksum: 832642fcc4ab6477b43e6d7c30209ab10952969ed211c6d6f2931be8a4f9935e3578c72e8cce053dc34f2eb6941a408a2c516a54904e989851a1a209cf19761c
+ languageName: node
+ linkType: hard
+
+"p-timeout@npm:^3.2.0":
+ version: 3.2.0
+ resolution: "p-timeout@npm:3.2.0"
+ dependencies:
+ p-finally: ^1.0.0
+ checksum: 3dd0eaa048780a6f23e5855df3dd45c7beacff1f820476c1d0d1bcd6648e3298752ba2c877aa1c92f6453c7dd23faaf13d9f5149fc14c0598a142e2c5e8d649c
+ languageName: node
+ linkType: hard
+
+"package-json-from-dist@npm:^1.0.0":
+ version: 1.0.1
+ resolution: "package-json-from-dist@npm:1.0.1"
+ checksum: 58ee9538f2f762988433da00e26acc788036914d57c71c246bf0be1b60cdbd77dd60b6a3e1a30465f0b248aeb80079e0b34cb6050b1dfa18c06953bb1cbc7602
+ languageName: node
+ linkType: hard
+
+"path-key@npm:^3.1.0":
+ version: 3.1.1
+ resolution: "path-key@npm:3.1.1"
+ checksum: 55cd7a9dd4b343412a8386a743f9c746ef196e57c823d90ca3ab917f90ab9f13dd0ded27252ba49dbdfcab2b091d998bc446f6220cd3cea65db407502a740020
+ languageName: node
+ linkType: hard
+
+"path-parse@npm:^1.0.7":
+ version: 1.0.7
+ resolution: "path-parse@npm:1.0.7"
+ checksum: 49abf3d81115642938a8700ec580da6e830dde670be21893c62f4e10bd7dd4c3742ddc603fe24f898cba7eb0c6bc1777f8d9ac14185d34540c6d4d80cd9cae8a
+ languageName: node
+ linkType: hard
+
+"path-scurry@npm:^1.11.1":
+ version: 1.11.1
+ resolution: "path-scurry@npm:1.11.1"
+ dependencies:
+ lru-cache: ^10.2.0
+ minipass: ^5.0.0 || ^6.0.2 || ^7.0.0
+ checksum: 890d5abcd593a7912dcce7cf7c6bf7a0b5648e3dee6caf0712c126ca0a65c7f3d7b9d769072a4d1baf370f61ce493ab5b038d59988688e0c5f3f646ee3c69023
+ languageName: node
+ linkType: hard
+
+"picocolors@npm:^1.0.0, picocolors@npm:^1.0.1, picocolors@npm:^1.1.0, picocolors@npm:^1.1.1":
+ version: 1.1.1
+ resolution: "picocolors@npm:1.1.1"
+ checksum: e1cf46bf84886c79055fdfa9dcb3e4711ad259949e3565154b004b260cd356c5d54b31a1437ce9782624bf766272fe6b0154f5f0c744fb7af5d454d2b60db045
+ languageName: node
+ linkType: hard
+
+"picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.3.1":
+ version: 2.3.1
+ resolution: "picomatch@npm:2.3.1"
+ checksum: 050c865ce81119c4822c45d3c84f1ced46f93a0126febae20737bd05ca20589c564d6e9226977df859ed5e03dc73f02584a2b0faad36e896936238238b0446cf
+ languageName: node
+ linkType: hard
+
+"pify@npm:^2.3.0":
+ version: 2.3.0
+ resolution: "pify@npm:2.3.0"
+ checksum: 9503aaeaf4577acc58642ad1d25c45c6d90288596238fb68f82811c08104c800e5a7870398e9f015d82b44ecbcbef3dc3d4251a1cbb582f6e5959fe09884b2ba
+ languageName: node
+ linkType: hard
+
+"pirates@npm:^4.0.1":
+ version: 4.0.6
+ resolution: "pirates@npm:4.0.6"
+ checksum: 46a65fefaf19c6f57460388a5af9ab81e3d7fd0e7bc44ca59d753cb5c4d0df97c6c6e583674869762101836d68675f027d60f841c105d72734df9dfca97cbcc6
+ languageName: node
+ linkType: hard
+
+"postcss-import@npm:^15.1.0":
+ version: 15.1.0
+ resolution: "postcss-import@npm:15.1.0"
+ dependencies:
+ postcss-value-parser: ^4.0.0
+ read-cache: ^1.0.0
+ resolve: ^1.1.7
+ peerDependencies:
+ postcss: ^8.0.0
+ checksum: 7bd04bd8f0235429009d0022cbf00faebc885de1d017f6d12ccb1b021265882efc9302006ba700af6cab24c46bfa2f3bc590be3f9aee89d064944f171b04e2a3
+ languageName: node
+ linkType: hard
+
+"postcss-js@npm:^4.0.1":
+ version: 4.0.1
+ resolution: "postcss-js@npm:4.0.1"
+ dependencies:
+ camelcase-css: ^2.0.1
+ peerDependencies:
+ postcss: ^8.4.21
+ checksum: 5c1e83efeabeb5a42676193f4357aa9c88f4dc1b3c4a0332c132fe88932b33ea58848186db117cf473049fc233a980356f67db490bd0a7832ccba9d0b3fd3491
+ languageName: node
+ linkType: hard
+
+"postcss-load-config@npm:^4.0.2":
+ version: 4.0.2
+ resolution: "postcss-load-config@npm:4.0.2"
+ dependencies:
+ lilconfig: ^3.0.0
+ yaml: ^2.3.4
+ peerDependencies:
+ postcss: ">=8.0.9"
+ ts-node: ">=9.0.0"
+ peerDependenciesMeta:
+ postcss:
+ optional: true
+ ts-node:
+ optional: true
+ checksum: 7c27dd3801db4eae207a5116fed2db6b1ebb780b40c3dd62a3e57e087093a8e6a14ee17ada729fee903152d6ef4826c6339eb135bee6208e0f3140d7e8090185
+ languageName: node
+ linkType: hard
+
+"postcss-nested@npm:^6.2.0":
+ version: 6.2.0
+ resolution: "postcss-nested@npm:6.2.0"
+ dependencies:
+ postcss-selector-parser: ^6.1.1
+ peerDependencies:
+ postcss: ^8.2.14
+ checksum: 2c86ecf2d0ce68f27c87c7e24ae22dc6dd5515a89fcaf372b2627906e11f5c1f36e4a09e4c15c20fd4a23d628b3d945c35839f44496fbee9a25866258006671b
+ languageName: node
+ linkType: hard
+
+"postcss-selector-parser@npm:6.0.10":
+ version: 6.0.10
+ resolution: "postcss-selector-parser@npm:6.0.10"
+ dependencies:
+ cssesc: ^3.0.0
+ util-deprecate: ^1.0.2
+ checksum: 46afaa60e3d1998bd7adf6caa374baf857cc58d3ff944e29459c9a9e4680a7fe41597bd5b755fc81d7c388357e9bf67c0251d047c640a09f148e13606b8a8608
+ languageName: node
+ linkType: hard
+
+"postcss-selector-parser@npm:^6.1.1, postcss-selector-parser@npm:^6.1.2":
+ version: 6.1.2
+ resolution: "postcss-selector-parser@npm:6.1.2"
+ dependencies:
+ cssesc: ^3.0.0
+ util-deprecate: ^1.0.2
+ checksum: ce9440fc42a5419d103f4c7c1847cb75488f3ac9cbe81093b408ee9701193a509f664b4d10a2b4d82c694ee7495e022f8f482d254f92b7ffd9ed9dea696c6f84
+ languageName: node
+ linkType: hard
+
+"postcss-value-parser@npm:^4.0.0, postcss-value-parser@npm:^4.2.0":
+ version: 4.2.0
+ resolution: "postcss-value-parser@npm:4.2.0"
+ checksum: 819ffab0c9d51cf0acbabf8996dffbfafbafa57afc0e4c98db88b67f2094cb44488758f06e5da95d7036f19556a4a732525e84289a425f4f6fd8e412a9d7442f
+ languageName: node
+ linkType: hard
+
+"postcss@npm:8.4.31":
+ version: 8.4.31
+ resolution: "postcss@npm:8.4.31"
+ dependencies:
+ nanoid: ^3.3.6
+ picocolors: ^1.0.0
+ source-map-js: ^1.0.2
+ checksum: 1d8611341b073143ad90486fcdfeab49edd243377b1f51834dc4f6d028e82ce5190e4f11bb2633276864503654fb7cab28e67abdc0fbf9d1f88cad4a0ff0beea
+ languageName: node
+ linkType: hard
+
+"postcss@npm:^8.4.39, postcss@npm:^8.4.47":
+ version: 8.4.49
+ resolution: "postcss@npm:8.4.49"
+ dependencies:
+ nanoid: ^3.3.7
+ picocolors: ^1.1.1
+ source-map-js: ^1.2.1
+ checksum: eb5d6cbdca24f50399aafa5d2bea489e4caee4c563ea1edd5a2485bc5f84e9ceef3febf170272bc83a99c31d23a316ad179213e853f34c2a7a8ffa534559d63a
+ languageName: node
+ linkType: hard
+
+"prettier-plugin-tailwindcss@npm:^0.6.5":
+ version: 0.6.9
+ resolution: "prettier-plugin-tailwindcss@npm:0.6.9"
+ peerDependencies:
+ "@ianvs/prettier-plugin-sort-imports": "*"
+ "@prettier/plugin-pug": "*"
+ "@shopify/prettier-plugin-liquid": "*"
+ "@trivago/prettier-plugin-sort-imports": "*"
+ "@zackad/prettier-plugin-twig-melody": "*"
+ prettier: ^3.0
+ prettier-plugin-astro: "*"
+ prettier-plugin-css-order: "*"
+ prettier-plugin-import-sort: "*"
+ prettier-plugin-jsdoc: "*"
+ prettier-plugin-marko: "*"
+ prettier-plugin-multiline-arrays: "*"
+ prettier-plugin-organize-attributes: "*"
+ prettier-plugin-organize-imports: "*"
+ prettier-plugin-sort-imports: "*"
+ prettier-plugin-style-order: "*"
+ prettier-plugin-svelte: "*"
+ peerDependenciesMeta:
+ "@ianvs/prettier-plugin-sort-imports":
+ optional: true
+ "@prettier/plugin-pug":
+ optional: true
+ "@shopify/prettier-plugin-liquid":
+ optional: true
+ "@trivago/prettier-plugin-sort-imports":
+ optional: true
+ "@zackad/prettier-plugin-twig-melody":
+ optional: true
+ prettier-plugin-astro:
+ optional: true
+ prettier-plugin-css-order:
+ optional: true
+ prettier-plugin-import-sort:
+ optional: true
+ prettier-plugin-jsdoc:
+ optional: true
+ prettier-plugin-marko:
+ optional: true
+ prettier-plugin-multiline-arrays:
+ optional: true
+ prettier-plugin-organize-attributes:
+ optional: true
+ prettier-plugin-organize-imports:
+ optional: true
+ prettier-plugin-sort-imports:
+ optional: true
+ prettier-plugin-style-order:
+ optional: true
+ prettier-plugin-svelte:
+ optional: true
+ checksum: 6463a9c76b5b417ea0a89413b1e33e4d985c1a80ff768140ad2ab08220be9a9e0548f41f5be6132ac19cbec88078266da8e3712b7ddcb5cc91fd5a1d662ad649
+ languageName: node
+ linkType: hard
+
+"prettier@npm:3.3.3":
+ version: 3.3.3
+ resolution: "prettier@npm:3.3.3"
+ bin:
+ prettier: bin/prettier.cjs
+ checksum: bc8604354805acfdde6106852d14b045bb20827ad76a5ffc2455b71a8257f94de93f17f14e463fe844808d2ccc87248364a5691488a3304f1031326e62d9276e
+ languageName: node
+ linkType: hard
+
+"proc-log@npm:^4.1.0, proc-log@npm:^4.2.0":
+ version: 4.2.0
+ resolution: "proc-log@npm:4.2.0"
+ checksum: 98f6cd012d54b5334144c5255ecb941ee171744f45fca8b43b58ae5a0c1af07352475f481cadd9848e7f0250376ee584f6aa0951a856ff8f021bdfbff4eb33fc
+ languageName: node
+ linkType: hard
+
+"promise-retry@npm:^2.0.1":
+ version: 2.0.1
+ resolution: "promise-retry@npm:2.0.1"
+ dependencies:
+ err-code: ^2.0.2
+ retry: ^0.12.0
+ checksum: f96a3f6d90b92b568a26f71e966cbbc0f63ab85ea6ff6c81284dc869b41510e6cdef99b6b65f9030f0db422bf7c96652a3fff9f2e8fb4a0f069d8f4430359429
+ languageName: node
+ linkType: hard
+
+"prop-types@npm:^15.7.2":
+ version: 15.8.1
+ resolution: "prop-types@npm:15.8.1"
+ dependencies:
+ loose-envify: ^1.4.0
+ object-assign: ^4.1.1
+ react-is: ^16.13.1
+ checksum: c056d3f1c057cb7ff8344c645450e14f088a915d078dcda795041765047fa080d38e5d626560ccaac94a4e16e3aa15f3557c1a9a8d1174530955e992c675e459
+ languageName: node
+ linkType: hard
+
+"queue-microtask@npm:^1.2.2":
+ version: 1.2.3
+ resolution: "queue-microtask@npm:1.2.3"
+ checksum: b676f8c040cdc5b12723ad2f91414d267605b26419d5c821ff03befa817ddd10e238d22b25d604920340fd73efd8ba795465a0377c4adf45a4a41e4234e42dc4
+ languageName: node
+ linkType: hard
+
+"react-dom@npm:19.0.0-rc-cd22717c-20241013":
+ version: 19.0.0-rc-cd22717c-20241013
+ resolution: "react-dom@npm:19.0.0-rc-cd22717c-20241013"
+ dependencies:
+ scheduler: 0.25.0-rc-cd22717c-20241013
+ peerDependencies:
+ react: 19.0.0-rc-cd22717c-20241013
+ checksum: bdcd0db47e9afe794c684f30cb4cf34b7e20a13d6de1a21c8f88d29f61589ff6d1c6dc43af05943a4d47d575f98246f7336b68de54f542964cee7add8fecbaf1
+ languageName: node
+ linkType: hard
+
+"react-is@npm:^16.13.1, react-is@npm:^16.7.0":
+ version: 16.13.1
+ resolution: "react-is@npm:16.13.1"
+ checksum: f7a19ac3496de32ca9ae12aa030f00f14a3d45374f1ceca0af707c831b2a6098ef0d6bdae51bd437b0a306d7f01d4677fcc8de7c0d331eb47ad0f46130e53c5f
+ languageName: node
+ linkType: hard
+
+"react@npm:19.0.0-rc-cd22717c-20241013":
+ version: 19.0.0-rc-cd22717c-20241013
+ resolution: "react@npm:19.0.0-rc-cd22717c-20241013"
+ checksum: cf1ccac9120d41fd344d17ab7397533c361c9e5050c2ccbb9a7dfcc78587d0c7ef0d623e90b15ec228f667b0f5a99dd7e0d34d814fd06897a03b45c005670669
+ languageName: node
+ linkType: hard
+
+"read-cache@npm:^1.0.0":
+ version: 1.0.0
+ resolution: "read-cache@npm:1.0.0"
+ dependencies:
+ pify: ^2.3.0
+ checksum: cffc728b9ede1e0667399903f9ecaf3789888b041c46ca53382fa3a06303e5132774dc0a96d0c16aa702dbac1ea0833d5a868d414f5ab2af1e1438e19e6657c6
+ languageName: node
+ linkType: hard
+
+"readdirp@npm:~3.6.0":
+ version: 3.6.0
+ resolution: "readdirp@npm:3.6.0"
+ dependencies:
+ picomatch: ^2.2.1
+ checksum: 1ced032e6e45670b6d7352d71d21ce7edf7b9b928494dcaba6f11fba63180d9da6cd7061ebc34175ffda6ff529f481818c962952004d273178acd70f7059b320
+ languageName: node
+ linkType: hard
+
+"regenerator-runtime@npm:^0.14.0":
+ version: 0.14.1
+ resolution: "regenerator-runtime@npm:0.14.1"
+ checksum: 9f57c93277b5585d3c83b0cf76be47b473ae8c6d9142a46ce8b0291a04bb2cf902059f0f8445dcabb3fb7378e5fe4bb4ea1e008876343d42e46d3b484534ce38
+ languageName: node
+ linkType: hard
+
+"rehackt@npm:^0.1.0":
+ version: 0.1.0
+ resolution: "rehackt@npm:0.1.0"
+ peerDependencies:
+ "@types/react": "*"
+ react: "*"
+ peerDependenciesMeta:
+ "@types/react":
+ optional: true
+ react:
+ optional: true
+ checksum: 2c3bcd72524bf47672640265e79cba785e0e6837b9b385ccb0a3ea7d00f55a439d9aed3e0ae71e991d88e0d4b2b3158457c92e75fff5ebf99cd46e280068ddeb
+ languageName: node
+ linkType: hard
+
+"resolve@npm:^1.1.7, resolve@npm:^1.22.8":
+ version: 1.22.8
+ resolution: "resolve@npm:1.22.8"
+ dependencies:
+ is-core-module: ^2.13.0
+ path-parse: ^1.0.7
+ supports-preserve-symlinks-flag: ^1.0.0
+ bin:
+ resolve: bin/resolve
+ checksum: f8a26958aa572c9b064562750b52131a37c29d072478ea32e129063e2da7f83e31f7f11e7087a18225a8561cfe8d2f0df9dbea7c9d331a897571c0a2527dbb4c
+ languageName: node
+ linkType: hard
+
+"resolve@patch:resolve@^1.1.7#~builtin, resolve@patch:resolve@^1.22.8#~builtin":
+ version: 1.22.8
+ resolution: "resolve@patch:resolve@npm%3A1.22.8#~builtin::version=1.22.8&hash=c3c19d"
+ dependencies:
+ is-core-module: ^2.13.0
+ path-parse: ^1.0.7
+ supports-preserve-symlinks-flag: ^1.0.0
+ bin:
+ resolve: bin/resolve
+ checksum: 5479b7d431cacd5185f8db64bfcb7286ae5e31eb299f4c4f404ad8aa6098b77599563ac4257cb2c37a42f59dfc06a1bec2bcf283bb448f319e37f0feb9a09847
+ languageName: node
+ linkType: hard
+
+"response-iterator@npm:^0.2.6":
+ version: 0.2.6
+ resolution: "response-iterator@npm:0.2.6"
+ checksum: b0db3c0665a0d698d65512951de9623c086b9c84ce015a76076d4bd0bf733779601d0b41f0931d16ae38132fba29e1ce291c1f8e6550fc32daaa2dc3ab4f338d
+ languageName: node
+ linkType: hard
+
+"retry@npm:^0.12.0":
+ version: 0.12.0
+ resolution: "retry@npm:0.12.0"
+ checksum: 623bd7d2e5119467ba66202d733ec3c2e2e26568074923bc0585b6b99db14f357e79bdedb63cab56cec47491c4a0da7e6021a7465ca6dc4f481d3898fdd3158c
+ languageName: node
+ linkType: hard
+
+"reusify@npm:^1.0.4":
+ version: 1.0.4
+ resolution: "reusify@npm:1.0.4"
+ checksum: c3076ebcc22a6bc252cb0b9c77561795256c22b757f40c0d8110b1300723f15ec0fc8685e8d4ea6d7666f36c79ccc793b1939c748bf36f18f542744a4e379fcc
+ languageName: node
+ linkType: hard
+
+"root-workspace-0b6124@workspace:.":
+ version: 0.0.0-use.local
+ resolution: "root-workspace-0b6124@workspace:."
+ dependencies:
+ "@geins/cms": ^0.3.4
+ "@geins/core": ^0.3.4
+ "@geins/types": ^0.3.4
+ "@headlessui/react": ^2.1.2
+ "@heroicons/react": ^2.1.5
+ "@tailwindcss/container-queries": ^0.1.1
+ "@tailwindcss/typography": ^0.5.13
+ "@types/node": 22.9.0
+ "@types/react": "npm:types-react@19.0.0-rc.1"
+ "@types/react-dom": "npm:types-react-dom@19.0.0-rc.1"
+ autoprefixer: ^10.4.19
+ clsx: ^2.1.1
+ geist: ^1.3.1
+ next: 15.0.3
+ postcss: ^8.4.39
+ prettier: 3.3.3
+ prettier-plugin-tailwindcss: ^0.6.5
+ react: 19.0.0-rc-cd22717c-20241013
+ react-dom: 19.0.0-rc-cd22717c-20241013
+ sonner: ^1.5.0
+ tailwindcss: ^3.4.6
+ typescript: 5.5.4
+ languageName: unknown
+ linkType: soft
+
+"run-parallel@npm:^1.1.9":
+ version: 1.2.0
+ resolution: "run-parallel@npm:1.2.0"
+ dependencies:
+ queue-microtask: ^1.2.2
+ checksum: cb4f97ad25a75ebc11a8ef4e33bb962f8af8516bb2001082ceabd8902e15b98f4b84b4f8a9b222e5d57fc3bd1379c483886ed4619367a7680dad65316993021d
+ languageName: node
+ linkType: hard
+
+"safer-buffer@npm:>= 2.1.2 < 3.0.0":
+ version: 2.1.2
+ resolution: "safer-buffer@npm:2.1.2"
+ checksum: cab8f25ae6f1434abee8d80023d7e72b598cf1327164ddab31003c51215526801e40b66c5e65d658a0af1e9d6478cadcb4c745f4bd6751f97d8644786c0978b0
+ languageName: node
+ linkType: hard
+
+"scheduler@npm:0.25.0-rc-cd22717c-20241013":
+ version: 0.25.0-rc-cd22717c-20241013
+ resolution: "scheduler@npm:0.25.0-rc-cd22717c-20241013"
+ checksum: baaa0ad51c97baa8c799653c3c5959a0010ff51acd83d3ba81e0e9dfdd235e82591e956997e4e09d01663ccb1db26c6242628d8d7efdea2759de94de55edb088
+ languageName: node
+ linkType: hard
+
+"semver@npm:^7.3.5, semver@npm:^7.6.3":
+ version: 7.6.3
+ resolution: "semver@npm:7.6.3"
+ bin:
+ semver: bin/semver.js
+ checksum: 4110ec5d015c9438f322257b1c51fe30276e5f766a3f64c09edd1d7ea7118ecbc3f379f3b69032bacf13116dc7abc4ad8ce0d7e2bd642e26b0d271b56b61a7d8
+ languageName: node
+ linkType: hard
+
+"sharp@npm:^0.33.5":
+ version: 0.33.5
+ resolution: "sharp@npm:0.33.5"
+ dependencies:
+ "@img/sharp-darwin-arm64": 0.33.5
+ "@img/sharp-darwin-x64": 0.33.5
+ "@img/sharp-libvips-darwin-arm64": 1.0.4
+ "@img/sharp-libvips-darwin-x64": 1.0.4
+ "@img/sharp-libvips-linux-arm": 1.0.5
+ "@img/sharp-libvips-linux-arm64": 1.0.4
+ "@img/sharp-libvips-linux-s390x": 1.0.4
+ "@img/sharp-libvips-linux-x64": 1.0.4
+ "@img/sharp-libvips-linuxmusl-arm64": 1.0.4
+ "@img/sharp-libvips-linuxmusl-x64": 1.0.4
+ "@img/sharp-linux-arm": 0.33.5
+ "@img/sharp-linux-arm64": 0.33.5
+ "@img/sharp-linux-s390x": 0.33.5
+ "@img/sharp-linux-x64": 0.33.5
+ "@img/sharp-linuxmusl-arm64": 0.33.5
+ "@img/sharp-linuxmusl-x64": 0.33.5
+ "@img/sharp-wasm32": 0.33.5
+ "@img/sharp-win32-ia32": 0.33.5
+ "@img/sharp-win32-x64": 0.33.5
+ color: ^4.2.3
+ detect-libc: ^2.0.3
+ semver: ^7.6.3
+ dependenciesMeta:
+ "@img/sharp-darwin-arm64":
+ optional: true
+ "@img/sharp-darwin-x64":
+ optional: true
+ "@img/sharp-libvips-darwin-arm64":
+ optional: true
+ "@img/sharp-libvips-darwin-x64":
+ optional: true
+ "@img/sharp-libvips-linux-arm":
+ optional: true
+ "@img/sharp-libvips-linux-arm64":
+ optional: true
+ "@img/sharp-libvips-linux-s390x":
+ optional: true
+ "@img/sharp-libvips-linux-x64":
+ optional: true
+ "@img/sharp-libvips-linuxmusl-arm64":
+ optional: true
+ "@img/sharp-libvips-linuxmusl-x64":
+ optional: true
+ "@img/sharp-linux-arm":
+ optional: true
+ "@img/sharp-linux-arm64":
+ optional: true
+ "@img/sharp-linux-s390x":
+ optional: true
+ "@img/sharp-linux-x64":
+ optional: true
+ "@img/sharp-linuxmusl-arm64":
+ optional: true
+ "@img/sharp-linuxmusl-x64":
+ optional: true
+ "@img/sharp-wasm32":
+ optional: true
+ "@img/sharp-win32-ia32":
+ optional: true
+ "@img/sharp-win32-x64":
+ optional: true
+ checksum: 04beae89910ac65c5f145f88de162e8466bec67705f497ace128de849c24d168993e016f33a343a1f3c30b25d2a90c3e62b017a9a0d25452371556f6cd2471e4
+ languageName: node
+ linkType: hard
+
+"shebang-command@npm:^2.0.0":
+ version: 2.0.0
+ resolution: "shebang-command@npm:2.0.0"
+ dependencies:
+ shebang-regex: ^3.0.0
+ checksum: 6b52fe87271c12968f6a054e60f6bde5f0f3d2db483a1e5c3e12d657c488a15474121a1d55cd958f6df026a54374ec38a4a963988c213b7570e1d51575cea7fa
+ languageName: node
+ linkType: hard
+
+"shebang-regex@npm:^3.0.0":
+ version: 3.0.0
+ resolution: "shebang-regex@npm:3.0.0"
+ checksum: 1a2bcae50de99034fcd92ad4212d8e01eedf52c7ec7830eedcf886622804fe36884278f2be8be0ea5fde3fd1c23911643a4e0f726c8685b61871c8908af01222
+ languageName: node
+ linkType: hard
+
+"signal-exit@npm:^4.0.1":
+ version: 4.1.0
+ resolution: "signal-exit@npm:4.1.0"
+ checksum: 64c757b498cb8629ffa5f75485340594d2f8189e9b08700e69199069c8e3070fb3e255f7ab873c05dc0b3cec412aea7402e10a5990cb6a050bd33ba062a6c549
+ languageName: node
+ linkType: hard
+
+"simple-swizzle@npm:^0.2.2":
+ version: 0.2.2
+ resolution: "simple-swizzle@npm:0.2.2"
+ dependencies:
+ is-arrayish: ^0.3.1
+ checksum: a7f3f2ab5c76c4472d5c578df892e857323e452d9f392e1b5cf74b74db66e6294a1e1b8b390b519fa1b96b5b613f2a37db6cffef52c3f1f8f3c5ea64eb2d54c0
+ languageName: node
+ linkType: hard
+
+"smart-buffer@npm:^4.2.0":
+ version: 4.2.0
+ resolution: "smart-buffer@npm:4.2.0"
+ checksum: b5167a7142c1da704c0e3af85c402002b597081dd9575031a90b4f229ca5678e9a36e8a374f1814c8156a725d17008ae3bde63b92f9cfd132526379e580bec8b
+ languageName: node
+ linkType: hard
+
+"socks-proxy-agent@npm:^8.0.3":
+ version: 8.0.4
+ resolution: "socks-proxy-agent@npm:8.0.4"
+ dependencies:
+ agent-base: ^7.1.1
+ debug: ^4.3.4
+ socks: ^2.8.3
+ checksum: b2ec5051d85fe49072f9a250c427e0e9571fd09d5db133819192d078fd291276e1f0f50f6dbc04329b207738b1071314cee8bdbb4b12e27de42dbcf1d4233c67
+ languageName: node
+ linkType: hard
+
+"socks@npm:^2.8.3":
+ version: 2.8.3
+ resolution: "socks@npm:2.8.3"
+ dependencies:
+ ip-address: ^9.0.5
+ smart-buffer: ^4.2.0
+ checksum: 7a6b7f6eedf7482b9e4597d9a20e09505824208006ea8f2c49b71657427f3c137ca2ae662089baa73e1971c62322d535d9d0cf1c9235cf6f55e315c18203eadd
+ languageName: node
+ linkType: hard
+
+"sonner@npm:^1.5.0":
+ version: 1.7.0
+ resolution: "sonner@npm:1.7.0"
+ peerDependencies:
+ react: ^18.0.0 || ^19.0.0 || ^19.0.0-rc
+ react-dom: ^18.0.0 || ^19.0.0 || ^19.0.0-rc
+ checksum: f3040b1bf255de436f900ef86c660435caa85bafde9ba8e5447ff8befb4717f7853962374c688660c9760d5f08779ad85cde433dcaf6ccfc90da4ee82a294b34
+ languageName: node
+ linkType: hard
+
+"source-map-js@npm:^1.0.2, source-map-js@npm:^1.2.1":
+ version: 1.2.1
+ resolution: "source-map-js@npm:1.2.1"
+ checksum: 4eb0cd997cdf228bc253bcaff9340afeb706176e64868ecd20efbe6efea931465f43955612346d6b7318789e5265bdc419bc7669c1cebe3db0eb255f57efa76b
+ languageName: node
+ linkType: hard
+
+"sprintf-js@npm:^1.1.3":
+ version: 1.1.3
+ resolution: "sprintf-js@npm:1.1.3"
+ checksum: a3fdac7b49643875b70864a9d9b469d87a40dfeaf5d34d9d0c5b1cda5fd7d065531fcb43c76357d62254c57184a7b151954156563a4d6a747015cfb41021cad0
+ languageName: node
+ linkType: hard
+
+"ssri@npm:^10.0.0":
+ version: 10.0.6
+ resolution: "ssri@npm:10.0.6"
+ dependencies:
+ minipass: ^7.0.3
+ checksum: 4603d53a05bcd44188747d38f1cc43833b9951b5a1ee43ba50535bdfc5fe4a0897472dbe69837570a5417c3c073377ef4f8c1a272683b401857f72738ee57299
+ languageName: node
+ linkType: hard
+
+"streamsearch@npm:^1.1.0":
+ version: 1.1.0
+ resolution: "streamsearch@npm:1.1.0"
+ checksum: 1cce16cea8405d7a233d32ca5e00a00169cc0e19fbc02aa839959985f267335d435c07f96e5e0edd0eadc6d39c98d5435fb5bbbdefc62c41834eadc5622ad942
+ languageName: node
+ linkType: hard
+
+"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^4.1.0":
+ version: 4.2.3
+ resolution: "string-width@npm:4.2.3"
+ dependencies:
+ emoji-regex: ^8.0.0
+ is-fullwidth-code-point: ^3.0.0
+ strip-ansi: ^6.0.1
+ checksum: e52c10dc3fbfcd6c3a15f159f54a90024241d0f149cf8aed2982a2d801d2e64df0bf1dc351cf8e95c3319323f9f220c16e740b06faecd53e2462df1d2b5443fb
+ languageName: node
+ linkType: hard
+
+"string-width@npm:^5.0.1, string-width@npm:^5.1.2":
+ version: 5.1.2
+ resolution: "string-width@npm:5.1.2"
+ dependencies:
+ eastasianwidth: ^0.2.0
+ emoji-regex: ^9.2.2
+ strip-ansi: ^7.0.1
+ checksum: 7369deaa29f21dda9a438686154b62c2c5f661f8dda60449088f9f980196f7908fc39fdd1803e3e01541970287cf5deae336798337e9319a7055af89dafa7193
+ languageName: node
+ linkType: hard
+
+"strip-ansi-cjs@npm:strip-ansi@^6.0.1, strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1":
+ version: 6.0.1
+ resolution: "strip-ansi@npm:6.0.1"
+ dependencies:
+ ansi-regex: ^5.0.1
+ checksum: f3cd25890aef3ba6e1a74e20896c21a46f482e93df4a06567cebf2b57edabb15133f1f94e57434e0a958d61186087b1008e89c94875d019910a213181a14fc8c
+ languageName: node
+ linkType: hard
+
+"strip-ansi@npm:^7.0.1":
+ version: 7.1.0
+ resolution: "strip-ansi@npm:7.1.0"
+ dependencies:
+ ansi-regex: ^6.0.1
+ checksum: 859c73fcf27869c22a4e4d8c6acfe690064659e84bef9458aa6d13719d09ca88dcfd40cbf31fd0be63518ea1a643fe070b4827d353e09533a5b0b9fd4553d64d
+ languageName: node
+ linkType: hard
+
+"styled-jsx@npm:5.1.6":
+ version: 5.1.6
+ resolution: "styled-jsx@npm:5.1.6"
+ dependencies:
+ client-only: 0.0.1
+ peerDependencies:
+ react: ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0"
+ peerDependenciesMeta:
+ "@babel/core":
+ optional: true
+ babel-plugin-macros:
+ optional: true
+ checksum: 879ad68e3e81adcf4373038aaafe55f968294955593660e173fbf679204aff158c59966716a60b29af72dc88795cfb2c479b6d2c3c87b2b2d282f3e27cc66461
+ languageName: node
+ linkType: hard
+
+"sucrase@npm:^3.35.0":
+ version: 3.35.0
+ resolution: "sucrase@npm:3.35.0"
+ dependencies:
+ "@jridgewell/gen-mapping": ^0.3.2
+ commander: ^4.0.0
+ glob: ^10.3.10
+ lines-and-columns: ^1.1.6
+ mz: ^2.7.0
+ pirates: ^4.0.1
+ ts-interface-checker: ^0.1.9
+ bin:
+ sucrase: bin/sucrase
+ sucrase-node: bin/sucrase-node
+ checksum: 9fc5792a9ab8a14dcf9c47dcb704431d35c1cdff1d17d55d382a31c2e8e3063870ad32ce120a80915498486246d612e30cda44f1624d9d9a10423e1a43487ad1
+ languageName: node
+ linkType: hard
+
+"supports-preserve-symlinks-flag@npm:^1.0.0":
+ version: 1.0.0
+ resolution: "supports-preserve-symlinks-flag@npm:1.0.0"
+ checksum: 53b1e247e68e05db7b3808b99b892bd36fb096e6fba213a06da7fab22045e97597db425c724f2bbd6c99a3c295e1e73f3e4de78592289f38431049e1277ca0ae
+ languageName: node
+ linkType: hard
+
+"symbol-observable@npm:^4.0.0":
+ version: 4.0.0
+ resolution: "symbol-observable@npm:4.0.0"
+ checksum: 212c7edce6186634d671336a88c0e0bbd626c2ab51ed57498dc90698cce541839a261b969c2a1e8dd43762133d47672e8b62e0b1ce9cf4157934ba45fd172ba8
+ languageName: node
+ linkType: hard
+
+"tabbable@npm:^6.0.0":
+ version: 6.2.0
+ resolution: "tabbable@npm:6.2.0"
+ checksum: f8440277d223949272c74bb627a3371be21735ca9ad34c2570f7e1752bd646ccfc23a9d8b1ee65d6561243f4134f5fbbf1ad6b39ac3c4b586554accaff4a1300
+ languageName: node
+ linkType: hard
+
+"tailwindcss@npm:^3.4.6":
+ version: 3.4.15
+ resolution: "tailwindcss@npm:3.4.15"
+ dependencies:
+ "@alloc/quick-lru": ^5.2.0
+ arg: ^5.0.2
+ chokidar: ^3.6.0
+ didyoumean: ^1.2.2
+ dlv: ^1.1.3
+ fast-glob: ^3.3.2
+ glob-parent: ^6.0.2
+ is-glob: ^4.0.3
+ jiti: ^1.21.6
+ lilconfig: ^2.1.0
+ micromatch: ^4.0.8
+ normalize-path: ^3.0.0
+ object-hash: ^3.0.0
+ picocolors: ^1.1.1
+ postcss: ^8.4.47
+ postcss-import: ^15.1.0
+ postcss-js: ^4.0.1
+ postcss-load-config: ^4.0.2
+ postcss-nested: ^6.2.0
+ postcss-selector-parser: ^6.1.2
+ resolve: ^1.22.8
+ sucrase: ^3.35.0
+ bin:
+ tailwind: lib/cli.js
+ tailwindcss: lib/cli.js
+ checksum: 189a2a4747ab75446af8ead1b0b437030718040a33b010de1113c3f338f05d1eb2ead97d29028058f5007d82e1383ca053f01242c82ffd543e72460fea4aa1dd
+ languageName: node
+ linkType: hard
+
+"tar@npm:^6.1.11, tar@npm:^6.2.1":
+ version: 6.2.1
+ resolution: "tar@npm:6.2.1"
+ dependencies:
+ chownr: ^2.0.0
+ fs-minipass: ^2.0.0
+ minipass: ^5.0.0
+ minizlib: ^2.1.1
+ mkdirp: ^1.0.3
+ yallist: ^4.0.0
+ checksum: f1322768c9741a25356c11373bce918483f40fa9a25c69c59410c8a1247632487edef5fe76c5f12ac51a6356d2f1829e96d2bc34098668a2fc34d76050ac2b6c
+ languageName: node
+ linkType: hard
+
+"thenify-all@npm:^1.0.0":
+ version: 1.6.0
+ resolution: "thenify-all@npm:1.6.0"
+ dependencies:
+ thenify: ">= 3.1.0 < 4"
+ checksum: dba7cc8a23a154cdcb6acb7f51d61511c37a6b077ec5ab5da6e8b874272015937788402fd271fdfc5f187f8cb0948e38d0a42dcc89d554d731652ab458f5343e
+ languageName: node
+ linkType: hard
+
+"thenify@npm:>= 3.1.0 < 4":
+ version: 3.3.1
+ resolution: "thenify@npm:3.3.1"
+ dependencies:
+ any-promise: ^1.0.0
+ checksum: 84e1b804bfec49f3531215f17b4a6e50fd4397b5f7c1bccc427b9c656e1ecfb13ea79d899930184f78bc2f57285c54d9a50a590c8868f4f0cef5c1d9f898b05e
+ languageName: node
+ linkType: hard
+
+"to-regex-range@npm:^5.0.1":
+ version: 5.0.1
+ resolution: "to-regex-range@npm:5.0.1"
+ dependencies:
+ is-number: ^7.0.0
+ checksum: f76fa01b3d5be85db6a2a143e24df9f60dd047d151062d0ba3df62953f2f697b16fe5dad9b0ac6191c7efc7b1d9dcaa4b768174b7b29da89d4428e64bc0a20ed
+ languageName: node
+ linkType: hard
+
+"ts-interface-checker@npm:^0.1.9":
+ version: 0.1.13
+ resolution: "ts-interface-checker@npm:0.1.13"
+ checksum: 20c29189c2dd6067a8775e07823ddf8d59a33e2ffc47a1bd59a5cb28bb0121a2969a816d5e77eda2ed85b18171aa5d1c4005a6b88ae8499ec7cc49f78571cb5e
+ languageName: node
+ linkType: hard
+
+"ts-invariant@npm:^0.10.3":
+ version: 0.10.3
+ resolution: "ts-invariant@npm:0.10.3"
+ dependencies:
+ tslib: ^2.1.0
+ checksum: bb07d56fe4aae69d8860e0301dfdee2d375281159054bc24bf1e49e513fb0835bf7f70a11351344d213a79199c5e695f37ebbf5a447188a377ce0cd81d91ddb5
+ languageName: node
+ linkType: hard
+
+"tslib@npm:^2.1.0, tslib@npm:^2.3.0, tslib@npm:^2.4.0, tslib@npm:^2.8.0":
+ version: 2.8.1
+ resolution: "tslib@npm:2.8.1"
+ checksum: e4aba30e632b8c8902b47587fd13345e2827fa639e7c3121074d5ee0880723282411a8838f830b55100cbe4517672f84a2472667d355b81e8af165a55dc6203a
+ languageName: node
+ linkType: hard
+
+"typescript@npm:5.5.4":
+ version: 5.5.4
+ resolution: "typescript@npm:5.5.4"
+ bin:
+ tsc: bin/tsc
+ tsserver: bin/tsserver
+ checksum: b309040f3a1cd91c68a5a58af6b9fdd4e849b8c42d837b2c2e73f9a4f96a98c4f1ed398a9aab576ee0a4748f5690cf594e6b99dbe61de7839da748c41e6d6ca8
+ languageName: node
+ linkType: hard
+
+"typescript@patch:typescript@5.5.4#~builtin":
+ version: 5.5.4
+ resolution: "typescript@patch:typescript@npm%3A5.5.4#~builtin::version=5.5.4&hash=ad5954"
+ bin:
+ tsc: bin/tsc
+ tsserver: bin/tsserver
+ checksum: fc52962f31a5bcb716d4213bef516885e4f01f30cea797a831205fc9ef12b405a40561c40eae3127ab85ba1548e7df49df2bcdee6b84a94bfbe3a0d7eff16b14
+ languageName: node
+ linkType: hard
+
+"undici-types@npm:~6.19.8":
+ version: 6.19.8
+ resolution: "undici-types@npm:6.19.8"
+ checksum: de51f1b447d22571cf155dfe14ff6d12c5bdaec237c765085b439c38ca8518fc360e88c70f99469162bf2e14188a7b0bcb06e1ed2dc031042b984b0bb9544017
+ languageName: node
+ linkType: hard
+
+"unique-filename@npm:^3.0.0":
+ version: 3.0.0
+ resolution: "unique-filename@npm:3.0.0"
+ dependencies:
+ unique-slug: ^4.0.0
+ checksum: 8e2f59b356cb2e54aab14ff98a51ac6c45781d15ceaab6d4f1c2228b780193dc70fae4463ce9e1df4479cb9d3304d7c2043a3fb905bdeca71cc7e8ce27e063df
+ languageName: node
+ linkType: hard
+
+"unique-slug@npm:^4.0.0":
+ version: 4.0.0
+ resolution: "unique-slug@npm:4.0.0"
+ dependencies:
+ imurmurhash: ^0.1.4
+ checksum: 0884b58365af59f89739e6f71e3feacb5b1b41f2df2d842d0757933620e6de08eff347d27e9d499b43c40476cbaf7988638d3acb2ffbcb9d35fd035591adfd15
+ languageName: node
+ linkType: hard
+
+"unload@npm:2.4.1":
+ version: 2.4.1
+ resolution: "unload@npm:2.4.1"
+ checksum: a6f92d176e2718af3cb4bf087a338f21f2ded32e81c052d97d020c5b402e4a2925784efd8808827c149d35fddf49dad0a01035ecc6a69941f2c8eae90d33dc12
+ languageName: node
+ linkType: hard
+
+"update-browserslist-db@npm:^1.1.1":
+ version: 1.1.1
+ resolution: "update-browserslist-db@npm:1.1.1"
+ dependencies:
+ escalade: ^3.2.0
+ picocolors: ^1.1.0
+ peerDependencies:
+ browserslist: ">= 4.21.0"
+ bin:
+ update-browserslist-db: cli.js
+ checksum: 2ea11bd2562122162c3e438d83a1f9125238c0844b6d16d366e3276d0c0acac6036822dc7df65fc5a89c699cdf9f174acf439c39bedf3f9a2f3983976e4b4c3e
+ languageName: node
+ linkType: hard
+
+"util-deprecate@npm:^1.0.2":
+ version: 1.0.2
+ resolution: "util-deprecate@npm:1.0.2"
+ checksum: 474acf1146cb2701fe3b074892217553dfcf9a031280919ba1b8d651a068c9b15d863b7303cb15bd00a862b498e6cf4ad7b4a08fb134edd5a6f7641681cb54a2
+ languageName: node
+ linkType: hard
+
+"which@npm:^2.0.1":
+ version: 2.0.2
+ resolution: "which@npm:2.0.2"
+ dependencies:
+ isexe: ^2.0.0
+ bin:
+ node-which: ./bin/node-which
+ checksum: 1a5c563d3c1b52d5f893c8b61afe11abc3bab4afac492e8da5bde69d550de701cf9806235f20a47b5c8fa8a1d6a9135841de2596535e998027a54589000e66d1
+ languageName: node
+ linkType: hard
+
+"which@npm:^4.0.0":
+ version: 4.0.0
+ resolution: "which@npm:4.0.0"
+ dependencies:
+ isexe: ^3.1.1
+ bin:
+ node-which: bin/which.js
+ checksum: f17e84c042592c21e23c8195108cff18c64050b9efb8459589116999ea9da6dd1509e6a1bac3aeebefd137be00fabbb61b5c2bc0aa0f8526f32b58ee2f545651
+ languageName: node
+ linkType: hard
+
+"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0":
+ version: 7.0.0
+ resolution: "wrap-ansi@npm:7.0.0"
+ dependencies:
+ ansi-styles: ^4.0.0
+ string-width: ^4.1.0
+ strip-ansi: ^6.0.0
+ checksum: a790b846fd4505de962ba728a21aaeda189b8ee1c7568ca5e817d85930e06ef8d1689d49dbf0e881e8ef84436af3a88bc49115c2e2788d841ff1b8b5b51a608b
+ languageName: node
+ linkType: hard
+
+"wrap-ansi@npm:^8.1.0":
+ version: 8.1.0
+ resolution: "wrap-ansi@npm:8.1.0"
+ dependencies:
+ ansi-styles: ^6.1.0
+ string-width: ^5.0.1
+ strip-ansi: ^7.0.1
+ checksum: 371733296dc2d616900ce15a0049dca0ef67597d6394c57347ba334393599e800bab03c41d4d45221b6bc967b8c453ec3ae4749eff3894202d16800fdfe0e238
+ languageName: node
+ linkType: hard
+
+"yallist@npm:^4.0.0":
+ version: 4.0.0
+ resolution: "yallist@npm:4.0.0"
+ checksum: 343617202af32df2a15a3be36a5a8c0c8545208f3d3dfbc6bb7c3e3b7e8c6f8e7485432e4f3b88da3031a6e20afa7c711eded32ddfb122896ac5d914e75848d5
+ languageName: node
+ linkType: hard
+
+"yaml@npm:^2.3.4":
+ version: 2.6.1
+ resolution: "yaml@npm:2.6.1"
+ bin:
+ yaml: bin.mjs
+ checksum: 5cf2627f121dcf04ccdebce8e6cbac7c9983d465c4eab314f6fbdc13cda8a07f4e8f9c2252a382b30bcabe05ee3c683647293afd52eb37cbcefbdc7b6ebde9ee
+ languageName: node
+ linkType: hard
+
+"zen-observable-ts@npm:^1.2.5":
+ version: 1.2.5
+ resolution: "zen-observable-ts@npm:1.2.5"
+ dependencies:
+ zen-observable: 0.8.15
+ checksum: 3b707b7a0239a9bc40f73ba71b27733a689a957c1f364fabb9fa9cbd7d04b7c2faf0d517bf17004e3ed3f4330ac613e84c0d32313e450ddaa046f3350af44541
+ languageName: node
+ linkType: hard
+
+"zen-observable@npm:0.8.15":
+ version: 0.8.15
+ resolution: "zen-observable@npm:0.8.15"
+ checksum: b7289084bc1fc74a559b7259faa23d3214b14b538a8843d2b001a35e27147833f4107590b1b44bf5bc7f6dfe6f488660d3a3725f268e09b3925b3476153b7821
+ languageName: node
+ linkType: hard