diff --git a/starters/shopify-algolia/app/actions/cart.actions.ts b/starters/shopify-algolia/app/actions/cart.actions.ts index d47da21..d611325 100644 --- a/starters/shopify-algolia/app/actions/cart.actions.ts +++ b/starters/shopify-algolia/app/actions/cart.actions.ts @@ -7,13 +7,13 @@ import { isDemoMode } from "utils/demo-utils" import { createCart, createCartItem, deleteCartItem, getCart, getProduct, updateCartItem } from "lib/shopify" export async function getOrCreateCart() { - const cartId = cookies().get(COOKIE_CART_ID)?.value + const cartId = (await cookies()).get(COOKIE_CART_ID)?.value const cart = cartId ? await getCart(cartId) : await createCart() if (!cartId) { const newCartId = cart?.id if (newCartId) { - cookies().set(COOKIE_CART_ID, newCartId) + (await cookies()).set(COOKIE_CART_ID, newCartId) revalidateTag(TAGS.CART) } } @@ -81,7 +81,7 @@ export async function addCartItem(prevState: any, variantId: string, productId: } export async function removeCartItem(prevState: any, itemId: string) { - const cartId = cookies().get(COOKIE_CART_ID)?.value + const cartId = (await cookies()).get(COOKIE_CART_ID)?.value if (!cartId) return { ok: false } await deleteCartItem(cartId, [itemId]) @@ -91,7 +91,7 @@ export async function removeCartItem(prevState: any, itemId: string) { } export async function updateItemQuantity(prevState: any, payload: { itemId: string; variantId: string; quantity: number; productId: string }) { - const cartId = cookies().get(COOKIE_CART_ID)?.value + const cartId = (await cookies()).get(COOKIE_CART_ID)?.value if (!cartId) return { ok: false } const { itemId, variantId, quantity, productId } = payload diff --git a/starters/shopify-algolia/app/actions/favorites.actions.ts b/starters/shopify-algolia/app/actions/favorites.actions.ts index b4ec63d..84c05ce 100644 --- a/starters/shopify-algolia/app/actions/favorites.actions.ts +++ b/starters/shopify-algolia/app/actions/favorites.actions.ts @@ -8,13 +8,14 @@ export async function toggleFavoriteProduct(prevState: any, handle: string) { const isFavorite = handles.includes(handle) const newFavorites = handles.includes(handle) ? handles.filter((i) => i !== handle) : [...handles, handle] - cookies().set(COOKIE_FAVORITES, JSON.stringify(newFavorites)) + const cookieStore = await cookies() + cookieStore.set(COOKIE_FAVORITES, JSON.stringify(newFavorites)) return !isFavorite } export async function getParsedFavoritesHandles() { - const favoritesCookie = cookies().get(COOKIE_FAVORITES)?.value || "[]" + const favoritesCookie = (await cookies()).get(COOKIE_FAVORITES)?.value || "[]" const favoritesHandles = JSON.parse(favoritesCookie) as string[] return favoritesHandles } diff --git a/starters/shopify-algolia/app/actions/reviews.actions.ts b/starters/shopify-algolia/app/actions/reviews.actions.ts index ed9168d..30865ba 100644 --- a/starters/shopify-algolia/app/actions/reviews.actions.ts +++ b/starters/shopify-algolia/app/actions/reviews.actions.ts @@ -7,7 +7,7 @@ import { headers } from "next/headers" export const submitReview = async (payload: Omit) => { try { - const ipAddress = headers().get("x-forwarded-for") || null + const ipAddress = (await headers()).get("x-forwarded-for") || null await createProductReview({ ...payload, ip_addr: ipAddress }) } catch (err) { throw new Error(err as string) diff --git a/starters/shopify-algolia/app/category/clp/[slug]/[page]/page.tsx b/starters/shopify-algolia/app/category/clp/[slug]/[page]/page.tsx index d0b3eb8..3718687 100644 --- a/starters/shopify-algolia/app/category/clp/[slug]/[page]/page.tsx +++ b/starters/shopify-algolia/app/category/clp/[slug]/[page]/page.tsx @@ -5,10 +5,11 @@ export const revalidate = 86400 export const dynamic = "force-static" interface CategoryPageProps { - params: { slug: string; page: string } + params: Promise<{ slug: string; page: string }> } -export async function generateMetadata({ params }: CategoryPageProps): Promise { +export async function generateMetadata(props: CategoryPageProps): Promise { + const params = await props.params; return { title: `${params.slug} | Enterprise Commerce`, description: "In excepteur elit mollit in.", @@ -19,6 +20,7 @@ export async function generateStaticParams() { return [] } -export default async function CategoryPage({ params }: CategoryPageProps) { +export default async function CategoryPage(props: CategoryPageProps) { + const params = await props.params; return } diff --git a/starters/shopify-algolia/app/category/clp/[slug]/page.tsx b/starters/shopify-algolia/app/category/clp/[slug]/page.tsx index 69a95ff..1129c31 100644 --- a/starters/shopify-algolia/app/category/clp/[slug]/page.tsx +++ b/starters/shopify-algolia/app/category/clp/[slug]/page.tsx @@ -7,10 +7,11 @@ export const revalidate = 86400 export const dynamic = "force-static" interface CategoryPageProps { - params: { slug: string } + params: Promise<{ slug: string }> } -export async function generateMetadata({ params }: CategoryPageProps): Promise { +export async function generateMetadata(props: CategoryPageProps): Promise { + const params = await props.params; return { title: `${params.slug} | Enterprise Commerce`, description: "In excepteur elit mollit in.", @@ -28,6 +29,7 @@ export async function generateStaticParams() { return hits.map(({ handle }) => ({ slug: handle })) } -export default async function CategoryPage({ params }: CategoryPageProps) { +export default async function CategoryPage(props: CategoryPageProps) { + const params = await props.params; return } diff --git a/starters/shopify-algolia/app/category/plp/[slug]/page.tsx b/starters/shopify-algolia/app/category/plp/[slug]/page.tsx index 342a984..ccd7edc 100644 --- a/starters/shopify-algolia/app/category/plp/[slug]/page.tsx +++ b/starters/shopify-algolia/app/category/plp/[slug]/page.tsx @@ -7,17 +7,20 @@ export const runtime = "nodejs" export const revalidate = 86400 interface ProductListingPageProps { - searchParams: SearchParamsType - params: { slug: string } + searchParams: Promise + params: Promise<{ slug: string }> } -export async function generateMetadata({ params }: ProductListingPageProps): Promise { +export async function generateMetadata(props: ProductListingPageProps): Promise { + const params = await props.params; return { title: `${params.slug} | Enterprise Commerce`, description: "In excepteur elit mollit in.", } } -export default async function ProductListingPage({ searchParams, params }: ProductListingPageProps) { +export default async function ProductListingPage(props: ProductListingPageProps) { + const params = await props.params; + const searchParams = await props.searchParams; return } diff --git a/starters/shopify-algolia/app/favorites/page.tsx b/starters/shopify-algolia/app/favorites/page.tsx index 099c78f..3c1a25f 100644 --- a/starters/shopify-algolia/app/favorites/page.tsx +++ b/starters/shopify-algolia/app/favorites/page.tsx @@ -24,7 +24,7 @@ export default async function Favorites() { async function FavoritesView() { let favoritesHandles: string[] = [] - const favoritesCookie = cookies().get(COOKIE_FAVORITES)?.value + const favoritesCookie = (await cookies()).get(COOKIE_FAVORITES)?.value if (favoritesCookie) { favoritesHandles = JSON.parse(favoritesCookie) as string[] diff --git a/starters/shopify-algolia/app/home/[bucket]/page.tsx b/starters/shopify-algolia/app/home/[bucket]/page.tsx index 5e27ba6..36f21fb 100644 --- a/starters/shopify-algolia/app/home/[bucket]/page.tsx +++ b/starters/shopify-algolia/app/home/[bucket]/page.tsx @@ -11,7 +11,13 @@ export const dynamic = "force-static" export const dynamicParams = true -export default async function Homepage({ params: { bucket } }: { params: { bucket: string } }) { +export default async function Homepage(props: { params: Promise<{ bucket: string }> }) { + const params = await props.params; + + const { + bucket + } = params; + const heroTitles = { a: "Discover Your Next Favorite Thing", b: "Shop the best Deals on Top Brands & Unique Finds", diff --git a/starters/shopify-algolia/app/home/_components/categories-section.tsx b/starters/shopify-algolia/app/home/_components/categories-section.tsx index 2566ef0..524a52e 100644 --- a/starters/shopify-algolia/app/home/_components/categories-section.tsx +++ b/starters/shopify-algolia/app/home/_components/categories-section.tsx @@ -18,6 +18,7 @@ export async function CategoriesSection() { {categories.map((category, index) => { return ( ) diff --git a/starters/shopify-algolia/app/pages/[slug]/metadata.ts b/starters/shopify-algolia/app/pages/[slug]/metadata.ts index 16477f2..65061bd 100644 --- a/starters/shopify-algolia/app/pages/[slug]/metadata.ts +++ b/starters/shopify-algolia/app/pages/[slug]/metadata.ts @@ -1,7 +1,8 @@ import { getPage } from "lib/shopify" import { Metadata } from "next" -export async function generateMetadata({ params: { slug } }: { params: { slug: string } }): Promise { +export async function generateMetadata(props: { params: Promise<{ slug: string }> }): Promise { + const slug = (await props.params).slug const page = await getPage(slug) return { diff --git a/starters/shopify-algolia/app/pages/[slug]/page.tsx b/starters/shopify-algolia/app/pages/[slug]/page.tsx index 3442147..f942183 100644 --- a/starters/shopify-algolia/app/pages/[slug]/page.tsx +++ b/starters/shopify-algolia/app/pages/[slug]/page.tsx @@ -7,7 +7,11 @@ export const dynamicParams = true export { generateMetadata } from "./metadata" -export default async function StaticPage({ params: { slug } }: { params: { slug: string } }) { +export default async function StaticPage(props: { params: Promise<{ slug: string }> }) { + const params = await props.params + + const { slug } = params + const page = await getPage(slug) if (!page) return null diff --git a/starters/shopify-algolia/app/product/[slug]/draft/page.tsx b/starters/shopify-algolia/app/product/[slug]/draft/page.tsx index d039fca..befb35b 100644 --- a/starters/shopify-algolia/app/product/[slug]/draft/page.tsx +++ b/starters/shopify-algolia/app/product/[slug]/draft/page.tsx @@ -27,10 +27,16 @@ export const revalidate = 86400 export const dynamicParams = true interface ProductProps { - params: { slug: string } + params: Promise<{ slug: string }> } -export default async function Product({ params: { slug } }: ProductProps) { +export default async function Product(props: ProductProps) { + const params = await props.params; + + const { + slug + } = params; + return } @@ -86,7 +92,7 @@ async function ProductView({ slug }: { slug: string }) { } async function getDraftAwareProduct(slug: string) { - const draft = draftMode() + const draft = await draftMode() let product = await getProductByHandle(removeOptionsFromUrl(slug)) if (draft.isEnabled && product) product = await getAdminProduct(product?.id) diff --git a/starters/shopify-algolia/app/product/[slug]/page.tsx b/starters/shopify-algolia/app/product/[slug]/page.tsx index 75c172b..4a1acdc 100644 --- a/starters/shopify-algolia/app/product/[slug]/page.tsx +++ b/starters/shopify-algolia/app/product/[slug]/page.tsx @@ -30,7 +30,7 @@ export const dynamic = "force-static" export const dynamicParams = true interface ProductProps { - params: { slug: string } + params: Promise<{ slug: string }> } export async function generateStaticParams() { @@ -44,7 +44,13 @@ export async function generateStaticParams() { return hits.map(({ handle }) => ({ slug: handle })) } -export default async function Product({ params: { slug } }: ProductProps) { +export default async function Product(props: ProductProps) { + const params = await props.params; + + const { + slug + } = params; + const product = await getProduct(removeOptionsFromUrl(slug)) const { color } = getOptionsFromUrl(slug) diff --git a/starters/shopify-algolia/app/reviews/[slug]/metadata.ts b/starters/shopify-algolia/app/reviews/[slug]/metadata.ts index c2c0855..193412e 100644 --- a/starters/shopify-algolia/app/reviews/[slug]/metadata.ts +++ b/starters/shopify-algolia/app/reviews/[slug]/metadata.ts @@ -5,7 +5,8 @@ import { Metadata } from "next" import { getProduct } from "lib/algolia" import { env } from "env.mjs" -export async function generateMetadata({ params: { slug } }: ProductReviewsPageProps): Promise { +export async function generateMetadata(props: ProductReviewsPageProps): Promise { + const slug = (await props.params).slug const product = await getProduct(removeOptionsFromUrl(slug)) const originalTitle = product?.seo?.title diff --git a/starters/shopify-algolia/app/reviews/[slug]/page.tsx b/starters/shopify-algolia/app/reviews/[slug]/page.tsx index e04180c..e57f3fa 100644 --- a/starters/shopify-algolia/app/reviews/[slug]/page.tsx +++ b/starters/shopify-algolia/app/reviews/[slug]/page.tsx @@ -17,11 +17,16 @@ export { generateMetadata } from "./metadata" export const revalidate = 86400 export interface ProductReviewsPageProps { - params: { slug: string } - searchParams: { [key: string]: string | string[] | undefined } + params: Promise<{ slug: string }> + searchParams: Promise<{ [key: string]: string | string[] | undefined }> } -export default async function ProductReviews({ params: { slug }, searchParams }: ProductReviewsPageProps) { +export default async function ProductReviews(props: ProductReviewsPageProps) { + const searchParams = await props.searchParams + const params = await props.params + + const { slug } = params + const page = searchParams.page ? parseInt(searchParams.page as string) : 1 const [product, { reviews, total: totalReviews }] = await Promise.all([ diff --git a/starters/shopify-algolia/app/search/page.tsx b/starters/shopify-algolia/app/search/page.tsx index 6bfd778..0264642 100644 --- a/starters/shopify-algolia/app/search/page.tsx +++ b/starters/shopify-algolia/app/search/page.tsx @@ -14,10 +14,11 @@ export const revalidate = 86400 export const runtime = "nodejs" interface SearchPageProps { - searchParams: SearchParamsType + searchParams: Promise } -export default async function SearchPage({ searchParams }: SearchPageProps) { +export default async function SearchPage(props: SearchPageProps) { + const searchParams = await props.searchParams; return ( }> diff --git a/starters/shopify-algolia/components/filters/facets-content.tsx b/starters/shopify-algolia/components/filters/facets-content.tsx index 6dd9a74..bac53fd 100644 --- a/starters/shopify-algolia/components/filters/facets-content.tsx +++ b/starters/shopify-algolia/components/filters/facets-content.tsx @@ -191,8 +191,8 @@ export function FacetsContent({ independentFacetDistribution, facetDistribution, Price { setMinPrice(minPrice) setMaxPrice(maxPrice) diff --git a/starters/shopify-algolia/components/filters/price-facet.tsx b/starters/shopify-algolia/components/filters/price-facet.tsx index 3635aa3..66fa76f 100644 --- a/starters/shopify-algolia/components/filters/price-facet.tsx +++ b/starters/shopify-algolia/components/filters/price-facet.tsx @@ -5,50 +5,74 @@ import { Input, InputProps } from "components/ui/input" import { Label } from "components/ui/label" interface PriceFacetProps { - initMin: number | null - initMax: number | null + minPrice: number | null + maxPrice: number | null setFacet: (facet: { minPrice: number | null; maxPrice: number | null }) => void } -export const PriceFacet = ({ initMin, initMax, setFacet }: PriceFacetProps) => { - const [minPrice, setMinPrice] = useState(initMin) - const [maxPrice, setMaxPrice] = useState(initMax) +export const PriceFacet = ({ minPrice, maxPrice, setFacet }: PriceFacetProps) => { + const [minInput, setMinInput] = useState(minPrice?.toString() ?? null) + const [maxInput, setMaxInput] = useState(maxPrice?.toString() ?? null) const handleKeyDown = (e: KeyboardEvent) => { if (e.key === "Enter") { - setFacet({ minPrice, maxPrice }) + applyPrices() + } + } + + const applyPrices = () => { + const minValue = minInput === "" ? null : Number(minInput) + const maxValue = maxInput === "" ? null : Number(maxInput) + + const finalMin = minValue !== null && !isNaN(minValue) ? minValue : null + const finalMax = maxValue !== null && !isNaN(maxValue) ? maxValue : null + + // if min is greater than max or max is less than min, reset accordingly + if (finalMin !== null && finalMax !== null) { + if (finalMin > finalMax) { + setMaxInput("") + setFacet({ + minPrice: finalMin, + maxPrice: null, + }) + return + } + } + + setFacet({ + minPrice: finalMin, + maxPrice: finalMax, + }) + } + + const handlePriceChange = (e: ChangeEvent, field: "min" | "max") => { + const value = e.target.value + + if (field === "min") { + const newMin = value === "" ? null : Number(value) + setMinInput(value) + + if (newMin !== null && maxInput !== "" && newMin > Number(maxInput)) { + setMaxInput("") + } + } else { + const newMax = value === "" ? null : Number(value) + setMaxInput(value) + + if (newMax !== null && minInput !== "" && newMax < Number(minInput)) { + setMinInput("") + } } } return (
- { - setMinPrice(+e.target.value) - }} - onKeyDown={handleKeyDown} - /> - - { - setMaxPrice(+e.target.value) - }} - onKeyDown={handleKeyDown} - /> + handlePriceChange(e, "min")} onKeyDown={handleKeyDown} /> + + handlePriceChange(e, "max")} onKeyDown={handleKeyDown} />
-
@@ -56,7 +80,7 @@ export const PriceFacet = ({ initMin, initMax, setFacet }: PriceFacetProps) => { } interface PriceInputProps extends InputProps { - value: number | undefined + value: string onChange: (e: ChangeEvent) => void label: string } diff --git a/starters/shopify-algolia/lib/algolia/filter-builder.test.ts b/starters/shopify-algolia/lib/algolia/filter-builder.test.ts index e072154..5001d56 100644 --- a/starters/shopify-algolia/lib/algolia/filter-builder.test.ts +++ b/starters/shopify-algolia/lib/algolia/filter-builder.test.ts @@ -1,208 +1,117 @@ -import { ComparisonOperators, FilterBuilder, SpecialOperators } from "./filter-builder" +import { FilterBuilder, ComparisonOperators } from "./filter-builder" describe("FilterBuilder", () => { - test("should create a basic condition", () => { - const filter = new FilterBuilder().where("genres", ComparisonOperators.Equal, "horror").build() + let builder: FilterBuilder - expect(filter).toBe('genres = "horror"') + beforeEach(() => { + builder = new FilterBuilder() }) - test("should handle the TO operator", () => { - const filter = new FilterBuilder().to("rating.users", 80, 89).build() + describe("where", () => { + it("should create a basic equality filter", () => { + expect(new FilterBuilder().where("price", 100).build()).toBe("price:100") + expect(new FilterBuilder().where("name", "test").build()).toBe('name:"test"') + expect(new FilterBuilder().where("isActive", true).build()).toBe("isActive:true") + }) - expect(filter).toBe("rating.users 80 TO 89") - }) - - test("should handle the EXISTS operator", () => { - const filter = new FilterBuilder().exists("overview").build() - - expect(filter).toBe("overview EXISTS") - }) - - test("should handle the IS EMPTY operator", () => { - const filter = new FilterBuilder().isEmpty("overview").build() - - expect(filter).toBe("overview IS EMPTY") - }) - - test("should handle the IS NULL operator", () => { - const filter = new FilterBuilder().isNull("release_date").build() - - expect(filter).toBe("release_date IS NULL") - }) - - test("should negate a condition using the NOT operator", () => { - const filter = new FilterBuilder().not().where("director", ComparisonOperators.Equal, "Jordan Peele").build() - - expect(filter).toBe('NOT director = "Jordan Peele"') - }) - - test("should combine conditions with AND/OR logical operators", () => { - const filter = new FilterBuilder().where("genres", ComparisonOperators.Equal, "horror").and().where("rating.users", ComparisonOperators.GreaterThan, 85).build() - const filterOr = new FilterBuilder().where("genres", ComparisonOperators.Equal, "horror").or().where("genres", ComparisonOperators.Equal, "comedy").build() - - expect(filter).toBe('genres = "horror" AND rating.users > 85') - expect(filterOr).toBe('genres = "horror" OR genres = "comedy"') - }) - - test("should handle complex grouping with logical operators", () => { - const filter = new FilterBuilder() - .group((builder) => { - builder.where("genres", ComparisonOperators.Equal, "horror").or().where("genres", ComparisonOperators.Equal, "comedy") - }) - .and() - .where("rating.users", ComparisonOperators.GreaterThan, 85) - .build() - - expect(filter).toBe('(genres = "horror" OR genres = "comedy") AND rating.users > 85') - }) - - test("should create an inequality condition", () => { - const filter = new FilterBuilder().where("genres", ComparisonOperators.NotEqual, "action").build() - - expect(filter).toBe('genres != "action"') - }) - - test('should create a comparison condition using ">" operator', () => { - const filter = new FilterBuilder().where("rating.users", ComparisonOperators.GreaterThan, 85).build() - - expect(filter).toBe("rating.users > 85") - }) - - test('should combine comparison conditions using ">= AND <" operators', () => { - const filter = new FilterBuilder().where("rating.users", ComparisonOperators.GreaterThanOrEqual, 80).and().where("rating.users", ComparisonOperators.LessThan, 90).build() - - expect(filter).toBe("rating.users >= 80 AND rating.users < 90") - }) - - test('should handle "NOT EXISTS" operator', () => { - const filter = new FilterBuilder().not().exists("release_date").build() - - expect(filter).toBe("NOT release_date EXISTS") - }) - - test('should handle reverse "NOT EXISTS" logic', () => { - const filter = new FilterBuilder().not().where("release_date", SpecialOperators.Exists).build() - - expect(filter).toBe("NOT release_date EXISTS") - }) + it("should handle comparison operators", () => { + expect(new FilterBuilder().where("price", 100, ComparisonOperators.GreaterThan).build()).toBe("price>100") + expect(new FilterBuilder().where("price", 100, ComparisonOperators.LessThanOrEqual).build()).toBe("price<=100") + expect(new FilterBuilder().where("price", 100, ComparisonOperators.NotEqual).build()).toBe("price!=100") + }) - test('should handle "IN" operator with multiple values', () => { - const filter = new FilterBuilder().in("genres", ["horror", "comedy"]).build() - - expect(filter).toBe('genres IN ["horror", "comedy"]') + it("should handle array values as IN operation", () => { + expect(new FilterBuilder().where("category", ["books", "games"]).build()).toBe('(category:"books" OR category:"games")') + }) }) - test('should handle "OR" logic with the same field', () => { - const filter = new FilterBuilder().where("genres", ComparisonOperators.Equal, "horror").or().where("genres", ComparisonOperators.Equal, "comedy").build() - - expect(filter).toBe('genres = "horror" OR genres = "comedy"') + describe("to", () => { + it("should create a range filter", () => { + expect(builder.to("price", 10, 100).build()).toBe("price:10 TO 100") + }) }) - test('should handle "NOT IN" operator with multiple values', () => { - const filter = new FilterBuilder().not().in("genres", ["horror", "comedy"]).build() - - expect(filter).toBe('NOT genres IN ["horror", "comedy"]') - }) + describe("in", () => { + it("should create an OR condition for multiple values", () => { + expect(builder.in("category", ["books", "games"]).build()).toBe('(category:"books" OR category:"games")') + }) - test("should combine conditions without logical operators as array", () => { - const filter = new FilterBuilder() - .group((sub) => { - sub.where("genres", ComparisonOperators.Equal, "horror").and().where("director", ComparisonOperators.Equal, "Jordan Peele") - }) - .build() + it("should handle empty array", () => { + expect(builder.in("category", []).build()).toBe("") + }) - expect(filter).toBe('(genres = "horror" AND director = "Jordan Peele")') + it("should handle different value types", () => { + expect(builder.in("mixed", ["test", 123, true]).build()).toBe('(mixed:"test" OR mixed:123 OR mixed:true)') + }) }) - test("should handle OR logic within groups", () => { - const filter = new FilterBuilder() - .group((sub) => { - sub.where("genres", ComparisonOperators.Equal, "horror").or().where("genres", ComparisonOperators.Equal, "comedy") - }) - .build() - - expect(filter).toBe('(genres = "horror" OR genres = "comedy")') + describe("tag", () => { + it("should create a tag filter", () => { + expect(builder.tag("featured").build()).toBe('_tags:"featured"') + }) }) - test("should combine multiple conditions and groups", () => { - const filter = new FilterBuilder() - .group((sub) => { - sub.where("genres", ComparisonOperators.Equal, "horror").or().where("genres", ComparisonOperators.Equal, "comedy") - }) - .and() - .where("director", ComparisonOperators.Equal, "Jordan Peele") - .build() + describe("logical operators", () => { + it("should combine conditions with AND", () => { + const builder = new FilterBuilder() + expect(builder.where("price", 100).and().where("category", "books").build()).toBe('price:100 AND category:"books"') + }) - expect(filter).toBe('(genres = "horror" OR genres = "comedy") AND director = "Jordan Peele"') - }) + it("should combine conditions with OR", () => { + const builder = new FilterBuilder() + expect(builder.where("price", 100).or().where("price", 200).build()).toBe("price:100 OR price:200") + }) - test("should handle complex condition with OR and NOT operators", () => { - const filter = new FilterBuilder() - .group((sub) => { - sub.where("genres", ComparisonOperators.Equal, "comedy").or().where("genres", ComparisonOperators.Equal, "horror") - }) - .and() - .not() - .where("director", ComparisonOperators.Equal, "Jordan Peele") - .build() - - expect(filter).toBe('(genres = "comedy" OR genres = "horror") AND NOT director = "Jordan Peele"') + it("should handle NOT operator", () => { + const builder = new FilterBuilder() + expect(builder.not().where("category", "books").build()).toBe('NOT category:"books"') + }) }) - test("should handle mixed array and string syntax for complex condition", () => { - const filter = new FilterBuilder() - .group((sub) => { - sub.in("genres", ["comedy", "horror"]) - }) - .and() - .not() - .where("director", ComparisonOperators.Equal, "Jordan Peele") - .build() - - expect(filter).toBe('(genres IN ["comedy", "horror"]) AND NOT director = "Jordan Peele"') - }) - - test("should correctly handle nested groups", () => { - const filter = new FilterBuilder() - .group((g1) => { - g1.group((g2) => { - g2.where("rating", ComparisonOperators.GreaterThan, 9) - }) + describe("group", () => { + it("should create grouped conditions", () => { + expect( + new FilterBuilder() + .group((sub) => { + sub.where("price", 100).or().where("price", 200) + }) .and() - .exists("director") - }) - .build() - - expect(filter).toBe("((rating > 9) AND director EXISTS)") - }) - - test("should not start with a logical operator", () => { - const query = new FilterBuilder().and().where("field", ComparisonOperators.Equal, "value").build() - - expect(query).not.toMatch(/^\s*AND\s+/) - }) - - test("should not end with a logical operator", () => { - const query = new FilterBuilder().where("field", ComparisonOperators.Equal, "value").and().build() - - expect(query).not.toMatch(/\s+AND\s*$/) - }) - - test("should handle complex expressions without starting or ending with a logical operator", () => { - const query = new FilterBuilder() - .and() - .where("field1", ComparisonOperators.Equal, "value") - .and() - .group((builder) => { - builder.where("field2", ComparisonOperators.GreaterThan, 10).or().where("field3", ComparisonOperators.LessThan, 20) - }) - .or() - .build() - - expect(query).toMatch(/^field1 = "value" AND/) - expect(query).toMatch(/\(field2 > 10 OR field3 < 20\)$/) - expect(query).not.toMatch(/^\s*AND\s+/) - expect(query).not.toMatch(/\s+OR\s*$/) + .where("category", "books") + .build() + ).toBe('(price:100 OR price:200) AND category:"books"') + }) + + it("should handle nested groups", () => { + expect( + new FilterBuilder() + .group((sub) => { + sub + .where("price", 100) + .and() + .group((inner) => { + inner.where("category", "books").or().where("category", "games") + }) + }) + .build() + ).toBe('(price:100 AND (category:"books" OR category:"games"))') + }) + }) + + describe("complex queries", () => { + it("should handle complex combinations of filters", () => { + expect( + new FilterBuilder() + .where("price", 100, ComparisonOperators.GreaterThanOrEqual) + .and() + .where("price", 200, ComparisonOperators.LessThanOrEqual) + .and() + .group((sub) => { + sub.where("category", "books").or().where("category", "games") + }) + .and() + .tag("featured") + .build() + ).toBe('price>=100 AND price<=200 AND (category:"books" OR category:"games") AND _tags:"featured"') + }) }) }) diff --git a/starters/shopify-algolia/lib/algolia/filter-builder.ts b/starters/shopify-algolia/lib/algolia/filter-builder.ts index b5931a9..52273e1 100644 --- a/starters/shopify-algolia/lib/algolia/filter-builder.ts +++ b/starters/shopify-algolia/lib/algolia/filter-builder.ts @@ -15,83 +15,79 @@ export enum LogicalOperators { Not = "NOT", } -type Value = string | number | boolean | (string | number | boolean)[]; +type Value = string | number | boolean | (string | number | boolean)[] export class FilterBuilder { - private expression: string[] = []; + private expression: string[] = [] - where( - attribute: string, - value: Value, - operator?: ComparisonOperators - ): FilterBuilder { + where(attribute: string, value: Value, operator?: ComparisonOperators): FilterBuilder { if (Array.isArray(value)) { - this.in(attribute, value); + if (value.length === 0) { + return this + } + const conditions = value.map((v) => `${attribute}:${this.formatValue(v)}`) + this.expression.push(conditions.length === 1 ? conditions[0] : `(${conditions.join(" OR ")})`) } else { - this.expression.push( - `${attribute}${operator || ":"}${this.formatValue(value)}` - ); + this.expression.push(`${attribute}${operator || ":"}${this.formatValue(value)}`) } - return this; + return this } to(attribute: string, min: number, max: number): FilterBuilder { - this.expression.push(`${attribute}:${min} TO ${max}`); - return this; + this.expression.push(`${attribute}:${min} TO ${max}`) + return this } in(attribute: string, values: (string | number | boolean)[]): FilterBuilder { if (values.length === 0) { - return this; + return this } - const conditions = values.map( - (value) => `${attribute}:${this.formatValue(value)}` - ); - this.expression.push(`(${conditions.join(" OR ")})`); - return this; + const conditions = values.map((value) => `${attribute}:${this.formatValue(value)}`) + this.expression.push(conditions.length === 1 ? conditions[0] : `(${conditions.join(" OR ")})`) + return this } tag(value: string): FilterBuilder { - this.expression.push(`_tags:${this.formatValue(value)}`); - return this; + this.expression.push(`_tags:${this.formatValue(value)}`) + return this } and(): FilterBuilder { - this.expression.push(LogicalOperators.And); - return this; + this.expression.push(LogicalOperators.And) + return this } or(): FilterBuilder { - this.expression.push(LogicalOperators.Or); - return this; + this.expression.push(LogicalOperators.Or) + return this } not(): FilterBuilder { - this.expression.push(LogicalOperators.Not); - return this; + this.expression.push(LogicalOperators.Not) + return this } group(fn: (builder: FilterBuilder) => void): FilterBuilder { - const subBuilder = new FilterBuilder(); - fn(subBuilder); - const subExpression = subBuilder.build(); - this.expression.push(`${subExpression}`); - return this; + const subBuilder = new FilterBuilder() + fn(subBuilder) + const subExpression = subBuilder.build() + this.expression.push(`(${subExpression})`) + return this } build(): string { - return this.expression.join(" "); + return this.expression.join(" ") } private formatValue(value: string | number | boolean): string { if (typeof value === "string") { - return `"${value}"`; + return `"${value}"` } - return value.toString(); + return value.toString() } private formatArray(values: (string | number | boolean)[]): string { - return `(${values.map((v) => this.formatValue(v)).join(",")})`; + return `(${values.map((v) => this.formatValue(v)).join(",")})` } } diff --git a/starters/shopify-algolia/next-env.d.ts b/starters/shopify-algolia/next-env.d.ts index 4f11a03..40c3d68 100644 --- a/starters/shopify-algolia/next-env.d.ts +++ b/starters/shopify-algolia/next-env.d.ts @@ -2,4 +2,4 @@ /// // NOTE: This file should not be edited -// see https://nextjs.org/docs/basic-features/typescript for more information. +// see https://nextjs.org/docs/app/building-your-application/configuring/typescript for more information. diff --git a/starters/shopify-algolia/package.json b/starters/shopify-algolia/package.json index c6314f9..9c37abb 100644 --- a/starters/shopify-algolia/package.json +++ b/starters/shopify-algolia/package.json @@ -3,7 +3,7 @@ "version": "1.0.0", "private": true, "scripts": { - "dev": "next dev", + "dev": "next dev --turbopack", "build": "next build", "start": "next start", "lint": "next lint", @@ -25,8 +25,8 @@ "dependencies": { "@ai-sdk/openai": "^0.0.71", "@hookform/resolvers": "^3.3.4", - "@next/bundle-analyzer": "14.2.5", - "@next/third-parties": "^14.1.4", + "@next/bundle-analyzer": "15.0.3", + "@next/third-parties": "15.0.3", "@radix-ui/react-accordion": "^1.1.2", "@radix-ui/react-checkbox": "^1.0.4", "@radix-ui/react-dialog": "^1.0.5", @@ -58,14 +58,14 @@ "class-variance-authority": "^0.7.0", "date-fns": "^3.6.0", "embla-carousel-react": "^8.0.0", - "next": "14.2.3", + "next": "15.0.3", "next-compose-plugins": "^2.2.1", "nuqs": "^1.17.1", "p-retry": "^6.2.0", "playwright": "^1.42.1", "postcss": "^8.4.38", - "react": "^18.2.0", - "react-dom": "^18.2.0", + "react": "19.0.0-rc-66855b96-20241106", + "react-dom": "19.0.0-rc-66855b96-20241106", "react-hook-form": "^7.51.1", "replicate": "^0.29.1", "schema-dts": "^1.1.2", @@ -87,14 +87,14 @@ "@total-typescript/ts-reset": "^0.5.1", "@types/jest": "^29.5.12", "@types/node": "^20.11.30", - "@types/react": "^18.2.69", - "@types/react-dom": "^18.2.22", + "@types/react": "npm:types-react@19.0.0-rc.1", + "@types/react-dom": "npm:types-react-dom@19.0.0-rc.1", "@typescript-eslint/eslint-plugin": "^7.3.1", "@typescript-eslint/parser": "^7.3.1", "@vercel/style-guide": "^5.0.0", "dotenv": "^16.4.5", "eslint": "8.54.0", - "eslint-config-next": "14.0.3", + "eslint-config-next": "15.0.3", "eslint-config-prettier": "^9.0.0", "eslint-config-react-app": "^7.0.1", "eslint-config-turbo": "^1.10.12", @@ -117,5 +117,9 @@ "tsup": "^8.3.5", "typescript": "5.4.3", "zod": "^3.22.4" + }, + "resolutions": { + "@types/react": "npm:types-react@19.0.0-rc.1", + "@types/react-dom": "npm:types-react-dom@19.0.0-rc.1" } } diff --git a/starters/shopify-algolia/utils/get-vercel-flag-overrides.ts b/starters/shopify-algolia/utils/get-vercel-flag-overrides.ts index 020a2ef..a521cfb 100644 --- a/starters/shopify-algolia/utils/get-vercel-flag-overrides.ts +++ b/starters/shopify-algolia/utils/get-vercel-flag-overrides.ts @@ -5,7 +5,7 @@ import { cookies } from "next/headers" type Flags = Record, boolean> export async function getVercelFlagOverrides(): Promise { - const overridesCookieValue = cookies().get("vercel-flag-overrides")?.value + const overridesCookieValue = (await cookies()).get("vercel-flag-overrides")?.value const overrides = overridesCookieValue ? ((await decrypt(overridesCookieValue)) as Flags) : null return { diff --git a/starters/shopify-algolia/utils/use-hierarchical-menu.ts b/starters/shopify-algolia/utils/use-hierarchical-menu.ts index f734df8..8480ef9 100644 --- a/starters/shopify-algolia/utils/use-hierarchical-menu.ts +++ b/starters/shopify-algolia/utils/use-hierarchical-menu.ts @@ -18,7 +18,7 @@ export interface HierarchicalMenuItem { export const useHierarchicalMenu = ({ attributes, distribution, separator = HIERARCHICAL_SEPARATOR, transformItems }: HierarchicalMenuOptions) => { const { slug } = useParams() const normalizedSlug = Array.isArray(slug) ? slug.join(separator) : slug - const initialPath = slug ? findInitialPath(normalizedSlug, attributes, distribution, separator) : [] + const initialPath = slug ? findInitialPath(normalizedSlug!, attributes, distribution, separator) : [] const getCategoryChildren = (path: string[]): HierarchicalMenuItem[] => { const level = path.length diff --git a/starters/shopify-algolia/yarn.lock b/starters/shopify-algolia/yarn.lock index 7bba8e4..5f7160f 100644 --- a/starters/shopify-algolia/yarn.lock +++ b/starters/shopify-algolia/yarn.lock @@ -1329,6 +1329,13 @@ resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== +"@emnapi/runtime@^1.2.0": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.3.1.tgz#0fcaa575afc31f455fd33534c19381cfce6c6f60" + integrity sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw== + dependencies: + tslib "^2.4.0" + "@esbuild/aix-ppc64@0.24.0": version "0.24.0" resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz#b57697945b50e99007b4c2521507dc613d4a648c" @@ -2081,6 +2088,119 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== +"@img/sharp-darwin-arm64@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz#ef5b5a07862805f1e8145a377c8ba6e98813ca08" + integrity sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ== + optionalDependencies: + "@img/sharp-libvips-darwin-arm64" "1.0.4" + +"@img/sharp-darwin-x64@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz#e03d3451cd9e664faa72948cc70a403ea4063d61" + integrity sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q== + optionalDependencies: + "@img/sharp-libvips-darwin-x64" "1.0.4" + +"@img/sharp-libvips-darwin-arm64@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz#447c5026700c01a993c7804eb8af5f6e9868c07f" + integrity sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg== + +"@img/sharp-libvips-darwin-x64@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz#e0456f8f7c623f9dbfbdc77383caa72281d86062" + integrity sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ== + +"@img/sharp-libvips-linux-arm64@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz#979b1c66c9a91f7ff2893556ef267f90ebe51704" + integrity sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA== + +"@img/sharp-libvips-linux-arm@1.0.5": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz#99f922d4e15216ec205dcb6891b721bfd2884197" + integrity sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g== + +"@img/sharp-libvips-linux-s390x@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz#f8a5eb1f374a082f72b3f45e2fb25b8118a8a5ce" + integrity sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA== + +"@img/sharp-libvips-linux-x64@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz#d4c4619cdd157774906e15770ee119931c7ef5e0" + integrity sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw== + +"@img/sharp-libvips-linuxmusl-arm64@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz#166778da0f48dd2bded1fa3033cee6b588f0d5d5" + integrity sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA== + +"@img/sharp-libvips-linuxmusl-x64@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz#93794e4d7720b077fcad3e02982f2f1c246751ff" + integrity sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw== + +"@img/sharp-linux-arm64@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz#edb0697e7a8279c9fc829a60fc35644c4839bb22" + integrity sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA== + optionalDependencies: + "@img/sharp-libvips-linux-arm64" "1.0.4" + +"@img/sharp-linux-arm@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz#422c1a352e7b5832842577dc51602bcd5b6f5eff" + integrity sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ== + optionalDependencies: + "@img/sharp-libvips-linux-arm" "1.0.5" + +"@img/sharp-linux-s390x@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz#f5c077926b48e97e4a04d004dfaf175972059667" + integrity sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q== + optionalDependencies: + "@img/sharp-libvips-linux-s390x" "1.0.4" + +"@img/sharp-linux-x64@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz#d806e0afd71ae6775cc87f0da8f2d03a7c2209cb" + integrity sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA== + optionalDependencies: + "@img/sharp-libvips-linux-x64" "1.0.4" + +"@img/sharp-linuxmusl-arm64@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz#252975b915894fb315af5deea174651e208d3d6b" + integrity sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g== + optionalDependencies: + "@img/sharp-libvips-linuxmusl-arm64" "1.0.4" + +"@img/sharp-linuxmusl-x64@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz#3f4609ac5d8ef8ec7dadee80b560961a60fd4f48" + integrity sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw== + optionalDependencies: + "@img/sharp-libvips-linuxmusl-x64" "1.0.4" + +"@img/sharp-wasm32@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz#6f44f3283069d935bb5ca5813153572f3e6f61a1" + integrity sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg== + dependencies: + "@emnapi/runtime" "^1.2.0" + +"@img/sharp-win32-ia32@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz#1a0c839a40c5351e9885628c85f2e5dfd02b52a9" + integrity sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ== + +"@img/sharp-win32-x64@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz#56f00962ff0c4e0eb93d34a047d29fa995e3e342" + integrity sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg== + "@isaacs/cliui@^8.0.2": version "8.0.2" resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" @@ -2361,74 +2481,69 @@ resolved "https://registry.yarnpkg.com/@microsoft/tsdoc/-/tsdoc-0.14.2.tgz#c3ec604a0b54b9a9b87e9735dfc59e1a5da6a5fb" integrity sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug== -"@next/bundle-analyzer@14.2.5": - version "14.2.5" - resolved "https://registry.yarnpkg.com/@next/bundle-analyzer/-/bundle-analyzer-14.2.5.tgz#549414aba34e3d21862be6090881d681b0984e8e" - integrity sha512-BtBbI8VUnB7s4m9ut6CkeJ8Hyx+aq+86mbH+uAld7ZGG0/eH4+5hcPnkHKsQM/yj74iClazS0fninI8yZbIZWA== +"@next/bundle-analyzer@15.0.3": + version "15.0.3" + resolved "https://registry.yarnpkg.com/@next/bundle-analyzer/-/bundle-analyzer-15.0.3.tgz#58615521d2ae649687d0c7592b9d11a2aa92c19b" + integrity sha512-x7ZNvpoQPO0C5ZG//qVp21Qs3v6+C8LBJmdu9DKj4/NmjlnwoQ7dqRZ/nKZcwVhkFT7BHf+Qd5FaeHq9IDJvDQ== dependencies: webpack-bundle-analyzer "4.10.1" -"@next/env@14.2.3": - version "14.2.3" - resolved "https://registry.yarnpkg.com/@next/env/-/env-14.2.3.tgz#d6def29d1c763c0afb397343a15a82e7d92353a0" - integrity sha512-W7fd7IbkfmeeY2gXrzJYDx8D2lWKbVoTIj1o1ScPHNzvp30s1AuoEFSdr39bC5sjxJaxTtq3OTCZboNp0lNWHA== - -"@next/eslint-plugin-next@14.0.3": - version "14.0.3" - resolved "https://registry.yarnpkg.com/@next/eslint-plugin-next/-/eslint-plugin-next-14.0.3.tgz#f32413be4db69f698538c38fd6f4091a2feb54c6" - integrity sha512-j4K0n+DcmQYCVnSAM+UByTVfIHnYQy2ODozfQP+4RdwtRDfobrIvKq1K4Exb2koJ79HSSa7s6B2SA8T/1YR3RA== - dependencies: - glob "7.1.7" - -"@next/swc-darwin-arm64@14.2.3": - version "14.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.3.tgz#db1a05eb88c0224089b815ad10ac128ec79c2cdb" - integrity sha512-3pEYo/RaGqPP0YzwnlmPN2puaF2WMLM3apt5jLW2fFdXD9+pqcoTzRk+iZsf8ta7+quAe4Q6Ms0nR0SFGFdS1A== - -"@next/swc-darwin-x64@14.2.3": - version "14.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.3.tgz#a3f8af05b5f9a52ac3082e66ac29e125ab1d7b9c" - integrity sha512-6adp7waE6P1TYFSXpY366xwsOnEXM+y1kgRpjSRVI2CBDOcbRjsJ67Z6EgKIqWIue52d2q/Mx8g9MszARj8IEA== - -"@next/swc-linux-arm64-gnu@14.2.3": - version "14.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.3.tgz#4e63f43879285b52554bfd39e6e0cc78a9b27bbf" - integrity sha512-cuzCE/1G0ZSnTAHJPUT1rPgQx1w5tzSX7POXSLaS7w2nIUJUD+e25QoXD/hMfxbsT9rslEXugWypJMILBj/QsA== - -"@next/swc-linux-arm64-musl@14.2.3": - version "14.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.3.tgz#ebdaed26214448b1e6f2c3e8b3cd29bfba387990" - integrity sha512-0D4/oMM2Y9Ta3nGuCcQN8jjJjmDPYpHX9OJzqk42NZGJocU2MqhBq5tWkJrUQOQY9N+In9xOdymzapM09GeiZw== - -"@next/swc-linux-x64-gnu@14.2.3": - version "14.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.3.tgz#19e3bcc137c3b582a1ab867106817e5c90a20593" - integrity sha512-ENPiNnBNDInBLyUU5ii8PMQh+4XLr4pG51tOp6aJ9xqFQ2iRI6IH0Ds2yJkAzNV1CfyagcyzPfROMViS2wOZ9w== - -"@next/swc-linux-x64-musl@14.2.3": - version "14.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.3.tgz#794a539b98e064169cf0ff7741b2a4fb16adec7d" - integrity sha512-BTAbq0LnCbF5MtoM7I/9UeUu/8ZBY0i8SFjUMCbPDOLv+un67e2JgyN4pmgfXBwy/I+RHu8q+k+MCkDN6P9ViQ== - -"@next/swc-win32-arm64-msvc@14.2.3": - version "14.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.3.tgz#eda9fa0fbf1ff9113e87ac2668ee67ce9e5add5a" - integrity sha512-AEHIw/dhAMLNFJFJIJIyOFDzrzI5bAjI9J26gbO5xhAKHYTZ9Or04BesFPXiAYXDNdrwTP2dQceYA4dL1geu8A== - -"@next/swc-win32-ia32-msvc@14.2.3": - version "14.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.3.tgz#7c1190e3f640ab16580c6bdbd7d0e766b9920457" - integrity sha512-vga40n1q6aYb0CLrM+eEmisfKCR45ixQYXuBXxOOmmoV8sYST9k7E3US32FsY+CkkF7NtzdcebiFT4CHuMSyZw== - -"@next/swc-win32-x64-msvc@14.2.3": - version "14.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.3.tgz#2be4e39ee25bfbd85be78eea17c0e7751dc4323c" - integrity sha512-Q1/zm43RWynxrO7lW4ehciQVj+5ePBhOK+/K2P7pLFX3JaJ/IZVC69SHidrmZSOkqz7ECIOhhy7XhAFG4JYyHA== - -"@next/third-parties@^14.1.4": - version "14.2.16" - resolved "https://registry.yarnpkg.com/@next/third-parties/-/third-parties-14.2.16.tgz#4ba94572679d1614c71ef9026dad4a6fecf0206f" - integrity sha512-owdCT5BbGyfdDXkmZ1kjPMRPJ8+WLLJFTJSjMRQOYwq5j5o0L3U47sHi07J0mhgJgX6RmRyLd0OFPHCVfAY3Kw== +"@next/env@15.0.3": + version "15.0.3" + resolved "https://registry.yarnpkg.com/@next/env/-/env-15.0.3.tgz#a2e9bf274743c52b74d30f415f3eba750d51313a" + integrity sha512-t9Xy32pjNOvVn2AS+Utt6VmyrshbpfUMhIjFO60gI58deSo/KgLOp31XZ4O+kY/Is8WAGYwA5gR7kOb1eORDBA== + +"@next/eslint-plugin-next@15.0.3": + version "15.0.3" + resolved "https://registry.yarnpkg.com/@next/eslint-plugin-next/-/eslint-plugin-next-15.0.3.tgz#ce953098036d462f6901e423cc6445fc165b78c4" + integrity sha512-3Ln/nHq2V+v8uIaxCR6YfYo7ceRgZNXfTd3yW1ukTaFbO+/I8jNakrjYWODvG9BuR2v5kgVtH/C8r0i11quOgw== + dependencies: + fast-glob "3.3.1" + +"@next/swc-darwin-arm64@15.0.3": + version "15.0.3" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.0.3.tgz#4c40c506cf3d4d87da0204f4cccf39e6bdc46a71" + integrity sha512-s3Q/NOorCsLYdCKvQlWU+a+GeAd3C8Rb3L1YnetsgwXzhc3UTWrtQpB/3eCjFOdGUj5QmXfRak12uocd1ZiiQw== + +"@next/swc-darwin-x64@15.0.3": + version "15.0.3" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-15.0.3.tgz#8e06cacae3dae279744f9fbe88dea679ec2c1ca3" + integrity sha512-Zxl/TwyXVZPCFSf0u2BNj5sE0F2uR6iSKxWpq4Wlk/Sv9Ob6YCKByQTkV2y6BCic+fkabp9190hyrDdPA/dNrw== + +"@next/swc-linux-arm64-gnu@15.0.3": + version "15.0.3" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.0.3.tgz#c144ad1f21091b9c6e1e330ecc2d56188763191d" + integrity sha512-T5+gg2EwpsY3OoaLxUIofmMb7ohAUlcNZW0fPQ6YAutaWJaxt1Z1h+8zdl4FRIOr5ABAAhXtBcpkZNwUcKI2fw== + +"@next/swc-linux-arm64-musl@15.0.3": + version "15.0.3" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.0.3.tgz#3ccb71c6703bf421332f177d1bb0e10528bc73a2" + integrity sha512-WkAk6R60mwDjH4lG/JBpb2xHl2/0Vj0ZRu1TIzWuOYfQ9tt9NFsIinI1Epma77JVgy81F32X/AeD+B2cBu/YQA== + +"@next/swc-linux-x64-gnu@15.0.3": + version "15.0.3" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.0.3.tgz#b90aa9b07001b4000427c35ab347a9273cbeebb3" + integrity sha512-gWL/Cta1aPVqIGgDb6nxkqy06DkwJ9gAnKORdHWX1QBbSZZB+biFYPFti8aKIQL7otCE1pjyPaXpFzGeG2OS2w== + +"@next/swc-linux-x64-musl@15.0.3": + version "15.0.3" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.0.3.tgz#0ac9724fb44718fc97bfea971ac3fe17e486590e" + integrity sha512-QQEMwFd8r7C0GxQS62Zcdy6GKx999I/rTO2ubdXEe+MlZk9ZiinsrjwoiBL5/57tfyjikgh6GOU2WRQVUej3UA== + +"@next/swc-win32-arm64-msvc@15.0.3": + version "15.0.3" + resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.0.3.tgz#932437d4cf27814e963ba8ae5f033b4421fab9ca" + integrity sha512-9TEp47AAd/ms9fPNgtgnT7F3M1Hf7koIYYWCMQ9neOwjbVWJsHZxrFbI3iEDJ8rf1TDGpmHbKxXf2IFpAvheIQ== + +"@next/swc-win32-x64-msvc@15.0.3": + version "15.0.3" + resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.0.3.tgz#940a6f7b370cdde0cc67eabe945d9e6d97e0be9f" + integrity sha512-VNAz+HN4OGgvZs6MOoVfnn41kBzT+M+tB+OK4cww6DNyWS6wKaDpaAm/qLeOUbnMh0oVx1+mg0uoYARF69dJyA== + +"@next/third-parties@15.0.3": + version "15.0.3" + resolved "https://registry.yarnpkg.com/@next/third-parties/-/third-parties-15.0.3.tgz#e29f3ebe67aced7d510866d69dd178443dd94f43" + integrity sha512-T2NkBXLcgRY0cmE7jb/dSMXNK9D+yv1k+n0uBxwMBS9SEtOhuMvxiUPQRj5x4cFnsei6JECloJg88koMprKw0A== dependencies: third-party-capital "1.0.20" @@ -3240,7 +3355,7 @@ resolved "https://registry.yarnpkg.com/@rtsao/scc/-/scc-1.1.0.tgz#927dd2fae9bc3361403ac2c7a00c32ddce9ad7e8" integrity sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g== -"@rushstack/eslint-patch@^1.1.0", "@rushstack/eslint-patch@^1.3.3": +"@rushstack/eslint-patch@^1.1.0", "@rushstack/eslint-patch@^1.10.3", "@rushstack/eslint-patch@^1.3.3": version "1.10.4" resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.10.4.tgz#427d5549943a9c6fce808e39ea64dbe60d4047f1" integrity sha512-WJgX9nzTqknM393q1QJDJmoW28kUfEnybeTfVNcNAPnIx210RXm2DiXiHzfNPJNIUUb1tJnz/l4QGtJ30PgWmA== @@ -3305,17 +3420,16 @@ dependencies: "@sinonjs/commons" "^3.0.0" -"@swc/counter@^0.1.3": +"@swc/counter@0.1.3": version "0.1.3" resolved "https://registry.yarnpkg.com/@swc/counter/-/counter-0.1.3.tgz#cc7463bd02949611c6329596fccd2b0ec782b0e9" integrity sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ== -"@swc/helpers@0.5.5": - version "0.5.5" - resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.5.tgz#12689df71bfc9b21c4f4ca00ae55f2f16c8b77c0" - integrity sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A== +"@swc/helpers@0.5.13": + version "0.5.13" + resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.13.tgz#33e63ff3cd0cade557672bd7888a39ce7d115a8c" + integrity sha512-UoKGxQ3r5kYI9dALKJapMmuK+1zWM/H17Z1+iwnNmzcJRnfFuevZs375TA5rW31pu4BS4NoSy1fRsexDXfWn5w== dependencies: - "@swc/counter" "^0.1.3" tslib "^2.4.0" "@t3-oss/env-core@0.9.2", "@t3-oss/env-core@^0.9.2": @@ -3656,24 +3770,18 @@ resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.2.tgz#5950e50960793055845e956c427fc2b0d70c5239" integrity sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw== -"@types/prop-types@*": - version "15.7.13" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.13.tgz#2af91918ee12d9d32914feb13f5326658461b451" - integrity sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA== - -"@types/react-dom@^18.0.0", "@types/react-dom@^18.2.22": - version "18.3.1" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.3.1.tgz#1e4654c08a9cdcfb6594c780ac59b55aad42fe07" - integrity sha512-qW1Mfv8taImTthu4KoXgDfLuk4bydU6Q/TkADnDWWHwi4NX4BR+LWfTp2sVmTqRrsHvyDDTelgelxJ+SsejKKQ== +"@types/react-dom@^18.0.0", "@types/react-dom@npm:types-react-dom@19.0.0-rc.1": + version "19.0.0-rc.1" + resolved "https://registry.yarnpkg.com/types-react-dom/-/types-react-dom-19.0.0-rc.1.tgz#1d544d02c5df2a82d87c2eff979afa2e21a8317a" + integrity sha512-VSLZJl8VXCD0fAWp7DUTFUDCcZ8DVXOQmjhJMD03odgeFmu14ZQJHCXeETm3BEAhJqfgJaFkLnGkQv88sRx0fQ== dependencies: "@types/react" "*" -"@types/react@*", "@types/react@^18.2.69": - version "18.3.12" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.12.tgz#99419f182ccd69151813b7ee24b792fe08774f60" - integrity sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw== +"@types/react@*", "@types/react@npm:types-react@19.0.0-rc.1": + version "19.0.0-rc.1" + resolved "https://registry.yarnpkg.com/types-react/-/types-react-19.0.0-rc.1.tgz#576d1a702f6d0cc5b24813a293913e5cbfeaa647" + integrity sha512-RshndUfqTW6K3STLPis8BtAYCGOkMbtvYsi90gmVNDZBXUyUc5juf2PE9LfS/JmOlUIRO8cWTS/1MTnmhjDqyQ== dependencies: - "@types/prop-types" "*" csstype "^3.0.2" "@types/retry@0.12.2": @@ -3715,6 +3823,21 @@ dependencies: "@types/yargs-parser" "*" +"@typescript-eslint/eslint-plugin@^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0": + version "8.14.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.14.0.tgz#7dc0e419c87beadc8f554bf5a42e5009ed3748dc" + integrity sha512-tqp8H7UWFaZj0yNO6bycd5YjMwxa6wIHOLZvWPkidwbgLCsBMetQoGj7DPuAlWa2yGO3H48xmPwjhsSPPCGU5w== + dependencies: + "@eslint-community/regexpp" "^4.10.0" + "@typescript-eslint/scope-manager" "8.14.0" + "@typescript-eslint/type-utils" "8.14.0" + "@typescript-eslint/utils" "8.14.0" + "@typescript-eslint/visitor-keys" "8.14.0" + graphemer "^1.4.0" + ignore "^5.3.1" + natural-compare "^1.4.0" + ts-api-utils "^1.3.0" + "@typescript-eslint/eslint-plugin@^5.5.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz#aeef0328d172b9e37d9bab6dbc13b87ed88977db" @@ -3770,15 +3893,15 @@ dependencies: "@typescript-eslint/utils" "5.62.0" -"@typescript-eslint/parser@^5.4.2 || ^6.0.0", "@typescript-eslint/parser@^6.5.0": - version "6.21.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.21.0.tgz#af8fcf66feee2edc86bc5d1cf45e33b0630bf35b" - integrity sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ== +"@typescript-eslint/parser@^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0": + version "8.14.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.14.0.tgz#0a7e9dbc11bc07716ab2d7b1226217e9f6b51fc8" + integrity sha512-2p82Yn9juUJq0XynBXtFCyrBDb6/dJombnz6vbo6mgQEtWHfvHbQuEa9kAOVIt1c9YFwi7H6WxtPj1kg+80+RA== dependencies: - "@typescript-eslint/scope-manager" "6.21.0" - "@typescript-eslint/types" "6.21.0" - "@typescript-eslint/typescript-estree" "6.21.0" - "@typescript-eslint/visitor-keys" "6.21.0" + "@typescript-eslint/scope-manager" "8.14.0" + "@typescript-eslint/types" "8.14.0" + "@typescript-eslint/typescript-estree" "8.14.0" + "@typescript-eslint/visitor-keys" "8.14.0" debug "^4.3.4" "@typescript-eslint/parser@^5.5.0": @@ -3791,6 +3914,17 @@ "@typescript-eslint/typescript-estree" "5.62.0" debug "^4.3.4" +"@typescript-eslint/parser@^6.5.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.21.0.tgz#af8fcf66feee2edc86bc5d1cf45e33b0630bf35b" + integrity sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ== + dependencies: + "@typescript-eslint/scope-manager" "6.21.0" + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/typescript-estree" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" + debug "^4.3.4" + "@typescript-eslint/parser@^7.3.1": version "7.18.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.18.0.tgz#83928d0f1b7f4afa974098c64b5ce6f9051f96a0" @@ -3826,6 +3960,14 @@ "@typescript-eslint/types" "7.18.0" "@typescript-eslint/visitor-keys" "7.18.0" +"@typescript-eslint/scope-manager@8.14.0": + version "8.14.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.14.0.tgz#01f37c147a735cd78f0ff355e033b9457da1f373" + integrity sha512-aBbBrnW9ARIDn92Zbo7rguLnqQ/pOrUguVpbUwzOhkFg2npFDwTgPGqFqE0H5feXcOoJOfX3SxlJaKEVtq54dw== + dependencies: + "@typescript-eslint/types" "8.14.0" + "@typescript-eslint/visitor-keys" "8.14.0" + "@typescript-eslint/type-utils@5.62.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz#286f0389c41681376cdad96b309cedd17d70346a" @@ -3856,6 +3998,16 @@ debug "^4.3.4" ts-api-utils "^1.3.0" +"@typescript-eslint/type-utils@8.14.0": + version "8.14.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.14.0.tgz#455c6af30c336b24a1af28bc4f81b8dd5d74d94d" + integrity sha512-Xcz9qOtZuGusVOH5Uk07NGs39wrKkf3AxlkK79RBK6aJC1l03CobXjJbwBPSidetAOV+5rEVuiT1VSBUOAsanQ== + dependencies: + "@typescript-eslint/typescript-estree" "8.14.0" + "@typescript-eslint/utils" "8.14.0" + debug "^4.3.4" + ts-api-utils "^1.3.0" + "@typescript-eslint/types@5.62.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f" @@ -3871,6 +4023,11 @@ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.18.0.tgz#b90a57ccdea71797ffffa0321e744f379ec838c9" integrity sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ== +"@typescript-eslint/types@8.14.0": + version "8.14.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.14.0.tgz#0d33d8d0b08479c424e7d654855fddf2c71e4021" + integrity sha512-yjeB9fnO/opvLJFAsPNYlKPnEM8+z4og09Pk504dkqonT02AyL5Z9SSqlE0XqezS93v6CXn49VHvB2G7XSsl0g== + "@typescript-eslint/typescript-estree@5.62.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz#7d17794b77fabcac615d6a48fb143330d962eb9b" @@ -3912,6 +4069,20 @@ semver "^7.6.0" ts-api-utils "^1.3.0" +"@typescript-eslint/typescript-estree@8.14.0": + version "8.14.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.14.0.tgz#a7a3a5a53a6c09313e12fb4531d4ff582ee3c312" + integrity sha512-OPXPLYKGZi9XS/49rdaCbR5j/S14HazviBlUQFvSKz3npr3NikF+mrgK7CFVur6XEt95DZp/cmke9d5i3vtVnQ== + dependencies: + "@typescript-eslint/types" "8.14.0" + "@typescript-eslint/visitor-keys" "8.14.0" + debug "^4.3.4" + fast-glob "^3.3.2" + is-glob "^4.0.3" + minimatch "^9.0.4" + semver "^7.6.0" + ts-api-utils "^1.3.0" + "@typescript-eslint/utils@5.62.0", "@typescript-eslint/utils@^5.10.0", "@typescript-eslint/utils@^5.58.0", "@typescript-eslint/utils@^5.62.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.62.0.tgz#141e809c71636e4a75daa39faed2fb5f4b10df86" @@ -3949,6 +4120,16 @@ "@typescript-eslint/types" "7.18.0" "@typescript-eslint/typescript-estree" "7.18.0" +"@typescript-eslint/utils@8.14.0": + version "8.14.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.14.0.tgz#ac2506875e03aba24e602364e43b2dfa45529dbd" + integrity sha512-OGqj6uB8THhrHj0Fk27DcHPojW7zKwKkPmHXHvQ58pLYp4hy8CSUdTKykKeh+5vFqTTVmjz0zCOOPKRovdsgHA== + dependencies: + "@eslint-community/eslint-utils" "^4.4.0" + "@typescript-eslint/scope-manager" "8.14.0" + "@typescript-eslint/types" "8.14.0" + "@typescript-eslint/typescript-estree" "8.14.0" + "@typescript-eslint/visitor-keys@5.62.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz#2174011917ce582875954ffe2f6912d5931e353e" @@ -3973,6 +4154,14 @@ "@typescript-eslint/types" "7.18.0" eslint-visitor-keys "^3.4.3" +"@typescript-eslint/visitor-keys@8.14.0": + version "8.14.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.14.0.tgz#2418d5a54669af9658986ade4e6cfb7767d815ad" + integrity sha512-vG0XZo8AdTH9OE6VFRwAZldNc7qtJ/6NLGWak+BtENuEUXGZgFpihILPiBvKXvJ2nFu27XNGC6rKiwuaoMbYzQ== + dependencies: + "@typescript-eslint/types" "8.14.0" + eslint-visitor-keys "^3.4.3" + "@uidotdev/usehooks@^2.4.1": version "2.4.1" resolved "https://registry.yarnpkg.com/@uidotdev/usehooks/-/usehooks-2.4.1.tgz#4b733eaeae09a7be143c6c9ca158b56cc1ea75bf" @@ -5410,7 +5599,7 @@ detect-libc@^1.0.3: resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" integrity sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg== -detect-libc@^2.0.0, detect-libc@^2.0.2: +detect-libc@^2.0.0, detect-libc@^2.0.2, detect-libc@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.3.tgz#f0cd503b40f9939b894697d19ad50895e30cf700" integrity sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw== @@ -5817,20 +6006,21 @@ escodegen@^2.0.0: optionalDependencies: source-map "~0.6.1" -eslint-config-next@14.0.3: - version "14.0.3" - resolved "https://registry.yarnpkg.com/eslint-config-next/-/eslint-config-next-14.0.3.tgz#7a01d23e4ff143ef87b520fab9efc440fa5879f3" - integrity sha512-IKPhpLdpSUyKofmsXUfrvBC49JMUTdeaD8ZIH4v9Vk0sC1X6URTuTJCLtA0Vwuj7V/CQh0oISuSTvNn5//Buew== +eslint-config-next@15.0.3: + version "15.0.3" + resolved "https://registry.yarnpkg.com/eslint-config-next/-/eslint-config-next-15.0.3.tgz#b483585260d5e55050d4ab87e053c88089ae12ee" + integrity sha512-IGP2DdQQrgjcr4mwFPve4DrCqo7CVVez1WoYY47XwKSrYO4hC0Dlb+iJA60i0YfICOzgNADIb8r28BpQ5Zs0wg== dependencies: - "@next/eslint-plugin-next" "14.0.3" - "@rushstack/eslint-patch" "^1.3.3" - "@typescript-eslint/parser" "^5.4.2 || ^6.0.0" + "@next/eslint-plugin-next" "15.0.3" + "@rushstack/eslint-patch" "^1.10.3" + "@typescript-eslint/eslint-plugin" "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0" + "@typescript-eslint/parser" "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0" eslint-import-resolver-node "^0.3.6" eslint-import-resolver-typescript "^3.5.2" - eslint-plugin-import "^2.28.1" - eslint-plugin-jsx-a11y "^6.7.1" - eslint-plugin-react "^7.33.2" - eslint-plugin-react-hooks "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" + eslint-plugin-import "^2.31.0" + eslint-plugin-jsx-a11y "^6.10.0" + eslint-plugin-react "^7.35.0" + eslint-plugin-react-hooks "^5.0.0" eslint-config-prettier@^9.0.0: version "9.1.0" @@ -5915,7 +6105,7 @@ eslint-plugin-flowtype@^8.0.3: lodash "^4.17.21" string-natural-compare "^3.0.1" -eslint-plugin-import@^2.25.3, eslint-plugin-import@^2.28.1, eslint-plugin-import@^2.29.0: +eslint-plugin-import@^2.25.3, eslint-plugin-import@^2.28.1, eslint-plugin-import@^2.29.0, eslint-plugin-import@^2.31.0: version "2.31.0" resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz#310ce7e720ca1d9c0bb3f69adfd1c6bdd7d9e0e7" integrity sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A== @@ -5954,7 +6144,7 @@ eslint-plugin-jest@^27.2.3: dependencies: "@typescript-eslint/utils" "^5.10.0" -eslint-plugin-jsx-a11y@^6.5.1, eslint-plugin-jsx-a11y@^6.7.1: +eslint-plugin-jsx-a11y@^6.10.0, eslint-plugin-jsx-a11y@^6.5.1, eslint-plugin-jsx-a11y@^6.7.1: version "6.10.2" resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz#d2812bb23bf1ab4665f1718ea442e8372e638483" integrity sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q== @@ -5985,10 +6175,10 @@ eslint-plugin-react-hooks@^4.3.0, eslint-plugin-react-hooks@^4.6.0: resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz#c829eb06c0e6f484b3fbb85a97e57784f328c596" integrity sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ== -"eslint-plugin-react-hooks@^4.5.0 || 5.0.0-canary-7118f5dd7-20230705": - version "5.0.0-canary-7118f5dd7-20230705" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.0.0-canary-7118f5dd7-20230705.tgz#4d55c50e186f1a2b0636433d2b0b2f592ddbccfd" - integrity sha512-AZYbMo/NW9chdL7vk6HQzQhT+PvTAEVqWk9ziruUoW2kAOcN5qNyelv70e0F1VNQAbvutOC9oc+xfWycI9FxDw== +eslint-plugin-react-hooks@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.0.0.tgz#72e2eefbac4b694f5324154619fee44f5f60f101" + integrity sha512-hIOwI+5hYGpJEc4uPRmz2ulCjAGD/N13Lukkh8cLV0i2IRk/bdZDYjgLVHj+U9Z704kLIdIO6iueGvxNur0sgw== eslint-plugin-react@7.33.2: version "7.33.2" @@ -6012,7 +6202,7 @@ eslint-plugin-react@7.33.2: semver "^6.3.1" string.prototype.matchall "^4.0.8" -eslint-plugin-react@^7.27.1, eslint-plugin-react@^7.33.2: +eslint-plugin-react@^7.27.1, eslint-plugin-react@^7.33.2, eslint-plugin-react@^7.35.0: version "7.37.2" resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.37.2.tgz#cd0935987876ba2900df2f58339f6d92305acc7a" integrity sha512-EsTAnj9fLVr/GZleBLFbj/sSuXeWmp1eXIN60ceYnZveqEaUCyW4X+Vh4WTdUhCkW4xutXYqTXCUSyqD4rB75w== @@ -6287,6 +6477,17 @@ fast-fifo@^1.2.0, fast-fifo@^1.3.2: resolved "https://registry.yarnpkg.com/fast-fifo/-/fast-fifo-1.3.2.tgz#286e31de96eb96d38a97899815740ba2a4f3640c" integrity sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ== +fast-glob@3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.1.tgz#784b4e897340f3dbbef17413b3f11acf03c874c4" + integrity sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg== + 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" + fast-glob@^3.2.5, fast-glob@^3.2.9, fast-glob@^3.3.0, fast-glob@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" @@ -6589,18 +6790,6 @@ glob-parent@^6.0.2: dependencies: is-glob "^4.0.3" -glob@7.1.7: - version "7.1.7" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" - integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - glob@^10.3.10: version "10.4.5" resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956" @@ -6687,7 +6876,7 @@ gopd@^1.0.1: dependencies: get-intrinsic "^1.1.3" -graceful-fs@^4.1.11, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.9: +graceful-fs@^4.1.11, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.9: version "4.2.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== @@ -8099,7 +8288,7 @@ long@^5.2.0: resolved "https://registry.yarnpkg.com/long/-/long-5.2.3.tgz#a3ba97f3877cf1d778eccbcb048525ebb77499e1" integrity sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q== -loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: +loose-envify@^1.0.0, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== @@ -8330,28 +8519,28 @@ next-compose-plugins@^2.2.1: resolved "https://registry.yarnpkg.com/next-compose-plugins/-/next-compose-plugins-2.2.1.tgz#020fc53f275a7e719d62521bef4300fbb6fde5ab" integrity sha512-OjJ+fV15FXO2uQXQagLD4C0abYErBjyjE0I0FHpOEIB8upw0hg1ldFP6cqHTJBH1cZqy96OeR3u1dJ+Ez2D4Bg== -next@14.2.3: - version "14.2.3" - resolved "https://registry.yarnpkg.com/next/-/next-14.2.3.tgz#f117dd5d5f20c307e7b8e4f9c1c97d961008925d" - integrity sha512-dowFkFTR8v79NPJO4QsBUtxv0g9BrS/phluVpMAt2ku7H+cbcBJlopXjkWlwxrk/xGqMemr7JkGPGemPrLLX7A== +next@15.0.3: + version "15.0.3" + resolved "https://registry.yarnpkg.com/next/-/next-15.0.3.tgz#804f5b772e7570ef1f088542a59860914d3288e9" + integrity sha512-ontCbCRKJUIoivAdGB34yCaOcPgYXr9AAkV/IwqFfWWTXEPUgLYkSkqBhIk9KK7gGmgjc64B+RdoeIDM13Irnw== dependencies: - "@next/env" "14.2.3" - "@swc/helpers" "0.5.5" + "@next/env" "15.0.3" + "@swc/counter" "0.1.3" + "@swc/helpers" "0.5.13" busboy "1.6.0" caniuse-lite "^1.0.30001579" - graceful-fs "^4.2.11" postcss "8.4.31" - styled-jsx "5.1.1" + styled-jsx "5.1.6" optionalDependencies: - "@next/swc-darwin-arm64" "14.2.3" - "@next/swc-darwin-x64" "14.2.3" - "@next/swc-linux-arm64-gnu" "14.2.3" - "@next/swc-linux-arm64-musl" "14.2.3" - "@next/swc-linux-x64-gnu" "14.2.3" - "@next/swc-linux-x64-musl" "14.2.3" - "@next/swc-win32-arm64-msvc" "14.2.3" - "@next/swc-win32-ia32-msvc" "14.2.3" - "@next/swc-win32-x64-msvc" "14.2.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" + sharp "^0.33.5" no-case@^3.0.4: version "3.0.4" @@ -9057,13 +9246,12 @@ rc@^1.2.7: minimist "^1.2.0" strip-json-comments "~2.0.1" -react-dom@^18.2.0: - version "18.3.1" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.3.1.tgz#c2265d79511b57d479b3dd3fdfa51536494c5cb4" - integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw== +react-dom@19.0.0-rc-66855b96-20241106: + version "19.0.0-rc-66855b96-20241106" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-19.0.0-rc-66855b96-20241106.tgz#beba73decfd1b9365a3c83673a298623b15acb0b" + integrity sha512-D25vdaytZ1wFIRiwNU98NPQ/upS2P8Co4/oNoa02PzHbh8deWdepjm5qwZM/46OdSiGv4WSWwxP55RO9obqJEQ== dependencies: - loose-envify "^1.1.0" - scheduler "^0.23.2" + scheduler "0.25.0-rc-66855b96-20241106" react-hook-form@^7.51.1: version "7.53.1" @@ -9113,12 +9301,10 @@ react-style-singleton@^2.2.1: invariant "^2.2.4" tslib "^2.0.0" -react@^18.2.0: - version "18.3.1" - resolved "https://registry.yarnpkg.com/react/-/react-18.3.1.tgz#49ab892009c53933625bd16b2533fc754cab2891" - integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ== - dependencies: - loose-envify "^1.1.0" +react@19.0.0-rc-66855b96-20241106: + version "19.0.0-rc-66855b96-20241106" + resolved "https://registry.yarnpkg.com/react/-/react-19.0.0-rc-66855b96-20241106.tgz#f04d7283454a32bdd8e9757db4308b75b9739e56" + integrity sha512-klH7xkT71SxRCx4hb1hly5FJB21Hz0ACyxbXYAECEqssUjtJeFUAaI2U1DgJAzkGEnvEm3DkxuBchMC/9K4ipg== read-cache@^1.0.0: version "1.0.0" @@ -9505,12 +9691,10 @@ saxes@^6.0.0: dependencies: xmlchars "^2.2.0" -scheduler@^0.23.2: - version "0.23.2" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.2.tgz#414ba64a3b282892e944cf2108ecc078d115cdc3" - integrity sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ== - dependencies: - loose-envify "^1.1.0" +scheduler@0.25.0-rc-66855b96-20241106: + version "0.25.0-rc-66855b96-20241106" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.25.0-rc-66855b96-20241106.tgz#8bbb728eca4de5a5deca1f18370fbce41aee91d1" + integrity sha512-HQXp/Mnp/MMRSXMQF7urNFla+gmtXW/Gr1KliuR0iboTit4KvZRY8KYaq5ccCTAOJiUqQh2rE2F3wgUekmgdlA== schema-dts@^1.1.2: version "1.1.2" @@ -9607,6 +9791,35 @@ sharp@0.32.6: tar-fs "^3.0.4" tunnel-agent "^0.6.0" +sharp@^0.33.5: + version "0.33.5" + resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.33.5.tgz#13e0e4130cc309d6a9497596715240b2ec0c594e" + integrity sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw== + dependencies: + color "^4.2.3" + detect-libc "^2.0.3" + semver "^7.6.3" + optionalDependencies: + "@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" + shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" @@ -10017,10 +10230,10 @@ strip-json-comments@~2.0.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== -styled-jsx@5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-5.1.1.tgz#839a1c3aaacc4e735fed0781b8619ea5d0009d1f" - integrity sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw== +styled-jsx@5.1.6: + version "5.1.6" + resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-5.1.6.tgz#83b90c077e6c6a80f7f5e8781d0f311b2fe41499" + integrity sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA== dependencies: client-only "0.0.1"