diff --git a/README.md b/README.md index 26d20b90..5ace2c0c 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,8 @@ ###### -GitHub Workflow Status npm GitHub +GitHub Workflow Status npm npm bundle size GitHub + # Next Cloudinary diff --git a/docs/components/CodeBlock/CodeBlock.js b/docs/components/CodeBlock/CodeBlock.js index d982ca61..cd7b1d2d 100644 --- a/docs/components/CodeBlock/CodeBlock.js +++ b/docs/components/CodeBlock/CodeBlock.js @@ -1,13 +1,15 @@ import { useState } from 'react'; import { BsArrowsExpand, BsArrowsCollapse } from 'react-icons/bs' +import { cn } from '../../lib/utils'; + import styles from './CodeBlock.module.scss'; -export const CodeBlock = ({ children }) => { +export const CodeBlock = ({ children, className }) => { const [expanded, setExpanded] = useState(false); return ( -
+
{ children }
diff --git a/docs/components/CodeBlock/CodeBlock.module.scss b/docs/components/CodeBlock/CodeBlock.module.scss index eea12f4d..33f9cd5d 100644 --- a/docs/components/CodeBlock/CodeBlock.module.scss +++ b/docs/components/CodeBlock/CodeBlock.module.scss @@ -1,6 +1,5 @@ .codeBlock { position: relative; - margin: 1.5em 0; } .codeBlockCode { diff --git a/docs/components/ExamplesCldOgImage/ExamplesCldOgImage.js b/docs/components/ExamplesCldOgImage/ExamplesCldOgImage.js new file mode 100644 index 00000000..93cc0fae --- /dev/null +++ b/docs/components/ExamplesCldOgImage/ExamplesCldOgImage.js @@ -0,0 +1,23 @@ +import { CldImage } from '../../../next-cloudinary/dist'; +import { OG_IMAGE_WIDTH, OG_IMAGE_HEIGHT } from '../../../next-cloudinary/src/constants/sizes'; + +const ExamplesCldOgImage = ({ ...props }) => { + return ( + + ) +} + +export default ExamplesCldOgImage; \ No newline at end of file diff --git a/docs/components/ExamplesCldOgImage/index.js b/docs/components/ExamplesCldOgImage/index.js new file mode 100644 index 00000000..480e0502 --- /dev/null +++ b/docs/components/ExamplesCldOgImage/index.js @@ -0,0 +1 @@ +export { default } from './ExamplesCldOgImage'; \ No newline at end of file diff --git a/docs/lib/utils.js b/docs/lib/utils.js new file mode 100644 index 00000000..8074f5a1 --- /dev/null +++ b/docs/lib/utils.js @@ -0,0 +1,7 @@ +import {clsx } from "clsx" +import { twMerge } from "tailwind-merge" + +export function cn(...inputs) { + return twMerge(clsx(inputs)) +} + diff --git a/docs/package.json b/docs/package.json index e271c559..9151078c 100644 --- a/docs/package.json +++ b/docs/package.json @@ -11,20 +11,22 @@ "dependencies": { "@cloudinary-util/url-loader": "4.2.0", "@cloudinary-util/util": "^3.0.0", - "@vercel/analytics": "^1.0.1", - "cloudinary": "^1.37.3", - "next": "^14.0.0", + "@vercel/analytics": "^1.2.2", + "cloudinary": "^2.0.1", + "clsx": "^2.1.0", + "next": "^14.1.0", "nextjs-google-analytics": "^2.3.3", - "nextra": "^2.13.2", - "nextra-theme-docs": "^2.13.2", + "nextra": "^2.13.3", + "nextra-theme-docs": "^2.13.3", "react": "^18.2.0", "react-dom": "^18.2.0", - "react-icons": "^4.11.0", - "sass": "^1.63.6" + "react-icons": "^5.0.1", + "sass": "^1.71.1", + "tailwind-merge": "^2.2.1" }, "devDependencies": { - "autoprefixer": "^10.4.16", - "postcss": "^8.4.31", - "tailwindcss": "^3.3.5" + "autoprefixer": "^10.4.17", + "postcss": "^8.4.35", + "tailwindcss": "^3.4.1" } } diff --git a/docs/pages/_meta.json b/docs/pages/_meta.json index 9826b47d..9405dcc3 100644 --- a/docs/pages/_meta.json +++ b/docs/pages/_meta.json @@ -18,6 +18,12 @@ "breadcrumb": false } }, + "changelog": { + "title": "Changelog", + "theme": { + "breadcrumb": false + } + }, "Components": { "type": "separator", "title": "Components" diff --git a/docs/pages/changelog.mdx b/docs/pages/changelog.mdx new file mode 100644 index 00000000..546ea90d --- /dev/null +++ b/docs/pages/changelog.mdx @@ -0,0 +1,59 @@ +import Head from 'next/head'; +import { Callout, Steps, Tab, Tabs } from 'nextra-theme-docs'; + + +import OgImage from '../components/OgImage'; + +import { CldImage } from '../../next-cloudinary'; +import { OG_IMAGE_WIDTH, OG_IMAGE_HEIGHT } from '../../next-cloudinary/src/constants/sizes'; + + + Installation - Next Cloudinary + + + + + + +# Changelog + +## v6.0.0 + +### Overview + +### Changes + +* Migrates project to pnpm ([#419](https://github.com/cloudinary-community/next-cloudinary/pull/419)) + +**CldImage, getCldImageUrl, CldOgImage, getCldOgImageUrl** + + +This is a fundamental change in how the API works + + +* Removes default 2-stage resizing to avoid low resolution images for larger source images ([#431](https://github.com/cloudinary-community/next-cloudinary/pull/431)) + * Learn more about [cropping](/cldimage/configuration#crop) + * Learn more about [responsive images](/guides/responsive-images) + * See the RFC with more details behind the change: https://github.com/cloudinary-community/next-cloudinary/discussions/432 + +**CldImage** +* Deprecates `transformations` in favor of `namedTransformations` + +**getCldImageUrl** +* Removes types GetCldImageUrl and GetCldOgImageUrl + +**CldUploadWidget** +* Add Content-Type to CldUploadWidget signature endpoint ([#379](https://github.com/cloudinary-community/next-cloudinary/issues/379)) +* Deprecates some CldUploadWidget types in favor of natively defined types from [@cloudinary-util/types](https://github.com/colbyfayock/cloudinary-util/tree/main/packages/types) + * CldUploadWidgetInfo, CldUploadWidgetPropsOptions, CldUploadWidgetResults +* Updates onError and onClose callbacks to have a consistent API with the rest of the callbacks ([#424](https://github.com/cloudinary-community/next-cloudinary/pull/424)) +* Deprecates onUpload in favor of onSuccess, matching the native Cloudinary Upload Widget API ([#424](https://github.com/cloudinary-community/next-cloudinary/pull/424)) + +**CldVideoPlayer** +* Removes autoPlay in favor of autoplay +* Video Player: CldVideoPlayerPropsColors +* Deprecates some CldVideoPlayer types in favor of natively defined types from [@cloudinary-util/types](https://github.com/colbyfayock/cloudinary-util/tree/main/packages/types) + * CldVideoPlayerPropsColors diff --git a/docs/pages/cldimage/basic-usage.mdx b/docs/pages/cldimage/basic-usage.mdx index e069abab..31baba95 100644 --- a/docs/pages/cldimage/basic-usage.mdx +++ b/docs/pages/cldimage/basic-usage.mdx @@ -77,7 +77,7 @@ You can further take advantage of Cloudinary features like background removal an src={`${process.env.IMAGES_DIRECTORY}/turtle`} crop="fill" removeBackground - tint="70:blue:green:purple" + tint="70:blue:purple" underlay={`${process.env.IMAGES_DIRECTORY}/galaxy`} sizes="100vw" alt="Turtle in the ocean" @@ -94,7 +94,7 @@ You can further take advantage of Cloudinary features like background removal an src="" crop="fill" removeBackground - tint="70:blue:green:purple" + tint="70:blue:purple" underlay="" sizes="100vw" alt="Description of my image" @@ -112,7 +112,7 @@ must include a version number (/v1234) in order to be correctly parsed. to ensure the integretiy when during the parsing process. - + ```jsx copy showLineNumbers import { CldImage } from 'next-cloudinary'; diff --git a/docs/pages/cldimage/configuration.mdx b/docs/pages/cldimage/configuration.mdx index 17fcb6f0..0fe0b088 100644 --- a/docs/pages/cldimage/configuration.mdx +++ b/docs/pages/cldimage/configuration.mdx @@ -135,9 +135,9 @@ right inside of Next.js. { prop: 'crop', - type: 'string', + type: 'string | object', default: () => (limit), - example: () => (thumb), + example: () => (fill), more: () => (More Info) }, { @@ -222,12 +222,106 @@ background="blue" Changes the size of the delivered asset according to the requested width & height dimensions. +The `crop` prop can either be a string, which can accept any [valid Cloudinary crop mode](https://cloudinary.com/documentation/transformation_reference#c_crop_resize), +or it can accept an object or an array of objects which can take the following options: + + (16:9), + }, + { + prop: 'gravity', + type: 'string', + example: () => (See Gravity), + }, + { + prop: 'height', + type: 'string', + example: () => (See Height), + }, + { + prop: 'source', + type: 'boolean', + example: () => (true), + }, + { + prop: 'type (crop mode)', + type: 'string', + example: () => (fill), + }, + { + prop: 'width', + type: 'string', + example: () => (See Width), + }, + { + prop: 'zoom', + type: 'string', + example: () => (See Zoom), + }, + ]} +/> + +**Dynamic Crop Modes** + +When using a dynamic crop mode, such as `thumb`, the resulting image may +be visually different based on the given dimensions. For instance, an +image cropped using the `thumb` crop mode with dimensions 600x600 will +give different results than 1200x1200 (assuming a gravity of auto or similar, +which is the default for CldImage). + +This is especially important in the context of [Responsive Images](/guides/responsive-images) +where due to the resize mechanism, different device sizes may result +in different looking images, which doesn't provide a great experience. + +To resolve this, when using dynamic crop modes you may want to opt into +a two-stage crop, first cropping the original source image, then allowing +the the resize mechanism to handle resizing that to the appropriate device +size. See examples below. + + + Versions 5 and below of Next Cloudinary automatically opted CldImage in + to a two-stage cropping to help improve the experience, but it came with + drawbacks including prematurely limiting the potential resulting size + of an image. [Learn more](https://github.com/cloudinary-community/next-cloudinary/discussions/432). + + **Examples** +Cropping an image and filling the containing space: + ```jsx copy crop="fill" ``` +Using a crop of `thumb` on the original source image: + +```jsx copy +crop={{ + width: 1200, + height: 1200, + type: 'thumb', + source: true +}} +``` + [Learn more about the crop transformation](https://cloudinary.com/documentation/transformation_reference#c_crop_resize) on the Cloudinary docs. ### `fillBackground` diff --git a/docs/pages/cldimage/examples.mdx b/docs/pages/cldimage/examples.mdx index 24e04082..70234f81 100644 --- a/docs/pages/cldimage/examples.mdx +++ b/docs/pages/cldimage/examples.mdx @@ -140,7 +140,7 @@ position the subject in the center of the resulting image. height="300" src={`${process.env.IMAGES_DIRECTORY}/woman-headphones`} sizes="100vw" - crop="thumb" + crop="fill" alt="" /> @@ -154,12 +154,61 @@ position the subject in the center of the resulting image. height="300" src="" sizes="100vw" - crop="thumb" + crop="fill" alt="" /> ``` +Cloudinary additionally supports dynamic crop modes like `thumb` that +may provide a different result based on the given width and height. To +help provide more options for controlling cropping images, you can specify +and object or array of objects. + +For instance, to crop the original source image, which will then later +resize it to the initial width and height, you can use: + + + + + + + + ```jsx copy showLineNumbers + import { CldImage } from 'next-cloudinary'; + + + ``` + + +Which will provide a consistent crop for all rendered sizes. + +Learn more about [cropping](/cldimage/configuration#crop) and [responsive images](/guides/responsive-images). + #### Fill Parent `fill`: a [Next Image feature](https://nextjs.org/docs/pages/api-reference/components/image#fill) that @@ -677,10 +726,11 @@ that applies a blend mode, such as "multiply" { crop: 'fill', gravity: 'auto', - width: 960, - height: 600 + width: '1.0', + height: '1.0', } ], + flags: ['relative'], appliedEffects: [ { multiply: true @@ -706,10 +756,11 @@ that applies a blend mode, such as "multiply" { crop: 'fill', gravity: 'auto', - width: 960, - height: 600 + width: '1.0', + height: '1.0', } ], + flags: ['relative'], appliedEffects: [ { multiply: true @@ -771,21 +822,23 @@ Image underlays allow you to place one or multiple images behind a base image. underlays={[ { publicId: 'images/galaxy', - width: 480, - height: 600, + width: '0.5', + height: '1.0', crop: 'fill', position: { gravity: 'north_west' - } + }, + flags: ['relative'] }, { publicId: 'images/mountain', - width: 480, - height: 600, + width: '0.5', + height: '1.0', crop: 'fill', position: { gravity: 'south_east' - } + }, + flags: ['relative'] }, ]} alt="" @@ -804,22 +857,24 @@ Image underlays allow you to place one or multiple images behind a base image. removeBackground underlays={[ { - publicId: '', - width: 480, - height: 600, + publicId: 'images/galaxy', + width: '0.5', + height: '1.0', crop: 'fill', position: { gravity: 'north_west' - } + }, + flags: ['relative'] }, { - publicId: '', - width: 480, - height: 600, + publicId: 'images/mountain', + width: '0.5', + height: '1.0', crop: 'fill', position: { gravity: 'south_east' - } + }, + flags: ['relative'] }, ]} alt="" @@ -832,40 +887,6 @@ Image underlays allow you to place one or multiple images behind a base image. Text overlays allow you to place text on top of an image. -### Adding Text - -`text`: Adds text to an image with default settings - - - - - - - ```jsx copy showLineNumbers - import { CldImage } from 'next-cloudinary'; - - - ``` - - ### Adding Custom Text `overlays`: Uses overlay objects to add text on top of an image. @@ -877,8 +898,6 @@ Text overlays allow you to place text on top of an image. src={`${process.env.IMAGES_DIRECTORY}/sneakers`} sizes="100vw" overlays={[{ - width: 2670 - 20, - crop: 'fit', position: { x: 140, y: 140, @@ -888,11 +907,11 @@ Text overlays allow you to place text on top of an image. text: { color: 'blueviolet', fontFamily: 'Source Sans Pro', - fontSize: 160, + fontSize: 280, fontWeight: 'bold', textDecoration: 'underline', letterSpacing: 14, - text: 'Cool Beans' + text: 'With Style' } }]} alt="" @@ -909,8 +928,6 @@ Text overlays allow you to place text on top of an image. src="" sizes="100vw" overlays={[{ - width: 2670 - 20, - crop: 'fit', position: { x: 140, y: 140, @@ -920,7 +937,7 @@ Text overlays allow you to place text on top of an image. text: { color: 'blueviolet', fontFamily: 'Source Sans Pro', - fontSize: 160, + fontSize: 280, fontWeight: 'bold', textDecoration: 'underline', letterSpacing: 14, @@ -946,9 +963,9 @@ Text overlays allow you to place text on top of an image. text: { color: 'white', fontFamily: 'Source Sans Pro', - fontSize: 160, + fontSize: 500, fontWeight: 'bold', - text: 'Cool Beans' + text: 'Into the Galaxy' }, effects: [ { @@ -974,9 +991,9 @@ Text overlays allow you to place text on top of an image. text: { color: 'white', fontFamily: 'Source Sans Pro', - fontSize: 160, + fontSize: 500, fontWeight: 'bold', - text: 'Cool Beans' + text: 'Into the Galaxy' }, effects: [ { diff --git a/docs/pages/cldogimage/basic-usage.mdx b/docs/pages/cldogimage/basic-usage.mdx index 4cb7b3f8..adb6d88f 100644 --- a/docs/pages/cldogimage/basic-usage.mdx +++ b/docs/pages/cldogimage/basic-usage.mdx @@ -1,10 +1,11 @@ import Head from 'next/head'; import { Callout } from 'nextra-theme-docs'; -import { CldImage } from '../../../next-cloudinary'; - import OgImage from '../../components/OgImage'; import Video from '../../components/Video'; +import HeaderImage from '../../components/HeaderImage'; +import CodeBlock from '../../components/CodeBlock'; +import ExamplesCldOgImage from '../../components/ExamplesCldOgImage'; CldOgImage - Next Cloudinary @@ -29,13 +30,24 @@ The CldOgImageComponent give you the ability to use the same CldImage API to eas The basic required prop is `src`: -```jsx copy -import { CldOgImage } from 'next-cloudinary'; + + + - -``` +> CldOgImage does not render an `` tag, meaning it can't be visually embedded on a page. The following examples make use of the `` tag to showcase what's possible. + + + ```jsx copy showLineNumbers + import { CldOgImage } from 'next-cloudinary'; + + + ``` + Place the CldOgImage component anywhere outside of the Head component. @@ -46,31 +58,15 @@ Place the CldOgImage component anywhere outside of the Head component. The resulting HTML will be applied to the Head of the document including all applicable [open graph tags](https://ogp.me/): ```html copy - - + + - + - + ``` -
-

- -

-
- - - CldOgImage does not render an `` tag, meaning it can't be visually embedded on a page. This example makes use of the `` tag to showcase what's possible. - ## Transformations @@ -78,34 +74,10 @@ You can further take advantage of Cloudinary features like background removal an The CldOgImage component uses the same API as [CldImage](/cldimage/configuration), meaning you can use the same transformations and effects. -```jsx copy -' - } - }]} - underlay="" - alt="" - twitterTitle="" -/> -``` -<div style={{ maxWidth: 500, margin: '0 auto' }}> - <p className="nx-mt-6"> - <CldImage - width="1200" - height="627" +<HeaderImage> + <ExamplesCldOgImage src={`${process.env.IMAGES_DIRECTORY}/turtle`} - crop="fill" tint="100:0762a0" removeBackground opacity="40" @@ -119,15 +91,36 @@ The CldOgImage component uses the same API as [CldImage](/cldimage/configuration } }]} underlay={`${process.env.IMAGES_DIRECTORY}/galaxy`} - sizes="100vw" alt="Turtle in the ocean" /> - </p> -</div> +</HeaderImage> -<Callout emoji={false}> - CldOgImage does not render an `<img>` tag, meaning it can't be visually embedded on a page. This example makes use of the `<CldImage>` tag to showcase what's possible. -</Callout> +> CldOgImage does not render an `<img>` tag, meaning it can't be visually embedded on a page. The following examples make use of the `<CldImage>` tag to showcase what's possible. + +<CodeBlock className="mt-6"> + ```jsx copy showLineNumbers + import { CldImage } from 'next-cloudinary'; + + <CldOgImage + src="<Public ID>" + tint="100:0762a0" + removeBackground + opacity="40" + overlays={[{ + text: { + color: 'white', + fontFamily: 'Source Sans Pro', + fontSize: 80, + fontWeight: 'bold', + text: '<Text>' + } + }]} + underlay="<Public ID>" + alt="<Description>" + twitterTitle="<Title>" + /> + ``` +</CodeBlock> ## Watch & Learn diff --git a/docs/pages/cldogimage/examples.mdx b/docs/pages/cldogimage/examples.mdx index bb589365..00017a7a 100644 --- a/docs/pages/cldogimage/examples.mdx +++ b/docs/pages/cldogimage/examples.mdx @@ -1,11 +1,10 @@ import Head from 'next/head'; import { Callout } from 'nextra-theme-docs'; -import { CldImage } from '../../../next-cloudinary'; -import { OG_IMAGE_WIDTH, OG_IMAGE_HEIGHT } from '../../../next-cloudinary/src/constants/sizes'; - import OgImage from '../../components/OgImage'; -import ImageGrid from '../../components/ImageGrid'; +import HeaderImage from '../../components/HeaderImage'; +import CodeBlock from '../../components/CodeBlock'; +import ExamplesCldOgImage from '../../components/ExamplesCldOgImage'; <Head> <title>CldOgImage Examples - Next Cloudinary @@ -20,57 +19,37 @@ import ImageGrid from '../../components/ImageGrid'; # CldOgImage Examples - - CldOgImage does not render an `` tag, meaning it can't be visually embedded on a page. The following examples make use of the `` tag to showcase what's possible. - - -## Effects - - -
  • - - - ### Text over a white background - - ```jsx copy - text="Next Cloudinary" - ``` -
  • -
  • - - - ### Background removal with custom background - - ```jsx copy +> CldOgImage does not render an `` tag, meaning it can't be visually embedded on a page. The following examples make use of the `` tag to showcase what's possible. + +## Basic Image + +`src`: Specifies a public ID to use as the image + + + + + + + ```jsx copy showLineNumbers + import { CldImage } from 'next-cloudinary'; + + + ``` + + +## Background Removal + +#### Image Background + +`underlay`: Specifies a public ID to use as an underlaying image. + + + - + /> + + + ```jsx copy showLineNumbers + import { CldImage } from 'next-cloudinary'; + + ``` + + +## Text Overlays + +Text overlays allow you to place text on top of an image. + +### Adding Custom Text + +`overlays`: Uses overlay objects to add text on top of an image. + + + + + + ```jsx copy showLineNumbers + import { CldImage } from 'next-cloudinary'; + + ``` + \ No newline at end of file diff --git a/docs/pages/getcldimageurl/basic-usage.mdx b/docs/pages/getcldimageurl/basic-usage.mdx index f7f8b403..a8e859c5 100644 --- a/docs/pages/getcldimageurl/basic-usage.mdx +++ b/docs/pages/getcldimageurl/basic-usage.mdx @@ -75,7 +75,12 @@ const url = getCldImageUrl({ src: `${process.env.IMAGES_DIRECTORY}/galaxy`, width: 600, height: 600, - crop: 'thumb', + crop: { + width: 600, + height: 600, + type: 'thumb', + source: true + }, tint: '50:blue:green:red', blur: 1000, })} diff --git a/docs/pages/getcldimageurl/configuration.mdx b/docs/pages/getcldimageurl/configuration.mdx index 66cf7d13..e9a1cd21 100644 --- a/docs/pages/getcldimageurl/configuration.mdx +++ b/docs/pages/getcldimageurl/configuration.mdx @@ -1,6 +1,8 @@ import Head from 'next/head'; +import { Callout } from 'nextra-theme-docs'; import OgImage from '../../components/OgImage'; +import Table from '../../components/Table'; getCldImageUrl Configuration - Next Cloudinary @@ -19,138 +21,1870 @@ Configuration for getCldImageUrl is the same as [CldImage](/cldimage/configurati The function takes two main arguments: options and config. -| Option Name | Type | Default | Example | -|--------------------|--------------------|------------|------------------------------| -| options | object | - | `{ src: 'myimage', ... }` | -| config | object | - | `{ cloud: { cloudName: 'name' } }` | +
  • ({`{ src: 'myimage', ... }`}), + }, + { + name: 'config', + type: 'object', + example: () => ({`{ cloud: { cloudName: 'name' } }`}), + more: () => (More Info) + }, + ]} +/> The function also accepts a third argument of `analytics` that's intended to be used configure analytics properties for usage statistics. -## General Options - -| Option Name | Type | Default | Example | -|--------------------|--------------------|------------|------------------------------| -| crop | string | `"limit"` | `"thumb"` | -| deliveryType | string | `"upload"` | `"fetch"` | -| dpr | number/string | - | `"2.0"` | -| effects | array | - | `[{ background: 'blue' }]` | -| format | string | `"auto"` | `"webp"` | -| fillBackground (Beta) | bool/object | - | `{{ gravity: 'east' }}` | -| gravity | string | `"auto"` | `"faces"` | -| height | number/string | - | `600` | -| overlays | array | - | See Below | -| preserveTransformations | string | `false` | `true` | -| quality | string | `"auto"` | `"90"` | -| rawTransformations | array | - | `['e_blur:2000']` | -| removeBackground | bool/string | `false` | `true` | -| sanitize | bool | `true` if svg | `true` (Applies only to SVG) | -| seoSuffix | string | - | `my-image-content` | -| src | string | - | `"my-public-id"` | -| text | string | - | `"Next Cloudinary"` | -| transformations | string/array | - | `['my-named-transformation']`| -| underlay | string | - | `"my-public-id"` | -| underlays | array | - | See Below | -| version | number | - | `1234` | -| width | number/string | - | `600` | -| zoom | string | - | `0.5` | -| zoompan | bool/string/object | - | See Below | - - -## Effect Options - -| Option Name | Type | Default | Example | -| ------------------ | ----------- | ------- | ---------------------------------------------------- | -| art | string | - |`"al_dente"` | -| autoBrightness | bool/string | - |`true`, `"80"` | -| autoColor | bool/string | - |`true`, `"80"` | -| autoContrast | bool/string | - |`true`, `"80"` | -| assistColorblind | bool/string | - |`true`, `"20"`, `"xray"` | -| background | string | - |`"blue"` | -| blackwhite | bool/string | - |`true`, `"40"` | -| blur | bool/string | - |`true`, `"800"` | -| blurFaces | bool/string | - |`true`, `"800"` | -| blurRegion | bool/string | - |`true`, `"1000,h_425,w_550,x_600,y_400"` | -| border | string | - |`"5px_solid_purple"` | -| brightness | bool/string | - |`true`, `"100"` | -| brightnessHSB | bool/string | - |`true`, `"100"` | -| cartoonify | bool/string | - |`true`, `"70:80"` | -| color | string | - |`"blue"` | -| colorize | string | - |`"35,co_darkviolet"` | -| contrast | bool/string | - |`true`, `"100"`, `"level_-70"` | -| distort | string | - |`"150:340:1500:10:1500:1550:50:1000"`, `"arc:180.0"` | -| fillLight | bool/string | - |`true`, `"70:20"` | -| gamma | bool/string | - |`true`, `"100"` | -| gradientFade | bool/string | - |`true`, `"symmetric:10,x_0.2,y_0.4"` | -| grayscale | bool | - |`true` | -| improve | bool/string | - |`true`, `"50"`, `"indoor"` | -| multiply | bool | - |`true` | -| negate | bool | - |`true` | -| oilPaint | bool/string | - |`true`, `"40"` | -| opacity | number/string | - |`40`, `"40"` | -| outline | bool/string | - |`true`, `"40"`, `"outer:15:200"` | -| overlay | bool | - |`true` | -| pixelate | bool/string | - |`true`, `"20"` | -| pixelateFaces | bool/string | - |`true`, `"20"` | -| pixelateRegion | bool/string | - |`true`, `"35,h_425,w_550,x_600,y_400"` | -| redeye | bool/string | - |`true` | -| replaceColor | string | - |`"saddlebrown"`, `"2F4F4F:20"`, `"silver:55:89b8ed"` | -| saturation | bool/string | - |`true`, `"70"` | -| screen | bool | - |`true` | -| sepia | bool/string | - |`true`, `"50"` | -| shadow | bool/string | - |`true`, `"50,x_-15,y_15"` | -| sharpen | bool/string | - |`true`, `"100"` | -| shear | string | - |`"20.0:0.0"` | -| simulateColorblind | bool/string | - |`"deuteranopia"` | -| tint | bool/string | - |`true`, `"100:red:blue:yellow"` | -| unsharpMask | bool/string | - |`true`, `"500"` | -| vectorize | bool/string | - |`true`, `"3:0.5"` | -| vibrance | bool/string | - |`true`, `"70"` | -| vignette | bool/string | - |`true`, `"30"` | +## Basic Options + +The basic options available to use with getCldImageUrl include: + +
    (Yes, unless using Next Image fill), + example: () => (600), + more: () => (More Info) + }, + { + name: 'src', + type: 'string', + required: 'Yes', + example: () => (my-public-id) + }, + { + name: 'width', + type: 'number/string', + required: () => (Yes, unless using Next Image fill), + example: () => (600), + more: () => (More Info) + }, + ]} +/> + +## Basic Transformations + +The getCldImageUrl helper exposes many of Cloudinary's transformations in an easy-to-use way +right inside of Next.js. + +
    (blue, rgb:0000ff), + more: () => (More Info) + }, + + { + name: 'crop', + type: 'string | object', + default: () => (limit), + example: () => (fill), + more: () => (More Info) + }, + { + name: 'fillBackground (Beta)', + type: 'boolean | object', + default: '-', + example: () => ({`{{ gravity: 'east' }}`}), + more: () => (More Info) + }, + { + name: 'gravity', + type: 'string', + default: () => (auto), + example: () => (faces), + more: () => (More Info) + }, + { + name: 'recolor', + type: 'array | object', + default: '-', + example: () => ({`['duck', 'blue']`}), + more: () => (More Info) + }, + { + name: 'remove', + type: 'string | array | object', + default: '-', + example: () => ({`apple`}), + more: () => (More Info) + }, + { + name: 'removeBackground', + type: 'boolean | string', + default: () => (false), + example: () => (true), + more: () => (More Info) + }, + { + name: 'replace', + type: 'array | object', + default: '-', + example: () => ({`['apple', 'banana']`}), + more: () => (More Info) + }, + { + name: 'restore', + type: 'boolean', + default: '-', + example: () => ({`true`}), + more: () => (More Info) + }, + { + name: 'zoom', + type: 'string', + default: '-', + example: () => (0.5), + more: () => (More Info) + }, + { + name: 'zoompan', + type: 'boolean | string | object', + default: '-', + example: () => (true), + more: () => (More Info) + }, + ]} +/> + +### `background` + +Applies a background to empty or transparent areas. + +**Examples** + +```jsx copy +background: 'blue' +``` + +[Learn more about the background transformation](https://cloudinary.com/documentation/transformation_reference#b_background) on the Cloudinary docs. + +### `crop` + +Changes the size of the delivered asset according to the requested width & height dimensions. + +The `crop` prop can either be a string, which can accept any [valid Cloudinary crop mode](https://cloudinary.com/documentation/transformation_reference#c_crop_resize), +or it can accept an object or an array of objects which can take the following options: + +
    (16:9), + }, + { + name: 'gravity', + type: 'string', + example: () => (See Gravity), + }, + { + name: 'height', + type: 'string', + example: () => (See Height), + }, + { + name: 'source', + type: 'boolean', + example: () => (true), + }, + { + name: 'type (crop mode)', + type: 'string', + example: () => (fill), + }, + { + name: 'width', + type: 'string', + example: () => (See Width), + }, + { + name: 'zoom', + type: 'string', + example: () => (See Zoom), + }, + ]} +/> + +**Dynamic Crop Modes** + +When using a dynamic crop mode, such as `thumb`, the resulting image may +be visually different based on the given dimensions. For instance, an +image cropped using the `thumb` crop mode with dimensions 600x600 will +give different results than 1200x1200 (assuming a gravity of auto or similar, +which is the default for getCldImageUrl). + +This is especially important in the context of [Responsive Images](/guides/responsive-images) +where due to the resize mechanism, different device sizes may result +in different looking images, which doesn't provide a great experience. + +To resolve this, when using dynamic crop modes you may want to opt into +a two-stage crop, first cropping the original source image, then allowing +the the resize mechanism to handle resizing that to the appropriate device +size. See examples below. + + + Versions 5 and below of Next Cloudinary automatically opted getCldImageUrl in + to a two-stage cropping to help improve the experience, but it came with + drawbacks including prematurely limiting the potential resulting size + of an image. [Learn more](https://github.com/cloudinary-community/next-cloudinary/discussions/432). + + +**Examples** + +Cropping an image and filling the containing space: + +```jsx copy +crop: 'fill' +``` + +Using a crop of `thumb` on the original source image: + +```jsx copy +crop: { + width: 1200, + height: 1200, + type: 'thumb', + source: true +} +``` + +[Learn more about the crop transformation](https://cloudinary.com/documentation/transformation_reference#c_crop_resize) on the Cloudinary docs. + +### `fillBackground` + + + Generative Fill is currently in beta. + + +Automatically fills the padded area using generative AI to extend the image seamlessly. + +The `fillBackground` prop can either be a boolean, which will use a set of safe defaults to produce +a background, or an object, which can take the following options: + +
    (clpad), + }, + { + name: 'gravity', + type: 'string', + example: () => (south), + }, + { + name: 'prompt', + type: 'string', + example: () => (cupcakes), + }, + ]} +/> + +**Examples** + +Applying Generative Fill with defaults: + +```jsx copy +fillBackground: true +``` + +Customizing options: + +```jsx copy +fillBackground: { + crop: 'clpad', + gravity: 'south', + prompt: 'cupcakes' +} +``` + +[Learn more about the Generative Fill transformation](https://cloudinary.com/documentation/transformation_reference#b_gen_fill) on the Cloudinary docs. + +### `gravity` + +Determines which part of an asset to focus on, and thus which part of the asset to keep, when any part of the asset is cropped + +**Examples** + +```jsx copy +gravity: 'face' +``` + +[Learn more about gravity](https://cloudinary.com/documentation/transformation_reference#g_gravity) on the Cloudinary docs. + +### `recolor` + + + Generative Recolor is currently in beta. + + +Uses generative AI to recolor parts of your image, maintaining the relative shading. + +The `recolor` prop can either be an array with the objects to be replaced or an object +with the following options: + +
    (true), + }, + { + name: 'prompt', + type: 'string | array', + example: () => (duck or ['duck', 'horse']), + }, + { + name: 'to', + type: 'string', + example: () => (blue), + }, + ]} +/> + +**Examples** + +Recoloring an object with an array: + +```jsx copy +recolor: ['duck', 'blue'] +``` + +Or using the object format: + +```jsx copy +recolor: { + prompt: 'duck', + to: 'blue', + multiple; true +} +``` + +[Learn more about the Generative Recolor transformation](https://cloudinary.com/documentation/transformation_reference#e_gen_recolor) on the Cloudinary docs. + +### `remove` + + + Generative Remove is currently in beta. + + +Uses generative AI to remove unwanted parts of your image, replacing the area with realistic pixels. + +The `remove` prop can either be a string, an array, or an object with the following options: + +
    (true), + }, + { + name: 'prompt', + type: 'string | array', + example: () => (duck or ['duck', 'horse']), + }, + { + name: 'removeShadow', + type: 'boolean', + example: () => (true), + }, + { + name: 'region', + type: 'array', + example: () => ([300, 200, 1900, 3500]), + }, + ]} +/> + +**Examples** + +Removing an object by string: + +```jsx copy +remove: 'apple' +``` + +Removing multiple objects by array: + +```jsx copy +remove: ['apple', 'banana', 'orange'] +``` + +Removing multiple instances of an object and their shadow with object configuration: + +```jsx copy +remove: { + prompt: 'apple', + multiple: true, + removeShadow: true +} +``` + +Removing a region: + +```jsx copy +remove: { + region: [300, 200, 1900, 3500] +} +``` + +Removing multiple regions: + +```jsx copy +remove: { + region: [ + [300, 200, 1900, 3500], + [123, 321, 750, 500] + ] +} +``` + +[Learn more about the Generative Remove transformation](https://cloudinary.com/documentation/transformation_reference#e_gen_remove) on the Cloudinary docs. + +### `removeBackground` + +Uses the [Cloudinary AI Background Removal add-on](https://cloudinary.com/documentation/cloudinary_ai_background_removal_addon) to make the background of an image transparent. + + + The Cloudinary AI Background Removal add-on is required to use this feature. + + + +**Examples** + +```jsx copy +removeBackground: true +``` + +[Learn more about background removal transformation](https://cloudinary.com/documentation/transformation_reference#e_background_removal) on the Cloudinary docs. + + +### `replace` + + + Generative Replace is currently in beta. + + +Uses generative AI to replace parts of your image with something else. + +The `replace` prop can either be an array with the objects to be replaced or an object +with the following options: + +
    (apple), + }, + { + name: 'to', + type: 'string', + example: () => (banana), + }, + { + name: 'preserveGeometry', + type: 'boolean', + example: () => (true), + }, + ]} +/> + +**Examples** + +Replacing an object with an array: + +```jsx copy +replace: ['apple', 'banana'] +``` + +Or using the object format: + +```jsx copy +replace: { + from: 'apple', + to: 'banana', + preserveGeometry; true +} +``` + +[Learn more about the Generative Replace transformation](https://cloudinary.com/documentation/transformation_reference#e_gen_replace) on the Cloudinary docs. + +### `restore` + + + Generative Restore is currently in beta. + + +Uses generative AI to restore details in poor quality images or images that may have become degraded through repeated processing and compression. + +The `restore` prop can be used as a boolean. + +**Examples** + +```jsx copy +restore: true +``` + +[Learn more about the Generative Restore transformation](https://cloudinary.com/documentation/transformation_reference#e_gen_restore) on the Cloudinary docs. + + +### `zoom` + +Controls how close to crop to the detected coordinates when using face-detection, custom-coordinate, or object-specific gravity. + +**Examples** + +```jsx copy +zoom: '0.75' +``` + +[Learn more about the zoom transformation](https://cloudinary.com/documentation/transformation_reference#z_zoom) on the Cloudinary docs. + +### `zoompan` + +Also known as the Ken Burns effect, this transformation applies zooming and/or panning to an image, resulting in a video or animated GIF. + +`zoompan` can be applied with safe defaults as a boolean, a string, or an object for +advanced customization. + +As a string, you can pass in "loop" to automatically loop, or you can pass in raw configuration using the Cloudinary +Transformation syntax. + +As an object, you can use advanced configuration with the following options: + +
    (true), + }, + { + name: 'options', + type: 'boolean | string', + example: () => (mode_ztr;maxzoom_6.5;du_10), + }, + ]} +/> + +**Examples** + +With defaults: + +```jsx copy +zoompan: true +``` + +Add looping: + +```jsx copy +zoompan: 'loop' +``` + +Customize options: + +```jsx copy +zoompan: { + loop: 'loop:2', // Will loop twice + options: 'mode_ztr;maxzoom_6.5;du_10' +} +``` + +[Learn more about the zoompan transformation](https://cloudinary.com/documentation/transformation_reference#e_zoompan) on the Cloudinary docs. + + +## Filters & Effects + +Cloudinary supports a wide variety of effects and artistic filters that help +to easily change the appearance of an image. + +
    (al_dente), + more: () => (More Info) + }, + { + name: 'autoBrightness', + type: 'boolean | string', + default: '-', + example: () => (true, 80), + more: () => (More Info) + }, + { + name: 'autoColor', + type: 'boolean | string', + default: '-', + example: () => (true, 80), + more: () => (More Info) + }, + { + name: 'autoContrast', + type: 'boolean | string', + default: '-', + example: () => (true, 80), + more: () => (More Info) + }, + { + name: 'assistColorblind', + type: 'boolean | string', + default: '-', + example: () => (true, 20, xray), + more: () => (More Info) + }, + { + name: 'blackwhite', + type: 'boolean | string', + default: '-', + example: () => (true, 40), + more: () => (More Info) + }, + { + name: 'blur', + type: 'boolean | string', + default: '-', + example: () => (true, 800), + more: () => (More Info) + }, + { + name: 'blurFaces', + type: 'boolean | string', + default: '-', + example: () => (true, 800), + more: () => (More Info) + }, + { + name: 'blurRegion', + type: 'boolean | string', + default: '-', + example: () => (true, 1000,h_425,w_550,x_600,y_400), + more: () => (More Info) + }, + { + name: 'border', + type: 'string', + default: '-', + example: () => (5px_solid_purple) + }, + { + name: 'brightness', + type: 'boolean | string', + default: '-', + example: () => (true, 100), + more: () => (More Info) + }, + { + name: 'brightnessHSB', + type: 'boolean | string', + default: '-', + example: () => (true, 100), + more: () => (More Info) + }, + { + name: 'cartoonify', + type: 'boolean | string', + default: '-', + example: () => (true, 70:80), + more: () => (More Info) + }, + { + name: 'color', + type: 'string', + default: '-', + example: () => (blue), + }, + { + name: 'colorize', + type: 'string', + default: '-', + example: () => (35,co_darkviolet), + more: () => (More Info) + }, + { + name: 'contrast', + type: 'boolean | string', + default: '-', + example: () => (true, 100, level_-70), + more: () => (More Info) + }, + { + name: 'distort', + type: 'string', + default: '-', + example: () => (150:340:1500:10:1500:1550:50:1000, arc:180.0), + more: () => (More Info) + }, + { + name: 'fillLight', + type: 'boolean | string', + default: '-', + example: () => (true, 70:20), + more: () => (More Info) + }, + { + name: 'gamma', + type: 'boolean | string', + default: '-', + example: () => (true, 100), + more: () => (More Info) + }, + { + name: 'gradientFade', + type: 'boolean | string', + default: '-', + example: () => (true, symmetric:10,x_0.2,y_0.4), + more: () => (More Info) + }, + { + name: 'grayscale', + type: 'bool', + default: '-', + example: () => (true), + more: () => (More Info) + }, + { + name: 'improve', + type: 'boolean | string', + default: '-', + example: () => (true, 50, indoor), + more: () => (More Info) + }, + { + name: 'multiply', + type: 'bool', + default: '-', + example: () => (true), + more: () => (More Info) + }, + { + name: 'negate', + type: 'bool', + default: '-', + example: () => (true), + more: () => (More Info) + }, + { + name: 'oilPaint', + type: 'boolean | string', + default: '-', + example: () => (true, 40), + more: () => (More Info) + }, + { + name: 'opacity', + type: 'number/string', + default: '-', + example: () => (40), + more: () => (More Info) + }, + { + name: 'outline', + type: 'boolean | string', + default: '-', + example: () => (true, 40, outer:15:200), + more: () => (More Info) + }, + { + name: 'overlay', + type: 'bool', + default: '-', + example: () => (true), + more: () => (More Info) + }, + { + name: 'pixelate', + type: 'boolean | string', + default: '-', + example: () => (true, 20), + more: () => (More Info) + }, + { + name: 'pixelateFaces', + type: 'boolean | string', + default: '-', + example: () => (true, 20), + more: () => (More Info) + }, + { + name: 'pixelateRegion', + type: 'boolean | string', + default: '-', + example: () => (true, 35,h_425,w_550,x_600,y_400), + more: () => (More Info) + }, + { + name: 'redeye', + type: 'boolean | string', + default: '-', + example: () => (true), + more: () => (More Info) + }, + { + name: 'replaceColor', + type: 'string', + default: '-', + example: () => (saddlebrown, 2F4F4F:20, silver:55:89b8ed), + more: () => (More Info) + }, + { + name: 'sanitize', + type: 'bool', + default: () => (true if .svg), + example: () => (true - Only applies to .svg), + more: () => (More Info) + }, + { + name: 'saturation', + type: 'boolean | string', + default: '-', + example: () => (true, 70), + more: () => (More Info) + }, + { + name: 'screen', + type: 'bool', + default: '-', + example: () => (true), + more: () => (More Info) + }, + { + name: 'sepia', + type: 'boolean | string', + default: '-', + example: () => (true, 50), + more: () => (More Info) + }, + { + name: 'shadow', + type: 'boolean | string', + default: '-', + example: () => (true, 50,x_-15,y_15), + more: () => (More Info) + }, + { + name: 'sharpen', + type: 'boolean | string', + default: '-', + example: () => (true, 100), + more: () => (More Info) + }, + { + name: 'shear', + type: 'string', + default: '-', + example: () => (20.0:0.0), + more: () => (More Info) + }, + { + name: 'simulateColorblind', + type: 'boolean | string', + default: '-', + example: () => (deuteranopia), + more: () => (More Info) + }, + { + name: 'tint', + type: 'boolean | string', + default: '-', + example: () => (true, 100:red:blue:yellow), + more: () => (More Info) + }, + { + name: 'trim', + type: 'boolean | string', + default: '-', + example: () => (true, 50:yellow), + more: () => (More Info) + }, + { + name: 'unsharpMask', + type: 'boolean | string', + default: '-', + example: () => (true, 500), + more: () => (More Info) + }, + { + name: 'vectorize', + type: 'boolean | string', + default: '-', + example: () => (true, 3:0.5), + more: () => (More Info) + }, + { + name: 'vibrance', + type: 'boolean | string', + default: '-', + example: () => (true, 70), + more: () => (More Info) + }, + { + name: 'vignette', + type: 'boolean | string', + default: '-', + example: () => (true, 30), + more: () => (More Info) + } + ]} +/> + +**Examples** + +Make an image black and white: + +```jsx copy +blackwhite: true +``` + +Pixelate an image: + +```jsx copy +pixelate: true +``` + +Sharpen an image: + +```jsx copy +sharpen: 50 +``` [View the Cloudinary docs](https://cloudinary.com/documentation/transformation_reference#e_effect) to see learn more about using effects. -### Overlay Options - -The `overlays` prop is an array of objects with the following configuration options: - -| Property Name | Type | Example | -|------------------|---------------|--------------------------------------| -| appliedEffects | array | Same as effects, added as applied transformation | -| effects | array | See Below | -| position | object | See Below | -| publicId | string | `"thumb"` | -| text | object|string | `"Next Cloudinary"` or See Below | -| url | string | `"https://.../image.jpg"` | - -The position property can include: - -| Property Name | Type | Example | -| ------------- | ------ | -------------- | -| angle | number | `45` | -| gravity | string | '"north_west"' | -| x | number | `10` | -| y | number | `10` | - -Objects in the effects array can include everything in the effects options above as well as: - -| Property Name | Type | Example | -| ------------- | ------ | -------------- | -| aspectRatio | string | `"3.0"` | -| crop | string | `10` | -| gravity | string | '"north_west"' | -| height | number | '600' | -| width | number | '600' | - -The text property can include: - -| Property Name | Type | Example | -| -------------- | ------ | ------------------------------------------ | -| border | string | `"20px_solid_blue"` | -| color | string | `"blueviolet"` | -| fontFamily | string | `"Open Sans"` | -| fontSize | number | `48` | -| fontWeight | string | `"bold"` | -| letterSpacing | number | `"14"` | -| lineSpacing | number | `"14"` | -| stroke | bool | `true` in coordination with Border | -| textDecoration | string | `"underline"` | +## Overlays & Underlays + +Cloudinary gives you the ability to add layers above or below your primary asset using Overlays and Underlays. + +
    (Customizing Overlays & Underlays), + }, + { + name: 'text', + type: 'string', + default: '-', + example: () => (Next Cloudinary), + }, + { + name: 'underlay', + type: 'string', + default: '-', + example: () => (my-public-id), + }, + { + name: 'underlays', + type: 'array', + default: '-', + example: () => (Customizing Overlays & Underlays), + }, + ]} +/> + +### Customizing Overlays & Underlays + +> Note: The API for Underlays is similar to Overlays except they do not support text. + +
    (effects, added as applied transformation), + }, + { + name: 'effects', + type: 'array', + example: () => (effects), + }, + { + name: 'position', + type: 'object', + example: () => (position), + }, + { + name: 'publicId', + type: 'string', + example: () => (mypublicid), + }, + { + name: 'text', + type: 'object|string', + example: () => (Next Cloudinary or See text Below), + }, + { + name: 'url', + type: 'string', + example: () => (https://.../image.jpg), + }, + ]} +/> + +**Examples** + +Adding an overlay: + +```jsx copy +overlays: [{ + publicId: 'images/earth', + position: { + x: 50, + y: 50, + gravity: 'north_west', + }, + appliedEffects: [ + { + multiply: true + } + ] +}] +``` + +Adding an underlay: + +```jsx copy +underlays: [{ + publicId: 'images/earth', +}] +``` + +
    + + effects + + + Objects in the `effects` array can include everything in [Basic Transformations](##basic-transformations) and [Filters & Effects](#filters--effects) above as well as: +
    + +
    (3.0), + more: () => (More Info) + }, + + { + name: 'crop', + type: 'string', + example: () => (10), + more: () => (More Info) + }, + + { + name: 'gravity', + type: 'string', + example: () => (north_west), + more: () => (More Info) + }, + + { + name: 'height', + type: 'number', + example: () => (600), + more: () => (More Info) + }, + + { + name: 'width', + type: 'number', + example: () => (600), + more: () => (More Info) + }, + ]} +/> + +
    + + position + + + The `position` property can include: +
    + +
    (45), + more: () => (More Info) + }, + { + name: 'gravity', + type: 'string', + example: () => (north_west), + more: () => (More Info) + }, + { + name: 'x', + type: 'number', + example: () => (10), + more: () => (More Info) + }, + { + name: 'y', + type: 'number', + example: () => (10), + more: () => (More Info) + }, + ]} +/> + +
    + text + + The `text` property can include: +
    + +
    (20px_solid_blue), + more: () => (More Info) + }, + { + name: 'color', + type: 'string', + example: () => (blueviolet), + more: () => (More Info) + }, + { + name: 'fontFamily', + type: 'string', + example: () => (Open Sans), + more: () => (More Info) + }, + { + name: 'fontSize', + type: 'number', + example: () => (48), + more: () => (More Info) + }, + { + name: 'fontWeight', + type: 'string', + example: () => (bold), + more: () => (More Info) + }, + { + name: 'letterSpacing', + type: 'number', + example: () => (14), + more: () => (More Info) + }, + { + name: 'lineSpacing', + type: 'number', + example: () => (14), + more: () => (More Info) + }, + { + name: 'stroke', + type: 'bool', + example: () => (true in coordination with Border), + more: () => (More Info) + }, + { + name: 'textDecoration', + type: 'string', + example: () => (underline), + more: () => (More Info) + }, + ]} +/> + +## Advanced + +### Configuration & Delivery + +
    (image), + example: () => (video), + more: () => (More Info) + }, + { + name: 'config', + type: 'object', + default: '-', + example: () => ({`{ url: { secureDistribution: 'spacejelly.dev' } }`}), + more: () => (More Info) + }, + { + name: 'deliveryType', + type: 'string', + default: () => (upload), + example: () => (fetch), + more: () => (More Info) + }, + { + name: 'defaultImage', + type: 'string', + default: '-', + example: () => (myimage.jpg), + more: () => (More Info) + }, + { + name: 'flags', + type: 'array', + default: '-', + example: () => ({`['keep_iptc']`}), + more: () => (More Info) + }, + { + name: 'seoSuffix', + type: 'string', + default: '-', + example: () => (my-image-content), + more: () => (More Info) + }, + { + name: 'version', + type: 'number', + default: '-', + example: () => (1234), + more: () => (More Info) + }, + ]} +/> + +#### `assetType` + +Configures the asset type for the delivered resource. + +This defaults to an image for the getCldImageUrl helper. + +**Examples** + +Create an image thumbnail from a video asset: + +```jsx copy +assetType: 'video' +``` + +[Learn more about Asset Types](https://cloudinary.com/documentation/image_transformations#transformation_url_structure) on the Cloudinary docs. + + +#### `config` + +Allows configuration for the Cloudinary environment. + +**Examples** + +```jsx copy +config: { + cloud: { + cloudName: 'my-cloud' + } +} +``` + +[Learn more about configuration parameters](https://cloudinary.com/documentation/cloudinary_sdks#configuration_parameters) on the Cloudinary docs. + +#### `deliveryType` + +Controls the delivery type of the image. + +**Examples** + +```jsx copy +deliveryType: 'fetch' +``` + +[Learn more about Delivery Types](https://cloudinary.com/documentation/image_transformations#delivery_types) on the Cloudinary docs. + +#### `defaultImage` + +Configures the default image to use in case the given public ID is not available. + + + `defaultImage` must include a format / file extension. + + +**Examples** + +```jsx copy +defaultImage: 'myimage.jpg' +``` + +[Learn more about Default Images](https://cloudinary.com/documentation/transformation_reference#d_default_image) on the Cloudinary docs. + +#### `flags` + +Alters the regular behavior of another transformation or the overall delivery behavior. + + + The `keep_iptc` flag requires not including a quality of auto. Using `quality="default"` avoids setting the quality flag in the URL. + + +**Examples** + +```jsx copy +flags: ['keep_iptc'], +quality: 'default' +``` + +[Learn more about Flags](https://cloudinary.com/documentation/transformation_reference#fl_flag) on the Cloudinary docs. + +#### `seoSuffix` + +Adds a dynamic, descriptive suffix to the Public ID for greater SEO control of image URLs. + +**Examples** + +```jsx copy +seoSuffix: 'jellyfish-in-space' +``` + +[Learn more about Dynamic SEO Suffixes](https://cloudinary.com/documentation/advanced_url_delivery_options#dynamic_seo_suffixes) on the Cloudinary docs. + +#### `version` + +Controls the version defined in the delivery URL. + +**Examples** + +```jsx copy +version: '1234' +``` + +[Learn more about Asset Versions](https://cloudinary.com/documentation/advanced_url_delivery_options#asset_versions) on the Cloudinary docs. + +### Managing Transformations + +Most transformations and effects are exposed as top-level props to enable you to easily +apply what you need, but you can also use the following props for more advanced and +organized ways of applying transformations and effects. + +
    ({`[{ background: 'blue' }]`}) + }, + { + name: 'namedTransformations', + type: 'string | array', + default: '-', + example: () => ({`['my-named-transformation']`}), + more: () => (More Info) + }, + { + name: 'preserveTransformations', + type: 'string', + default: () => (false), + example: () => (true) + }, + { + name: 'rawTransformations', + type: 'array', + default: '-', + example: () => ({`['e_blur:2000']`}), + }, + { + name: 'strictTransformations', + type: 'boolean', + default: '-', + example: () => (Strict Transformations), + more: () => (More Info) + }, + { + name: 'transformations (deprecated)', + type: 'string | array', + default: '-', + example: () => ({`['my-named-transformation']`}), + more: () => (More Info) + }, + ]} +/> + +#### `effects` + +Applies a chain of transformation sets to an image. + +**Examples** + +```jsx copy +effects: [ + { + width: 100, + height: 100, + crop: 'fill' + }, + { + opacity: 50 + } +] +``` + +#### `namedTransformations` + +Applies named transformations to the image. + +**Examples** + +```jsx copy +namedTransformations: ['my-transformation'] +``` + +[Learn more about Named Transformations](https://cloudinary.com/documentation/image_transformations#named_transformations) on the Cloudinary docs. + + +#### `preserveTransformations` + +Preserves transformations already applied to an image when passing in a Cloudinary URL +as the `src`. + +**Examples** + +```jsx copy +preserveTransformations: true +``` + +#### `rawTransformations` + +Provides the ability to pass in an array of "raw" Cloudinary transformations using the +[Transformation URL API](https://cloudinary.com/documentation/transformation_reference) + +**Examples** + +```jsx copy +rawTransformations: ['w_100', 'b_blue', 'f_auto'] +``` + +#### `strictTransformations` + +[Strict Transformations](https://cloudinary.com/documentation/control_access_to_media#strict_transformations) gives +you the ability to have more control over what transformations are permitted to be used from your Cloudinary account. + +By enabling Strict Transformations, you restrict the ability to generate transformations on-the-fly requiring explicit +approval through the Cloudinary dashboard. + +> Note: This disables [optimization](#optimization) and [responsive sizing](/guides/responsive-images) +only allowing [named transformations](#transformations) to be applied. The width and height are not applied to the URL, +but are still included on the image tag rendered to the DOM. + +**Examples** + +```jsx copy +strictTransformations: true, +transformations: ['my-transformation'] +``` + +[Learn more about Strict Transformations](https://cloudinary.com/documentation/control_access_to_media#strict_transformations) on the Cloudinary docs. + +#### `transformations` - Deprecated + +**Use namedTransformations instead** + +### Optimization + +By default, getCldImageUrl opts in any image to `f_auto` and `q_auto` which provide automatic +optimization through intelligent compression and by automatically delivering the most +efficient format based on the browser and device requesting the image. + +You can customize and manage these properties using the options below: + +
    (2.0), + more: () => (More Info) + }, + { + name: 'format', + type: 'string', + default: () => (auto), + example: () => (webp), + more: () => (More Info) + }, + { + name: 'quality', + type: 'string', + default: () => (auto), + example: () => (90), + more: () => (More Info) + }, + { + name: 'unoptimized', + type: 'boolean', + default: '-', + example: () => (Unoptimized Images), + more: () => (More Info) + }, + ]} +/> + +#### `dpr` + +Sets the device pixel ratio (DPR) for the delivered image or video using a specified value or automatically based on the requesting device. + +**Examples** + +```jsx copy +dpr: '2.0' +``` + +[Learn more about configuring DPR](https://cloudinary.com/documentation/transformation_reference#dpr_dpr) on the Cloudinary docs. + + +#### `format` + +Converts (if necessary) and delivers an asset in the specified format regardless of the file extension used in the delivery URL. + +**Examples** + +```jsx copy +format: 'png' +``` + +[Learn more about format](https://cloudinary.com/documentation/transformation_reference#f_format) on the Cloudinary docs. + + +#### `quality` + +Controls the quality of the delivered asset. Reducing the quality is a trade-off between visual quality and file size. + +**Examples** + +```jsx copy +quality: 10 +``` + +[Learn more about quality](https://cloudinary.com/documentation/transformation_reference#q_quality) on the Cloudinary docs. \ No newline at end of file diff --git a/docs/pages/getcldimageurl/examples.mdx b/docs/pages/getcldimageurl/examples.mdx index 780c29c7..4f23c8a4 100644 --- a/docs/pages/getcldimageurl/examples.mdx +++ b/docs/pages/getcldimageurl/examples.mdx @@ -5,7 +5,8 @@ import { CldImage } from '../../../next-cloudinary'; import { getCldImageUrl } from '../../../next-cloudinary'; import OgImage from '../../components/OgImage'; -import ImageGrid from '../../components/ImageGrid'; +import HeaderImage from '../../components/HeaderImage'; +import CodeBlock from '../../components/CodeBlock'; getCldImageUrl Examples - Next Cloudinary @@ -24,91 +25,154 @@ import ImageGrid from '../../components/ImageGrid'; The below examples use the CldImage component to render the images. This is not required, you can use the URL returned by getCldImageUrl in any way you like. - -
  • - - - ### Basic - - ```js copy - getCldImageUrl({ - src: 'images/turtle', - width: 960, +## Basic Transformations + +Cloudinary supports a wide variety of powerful transformations that allow you to +not only deliver, but easily edit and build new images on the fly. + +### Background Removal + +#### Remove Background + +`removeBackground`: Removes the background of the image using AI + + + + + + + ```jsx copy showLineNumbers + import { getCldImageUrl } from 'next-cloudinary'; + + getCldImageUrl({ + src: '', + width: 960, + height: 600, + removeBackground: true + }) + ``` + + + + The Cloudinary AI Background Removal add-on is required to use this feature. + + +### Cropping & Resizing + +#### Cropping + +`crop`: Specifies the mode to use when cropping an image based on the given dimensions. + +> Note: By default, CldImage uses a gravity of auto, meaning the crop will automatically +position the subject in the center of the resulting image. + + + + + + + ```jsx copy showLineNumbers + import { getCldImageUrl } from 'next-cloudinary'; + + getCldImageUrl({ + src: '', + width: 300, + height: 300, + crop: 'fill' + }) + ``` + + +Cloudinary additionally supports dynamic crop modes like `thumb` that +may provide a different result based on the given width and height. To +help provide more options for controlling cropping images, you can specify +and object or array of objects. + +For instance, to crop the original source image, which will then later +resize it to the initial width and height, you can use: + + + -
  • - - - ### Background Removal - - ```js copy - getCldImageUrl({ - src: 'images/turtle', - width: 960, + type: 'thumb', + source: true + }} + alt="" + /> + + + + ```jsx copy showLineNumbers + import { getCldImageUrl } from 'next-cloudinary'; + + getCldImageUrl({ + src: '', + width: 300, + height: 300, + crop: { + width: 600, height: 600, - removeBackground: true - }) - ``` - - - Background removal requires the Cloudinary AI Background Removal Add-On - -
  • -
  • - - - ### Generative Fill - - ```js copy - getCldImageUrl({ - src: 'images/woman-headphones', - width: 960, - height: 600, // Original 1440 - crop: 'pad', // Returns the given size with padding - fillBackground: true // Uses AI to extend image - }) - ``` - - - The generative fill transformation is currently in Beta. Learn more. - -
  • -
    \ No newline at end of file + type: 'thumb', + source: true + } + }) + ``` + + +Which will provide a consistent crop for all rendered sizes. + +Learn more about [cropping](/getcldimageurl/configuration#crop) and [responsive images](/guides/responsive-images). + +### Generative Fill + +`fillBackground`: Fills the background of an image using Generative AI + + + + + + + ```jsx copy showLineNumbers + import { getCldImageUrl } from 'next-cloudinary'; + + getCldImageUrl({ + src: '', + width: 960, + height: 600, + fillBackground: true, + crop: 'pad' + }) + ``` + + + + The generative fill transformation is currently in Beta. Learn more. + \ No newline at end of file diff --git a/docs/pages/getcldogimageurl/examples.mdx b/docs/pages/getcldogimageurl/examples.mdx index 209dea75..2b15f236 100644 --- a/docs/pages/getcldogimageurl/examples.mdx +++ b/docs/pages/getcldogimageurl/examples.mdx @@ -8,6 +8,7 @@ import { OG_IMAGE_WIDTH, OG_IMAGE_HEIGHT } from '../../../next-cloudinary/src/co import OgImage from '../../components/OgImage'; import HeaderImage from '../../components/HeaderImage'; import CodeBlock from '../../components/CodeBlock'; +import ExamplesCldOgImage from '../../components/ExamplesCldOgImage'; getCldOgImageUrl Examples - Next Cloudinary @@ -31,15 +32,8 @@ import CodeBlock from '../../components/CodeBlock'; `src`: The public ID of the image to use as a Social Card - @@ -73,17 +67,10 @@ import CodeBlock from '../../components/CodeBlock'; `underlay`: The public ID of the image to use as the new background. - @@ -121,16 +108,16 @@ import CodeBlock from '../../components/CodeBlock'; `text`: Adds basic text to the image - @@ -141,7 +128,14 @@ import CodeBlock from '../../components/CodeBlock'; const url = getCldOgImageUrl({ src: '', - text: 'Next Cloudinary' + overlays: [{ + text: { + fontFamily: 'Source Sans Pro', + fontSize: 120, + fontWeight: 'bold', + text: 'Next Cloudinary' + } + }] }) export const metadata: Metadata = { diff --git a/docs/pages/guides/responsive-images.mdx b/docs/pages/guides/responsive-images.mdx index d9ab3710..f5dbbc93 100644 --- a/docs/pages/guides/responsive-images.mdx +++ b/docs/pages/guides/responsive-images.mdx @@ -1,9 +1,12 @@ import Head from 'next/head'; - -import OgImage from '../../components/OgImage'; +import { Callout } from 'nextra-theme-docs'; import { CldImage } from '../../../next-cloudinary'; +import OgImage from '../../components/OgImage'; +import HeaderImage from '../../components/HeaderImage'; +import CodeBlock from '../../components/CodeBlock'; + Responsive Images - Next Cloudinary @@ -17,66 +20,265 @@ import { CldImage } from '../../../next-cloudinary'; # Responsive Images -The [CldImage](/cldimage/basic-usage) component takes advantage of responsive images generated using the [Next Image component](https://nextjs.org/docs/api-reference/next/image). +Responsive images are critical for page performance and they're made easy with +the [CldImage](/cldimage/basic-usage) component. + +The CldImage component takes advantage of responsive images generated using +the [Next Image component](https://nextjs.org/docs/api-reference/next/image) +which allows you to simply specify the sizes you want and the component +handles the rest. -Using the `sizes` prop, you can configure exactly the sizes you need for your application, such as a similar example to the Next.js docs: +Using the `sizes` prop, you can configure exactly the sizes you need for your +application, such as a similar example to the Next.js docs: -```jsx copy - + -Which would give you roughly full width images on mobile, a 2-column layout on tablets, and 3-column layout on desktop views. + +```jsx copy showLineNumbers + import { CldImage } from 'next-cloudinary'; -To ensure that the responsive images can effectively determine all appropriate sizes for the images, use the actual image width and height when specifying the dimension props. + + ``` + + +This would give you roughly full width images on mobile, a 2-column layout on +tablets, and 3-column layout on desktop views. ### Responsive Images & CldImage -The only caveat to this is when using cropping modes in Cloudinary. +The difference with the CldImage component is that it utilizes Cloudinary tech +in order to provide the responsive sizing. -In an example such as: +In the example above, the output would look like: -```jsx copy - + decoding="async" + data-nimg="1" + style="color:transparent" + sizes="(max-width: 768px) 100vw, (max-width: 1200px) 50vw, 33vw" + srcset=" + https://res.cloudinary.com//image/upload/c_limit,w_256/f_auto/q_auto/v1/ 256w, + https://res.cloudinary.com//image/upload/c_limit,w_384/f_auto/q_auto/v1/ 384w, + https://res.cloudinary.com//image/upload/c_limit,w_640/f_auto/q_auto/v1/ 640w, + https://res.cloudinary.com//image/upload/c_limit,w_750/f_auto/q_auto/v1/ 750w, + https://res.cloudinary.com//image/upload/c_limit,w_828/f_auto/q_auto/v1/ 828w, + https://res.cloudinary.com//image/upload/c_limit,w_1080/f_auto/q_auto/v1/ 1080w, + https://res.cloudinary.com//image/upload/c_limit,w_1200/f_auto/q_auto/v1/ 1200w, + https://res.cloudinary.com//image/upload/c_limit,w_1920/f_auto/q_auto/v1/ 1920w, + https://res.cloudinary.com//image/upload/c_limit,w_2048/f_auto/q_auto/v1/ 2048w, + https://res.cloudinary.com//image/upload/c_limit,w_3840/f_auto/q_auto/v1/ 3840w + " + src="https://res.cloudinary.com//image/upload/c_limit,w_3840/f_auto/q_auto/v1/" +> ``` -Using cropping, we're setting a width of 600px and a height of 600px, telling Cloudinary we want to take our original image, crop it to that size, then position the focal point to the face in the image detected using AI. +Where the image is automatically generated on the fly with Cloudinary by passing +in a URL parameter of `w_`. + +### Upscaling Images -From a responsive standpoint, we're stating that we want full width images on anything less than 480px and half-width images on anything above. +By default, the CldImage component uses the `limit` crop mode which explicitly +prevents Cloudinary from upscaling an image if the size is greater than the original +and instead, opting for the browser to resize the image on its behalf. -The challenge here is when cropping the image, we're cropping it to 600px, which is smaller than some of the sizes we want to responsively serve. We don't want to responsively change that cropped size, otherwise we would change the cropping results due to the crop attempting to grab different portions of the image depending on the size. +To allow Cloudinary to upscale the image and potentially produce blurry images, +you can set the crop mode to `scale`. -To avoid attempting to load upscaled images, resulting in blurry or grainy images as well as more bandwidth used on a device, any responsive size that is greater than the set width will not be generated and instead, we'll deliver an image at that size specifically (in this example, 600x600). +### Cropping & Resizing + +Part of the benefit of using Cloudinary is access to dynamic cropping and +resizing modes. + +In an example such as: -For instance, in the above example, the resulting responsive image in the HTML may look like: + + + -```jsx copy + +```jsx copy showLineNumbers + import { CldImage } from 'next-cloudinary'; + + + ``` + + +Each image will be cropped to a 1:1 ratio represented by the width and height provided. + +As the underlaying Next Image component generates an image for each responsive size, +Cloudinary will use those sizes when building the URL, for example: + +``` Turtle + https://res.cloudinary.com//image/upload/c_fill,w_640,h_640,g_auto/f_auto/q_auto/v1/ 640w, + https://res.cloudinary.com//image/upload/c_fill,w_750,h_750,g_auto/f_auto/q_auto/v1/ 750w, + https://res.cloudinary.com//image/upload/c_fill,w_828,h_828,g_auto/f_auto/q_auto/v1/ 828w, + https://res.cloudinary.com//image/upload/c_fill,w_1080,h_1080,g_auto/f_auto/q_auto/v1/ 1080w, + https://res.cloudinary.com//image/upload/c_fill,w_1200,h_1200,g_auto/f_auto/q_auto/v1/ 1200w, + https://res.cloudinary.com//image/upload/c_fill,w_1920,h_1920,g_auto/f_auto/q_auto/v1/ 1920w, + https://res.cloudinary.com//image/upload/c_fill,w_2048,h_2048,g_auto/f_auto/q_auto/v1/ 2048w, + https://res.cloudinary.com//image/upload/c_fill,w_3840,h_3840,g_auto/f_auto/q_auto/v1/ 3840w + " + src="https://res.cloudinary.com//image/upload/c_fill,w_3840,h_3840,g_auto/f_auto/q_auto/v1/" +> +``` + +And so on... + +### Dynamic Cropping Modes + +While some cropping modes will "just work" with responsive sizing, others won't. + +For instance, the crop mode of `thumb` will dynamically crop an image based on its +size and contents, meaning the resulting crop of a 256x256 image may be different +than a 640x640 image. + + + + + + +```jsx copy showLineNumbers + import { CldImage } from 'next-cloudinary'; + + + ``` + + +The resulting transformations may look like: + +``` +.../w_256,h_256,c_thumb/... +.../w_384,h_384,c_thumb/... +.../w_640,h_640,c_thumb/... +.../w_750,h_750,c_thumb/... +``` + + + Try resizing the browser to very small, refresh the page, then increase + the browser size to see the differences. + + +This produces inconsistent results depending on the size of the device, which isn't +a great experience. + +To help give visitors that great experience, we can crop our image in two stages +opting to crop an image before any transformations are made, then allowing the +responsive sizing to resize the result. + + + + + + +```jsx copy showLineNumbers + import { CldImage } from 'next-cloudinary'; + + + ``` + + + + Tip: By default, using an object for `crop` will derive the width and + height from the top-level width and height, but you can customize those + values by explicitly setting them. + + +The resulting transformations may look like: + +``` +.../w_960,h_960,c_thumb//w_256,h_256,c_limit/... +.../w_960,h_960,c_thumb//w_384,h_384,c_limit/... +.../w_960,h_960,c_thumb//w_640,h_640,c_limit/... +.../w_960,h_960,c_thumb//w_750,h_750,c_limit/... ``` -Notice that all of the URLs are the same except for the first one, as it's smaller than 600px. + + Try resizing the browser to very small, refresh the page, then increase + the browser size to see it is now consistent. + -When the browser attempts to load these responsive images, it will effectively ignore the same URLs, only having loaded it once if resizing the browser. +By using object-syntax for the crop prop and setting `source` to `true`, we +are specifying that we want the crop transformation to be applied to the +source image. \ No newline at end of file diff --git a/docs/pages/guides/social-media-card.mdx b/docs/pages/guides/social-media-card.mdx index 9b8ac4c0..c5378105 100644 --- a/docs/pages/guides/social-media-card.mdx +++ b/docs/pages/guides/social-media-card.mdx @@ -2,8 +2,9 @@ import Head from 'next/head'; import { Callout, Tab, Tabs } from 'nextra-theme-docs'; import OgImage from '../../components/OgImage'; - -import { CldImage, CldOgImage } from '../../../next-cloudinary'; +import HeaderImage from '../../components/HeaderImage'; +import CodeBlock from '../../components/CodeBlock'; +import ExamplesCldOgImage from '../../components/ExamplesCldOgImage'; Social Media Cards - Next Cloudinary @@ -18,23 +19,17 @@ import { CldImage, CldOgImage } from '../../../next-cloudinary'; # Generating Social Media Cards - - CldOgImage does not render an `` tag, meaning it can't be visually embedded on a page. The following examples make use of the `` tag to showcase what's possible. - +You can use Next Cloudinary to easily generate dynamic social media cards +for your Next.js app. ## Example -
    - + -
    + +> CldOgImage does not render an `` tag, meaning it can't be visually embedded on a page. The following examples make use of the `` tag to showcase what's possible. - + - ```jsx copy - import { CldOgImage } from 'next-cloudinary'; + + ```jsx copy showLineNumbers + import { getCldOgImageUrl } from 'next-cloudinary'; - ', + overlays: [ + { + publicId: '', + position: { + x: 0, + y: 0, + gravity: 'north_east', + }, + effects: [ + { + crop: 'fill', + gravity: 'auto', + width: '0.33', + height: '1.0' + } + ], + flags: ['relative'] }, - }, - { - width: 1400, - crop: 'fit', - text: { - color: 'black', - fontFamily: 'Source Sans Pro', - fontSize: 80, - text: 'Get the power of Cloudinary in a Next.js project with Next Cloudinary!' + { + width: 700, + crop: 'fit', + text: { + color: 'black', + fontFamily: 'Source Sans Pro', + fontSize: 80, + fontWeight: 'bold', + text: '' + }, + position: { + x: 50, + y: -50, + gravity: 'west', + }, }, - position: { - x: 100, - y: 100, - gravity: 'west', + { + width: 700, + crop: 'fit', + text: { + color: 'black', + fontFamily: 'Source Sans Pro', + fontSize: 40, + text: '' + }, + position: { + x: 50, + y: 50, + gravity: 'west', + }, }, - }, - ]} - twitterTitle="Next Cloudinary" - alt="Next Cloudinary with picture of a mountain" - /> + ] + }); ``` + - ```jsx copy - import { getCldOgImageUrl } from 'next-cloudinary'; + + ```jsx copy showLineNumbers + import { CldOgImage } from 'next-cloudinary'; - getCldOgImageUrl({ - src: 'images/white', - overlays: [ - { - publicId: 'images/mountain', - position: { - x: 0, - y: 0, - gravity: 'north_east', - }, - effects: [ - { - crop: 'fill', - gravity: 'auto', - width: 800, - height: 1200 - } - ] - }, - { - width: 1400, - crop: 'fit', - text: { - color: 'black', - fontFamily: 'Source Sans Pro', - fontSize: 160, - fontWeight: 'bold', - text: 'Next Cloudinary' - }, - position: { - x: 100, - y: -100, - gravity: 'west', + ', + position: { + x: 0, + y: 0, + gravity: 'north_east', + }, + effects: [ + { + crop: 'fill', + gravity: 'auto', + width: '0.33', + height: '1.0' + } + ], + flags: ['relative'] }, - }, - { - width: 1400, - crop: 'fit', - text: { - color: 'black', - fontFamily: 'Source Sans Pro', - fontSize: 80, - text: 'Get the power of Cloudinary in a Next.js project with Next Cloudinary!' + { + width: 700, + crop: 'fit', + text: { + color: 'black', + fontFamily: 'Source Sans Pro', + fontSize: 80, + fontWeight: 'bold', + text: '' + }, + position: { + x: 80, + y: -50, + gravity: 'west', + }, }, - position: { - x: 100, - y: 100, - gravity: 'west', + { + width: 700, + crop: 'fit', + text: { + color: 'black', + fontFamily: 'Source Sans Pro', + fontSize: 40, + text: '' + }, + position: { + x: 80, + y: 50, + gravity: 'west', + }, }, - }, - ] - }); + ]} + twitterTitle="" + alt="" + /> ``` + ## Learn More +* [Social Media Card Templates](/templates/social-media-cards) * [CldOgImage Configuration](/cldogimage/configuration) \ No newline at end of file diff --git a/docs/pages/guides/text-overlays.mdx b/docs/pages/guides/text-overlays.mdx index 4bcbd340..d0db165e 100644 --- a/docs/pages/guides/text-overlays.mdx +++ b/docs/pages/guides/text-overlays.mdx @@ -2,6 +2,8 @@ import Head from 'next/head'; import { Tab, Tabs } from 'nextra-theme-docs'; import OgImage from '../../components/OgImage'; +import HeaderImage from '../../components/HeaderImage'; +import CodeBlock from '../../components/CodeBlock'; import { CldImage } from '../../../next-cloudinary'; @@ -22,79 +24,29 @@ You can add text on top of your image with text-based overlays. ## Example -
    + -
    - - - - ```jsx copy - import { CldImage } from 'next-cloudinary'; - - - ``` - - - ```jsx copy - import { getCldImageUrl } from 'next-cloudinary'; - - getCldImageUrl({ - width: 1335, - height: 891, - src: 'images/sneakers', - overlays: [{ - width: 2670 - 20, - crop: 'fit', + }, + { position: { x: 140, y: 140, @@ -102,17 +54,110 @@ You can add text on top of your image with text-based overlays. gravity: 'south_east', }, text: { - color: 'blueviolet', + color: 'white', fontFamily: 'Source Sans Pro', - fontSize: 160, - fontWeight: 'bold', - textDecoration: 'underline', - letterSpacing: 14, - text: 'Cool Beans' + fontSize: 280, + fontWeight: 'black', + text: 'WITH STYLE' } - }] - }) - ``` + }, + ]} + alt="Sneakers with text With Style" + /> + + + + + + ```jsx copy showLineNumbers + import { CldImage } from 'next-cloudinary'; + + + ``` + + + + + ```jsx copy showLineNumbers + import { getCldImageUrl } from 'next-cloudinary'; + + getCldImageUrl({ + width: 1335, + height: 891, + src: 'images/sneakers', + overlays: [ + { + position: { + x: 160, + y: 120, + angle: -20, + gravity: 'south_east', + }, + text: { + color: 'magenta', + fontFamily: 'Source Sans Pro', + fontSize: 280, + fontWeight: 'black', + text: 'WITH STYLE' + } + }, + { + position: { + x: 140, + y: 140, + angle: -20, + gravity: 'south_east', + }, + text: { + color: 'white', + fontFamily: 'Source Sans Pro', + fontSize: 280, + fontWeight: 'black', + text: 'WITH STYLE' + } + }, + ] + }) + ``` + diff --git a/docs/pages/index.mdx b/docs/pages/index.mdx index 158cc7b2..d2ab6ff8 100644 --- a/docs/pages/index.mdx +++ b/docs/pages/index.mdx @@ -34,10 +34,10 @@ High-performance image and video delivery and uploading at scale in Next.js powe
  • @@ -47,8 +47,13 @@ High-performance image and video delivery and uploading at scale in Next.js powe height="987" src={`${process.env.IMAGES_DIRECTORY}/woman-headphones`} sizes="50vw" - crop="thumb" - gravity="faces" + crop={{ + width: 987, + height: 987, + type: 'thumb', + gravity: 'faces', + source: true, + }} removeBackground tint="40:253f8c" underlay={`${process.env.IMAGES_DIRECTORY}/city-skyline`} diff --git a/docs/pages/templates/social-media-cards.mdx b/docs/pages/templates/social-media-cards.mdx index 04369db9..848e8974 100644 --- a/docs/pages/templates/social-media-cards.mdx +++ b/docs/pages/templates/social-media-cards.mdx @@ -4,8 +4,7 @@ import { Callout, Tab, Tabs } from 'nextra-theme-docs'; import OgImage from '../../components/OgImage'; import HeaderImage from '../../components/HeaderImage'; import CodeBlock from '../../components/CodeBlock'; - -import { CldImage, CldOgImage } from '../../../next-cloudinary'; +import ExamplesCldOgImage from '../../components/ExamplesCldOgImage'; Social Card Images - Next Cloudinary @@ -20,15 +19,13 @@ import { CldImage, CldOgImage } from '../../../next-cloudinary'; # Social Card Image Templates +> CldOgImage does not render an `` tag, meaning it can't be visually embedded on a page. The following examples make use of the `` tag to showcase what's possible. + ## Article - Note: you can alternatively use this function to pass dynamic values using the [generateMetadata function](https://nextjs.org/docs/app/api-reference/functions/generate-metadata). - + ```jsx copy showLineNumbers import { Metadata } from 'next'; import { getCldOgImageUrl } from 'next-cloudinary'; @@ -139,7 +134,7 @@ import { CldImage, CldOgImage } from '../../../next-cloudinary'; // Prefer a different size? Be sure to update the width and height of the // metadata as well as the image configuration of getCldOgImageUrl width: 1200, - height: 627, + height: 630, url: getCldOgImageUrl({ src: publicId, effects: [ @@ -157,68 +152,66 @@ import { CldImage, CldOgImage } from '../../../next-cloudinary'; overlays: [ { publicId, - width: 2400, - height: 1254, + width: 1200, + height: 630, crop: 'fill', effects: [ { opacity: 20 } ] }, { - width: 2000, + width: 1000, crop: 'fit', text: { color: 'white', - fontFamily: 'Lato', - fontSize: 130, - fontWeight: 'black', - lineSpacing: 20, - lineSpacing: 20, + fontFamily: 'Merriweather', + fontSize: 58, + fontWeight: 'bold', + lineSpacing: 10, + lineSpacing: 10, text: headline }, position: { - x: 200, - y: 200, + x: 100, + y: 100, gravity: 'north_west' }, }, { publicId, - width: 2000, - height: 4, + width: 1000, + height: 2, effects: [{ colorize: '100,co_white', opacity: 70 }], position: { - x: 200, - y: 350, + x: 100, + y: 175, gravity: 'south_west' }, }, { - width: 120, + width: 60, crop: 'fit', publicId: logoPublicId, position: { - x: 200, - y: 205, + x: 100, + y: 102, gravity: 'south_west' }, }, { - width: 1400, - crop: 'fit', text: { color: 'white', fontFamily: 'Lato', - fontSize: 74, + fontSize: 37, fontWeight: 'bold', text: tagline }, position: { - x: 360, - y: 200, + x: 180, + y: 100, gravity: 'south_west' }, }, @@ -262,67 +255,66 @@ import { CldImage, CldOgImage } from '../../../next-cloudinary'; overlays={[ { publicId, - width: 2400, - height: 1254, + width: 1200, + height: 630, crop: 'fill', effects: [ { opacity: 20 } ] }, { - width: 2000, + width: 1000, crop: 'fit', text: { color: 'white', - fontFamily: 'Lato', - fontSize: 130, - fontWeight: 'black', - lineSpacing: 20, + fontFamily: 'Merriweather', + fontSize: 58, + fontWeight: 'bold', + lineSpacing: 10, + lineSpacing: 10, text: headline }, position: { - x: 200, - y: 200, + x: 100, + y: 100, gravity: 'north_west' }, }, { publicId, - width: 2000, - height: 4, + width: 1000, + height: 2, effects: [{ colorize: '100,co_white', opacity: 70 }], position: { - x: 200, - y: 350, + x: 100, + y: 175, gravity: 'south_west' }, }, { - width: 120, + width: 60, crop: 'fit', publicId: logoPublicId, position: { - x: 200, - y: 205, + x: 100, + y: 102, gravity: 'south_west' }, }, { - width: 1400, - crop: 'fit', text: { color: 'white', fontFamily: 'Lato', - fontSize: 74, + fontSize: 37, fontWeight: 'bold', text: tagline }, position: { - x: 360, - y: 200, + x: 180, + y: 100, gravity: 'south_west' }, }, @@ -338,48 +330,44 @@ import { CldImage, CldOgImage } from '../../../next-cloudinary'; ## Full - Note: you can alternatively use this function to pass dynamic values using the [generateMetadata function](https://nextjs.org/docs/app/api-reference/functions/generate-metadata). - + ```jsx copy showLineNumbers import { Metadata } from 'next'; import { getCldOgImageUrl } from 'next-cloudinary'; @@ -411,47 +399,47 @@ import { CldImage, CldOgImage } from '../../../next-cloudinary'; // Prefer a different size? Be sure to update the width and height of the // metadata as well as the image configuration of getCldOgImageUrl width: 1200, - height: 627, + height: 630, url: getCldOgImageUrl({ src: publicId, effects: [{ colorize: '100,co_black' }], overlays: [ { publicId, - width: 2400, - height: 1254, + width: 1200, + height: 630, crop: 'fill', effects: [{ opacity: 60 }] }, { - width: 1400, + width: 700, crop: 'fit', text: { alignment: 'center', color: 'white', fontFamily: 'Source Sans Pro', - fontSize: 160, + fontSize: 80, fontWeight: 'bold', text: headline }, position: { - y: -100, + y: -50, }, }, { - width: 1400, + width: 700, crop: 'fit', text: { alignment: 'center', color: 'white', fontFamily: 'Source Sans Pro', - fontSize: 74, + fontSize: 37, text: body }, position: { - y: 100, + y: 50, }, }, ] @@ -482,40 +470,40 @@ import { CldImage, CldOgImage } from '../../../next-cloudinary'; overlays={[ { publicId, - width: 2400, - height: 1254, + width: 1200, + height: 630, crop: 'fill', effects: [{ opacity: 60 }] }, { - width: 1400, + width: 700, crop: 'fit', text: { alignment: 'center', color: 'white', fontFamily: 'Source Sans Pro', - fontSize: 160, + fontSize: 80, fontWeight: 'bold', text: headline }, position: { - y: -100, + y: -50, }, }, { - width: 1400, + width: 700, crop: 'fit', text: { alignment: 'center', color: 'white', fontFamily: 'Source Sans Pro', - fontSize: 74, + fontSize: 37, text: body }, position: { - y: 100, + y: 50, }, }, ]} @@ -530,13 +518,9 @@ import { CldImage, CldOgImage } from '../../../next-cloudinary'; ## One Third - Note: you can alternatively use this function to pass dynamic values using the [generateMetadata function](https://nextjs.org/docs/app/api-reference/functions/generate-metadata). - + ```jsx copy showLineNumbers import { Metadata } from 'next'; import { getCldOgImageUrl } from 'next-cloudinary'; @@ -612,7 +597,7 @@ import { CldImage, CldOgImage } from '../../../next-cloudinary'; // Prefer a different size? Be sure to update the width and height of the // metadata as well as the image configuration of getCldOgImageUrl width: 1200, - height: 627, + height: 630, url: getCldOgImageUrl({ src: publicId, effects: [{ colorize: '100,co_white' }], @@ -626,39 +611,40 @@ import { CldImage, CldOgImage } from '../../../next-cloudinary'; { crop: 'fill', gravity: 'auto', - width: 800, - height: 1254 + width: '0.33', + height: '1.0' } - ] + ], + flags: ['relative'] }, { - width: 1250, + width: 625, crop: 'fit', text: { color: 'black', fontFamily: 'Source Sans Pro', - fontSize: 160, + fontSize: 80, fontWeight: 'bold', text: headline }, position: { - x: 250, - y: -100, + x: 125, + y: -50, gravity: 'west', }, }, { - width: 1250, + width: 625, crop: 'fit', text: { color: 'black', fontFamily: 'Source Sans Pro', - fontSize: 74, + fontSize: 37, text: body }, position: { - x: 250, - y: 100, + x: 125, + y: 50, gravity: 'west', }, }, @@ -697,39 +683,40 @@ import { CldImage, CldOgImage } from '../../../next-cloudinary'; { crop: 'fill', gravity: 'auto', - width: 800, - height: 1254 + width: '0.33', + height: '1.0' } - ] + ], + flags: ['relative'] }, { - width: 1250, + width: 625, crop: 'fit', text: { color: 'black', fontFamily: 'Source Sans Pro', - fontSize: 160, + fontSize: 80, fontWeight: 'bold', text: headline }, position: { - x: 250, - y: -100, + x: 125, + y: -50, gravity: 'west', }, }, { - width: 1250, + width: 625, crop: 'fit', text: { color: 'black', fontFamily: 'Source Sans Pro', - fontSize: 74, + fontSize: 37, text: body }, position: { - x: 250, - y: 100, + x: 125, + y: 50, gravity: 'west', }, }, diff --git a/next-cloudinary/package.json b/next-cloudinary/package.json index 391abdd0..5f91ecba 100644 --- a/next-cloudinary/package.json +++ b/next-cloudinary/package.json @@ -12,11 +12,11 @@ "prepublishOnly": "cp ../README.md . && cp ../LICENSE . && pnpm build", "postpublish": "rm ./README.md && rm ./LICENSE", "test": "jest", - "test:app": "NEXT_PUBLIC_CLOUDINARY_CLOUD_NAME=\"test\" pnpm build && cd tests/nextjs-app && pnpm build" + "test:app": "NEXT_PUBLIC_CLOUDINARY_CLOUD_NAME=\"test\" pnpm build && cd tests/nextjs-app && npm install && npm run build" }, "dependencies": { "@cloudinary-util/types": "1.0.0", - "@cloudinary-util/url-loader": "4.2.0", + "@cloudinary-util/url-loader": "5.0.0-beta.3", "@cloudinary-util/util": "^2.3.0" }, "devDependencies": { diff --git a/next-cloudinary/src/components/CldOgImage/CldOgImage.tsx b/next-cloudinary/src/components/CldOgImage/CldOgImage.tsx index 9280b75d..59faa61b 100644 --- a/next-cloudinary/src/components/CldOgImage/CldOgImage.tsx +++ b/next-cloudinary/src/components/CldOgImage/CldOgImage.tsx @@ -1,10 +1,10 @@ import React from 'react'; import Head from 'next/head'; -import type { ImageOptions } from '@cloudinary-util/url-loader'; import { CldImageProps } from '../CldImage/CldImage'; import { getCldImageUrl } from '../../helpers/getCldImageUrl'; -import { OG_IMAGE_WIDTH, OG_IMAGE_WIDTH_RESIZE, OG_IMAGE_HEIGHT } from '../../constants/sizes'; +import { getCldOgImageUrl } from '../../helpers/getCldOgImageUrl'; +import { OG_IMAGE_WIDTH, OG_IMAGE_HEIGHT } from '../../constants/sizes'; const TWITTER_CARD = 'summary_large_image'; @@ -17,38 +17,34 @@ export type CldOgImageProps = CldImageProps & { const CldOgImage = ({ excludeTags = [], twitterTitle, keys = {}, ...props }: CldOgImageProps) => { const { alt } = props; - const options: ImageOptions = { - ...props, - crop: props.crop || 'fill', - gravity: props.gravity || 'center', - height: props.height || OG_IMAGE_HEIGHT, - src: props.src, - width: props.width || OG_IMAGE_WIDTH, - widthResize: props.width || OG_IMAGE_WIDTH_RESIZE - } - - let width = typeof options.width === 'string' ? parseInt(options.width) : options.width; - let height = typeof options.height === 'string' ? parseInt(options.height) : options.height; + // We need to separately handle the width and the height to allow our user to pass in + // a custom value, but also we need to know this at the component level so that we can + // use it when rendering the meta tags - // Resize the height based on the widthResize property + let { + width = OG_IMAGE_WIDTH, + height = OG_IMAGE_HEIGHT + } = props; - if ( typeof height === 'number' && typeof width === 'number' ) { - height = ( OG_IMAGE_WIDTH_RESIZE / width ) * height; - } + // Normalize the width and height - width = OG_IMAGE_WIDTH_RESIZE; + width = typeof width === 'string' ? parseInt(width) : width; + height = typeof height === 'string' ? parseInt(height) : height; // Render the final URLs. We use two different format versions to deliver // webp for Twitter as it supports it (and we can control with tags) where // other platforms may not support webp, so we deliver jpg - const ogImageUrl = getCldImageUrl({ - ...options, - format: props.format || 'jpg', + const ogImageUrl = getCldOgImageUrl({ + ...props, + width, + height }); const twitterImageUrl = getCldImageUrl({ - ...options, + ...props, + width, + height, format: props.format || 'webp', }); diff --git a/next-cloudinary/src/constants/sizes.ts b/next-cloudinary/src/constants/sizes.ts index 3e829ffa..ad91aa9c 100644 --- a/next-cloudinary/src/constants/sizes.ts +++ b/next-cloudinary/src/constants/sizes.ts @@ -1,3 +1,2 @@ -export const OG_IMAGE_WIDTH = 2400; -export const OG_IMAGE_WIDTH_RESIZE = 1200; -export const OG_IMAGE_HEIGHT = 1254; \ No newline at end of file +export const OG_IMAGE_WIDTH = 1200; +export const OG_IMAGE_HEIGHT = 627; \ No newline at end of file diff --git a/next-cloudinary/src/helpers/getCldOgImageUrl.ts b/next-cloudinary/src/helpers/getCldOgImageUrl.ts index 030bb1dc..40a03b32 100644 --- a/next-cloudinary/src/helpers/getCldOgImageUrl.ts +++ b/next-cloudinary/src/helpers/getCldOgImageUrl.ts @@ -1,4 +1,4 @@ -import { OG_IMAGE_WIDTH, OG_IMAGE_WIDTH_RESIZE, OG_IMAGE_HEIGHT } from '../constants/sizes'; +import { OG_IMAGE_WIDTH, OG_IMAGE_HEIGHT } from '../constants/sizes'; import { getCldImageUrl } from './getCldImageUrl'; import type { GetCldImageUrlOptions } from './getCldImageUrl'; @@ -12,11 +12,13 @@ export type GetCldOgImageUrlOptions = GetCldImageUrlOptions; export function getCldOgImageUrl(options: GetCldOgImageUrlOptions) { return getCldImageUrl({ ...options, - crop: options.crop || 'fill', format: options.format || 'jpg', - gravity: options.gravity || 'center', - height: options.height || OG_IMAGE_HEIGHT, width: options.width || OG_IMAGE_WIDTH, - widthResize: options.width || OG_IMAGE_WIDTH_RESIZE + height: options.height || OG_IMAGE_HEIGHT, + crop: options.crop || { + type: 'fill', + gravity: 'center', + source: true + } }); } \ No newline at end of file diff --git a/next-cloudinary/src/lib/cloudinary.ts b/next-cloudinary/src/lib/cloudinary.ts index 1921c008..b7197d25 100644 --- a/next-cloudinary/src/lib/cloudinary.ts +++ b/next-cloudinary/src/lib/cloudinary.ts @@ -19,7 +19,10 @@ export async function pollForProcessingImage(options: PollForProcessingImageOpti }); }); } catch(e: any) { + // Timeout for 200ms before trying to fetch again to avoid overwhelming requests + if ( e.status === 423 ) { + await new Promise((resolve) => setTimeout(() => resolve(undefined), 200)); return await pollForProcessingImage(options); } return false; diff --git a/next-cloudinary/src/loaders/cloudinary-loader.ts b/next-cloudinary/src/loaders/cloudinary-loader.ts index f4904141..40248ac5 100644 --- a/next-cloudinary/src/loaders/cloudinary-loader.ts +++ b/next-cloudinary/src/loaders/cloudinary-loader.ts @@ -3,7 +3,6 @@ import { ImageProps } from 'next/image'; import { getCldImageUrl } from '../helpers/getCldImageUrl'; export interface CloudinaryLoaderCldOptions { - widthResize?: string | number; } export interface CloudinaryLoaderLoaderOptions { @@ -26,33 +25,32 @@ export function cloudinaryLoader({ loaderOptions, imageProps, cldOptions, cldCon options.width = typeof options.width === 'string' ? parseInt(options.width) : options.width; options.height = typeof options.height === 'string' ? parseInt(options.height) : options.height; - - // The loader options are used to create dynamic sizing when working with responsive images - // so these should override the default options collected from the props alone if - // the results are different. While we don't always use the height in the loader logic, - // we always pass it here, as the usage is determined later based on cropping.js - - let widthResize; + + // // The loader options are used to create dynamic sizing when working with responsive images + // // so these should override the default options collected from the props alone if + // // the results are different. While we don't always use the height in the loader logic, + // // we always pass it here, as the usage is determined later based on cropping.js if ( typeof loaderOptions?.width === 'number' && typeof options.width === 'number' && loaderOptions.width !== options.width ) { - widthResize = loaderOptions.width; + const multiplier = loaderOptions.width / options.width; + + options.width = loaderOptions.width; + + // The height may change based off of the value passed through via the loader options + // In an example where the user sizes is 800x600, but the loader is passing in 400 + // due to responsive sizing, we want to ensure we're using a height that will + // resolve to the same aspect ratio + + if ( typeof options.height === 'number' ) { + options.height = Math.floor(options.height * multiplier); + } } else if ( typeof loaderOptions?.width === 'number' && typeof options?.width !== 'number' ) { // If we don't have a width on the options object, this may mean that the component is using // the fill option: https://nextjs.org/docs/pages/api-reference/components/image#fill // The Fill option does not allow someone to pass in a width or a height // If this is the case, we still need to define a width for sizing optimization but also // for responsive sizing to take effect, so we can utilize the loader width for the base width - - widthResize = loaderOptions.width; - options.width = widthResize; - } - - // If we have a resize width that's smaller than the user-defined width, we want to give the - // ability to perform a final resize on the image without impacting any of the effects like text - // overlays that may depend on the size to work properly - - if ( options.width && widthResize && widthResize < options.width ) { - options.widthResize = loaderOptions.width; + options.width = loaderOptions?.width; } // @ts-ignore diff --git a/next-cloudinary/tests/lib/cloudinary.spec.js b/next-cloudinary/tests/helpers/getCldImageUrl.spec.js similarity index 58% rename from next-cloudinary/tests/lib/cloudinary.spec.js rename to next-cloudinary/tests/helpers/getCldImageUrl.spec.js index 424a0d89..1a41eb27 100644 --- a/next-cloudinary/tests/lib/cloudinary.spec.js +++ b/next-cloudinary/tests/helpers/getCldImageUrl.spec.js @@ -1,5 +1,4 @@ import { getCldImageUrl } from '../../src/helpers/getCldImageUrl'; -import { getCldVideoUrl } from '../../src/helpers/getCldVideoUrl'; describe('Cloudinary', () => { const OLD_ENV = process.env; @@ -28,20 +27,4 @@ describe('Cloudinary', () => { expect(url).toContain(`https://res.cloudinary.com/${cloudName}/image/upload/c_limit,w_100/f_auto/q_auto/turtle`); }); }); - - describe('getCldVideoUrl', () => { - it('should pass', () => { - const cloudName = 'customtestcloud'; - - process.env.NEXT_PUBLIC_CLOUDINARY_CLOUD_NAME = cloudName; - - const url = getCldVideoUrl({ - src: 'turtle', - width: 100, - height: 100 - }); - - expect(url).toContain(`https://res.cloudinary.com/${cloudName}/video/upload/c_limit,w_100/f_auto/q_auto/turtle`); - }); - }); }) diff --git a/next-cloudinary/tests/helpers/getCldOgImageUrl.spec.js b/next-cloudinary/tests/helpers/getCldOgImageUrl.spec.js new file mode 100644 index 00000000..837f948f --- /dev/null +++ b/next-cloudinary/tests/helpers/getCldOgImageUrl.spec.js @@ -0,0 +1,49 @@ +import { getCldOgImageUrl } from '../../src/helpers/getCldOgImageUrl'; +import { OG_IMAGE_WIDTH, OG_IMAGE_HEIGHT } from '../../src/constants/sizes'; + +describe('Cloudinary', () => { + const OLD_ENV = process.env; + + beforeEach(() => { + jest.resetModules() + process.env = { ...OLD_ENV }; + }); + + afterAll(() => { + process.env = OLD_ENV; + }); + + describe('getCldOgImageUrl', () => { + it('should pass use defaults to create a URL', () => { + const cloudName = 'customtestcloud'; + + process.env.NEXT_PUBLIC_CLOUDINARY_CLOUD_NAME = cloudName; + + const src = 'turtle'; + + const url = getCldOgImageUrl({ + src + }); + + expect(url).toContain(`https://res.cloudinary.com/${cloudName}/image/upload/c_fill,w_${OG_IMAGE_WIDTH},h_${OG_IMAGE_HEIGHT},g_center/c_limit,w_${OG_IMAGE_WIDTH}/f_jpg/q_auto/${src}`); + }); + + it('should allow customization of width and height', () => { + const cloudName = 'customtestcloud'; + + process.env.NEXT_PUBLIC_CLOUDINARY_CLOUD_NAME = cloudName; + + const src = 'turtle'; + const width = 800; + const height = 600; + + const url = getCldOgImageUrl({ + src, + width, + height + }); + + expect(url).toContain(`https://res.cloudinary.com/${cloudName}/image/upload/c_fill,w_${width},h_${height},g_center/c_limit,w_${width}/f_jpg/q_auto/${src}`); + }); + }); +}) \ No newline at end of file diff --git a/next-cloudinary/tests/helpers/getCldVideoUrl.spec.js b/next-cloudinary/tests/helpers/getCldVideoUrl.spec.js new file mode 100644 index 00000000..58298fe3 --- /dev/null +++ b/next-cloudinary/tests/helpers/getCldVideoUrl.spec.js @@ -0,0 +1,30 @@ +import { getCldVideoUrl } from '../../src/helpers/getCldVideoUrl'; + +describe('Cloudinary', () => { + const OLD_ENV = process.env; + + beforeEach(() => { + jest.resetModules() + process.env = { ...OLD_ENV }; + }); + + afterAll(() => { + process.env = OLD_ENV; + }); + + describe('getCldVideoUrl', () => { + it('should pass', () => { + const cloudName = 'customtestcloud'; + + process.env.NEXT_PUBLIC_CLOUDINARY_CLOUD_NAME = cloudName; + + const url = getCldVideoUrl({ + src: 'turtle', + width: 100, + height: 100 + }); + + expect(url).toContain(`https://res.cloudinary.com/${cloudName}/video/upload/c_limit,w_100/f_auto/q_auto/turtle`); + }); + }); +}) diff --git a/next-cloudinary/tests/loaders/cloudinary-loader.spec.js b/next-cloudinary/tests/loaders/cloudinary-loader.spec.js index b0630f08..e55c8ebc 100644 --- a/next-cloudinary/tests/loaders/cloudinary-loader.spec.js +++ b/next-cloudinary/tests/loaders/cloudinary-loader.spec.js @@ -31,20 +31,28 @@ describe('Cloudinary Loader', () => { it('should return a Cloudinary URL with advanced options', () => { const imageProps = { - width: '987', - height: '1481', + width: 987, + height: 1481, src: 'images/woman-headphones', sizes: '100vw', } const loaderOptions = { src: 'images/woman-headphones', - width: 987 + width: 987, } const cldOptions = { removeBackground: true, - crop: 'thumb', + crop: [ + { + type: 'thumb', + source: true + }, + { + type: 'scale' + } + ], gravity: 'faces', tint: '40:253f8c', underlays: [ @@ -59,7 +67,9 @@ describe('Cloudinary Loader', () => { const result = cloudinaryLoader({ loaderOptions, imageProps, cldOptions, cldConfig }); - expect(result).toContain('https://res.cloudinary.com/test-cloud/image/upload/e_background_removal/c_thumb,w_987,h_1481,g_faces/e_tint:40:253f8c/u_images:city-skyline,w_987,h_987,c_fill/fl_layer_apply,fl_no_overflow/f_auto/q_auto/v1/images/woman-headphones') + // Note: g_auto is expected in the initial transformation as we can't infer usage of + // gravity for which transformation to apply it to via URL Loader + expect(result).toContain(`https://res.cloudinary.com/test-cloud/image/upload/e_background_removal/c_thumb,w_987,h_1481,g_auto/e_tint:40:253f8c/u_images:city-skyline,w_987,h_987,c_fill/fl_layer_apply,fl_no_overflow/c_scale,w_${imageProps.width},h_${imageProps.height}/f_auto/q_auto/v1/images/woman-headphones`) }); it('should return a Cloudinary URL with fetch features', async () => { @@ -94,82 +104,68 @@ describe('Cloudinary Loader', () => { // The resulting widths should only be resized from imageProps if the value is smaller, to avoid upscaling an image const loaderOptions1 = { width: 2048 }; const result1 = cloudinaryLoader({ loaderOptions: loaderOptions1, imageProps, cldOptions, cldConfig }); - expect(result1).toContain(`https://res.cloudinary.com/test-cloud/image/fetch/c_limit,w_${imageProps.width}/c_limit,w_${loaderOptions1.width}/f_auto/q_auto/https://upload.wikimedia.org/wikipedia/commons/4/44/Jelly_cc11.jpg`) - - const loaderOptions2 = { width: 3840 }; - const result2 = cloudinaryLoader({ loaderOptions: loaderOptions2, imageProps, cldOptions, cldConfig }); - expect(result2).toContain(`https://res.cloudinary.com/test-cloud/image/fetch/c_limit,w_${imageProps.width}/c_limit,w_${loaderOptions2.width}/f_auto/q_auto/https://upload.wikimedia.org/wikipedia/commons/4/44/Jelly_cc11.jpg`) - - const loaderOptions3 = { width: 640 }; - const result3 = cloudinaryLoader({ loaderOptions: loaderOptions3, imageProps, cldOptions, cldConfig }); - expect(result3).toContain(`https://res.cloudinary.com/test-cloud/image/fetch/c_limit,w_${imageProps.width}/c_limit,w_${loaderOptions3.width}/f_auto/q_auto/https://upload.wikimedia.org/wikipedia/commons/4/44/Jelly_cc11.jpg`) - }); - - it('should return responsive images without upscaling for smaller images', async () => { - const imageProps = { - height: '600', - sizes: '100vw', - src: 'https://upload.wikimedia.org/wikipedia/commons/4/44/Jelly_cc11.jpg', - width: '960', - deliveryType: 'fetch' - } - - const cldOptions = {}; - - // The resulting widths should only be resized from imageProps if the value is smaller, to avoid upscaling an image - - const loaderOptions1 = { width: 2048 }; - const result1 = cloudinaryLoader({ loaderOptions: loaderOptions1, imageProps, cldOptions, cldConfig }); - expect(result1).toContain(`https://res.cloudinary.com/test-cloud/image/fetch/c_limit,w_${imageProps.width}/f_auto/q_auto/https://upload.wikimedia.org/wikipedia/commons/4/44/Jelly_cc11.jpg`) + expect(result1).toContain(`https://res.cloudinary.com/test-cloud/image/fetch/c_limit,w_${loaderOptions1.width}/f_auto/q_auto/https://upload.wikimedia.org/wikipedia/commons/4/44/Jelly_cc11.jpg`) const loaderOptions2 = { width: 3840 }; const result2 = cloudinaryLoader({ loaderOptions: loaderOptions2, imageProps, cldOptions, cldConfig }); - expect(result2).toContain(`https://res.cloudinary.com/test-cloud/image/fetch/c_limit,w_${imageProps.width}/f_auto/q_auto/https://upload.wikimedia.org/wikipedia/commons/4/44/Jelly_cc11.jpg`) + expect(result2).toContain(`https://res.cloudinary.com/test-cloud/image/fetch/c_limit,w_${loaderOptions2.width}/f_auto/q_auto/https://upload.wikimedia.org/wikipedia/commons/4/44/Jelly_cc11.jpg`) const loaderOptions3 = { width: 640 }; const result3 = cloudinaryLoader({ loaderOptions: loaderOptions3, imageProps, cldOptions, cldConfig }); - expect(result3).toContain(`https://res.cloudinary.com/test-cloud/image/fetch/c_limit,w_${imageProps.width}/c_limit,w_${loaderOptions3.width}/f_auto/q_auto/https://upload.wikimedia.org/wikipedia/commons/4/44/Jelly_cc11.jpg`) + expect(result3).toContain(`https://res.cloudinary.com/test-cloud/image/fetch/c_limit,w_${loaderOptions3.width}/f_auto/q_auto/https://upload.wikimedia.org/wikipedia/commons/4/44/Jelly_cc11.jpg`) }); - it('should return a responsive images with height when crop is not limit without upscaling', async () => { + it('should add any resizing after any effects are added', async () => { const imageProps = { - height: '600', + height: 600, sizes: '100vw', src: 'https://upload.wikimedia.org/wikipedia/commons/4/44/Jelly_cc11.jpg', - width: '960', + width: 960, deliveryType: 'fetch', } const cldOptions = { - crop: 'fill' + crop: 'fill', + overlays: [{ + url: 'https://user-images.githubusercontent.com/1045274/199872380-ced2b84d-fce4-4fc9-9e76-48cb4a7fb35f.png' + }] }; + const urlBufer = Buffer.from(cldOptions.overlays[0].url); + const urlBase64 = urlBufer.toString('base64'); + const urlParam = encodeURIComponent(urlBase64); + // The resulting widths should only be resized from imageProps if the value is smaller, to avoid upscaling an image const loaderOptions1 = { width: 2048 }; const result1 = cloudinaryLoader({ loaderOptions: loaderOptions1, imageProps, cldOptions, cldConfig }); - expect(result1).toContain(`https://res.cloudinary.com/test-cloud/image/fetch/c_fill,w_${imageProps.width},h_${imageProps.height},g_auto/f_auto/q_auto/https://upload.wikimedia.org/wikipedia/commons/4/44/Jelly_cc11.jpg`) + expect(result1).toContain(`https://res.cloudinary.com/test-cloud/image/fetch/l_fetch:${urlParam}/fl_layer_apply,fl_no_overflow/c_fill,w_${loaderOptions1.width},h_${(loaderOptions1.width / imageProps.width) * imageProps.height},g_auto/f_auto/q_auto/https://upload.wikimedia.org/wikipedia/commons/4/44/Jelly_cc11.jpg`) const loaderOptions2 = { width: 3840 }; const result2 = cloudinaryLoader({ loaderOptions: loaderOptions2, imageProps, cldOptions, cldConfig }); - expect(result2).toContain(`https://res.cloudinary.com/test-cloud/image/fetch/c_fill,w_${imageProps.width},h_${imageProps.height},g_auto/f_auto/q_auto/https://upload.wikimedia.org/wikipedia/commons/4/44/Jelly_cc11.jpg`) + expect(result2).toContain(`https://res.cloudinary.com/test-cloud/image/fetch/l_fetch:${urlParam}/fl_layer_apply,fl_no_overflow/c_fill,w_${loaderOptions2.width},h_${(loaderOptions2.width / imageProps.width) * imageProps.height},g_auto/f_auto/q_auto/https://upload.wikimedia.org/wikipedia/commons/4/44/Jelly_cc11.jpg`) const loaderOptions3 = { width: 640 }; const result3 = cloudinaryLoader({ loaderOptions: loaderOptions3, imageProps, cldOptions, cldConfig }); - expect(result3).toContain(`https://res.cloudinary.com/test-cloud/image/fetch/c_fill,w_${imageProps.width},h_${imageProps.height},g_auto/c_limit,w_${loaderOptions3.width}/f_auto/q_auto/https://upload.wikimedia.org/wikipedia/commons/4/44/Jelly_cc11.jpg`) + expect(result3).toContain(`https://res.cloudinary.com/test-cloud/image/fetch/l_fetch:${urlParam}/fl_layer_apply,fl_no_overflow/c_fill,w_${loaderOptions3.width},h_${(loaderOptions3.width / imageProps.width) * imageProps.height},g_auto/f_auto/q_auto/https://upload.wikimedia.org/wikipedia/commons/4/44/Jelly_cc11.jpg`) }); - it('should add any resizing after any effects are added', async () => { + it('should add two-stage resizing and cropping', async () => { const imageProps = { - height: '600', + height: 600, sizes: '100vw', src: 'https://upload.wikimedia.org/wikipedia/commons/4/44/Jelly_cc11.jpg', - width: '960', + width: 960, deliveryType: 'fetch', } const cldOptions = { - crop: 'fill', + crop: { + width: 1234, + height: 4321, + type: 'fill', + source: true + }, overlays: [{ url: 'https://user-images.githubusercontent.com/1045274/199872380-ced2b84d-fce4-4fc9-9e76-48cb4a7fb35f.png' }] @@ -183,15 +179,15 @@ describe('Cloudinary Loader', () => { const loaderOptions1 = { width: 2048 }; const result1 = cloudinaryLoader({ loaderOptions: loaderOptions1, imageProps, cldOptions, cldConfig }); - expect(result1).toContain(`https://res.cloudinary.com/test-cloud/image/fetch/c_fill,w_${imageProps.width},h_${imageProps.height},g_auto/l_fetch:${urlParam}/fl_layer_apply,fl_no_overflow/f_auto/q_auto/https://upload.wikimedia.org/wikipedia/commons/4/44/Jelly_cc11.jpg`) + expect(result1).toContain(`https://res.cloudinary.com/test-cloud/image/fetch/c_${cldOptions.crop.type},w_${cldOptions.crop.width},h_${cldOptions.crop.height},g_auto/l_fetch:${urlParam}/fl_layer_apply,fl_no_overflow/c_limit,w_${loaderOptions1.width}/f_auto/q_auto/https://upload.wikimedia.org/wikipedia/commons/4/44/Jelly_cc11.jpg`) const loaderOptions2 = { width: 3840 }; const result2 = cloudinaryLoader({ loaderOptions: loaderOptions2, imageProps, cldOptions, cldConfig }); - expect(result2).toContain(`https://res.cloudinary.com/test-cloud/image/fetch/c_fill,w_${imageProps.width},h_${imageProps.height},g_auto/l_fetch:${urlParam}/fl_layer_apply,fl_no_overflow/f_auto/q_auto/https://upload.wikimedia.org/wikipedia/commons/4/44/Jelly_cc11.jpg`) + expect(result2).toContain(`https://res.cloudinary.com/test-cloud/image/fetch/c_${cldOptions.crop.type},w_${cldOptions.crop.width},h_${cldOptions.crop.height},g_auto/l_fetch:${urlParam}/fl_layer_apply,fl_no_overflow/c_limit,w_${loaderOptions2.width}/f_auto/q_auto/https://upload.wikimedia.org/wikipedia/commons/4/44/Jelly_cc11.jpg`) const loaderOptions3 = { width: 640 }; const result3 = cloudinaryLoader({ loaderOptions: loaderOptions3, imageProps, cldOptions, cldConfig }); - expect(result3).toContain(`https://res.cloudinary.com/test-cloud/image/fetch/c_fill,w_${imageProps.width},h_${imageProps.height},g_auto/l_fetch:${urlParam}/fl_layer_apply,fl_no_overflow/c_limit,w_${loaderOptions3.width}/f_auto/q_auto/https://upload.wikimedia.org/wikipedia/commons/4/44/Jelly_cc11.jpg`) + expect(result3).toContain(`https://res.cloudinary.com/test-cloud/image/fetch/c_${cldOptions.crop.type},w_${cldOptions.crop.width},h_${cldOptions.crop.height},g_auto/l_fetch:${urlParam}/fl_layer_apply,fl_no_overflow/c_limit,w_${loaderOptions3.width}/f_auto/q_auto/https://upload.wikimedia.org/wikipedia/commons/4/44/Jelly_cc11.jpg`) }); it('should add any resizing when fill is set to true without a width or height', async () => { diff --git a/next-cloudinary/tests/nextjs-app/package-lock.json b/next-cloudinary/tests/nextjs-app/package-lock.json new file mode 100644 index 00000000..9a921560 --- /dev/null +++ b/next-cloudinary/tests/nextjs-app/package-lock.json @@ -0,0 +1,3866 @@ +{ + "name": "nextjs-app", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "nextjs-app", + "version": "0.1.0", + "dependencies": { + "@types/node": "^20.11.19", + "@types/react": "^18.2.57", + "@types/react-dom": "^18.2.19", + "eslint": "^8.56.0", + "eslint-config-next": "^14.1.0", + "next": "^14.1.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "typescript": "^5.3.3" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.9.tgz", + "integrity": "sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", + "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", + "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==" + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "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" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@next/env": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@next/env/-/env-14.1.0.tgz", + "integrity": "sha512-Py8zIo+02ht82brwwhTg36iogzFqGLPXlRGKQw5s+qP/kMNc4MAyDeEwBKDijk6zTIbegEgu8Qy7C1LboslQAw==" + }, + "node_modules/@next/eslint-plugin-next": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-14.1.0.tgz", + "integrity": "sha512-x4FavbNEeXx/baD/zC/SdrvkjSby8nBn8KcCREqk6UuwvwoAPZmaV8TFCAuo/cpovBRTIY67mHhe86MQQm/68Q==", + "dependencies": { + "glob": "10.3.10" + } + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.1.0.tgz", + "integrity": "sha512-nUDn7TOGcIeyQni6lZHfzNoo9S0euXnu0jhsbMOmMJUBfgsnESdjN97kM7cBqQxZa8L/bM9om/S5/1dzCrW6wQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.1.0.tgz", + "integrity": "sha512-1jgudN5haWxiAl3O1ljUS2GfupPmcftu2RYJqZiMJmmbBT5M1XDffjUtRUzP4W3cBHsrvkfOFdQ71hAreNQP6g==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.1.0.tgz", + "integrity": "sha512-RHo7Tcj+jllXUbK7xk2NyIDod3YcCPDZxj1WLIYxd709BQ7WuRYl3OWUNG+WUfqeQBds6kvZYlc42NJJTNi4tQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.1.0.tgz", + "integrity": "sha512-v6kP8sHYxjO8RwHmWMJSq7VZP2nYCkRVQ0qolh2l6xroe9QjbgV8siTbduED4u0hlk0+tjS6/Tuy4n5XCp+l6g==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.1.0.tgz", + "integrity": "sha512-zJ2pnoFYB1F4vmEVlb/eSe+VH679zT1VdXlZKX+pE66grOgjmKJHKacf82g/sWE4MQ4Rk2FMBCRnX+l6/TVYzQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.1.0.tgz", + "integrity": "sha512-rbaIYFt2X9YZBSbH/CwGAjbBG2/MrACCVu2X0+kSykHzHnYH5FjHxwXLkcoJ10cX0aWCEynpu+rP76x0914atg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.1.0.tgz", + "integrity": "sha512-o1N5TsYc8f/HpGt39OUQpQ9AKIGApd3QLueu7hXk//2xq5Z9OxmV6sQfNp8C7qYmiOlHYODOGqNNa0e9jvchGQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-ia32-msvc": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.1.0.tgz", + "integrity": "sha512-XXIuB1DBRCFwNO6EEzCTMHT5pauwaSj4SWs7CYnME57eaReAKBXCnkUE80p/pAZcewm7hs+vGvNqDPacEXHVkw==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.1.0.tgz", + "integrity": "sha512-9WEbVRRAqJ3YFVqEZIxUqkiO8l1nool1LmNxygr5HWF8AcSYsEpneUDhmjUVJEzO2A04+oPtZdombzzPPkTtgg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@rushstack/eslint-patch": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.7.2.tgz", + "integrity": "sha512-RbhOOTCNoCrbfkRyoXODZp75MlpiHMgbE5MEBZAnnnLyQNgrigEj4p0lzsMDyc1zVsJDLrivB58tgg3emX0eEA==" + }, + "node_modules/@swc/helpers": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", + "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==" + }, + "node_modules/@types/node": { + "version": "20.11.19", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.19.tgz", + "integrity": "sha512-7xMnVEcZFu0DikYjWOlRq7NTPETrm7teqUT2WkQjrTIkEgUyyGdWsj/Zg8bEJt5TNklzbPD1X3fqfsHw3SpapQ==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/prop-types": { + "version": "15.7.11", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz", + "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==" + }, + "node_modules/@types/react": { + "version": "18.2.57", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.57.tgz", + "integrity": "sha512-ZvQsktJgSYrQiMirAN60y4O/LRevIV8hUzSOSNB6gfR3/o3wCBFQx3sPwIYtuDMeiVgsSS3UzCV26tEzgnfvQw==", + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.2.19", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.19.tgz", + "integrity": "sha512-aZvQL6uUbIJpjZk4U8JZGbau9KDeAwMfmhyWorxgBkqDIEf6ROjRozcmPIicqsUwPUjbkDfHKgGee1Lq65APcA==", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/scheduler": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz", + "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==" + }, + "node_modules/@typescript-eslint/parser": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", + "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" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", + "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", + "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", + "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", + "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" + }, + "node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "dependencies": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", + "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/array.prototype.filter": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array.prototype.filter/-/array.prototype.filter-1.0.3.tgz", + "integrity": "sha512-VizNcj/RGJiUyQBgzwxzE5oHdeuXY5hSbbmKMlphj1cy1Vl7Pn2asCGbSrru6hSQjmCzqTBPVWAF/whmEOVHbw==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-array-method-boxes-properly": "^1.0.0", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.4.tgz", + "integrity": "sha512-hzvSHUshSpCflDR1QMUBLHGHP1VIEBegT4pix9H/Z92Xw3ySoy6c2qh7lJWTJnRJ8JCZ9bJNCgTyYaJGcJu6xQ==", + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz", + "integrity": "sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==", + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.1.0", + "es-shim-unscopables": "^1.0.2" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ast-types-flow": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==" + }, + "node_modules/asynciterator.prototype": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz", + "integrity": "sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==", + "dependencies": { + "has-symbols": "^1.0.3" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axe-core": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.0.tgz", + "integrity": "sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/axobject-query": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz", + "integrity": "sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==", + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001589", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001589.tgz", + "integrity": "sha512-vNQWS6kI+q6sBlHbh71IIeC+sRwK2N3EDySc/updIGhIee2x5z00J4c1242/5/d6EpEMdOnk/m+6tuk4/tcsqg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + }, + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==" + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "node_modules/enhanced-resolve": { + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/es-abstract": { + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.4.tgz", + "integrity": "sha512-vZYJlk2u6qHYxBOTjAeg7qUxHdNfih64Uu2J8QqWgXZ2cri0ZpJAkzDUK/q593+mvKwlxyaxr6F1Q+3LKoQRgg==", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.6", + "call-bind": "^1.0.7", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.2", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.1", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.0", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", + "typed-array-buffer": "^1.0.1", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==" + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.0.17", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.17.tgz", + "integrity": "sha512-lh7BsUqelv4KUbR5a/ZTaGGIMLCjPGPqJ6q+Oq24YP0RdyptX1uzm4vvaqzk7Zx3bpl/76YLTTDj9L7uYQ92oQ==", + "dependencies": { + "asynciterator.prototype": "^1.0.0", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.4", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.2", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.3", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "iterator.prototype": "^1.1.2", + "safe-array-concat": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "dependencies": { + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "dependencies": { + "hasown": "^2.0.0" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", + "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.56.0", + "@humanwhocodes/config-array": "^0.11.13", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-next": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-14.1.0.tgz", + "integrity": "sha512-SBX2ed7DoRFXC6CQSLc/SbLY9Ut6HxNB2wPTcoIWjUMd7aF7O/SIE7111L8FdZ9TXsNV4pulUDnfthpyPtbFUg==", + "dependencies": { + "@next/eslint-plugin-next": "14.1.0", + "@rushstack/eslint-patch": "^1.3.3", + "@typescript-eslint/parser": "^5.4.2 || ^6.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" + }, + "peerDependencies": { + "eslint": "^7.23.0 || ^8.0.0", + "typescript": ">=3.3.1" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-import-resolver-typescript": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz", + "integrity": "sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==", + "dependencies": { + "debug": "^4.3.4", + "enhanced-resolve": "^5.12.0", + "eslint-module-utils": "^2.7.4", + "fast-glob": "^3.3.1", + "get-tsconfig": "^4.5.0", + "is-core-module": "^2.11.0", + "is-glob": "^4.0.3" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", + "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", + "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", + "dependencies": { + "array-includes": "^3.1.7", + "array.prototype.findlastindex": "^1.2.3", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.8.0", + "hasown": "^2.0.0", + "is-core-module": "^2.13.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.7", + "object.groupby": "^1.0.1", + "object.values": "^1.1.7", + "semver": "^6.3.1", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz", + "integrity": "sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==", + "dependencies": { + "@babel/runtime": "^7.23.2", + "aria-query": "^5.3.0", + "array-includes": "^3.1.7", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "=4.7.0", + "axobject-query": "^3.2.1", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "es-iterator-helpers": "^1.0.15", + "hasown": "^2.0.0", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", + "minimatch": "^3.1.2", + "object.entries": "^1.1.7", + "object.fromentries": "^2.0.7" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.33.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz", + "integrity": "sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flatmap": "^1.3.1", + "array.prototype.tosorted": "^1.1.1", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.0.12", + "estraverse": "^5.3.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.6", + "object.fromentries": "^2.0.6", + "object.hasown": "^1.1.2", + "object.values": "^1.1.6", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.4", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.8" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", + "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-plugin-react/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "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" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==" + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "dependencies": { + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-tsconfig": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.2.tgz", + "integrity": "sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==" + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz", + "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ignore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/internal-slot": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-async-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", + "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", + "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", + "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "dependencies": { + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dependencies": { + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", + "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", + "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/iterator.prototype": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", + "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", + "dependencies": { + "define-properties": "^1.2.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "reflect.getprototypeof": "^1.0.4", + "set-function-name": "^2.0.1" + } + }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" + }, + "node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/language-subtag-registry": { + "version": "0.3.22", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", + "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==" + }, + "node_modules/language-tags": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", + "dependencies": { + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" + }, + "node_modules/next": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/next/-/next-14.1.0.tgz", + "integrity": "sha512-wlzrsbfeSU48YQBjZhDzOwhWhGsy+uQycR8bHAOt1LY1bn3zZEcDyHQOEoN3aWzQ8LHCAJ1nqrWCc9XF2+O45Q==", + "dependencies": { + "@next/env": "14.1.0", + "@swc/helpers": "0.5.2", + "busboy": "1.6.0", + "caniuse-lite": "^1.0.30001579", + "graceful-fs": "^4.2.11", + "postcss": "8.4.31", + "styled-jsx": "5.1.1" + }, + "bin": { + "next": "dist/bin/next" + }, + "engines": { + "node": ">=18.17.0" + }, + "optionalDependencies": { + "@next/swc-darwin-arm64": "14.1.0", + "@next/swc-darwin-x64": "14.1.0", + "@next/swc-linux-arm64-gnu": "14.1.0", + "@next/swc-linux-arm64-musl": "14.1.0", + "@next/swc-linux-x64-gnu": "14.1.0", + "@next/swc-linux-x64-musl": "14.1.0", + "@next/swc-win32-arm64-msvc": "14.1.0", + "@next/swc-win32-ia32-msvc": "14.1.0", + "@next/swc-win32-x64-msvc": "14.1.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz", + "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", + "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.2.tgz", + "integrity": "sha512-bzBq58S+x+uo0VjurFT0UktpKHOZmv4/xePiOA1nbB9pMqpGK7rUPNgf+1YC+7mE+0HzhTMqNUuCqvKhj6FnBw==", + "dependencies": { + "array.prototype.filter": "^1.0.3", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.0.0" + } + }, + "node_modules/object.hasown": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.3.tgz", + "integrity": "sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==", + "dependencies": { + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", + "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-scurry": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "dependencies": { + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.5.tgz", + "integrity": "sha512-62wgfC8dJWrmxv44CA36pLDnP6KKl3Vhxb7PL+8+qrrFMMoJij4vgiMP8zV4O8+CBMXY1mHxI5fITGHXFHVmQQ==", + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.0.0", + "get-intrinsic": "^1.2.3", + "globalthis": "^1.0.3", + "which-builtin-type": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "dependencies": { + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.0.tgz", + "integrity": "sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==", + "dependencies": { + "call-bind": "^1.0.5", + "get-intrinsic": "^1.2.2", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-regex": "^1.1.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/set-function-length": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz", + "integrity": "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==", + "dependencies": { + "define-data-property": "^1.1.2", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.5.tgz", + "integrity": "sha512-QcgiIWV4WV7qWExbN5llt6frQB/lBven9pqliLXfGPB+K9ZYXxDozp0wLkHS24kWCm+6YXH/f0HhnObZnZOBnQ==", + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", + "integrity": "sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "regexp.prototype.flags": "^1.5.0", + "set-function-name": "^2.0.0", + "side-channel": "^1.0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", + "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", + "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", + "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/styled-jsx": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", + "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==", + "dependencies": { + "client-only": "0.0.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-api-utils": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.2.1.tgz", + "integrity": "sha512-RIYA36cJn2WiH9Hy77hdF9r7oEwxAtB/TS9/S4Qd90Ap4z5FSiin5zEiTL44OII1Y3IIlEvxwxFUVgrHSZ/UpA==", + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.5.tgz", + "integrity": "sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", + "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", + "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", + "dependencies": { + "function.prototype.name": "^1.1.5", + "has-tostringtag": "^1.0.0", + "is-async-function": "^2.0.0", + "is-date-object": "^1.0.5", + "is-finalizationregistry": "^1.0.2", + "is-generator-function": "^1.0.10", + "is-regex": "^1.1.4", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", + "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "dependencies": { + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-weakmap": "^2.0.1", + "is-weakset": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.14.tgz", + "integrity": "sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==", + "dependencies": { + "available-typed-arrays": "^1.0.6", + "call-bind": "^1.0.5", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/next-cloudinary/tests/nextjs-app/package.json b/next-cloudinary/tests/nextjs-app/package.json index f2000831..06ca43a8 100644 --- a/next-cloudinary/tests/nextjs-app/package.json +++ b/next-cloudinary/tests/nextjs-app/package.json @@ -9,12 +9,12 @@ "lint": "next lint" }, "dependencies": { - "@types/node": "^20.11.4", - "@types/react": "^18.2.48", - "@types/react-dom": "^18.2.18", + "@types/node": "^20.11.19", + "@types/react": "^18.2.57", + "@types/react-dom": "^18.2.19", "eslint": "^8.56.0", - "eslint-config-next": "^14.0.4", - "next": "^14.0.4", + "eslint-config-next": "^14.1.0", + "next": "^14.1.0", "react": "^18.2.0", "react-dom": "^18.2.0", "typescript": "^5.3.3" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8b05df81..0ec5acd0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -30,23 +30,26 @@ importers: specifier: ^3.0.0 version: 3.0.0 '@vercel/analytics': - specifier: ^1.0.1 - version: 1.1.2 + specifier: ^1.2.2 + version: 1.2.2(next@14.1.0)(react@18.2.0) cloudinary: - specifier: ^1.37.3 - version: 1.41.3 + specifier: ^2.0.1 + version: 2.0.1 + clsx: + specifier: ^2.1.0 + version: 2.1.0 next: - specifier: ^14.0.0 - version: 14.1.0(react-dom@18.2.0)(react@18.2.0)(sass@1.70.0) + specifier: ^14.1.0 + version: 14.1.0(react-dom@18.2.0)(react@18.2.0)(sass@1.71.1) nextjs-google-analytics: specifier: ^2.3.3 version: 2.3.3(next@14.1.0)(react@18.2.0) nextra: - specifier: ^2.13.2 - version: 2.13.2(next@14.1.0)(react-dom@18.2.0)(react@18.2.0) + specifier: ^2.13.3 + version: 2.13.3(next@14.1.0)(react-dom@18.2.0)(react@18.2.0) nextra-theme-docs: - specifier: ^2.13.2 - version: 2.13.2(next@14.1.0)(nextra@2.13.2)(react-dom@18.2.0)(react@18.2.0) + specifier: ^2.13.3 + version: 2.13.3(next@14.1.0)(nextra@2.13.3)(react-dom@18.2.0)(react@18.2.0) react: specifier: ^18.2.0 version: 18.2.0 @@ -54,20 +57,23 @@ importers: specifier: ^18.2.0 version: 18.2.0(react@18.2.0) react-icons: - specifier: ^4.11.0 - version: 4.12.0(react@18.2.0) + specifier: ^5.0.1 + version: 5.0.1(react@18.2.0) sass: - specifier: ^1.63.6 - version: 1.70.0 + specifier: ^1.71.1 + version: 1.71.1 + tailwind-merge: + specifier: ^2.2.1 + version: 2.2.1 devDependencies: autoprefixer: - specifier: ^10.4.16 - version: 10.4.17(postcss@8.4.33) + specifier: ^10.4.17 + version: 10.4.17(postcss@8.4.35) postcss: - specifier: ^8.4.31 - version: 8.4.33 + specifier: ^8.4.35 + version: 8.4.35 tailwindcss: - specifier: ^3.3.5 + specifier: ^3.4.1 version: 3.4.1 next-cloudinary: @@ -76,8 +82,8 @@ importers: specifier: 1.0.0 version: 1.0.0 '@cloudinary-util/url-loader': - specifier: 4.2.0 - version: 4.2.0 + specifier: 5.0.0-beta.3 + version: 5.0.0-beta.3 '@cloudinary-util/util': specifier: ^2.3.0 version: 2.4.0 @@ -1352,6 +1358,14 @@ packages: zod: 3.22.4 dev: false + /@cloudinary-util/url-loader@5.0.0-beta.3: + resolution: {integrity: sha512-5Hsga1/on+3RMUkusXpCo1sazXbU55+2xPO7DOShbuc1CJZRUyebKVNifokvE5TRAVWmsQBqsW/7d0o7aX2SLw==} + dependencies: + '@cloudinary-util/util': 3.0.0 + '@cloudinary/url-gen': 1.15.0 + zod: 3.22.4 + dev: false + /@cloudinary-util/util@2.4.0: resolution: {integrity: sha512-RJW/K1hvm+qL2civTWgg7iKdTPDMLmpFBvH03KUkDxuDk/xi9E9x9nPthEsmdDy65GdCcZm0UKnErXXgKzMOQQ==} dev: false @@ -2783,9 +2797,19 @@ packages: resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} dev: false - /@vercel/analytics@1.1.2: - resolution: {integrity: sha512-CodhkLCQ/EHzjX8k+Qg+OzTBY0UadykrcfolfSOJVZZY/ZJM5nbhztm9KdbYvMfqKlasAr1+OYy0ThZnDA/MYA==} + /@vercel/analytics@1.2.2(next@14.1.0)(react@18.2.0): + resolution: {integrity: sha512-X0rctVWkQV1e5Y300ehVNqpOfSOufo7ieA5PIdna8yX/U7Vjz0GFsGf4qvAhxV02uQ2CVt7GYcrFfddXXK2Y4A==} + peerDependencies: + next: '>= 13' + react: ^18 || ^19 + peerDependenciesMeta: + next: + optional: true + react: + optional: true dependencies: + next: 14.1.0(react-dom@18.2.0)(react@18.2.0)(sass@1.71.1) + react: 18.2.0 server-only: 0.0.1 dev: false @@ -2969,7 +2993,7 @@ packages: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} dev: true - /autoprefixer@10.4.17(postcss@8.4.33): + /autoprefixer@10.4.17(postcss@8.4.35): resolution: {integrity: sha512-/cpVNRLSfhOtcGflT13P2794gVSgmPgTR+erw5ifnMLZb0UnSlkK4tquLmkd3BhA+nLo5tX8Cu0upUsGKvKbmg==} engines: {node: ^10 || ^12 || >=14} hasBin: true @@ -2981,7 +3005,7 @@ packages: fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.0.0 - postcss: 8.4.33 + postcss: 8.4.35 postcss-value-parser: 4.2.0 dev: true @@ -3332,20 +3356,10 @@ packages: wrap-ansi: 7.0.0 dev: true - /cloudinary-core@2.13.0(lodash@4.17.21): - resolution: {integrity: sha512-Nt0Q5I2FtenmJghtC4YZ3MZZbGg1wLm84SsxcuVwZ83OyJqG9CNIGp86CiI6iDv3QobaqBUpOT7vg+HqY5HxEA==} - peerDependencies: - lodash: '>=4.0' - dependencies: - lodash: 4.17.21 - dev: false - - /cloudinary@1.41.3: - resolution: {integrity: sha512-4o84y+E7dbif3lMns+p3UW6w6hLHEifbX/7zBJvaih1E9QNMZITENQ14GPYJC4JmhygYXsuuBb9bRA3xWEoOfg==} - engines: {node: '>=0.6'} + /cloudinary@2.0.1: + resolution: {integrity: sha512-+j5GswtCwjAmLhjs/K26id4Zvh53zL/YWzgyenxgbdXdXmdFM8d5H1FV1sJCkpS77AqylJKBzyztySdILM+F+A==} + engines: {node: '>=9'} dependencies: - cloudinary-core: 2.13.0(lodash@4.17.21) - core-js: 3.35.0 lodash: 4.17.21 q: 1.5.1 dev: false @@ -3476,11 +3490,6 @@ packages: browserslist: 4.22.2 dev: true - /core-js@3.35.0: - resolution: {integrity: sha512-ntakECeqg81KqMueeGJ79Q5ZgQNR+6eaE8sxGCx62zMbAIj65q+uYvatToew3m6eAGdU4gNZwpZ34NMe4GYswg==} - requiresBuild: true - dev: false - /core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} dev: true @@ -6666,7 +6675,7 @@ packages: react: '>=16.0.0' react-dom: '>=16.0.0' dependencies: - next: 14.1.0(react-dom@18.2.0)(react@18.2.0)(sass@1.70.0) + next: 14.1.0(react-dom@18.2.0)(react@18.2.0)(sass@1.71.1) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false @@ -6678,7 +6687,7 @@ packages: react: '*' react-dom: '*' dependencies: - next: 14.1.0(react-dom@18.2.0)(react@18.2.0)(sass@1.70.0) + next: 14.1.0(react-dom@18.2.0)(react@18.2.0)(sass@1.71.1) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false @@ -6722,7 +6731,7 @@ packages: - babel-plugin-macros dev: false - /next@14.1.0(react-dom@18.2.0)(react@18.2.0)(sass@1.70.0): + /next@14.1.0(react-dom@18.2.0)(react@18.2.0)(sass@1.71.1): resolution: {integrity: sha512-wlzrsbfeSU48YQBjZhDzOwhWhGsy+uQycR8bHAOt1LY1bn3zZEcDyHQOEoN3aWzQ8LHCAJ1nqrWCc9XF2+O45Q==} engines: {node: '>=18.17.0'} hasBin: true @@ -6745,7 +6754,7 @@ packages: postcss: 8.4.31 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - sass: 1.70.0 + sass: 1.71.1 styled-jsx: 5.1.1(@babel/core@7.23.7)(react@18.2.0) optionalDependencies: '@next/swc-darwin-arm64': 14.1.0 @@ -6768,17 +6777,17 @@ packages: next: '>=11.0.0' react: '>=17.0.0' dependencies: - next: 14.1.0(react-dom@18.2.0)(react@18.2.0)(sass@1.70.0) + next: 14.1.0(react-dom@18.2.0)(react@18.2.0)(sass@1.71.1) react: 18.2.0 optionalDependencies: fsevents: 2.3.3 dev: false - /nextra-theme-docs@2.13.2(next@14.1.0)(nextra@2.13.2)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-yE4umXaImp1/kf/sFciPj2+EFrNSwd9Db26hi98sIIiujzGf3+9eUgAz45vF9CwBw50FSXxm1QGRcY+slQ4xQQ==} + /nextra-theme-docs@2.13.3(next@14.1.0)(nextra@2.13.3)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-B6xrnR86Gg4GzV56AomSwtmvSyAvnJz1xKOGGav1XKxkwvC8QeI17jdt/CqiKyIObJ+5bLqSFiKhaAZ5DYQP3g==} peerDependencies: next: '>=9.5.3' - nextra: 2.13.2 + nextra: 2.13.3 react: '>=16.13.1' react-dom: '>=16.13.1' dependencies: @@ -6791,18 +6800,18 @@ packages: git-url-parse: 13.1.1 intersection-observer: 0.12.2 match-sorter: 6.3.3 - next: 14.1.0(react-dom@18.2.0)(react@18.2.0)(sass@1.70.0) + next: 14.1.0(react-dom@18.2.0)(react@18.2.0)(sass@1.71.1) next-seo: 6.4.0(next@14.1.0)(react-dom@18.2.0)(react@18.2.0) next-themes: 0.2.1(next@14.1.0)(react-dom@18.2.0)(react@18.2.0) - nextra: 2.13.2(next@14.1.0)(react-dom@18.2.0)(react@18.2.0) + nextra: 2.13.3(next@14.1.0)(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) scroll-into-view-if-needed: 3.1.0 zod: 3.22.4 dev: false - /nextra@2.13.2(next@14.1.0)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-pIgOSXNUqTz1laxV4ChFZOU7lzJAoDHHaBPj8L09PuxrLKqU1BU/iZtXAG6bQeKCx8EPdBsoXxEuENnL9QGnGA==} + /nextra@2.13.3(next@14.1.0)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-OBVuyQKh+oqrbVt0AosgNYnuReWuNrtJVEN7q18b/oEg2wEpuiq3UJfmIvGgOdNYc3zv3OYrzbcq7IhwtdHHEw==} engines: {node: '>=16'} peerDependencies: next: '>=9.5.3' @@ -6821,7 +6830,7 @@ packages: gray-matter: 4.0.3 katex: 0.16.9 lodash.get: 4.4.2 - next: 14.1.0(react-dom@18.2.0)(react@18.2.0)(sass@1.70.0) + next: 14.1.0(react-dom@18.2.0)(react@18.2.0)(sass@1.71.1) next-mdx-remote: 4.4.1(react-dom@18.2.0)(react@18.2.0) p-limit: 3.1.0 react: 18.2.0 @@ -7372,29 +7381,29 @@ packages: find-up: 4.1.0 dev: true - /postcss-import@15.1.0(postcss@8.4.33): + /postcss-import@15.1.0(postcss@8.4.35): resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} engines: {node: '>=14.0.0'} peerDependencies: postcss: ^8.0.0 dependencies: - postcss: 8.4.33 + postcss: 8.4.35 postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.8 dev: true - /postcss-js@4.0.1(postcss@8.4.33): + /postcss-js@4.0.1(postcss@8.4.35): resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} engines: {node: ^12 || ^14 || >= 16} peerDependencies: postcss: ^8.4.21 dependencies: camelcase-css: 2.0.1 - postcss: 8.4.33 + postcss: 8.4.35 dev: true - /postcss-load-config@4.0.2(postcss@8.4.33): + /postcss-load-config@4.0.2(postcss@8.4.35): resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} engines: {node: '>= 14'} peerDependencies: @@ -7407,17 +7416,17 @@ packages: optional: true dependencies: lilconfig: 3.0.0 - postcss: 8.4.33 + postcss: 8.4.35 yaml: 2.3.4 dev: true - /postcss-nested@6.0.1(postcss@8.4.33): + /postcss-nested@6.0.1(postcss@8.4.35): resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} engines: {node: '>=12.0'} peerDependencies: postcss: ^8.2.14 dependencies: - postcss: 8.4.33 + postcss: 8.4.35 postcss-selector-parser: 6.0.15 dev: true @@ -7442,8 +7451,8 @@ packages: source-map-js: 1.0.2 dev: false - /postcss@8.4.33: - resolution: {integrity: sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==} + /postcss@8.4.35: + resolution: {integrity: sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==} engines: {node: ^10 || ^12 || >=14} dependencies: nanoid: 3.3.7 @@ -7534,8 +7543,8 @@ packages: scheduler: 0.23.0 dev: false - /react-icons@4.12.0(react@18.2.0): - resolution: {integrity: sha512-IBaDuHiShdZqmfc/TwHu6+d6k2ltNCf3AszxNmjJc1KUfXdEeRJOKyNvLmAHaarhzGmTSVygNdyu8/opXv2gaw==} + /react-icons@5.0.1(react@18.2.0): + resolution: {integrity: sha512-WqLZJ4bLzlhmsvme6iFdgO8gfZP17rfjYEJ2m9RsZjZ+cc4k1hTzknEz63YS1MeT50kVzoa1Nz36f4BEx+Wigw==} peerDependencies: react: '*' dependencies: @@ -7867,8 +7876,8 @@ packages: /safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - /sass@1.70.0: - resolution: {integrity: sha512-uUxNQ3zAHeAx5nRFskBnrWzDUJrrvpCPD5FNAoRvTi0WwremlheES3tg+56PaVtCs5QDRX5CBLxxKMDJMEa1WQ==} + /sass@1.71.1: + resolution: {integrity: sha512-wovtnV2PxzteLlfNzbgm1tFXPLoZILYAMJtvoXXkD7/+1uP41eKkIt1ypWq5/q2uT94qHjXehEYfmjKOvjL9sg==} engines: {node: '>=14.0.0'} hasBin: true dependencies: @@ -8323,6 +8332,12 @@ packages: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} dev: true + /tailwind-merge@2.2.1: + resolution: {integrity: sha512-o+2GTLkthfa5YUt4JxPfzMIpQzZ3adD1vLVkvKE1Twl9UAhGsEbIZhHHZVRttyW177S8PDJI3bTQNaebyofK3Q==} + dependencies: + '@babel/runtime': 7.23.8 + dev: false + /tailwindcss@3.4.1: resolution: {integrity: sha512-qAYmXRfk3ENzuPBakNK0SRrUDipP8NQnEY6772uDhflcQz5EhRdD7JNZxyrFHVQNCwULPBn6FNPp9brpO7ctcA==} engines: {node: '>=14.0.0'} @@ -8342,11 +8357,11 @@ packages: normalize-path: 3.0.0 object-hash: 3.0.0 picocolors: 1.0.0 - postcss: 8.4.33 - postcss-import: 15.1.0(postcss@8.4.33) - postcss-js: 4.0.1(postcss@8.4.33) - postcss-load-config: 4.0.2(postcss@8.4.33) - postcss-nested: 6.0.1(postcss@8.4.33) + postcss: 8.4.35 + postcss-import: 15.1.0(postcss@8.4.35) + postcss-js: 4.0.1(postcss@8.4.35) + postcss-load-config: 4.0.2(postcss@8.4.35) + postcss-nested: 6.0.1(postcss@8.4.35) postcss-selector-parser: 6.0.15 resolve: 1.22.8 sucrase: 3.35.0 @@ -8567,7 +8582,7 @@ packages: execa: 5.1.1 globby: 11.1.0 joycon: 3.1.1 - postcss-load-config: 4.0.2(postcss@8.4.33) + postcss-load-config: 4.0.2(postcss@8.4.35) resolve-from: 5.0.0 rollup: 4.9.5 source-map: 0.8.0-beta.0