From 2115f103b6e4ca5fef51b02d79f428ada84c7153 Mon Sep 17 00:00:00 2001 From: Augustin Mauroy Date: Fri, 7 Feb 2025 11:40:18 +0100 Subject: [PATCH 01/15] Website fundamental (#2) Co-authored-by: Jacob Smith <3012099+JakobJingleheimer@users.noreply.github.com> --- .editorconfig | 21 + .gitattributes | 2 + .github/workflows/deploy.yaml | 76 + .gitignore | 33 + .nvmrc | 1 + .vscode/extensions.json | 3 + .vscode/settings.json | 11 + README.md | 28 + TODO.md | 18 + app/article/[[...categories]]/page.module.css | 44 + app/article/[[...categories]]/page.tsx | 76 + app/article/post/[article]/page.module.css | 5 + app/article/post/[article]/page.tsx | 49 + app/layout.tsx | 17 + app/not-found.tsx | 6 + app/page.tsx | 12 + app/robots.ts | 14 + biome.jsonc | 80 + .../Common/AuthorsList/index.module.css | 5 + components/Common/AuthorsList/index.tsx | 27 + components/Common/Avatar/index.module.css | 40 + components/Common/Avatar/index.tsx | 49 + components/Common/Button/Link/index.tsx | 22 + components/Common/Button/index.module.css | 73 + components/Common/Button/index.tsx | 24 + .../CategoriesSelector/index.module.css | 31 + .../Common/CategoriesSelector/index.test.tsx | 53 + .../index.test.tsx.snapshot | 7 + .../Common/CategoriesSelector/index.tsx | 33 + components/Icons/Github.tsx | 17 + components/Icons/Logo.tsx | 33 + components/Icons/NPM.tsx | 17 + components/Landing/Hero/index.module.css | 41 + components/Landing/Hero/index.tsx | 29 + .../LastestArticleSection/index.module.css | 26 + .../Landing/LastestArticleSection/index.tsx | 13 + components/Post/ArticleCard/index.module.css | 55 + components/Post/ArticleCard/index.test.tsx | 40 + .../Post/ArticleCard/index.test.tsx.snapshot | 7 + components/Post/ArticleCard/index.tsx | 31 + .../Post/ArticleHeader/index.module.css | 18 + components/Post/ArticleHeader/index.tsx | 21 + .../Post/LastestArticle/index.module.css | 12 + components/Post/LastestArticle/index.tsx | 32 + components/Sections/Header/index.module.css | 52 + components/Sections/Header/index.tsx | 42 + components/Sections/NotFound/index.module.css | 20 + components/Sections/NotFound/index.tsx | 11 + content/post/what-is-nodejs-loaders.mdx | 10 + lib/content.ts | 40 + lib/post.ts | 30 + next.config.ts | 11 + package-lock.json | 6811 +++++++++++++++++ package.json | 47 + postcss.config.js | 10 + registers/react.ts | 10 + styles/globals.css | 16 + styles/markdown.css | 173 + tailwind.config.ts | 28 + tsconfig.json | 33 + types/frontmatter.ts | 7 + utils/gitHubUtils.ts | 5 + utils/postUtils.ts | 1 + utils/stringUtils.ts | 2 + utils/tests/gitHubUtils.test.ts | 31 + utils/tests/postUtils.test.ts | 28 + utils/tests/stringUtils.test.ts | 28 + 67 files changed, 8698 insertions(+) create mode 100644 .editorconfig create mode 100644 .gitattributes create mode 100644 .github/workflows/deploy.yaml create mode 100644 .gitignore create mode 100644 .nvmrc create mode 100644 .vscode/extensions.json create mode 100644 .vscode/settings.json create mode 100644 TODO.md create mode 100644 app/article/[[...categories]]/page.module.css create mode 100644 app/article/[[...categories]]/page.tsx create mode 100644 app/article/post/[article]/page.module.css create mode 100644 app/article/post/[article]/page.tsx create mode 100644 app/layout.tsx create mode 100644 app/not-found.tsx create mode 100644 app/page.tsx create mode 100644 app/robots.ts create mode 100644 biome.jsonc create mode 100644 components/Common/AuthorsList/index.module.css create mode 100644 components/Common/AuthorsList/index.tsx create mode 100644 components/Common/Avatar/index.module.css create mode 100644 components/Common/Avatar/index.tsx create mode 100644 components/Common/Button/Link/index.tsx create mode 100644 components/Common/Button/index.module.css create mode 100644 components/Common/Button/index.tsx create mode 100644 components/Common/CategoriesSelector/index.module.css create mode 100644 components/Common/CategoriesSelector/index.test.tsx create mode 100644 components/Common/CategoriesSelector/index.test.tsx.snapshot create mode 100644 components/Common/CategoriesSelector/index.tsx create mode 100644 components/Icons/Github.tsx create mode 100644 components/Icons/Logo.tsx create mode 100644 components/Icons/NPM.tsx create mode 100644 components/Landing/Hero/index.module.css create mode 100644 components/Landing/Hero/index.tsx create mode 100644 components/Landing/LastestArticleSection/index.module.css create mode 100644 components/Landing/LastestArticleSection/index.tsx create mode 100644 components/Post/ArticleCard/index.module.css create mode 100644 components/Post/ArticleCard/index.test.tsx create mode 100644 components/Post/ArticleCard/index.test.tsx.snapshot create mode 100644 components/Post/ArticleCard/index.tsx create mode 100644 components/Post/ArticleHeader/index.module.css create mode 100644 components/Post/ArticleHeader/index.tsx create mode 100644 components/Post/LastestArticle/index.module.css create mode 100644 components/Post/LastestArticle/index.tsx create mode 100644 components/Sections/Header/index.module.css create mode 100644 components/Sections/Header/index.tsx create mode 100644 components/Sections/NotFound/index.module.css create mode 100644 components/Sections/NotFound/index.tsx create mode 100644 content/post/what-is-nodejs-loaders.mdx create mode 100644 lib/content.ts create mode 100644 lib/post.ts create mode 100644 next.config.ts create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 postcss.config.js create mode 100644 registers/react.ts create mode 100644 styles/globals.css create mode 100644 styles/markdown.css create mode 100644 tailwind.config.ts create mode 100644 tsconfig.json create mode 100644 types/frontmatter.ts create mode 100644 utils/gitHubUtils.ts create mode 100644 utils/postUtils.ts create mode 100644 utils/stringUtils.ts create mode 100644 utils/tests/gitHubUtils.test.ts create mode 100644 utils/tests/postUtils.test.ts create mode 100644 utils/tests/stringUtils.test.ts diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..e4fe23b --- /dev/null +++ b/.editorconfig @@ -0,0 +1,21 @@ +root = true + +[*] +indent_style = tab +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true +tab_width = 4 + +[*.json] +indent_style = space +indent_size = 2 +max_line_length = 50 + +[*.{yaml,yml}] +indent_style = space + +[*.css] +indent_style = tab +ident_size = 2 diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..5a0d5e4 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# Auto detect text files and perform LF normalization +* text=auto eol=lf diff --git a/.github/workflows/deploy.yaml b/.github/workflows/deploy.yaml new file mode 100644 index 0000000..d0949a8 --- /dev/null +++ b/.github/workflows/deploy.yaml @@ -0,0 +1,76 @@ +# yaml-language-server: $schema=https://json.schemastore.org/github-workflow.json + +name: Build and Deploy to GitHub Pages + +on: + push: + branches: + - main + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +permissions: + contents: read + pages: write + id-token: write + +jobs: + build: + name: Build for GitHub Pages + runs-on: ubuntu-latest + + steps: + - name: Git Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 2 + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version-file: '.nvmrc' + cache: npm + + - name: Install NPM packages + run: npm ci + + - name: Setup GitHub Pages + uses: actions/configure-pages@v5 + + - name: Restore Cache + uses: actions/cache/restore@v4 + with: + path: .next/cache + key: build-${{ hashFiles('**/package-lock.json') }} + restore-keys: | + build-${{ hashFiles('**/package-lock.json') }} + enableCrossOsArchive: true + + - name: Build Next.js + run: node --run build + - name: Save Cache + uses: actions/cache/save@v4 + with: + path: .next/cache + key: build-${{ hashFiles('**/package-lock.json') }} + enableCrossOsArchive: true + + - name: Upload Artifact + uses: actions/upload-pages-artifact@v3 + with: + path: ./out # next.js build output + + deploy: + name: Deploy to GitHub Pages + runs-on: ubuntu-latest + needs: build + + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..69d7996 --- /dev/null +++ b/.gitignore @@ -0,0 +1,33 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store + +# private keys +*.pem + +# debug +*.log* + +# local env files +.env*.local + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts + +# Test coverage +coverage.lcov diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 0000000..4099407 --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +23 diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..699ed73 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["biomejs.biome"] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..b8156a4 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,11 @@ +{ + "editor.formatOnSave": true, + "javascript.updateImportsOnFileMove.enabled": "always", + "typescript.updateImportsOnFileMove.enabled": "always", + "editor.formatOnPaste": true, + "editor.wordWrap": "wordWrapColumn", + "editor.wordWrapColumn": 100, + "[markdown]": { + "editor.wordWrap": "off" + } +} diff --git a/README.md b/README.md index 39186d3..65e246c 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,30 @@ # nodejs-loaders.github.io + A showcase website for the `nodejs-loader` project + +## Development + +THis will start a development server on `http://localhost:3000`. + +```bash +npm install +node --run dev +``` + +## Build + +This will build the website into the `out` directory. + +```bash +npm ci +node --run build +``` + +## Preview + +This environment simulates what will be deployed to github pages. + +```bash +npm ci +node --run preview +``` diff --git a/TODO.md b/TODO.md new file mode 100644 index 0000000..3e00985 --- /dev/null +++ b/TODO.md @@ -0,0 +1,18 @@ +# TODO: + +- Write the `what-is-nodejs-loaders` post +- Write a "how to digest a nodejs-loader" post +- Write a use case for react unit testing can be based on https://augustinmauroy.github.io/en/blog/post/how-to-test-react-app-with-node-test-runner +- Write use case how to handle diffent jsx than react +- CI with GA for pr +- Add documentation of the project (this repo) +- Add a `CONTRIBUTING.md` file +- Design OG image for the project +- Create engine to generate static OG images +- `sitemap.xml` generation +- `rss` feed generation +- Add GH pr template +- Add GH issue template +- Add openSSF scorecard +- Add dependabot +- Add metata (title, description) _SEO_ diff --git a/app/article/[[...categories]]/page.module.css b/app/article/[[...categories]]/page.module.css new file mode 100644 index 0000000..af73dfb --- /dev/null +++ b/app/article/[[...categories]]/page.module.css @@ -0,0 +1,44 @@ +.page { + @apply container + mx-auto + px-4 + py-8; + + h1 { + @apply mb-4 + font-bold + text-3xl + lg:text-4xl; + } + + p { + @apply mb-4 + max-w-screen-md + text-gray-500 + dark:text-gray-400; + } + + .noArticles { + @apply mt-8; + + p { + @apply bg-gradient-to-r + from-green-300 + to-green-800 + bg-clip-text + text-center + font-black + text-3xl + text-transparent; + } + + .Articles { + @apply grid + grid-cols-1 + justify-center + gap-4 + md:grid-cols-2 + lg:grid-cols-3; + } + } +} diff --git a/app/article/[[...categories]]/page.tsx b/app/article/[[...categories]]/page.tsx new file mode 100644 index 0000000..83750c7 --- /dev/null +++ b/app/article/[[...categories]]/page.tsx @@ -0,0 +1,76 @@ +import { CategoriesSelector } from '~/components/Common/CategoriesSelector/index.tsx'; +import { ArticleCard } from '~/components/Post/ArticleCard/index.tsx'; +import { getPostsMetadata } from '~/lib/post.ts'; +import styles from './page.module.css'; +import type { FC } from 'react'; + +type CategoriesParams = { + categories?: string[]; +}; + +type PageProps = { + params: Promise; +}; + +/** + * List of available categories + */ +const CATEGORIES = [ + { + category: 'All articles', + slug: '', + }, + { + category: 'Information', + slug: 'information', + }, + { + category: 'Use cases', + slug: 'use-cases', + }, + { + category: 'Releases', + slug: 'releases', + }, +]; + +export const generateStaticParams = () => { + const params = [ + { categories: [] }, // For the base route without any categories + ...CATEGORIES.slice(1).map(category => ({ categories: [category.slug] })), // For each individual category + ]; + + return params; +}; + +const Page: FC = async ({ params }) => { + const currentCategories = (await params).categories || []; + const postsMetadata = await getPostsMetadata(currentCategories[0]); + + return ( +
+

Article list

+

+ Here you can find all the articles available on the website. You can + filter them by category using the dropdown below. +

+ + {postsMetadata.length === 0 ? ( +
+

No articles here for now

+
+ ) : ( +
+ {postsMetadata.map(post => ( + + ))} +
+ )} +
+ ); +}; + +export default Page; diff --git a/app/article/post/[article]/page.module.css b/app/article/post/[article]/page.module.css new file mode 100644 index 0000000..2057ca7 --- /dev/null +++ b/app/article/post/[article]/page.module.css @@ -0,0 +1,5 @@ +.page { + @apply container + mx-auto + px-4; +} diff --git a/app/article/post/[article]/page.tsx b/app/article/post/[article]/page.tsx new file mode 100644 index 0000000..6e7c695 --- /dev/null +++ b/app/article/post/[article]/page.tsx @@ -0,0 +1,49 @@ +import { notFound } from 'next/navigation'; +import { getContent } from '~/lib/content.ts'; +import { getAllPosts } from '~/lib/post.ts'; +import { ArticleHeader } from '~/components/Post/ArticleHeader/index.tsx'; +import styles from './page.module.css'; +import type { FC } from 'react'; +import type { PostFrontmatter } from '~/types/frontmatter'; +import '~/styles/markdown.css'; + +type PostParams = { + article: string; +}; + +type PageProps = { + params: Promise; +}; + +export async function generateStaticParams() { + const posts = await getAllPosts(); + + return posts.map(post => { + const article = post.split('.').slice(0, -1).join('.'); + return { article }; + }); +} + +const Page: FC = async ({ params }) => { + const article = (await params).article; + const slugs = ['post', article]; + + const mdxResult = await getContent(slugs); + + if (!mdxResult) notFound(); + + const { content, frontmatter } = mdxResult; + + return ( +
+ +
{content}
+
+ ); +}; + +export default Page; diff --git a/app/layout.tsx b/app/layout.tsx new file mode 100644 index 0000000..55a2fe7 --- /dev/null +++ b/app/layout.tsx @@ -0,0 +1,17 @@ +import classNames from 'classnames'; +import { GeistSans } from 'geist/font/sans'; +import { GeistMono } from 'geist/font/mono'; +import { Header } from '~/components/Sections/Header/index.tsx'; +import type { FC, PropsWithChildren } from 'react'; +import '~/styles/globals.css'; + +const RootLayout: FC = ({ children }) => ( + + +
+ {children} + + +); + +export default RootLayout; diff --git a/app/not-found.tsx b/app/not-found.tsx new file mode 100644 index 0000000..f90418f --- /dev/null +++ b/app/not-found.tsx @@ -0,0 +1,6 @@ +import { NotFoundSection } from '~/components/Sections/NotFound'; +import type { FC } from 'react'; + +const NotFoundPage: FC = () => ; + +export default NotFoundPage; diff --git a/app/page.tsx b/app/page.tsx new file mode 100644 index 0000000..13a66b2 --- /dev/null +++ b/app/page.tsx @@ -0,0 +1,12 @@ +import { Hero } from '~/components/Landing/Hero/index.tsx'; +import { LatestArticleSection } from '~/components/Landing/LatestArticleSection/index.tsx'; +import type { FC } from 'react'; + +const Page: FC = () => ( +
+ + +
+); + +export default Page; diff --git a/app/robots.ts b/app/robots.ts new file mode 100644 index 0000000..ade3d21 --- /dev/null +++ b/app/robots.ts @@ -0,0 +1,14 @@ +import type { MetadataRoute } from 'next'; + +// Enforce static generation for robots.txt +export const dynamic = 'force-static'; + +export default function robots(): MetadataRoute.Robots { + return { + rules: { + userAgent: '*', + allow: '/', + }, + host: 'https://nodejs-loaders.github.io', + }; +} diff --git a/biome.jsonc b/biome.jsonc new file mode 100644 index 0000000..4b14939 --- /dev/null +++ b/biome.jsonc @@ -0,0 +1,80 @@ +{ + "$schema": "https://biomejs.dev/schemas/1.9.4/schema.json", + "files": { + "include": ["**/*.ts", "**/*.tsx", "**/*.js", "**/*.css", "**/*.json"], + "ignore": ["./node_modules", "./.next", "./out"] + }, + "formatter": { + "enabled": true, + "useEditorconfig": true + }, + "linter": { + "rules": { + "recommended": false, + "nursery": { + "useSortedClasses": "error", + "noCommonJs": "error", + "noEnum": "error", + "noUnknownTypeSelector": "error" + }, + "complexity": { + "noUselessThisAlias": "error", + "noUselessTypeConstraint": "error" + }, + "correctness": { + "noUnusedVariables": "error", + "useArrayLiterals": "off", + "noUnknownFunction": "error", + "noUnknownUnit": "error", + "useImportExtensions": "error" + }, + "style": { + "noNamespace": "error", + "useAsConstAssertion": "error", + "useBlockStatements": "off", + "useNodeAssertStrict": "warn", + "useNodejsImportProtocol": "error", + "useImportType": "error" + }, + "suspicious": { + "noExplicitAny": "error", + "noExtraNonNullAssertion": "error", + "noMisleadingInstantiator": "error", + "noUnsafeDeclarationMerging": "error", + "useNamespaceKeyword": "error", + "noEmptyBlock": "error", + "noDuplicateAtImportRules": "error", + "noDuplicateObjectKeys": "error" + } + } + }, + "javascript": { + "formatter": { + "jsxQuoteStyle": "double", + "quoteProperties": "asNeeded", + "trailingCommas": "es5", + "semicolons": "always", + "arrowParentheses": "asNeeded", + "bracketSameLine": false, + "quoteStyle": "single", + "attributePosition": "auto", + "bracketSpacing": true + } + }, + "css": { + "linter": { + "enabled": true + }, + "formatter": { + "enabled": true + }, + "parser": { + "cssModules": true + } + }, + "json": { + "formatter": { + "enabled": true + } + } +} diff --git a/components/Common/AuthorsList/index.module.css b/components/Common/AuthorsList/index.module.css new file mode 100644 index 0000000..09d3043 --- /dev/null +++ b/components/Common/AuthorsList/index.module.css @@ -0,0 +1,5 @@ +.wrapper { + @apply flex + space-x-2 + py-2; +} diff --git a/components/Common/AuthorsList/index.tsx b/components/Common/AuthorsList/index.tsx new file mode 100644 index 0000000..8d43f11 --- /dev/null +++ b/components/Common/AuthorsList/index.tsx @@ -0,0 +1,27 @@ +import { getGitHubAvatarUrl, getGithubProfileUrl } from '~/utils/gitHubUtils'; +import { getAcronymFromString } from '~/utils/stringUtils'; +import { Avatar, AvatarImage, AvatarFallback } from '../Avatar/index.tsx'; +import styles from './index.module.css'; +import type { FC } from 'react'; + +type AuthorsListProps = { + // xxx, yyy, zzz + authors: string; +}; + +export const AuthorsList: FC = ({ authors }) => { + const authorsList = authors.split(', ').map(author => ( + + + + {getAcronymFromString(author)} + + + )); + + return
{authorsList}
; +}; diff --git a/components/Common/Avatar/index.module.css b/components/Common/Avatar/index.module.css new file mode 100644 index 0000000..2355bde --- /dev/null +++ b/components/Common/Avatar/index.module.css @@ -0,0 +1,40 @@ +.root { + @apply flex + size-10 + shrink-0 + overflow-hidden + rounded-md + outline + outline-2 + outline-green-300 + dark:outline-green-800 + shadow-sm + transition-shadow + shadow-green-300 + dark:shadow-green-800; + + &:has(.image):hover { + @apply shadow-md + shadow-green-400 + dark:shadow-green-700; + } +} + +.image { + @apply aspect-square + size-full; +} + +.fallback { + @apply flex + size-full + items-center + justify-center + rounded-md + bg-green-100 + text-base + font-bold + text-black + dark:bg-green-800 + dark:text-white; +} diff --git a/components/Common/Avatar/index.tsx b/components/Common/Avatar/index.tsx new file mode 100644 index 0000000..8909dd2 --- /dev/null +++ b/components/Common/Avatar/index.tsx @@ -0,0 +1,49 @@ +'use client'; +import * as AvatarPrimitive from '@radix-ui/react-avatar'; +import classNames from 'classnames'; +import styles from './index.module.css'; +import type { ComponentProps } from 'react'; + +const Avatar = ({ + className, + ref, + ...props +}: ComponentProps) => ( + +); + +Avatar.displayName = AvatarPrimitive.Root.displayName; + +const AvatarImage = ({ + className, + ref, + ...props +}: ComponentProps) => ( + +); + +AvatarImage.displayName = AvatarPrimitive.Image.displayName; + +const AvatarFallback = ({ + className, + ref, + ...props +}: ComponentProps) => ( + +); + +AvatarFallback.displayName = AvatarPrimitive.Fallback.displayName; + +export { Avatar, AvatarImage, AvatarFallback }; diff --git a/components/Common/Button/Link/index.tsx b/components/Common/Button/Link/index.tsx new file mode 100644 index 0000000..e27495a --- /dev/null +++ b/components/Common/Button/Link/index.tsx @@ -0,0 +1,22 @@ +import Link from 'next/link'; +import classNames from 'classnames'; +import styles from '../index.module.css'; +import type { FC, ComponentProps } from 'react'; + +type ButtonLinkProps = ComponentProps & { + kind?: 'primary' | 'secondary' | 'special'; +}; + +export const ButtonLink: FC = ({ + children, + className, + kind = 'primary', + ...props +}) => ( + + {children} + +); diff --git a/components/Common/Button/index.module.css b/components/Common/Button/index.module.css new file mode 100644 index 0000000..ecd33e2 --- /dev/null +++ b/components/Common/Button/index.module.css @@ -0,0 +1,73 @@ +.button { + @apply rounded + inline-flex + items-center + justify-center + gap-2 + px-4 + py-2 + transition + duration-300 + ease-in-out; + + &:focus { + @apply outline-none; + } + + svg { + @apply size-5; + } +} + +.primary { + @apply border-2 + border-solid + border-transparent + bg-green-500 + text-white + dark:bg-green-400 + dark:text-gray-900; + + &:hover { + @apply border-gray-600 + bg-transparent + text-gray-600 + dark:text-gray-300 + dark:border-gray-300; + } +} + +.secondary { + @apply border-2 + border-solid + border-transparent + bg-gray-600 + text-white + dark:bg-gray-300 + dark:text-gray-900; + + &:hover { + @apply border-gray-600 + bg-transparent + text-gray-600 + dark:text-gray-300 + dark:border-gray-300; + } +} + +.special { + @apply border-2 + border-solid + border-gray-600 + bg-transparent + text-gray-600 + dark:text-gray-300 + dark:border-gray-300; + + &:hover { + @apply bg-green-500 + text-white + dark:bg-green-400 + dark:text-gray-900; + } +} diff --git a/components/Common/Button/index.tsx b/components/Common/Button/index.tsx new file mode 100644 index 0000000..d80443c --- /dev/null +++ b/components/Common/Button/index.tsx @@ -0,0 +1,24 @@ +import classNames from 'classnames'; +import styles from './index.module.css'; +import type { FC, ButtonHTMLAttributes } from 'react'; + +type ButtonProps = ButtonHTMLAttributes & { + kind?: 'primary' | 'secondary' | 'special'; +}; + +export const Button: FC = ({ + children, + disabled, + className, + kind = 'primary', + ...props +}) => ( + +); diff --git a/components/Common/CategoriesSelector/index.module.css b/components/Common/CategoriesSelector/index.module.css new file mode 100644 index 0000000..25867c6 --- /dev/null +++ b/components/Common/CategoriesSelector/index.module.css @@ -0,0 +1,31 @@ +.categoriesSelector { + @apply flex + space-x-2 + border-green-400 + border-b-4 + mb-4 + text-gray-800 + dark:text-gray-200 + dark:border-green-600; + + .item { + @apply flex + items-center + px-2 + py-1 + rounded-t-md + cursor-pointer + transition + duration-200 + hover:bg-green-400 + hover:text-white + dark:hover:bg-green-600 + dark:hover:text-white; + + &.active { + @apply bg-green-400 + text-white + dark:bg-green-600; + } + } +} diff --git a/components/Common/CategoriesSelector/index.test.tsx b/components/Common/CategoriesSelector/index.test.tsx new file mode 100644 index 0000000..0cc7cf6 --- /dev/null +++ b/components/Common/CategoriesSelector/index.test.tsx @@ -0,0 +1,53 @@ +import assert from 'node:assert/strict'; +import { describe, it } from 'node:test'; +import { render } from '@testing-library/react'; +import { CategoriesSelector } from './index.tsx'; + +const mockCategories = [ + { + slug: 'slug1', + category: 'category1', + }, + { + slug: 'slug2', + category: 'category2', + }, +]; + +const mockCurrentCategories = ['slug1']; + +describe('CategoriesSelector', () => { + it('should render with an active category', t => { + const { container, unmount } = render( + + ); + + t.assert.snapshot(container.innerHTML); + + unmount(); + }); + + it('should render with no active category', t => { + const { container, unmount } = render( + + ); + + t.assert.snapshot(container.innerHTML); + + unmount(); + }); + + it('should have active class for first category if no active category', () => { + const { container, unmount } = render( + + ); + const firstCategory = container.querySelector('.active'); + + assert.strictEqual(firstCategory?.textContent, 'category1'); + + unmount(); + }); +}); diff --git a/components/Common/CategoriesSelector/index.test.tsx.snapshot b/components/Common/CategoriesSelector/index.test.tsx.snapshot new file mode 100644 index 0000000..1719659 --- /dev/null +++ b/components/Common/CategoriesSelector/index.test.tsx.snapshot @@ -0,0 +1,7 @@ +exports[`CategoriesSelector > should render with an active category 1`] = ` +"" +`; + +exports[`CategoriesSelector > should render with no active category 1`] = ` +"" +`; diff --git a/components/Common/CategoriesSelector/index.tsx b/components/Common/CategoriesSelector/index.tsx new file mode 100644 index 0000000..8619928 --- /dev/null +++ b/components/Common/CategoriesSelector/index.tsx @@ -0,0 +1,33 @@ +import classNames from 'classnames'; +import styles from './index.module.css'; +import type { FC } from 'react'; + +type CategoriesSelectorProps = { + currentCategories: Array; + categories: Array<{ + slug: string; + category: string; + }>; +}; + +export const CategoriesSelector: FC = ({ + currentCategories, + categories, +}) => ( + +); diff --git a/components/Icons/Github.tsx b/components/Icons/Github.tsx new file mode 100644 index 0000000..ef62069 --- /dev/null +++ b/components/Icons/Github.tsx @@ -0,0 +1,17 @@ +import type { FC, SVGProps } from 'react'; + +export const GithubIcon: FC> = props => ( + + + +); diff --git a/components/Icons/Logo.tsx b/components/Icons/Logo.tsx new file mode 100644 index 0000000..78c283d --- /dev/null +++ b/components/Icons/Logo.tsx @@ -0,0 +1,33 @@ +import type { FC, SVGProps } from 'react'; + +export const Logo: FC> = props => ( + + + + + + +); diff --git a/components/Icons/NPM.tsx b/components/Icons/NPM.tsx new file mode 100644 index 0000000..981fd9e --- /dev/null +++ b/components/Icons/NPM.tsx @@ -0,0 +1,17 @@ +import type { FC, SVGProps } from 'react'; + +export const NPMIcon: FC> = props => ( + + + + + + + +); diff --git a/components/Landing/Hero/index.module.css b/components/Landing/Hero/index.module.css new file mode 100644 index 0000000..572174c --- /dev/null +++ b/components/Landing/Hero/index.module.css @@ -0,0 +1,41 @@ +.hero { + @apply flex + h-[calc(100vh-4rem)] + w-full + flex-col + items-center + justify-center + gap-8 + bg-gradient-to-b + from-transparent + via-green-50/50 + to-green-50 + px-10 + dark:from-transparent + dark:via-green-800/25 + dark:to-green-800; + + h1 { + @apply text-center + font-bold + text-4xl; + + code { + @apply rounded + bg-gray-200 + p-1 + dark:bg-gray-800 + dark:text-gray-200; + } + } + + p { + @apply text-center + dark:text-gray-200; + } + + .actions { + @apply flex + gap-4; + } +} diff --git a/components/Landing/Hero/index.tsx b/components/Landing/Hero/index.tsx new file mode 100644 index 0000000..2fe513a --- /dev/null +++ b/components/Landing/Hero/index.tsx @@ -0,0 +1,29 @@ +import { ButtonLink } from '~/components/Common/Button/Link/index.tsx'; +import { NPMIcon } from '~/components/Icons/NPM.tsx'; +import styles from './index.module.css'; +import type { FC } from 'react'; + +export const Hero: FC = () => ( +
+

+ Nodejs-Loaders - A collection of loaders for Node.js +

+

+ This project is a collection of loaders for Node.js. It's allow you to + have a lightweight and fast devlopment or testing environment. +

+
+ + Read more about us + + + Discover us on NPM{' '} + + +
+
+); + diff --git a/components/Landing/LastestArticleSection/index.module.css b/components/Landing/LastestArticleSection/index.module.css new file mode 100644 index 0000000..0bc64fc --- /dev/null +++ b/components/Landing/LastestArticleSection/index.module.css @@ -0,0 +1,26 @@ +.section { + @apply bg-green-50 + px-10 + py-8 + dark:bg-green-800; + + .header { + @apply mb-8 + border-gray-600 + border-b-2 + dark:border-gray-200; + + h2 { + @apply mb-2 + font-bold + text-3xl + dark:text-white; + } + + p { + @apply font-semibold + text-gray-600 + dark:text-gray-200; + } + } +} diff --git a/components/Landing/LastestArticleSection/index.tsx b/components/Landing/LastestArticleSection/index.tsx new file mode 100644 index 0000000..5d56afd --- /dev/null +++ b/components/Landing/LastestArticleSection/index.tsx @@ -0,0 +1,13 @@ +import { LastestArticle } from '~/components/Post/LastestArticle/index.tsx'; +import styles from './index.module.css'; +import type { FC } from 'react'; + +export const LatestArticleSection: FC = () => ( +
+
+

Lastes Articles

+

Discover the lastest articles about Nodejs-Loaders

+
+ +
+); diff --git a/components/Post/ArticleCard/index.module.css b/components/Post/ArticleCard/index.module.css new file mode 100644 index 0000000..baaf4dc --- /dev/null +++ b/components/Post/ArticleCard/index.module.css @@ -0,0 +1,55 @@ +.content { + @apply bg-white p-4 + rounded-md + max-w-96 + border-2 + border-gray-600 + dark:bg-gray-800 + dark:text-white + dark:border-gray-800; + + .title { + @apply text-2xl + font-bold + text-green-600 + mb-2 + dark:text-green-400; + + a { + @apply text-green-600 + hover:text-green-800 + dark:text-green-400 + dark:hover:text-green-300; + } + } + + .description { + @apply text-gray-700 + mb-2 + dark:text-gray-300 + font-medium; + } + + .meta { + @apply flex + justify-between + items-center + gap-1.5 + text-gray-500 + dark:text-gray-400; + + .author { + @apply text-gray-600 + dark:text-gray-300 + font-medium + truncate; + } + + .date { + @apply text-gray-600 + dark:text-gray-300 + font-thin + flex-shrink-0; + } + } +} diff --git a/components/Post/ArticleCard/index.test.tsx b/components/Post/ArticleCard/index.test.tsx new file mode 100644 index 0000000..db63794 --- /dev/null +++ b/components/Post/ArticleCard/index.test.tsx @@ -0,0 +1,40 @@ +import assert from 'node:assert/strict'; +import { describe, it } from 'node:test'; +import { render } from '@testing-library/react'; +import { ArticleCard } from './index.tsx'; +import type { ComponentProps } from 'react'; + +const mockPost = { + title: 'Test Title', + description: 'Test Description', + authors: 'Author1, Author2', + date: '2025-07-01', + slug: 'test-title', +} as ComponentProps; + +describe('ArticleCard', () => { + it('should render as a div by default', t => { + const { container, unmount } = render(); + const element = container.querySelector('div'); + + assert(element !== null, 'ArticleCard should render as a div by default'); + t.assert.snapshot(container.innerHTML); + + unmount(); + }); + + it('should render as a li when specified', t => { + const { container, unmount } = render( + + ); + const element = container.querySelector('li'); + + assert( + element !== null, + 'ArticleCard should render as a li when specified' + ); + t.assert.snapshot(container.innerHTML); + + unmount(); + }); +}); diff --git a/components/Post/ArticleCard/index.test.tsx.snapshot b/components/Post/ArticleCard/index.test.tsx.snapshot new file mode 100644 index 0000000..46b81e8 --- /dev/null +++ b/components/Post/ArticleCard/index.test.tsx.snapshot @@ -0,0 +1,7 @@ +exports[`ArticleCard > should render as a div by default 1`] = ` +"

Test Title

Test Description

Author1, Author22025-07-01
" +`; + +exports[`ArticleCard > should render as a li when specified 1`] = ` +"
  • Test Title

    Test Description

    Author1, Author22025-07-01
  • " +`; diff --git a/components/Post/ArticleCard/index.tsx b/components/Post/ArticleCard/index.tsx new file mode 100644 index 0000000..7a146fd --- /dev/null +++ b/components/Post/ArticleCard/index.tsx @@ -0,0 +1,31 @@ +import styles from './index.module.css'; +import { postSlug2Href } from '~/utils/postUtils.ts'; +import type { FC } from 'react'; +import type { PostFrontmatter } from '~/types/frontmatter.ts'; + +type ArticleCardProps = PostFrontmatter & { + slug: string; + as?: 'div' | 'li'; +}; + +export const ArticleCard: FC = ({ + title, + description, + authors, + date, + slug, + as: Component = 'div', +}) => ( + +

    + {title} +

    +

    {description}

    +
    + + {authors.split(',').slice(0, 2).join(', ')} + + {date} +
    +
    +); diff --git a/components/Post/ArticleHeader/index.module.css b/components/Post/ArticleHeader/index.module.css new file mode 100644 index 0000000..37a9483 --- /dev/null +++ b/components/Post/ArticleHeader/index.module.css @@ -0,0 +1,18 @@ +.header { + @apply my-8 + border-gray-200 + border-b-2 + dark:border-gray-800; + + h1 { + @apply font-bold + text-3xl + lg:text-4xl; + } + + p { + @apply text-gray-500 + text-lg + dark:text-gray-400; + } +} diff --git a/components/Post/ArticleHeader/index.tsx b/components/Post/ArticleHeader/index.tsx new file mode 100644 index 0000000..7764328 --- /dev/null +++ b/components/Post/ArticleHeader/index.tsx @@ -0,0 +1,21 @@ +import { AuthorsList } from '~/components/Common/AuthorsList/index.tsx'; +import styles from './index.module.css'; +import type { FC } from 'react'; + +type ArticleHeaderProps = { + title: string; + description: string; + authors: string; +}; + +export const ArticleHeader: FC = ({ + title, + description, + authors, +}) => ( +
    +

    {title}

    +

    {description}

    + +
    +); diff --git a/components/Post/LastestArticle/index.module.css b/components/Post/LastestArticle/index.module.css new file mode 100644 index 0000000..cb837c4 --- /dev/null +++ b/components/Post/LastestArticle/index.module.css @@ -0,0 +1,12 @@ +.wrapper { + @apply w-full; + + ul { + @apply flex + flex-col + items-center + justify-between + gap-4 + xl:flex-row; + } +} diff --git a/components/Post/LastestArticle/index.tsx b/components/Post/LastestArticle/index.tsx new file mode 100644 index 0000000..07c0833 --- /dev/null +++ b/components/Post/LastestArticle/index.tsx @@ -0,0 +1,32 @@ +import { getPostsMetadata } from '~/lib/post.ts'; +import { ArticleCard } from '../ArticleCard/index.tsx'; +import styles from './index.module.css'; +import type { FC } from 'react'; + +type LastestArticleProps = { + limit: number; +}; + +export const LastestArticle: FC = async ({ limit }) => { + const postsMetadata = await getPostsMetadata(); + + const usedPostsMetadata = postsMetadata.slice(0, limit).sort((a, b) => { + return new Date(b.date).getTime() - new Date(a.date).getTime(); + }); + + return ( +
    + {usedPostsMetadata.length === 0 ? ( +

    No posts found.

    + ) : ( +
      + {usedPostsMetadata.map(postMetadata => ( +
    • + +
    • + ))} +
    + )} +
    + ); +}; diff --git a/components/Sections/Header/index.module.css b/components/Sections/Header/index.module.css new file mode 100644 index 0000000..27810b9 --- /dev/null +++ b/components/Sections/Header/index.module.css @@ -0,0 +1,52 @@ +.header { + @apply border-b-2 + border-gray-600 + w-full + h-16 + px-4 + text-gray-600 + flex + justify-between + items-center + bg-gray-50 + dark:text-gray-300 + dark:bg-gray-900; + + .logo { + @apply cursor-pointer + rounded + py-0.5 + inline-flex + items-center + text-lg + gap-2 + px-1; + + &:hover { + @apply bg-gray-200 + dark:bg-gray-800; + } + } + + .nav { + @apply flex + items-center + gap-4; + + ul { + @apply flex + items-center + gap-4; + + li:has(a > svg) { + @apply p-1 + rounded-sm; + + &:hover { + @apply bg-gray-200 + dark:bg-gray-800; + } + } + } + } +} diff --git a/components/Sections/Header/index.tsx b/components/Sections/Header/index.tsx new file mode 100644 index 0000000..669ce3f --- /dev/null +++ b/components/Sections/Header/index.tsx @@ -0,0 +1,42 @@ +import Link from 'next/link'; +import { ButtonLink } from '~/components/Common/Button/Link/index.tsx'; +import { Logo } from '~/components/Icons/Logo.tsx'; +import { GithubIcon } from '~/components/Icons/Github.tsx'; +import styles from './index.module.css'; +import type { FC } from 'react'; + +const NAVIGATION = [ + { + href: '/article', + label: 'Article', + }, + { + href: '/#lastest-article', + label: 'Lastest Article', + }, +]; + +export const Header: FC = () => ( +
    + + + Nodejs-loaders + + +
    +); diff --git a/components/Sections/NotFound/index.module.css b/components/Sections/NotFound/index.module.css new file mode 100644 index 0000000..a4b7609 --- /dev/null +++ b/components/Sections/NotFound/index.module.css @@ -0,0 +1,20 @@ +.wrapper { + @apply flex + h-screen + flex-col + items-center + justify-center + gap-4; + + h1 { + @apply font-bold + text-4xl; + } + + p { + @apply mt-4 + text-gray-600 + text-lg + dark:text-gray-300; + } +} diff --git a/components/Sections/NotFound/index.tsx b/components/Sections/NotFound/index.tsx new file mode 100644 index 0000000..277b1f0 --- /dev/null +++ b/components/Sections/NotFound/index.tsx @@ -0,0 +1,11 @@ +import { ButtonLink } from '~/components/Common/Button/Link/index.tsx'; +import styles from './index.module.css'; +import type { FC } from 'react'; + +export const NotFoundSection: FC = () => ( +
    +

    404 - Page Not Found

    +

    The page you are looking for , does not exist.

    + Go to Home +
    +); diff --git a/content/post/what-is-nodejs-loaders.mdx b/content/post/what-is-nodejs-loaders.mdx new file mode 100644 index 0000000..49051f1 --- /dev/null +++ b/content/post/what-is-nodejs-loaders.mdx @@ -0,0 +1,10 @@ +--- +title: What is Nodejs-Loaders +description: Nodejs-Loaders is a collection of loaders for Node.js. +authors: AugustinMauroy, JakobJingleheimer +date: 2025-07-01 +category: information +--- + +> **NOTE :** +> `Nodejs-Loaders` is not a official project from [Node.js](https://nodejs.org). It's just some packages that can be used with Node.js. diff --git a/lib/content.ts b/lib/content.ts new file mode 100644 index 0000000..4a4dbb5 --- /dev/null +++ b/lib/content.ts @@ -0,0 +1,40 @@ +import fs from 'node:fs/promises'; +import path from 'node:path'; +import { compileMDX } from 'next-mdx-remote/rsc'; + +const BASE_DIR = path.join(process.cwd(), 'content'); + +/** + * Convert an array of slugs to a path + */ +const slugs2path = (slugs: Array): string => { + const cleanSlugs = slugs + .map(slug => slug.replace(/\/$/, '')) + .filter(Boolean) + .join('/'); + + return path.join(BASE_DIR, cleanSlugs).concat('.mdx'); +}; + +export const getRawContent = async ( + slugs: Array +): Promise => { + const filePath = slugs2path(slugs); + + return await fs.readFile(filePath, 'utf-8').catch(() => null); +}; + +export const getContent = async >( + slugs: Array +) => { + const rawContent = await getRawContent(slugs); + + if (!rawContent) return null; + + return compileMDX({ + source: rawContent, + options: { + parseFrontmatter: true, + }, + }); +}; diff --git a/lib/post.ts b/lib/post.ts new file mode 100644 index 0000000..a7437b7 --- /dev/null +++ b/lib/post.ts @@ -0,0 +1,30 @@ +import fs from 'node:fs/promises'; +import { getContent } from './content.ts'; +import type { PostFrontmatter } from '~/types/frontmatter.ts'; + +export const getAllPosts = async () => { + const posts = await fs.readdir('content/post'); + + return posts.filter(post => post.endsWith('.mdx')); +}; + +export const getPostsMetadata = async (category?: string) => { + const posts = await getAllPosts(); + const result: Array = []; + + for (const post of posts) { + const slugs = post.split('.').slice(0, -1); + const content = await getContent(['post', ...slugs]); + + if (!content) continue; + + result.push({ + ...content.frontmatter, + slug: slugs.join('/'), + }); + } + + if (category) return result.filter(post => post.category === category); + + return result; +}; diff --git a/next.config.ts b/next.config.ts new file mode 100644 index 0000000..ebedf9f --- /dev/null +++ b/next.config.ts @@ -0,0 +1,11 @@ +import type { NextConfig } from 'next'; + +export default { + output: 'export', + typescript: { + ignoreBuildErrors: true, + }, + eslint: { + ignoreDuringBuilds: true, + }, +} as NextConfig; diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..0ca0a44 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,6811 @@ +{ + "name": "@nodejs-loaders/nodejs-loaders.github.io", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@nodejs-loaders/nodejs-loaders.github.io", + "license": "MIT", + "dependencies": { + "@radix-ui/react-avatar": "~1.1.2", + "classnames": "~2.5.1", + "next": "15.1.6", + "next-mdx-remote": "~5.0.0", + "react": "19.0.0", + "react-dom": "19.0.0" + }, + "devDependencies": { + "@biomejs/biome": "~1.9.4", + "@nodejs-loaders/alias": "1.1.1", + "@nodejs-loaders/css-module": "1.0.1", + "@nodejs-loaders/tsx": "1.0.2", + "@testing-library/react": "~16.2.0", + "@types/node": "~22.12.0", + "@types/react": "~19.0.8", + "@types/react-dom": "~19.0.3", + "autoprefixer": "~10.4.20", + "geist": "~1.3.1", + "global-jsdom": "~26.0.0", + "postcss": "~8.4.49", + "serve": "~14.2.4", + "tailwindcss": "~3.4.17", + "typescript": "~5.7.3" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@asamuzakjp/css-color": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-2.8.3.tgz", + "integrity": "sha512-GIc76d9UI1hCvOATjZPyHFmE5qhRccp3/zGfMPapK3jBi+yocEzp6BBB0UnfRYP9NP4FANqUZYb0hnfs3TM3hw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@csstools/css-calc": "^2.1.1", + "@csstools/css-color-parser": "^3.0.7", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "lru-cache": "^10.4.3" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz", + "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@biomejs/biome": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-1.9.4.tgz", + "integrity": "sha512-1rkd7G70+o9KkTn5KLmDYXihGoTaIGO9PIIN2ZB7UJxFrWw04CZHPYiMRjYsaDvVV7hP1dYNRLxSANLaBFGpog==", + "dev": true, + "hasInstallScript": true, + "license": "MIT OR Apache-2.0", + "bin": { + "biome": "bin/biome" + }, + "engines": { + "node": ">=14.21.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/biome" + }, + "optionalDependencies": { + "@biomejs/cli-darwin-arm64": "1.9.4", + "@biomejs/cli-darwin-x64": "1.9.4", + "@biomejs/cli-linux-arm64": "1.9.4", + "@biomejs/cli-linux-arm64-musl": "1.9.4", + "@biomejs/cli-linux-x64": "1.9.4", + "@biomejs/cli-linux-x64-musl": "1.9.4", + "@biomejs/cli-win32-arm64": "1.9.4", + "@biomejs/cli-win32-x64": "1.9.4" + } + }, + "node_modules/@biomejs/cli-darwin-arm64": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-1.9.4.tgz", + "integrity": "sha512-bFBsPWrNvkdKrNCYeAp+xo2HecOGPAy9WyNyB/jKnnedgzl4W4Hb9ZMzYNbf8dMCGmUdSavlYHiR01QaYR58cw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-darwin-x64": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-1.9.4.tgz", + "integrity": "sha512-ngYBh/+bEedqkSevPVhLP4QfVPCpb+4BBe2p7Xs32dBgs7rh9nY2AIYUL6BgLw1JVXV8GlpKmb/hNiuIxfPfZg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-arm64": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-1.9.4.tgz", + "integrity": "sha512-fJIW0+LYujdjUgJJuwesP4EjIBl/N/TcOX3IvIHJQNsAqvV2CHIogsmA94BPG6jZATS4Hi+xv4SkBBQSt1N4/g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-arm64-musl": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.9.4.tgz", + "integrity": "sha512-v665Ct9WCRjGa8+kTr0CzApU0+XXtRgwmzIf1SeKSGAv+2scAlW6JR5PMFo6FzqqZ64Po79cKODKf3/AAmECqA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-x64": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-1.9.4.tgz", + "integrity": "sha512-lRCJv/Vi3Vlwmbd6K+oQ0KhLHMAysN8lXoCI7XeHlxaajk06u7G+UsFSO01NAs5iYuWKmVZjmiOzJ0OJmGsMwg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-x64-musl": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-1.9.4.tgz", + "integrity": "sha512-gEhi/jSBhZ2m6wjV530Yy8+fNqG8PAinM3oV7CyO+6c3CEh16Eizm21uHVsyVBEB6RIM8JHIl6AGYCv6Q6Q9Tg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-win32-arm64": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-1.9.4.tgz", + "integrity": "sha512-tlbhLk+WXZmgwoIKwHIHEBZUwxml7bRJgk0X2sPyNR3S93cdRq6XulAZRQJ17FYGGzWne0fgrXBKpl7l4M87Hg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-win32-x64": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-1.9.4.tgz", + "integrity": "sha512-8Y5wMhVIPaWe6jw2H+KlEm4wP/f7EW3810ZLmDlrEEy5KvBsb9ECEfu/kMWD484ijfQ8+nIi0giMgu9g1UAuuA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@csstools/color-helpers": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.0.1.tgz", + "integrity": "sha512-MKtmkA0BX87PKaO1NFRTFH+UnkgnmySQOvNxJubsadusqPEC2aJ9MOQiMceZJJ6oitUl/i0L6u0M1IrmAOmgBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/css-calc": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.1.tgz", + "integrity": "sha512-rL7kaUnTkL9K+Cvo2pnCieqNpTKgQzy5f+N+5Iuko9HAoasP+xgprVh7KN/MaJVvVL1l0EzQq2MoqBHKSrDrag==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "peer": true, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" + } + }, + "node_modules/@csstools/css-color-parser": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.7.tgz", + "integrity": "sha512-nkMp2mTICw32uE5NN+EsJ4f5N+IGFeCFu4bGpiKgb2Pq/7J/MpyLBeQ5ry4KKtRFZaYs6sTmcMYrSRIyj5DFKA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "@csstools/color-helpers": "^5.0.1", + "@csstools/css-calc": "^2.1.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" + } + }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.4.tgz", + "integrity": "sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "peer": true, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.3" + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.3.tgz", + "integrity": "sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.3.1.tgz", + "integrity": "sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", + "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", + "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", + "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", + "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", + "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", + "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", + "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", + "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", + "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", + "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", + "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", + "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", + "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", + "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", + "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", + "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", + "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", + "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", + "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", + "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", + "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", + "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", + "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz", + "integrity": "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.0.4" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz", + "integrity": "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz", + "integrity": "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz", + "integrity": "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz", + "integrity": "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==", + "cpu": [ + "arm" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz", + "integrity": "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz", + "integrity": "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==", + "cpu": [ + "s390x" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz", + "integrity": "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz", + "integrity": "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz", + "integrity": "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz", + "integrity": "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==", + "cpu": [ + "arm" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.0.5" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz", + "integrity": "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.0.4" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz", + "integrity": "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==", + "cpu": [ + "s390x" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.0.4" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz", + "integrity": "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz", + "integrity": "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.0.4" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz", + "integrity": "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz", + "integrity": "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.2.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz", + "integrity": "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz", + "integrity": "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "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==", + "dev": true, + "license": "ISC", + "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/@jridgewell/gen-mapping": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@mdx-js/mdx": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.1.0.tgz", + "integrity": "sha512-/QxEhPAvGwbQmy1Px8F899L5Uc2KZ6JtXwlCgJmjSTBedwOZkByYcBG4GceIGPXRDsmfxhHazuS+hlOShRLeDw==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdx": "^2.0.0", + "collapse-white-space": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-util-scope": "^1.0.0", + "estree-walker": "^3.0.0", + "hast-util-to-jsx-runtime": "^2.0.0", + "markdown-extensions": "^2.0.0", + "recma-build-jsx": "^1.0.0", + "recma-jsx": "^1.0.0", + "recma-stringify": "^1.0.0", + "rehype-recma": "^1.0.0", + "remark-mdx": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.0.0", + "source-map": "^0.7.0", + "unified": "^11.0.0", + "unist-util-position-from-estree": "^2.0.0", + "unist-util-stringify-position": "^4.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@mdx-js/react": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.0.tgz", + "integrity": "sha512-QjHtSaoameoalGnKDT3FoIl4+9RwyTmo9ZJGBdLOks/YOiWHoRDI3PUwEzOE7kEmGcV3AFcp9K6dYu9rEuKLAQ==", + "license": "MIT", + "dependencies": { + "@types/mdx": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@types/react": ">=16", + "react": ">=16" + } + }, + "node_modules/@next/env": { + "version": "15.1.6", + "resolved": "https://registry.npmjs.org/@next/env/-/env-15.1.6.tgz", + "integrity": "sha512-d9AFQVPEYNr+aqokIiPLNK/MTyt3DWa/dpKveiAaVccUadFbhFEvY6FXYX2LJO2Hv7PHnLBu2oWwB4uBuHjr/w==", + "license": "MIT" + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "15.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.1.6.tgz", + "integrity": "sha512-u7lg4Mpl9qWpKgy6NzEkz/w0/keEHtOybmIl0ykgItBxEM5mYotS5PmqTpo+Rhg8FiOiWgwr8USxmKQkqLBCrw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "15.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.1.6.tgz", + "integrity": "sha512-x1jGpbHbZoZ69nRuogGL2MYPLqohlhnT9OCU6E6QFewwup+z+M6r8oU47BTeJcWsF2sdBahp5cKiAcDbwwK/lg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "15.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.1.6.tgz", + "integrity": "sha512-jar9sFw0XewXsBzPf9runGzoivajeWJUc/JkfbLTC4it9EhU8v7tCRLH7l5Y1ReTMN6zKJO0kKAGqDk8YSO2bg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "15.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.1.6.tgz", + "integrity": "sha512-+n3u//bfsrIaZch4cgOJ3tXCTbSxz0s6brJtU3SzLOvkJlPQMJ+eHVRi6qM2kKKKLuMY+tcau8XD9CJ1OjeSQQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "15.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.1.6.tgz", + "integrity": "sha512-SpuDEXixM3PycniL4iVCLyUyvcl6Lt0mtv3am08sucskpG0tYkW1KlRhTgj4LI5ehyxriVVcfdoxuuP8csi3kQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "15.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.1.6.tgz", + "integrity": "sha512-L4druWmdFSZIIRhF+G60API5sFB7suTbDRhYWSjiw0RbE+15igQvE2g2+S973pMGvwN3guw7cJUjA/TmbPWTHQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "15.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.1.6.tgz", + "integrity": "sha512-s8w6EeqNmi6gdvM19tqKKWbCyOBvXFbndkGHl+c9YrzsLARRdCHsD9S1fMj8gsXm9v8vhC8s3N8rjuC/XrtkEg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "15.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.1.6.tgz", + "integrity": "sha512-6xomMuu54FAFxttYr5PJbEfu96godcxBTRk1OhAvJq0/EnmFU/Ybiax30Snis4vdWZ9LGpf7Roy5fSs7v/5ROQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nodejs-loaders/alias": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@nodejs-loaders/alias/-/alias-1.1.1.tgz", + "integrity": "sha512-7Iq7XeacMpjUcOVetNBoFtHTx84uOazn8mhqaHXrvxBTgxCfZHlDu3g5ogRJ6/9PD5+LSvigfRMLTQWhAsSEwQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "lodash.get": "^4.4.2" + }, + "engines": { + "node": ">=22 || ^20.6.0 || ^18.19.0" + } + }, + "node_modules/@nodejs-loaders/css-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@nodejs-loaders/css-module/-/css-module-1.0.1.tgz", + "integrity": "sha512-myX71vOePJIjWHFQHcMjGumrdPhhWpfa7iMpNYdp3r7RU+RoV4Fj3bji34U5YElQlA23lUOeNmlTh0MMiWIKqQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@nodejs-loaders/parse-filename": "1.0.0" + }, + "engines": { + "node": ">=22 || ^20.6.0 || ^18.19.0" + }, + "peerDependencies": { + "postcss": "~8.4.38" + } + }, + "node_modules/@nodejs-loaders/parse-filename": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@nodejs-loaders/parse-filename/-/parse-filename-1.0.0.tgz", + "integrity": "sha512-0jjIg5BAR+prsZ9wP+eqpkYspViCsdjirhK8iUqb4/nn3uKE90fX7RdfUsDPaDb2FvkNRI2LJ60336XiaQ41ag==", + "dev": true, + "license": "ISC" + }, + "node_modules/@nodejs-loaders/tsx": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@nodejs-loaders/tsx/-/tsx-1.0.2.tgz", + "integrity": "sha512-H8hA2mauAoS01cLalME1NkStiL9DdwDRrBYBUQ3UXxhuQgz/S7q02TLTkd4MV9GsRWx/0A3VioVfOgLsJJbGGw==", + "dev": true, + "license": "ISC", + "dependencies": { + "@nodejs-loaders/parse-filename": "1.0.0" + }, + "engines": { + "node": "^23.6 || ^22.14" + }, + "peerDependencies": { + "esbuild": "~0.19.5" + } + }, + "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==", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@radix-ui/react-avatar": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-avatar/-/react-avatar-1.1.2.tgz", + "integrity": "sha512-GaC7bXQZ5VgZvVvsJ5mu/AEbjYLnhhkoidOboC50Z6FFlLA03wG2ianUoH+zgDQ31/9gCF59bE4+2bBgTyMiig==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-primitive": "2.0.1", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.1.tgz", + "integrity": "sha512-Y9VzoRDSJtgFMUCoiZBDVo084VQ5hfpXxVE+NgkdNsjiDBByiImMZKKhxMwCbdHvhlENG6a833CbFkOQvTricw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.1.tgz", + "integrity": "sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-primitive": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.1.tgz", + "integrity": "sha512-sHCWTtxwNn3L3fH8qAfnF3WbUZycW93SM1j3NFDzXBiz8D6F5UTTy8G1+WFEaiCdvCVRJWj6N2R4Xq6HdiHmDg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slot": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.1.tgz", + "integrity": "sha512-RApLLOcINYJA+dMVbOju7MYv1Mb2EBp2nH4HdDzXTSyaR5optlm6Otrz1euW3HbdOR8UmmFK06TD+A9frYWv+g==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz", + "integrity": "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz", + "integrity": "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", + "license": "Apache-2.0" + }, + "node_modules/@swc/helpers": { + "version": "0.5.15", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", + "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@testing-library/dom": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz", + "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.3.0", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@testing-library/dom/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==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@testing-library/dom/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "peer": true, + "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/@testing-library/react": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.2.0.tgz", + "integrity": "sha512-2cSskAvA1QNtKc8Y9VJQRv0tm3hLVgxRGDB+KYhIaPQJ1I+RHbhIXcM+zClKXzMes/wshsMVzf4B9vS4IZpqDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@testing-library/dom": "^10.0.0", + "@types/react": "^18.0.0 || ^19.0.0", + "@types/react-dom": "^18.0.0 || ^19.0.0", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@types/acorn": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@types/acorn/-/acorn-4.0.6.tgz", + "integrity": "sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/aria-query": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", + "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "license": "MIT" + }, + "node_modules/@types/estree-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mdx": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.13.tgz", + "integrity": "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==", + "license": "MIT" + }, + "node_modules/@types/ms": { + "version": "0.7.34", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.12.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.12.0.tgz", + "integrity": "sha512-Fll2FZ1riMjNmlmJOdAyY5pUbkftXslB5DgEzlIuNaiWhXd00FhWxVC/r4yV/4wBb9JfImTu+jiSvXTkJ7F/gA==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.20.0" + } + }, + "node_modules/@types/react": { + "version": "19.0.8", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.0.8.tgz", + "integrity": "sha512-9P/o1IGdfmQxrujGbIMDyYaaCykhLKc0NGCtYcECNUr9UAaDe4gwvV9bR6tvd5Br1SG0j+PBpbKr2UYY8CwqSw==", + "license": "MIT", + "dependencies": { + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.0.3", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.0.3.tgz", + "integrity": "sha512-0Knk+HJiMP/qOZgMyNFamlIjw9OFCsyC2ZbigmEEyXXixgre6IQpm/4V+r3qH4GC1JPvRJKInw+on2rV6YZLeA==", + "devOptional": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.0.0" + } + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "license": "MIT" + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.1.tgz", + "integrity": "sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA==", + "license": "ISC" + }, + "node_modules/@zeit/schemas": { + "version": "2.36.0", + "resolved": "https://registry.npmjs.org/@zeit/schemas/-/schemas-2.36.0.tgz", + "integrity": "sha512-7kjMwcChYEzMKjeex9ZFXkt1AyNov9R5HZtjBKVsmVpw7pa7ZtlCGvCBC2vnnXctaYN+aRI61HjIqeetZW5ROg==", + "dev": true, + "license": "MIT" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "license": "MIT", + "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==", + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 14" + } + }, + "node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.1.0" + } + }, + "node_modules/ansi-align/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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-align/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==", + "dev": true, + "license": "MIT" + }, + "node_modules/ansi-align/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-align/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true, + "license": "MIT" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arch": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", + "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/astring": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz", + "integrity": "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==", + "license": "MIT", + "bin": { + "astring": "bin/astring" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/autoprefixer": { + "version": "10.4.20", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", + "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.3", + "caniuse-lite": "^1.0.30001646", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boxen": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.0.0.tgz", + "integrity": "sha512-j//dBVuyacJbvW+tvZ9HuH03fZ46QcaKvvhZickZqtB271DxJ7SNRSNxrV/dZX0085m7hISRZWbzWlJvx/rHSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-align": "^3.0.1", + "camelcase": "^7.0.0", + "chalk": "^5.0.1", + "cli-boxes": "^3.0.0", + "string-width": "^5.1.2", + "type-fest": "^2.13.0", + "widest-line": "^4.0.1", + "wrap-ansi": "^8.0.1" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.3.tgz", + "integrity": "sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.1" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "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/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/camelcase": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", + "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001690", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001690.tgz", + "integrity": "sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w==", + "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" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chalk": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz", + "integrity": "sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk-template": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-0.4.0.tgz", + "integrity": "sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/chalk-template?sponsor=1" + } + }, + "node_modules/chalk-template/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/chalk-template/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "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/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/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==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/classnames": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", + "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==", + "license": "MIT" + }, + "node_modules/cli-boxes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", + "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/clipboardy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-3.0.0.tgz", + "integrity": "sha512-Su+uU5sr1jkUy1sGRpLKjKrvEOVXgSgiSInwa/qeID6aJ07yh+5NWc3h2QfjHjBnfX4LhtFcuAWKUsJ3r+fjbg==", + "dev": true, + "license": "MIT", + "dependencies": { + "arch": "^2.2.0", + "execa": "^5.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/collapse-white-space": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz", + "integrity": "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "license": "MIT", + "optional": true, + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "engines": { + "node": ">=12.5.0" + } + }, + "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==", + "devOptional": true, + "license": "MIT", + "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==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "license": "MIT", + "optional": true, + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssstyle": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.2.1.tgz", + "integrity": "sha512-9+vem03dMXG7gDmZ62uqmRiMRNtinIZ9ZyuF6BdxzfOD+FdN5hretzynkn0ReS2DO2GSw76RWHs0UmJPI2zUjw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@asamuzakjp/css-color": "^2.8.2", + "rrweb-cssom": "^0.8.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "license": "MIT" + }, + "node_modules/data-urls": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", + "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decimal.js": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.5.0.tgz", + "integrity": "sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/decode-named-character-reference": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", + "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", + "license": "MIT", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/detect-libc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true, + "license": "MIT" + }, + "node_modules/dom-accessibility-api": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.76", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.76.tgz", + "integrity": "sha512-CjVQyG7n7Sr+eBXE86HIulnL5N8xZY1sgmOPGuq/F0Rr0FJq63lg0kEtOIDfZBk44FnDLf6FUJ+dsJcuiUDdDQ==", + "dev": true, + "license": "ISC" + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/esast-util-from-estree": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/esast-util-from-estree/-/esast-util-from-estree-2.0.0.tgz", + "integrity": "sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-visit": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/esast-util-from-js": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/esast-util-from-js/-/esast-util-from-js-2.0.1.tgz", + "integrity": "sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "acorn": "^8.0.0", + "esast-util-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/esbuild": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", + "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "peer": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.19.12", + "@esbuild/android-arm": "0.19.12", + "@esbuild/android-arm64": "0.19.12", + "@esbuild/android-x64": "0.19.12", + "@esbuild/darwin-arm64": "0.19.12", + "@esbuild/darwin-x64": "0.19.12", + "@esbuild/freebsd-arm64": "0.19.12", + "@esbuild/freebsd-x64": "0.19.12", + "@esbuild/linux-arm": "0.19.12", + "@esbuild/linux-arm64": "0.19.12", + "@esbuild/linux-ia32": "0.19.12", + "@esbuild/linux-loong64": "0.19.12", + "@esbuild/linux-mips64el": "0.19.12", + "@esbuild/linux-ppc64": "0.19.12", + "@esbuild/linux-riscv64": "0.19.12", + "@esbuild/linux-s390x": "0.19.12", + "@esbuild/linux-x64": "0.19.12", + "@esbuild/netbsd-x64": "0.19.12", + "@esbuild/openbsd-x64": "0.19.12", + "@esbuild/sunos-x64": "0.19.12", + "@esbuild/win32-arm64": "0.19.12", + "@esbuild/win32-ia32": "0.19.12", + "@esbuild/win32-x64": "0.19.12" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/estree-util-attach-comments": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz", + "integrity": "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-build-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz", + "integrity": "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-walker": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-is-identifier-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", + "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-scope": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/estree-util-scope/-/estree-util-scope-1.0.0.tgz", + "integrity": "sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-to-js": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz", + "integrity": "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "astring": "^1.8.0", + "source-map": "^0.7.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-visit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-2.0.0.tgz", + "integrity": "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/execa/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "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.8" + }, + "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==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fastq": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.18.0.tgz", + "integrity": "sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/foreground-child": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", + "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/geist": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/geist/-/geist-1.3.1.tgz", + "integrity": "sha512-Q4gC1pBVPN+D579pBaz0TRRnGA4p9UK6elDY/xizXdFk/g4EKR5g0I+4p/Kj6gM0SajDBZ/0FvDV9ey9ud7BWw==", + "dev": true, + "license": "SIL OPEN FONT LICENSE", + "peerDependencies": { + "next": ">=13.2.0" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "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==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/global-jsdom": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/global-jsdom/-/global-jsdom-26.0.0.tgz", + "integrity": "sha512-BqXpTNZFjP40N+s4k8Bk9HS8GFVPJB/+TKtwcShM84wLv6C5dH9o1dydI3pL6potanhfDiIAVDbaaGj/uSdRSA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "jsdom": ">=26 <27" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hast-util-to-estree": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-3.1.1.tgz", + "integrity": "sha512-IWtwwmPskfSmma9RpzCappDUitC8t5jhAynHhc1m2+5trOgsrp7txscUSavc5Ic8PATyAjfrCK1wgtxh2cICVQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-attach-comments": "^3.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-object": "^1.0.0", + "unist-util-position": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-jsx-runtime": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.2.tgz", + "integrity": "sha512-1ngXYb+V9UT5h+PxNRa1O1FYguZK/XL+gkeqvp7EdHlB9oHUG0eYRo/vY5inBdcqo3RkPMC58/H94HvkbfGdyg==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-object": "^1.0.0", + "unist-util-position": "^5.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", + "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "whatwg-encoding": "^3.1.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true, + "license": "ISC" + }, + "node_modules/inline-style-parser": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.4.tgz", + "integrity": "sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==", + "license": "MIT" + }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "license": "MIT", + "optional": true + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-port-reachable": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-port-reachable/-/is-port-reachable-4.0.0.tgz", + "integrity": "sha512-9UoipoxYmSk6Xy7QFgRv2HDyaysmgSG75TFQs6S+3pDM7ZhKTF/bskZV+0UlABHzKjNVhPjYCLfeZUEg1wXxig==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jiti": { + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/jsdom": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-26.0.0.tgz", + "integrity": "sha512-BZYDGVAIriBWTpIxYzrXjv3E/4u8+/pSG5bQdIYCbNCGOvsPkDQfTVLAIXAf9ETdCpduCVTkDe2NNZ8NIwUVzw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "cssstyle": "^4.2.1", + "data-urls": "^5.0.0", + "decimal.js": "^10.4.3", + "form-data": "^4.0.1", + "html-encoding-sniffer": "^4.0.0", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.6", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.16", + "parse5": "^7.2.1", + "rrweb-cssom": "^0.8.0", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^5.0.0", + "w3c-xmlserializer": "^5.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^3.1.1", + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.1.0", + "ws": "^8.18.0", + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "canvas": "^3.0.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "dev": true, + "license": "MIT", + "peer": true, + "bin": { + "lz-string": "bin/bin.js" + } + }, + "node_modules/markdown-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz", + "integrity": "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==", + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz", + "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz", + "integrity": "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", + "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.1.3.tgz", + "integrity": "sha512-bfOjvNt+1AcbPLTFMFWY149nJz0OjmewJs3LQQ5pIyVGxP4CdOqNVJL6kTaM5c68p8q82Xv3nCyFfUnuEcH3UQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdxjs-esm": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", + "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz", + "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", + "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromark": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.1.tgz", + "integrity": "sha512-eBPdkcoCNvYcxQOAKAlceo5SNdzZWfF+FcSupREAzdAh9rRmE239CEQAiTwIgblwnoM8zzj35sZ5ZwvSEOF6Kw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.2.tgz", + "integrity": "sha512-FKjQKbxd1cibWMM1P9N+H8TwlgGgSkWZMmfuVucLCHaYqeSvJ0hFeHsIa65pA2nYbes0f8LDHPMrd9X7Ujxg9w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-expression": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.0.tgz", + "integrity": "sha512-sI0nwhUDz97xyzqJAbHQhp5TfaxEvZZZ2JDqUo+7NvyIYG6BZ5CPPqj2ogUoPJlmXHBnyZUzISg9+oUmU6tUjQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-mdx-expression": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.1.tgz", + "integrity": "sha512-vNuFb9czP8QCtAQcEJn0UJQJZA8Dk6DXKBqx+bg/w0WGuSxDxNr7hErW89tHUY31dUW4NqEOWwmEUNhjTFmHkg==", + "license": "MIT", + "dependencies": { + "@types/acorn": "^4.0.0", + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "micromark-factory-mdx-expression": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdx-md": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz", + "integrity": "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==", + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz", + "integrity": "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==", + "license": "MIT", + "dependencies": { + "acorn": "^8.0.0", + "acorn-jsx": "^5.0.0", + "micromark-extension-mdx-expression": "^3.0.0", + "micromark-extension-mdx-jsx": "^3.0.0", + "micromark-extension-mdx-md": "^2.0.0", + "micromark-extension-mdxjs-esm": "^3.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs-esm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz", + "integrity": "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-mdx-expression": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.2.tgz", + "integrity": "sha512-5E5I2pFzJyg2CtemqAbcyCktpHXuJbABnsb32wX2U8IQKhhVFBqkcZR5LRm1WVoFqa4kTueZK4abep7wdo9nrw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-events-to-acorn": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.2.tgz", + "integrity": "sha512-Fk+xmBrOv9QZnEDguL9OI9/NQQp6Hz4FuQ4YmCb/5V7+9eAh1s6AYSvL20kHkD67YIg7EpE54TiSlcsf3vyZgA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/acorn": "^4.0.0", + "@types/estree": "^1.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "estree-util-visit": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" + } + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.3.tgz", + "integrity": "sha512-VXJJuNxYWSoYL6AJ6OQECCFGhIU2GGHMw8tahogePBrjkG8aCCas3ibkp7RnVOSTClg2is05/R7maAhF1XyQMg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.1.tgz", + "integrity": "sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.53.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.53.0.tgz", + "integrity": "sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/next": { + "version": "15.1.6", + "resolved": "https://registry.npmjs.org/next/-/next-15.1.6.tgz", + "integrity": "sha512-Hch4wzbaX0vKQtalpXvUiw5sYivBy4cm5rzUKrBnUB/y436LGrvOUqYvlSeNVCWFO/770gDlltR9gqZH62ct4Q==", + "license": "MIT", + "dependencies": { + "@next/env": "15.1.6", + "@swc/counter": "0.1.3", + "@swc/helpers": "0.5.15", + "busboy": "1.6.0", + "caniuse-lite": "^1.0.30001579", + "postcss": "8.4.31", + "styled-jsx": "5.1.6" + }, + "bin": { + "next": "dist/bin/next" + }, + "engines": { + "node": "^18.18.0 || ^19.8.0 || >= 20.0.0" + }, + "optionalDependencies": { + "@next/swc-darwin-arm64": "15.1.6", + "@next/swc-darwin-x64": "15.1.6", + "@next/swc-linux-arm64-gnu": "15.1.6", + "@next/swc-linux-arm64-musl": "15.1.6", + "@next/swc-linux-x64-gnu": "15.1.6", + "@next/swc-linux-x64-musl": "15.1.6", + "@next/swc-win32-arm64-msvc": "15.1.6", + "@next/swc-win32-x64-msvc": "15.1.6", + "sharp": "^0.33.5" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0", + "@playwright/test": "^1.41.2", + "babel-plugin-react-compiler": "*", + "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "@playwright/test": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/next-mdx-remote": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/next-mdx-remote/-/next-mdx-remote-5.0.0.tgz", + "integrity": "sha512-RNNbqRpK9/dcIFZs/esQhuLA8jANqlH694yqoDBK8hkVdJUndzzGmnPHa2nyi90N4Z9VmzuSWNRpr5ItT3M7xQ==", + "license": "MPL-2.0", + "dependencies": { + "@babel/code-frame": "^7.23.5", + "@mdx-js/mdx": "^3.0.1", + "@mdx-js/react": "^3.0.1", + "unist-util-remove": "^3.1.0", + "vfile": "^6.0.1", + "vfile-matter": "^5.0.0" + }, + "engines": { + "node": ">=14", + "npm": ">=7" + }, + "peerDependencies": { + "react": ">=16" + } + }, + "node_modules/next/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" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/node-releases": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "dev": true, + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nwsapi": { + "version": "2.2.16", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.16.tgz", + "integrity": "sha512-F1I/bimDpj3ncaNDhfyMWuFqmQDBwDB0Fogc2qpL3BWvkQteFD/8BzWuIRl83rq0DXfm8SGt/HFhLXZyljTXcQ==", + "dev": true, + "license": "MIT", + "peer": 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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/parse-entities": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", + "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "license": "MIT" + }, + "node_modules/parse5": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", + "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "entities": "^4.5.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", + "dev": true, + "license": "(WTFPL OR MIT)" + }, + "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==", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-to-regexp": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.3.0.tgz", + "integrity": "sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss": { + "version": "8.4.49", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", + "dev": true, + "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" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/pretty-format/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==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/property-information": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", + "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/react": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/react/-/react-19.0.0.tgz", + "integrity": "sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.0.0.tgz", + "integrity": "sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.25.0" + }, + "peerDependencies": { + "react": "^19.0.0" + } + }, + "node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/recma-build-jsx": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-build-jsx/-/recma-build-jsx-1.0.0.tgz", + "integrity": "sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-util-build-jsx": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/recma-jsx": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-jsx/-/recma-jsx-1.0.0.tgz", + "integrity": "sha512-5vwkv65qWwYxg+Atz95acp8DMu1JDSqdGkA2Of1j6rCreyFUE/gp15fC8MnGEuG1W68UKjM6x6+YTWIh7hZM/Q==", + "license": "MIT", + "dependencies": { + "acorn-jsx": "^5.0.0", + "estree-util-to-js": "^2.0.0", + "recma-parse": "^1.0.0", + "recma-stringify": "^1.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/recma-parse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-parse/-/recma-parse-1.0.0.tgz", + "integrity": "sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "esast-util-from-js": "^2.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/recma-stringify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-stringify/-/recma-stringify-1.0.0.tgz", + "integrity": "sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-util-to-js": "^2.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/registry-auth-token": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", + "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "rc": "^1.1.6", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/registry-url": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "integrity": "sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "rc": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/rehype-recma": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rehype-recma/-/rehype-recma-1.0.0.tgz", + "integrity": "sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "hast-util-to-estree": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-mdx": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.1.0.tgz", + "integrity": "sha512-Ngl/H3YXyBV9RcRNdlYsZujAmhsxwzxpDzpDEhFBVAGthS4GDgnctpDjgFl/ULx5UEDzqtW1cyBSNKqYYrqLBA==", + "license": "MIT", + "dependencies": { + "mdast-util-mdx": "^3.0.0", + "micromark-extension-mdxjs": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.1.tgz", + "integrity": "sha512-g/osARvjkBXb6Wo0XvAeXQohVta8i84ACbenPpoSsxTOQH/Ae0/RGP4WZgnMH5pMLpsj4FG7OHmcIcXxpza8eQ==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rrweb-cssom": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz", + "integrity": "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "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==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, + "node_modules/scheduler": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.25.0.tgz", + "integrity": "sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "license": "ISC", + "optional": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/serve": { + "version": "14.2.4", + "resolved": "https://registry.npmjs.org/serve/-/serve-14.2.4.tgz", + "integrity": "sha512-qy1S34PJ/fcY8gjVGszDB3EXiPSk5FKhUa7tQe0UPRddxRidc2V6cNHPNewbE1D7MAkgLuWEt3Vw56vYy73tzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@zeit/schemas": "2.36.0", + "ajv": "8.12.0", + "arg": "5.0.2", + "boxen": "7.0.0", + "chalk": "5.0.1", + "chalk-template": "0.4.0", + "clipboardy": "3.0.0", + "compression": "1.7.4", + "is-port-reachable": "4.0.0", + "serve-handler": "6.1.6", + "update-check": "1.5.4" + }, + "bin": { + "serve": "build/main.js" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/serve-handler": { + "version": "6.1.6", + "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.6.tgz", + "integrity": "sha512-x5RL9Y2p5+Sh3D38Fh9i/iQ5ZK+e4xuXRd/pGbM4D13tgo/MGwbttUk8emytcr1YYzBYs+apnUngBDFYfpjPuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "3.0.0", + "content-disposition": "0.5.2", + "mime-types": "2.1.18", + "minimatch": "3.1.2", + "path-is-inside": "1.0.2", + "path-to-regexp": "3.3.0", + "range-parser": "1.2.0" + } + }, + "node_modules/serve-handler/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/serve-handler/node_modules/mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-handler/node_modules/mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "~1.33.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-handler/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/sharp": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.5.tgz", + "integrity": "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==", + "hasInstallScript": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "color": "^4.2.3", + "detect-libc": "^2.0.3", + "semver": "^7.6.3" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.33.5", + "@img/sharp-darwin-x64": "0.33.5", + "@img/sharp-libvips-darwin-arm64": "1.0.4", + "@img/sharp-libvips-darwin-x64": "1.0.4", + "@img/sharp-libvips-linux-arm": "1.0.5", + "@img/sharp-libvips-linux-arm64": "1.0.4", + "@img/sharp-libvips-linux-s390x": "1.0.4", + "@img/sharp-libvips-linux-x64": "1.0.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.0.4", + "@img/sharp-libvips-linuxmusl-x64": "1.0.4", + "@img/sharp-linux-arm": "0.33.5", + "@img/sharp-linux-arm64": "0.33.5", + "@img/sharp-linux-s390x": "0.33.5", + "@img/sharp-linux-x64": "0.33.5", + "@img/sharp-linuxmusl-arm64": "0.33.5", + "@img/sharp-linuxmusl-x64": "0.33.5", + "@img/sharp-wasm32": "0.33.5", + "@img/sharp-win32-ia32": "0.33.5", + "@img/sharp-win32-x64": "0.33.5" + } + }, + "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==", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "license": "MIT", + "optional": true, + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 8" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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==", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "license": "MIT", + "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/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width-cjs/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/style-to-object": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.8.tgz", + "integrity": "sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==", + "license": "MIT", + "dependencies": { + "inline-style-parser": "0.2.4" + } + }, + "node_modules/styled-jsx": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz", + "integrity": "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==", + "license": "MIT", + "dependencies": { + "client-only": "0.0.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/sucrase": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "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==", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/tailwindcss": { + "version": "3.4.17", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz", + "integrity": "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==", + "dev": true, + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.6.0", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.2", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.6", + "lilconfig": "^3.1.3", + "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.47", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.2", + "postcss-nested": "^6.2.0", + "postcss-selector-parser": "^6.1.2", + "resolve": "^1.22.8", + "sucrase": "^3.35.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tldts": { + "version": "6.1.75", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.75.tgz", + "integrity": "sha512-+lFzEXhpl7JXgWYaXcB6DqTYXbUArvrWAE/5ioq/X3CdWLbDjpPP4XTrQBmEJ91y3xbe4Fkw7Lxv4P3GWeJaNg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "tldts-core": "^6.1.75" + }, + "bin": { + "tldts": "bin/cli.js" + } + }, + "node_modules/tldts-core": { + "version": "6.1.75", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.75.tgz", + "integrity": "sha512-AOvV5YYIAFFBfransBzSTyztkc3IMfz5Eq3YluaRiEu55nn43Fzaufx70UqEKYr8BoLCach4q8g/bg6e5+/aFw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tough-cookie": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.0.tgz", + "integrity": "sha512-rvZUv+7MoBYTiDmFPBrhL7Ujx9Sk+q9wwm22x8c8T5IJaR+Wsyc7TNxbVxo84kZoRJZZMazowFLqpankBEQrGg==", + "dev": true, + "license": "BSD-3-Clause", + "peer": true, + "dependencies": { + "tldts": "^6.1.32" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/tr46": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.0.0.tgz", + "integrity": "sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", + "dev": true, + "license": "MIT" + }, + "node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position-from-estree": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz", + "integrity": "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-remove": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/unist-util-remove/-/unist-util-remove-3.1.1.tgz", + "integrity": "sha512-kfCqZK5YVY5yEa89tvpl7KnBBHu2c6CzMkqHUrlOqaRgGOMp0sMvwWOVrbAtj03KhovQB7i96Gda72v/EFE0vw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-remove/node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "license": "MIT" + }, + "node_modules/unist-util-remove/node_modules/unist-util-is": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz", + "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz", + "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents/node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "license": "MIT" + }, + "node_modules/unist-util-visit-parents/node_modules/unist-util-is": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz", + "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit/node_modules/unist-util-visit-parents": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/update-check": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/update-check/-/update-check-1.5.4.tgz", + "integrity": "sha512-5YHsflzHP4t1G+8WGPlvKbJEbAJGCgw+Em+dGR1KmBUbr1J36SJBqlHLjR7oob7sco5hWHGQVcr9B2poIVDDTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "registry-auth-token": "3.3.2", + "registry-url": "3.1.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-matter": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/vfile-matter/-/vfile-matter-5.0.0.tgz", + "integrity": "sha512-jhPSqlj8hTSkTXOqyxbUeZAFFVq/iwu/jukcApEqc/7DOidaAth6rDc0Zgg0vWpzUnWkwFP7aK28l6nBmxMqdQ==", + "license": "MIT", + "dependencies": { + "vfile": "^6.0.0", + "yaml": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/w3c-xmlserializer": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", + "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-encoding": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-url": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.1.0.tgz", + "integrity": "sha512-jlf/foYIKywAt3x/XWKZ/3rz8OSJPiWktjmk891alJUEjiVxKX9LEO92qH3hv4aJ0mN3MWPvGMCy8jQi95xK4w==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "tr46": "^5.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/widest-line": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", + "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", + "dev": true, + "license": "MIT", + "dependencies": { + "string-width": "^5.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "license": "MIT", + "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/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?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==", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "license": "MIT", + "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-cjs/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xml-name-validator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/yaml": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz", + "integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==", + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..fb80442 --- /dev/null +++ b/package.json @@ -0,0 +1,47 @@ +{ + "name": "@nodejs-loaders/nodejs-loaders.github.io", + "description": "A showcase website for the `nodejs-loader` project", + "license": "MIT", + "type": "module", + "scripts": { + "dev": "next dev --turbopack", + "build": "next build", + "biome:ci": "biome ci ./", + "biome:format:fix": "biome format --fix ./", + "biome:format": "biome format ./", + "biome:lint:fix": "biome lint --fix ./", + "biome:lint": "biome lint ./", + "test:unit": "node --import \"./registers/react.ts\" --test **/*.test.ts **/*.test.tsx", + "test:unit-coverage": "node --import \"./registers/react.ts\" --test --experimental-test-coverage --test-reporter=lcov --test-reporter-destination=./coverage.lcov --test-reporter=spec --test-reporter-destination=stdout **/*.test.ts **/*.test.tsx", + "test:unit-snapshots": "node --import \"./registers/react.ts\" --test --test-update-snapshots **/*.test.ts **/*.test.tsx", + "test:unit-watch": "node --import \"./registers/react.ts\" --test --watch **/*.test.ts **/*.test.tsx ", + "types:check": "tsc --noEmit", + "pre-commit": "node --run biome:lint:fix; node --run biome:format:fix", + "preview": "node --run build && serve out" + }, + "dependencies": { + "@radix-ui/react-avatar": "~1.1.2", + "classnames": "~2.5.1", + "next": "15.1.6", + "next-mdx-remote": "~5.0.0", + "react": "19.0.0", + "react-dom": "19.0.0" + }, + "devDependencies": { + "@biomejs/biome": "~1.9.4", + "@nodejs-loaders/alias": "1.1.1", + "@nodejs-loaders/css-module": "1.0.1", + "@nodejs-loaders/tsx": "1.0.2", + "@testing-library/react": "~16.2.0", + "@types/node": "~22.12.0", + "@types/react": "~19.0.8", + "@types/react-dom": "~19.0.3", + "autoprefixer": "~10.4.20", + "geist": "~1.3.1", + "global-jsdom": "~26.0.0", + "postcss": "~8.4.49", + "serve": "~14.2.4", + "tailwindcss": "~3.4.17", + "typescript": "~5.7.3" + } +} diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 0000000..29e7210 --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,10 @@ +/** @type {import('postcss-load-config').Config} */ +const config = { + plugins: { + 'tailwindcss/nesting': {}, + tailwindcss: {}, + autoprefixer: {}, + }, +}; + +export default config; diff --git a/registers/react.ts b/registers/react.ts new file mode 100644 index 0000000..b638927 --- /dev/null +++ b/registers/react.ts @@ -0,0 +1,10 @@ +import { register } from 'node:module'; +import jsdom from 'global-jsdom'; + +jsdom(undefined, { + url: 'https://test.example.com', +}); + +register('@nodejs-loaders/alias', import.meta.url); +register('@nodejs-loaders/tsx', import.meta.url); +register('@nodejs-loaders/css-module', import.meta.url); diff --git a/styles/globals.css b/styles/globals.css new file mode 100644 index 0000000..949415b --- /dev/null +++ b/styles/globals.css @@ -0,0 +1,16 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +html { + @apply motion-safe:scroll-smooth + antialiased + dark:antialiased; +} + +body { + @apply bg-white + dark:bg-gray-950 + text-gray-900 + dark:text-gray-100; +} diff --git a/styles/markdown.css b/styles/markdown.css new file mode 100644 index 0000000..7771b1b --- /dev/null +++ b/styles/markdown.css @@ -0,0 +1,173 @@ +.md-content { + h1 { + @apply text-4xl + font-bold + mb-2; + } + + h2 { + @apply text-3xl + font-bold + mb-2; + } + + h3 { + @apply text-2xl + font-bold + mb-2; + } + + h4 { + @apply text-xl + font-bold + mb-2; + } + + h5 { + @apply text-lg + font-bold + mb-2; + } + + h6 { + @apply text-base + font-bold + mb-2; + } + + p { + @apply text-base + mb-4; + } + + a { + @apply text-green-600 + underline + dark:text-green-400; + + &:hover { + @apply text-green-800 + dark:text-green-200 + no-underline; + } + } + + ul { + @apply list-disc + pl-4; + } + + ol { + @apply list-decimal + pl-4; + } + + blockquote { + @apply border-l-4 + border-green-400 + italic + pl-4 + py-2 + my-4 + dark:border-green-600; + + cite { + @apply block + text-sm + font-bold + text-green-600 + dark:text-green-400; + + &:before { + @apply content-['-']; + } + } + + p { + @apply text-base; + } + } + + code { + @apply text-sm + bg-gray-200 + rounded + p-1 + dark:bg-gray-800 + dark:text-gray-200; + } + + pre { + @apply bg-gray-200 + rounded + p-4 + my-4 + overflow-x-auto + dark:bg-gray-800; + } + + img { + @apply mx-auto + my-4 + rounded + shadow-lg; + } + + table { + @apply w-full + border-collapse + border + border-green-400 + dark:border-green-600; + + th { + @apply bg-green-400 + text-white + font-bold + text-sm + p-2 + dark:bg-green-600; + } + + td { + @apply border + border-green-400 + text-sm + p-2 + dark:border-green-600; + } + } + + figure { + @apply mx-auto + my-4 + rounded + shadow-lg; + } + + figcaption { + @apply text-center + text-sm + p-2; + } + + details { + @apply bg-gray-200 + rounded + p-2 + my-4 + dark:bg-gray-800; + + summary { + @apply bg-green-400 + text-white + font-bold + text-sm + rounded-t + p-2 + -mt-4 + -mx-2 + dark:bg-green-600; + } + } +} diff --git a/tailwind.config.ts b/tailwind.config.ts new file mode 100644 index 0000000..c0127da --- /dev/null +++ b/tailwind.config.ts @@ -0,0 +1,28 @@ +import type { Config } from 'tailwindcss'; + +export default { + content: ['./components/**/*.tsx', './app/**/*.tsx'], + theme: { + extend: { + fontFamily: { + sans: ['var(--font-geist-sans)'], + mono: ['var(--font-geist-mono)'], + }, + colors: { + green: { + 50: '#f6fbea', + 100: '#e9f5d2', + 200: '#d3ecaa', + 300: '#b6de78', + 400: '#99ce4d', + 500: '#7bb32f', + 600: '#5e8e22', + 700: '#46691d', // logo color + 800: '#3c571d', + 900: '#344a1d', + 950: '#19280b', + }, + }, + }, + }, +} as Config; diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..2ca8cfb --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,33 @@ +{ + "compilerOptions": { + "target": "ESNext", + "allowImportingTsExtensions": true, + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true, + "plugins": [ + { + "name": "next" + } + ], + "paths": { + "~/*": ["./*"] + } + }, + "include": [ + "next-env.d.ts", + "**/*.ts", + "**/*.tsx", + ".next/types/**/*.ts" + ], + "exclude": ["node_modules"] +} diff --git a/types/frontmatter.ts b/types/frontmatter.ts new file mode 100644 index 0000000..a91bb3b --- /dev/null +++ b/types/frontmatter.ts @@ -0,0 +1,7 @@ +export type PostFrontmatter = { + title: string; + description: string; + authors: string; + date: string; + category: string; +}; diff --git a/utils/gitHubUtils.ts b/utils/gitHubUtils.ts new file mode 100644 index 0000000..46fe262 --- /dev/null +++ b/utils/gitHubUtils.ts @@ -0,0 +1,5 @@ +export const getGitHubAvatarUrl = (username: string): string => + `https://avatars.githubusercontent.com/${username}`; + +export const getGithubProfileUrl = (username: string): string => + `https://github.com/${username}`; diff --git a/utils/postUtils.ts b/utils/postUtils.ts new file mode 100644 index 0000000..0f640ff --- /dev/null +++ b/utils/postUtils.ts @@ -0,0 +1 @@ +export const postSlug2Href = (slug: string): string => `article/post/${slug}`; diff --git a/utils/stringUtils.ts b/utils/stringUtils.ts new file mode 100644 index 0000000..0d8f973 --- /dev/null +++ b/utils/stringUtils.ts @@ -0,0 +1,2 @@ +export const getAcronymFromString = (str: string) => + [...(str.trim().match(/\b(\w)/g) || 'NA')].join('').toUpperCase(); diff --git a/utils/tests/gitHubUtils.test.ts b/utils/tests/gitHubUtils.test.ts new file mode 100644 index 0000000..f1dfb10 --- /dev/null +++ b/utils/tests/gitHubUtils.test.ts @@ -0,0 +1,31 @@ +import assert from 'node:assert/strict'; +import { describe, it } from 'node:test'; +import { getGitHubAvatarUrl, getGithubProfileUrl } from '../gitHubUtils.ts'; + +describe('gitHubUtils', () => { + describe('getGitHubAvatarUrl', () => { + it('should return the correct URL', () => { + const username = 'octocat'; + const expected = 'https://avatars.githubusercontent.com/octocat'; + + assert.strictEqual(getGitHubAvatarUrl(username), expected); + }); + + it('shoud return 200 http status code', async () => { + const username = 'AugustinMauroy'; + + const response = await fetch(getGitHubAvatarUrl(username)); + + assert.strictEqual(response.status, 200); + }); + }); + + describe('getGithubProfileUrl', () => { + it('should return the correct URL', () => { + const username = 'octocat'; + const expected = 'https://github.com/octocat'; + + assert.strictEqual(getGithubProfileUrl(username), expected); + }); + }); +}); diff --git a/utils/tests/postUtils.test.ts b/utils/tests/postUtils.test.ts new file mode 100644 index 0000000..5a0aa21 --- /dev/null +++ b/utils/tests/postUtils.test.ts @@ -0,0 +1,28 @@ +import assert from 'node:assert/strict'; +import { describe, it } from 'node:test'; +import { postSlug2Href } from '../postUtils.ts'; + +describe('PostUtils', () => { + describe('postSlug2Href', () => { + it('should return the correct URL for a given slug', () => { + const slug = 'example-slug'; + const expected = 'article/post/example-slug'; + + assert.strictEqual(postSlug2Href(slug), expected); + }); + + it('should handle empty slug correctly', () => { + const slug = ''; + const expected = 'article/post/'; + + assert.strictEqual(postSlug2Href(slug), expected); + }); + + it('should handle slugs with special characters', () => { + const slug = 'special-characters-!@#$%^&*()'; + const expected = 'article/post/special-characters-!@#$%^&*()'; + + assert.strictEqual(postSlug2Href(slug), expected); + }); + }); +}); diff --git a/utils/tests/stringUtils.test.ts b/utils/tests/stringUtils.test.ts new file mode 100644 index 0000000..c91b102 --- /dev/null +++ b/utils/tests/stringUtils.test.ts @@ -0,0 +1,28 @@ +import assert from 'node:assert/strict'; +import { describe, it } from 'node:test'; +import { getAcronymFromString } from '../stringUtils.ts'; + +describe('stringUtils', () => { + describe('getAcronymFromString', () => { + it('should return the correct acronym', () => { + const str = 'Hello World'; + const expected = 'HW'; + + assert.strictEqual(getAcronymFromString(str), expected); + }); + + it('should return the correct acronym when the string is empty', () => { + const str = ''; + const expected = 'NA'; + + assert.strictEqual(getAcronymFromString(str), expected); + }); + + it('should handle non-alphanumeric characters', () => { + const str = 'Hello, World!'; + const expected = 'HW'; + + assert.strictEqual(getAcronymFromString(str), expected); + }); + }); +}); From db411d6b3639a5092b8de10744785dae560d5b6a Mon Sep 17 00:00:00 2001 From: Augustin Mauroy <97875033+AugustinMauroy@users.noreply.github.com> Date: Fri, 7 Feb 2025 12:02:56 +0100 Subject: [PATCH 02/15] Delete TODO.md --- TODO.md | 18 ------------------ 1 file changed, 18 deletions(-) delete mode 100644 TODO.md diff --git a/TODO.md b/TODO.md deleted file mode 100644 index 3e00985..0000000 --- a/TODO.md +++ /dev/null @@ -1,18 +0,0 @@ -# TODO: - -- Write the `what-is-nodejs-loaders` post -- Write a "how to digest a nodejs-loader" post -- Write a use case for react unit testing can be based on https://augustinmauroy.github.io/en/blog/post/how-to-test-react-app-with-node-test-runner -- Write use case how to handle diffent jsx than react -- CI with GA for pr -- Add documentation of the project (this repo) -- Add a `CONTRIBUTING.md` file -- Design OG image for the project -- Create engine to generate static OG images -- `sitemap.xml` generation -- `rss` feed generation -- Add GH pr template -- Add GH issue template -- Add openSSF scorecard -- Add dependabot -- Add metata (title, description) _SEO_ From eeb9bf9da2f871f19e77d78fabc761fe066830a0 Mon Sep 17 00:00:00 2001 From: Augustin Mauroy Date: Fri, 7 Feb 2025 12:14:00 +0100 Subject: [PATCH 03/15] workflow: introduce openssf scorecard (#15) --- .github/workflows/codeql.yml | 84 +++++++++++++++++++ .github/workflows/dependency-review.yml | 29 +++++++ .github/workflows/{deploy.yaml => deploy.yml} | 0 .github/workflows/scorecard.yml | 60 +++++++++++++ README.md | 2 + 5 files changed, 175 insertions(+) create mode 100644 .github/workflows/codeql.yml create mode 100644 .github/workflows/dependency-review.yml rename .github/workflows/{deploy.yaml => deploy.yml} (100%) create mode 100644 .github/workflows/scorecard.yml diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml new file mode 100644 index 0000000..9fd0424 --- /dev/null +++ b/.github/workflows/codeql.yml @@ -0,0 +1,84 @@ +# yaml-language-server: $schema=https://json.schemastore.org/github-workflow.json + +# For most projects, this workflow file will not need changing; you simply need +# to commit it to your repository. +# +# You may wish to alter this file to override the set of languages analyzed, +# or to provide custom queries or build logic. +# +# ******** NOTE ******** +# We have attempted to detect the languages in your repository. Please check +# the `language` matrix defined below to confirm you have the correct set of +# supported CodeQL languages. +# +name: "CodeQL" + +on: + push: + branches: ["main"] + pull_request: + # The branches below must be a subset of the branches above + branches: ["main"] + schedule: + - cron: "0 0 * * 1" + +permissions: + contents: read + +jobs: + analyze: + name: Analyze + runs-on: ubuntu-latest + permissions: + actions: read + contents: read + security-events: write + + strategy: + fail-fast: false + matrix: + language: ["javascript", "typescript"] + # CodeQL supports [ $supported-codeql-languages ] + # Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support + + steps: + - name: Harden Runner + uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4 + with: + egress-policy: audit + + - name: Checkout repository + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + + # Initializes the CodeQL tools for scanning. + - name: Initialize CodeQL + uses: github/codeql-action/init@0701025a8b1600e416be4f3bb5a830b1aa6af01e # v3.28.6 + with: + # https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/customizing-your-advanced-setup-for-code-scanning#example-configuration + languages: ${{ matrix.language }} + config: | + paths-ignore: + - '**/*.test.js' + - '**/*.test.mjs' + - '**/*.bench.js' + - '**/*.bench.mjs' + + # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). + # If this step fails, then you should remove it and run the build manually (see below) + - name: Autobuild + uses: github/codeql-action/autobuild@0701025a8b1600e416be4f3bb5a830b1aa6af01e # v3.28.6 + + # ℹ️ Command-line programs to run using the OS shell. + # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun + + # If the Autobuild fails above, remove it and uncomment the following three lines. + # modify them (or add more) to build your code if your project, please refer to the EXAMPLE below for guidance. + + # - run: | + # echo "Run, Build Application using script" + # ./location_of_script_within_repo/buildscript.sh + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@0701025a8b1600e416be4f3bb5a830b1aa6af01e # v3.28.6 + with: + category: "/language:${{matrix.language}}" diff --git a/.github/workflows/dependency-review.yml b/.github/workflows/dependency-review.yml new file mode 100644 index 0000000..96fc102 --- /dev/null +++ b/.github/workflows/dependency-review.yml @@ -0,0 +1,29 @@ +# yaml-language-server: $schema=https://json.schemastore.org/github-workflow.json + +# Dependency Review Action +# +# This Action will scan dependency manifest files that change as part of a Pull Request, +# surfacing known-vulnerable versions of the packages declared or updated in the PR. +# Once installed, if the workflow run is marked as required, +# PRs introducing known-vulnerable packages will be blocked from merging. +# +# Source repository: https://github.com/actions/dependency-review-action +name: 'Dependency Review' +on: [pull_request] + +permissions: + contents: read + +jobs: + dependency-review: + runs-on: ubuntu-latest + steps: + - name: Harden Runner + uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4 + with: + egress-policy: audit + + - name: 'Checkout Repository' + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + - name: 'Dependency Review' + uses: actions/dependency-review-action@3b139cfc5fae8b618d3eae3675e383bb1769c019 # v4.5.0 diff --git a/.github/workflows/deploy.yaml b/.github/workflows/deploy.yml similarity index 100% rename from .github/workflows/deploy.yaml rename to .github/workflows/deploy.yml diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml new file mode 100644 index 0000000..d6ec65f --- /dev/null +++ b/.github/workflows/scorecard.yml @@ -0,0 +1,60 @@ +# yaml-language-server: $schema=https://json.schemastore.org/github-workflow.json + +name: Scorecard supply-chain security +on: + # For Branch-Protection check. Only the default branch is supported. See + # https://github.com/ossf/scorecard/blob/main/docs/checks.md#branch-protection + branch_protection_rule: + # To guarantee Maintained check is occasionally updated. See + # https://github.com/ossf/scorecard/blob/main/docs/checks.md#maintained + schedule: + - cron: '35 6 * * 1' + push: + branches: [ "main" ] + +# Declare default permissions as read only. +permissions: read-all + +jobs: + analysis: + name: Scorecard analysis + runs-on: ubuntu-latest + permissions: + # Needed to upload the results to code-scanning dashboard. + security-events: write + # Needed to publish results and get a badge (see publish_results below). + id-token: write + + steps: + - name: Harden Runner + uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4 + with: + egress-policy: audit + + - name: "Checkout code" + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: false + + - name: "Run analysis" + uses: ossf/scorecard-action@62b2cac7ed8198b15735ed49ab1e5cf35480ba46 # v2.4.0 + with: + results_file: results.sarif + results_format: sarif + publish_results: true + + # Upload the results as artifacts (optional). Commenting out will disable uploads of run results in SARIF + # format to the repository Actions tab. + - name: "Upload artifact" + uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 + with: + name: SARIF file + path: results.sarif + retention-days: 5 + + # Upload the results to GitHub's code scanning dashboard (optional). + # Commenting out will disable upload of results to your repo's Code Scanning dashboard + - name: "Upload to code-scanning" + uses: github/codeql-action/upload-sarif@f09c1c0a94de965c15400f5634aa42fac8fb8f88 # v3.27.5 + with: + sarif_file: results.sarif diff --git a/README.md b/README.md index 65e246c..1153020 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # nodejs-loaders.github.io +[![OpenSSF Scorecard](https://api.scorecard.dev/projects/github.com/nodejs-loaders/nodejs-loaders.github.io/badge)](https://scorecard.dev/viewer/?uri=github.com/nodejs-loaders/nodejs-loaders.github.io) + A showcase website for the `nodejs-loader` project ## Development From 189393110fb41c00752109b2bca0f4d0c30fd074 Mon Sep 17 00:00:00 2001 From: Augustin Mauroy Date: Fri, 7 Feb 2025 12:30:24 +0100 Subject: [PATCH 04/15] Chore(`pull_request_template.md`): introduce (#17) --- .github/pull_request_template.md | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 .github/pull_request_template.md diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 0000000..a6a733c --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,28 @@ +## Description + + + +## Related Issue + +## Checklist + + + + + +The following have been checked: + +- [ ] `node --run test:unit` passes +- [ ] `node --run biome:ci` passes +- [ ] `node --run build` passes +- [ ] `node --run types:check` passes + + From 4a0f07f765c8412610e3fd3561eb5f73cd002b3a Mon Sep 17 00:00:00 2001 From: Augustin Mauroy Date: Fri, 7 Feb 2025 13:08:48 +0100 Subject: [PATCH 05/15] chore(CONTRIBUTING.md): introduce (#18) --- CONTRIBUTING.md | 76 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 CONTRIBUTING.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..c9f9ecb --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,76 @@ +# nodejs-loaders.github.io Contributing Guide + +Thank you for considering contributing to Node.js Loaders website! Contributions welcome, be they bug reports, feature requests, pull requests, or just questions. + +## Getting started + +Commands specifically relevant to this project are: + +Run the frontend unit tests: + +```bash +node --run test:unit +``` + +Lint, format, and check types can be handled by: + +```bash +node --run pre-commit +``` + +## Writing Content (Posts) + +To contribute a new post, create a new `.mdx` file in the `content/post/` directory. The file should include the following frontmatter: + +- `title`: The title of the post (string). +- `description`: A brief description of the post (string). +- `authors`: An array of author names (string). +- `date`: The date of the post in `YYYY-MM-DD` format (string). +- `category`: The category of the post (string). + +Here's an example: + +```mdx +--- +title: Your Post Title +description: A brief description of your post. +authors: YourName +date: 2025-02-07 +category: example +--- +``` + +Your post content goes here. You can use Markdown and JSX. + +## Pull Requests + +Changes should be atomic; do not combine multiple, discrete changes within a single PR. + +We use [squash merge](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/incorporating-changes-from-a-pull-request/about-pull-request-merges#squash-and-merge-your-commits) to create a single fresh commit based on PR title. The PR title should follow [Conventional Commit guidelines](https://www.conventionalcommits.org/en/v1.0.0/). Acceptable "types" are: + +Before a pull request is merged, the following requirements should be met: + +- The pull request has a descriptive title and follows the commit message guidelines. +- An approval is valid if there have been no major changes since it was granted. +- 24 hours after approval and no objections, the pull request can be merged. +- All tests pass (Github actions). + +## [Developer's Certificate of Origin 1.1](https://developercertificate.org) + +```txt +By contributing to this project, I certify that: + +- (a) The contribution was created in whole or in part by me and I have the right to + submit it under the open source license indicated in the file; or +- (b) The contribution is based upon previous work that, to the best of my knowledge, + is covered under an appropriate open source license and I have the right under that + license to submit that work with modifications, whether created in whole or in part + by me, under the same open source license (unless I am permitted to submit under a + different license), as indicated in the file; or +- (c) The contribution was provided directly to me by some other person who certified + (a), (b) or (c) and I have not modified it. +- (d) I understand and agree that this project and the contribution are public and that + a record of the contribution (including all personal information I submit with it, + including my sign-off) is maintained indefinitely and may be redistributed consistent + with this project or the open source license(s) involved. +``` From f8daee39ec4137092c3da62cfae0390348d9ca64 Mon Sep 17 00:00:00 2001 From: Augustin Mauroy <97875033+AugustinMauroy@users.noreply.github.com> Date: Wed, 12 Feb 2025 16:47:15 +0100 Subject: [PATCH 06/15] workflow: introduce ci (#16) --- .github/workflows/ci.yml | 50 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 .github/workflows/ci.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..586d10b --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,50 @@ +# yaml-language-server: $schema=https://json.schemastore.org/github-workflow.json + +name: Tests + +on: + push: + branches: [ "main" ] + pull_request: + # we use devlop branch for now before publishing the website + branches: [ "main", "develop" ] + +jobs: + quality: + runs-on: ubuntu-latest + steps: + - name: Harden Runner + uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4 + with: + egress-policy: audit + + - name: Checkout + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + - uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0 + with: + node-version-file: '.nvmrc' + - name: Setup Biome + uses: biomejs/setup-biome@c016c38f26f2c4a6eb3662679143614a254263fd # v2.3.0 + with: + version: latest + - name: Run Biome + run: biome ci . + - name: Check types + run: node --run types:check + + test: + runs-on: ubuntu-latest + needs: quality + steps: + - name: Harden Runner + uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4 + with: + egress-policy: audit + + - name: Checkout + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + - uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0 + with: + node-version-file: '.nvmrc' + - name: Run Tests + run: node --run test:unit From f55afcc35edd6633a54791ff858f376f3786dd6c Mon Sep 17 00:00:00 2001 From: Augustin Mauroy <97875033+AugustinMauroy@users.noreply.github.com> Date: Wed, 12 Feb 2025 17:19:28 +0100 Subject: [PATCH 07/15] feat(dependabot): introduce (#19) --- .github/dependabot.yml | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..2390cc2 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,36 @@ +# yaml-language-server: $schema=https://json.schemastore.org/dependabot-2.0.json + +version: 2 +updates: + - package-ecosystem: github-actions + commit-message: + prefix: setup + include: scope + directory: / + schedule: + interval: monthly + - package-ecosystem: npm + commit-message: + prefix: dep + include: scope + directory: / + ignore: + # Manually update major versions of @types/node with the version specified within .nvmrc + - dependency-name: '@types/node' + update-types: ['version-update:semver-major'] + open-pull-requests-limit: 10 + schedule: + interval: monthly + groups: + next-js: + patterns: + - 'next*' + react: + patterns: + - 'react' + - 'react-dom' + - '@types/react' + - '@types/react-dom' + nodejs-loaders: + patterns: + - '@nodejs-loaders/*' From e297ba46c1194ef51ff9536234ce065aae9c88d7 Mon Sep 17 00:00:00 2001 From: Augustin Mauroy <97875033+AugustinMauroy@users.noreply.github.com> Date: Wed, 12 Feb 2025 17:20:56 +0100 Subject: [PATCH 08/15] fix(ci): branch name --- .github/workflows/ci.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 586d10b..47a95c1 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -3,11 +3,11 @@ name: Tests on: + # we use devlop branch for now before publishing the website push: - branches: [ "main" ] + branches: [ "main", "devlop" ] pull_request: - # we use devlop branch for now before publishing the website - branches: [ "main", "develop" ] + branches: [ "main", "devlop" ] jobs: quality: From bc829dccf38bbd366a3487bc1ae64bd3d329439d Mon Sep 17 00:00:00 2001 From: Augustin Mauroy <97875033+AugustinMauroy@users.noreply.github.com> Date: Wed, 12 Feb 2025 17:22:59 +0100 Subject: [PATCH 09/15] fix: code format --- biome.jsonc | 3 +++ components/Landing/Hero/index.tsx | 1 - 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/biome.jsonc b/biome.jsonc index 4b14939..ebaaa0b 100644 --- a/biome.jsonc +++ b/biome.jsonc @@ -4,6 +4,9 @@ "include": ["**/*.ts", "**/*.tsx", "**/*.js", "**/*.css", "**/*.json"], "ignore": ["./node_modules", "./.next", "./out"] }, + "organizeImports": { + "enabled": false + }, "formatter": { "enabled": true, "useEditorconfig": true diff --git a/components/Landing/Hero/index.tsx b/components/Landing/Hero/index.tsx index 2fe513a..3a2525d 100644 --- a/components/Landing/Hero/index.tsx +++ b/components/Landing/Hero/index.tsx @@ -26,4 +26,3 @@ export const Hero: FC = () => ( ); - From 747290fc73eb774be6ff255330a2d48c030e0aa2 Mon Sep 17 00:00:00 2001 From: Augustin Mauroy <97875033+AugustinMauroy@users.noreply.github.com> Date: Wed, 12 Feb 2025 17:49:01 +0100 Subject: [PATCH 10/15] feat(metadata): add it --- app/apple-icon.jpg | Bin 0 -> 31416 bytes app/article/[[...categories]]/page.tsx | 12 ++++ app/article/post/[article]/page.tsx | 19 ++++++ app/icon.svg | 6 ++ app/layout.tsx | 7 ++ app/page.tsx | 2 +- package-lock.json | 88 ++++++++++++------------- package.json | 4 +- 8 files changed, 91 insertions(+), 47 deletions(-) create mode 100644 app/apple-icon.jpg create mode 100644 app/icon.svg diff --git a/app/apple-icon.jpg b/app/apple-icon.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f0061745cfd98b96c109e69992d3ccebb0c26497 GIT binary patch literal 31416 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 literal 0 HcmV?d00001 diff --git a/app/article/[[...categories]]/page.tsx b/app/article/[[...categories]]/page.tsx index 83750c7..6a2e25e 100644 --- a/app/article/[[...categories]]/page.tsx +++ b/app/article/[[...categories]]/page.tsx @@ -3,6 +3,7 @@ import { ArticleCard } from '~/components/Post/ArticleCard/index.tsx'; import { getPostsMetadata } from '~/lib/post.ts'; import styles from './page.module.css'; import type { FC } from 'react'; +import type { Metadata } from 'next'; type CategoriesParams = { categories?: string[]; @@ -43,6 +44,17 @@ export const generateStaticParams = () => { return params; }; +export const generateMetadata = async ({ + params, +}: PageProps): Promise => { + const currentCategories = (await params).categories || []; + + return { + title: `Articles${currentCategories.length > 0 ? ` - ${currentCategories.join(', ')}` : ''}`, + description: 'Here you can find all the articles available on the website.', + }; +}; + const Page: FC = async ({ params }) => { const currentCategories = (await params).categories || []; const postsMetadata = await getPostsMetadata(currentCategories[0]); diff --git a/app/article/post/[article]/page.tsx b/app/article/post/[article]/page.tsx index 6e7c695..11d4887 100644 --- a/app/article/post/[article]/page.tsx +++ b/app/article/post/[article]/page.tsx @@ -4,6 +4,7 @@ import { getAllPosts } from '~/lib/post.ts'; import { ArticleHeader } from '~/components/Post/ArticleHeader/index.tsx'; import styles from './page.module.css'; import type { FC } from 'react'; +import type { Metadata } from 'next'; import type { PostFrontmatter } from '~/types/frontmatter'; import '~/styles/markdown.css'; @@ -24,6 +25,24 @@ export async function generateStaticParams() { }); } +export async function generateMetadata({ + params, +}: PageProps): Promise { + const article = (await params).article; + const slugs = ['post', article]; + + const mdxResult = await getContent(slugs); + + if (!mdxResult) notFound(); + + const { frontmatter } = mdxResult; + + return { + title: frontmatter.title, + description: frontmatter.description, + }; +} + const Page: FC = async ({ params }) => { const article = (await params).article; const slugs = ['post', article]; diff --git a/app/icon.svg b/app/icon.svg new file mode 100644 index 0000000..2710636 --- /dev/null +++ b/app/icon.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/app/layout.tsx b/app/layout.tsx index 55a2fe7..1e9332a 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -3,8 +3,14 @@ import { GeistSans } from 'geist/font/sans'; import { GeistMono } from 'geist/font/mono'; import { Header } from '~/components/Sections/Header/index.tsx'; import type { FC, PropsWithChildren } from 'react'; +import type { Metadata } from 'next'; import '~/styles/globals.css'; +const metadata: Metadata = { + title: 'Nodejs-Loaders', + description: 'A collection of loaders for Node.js', +}; + const RootLayout: FC = ({ children }) => ( @@ -14,4 +20,5 @@ const RootLayout: FC = ({ children }) => ( ); +export { metadata }; export default RootLayout; diff --git a/app/page.tsx b/app/page.tsx index 13a66b2..eba8938 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -1,5 +1,5 @@ import { Hero } from '~/components/Landing/Hero/index.tsx'; -import { LatestArticleSection } from '~/components/Landing/LatestArticleSection/index.tsx'; +import { LatestArticleSection } from '~/components/Landing/LastestArticleSection/index.tsx'; import type { FC } from 'react'; const Page: FC = () => ( diff --git a/package-lock.json b/package-lock.json index 0ca0a44..0e4151f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "dependencies": { "@radix-ui/react-avatar": "~1.1.2", "classnames": "~2.5.1", - "next": "15.1.6", + "next": "15.1.7", "next-mdx-remote": "~5.0.0", "react": "19.0.0", "react-dom": "19.0.0" @@ -20,7 +20,7 @@ "@nodejs-loaders/css-module": "1.0.1", "@nodejs-loaders/tsx": "1.0.2", "@testing-library/react": "~16.2.0", - "@types/node": "~22.12.0", + "@types/node": "~22.13.1", "@types/react": "~19.0.8", "@types/react-dom": "~19.0.3", "autoprefixer": "~10.4.20", @@ -1290,15 +1290,15 @@ } }, "node_modules/@next/env": { - "version": "15.1.6", - "resolved": "https://registry.npmjs.org/@next/env/-/env-15.1.6.tgz", - "integrity": "sha512-d9AFQVPEYNr+aqokIiPLNK/MTyt3DWa/dpKveiAaVccUadFbhFEvY6FXYX2LJO2Hv7PHnLBu2oWwB4uBuHjr/w==", + "version": "15.1.7", + "resolved": "https://registry.npmjs.org/@next/env/-/env-15.1.7.tgz", + "integrity": "sha512-d9jnRrkuOH7Mhi+LHav2XW91HOgTAWHxjMPkXMGBc9B2b7614P7kjt8tAplRvJpbSt4nbO1lugcT/kAaWzjlLQ==", "license": "MIT" }, "node_modules/@next/swc-darwin-arm64": { - "version": "15.1.6", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.1.6.tgz", - "integrity": "sha512-u7lg4Mpl9qWpKgy6NzEkz/w0/keEHtOybmIl0ykgItBxEM5mYotS5PmqTpo+Rhg8FiOiWgwr8USxmKQkqLBCrw==", + "version": "15.1.7", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.1.7.tgz", + "integrity": "sha512-hPFwzPJDpA8FGj7IKV3Yf1web3oz2YsR8du4amKw8d+jAOHfYHYFpMkoF6vgSY4W6vB29RtZEklK9ayinGiCmQ==", "cpu": [ "arm64" ], @@ -1312,9 +1312,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "15.1.6", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.1.6.tgz", - "integrity": "sha512-x1jGpbHbZoZ69nRuogGL2MYPLqohlhnT9OCU6E6QFewwup+z+M6r8oU47BTeJcWsF2sdBahp5cKiAcDbwwK/lg==", + "version": "15.1.7", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.1.7.tgz", + "integrity": "sha512-2qoas+fO3OQKkU0PBUfwTiw/EYpN+kdAx62cePRyY1LqKtP09Vp5UcUntfZYajop5fDFTjSxCHfZVRxzi+9FYQ==", "cpu": [ "x64" ], @@ -1328,9 +1328,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "15.1.6", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.1.6.tgz", - "integrity": "sha512-jar9sFw0XewXsBzPf9runGzoivajeWJUc/JkfbLTC4it9EhU8v7tCRLH7l5Y1ReTMN6zKJO0kKAGqDk8YSO2bg==", + "version": "15.1.7", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.1.7.tgz", + "integrity": "sha512-sKLLwDX709mPdzxMnRIXLIT9zaX2w0GUlkLYQnKGoXeWUhcvpCrK+yevcwCJPdTdxZEUA0mOXGLdPsGkudGdnA==", "cpu": [ "arm64" ], @@ -1344,9 +1344,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "15.1.6", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.1.6.tgz", - "integrity": "sha512-+n3u//bfsrIaZch4cgOJ3tXCTbSxz0s6brJtU3SzLOvkJlPQMJ+eHVRi6qM2kKKKLuMY+tcau8XD9CJ1OjeSQQ==", + "version": "15.1.7", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.1.7.tgz", + "integrity": "sha512-zblK1OQbQWdC8fxdX4fpsHDw+VSpBPGEUX4PhSE9hkaWPrWoeIJn+baX53vbsbDRaDKd7bBNcXRovY1hEhFd7w==", "cpu": [ "arm64" ], @@ -1360,9 +1360,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "15.1.6", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.1.6.tgz", - "integrity": "sha512-SpuDEXixM3PycniL4iVCLyUyvcl6Lt0mtv3am08sucskpG0tYkW1KlRhTgj4LI5ehyxriVVcfdoxuuP8csi3kQ==", + "version": "15.1.7", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.1.7.tgz", + "integrity": "sha512-GOzXutxuLvLHFDAPsMP2zDBMl1vfUHHpdNpFGhxu90jEzH6nNIgmtw/s1MDwpTOiM+MT5V8+I1hmVFeAUhkbgQ==", "cpu": [ "x64" ], @@ -1376,9 +1376,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "15.1.6", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.1.6.tgz", - "integrity": "sha512-L4druWmdFSZIIRhF+G60API5sFB7suTbDRhYWSjiw0RbE+15igQvE2g2+S973pMGvwN3guw7cJUjA/TmbPWTHQ==", + "version": "15.1.7", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.1.7.tgz", + "integrity": "sha512-WrZ7jBhR7ATW1z5iEQ0ZJfE2twCNSXbpCSaAunF3BKcVeHFADSI/AW1y5Xt3DzTqPF1FzQlwQTewqetAABhZRQ==", "cpu": [ "x64" ], @@ -1392,9 +1392,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "15.1.6", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.1.6.tgz", - "integrity": "sha512-s8w6EeqNmi6gdvM19tqKKWbCyOBvXFbndkGHl+c9YrzsLARRdCHsD9S1fMj8gsXm9v8vhC8s3N8rjuC/XrtkEg==", + "version": "15.1.7", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.1.7.tgz", + "integrity": "sha512-LDnj1f3OVbou1BqvvXVqouJZKcwq++mV2F+oFHptToZtScIEnhNRJAhJzqAtTE2dB31qDYL45xJwrc+bLeKM2Q==", "cpu": [ "arm64" ], @@ -1408,9 +1408,9 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "15.1.6", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.1.6.tgz", - "integrity": "sha512-6xomMuu54FAFxttYr5PJbEfu96godcxBTRk1OhAvJq0/EnmFU/Ybiax30Snis4vdWZ9LGpf7Roy5fSs7v/5ROQ==", + "version": "15.1.7", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.1.7.tgz", + "integrity": "sha512-dC01f1quuf97viOfW05/K8XYv2iuBgAxJZl7mbCKEjMgdQl5JjAKJ0D2qMKZCgPWDeFbFT0Q0nYWwytEW0DWTQ==", "cpu": [ "x64" ], @@ -1822,9 +1822,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "22.12.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.12.0.tgz", - "integrity": "sha512-Fll2FZ1riMjNmlmJOdAyY5pUbkftXslB5DgEzlIuNaiWhXd00FhWxVC/r4yV/4wBb9JfImTu+jiSvXTkJ7F/gA==", + "version": "22.13.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.1.tgz", + "integrity": "sha512-jK8uzQlrvXqEU91UxiK5J7pKHyzgnI1Qnl0QDHIgVGuolJhRb9EEl28Cj9b3rGR8B2lhFCtvIm5os8lFnO/1Ew==", "dev": true, "license": "MIT", "dependencies": { @@ -4723,12 +4723,12 @@ } }, "node_modules/next": { - "version": "15.1.6", - "resolved": "https://registry.npmjs.org/next/-/next-15.1.6.tgz", - "integrity": "sha512-Hch4wzbaX0vKQtalpXvUiw5sYivBy4cm5rzUKrBnUB/y436LGrvOUqYvlSeNVCWFO/770gDlltR9gqZH62ct4Q==", + "version": "15.1.7", + "resolved": "https://registry.npmjs.org/next/-/next-15.1.7.tgz", + "integrity": "sha512-GNeINPGS9c6OZKCvKypbL8GTsT5GhWPp4DM0fzkXJuXMilOO2EeFxuAY6JZbtk6XIl6Ws10ag3xRINDjSO5+wg==", "license": "MIT", "dependencies": { - "@next/env": "15.1.6", + "@next/env": "15.1.7", "@swc/counter": "0.1.3", "@swc/helpers": "0.5.15", "busboy": "1.6.0", @@ -4743,14 +4743,14 @@ "node": "^18.18.0 || ^19.8.0 || >= 20.0.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "15.1.6", - "@next/swc-darwin-x64": "15.1.6", - "@next/swc-linux-arm64-gnu": "15.1.6", - "@next/swc-linux-arm64-musl": "15.1.6", - "@next/swc-linux-x64-gnu": "15.1.6", - "@next/swc-linux-x64-musl": "15.1.6", - "@next/swc-win32-arm64-msvc": "15.1.6", - "@next/swc-win32-x64-msvc": "15.1.6", + "@next/swc-darwin-arm64": "15.1.7", + "@next/swc-darwin-x64": "15.1.7", + "@next/swc-linux-arm64-gnu": "15.1.7", + "@next/swc-linux-arm64-musl": "15.1.7", + "@next/swc-linux-x64-gnu": "15.1.7", + "@next/swc-linux-x64-musl": "15.1.7", + "@next/swc-win32-arm64-msvc": "15.1.7", + "@next/swc-win32-x64-msvc": "15.1.7", "sharp": "^0.33.5" }, "peerDependencies": { diff --git a/package.json b/package.json index fb80442..e4ff160 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,7 @@ "dependencies": { "@radix-ui/react-avatar": "~1.1.2", "classnames": "~2.5.1", - "next": "15.1.6", + "next": "15.1.7", "next-mdx-remote": "~5.0.0", "react": "19.0.0", "react-dom": "19.0.0" @@ -33,7 +33,7 @@ "@nodejs-loaders/css-module": "1.0.1", "@nodejs-loaders/tsx": "1.0.2", "@testing-library/react": "~16.2.0", - "@types/node": "~22.12.0", + "@types/node": "~22.13.1", "@types/react": "~19.0.8", "@types/react-dom": "~19.0.3", "autoprefixer": "~10.4.20", From b4dc448adb0537c22726678a61c5de25e0a1f3bc Mon Sep 17 00:00:00 2001 From: Augustin Mauroy <97875033+AugustinMauroy@users.noreply.github.com> Date: Wed, 12 Feb 2025 18:51:13 +0100 Subject: [PATCH 11/15] fix: style --- app/article/[[...categories]]/page.module.css | 16 ++++++++-------- package.json | 2 +- styles/markdown.css | 10 ++++++++-- 3 files changed, 17 insertions(+), 11 deletions(-) diff --git a/app/article/[[...categories]]/page.module.css b/app/article/[[...categories]]/page.module.css index af73dfb..59ca66c 100644 --- a/app/article/[[...categories]]/page.module.css +++ b/app/article/[[...categories]]/page.module.css @@ -31,14 +31,14 @@ text-3xl text-transparent; } + } - .Articles { - @apply grid - grid-cols-1 - justify-center - gap-4 - md:grid-cols-2 - lg:grid-cols-3; - } + .articles { + @apply grid + grid-cols-1 + justify-center + gap-4 + md:grid-cols-2 + lg:grid-cols-3; } } diff --git a/package.json b/package.json index e4ff160..da334fc 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "license": "MIT", "type": "module", "scripts": { - "dev": "next dev --turbopack", + "dev": "next dev", "build": "next build", "biome:ci": "biome ci ./", "biome:format:fix": "biome format --fix ./", diff --git a/styles/markdown.css b/styles/markdown.css index 7771b1b..abbab68 100644 --- a/styles/markdown.css +++ b/styles/markdown.css @@ -59,7 +59,9 @@ ol { @apply list-decimal - pl-4; + pl-4 + pb-4 + ml-4; } blockquote { @@ -90,6 +92,7 @@ code { @apply text-sm + text-black bg-gray-200 rounded p-1 @@ -102,8 +105,11 @@ rounded p-4 my-4 + border + border-gray-400 overflow-x-auto - dark:bg-gray-800; + dark:bg-gray-800 + dark:border-gray-600; } img { From a4adff4493e88245006331291ef4b55cca41e8d1 Mon Sep 17 00:00:00 2001 From: Augustin Mauroy <97875033+AugustinMauroy@users.noreply.github.com> Date: Thu, 13 Feb 2025 10:27:38 +0100 Subject: [PATCH 12/15] content(react-test): first draft (#21) --- ...o-test-react-app-with-node-test-runner.mdx | 175 ++++++++++++++++++ 1 file changed, 175 insertions(+) create mode 100644 content/post/how-to-test-react-app-with-node-test-runner.mdx diff --git a/content/post/how-to-test-react-app-with-node-test-runner.mdx b/content/post/how-to-test-react-app-with-node-test-runner.mdx new file mode 100644 index 0000000..27cc0c9 --- /dev/null +++ b/content/post/how-to-test-react-app-with-node-test-runner.mdx @@ -0,0 +1,175 @@ +--- +title: How to test a React app with Node Test Runner +description: Drastically simplify and speed up testing your React app by switching to Node Test Runner. +date: 2025-02-12 +authors: AugustinMauroy +category: use-cases +--- + +## Introduction + +Testing is a crucial part of software development, ensuring that your application behaves as expected. With the [Node.js Test Runner](https://nodejs.org/en/learn/test-runner/introduction), you can seamlessly integrate testing into your [React](https://react.dev) application. This guide will walk you through the process of setting up and running tests for a React app using the Node.js Test Runner. + +Note that this article is design for nodej.js `^22.14.0` and `^23.6`. + +> I really recommend you to read the [Node.js Test Runner guides](https://nodejs.org/en/learn/test-runner/introduction) to understand how node.js test runner works. +> This guide assumes you have a basic understanding of React and testing. + +## Installing the Dependencies + +First, you need to install the necessary dependencies. In addition to your React app dependencies, you will need the following: + +```bash +npm add --save-dev @testing-library/react @testing-library/dom jsdom global-jsdom +``` + +> **Note**: The rest of the dependencies we will use come from Node.js. + +## Writing the Component to Be Tested + +Let's create a simple React component that we will test. This component will be a counter that increments a value when a button is clicked. + +```tsx +'use client'; +import { useState } from 'react'; +import styles from './index.module.css'; +import type { FC } from 'react'; + +const Counter: FC = () => { + const [count, setCount] = useState(0); + + return ( +
    +

    {count}

    + +
    + ); +}; + +export default Counter; +``` + +
    + `index.module.css` + + ```css + .container { + @apply flex flex-col items-center justify-center; + + .count { + @apply text-4xl; + } + + .button { + @apply px-4 py-2 bg-blue-500 text-white rounded-md; + } + } + ``` +
    + +## Registering Node.js Loaders + +To handle TypeScript and CSS modules, you need to register the appropriate loaders. Create a file named `node-hooks/react-test.js` and add the following code: + +> To understand what is a loader, check out [this post](/blog/post/how-to-use-nodejs-loader). + +You'll need to register the loaders for TypeScript and CSS modules: + +First let's install the loaders as dev dependencies: + +```bash +npm add -D @nodejs-loaders/tsx @nodejs-loaders/css-module +``` + +Then, create the registration file: + +```js +import { register } from 'node:module'; +import jsdom from 'global-jsdom'; + +// Register the loaders +register('@nodejs-loaders/tsx', import.meta.url); +register('@nodejs-loaders/css-module', import.meta.url); + +// Create a JSDOM environment +jsdom(undefined, { + // ⚠️ Failing to specify this will likely lead to many 🤬 + url: 'https://test.example.com', +}); +``` + +> **NOTE:** You may need to use `@nodejs-loaders/alias` to allow Node.js to understand path aliases in your TypeScript files. + +## Writing the Test + +Now, let's write a test for the `Counter` component. Create a file named `index.test.tsx` in the same directory as your component: + +```tsx +import assert from 'node:assert/strict'; +import { describe, it } from 'node:test'; +import { render, fireEvent, screen } from '@testing-library/react'; +import Counter from './index.ts'; // ⚠️ We need to import the file with the .ts extension + +describe('Counter', () => { + it('should increment the count when the button is clicked', () => { + const { unmount } = render(); + + const button = screen.getByRole('button', { name: /increment/i }); + const count = screen.getByText('0'); + + assert.strictEqual(count.textContent, '0'); + + fireEvent.click(button); + + assert.strictEqual(count.textContent, '1'); + + // ⚠️ It's a good idea to unmount the component to prevent it spilling over into the DOM of other tests + unmount(); + }); +}); +``` + +### Structure of a Test File + +A typical test file structure includes: + +1. **Imports**: Import the necessary modules and components. +2. **Test Suite**: Define a test suite using `describe`. +3. **Test Case**: Define individual test cases using `it`. +4. **Render the Component**: Render the component to be tested. +5. **Perform Actions**: Simulate user interactions or other actions. +6. **Assertions**: Make assertions to verify the expected behavior. +7. **Unmount the Component**: Clean up by unmounting the component. + +## Running the Test + +To run the test, use the following command: + +```bash +node --test --import=./node-hooks/react-test.js **/*.test.tsx +``` + +You can also add a script to your `package.json` to simplify running the tests: + +```json fileName="package.json" +{ + "scripts": { + "test:unit": "node --test --import=./node-hooks/react-test.js **/*.test.tsx", + "test:watch": "node --test --watch --import=./node-hooks/react-test.js **/*.test.tsx" + } +} +``` + +> **Note**: You can add more patterns to the glob pattern to test more files. For example, `**/*.test.ts` to test all TypeScript files. + +And then to call the script you can use `--run`: + +```bash +node --run test:unit # or node --run test:watch +``` + +## Conclusion + +Testing your React app with the Node.js Test Runner is a straightforward process. By following the steps outlined in this guide, you can ensure that your components behave as expected. Happy testing! From f4503a5ab8a11a8435195a4ff887da03f7beefb4 Mon Sep 17 00:00:00 2001 From: Augustin Mauroy <97875033+AugustinMauroy@users.noreply.github.com> Date: Sun, 16 Feb 2025 11:54:38 +0100 Subject: [PATCH 13/15] style: migrate to tailwind v4 (#22) Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- app/article/[[...categories]]/page.module.css | 44 - app/article/[[...categories]]/page.tsx | 15 +- app/article/post/[article]/page.module.css | 5 - app/article/post/[article]/page.tsx | 3 +- .../Common/AuthorsList/index.module.css | 5 - components/Common/AuthorsList/index.tsx | 3 +- components/Common/Avatar/index.module.css | 40 - components/Common/Avatar/index.tsx | 13 +- components/Common/Button/index.module.css | 59 +- .../CategoriesSelector/index.module.css | 31 - .../Common/CategoriesSelector/index.tsx | 16 +- components/Landing/Hero/index.module.css | 41 - components/Landing/Hero/index.tsx | 14 +- .../LastestArticleSection/index.module.css | 6 +- .../Landing/LastestArticleSection/index.tsx | 6 +- components/Post/ArticleCard/index.module.css | 55 - .../Post/ArticleCard/index.test.tsx.snapshot | 4 +- components/Post/ArticleCard/index.tsx | 24 +- .../Post/ArticleHeader/index.module.css | 18 - components/Post/ArticleHeader/index.tsx | 7 +- .../Post/LastestArticle/index.module.css | 12 - components/Post/LastestArticle/index.tsx | 5 +- components/Sections/Header/index.module.css | 52 - components/Sections/Header/index.tsx | 19 +- components/Sections/NotFound/index.module.css | 20 - components/Sections/NotFound/index.tsx | 9 +- package-lock.json | 1877 +++++------------ package.json | 4 +- postcss.config.js | 4 +- registers/react.ts | 1 - styles/globals.css | 39 +- styles/markdown.css | 12 +- tailwind.config.ts | 28 - 33 files changed, 702 insertions(+), 1789 deletions(-) delete mode 100644 app/article/[[...categories]]/page.module.css delete mode 100644 app/article/post/[article]/page.module.css delete mode 100644 components/Common/AuthorsList/index.module.css delete mode 100644 components/Common/Avatar/index.module.css delete mode 100644 components/Common/CategoriesSelector/index.module.css delete mode 100644 components/Landing/Hero/index.module.css delete mode 100644 components/Post/ArticleCard/index.module.css delete mode 100644 components/Post/ArticleHeader/index.module.css delete mode 100644 components/Post/LastestArticle/index.module.css delete mode 100644 components/Sections/Header/index.module.css delete mode 100644 components/Sections/NotFound/index.module.css delete mode 100644 tailwind.config.ts diff --git a/app/article/[[...categories]]/page.module.css b/app/article/[[...categories]]/page.module.css deleted file mode 100644 index 59ca66c..0000000 --- a/app/article/[[...categories]]/page.module.css +++ /dev/null @@ -1,44 +0,0 @@ -.page { - @apply container - mx-auto - px-4 - py-8; - - h1 { - @apply mb-4 - font-bold - text-3xl - lg:text-4xl; - } - - p { - @apply mb-4 - max-w-screen-md - text-gray-500 - dark:text-gray-400; - } - - .noArticles { - @apply mt-8; - - p { - @apply bg-gradient-to-r - from-green-300 - to-green-800 - bg-clip-text - text-center - font-black - text-3xl - text-transparent; - } - } - - .articles { - @apply grid - grid-cols-1 - justify-center - gap-4 - md:grid-cols-2 - lg:grid-cols-3; - } -} diff --git a/app/article/[[...categories]]/page.tsx b/app/article/[[...categories]]/page.tsx index 6a2e25e..6a301d2 100644 --- a/app/article/[[...categories]]/page.tsx +++ b/app/article/[[...categories]]/page.tsx @@ -1,7 +1,6 @@ import { CategoriesSelector } from '~/components/Common/CategoriesSelector/index.tsx'; import { ArticleCard } from '~/components/Post/ArticleCard/index.tsx'; import { getPostsMetadata } from '~/lib/post.ts'; -import styles from './page.module.css'; import type { FC } from 'react'; import type { Metadata } from 'next'; @@ -60,9 +59,9 @@ const Page: FC = async ({ params }) => { const postsMetadata = await getPostsMetadata(currentCategories[0]); return ( -
    -

    Article list

    -

    +

    +

    Article list

    +

    Here you can find all the articles available on the website. You can filter them by category using the dropdown below.

    @@ -71,11 +70,13 @@ const Page: FC = async ({ params }) => { categories={CATEGORIES} /> {postsMetadata.length === 0 ? ( -
    -

    No articles here for now

    +
    +

    + No articles here for now +

    ) : ( -
    +
    {postsMetadata.map(post => ( ))} diff --git a/app/article/post/[article]/page.module.css b/app/article/post/[article]/page.module.css deleted file mode 100644 index 2057ca7..0000000 --- a/app/article/post/[article]/page.module.css +++ /dev/null @@ -1,5 +0,0 @@ -.page { - @apply container - mx-auto - px-4; -} diff --git a/app/article/post/[article]/page.tsx b/app/article/post/[article]/page.tsx index 11d4887..9755701 100644 --- a/app/article/post/[article]/page.tsx +++ b/app/article/post/[article]/page.tsx @@ -2,7 +2,6 @@ import { notFound } from 'next/navigation'; import { getContent } from '~/lib/content.ts'; import { getAllPosts } from '~/lib/post.ts'; import { ArticleHeader } from '~/components/Post/ArticleHeader/index.tsx'; -import styles from './page.module.css'; import type { FC } from 'react'; import type { Metadata } from 'next'; import type { PostFrontmatter } from '~/types/frontmatter'; @@ -54,7 +53,7 @@ const Page: FC = async ({ params }) => { const { content, frontmatter } = mdxResult; return ( -
    +
    = ({ authors }) => { )); - return
    {authorsList}
    ; + return
    {authorsList}
    ; }; diff --git a/components/Common/Avatar/index.module.css b/components/Common/Avatar/index.module.css deleted file mode 100644 index 2355bde..0000000 --- a/components/Common/Avatar/index.module.css +++ /dev/null @@ -1,40 +0,0 @@ -.root { - @apply flex - size-10 - shrink-0 - overflow-hidden - rounded-md - outline - outline-2 - outline-green-300 - dark:outline-green-800 - shadow-sm - transition-shadow - shadow-green-300 - dark:shadow-green-800; - - &:has(.image):hover { - @apply shadow-md - shadow-green-400 - dark:shadow-green-700; - } -} - -.image { - @apply aspect-square - size-full; -} - -.fallback { - @apply flex - size-full - items-center - justify-center - rounded-md - bg-green-100 - text-base - font-bold - text-black - dark:bg-green-800 - dark:text-white; -} diff --git a/components/Common/Avatar/index.tsx b/components/Common/Avatar/index.tsx index 8909dd2..4f06d64 100644 --- a/components/Common/Avatar/index.tsx +++ b/components/Common/Avatar/index.tsx @@ -1,7 +1,6 @@ 'use client'; import * as AvatarPrimitive from '@radix-ui/react-avatar'; import classNames from 'classnames'; -import styles from './index.module.css'; import type { ComponentProps } from 'react'; const Avatar = ({ @@ -11,7 +10,10 @@ const Avatar = ({ }: ComponentProps) => ( ); @@ -25,7 +27,7 @@ const AvatarImage = ({ }: ComponentProps) => ( ); @@ -39,7 +41,10 @@ const AvatarFallback = ({ }: ComponentProps) => ( ); diff --git a/components/Common/Button/index.module.css b/components/Common/Button/index.module.css index ecd33e2..b4bd757 100644 --- a/components/Common/Button/index.module.css +++ b/components/Common/Button/index.module.css @@ -1,5 +1,7 @@ +@reference "../../../styles/globals.css"; + .button { - @apply rounded + @apply rounded-sm inline-flex items-center justify-center @@ -8,15 +10,9 @@ py-2 transition duration-300 - ease-in-out; - - &:focus { - @apply outline-none; - } - - svg { - @apply size-5; - } + ease-in-out + focus:outline-none + has-[svg]:*:size-5; } .primary { @@ -26,15 +22,12 @@ bg-green-500 text-white dark:bg-green-400 - dark:text-gray-900; - - &:hover { - @apply border-gray-600 - bg-transparent - text-gray-600 - dark:text-gray-300 - dark:border-gray-300; - } + dark:text-gray-900 + hover:border-gray-600 + hover:bg-transparent + hover:text-gray-600 + hover:dark:text-gray-300 + hover:dark:border-gray-300; } .secondary { @@ -44,15 +37,12 @@ bg-gray-600 text-white dark:bg-gray-300 - dark:text-gray-900; - - &:hover { - @apply border-gray-600 - bg-transparent - text-gray-600 - dark:text-gray-300 - dark:border-gray-300; - } + dark:text-gray-900 + hover:border-gray-600 + hover:bg-transparent + hover:text-gray-600 + hover:dark:text-gray-300 + hover:dark:border-gray-300; } .special { @@ -62,12 +52,9 @@ bg-transparent text-gray-600 dark:text-gray-300 - dark:border-gray-300; - - &:hover { - @apply bg-green-500 - text-white - dark:bg-green-400 - dark:text-gray-900; - } + dark:border-gray-300 + hover:bg-green-500 + hover:text-white + hover:dark:bg-green-400 + hover:dark:text-gray-900; } diff --git a/components/Common/CategoriesSelector/index.module.css b/components/Common/CategoriesSelector/index.module.css deleted file mode 100644 index 25867c6..0000000 --- a/components/Common/CategoriesSelector/index.module.css +++ /dev/null @@ -1,31 +0,0 @@ -.categoriesSelector { - @apply flex - space-x-2 - border-green-400 - border-b-4 - mb-4 - text-gray-800 - dark:text-gray-200 - dark:border-green-600; - - .item { - @apply flex - items-center - px-2 - py-1 - rounded-t-md - cursor-pointer - transition - duration-200 - hover:bg-green-400 - hover:text-white - dark:hover:bg-green-600 - dark:hover:text-white; - - &.active { - @apply bg-green-400 - text-white - dark:bg-green-600; - } - } -} diff --git a/components/Common/CategoriesSelector/index.tsx b/components/Common/CategoriesSelector/index.tsx index 8619928..b9d91ab 100644 --- a/components/Common/CategoriesSelector/index.tsx +++ b/components/Common/CategoriesSelector/index.tsx @@ -1,5 +1,4 @@ import classNames from 'classnames'; -import styles from './index.module.css'; import type { FC } from 'react'; type CategoriesSelectorProps = { @@ -14,15 +13,18 @@ export const CategoriesSelector: FC = ({ currentCategories, categories, }) => ( -
      +
        {categories.map((category, i) => (
      • {category.category} diff --git a/components/Landing/Hero/index.module.css b/components/Landing/Hero/index.module.css deleted file mode 100644 index 572174c..0000000 --- a/components/Landing/Hero/index.module.css +++ /dev/null @@ -1,41 +0,0 @@ -.hero { - @apply flex - h-[calc(100vh-4rem)] - w-full - flex-col - items-center - justify-center - gap-8 - bg-gradient-to-b - from-transparent - via-green-50/50 - to-green-50 - px-10 - dark:from-transparent - dark:via-green-800/25 - dark:to-green-800; - - h1 { - @apply text-center - font-bold - text-4xl; - - code { - @apply rounded - bg-gray-200 - p-1 - dark:bg-gray-800 - dark:text-gray-200; - } - } - - p { - @apply text-center - dark:text-gray-200; - } - - .actions { - @apply flex - gap-4; - } -} diff --git a/components/Landing/Hero/index.tsx b/components/Landing/Hero/index.tsx index 3a2525d..7c060d6 100644 --- a/components/Landing/Hero/index.tsx +++ b/components/Landing/Hero/index.tsx @@ -1,18 +1,20 @@ import { ButtonLink } from '~/components/Common/Button/Link/index.tsx'; import { NPMIcon } from '~/components/Icons/NPM.tsx'; -import styles from './index.module.css'; import type { FC } from 'react'; export const Hero: FC = () => ( -
        -

        - Nodejs-Loaders - A collection of loaders for Node.js +
        +

        + + Nodejs-Loaders + {' '} + - A collection of loaders for Node.js

        -

        +

        This project is a collection of loaders for Node.js. It's allow you to have a lightweight and fast devlopment or testing environment.

        -
        +
        Read more about us diff --git a/components/Landing/LastestArticleSection/index.module.css b/components/Landing/LastestArticleSection/index.module.css index 0bc64fc..28b2152 100644 --- a/components/Landing/LastestArticleSection/index.module.css +++ b/components/Landing/LastestArticleSection/index.module.css @@ -1,3 +1,5 @@ +@reference "../../../styles/globals.css"; + .section { @apply bg-green-50 px-10 @@ -10,14 +12,14 @@ border-b-2 dark:border-gray-200; - h2 { + .title { @apply mb-2 font-bold text-3xl dark:text-white; } - p { + .p { @apply font-semibold text-gray-600 dark:text-gray-200; diff --git a/components/Landing/LastestArticleSection/index.tsx b/components/Landing/LastestArticleSection/index.tsx index 5d56afd..0b5626f 100644 --- a/components/Landing/LastestArticleSection/index.tsx +++ b/components/Landing/LastestArticleSection/index.tsx @@ -5,8 +5,10 @@ import type { FC } from 'react'; export const LatestArticleSection: FC = () => (
        -

        Lastes Articles

        -

        Discover the lastest articles about Nodejs-Loaders

        +

        Lastes Articles

        +

        + Discover the lastest articles about Nodejs-Loaders +

        diff --git a/components/Post/ArticleCard/index.module.css b/components/Post/ArticleCard/index.module.css deleted file mode 100644 index baaf4dc..0000000 --- a/components/Post/ArticleCard/index.module.css +++ /dev/null @@ -1,55 +0,0 @@ -.content { - @apply bg-white p-4 - rounded-md - max-w-96 - border-2 - border-gray-600 - dark:bg-gray-800 - dark:text-white - dark:border-gray-800; - - .title { - @apply text-2xl - font-bold - text-green-600 - mb-2 - dark:text-green-400; - - a { - @apply text-green-600 - hover:text-green-800 - dark:text-green-400 - dark:hover:text-green-300; - } - } - - .description { - @apply text-gray-700 - mb-2 - dark:text-gray-300 - font-medium; - } - - .meta { - @apply flex - justify-between - items-center - gap-1.5 - text-gray-500 - dark:text-gray-400; - - .author { - @apply text-gray-600 - dark:text-gray-300 - font-medium - truncate; - } - - .date { - @apply text-gray-600 - dark:text-gray-300 - font-thin - flex-shrink-0; - } - } -} diff --git a/components/Post/ArticleCard/index.test.tsx.snapshot b/components/Post/ArticleCard/index.test.tsx.snapshot index 46b81e8..52d3e2d 100644 --- a/components/Post/ArticleCard/index.test.tsx.snapshot +++ b/components/Post/ArticleCard/index.test.tsx.snapshot @@ -1,7 +1,7 @@ exports[`ArticleCard > should render as a div by default 1`] = ` -"

        Test Title

        Test Description

        Author1, Author22025-07-01
        " +"
        " `; exports[`ArticleCard > should render as a li when specified 1`] = ` -"
      • Test Title

        Test Description

        Author1, Author22025-07-01
      • " +"
      • Test Title

        Test Description

        Author1, Author22025-07-01
      • " `; diff --git a/components/Post/ArticleCard/index.tsx b/components/Post/ArticleCard/index.tsx index 7a146fd..5a8b7e8 100644 --- a/components/Post/ArticleCard/index.tsx +++ b/components/Post/ArticleCard/index.tsx @@ -1,4 +1,3 @@ -import styles from './index.module.css'; import { postSlug2Href } from '~/utils/postUtils.ts'; import type { FC } from 'react'; import type { PostFrontmatter } from '~/types/frontmatter.ts'; @@ -16,16 +15,25 @@ export const ArticleCard: FC = ({ slug, as: Component = 'div', }) => ( - -

        - {title} + +

        + + {title} +

        -

        {description}

        -
        - +

        + {description} +

        +
        + {authors.split(',').slice(0, 2).join(', ')} - {date} + + {date} +
        ); diff --git a/components/Post/ArticleHeader/index.module.css b/components/Post/ArticleHeader/index.module.css deleted file mode 100644 index 37a9483..0000000 --- a/components/Post/ArticleHeader/index.module.css +++ /dev/null @@ -1,18 +0,0 @@ -.header { - @apply my-8 - border-gray-200 - border-b-2 - dark:border-gray-800; - - h1 { - @apply font-bold - text-3xl - lg:text-4xl; - } - - p { - @apply text-gray-500 - text-lg - dark:text-gray-400; - } -} diff --git a/components/Post/ArticleHeader/index.tsx b/components/Post/ArticleHeader/index.tsx index 7764328..f801bf6 100644 --- a/components/Post/ArticleHeader/index.tsx +++ b/components/Post/ArticleHeader/index.tsx @@ -1,5 +1,4 @@ import { AuthorsList } from '~/components/Common/AuthorsList/index.tsx'; -import styles from './index.module.css'; import type { FC } from 'react'; type ArticleHeaderProps = { @@ -13,9 +12,9 @@ export const ArticleHeader: FC = ({ description, authors, }) => ( -
        -

        {title}

        -

        {description}

        +
        +

        {title}

        +

        {description}

        ); diff --git a/components/Post/LastestArticle/index.module.css b/components/Post/LastestArticle/index.module.css deleted file mode 100644 index cb837c4..0000000 --- a/components/Post/LastestArticle/index.module.css +++ /dev/null @@ -1,12 +0,0 @@ -.wrapper { - @apply w-full; - - ul { - @apply flex - flex-col - items-center - justify-between - gap-4 - xl:flex-row; - } -} diff --git a/components/Post/LastestArticle/index.tsx b/components/Post/LastestArticle/index.tsx index 07c0833..c1ec900 100644 --- a/components/Post/LastestArticle/index.tsx +++ b/components/Post/LastestArticle/index.tsx @@ -1,6 +1,5 @@ import { getPostsMetadata } from '~/lib/post.ts'; import { ArticleCard } from '../ArticleCard/index.tsx'; -import styles from './index.module.css'; import type { FC } from 'react'; type LastestArticleProps = { @@ -15,11 +14,11 @@ export const LastestArticle: FC = async ({ limit }) => { }); return ( -
        +
        {usedPostsMetadata.length === 0 ? (

        No posts found.

        ) : ( -
          +
            {usedPostsMetadata.map(postMetadata => (
          • diff --git a/components/Sections/Header/index.module.css b/components/Sections/Header/index.module.css deleted file mode 100644 index 27810b9..0000000 --- a/components/Sections/Header/index.module.css +++ /dev/null @@ -1,52 +0,0 @@ -.header { - @apply border-b-2 - border-gray-600 - w-full - h-16 - px-4 - text-gray-600 - flex - justify-between - items-center - bg-gray-50 - dark:text-gray-300 - dark:bg-gray-900; - - .logo { - @apply cursor-pointer - rounded - py-0.5 - inline-flex - items-center - text-lg - gap-2 - px-1; - - &:hover { - @apply bg-gray-200 - dark:bg-gray-800; - } - } - - .nav { - @apply flex - items-center - gap-4; - - ul { - @apply flex - items-center - gap-4; - - li:has(a > svg) { - @apply p-1 - rounded-sm; - - &:hover { - @apply bg-gray-200 - dark:bg-gray-800; - } - } - } - } -} diff --git a/components/Sections/Header/index.tsx b/components/Sections/Header/index.tsx index 669ce3f..09fec10 100644 --- a/components/Sections/Header/index.tsx +++ b/components/Sections/Header/index.tsx @@ -2,7 +2,6 @@ import Link from 'next/link'; import { ButtonLink } from '~/components/Common/Button/Link/index.tsx'; import { Logo } from '~/components/Icons/Logo.tsx'; import { GithubIcon } from '~/components/Icons/Github.tsx'; -import styles from './index.module.css'; import type { FC } from 'react'; const NAVIGATION = [ @@ -17,13 +16,16 @@ const NAVIGATION = [ ]; export const Header: FC = () => ( -
            - +
            + Nodejs-loaders -