diff --git a/.changeset/funny-wombats-lie.md b/.changeset/funny-wombats-lie.md new file mode 100644 index 0000000000..a5257d4674 --- /dev/null +++ b/.changeset/funny-wombats-lie.md @@ -0,0 +1,8 @@ +--- +"uploadthing": major +--- + +refactor: reduce bundle size + +We've continued our efforts to reduce the bundle size of the client side javascript. In a previous minor release, we reduced the bundle size by 70%, from 120kB to 40kB. This release continues on that work with a further reduction of 35% down to just over 25kB client side +javascript shipped to the browser from the `uploadthing/client` package. \ No newline at end of file diff --git a/.changeset/honest-rats-invent.md b/.changeset/honest-rats-invent.md new file mode 100644 index 0000000000..97686ebe70 --- /dev/null +++ b/.changeset/honest-rats-invent.md @@ -0,0 +1,8 @@ +--- +"uploadthing": major +--- + +feat!: change signature of `genUploader` to return an object with 2 functions, `uploadFiles` and `createUpload` + +`createUpload` can be used to create a resumable upload which you can pause and resume as you wish. +See example: https://github.com/pingdotgg/uploadthing/blob/v7/examples/backend-adapters/client-vanilla/src/resumable-upload.ts \ No newline at end of file diff --git a/.changeset/lucky-lobsters-cough.md b/.changeset/lucky-lobsters-cough.md new file mode 100644 index 0000000000..7c87dd53dc --- /dev/null +++ b/.changeset/lucky-lobsters-cough.md @@ -0,0 +1,10 @@ +--- +"uploadthing": major +"@uploadthing/shared": major +--- + +feat!: use ingest server + +Multi Part Uplaods hasve been abstracted away and files are now uploaded as a single stream to UploadThing, reducing the manual steps required to upload files and improves performance. + +Polling has been removed in favor of a streaming upload process with instant feedback \ No newline at end of file diff --git a/.changeset/tame-turkeys-listen.md b/.changeset/tame-turkeys-listen.md new file mode 100644 index 0000000000..048f8fb671 --- /dev/null +++ b/.changeset/tame-turkeys-listen.md @@ -0,0 +1,8 @@ +--- +"@uploadthing/shared": major +"uploadthing": major +--- + +chore: update paths to new api domain + +Previously the SDK version was just sent in the header which made it cumbersome to make large changes on the API without risking breaking older versions. This change improves our flexibility to make changes to the API without needing to do a major bump on the SDK. It should come with some nice performance wins too! diff --git a/.changeset/violet-melons-matter.md b/.changeset/violet-melons-matter.md new file mode 100644 index 0000000000..ab5593676a --- /dev/null +++ b/.changeset/violet-melons-matter.md @@ -0,0 +1,85 @@ +--- +"uploadthing": major +--- + +## 🚨 Breaking Changes + +### General + +- Change `UPLOADTHING_API_KEY` to `UPLOADTHING_TOKEN`. The token contains both your API key and some other metadata required by the SDK. You can get a token from the [UploadThing dashboard](https://uploadthing.com/dashboard). All options related to `uploadthingSecret` / `apiKey` has now been removed and replaced with `token`: + +```diff +- createRouteHandler({ router, config: { uploadthingSecret: 'sk_123' } }) ++ createRouteHandler({ router, config: { token: 'MY_TOKEN' } }) + +- new UTApi({ apiKey: 'sk_123' }) ++ new UTApi({ token: 'MY_TOKEN' }) +``` + +- If you relied on the `CUSTOM_INFRA_URL` environment variable override, you will have to change this to `UPLOADTHING_API_URL` or `UPLOADTHING_INGEST_URL` depending on your use case. + +### `uploadthing/client` + +- Change signature of `genUploader` to return an object instead of a single function. + +```diff +- const uploadFiles = genUploader(opts) ++ const { uploadFiles } = genUploader(opts) +``` + +- Remove `uploadFiles.skipPolling` option in favor of a new server-side RouteOption `awaitServerData`. If you want your client callback to run as soon as the file has been uploaded, +without waiting for your server side `onUploadComplete` to run, you can now set `awaitServerData` to `false`. + +```diff + // Client option + uploadFiles({ +- skipPolling: true + }) + // Server option + const router = { + myRoute: f( + { ... }, ++ { awaitServerData: false } + ) + } +``` + +Read more about the new `RouteOptions` in the [📚 Server API Reference docs](https://docs.uploadthing.com/api-reference/server#route-options) + +### Adapters + +- Change `config.logLevel` levels. Most are now capitalized to match our new logger. Auto-complete should make migrating trivial. + +```diff +- logLevel: 'info' ++ logLevel: 'Info' +``` + +- `uploadthing/server` adapter now returns a single function instead of individual named functions. The handler accepts a request and will handle routing internally. + +```diff +- const { GET, POST } = createRouteHandler({ router, config }) ++ const handler = createRouteHandler({ router, config }) +``` + +You can re-export the handler as named functions if your framework requires it. + +```ts +const handler = createRouteHandler({ router, config }) +export { handler as GET, handler as POST } +``` + +## Features + +### General + +- Add new configuration provider. All config options (e.g. `UTApi.constructor` options or `createRouteHandler.config` option can now also be set using an environment variable. Setting the option in the constructor is still supported and takes precedence over the environment variable. + +```ts +const api = new UTApi({ + logLevel: 'Info', +}) +// is the same as +process.env.UPLOADTHING_LOG_LEVEL = 'Info' +const api = new UTApi() +``` \ No newline at end of file diff --git a/.github/analyze-bundle.js b/.github/analyze-bundle.js index 67a2e78ac2..d0f31259e7 100644 --- a/.github/analyze-bundle.js +++ b/.github/analyze-bundle.js @@ -77,8 +77,8 @@ function formatDiff(diff) { let treemapMain = "_No treemap on forks_"; let treemapPr = "_No treemap on forks_"; if ( - typeof process.env.UPLOADTHING_SECRET === "string" && - process.env.UPLOADTHING_SECRET.length > 0 + typeof process.env.UPLOADTHING_TOKEN === "string" && + process.env.UPLOADTHING_TOKEN.length > 0 ) { const utapi = new UTApi(); const files = await utapi.uploadFiles([ diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 81e2a7b1f6..8f56638a5d 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -5,7 +5,6 @@ name: CI env: TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }} TURBO_TEAM: ${{ secrets.TURBO_TEAM }} - UPLOADTHING_TEST_SECRET: ${{ secrets.UPLOADTHING_TEST_SECRET }} on: push: @@ -34,6 +33,8 @@ jobs: run: pnpm turbo build --filter "./packages/*" - name: Test run: pnpm run test + env: + UPLOADTHING_TEST_TOKEN: ${{ secrets.UPLOADTHING_TEST_TOKEN }} lint: runs-on: ubuntu-latest @@ -140,4 +141,4 @@ jobs: run: node .github/analyze-bundle.js env: GITHUB_TOKEN: ${{ github.token }} - UPLOADTHING_SECRET: ${{ secrets.UPLOADTHING_E2E_TEST_SECRET }} \ No newline at end of file + UPLOADTHING_TOKEN: ${{ secrets.UPLOADTHING_E2E_TEST_TOKEN }} diff --git a/.github/workflows/examples.yaml b/.github/workflows/examples.yaml index 7e223c4e0e..6b782fff3f 100644 --- a/.github/workflows/examples.yaml +++ b/.github/workflows/examples.yaml @@ -44,8 +44,8 @@ jobs: - name: Run E2E Tests (if exists) run: pnpm turbo --filter ./examples/${{ matrix.dir }} test env: - UPLOADTHING_SECRET: ${{ secrets.UPLOADTHING_E2E_TEST_SECRET }} - + UPLOADTHING_TOKEN: ${{ secrets.UPLOADTHING_E2E_TEST_TOKEN }} + - uses: actions/upload-artifact@v4 if: ${{ !cancelled() && matrix.dir == 'backend-adapters' }} with: diff --git a/docs/.gitignore b/docs/.gitignore index 41af0c8a50..e93b39e161 100644 --- a/docs/.gitignore +++ b/docs/.gitignore @@ -1,5 +1,40 @@ -.next -node_modules +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# local env files +.env*.local + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts + +# sitemap public/robots.txt public/sitemap.xml -public/sitemap-0.xml \ No newline at end of file +public/sitemap-0.xml diff --git a/docs/LICENSE.md b/docs/LICENSE.md new file mode 100644 index 0000000000..e4909c66d2 --- /dev/null +++ b/docs/LICENSE.md @@ -0,0 +1,213 @@ +# Tailwind UI License + +## Personal License + +Tailwind Labs Inc. grants you an on-going, non-exclusive license to use the +Components and Templates. + +The license grants permission to **one individual** (the Licensee) to access and +use the Components and Templates. + +You **can**: + +- Use the Components and Templates to create unlimited End Products. +- Modify the Components and Templates to create derivative components and + templates. Those components and templates are subject to this license. +- Use the Components and Templates to create unlimited End Products for + unlimited Clients. +- Use the Components and Templates to create End Products where the End Product + is sold to End Users. +- Use the Components and Templates to create End Products that are open source + and freely available to End Users. + +You **cannot**: + +- Use the Components and Templates to create End Products that are designed to + allow an End User to build their own End Products using the Components and + Templates or derivatives of the Components and Templates. +- Re-distribute the Components and Templates or derivatives of the Components + and Templates separately from an End Product, neither in code or as design + assets. +- Share your access to the Components and Templates with any other individuals. +- Use the Components and Templates to produce anything that may be deemed by + Tailwind Labs Inc, in their sole and absolute discretion, to be competitive or + in conflict with the business of Tailwind Labs Inc. + +### Example usage + +Examples of usage **allowed** by the license: + +- Creating a personal website by yourself. +- Creating a website or web application for a client that will be owned by that + client. +- Creating a commercial SaaS application (like an invoicing app for example) + where end users have to pay a fee to use the application. +- Creating a commercial self-hosted web application that is sold to end users + for a one-time fee. +- Creating a web application where the primary purpose is clearly not to simply + re-distribute the components (like a conference organization app that uses the + components for its UI for example) that is free and open source, where the + source code is publicly available. + +Examples of usage **not allowed** by the license: + +- Creating a repository of your favorite Tailwind UI components or templates (or + derivatives based on Tailwind UI components or templates) and publishing it + publicly. +- Creating a React or Vue version of Tailwind UI and making it available either + for sale or for free. +- Create a Figma or Sketch UI kit based on the Tailwind UI component designs. +- Creating a "website builder" project where end users can build their own + websites using components or templates included with or derived from Tailwind + UI. +- Creating a theme, template, or project starter kit using the components or + templates and making it available either for sale or for free. +- Creating an admin panel tool (like [Laravel Nova](https://nova.laravel.com/) + or [ActiveAdmin](https://activeadmin.info/)) that is made available either for + sale or for free. + +In simple terms, use Tailwind UI for anything you like as long as it doesn't +compete with Tailwind UI. + +### Personal License Definitions + +Licensee is the individual who has purchased a Personal License. + +Components and Templates are the source code and design assets made available to +the Licensee after purchasing a Tailwind UI license. + +End Product is any artifact produced that incorporates the Components or +Templates or derivatives of the Components or Templates. + +End User is a user of an End Product. + +Client is an individual or entity receiving custom professional services +directly from the Licensee, produced specifically for that individual or entity. +Customers of software-as-a-service products are not considered clients for the +purpose of this document. + +## Team License + +Tailwind Labs Inc. grants you an on-going, non-exclusive license to use the +Components and Templates. + +The license grants permission for **up to 25 Employees and Contractors of the +Licensee** to access and use the Components and Templates. + +You **can**: + +- Use the Components and Templates to create unlimited End Products. +- Modify the Components and Templates to create derivative components and + templates. Those components and templates are subject to this license. +- Use the Components and Templates to create unlimited End Products for + unlimited Clients. +- Use the Components and Templates to create End Products where the End Product + is sold to End Users. +- Use the Components and Templates to create End Products that are open source + and freely available to End Users. + +You **cannot**: + +- Use the Components or Templates to create End Products that are designed to + allow an End User to build their own End Products using the Components or + Templates or derivatives of the Components or Templates. +- Re-distribute the Components or Templates or derivatives of the Components or + Templates separately from an End Product. +- Use the Components or Templates to create End Products that are the property + of any individual or entity other than the Licensee or Clients of the + Licensee. +- Use the Components or Templates to produce anything that may be deemed by + Tailwind Labs Inc, in their sole and absolute discretion, to be competitive or + in conflict with the business of Tailwind Labs Inc. + +### Example usage + +Examples of usage **allowed** by the license: + +- Creating a website for your company. +- Creating a website or web application for a client that will be owned by that + client. +- Creating a commercial SaaS application (like an invoicing app for example) + where end users have to pay a fee to use the application. +- Creating a commercial self-hosted web application that is sold to end users + for a one-time fee. +- Creating a web application where the primary purpose is clearly not to simply + re-distribute the components or templates (like a conference organization app + that uses the components or a template for its UI for example) that is free + and open source, where the source code is publicly available. + +Examples of use **not allowed** by the license: + +- Creating a repository of your favorite Tailwind UI components or template (or + derivatives based on Tailwind UI components or templates) and publishing it + publicly. +- Creating a React or Vue version of Tailwind UI and making it available either + for sale or for free. +- Creating a "website builder" project where end users can build their own + websites using components or templates included with or derived from Tailwind + UI. +- Creating a theme or template using the components or templates and making it + available either for sale or for free. +- Creating an admin panel tool (like [Laravel Nova](https://nova.laravel.com/) + or [ActiveAdmin](https://activeadmin.info/)) that is made available either for + sale or for free. +- Creating any End Product that is not the sole property of either your company + or a client of your company. For example your employees/contractors can't use + your company Tailwind UI license to build their own websites or side projects. + +### Team License Definitions + +Licensee is the business entity who has purchased a Team License. + +Components and Templates are the source code and design assets made available to +the Licensee after purchasing a Tailwind UI license. + +End Product is any artifact produced that incorporates the Components or +Templates or derivatives of the Components or Templates. + +End User is a user of an End Product. + +Employee is a full-time or part-time employee of the Licensee. + +Contractor is an individual or business entity contracted to perform services +for the Licensee. + +Client is an individual or entity receiving custom professional services +directly from the Licensee, produced specifically for that individual or entity. +Customers of software-as-a-service products are not considered clients for the +purpose of this document. + +## Enforcement + +If you are found to be in violation of the license, access to your Tailwind UI +account will be terminated, and a refund may be issued at our discretion. When +license violation is blatant and malicious (such as intentionally redistributing +the Components or Templates through private warez channels), no refund will be +issued. + +The copyright of the Components and Templates is owned by Tailwind Labs Inc. You +are granted only the permissions described in this license; all other rights are +reserved. Tailwind Labs Inc. reserves the right to pursue legal remedies for any +unauthorized use of the Components or Templates outside the scope of this +license. + +## Liability + +Tailwind Labs Inc.’s liability to you for costs, damages, or other losses +arising from your use of the Components or Templates — including third-party +claims against you — is limited to a refund of your license fee. Tailwind Labs +Inc. may not be held liable for any consequential damages related to your use of +the Components or Templates. + +This Agreement is governed by the laws of the Province of Ontario and the +applicable laws of Canada. Legal proceedings related to this Agreement may only +be brought in the courts of Ontario. You agree to service of process at the +e-mail address on your original order. + +## Questions? + +Unsure which license you need, or unsure if your use case is covered by our +licenses? + +Email us at [support@tailwindui.com](mailto:support@tailwindui.com) with your +questions. diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000000..6bc9669c37 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,29 @@ +This is the source code for the [UploadThing docs](https://docs.uploadthing.com) +site. + +## License + +This site is based off the "Protocol" template, which is a commercial product +and is licensed under the [Tailwind UI license](https://tailwindui.com/license). + +Protocol is a [Tailwind UI](https://tailwindui.com) site template built using +[Tailwind CSS](https://tailwindcss.com) and [Next.js](https://nextjs.org). + +## Learn more + +To learn more about the technologies used in this site template, see the +following resources: + +- [Tailwind CSS](https://tailwindcss.com/docs) - the official Tailwind CSS + documentation +- [Next.js](https://nextjs.org/docs) - the official Next.js documentation +- [Headless UI](https://headlessui.dev) - the official Headless UI documentation +- [Framer Motion](https://www.framer.com/docs/) - the official Framer Motion + documentation +- [MDX](https://mdxjs.com/) - the official MDX documentation +- [Algolia Autocomplete](https://www.algolia.com/doc/ui-libraries/autocomplete/introduction/what-is-autocomplete/) - + the official Algolia Autocomplete documentation +- [FlexSearch](https://github.com/nextapps-de/flexsearch) - the official + FlexSearch documentation +- [Zustand](https://docs.pmnd.rs/zustand/getting-started/introduction) - the + official Zustand documentation diff --git a/docs/mdx-components.tsx b/docs/mdx-components.tsx new file mode 100644 index 0000000000..56a0fedca5 --- /dev/null +++ b/docs/mdx-components.tsx @@ -0,0 +1,9 @@ +import * as mdxComponents from "@/components/mdx"; +import { type MDXComponents } from "mdx/types"; + +export function useMDXComponents(components: MDXComponents) { + return { + ...components, + ...mdxComponents, + }; +} diff --git a/docs/next-env.d.ts b/docs/next-env.d.ts deleted file mode 100644 index 4f11a03dc6..0000000000 --- a/docs/next-env.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -/// -/// - -// NOTE: This file should not be edited -// see https://nextjs.org/docs/basic-features/typescript for more information. diff --git a/docs/next-sitemap.config.js b/docs/next-sitemap.config.js index 3e140d8a70..459637891b 100644 --- a/docs/next-sitemap.config.js +++ b/docs/next-sitemap.config.js @@ -1,5 +1,5 @@ -/** @type {import("next-sitemap").IConfig} */ -module.exports = { +/** @type {import('next-sitemap').IConfig} */ +export default { siteUrl: "https://docs.uploadthing.com", generateRobotsTxt: true, }; diff --git a/docs/next.config.js b/docs/next.config.js new file mode 100644 index 0000000000..6abdfa51ed --- /dev/null +++ b/docs/next.config.js @@ -0,0 +1,35 @@ +import nextMDX from "@next/mdx"; + +import { recmaPlugins } from "./src/mdx/recma.js"; +import { rehypePlugins } from "./src/mdx/rehype.js"; +import { remarkPlugins } from "./src/mdx/remark.js"; +import withSearch from "./src/mdx/search.js"; + +const withMDX = nextMDX({ + options: { + remarkPlugins, + rehypePlugins, + recmaPlugins, + }, +}); + +/** @type {import('next').NextConfig} */ +const nextConfig = { + pageExtensions: ["js", "jsx", "ts", "tsx", "mdx"], + images: { + remotePatterns: [ + { + hostname: "utfs.io", + pathname: "/a/s40vlb3kca/*", + }, + ], + }, + rewrites: async () => [ + { source: "/auth-security", destination: "/concepts/auth-security" }, + { source: "/errors", destination: "/concepts/error-handling" }, + { source: "/regions-and-acl", destination: "/concepts/regions-acl" }, + { source: "/theming", destination: "/concepts/theming" }, + ], +}; + +export default withSearch(withMDX(nextConfig)); diff --git a/docs/next.config.mjs b/docs/next.config.mjs deleted file mode 100644 index 02b69d1576..0000000000 --- a/docs/next.config.mjs +++ /dev/null @@ -1,48 +0,0 @@ -import nextra from "nextra"; - -const withNextra = nextra({ - theme: "nextra-theme-docs", - themeConfig: "./src/theme.config.js", - staticImage: true, - latex: true, - flexsearch: { - codeblock: false, - }, - async redirects() { - return [ - { - source: "/getting-started", - destination: "/getting-started/appdir", - permanent: true, - }, - { - source: "/nextjs/appdir", - destination: "/getting-started/appdir", - permanent: true, - }, - { - source: "/nextjs/pagedir", - destination: "/getting-started/pagedir", - permanent: true, - }, - { - source: "/solid", - destination: "/getting-started/solid", - permanent: true, - }, - { - source: "/solidstart/server", - destination: "/getting-started/solid", - permanent: true, - }, - ]; - }, -}); - -export default withNextra({ - reactStrictMode: true, - eslint: { ignoreDuringBuilds: true }, - env: { - NO_INDEX: process.env.VERCEL_ENV !== "production" ? "true" : "false", - }, -}); diff --git a/docs/package.json b/docs/package.json index e40a5918c0..3914df8244 100644 --- a/docs/package.json +++ b/docs/package.json @@ -1,8 +1,7 @@ { "name": "docs", + "type": "module", "private": true, - "main": "index.js", - "license": "MIT", "scripts": { "dev": "next dev --port 3030", "clean": "git clean -xdf dist node_modules", @@ -10,22 +9,64 @@ "start": "next start", "debug": "NODE_OPTIONS='--inspect' next dev" }, + "browserslist": "defaults, not ie <= 11", "dependencies": { - "@radix-ui/react-accordion": "^1.1.2", - "@scalar/api-reference-react": "0.3.37", + "@algolia/autocomplete-core": "^1.17.4", + "@headlessui/react": "^2.1.8", + "@headlessui/tailwindcss": "^0.2.0", + "@heroicons/react": "^2.1.3", + "@mdx-js/loader": "^3.0.1", + "@mdx-js/react": "^3.0.1", + "@next/mdx": "^14.2.11", + "@scalar/api-reference-react": "^0.3.37", + "@sindresorhus/slugify": "^2.1.1", + "@tailwindcss/typography": "^0.5.10", + "@types/mdast": "^4.0.4", + "@types/mdx": "^2.0.13", + "@types/node": "^20.14.0", + "@types/react": "18.3.3", + "@types/react-dom": "18.3.0", + "@types/react-highlight-words": "^0.20.0", "@uploadthing/react": "workspace:*", - "next": "14.2.3", + "acorn": "^8.12.1", + "autoprefixer": "^10.4.19", + "clsx": "^2.1.0", + "fast-glob": "^3.3.2", + "flexsearch": "^0.7.43", + "framer-motion": "^11.5.4", + "mdast-util-to-string": "^4.0.0", + "mdx-annotations": "^0.1.4", + "next": "14.2.11", "next-sitemap": "^4.2.3", - "nextra": "^2.13.2", - "nextra-theme-docs": "^2.13.2", + "next-themes": "^0.3.0", + "next-view-transitions": "^0.3.0", + "npm-to-yarn": "^3.0.0", "react": "18.3.1", "react-dom": "18.3.1", - "uploadthing": "workspace:*" + "react-highlight-words": "^0.20.0", + "recma-import-images": "^0.0.3", + "remark": "^15.0.1", + "remark-gfm": "^4.0.0", + "remark-mdx": "^3.0.1", + "remark-unwrap-images": "^4.0.0", + "shiki": "^1.17.5", + "simple-functional-loader": "^1.2.1", + "tailwindcss": "^3.4.1", + "typescript": "^5.5.2", + "unified": "^11.0.5", + "unist-util-filter": "^5.0.1", + "unist-util-visit": "^5.0.0", + "uploadthing": "workspace:*", + "zod": "^3.23.8", + "zustand": "^4.3.2" }, "devDependencies": { - "@types/react": "18.3.3", - "@types/react-dom": "18.3.0", - "postcss": "8.4.38", - "tailwindcss": "^3.4.1" - } + "@shikijs/transformers": "^1.17.5", + "eslint": "^8.57.0", + "eslint-config-next": "^14.2.1", + "prettier": "^3.3.2", + "prettier-plugin-tailwindcss": "^0.6.5", + "sharp": "0.33.1" + }, + "packageManager": "pnpm@9.6.0" } diff --git a/docs/pnpm-lock.yaml b/docs/pnpm-lock.yaml new file mode 100644 index 0000000000..122a05cd57 --- /dev/null +++ b/docs/pnpm-lock.yaml @@ -0,0 +1,11403 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@algolia/autocomplete-core': + specifier: ^1.7.3 + version: 1.17.2(@algolia/client-search@4.23.3)(algoliasearch@4.23.3)(search-insights@2.14.0) + '@headlessui/react': + specifier: ^2.0.1 + version: 2.0.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@headlessui/tailwindcss': + specifier: ^0.2.0 + version: 0.2.1(tailwindcss@3.4.3) + '@heroicons/react': + specifier: ^2.1.3 + version: 2.1.3(react@18.3.1) + '@mdx-js/loader': + specifier: ^3.0.0 + version: 3.0.1(webpack@5.91.0(esbuild@0.21.5)) + '@mdx-js/react': + specifier: ^3.0.0 + version: 3.0.1(@types/react@18.3.3)(react@18.3.1) + '@next/mdx': + specifier: ^14.0.4 + version: 14.2.3(@mdx-js/loader@3.0.1(webpack@5.91.0(esbuild@0.21.5)))(@mdx-js/react@3.0.1(@types/react@18.3.3)(react@18.3.1)) + '@scalar/api-reference-react': + specifier: ^0.3.37 + version: 0.3.37(postcss@8.4.38)(storybook@8.2.0(@babel/preset-env@7.24.7(@babel/core@7.24.7)))(tailwindcss@3.4.3)(typescript@5.4.5) + '@sindresorhus/slugify': + specifier: ^2.1.1 + version: 2.2.1 + '@tailwindcss/typography': + specifier: ^0.5.10 + version: 0.5.13(tailwindcss@3.4.3) + '@types/mdast': + specifier: ^4.0.4 + version: 4.0.4 + '@types/mdx': + specifier: ^2.0.8 + version: 2.0.13 + '@types/node': + specifier: ^20.10.8 + version: 20.12.13 + '@types/react': + specifier: ^18.2.47 + version: 18.3.3 + '@types/react-dom': + specifier: ^18.2.18 + version: 18.3.0 + '@types/react-highlight-words': + specifier: ^0.16.4 + version: 0.16.7 + '@uploadthing/react': + specifier: 6.7.3-canary.7cbef70 + version: 6.7.3-canary.7cbef70(next@14.2.3(@babel/core@7.24.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(uploadthing@6.13.3-canary.7cbef70(express@4.19.2)(next@14.2.3(@babel/core@7.24.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(tailwindcss@3.4.3))(vue@3.4.31(typescript@5.4.5)) + acorn: + specifier: ^8.8.1 + version: 8.11.3 + autoprefixer: + specifier: ^10.4.7 + version: 10.4.19(postcss@8.4.38) + clsx: + specifier: ^2.1.0 + version: 2.1.1 + fast-glob: + specifier: ^3.3.0 + version: 3.3.2 + flexsearch: + specifier: ^0.7.31 + version: 0.7.43 + framer-motion: + specifier: ^10.18.0 + version: 10.18.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + mdast-util-to-string: + specifier: ^4.0.0 + version: 4.0.0 + mdx-annotations: + specifier: ^0.1.1 + version: 0.1.4 + next: + specifier: ^14.0.4 + version: 14.2.3(@babel/core@7.24.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next-themes: + specifier: ^0.2.1 + version: 0.2.1(next@14.2.3(@babel/core@7.24.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next-view-transitions: + specifier: ^0.3.0 + version: 0.3.0(next@14.2.3(@babel/core@7.24.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + npm-to-yarn: + specifier: ^2.2.1 + version: 2.2.1 + react: + specifier: ^18.2.0 + version: 18.3.1 + react-dom: + specifier: ^18.2.0 + version: 18.3.1(react@18.3.1) + react-highlight-words: + specifier: ^0.20.0 + version: 0.20.0(react@18.3.1) + recma-import-images: + specifier: ^0.0.3 + version: 0.0.3 + remark: + specifier: ^15.0.1 + version: 15.0.1 + remark-gfm: + specifier: ^4.0.0 + version: 4.0.0 + remark-mdx: + specifier: ^3.0.0 + version: 3.0.1 + remark-unwrap-images: + specifier: ^4.0.0 + version: 4.0.0 + shiki: + specifier: ^1.6.2 + version: 1.6.2 + simple-functional-loader: + specifier: ^1.2.1 + version: 1.2.1 + tailwindcss: + specifier: ^3.4.1 + version: 3.4.3 + typescript: + specifier: ^5.3.3 + version: 5.4.5 + unified: + specifier: ^11.0.4 + version: 11.0.4 + unist-util-filter: + specifier: ^5.0.1 + version: 5.0.1 + unist-util-visit: + specifier: ^5.0.0 + version: 5.0.0 + uploadthing: + specifier: 6.13.3-canary.7cbef70 + version: 6.13.3-canary.7cbef70(express@4.19.2)(next@14.2.3(@babel/core@7.24.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(tailwindcss@3.4.3) + zod: + specifier: ^3.23.8 + version: 3.23.8 + zustand: + specifier: ^4.3.2 + version: 4.5.2(@types/react@18.3.3)(react@18.3.1) + devDependencies: + '@shikijs/transformers': + specifier: ^1.10.3 + version: 1.10.3 + eslint: + specifier: ^8.56.0 + version: 8.57.0 + eslint-config-next: + specifier: ^14.0.4 + version: 14.2.3(eslint@8.57.0)(typescript@5.4.5) + prettier: + specifier: ^3.1.1 + version: 3.2.5 + prettier-plugin-tailwindcss: + specifier: ^0.5.11 + version: 0.5.14(prettier@3.2.5) + sharp: + specifier: 0.33.1 + version: 0.33.1 + +packages: + + '@adobe/css-tools@4.4.0': + resolution: {integrity: sha512-Ff9+ksdQQB3rMncgqDK78uLznstjyfIf2Arnh22pW8kBpLs6rpKDwgnZT46hin5Hl1WzazzK64DOrhSwYpS7bQ==} + + '@algolia/autocomplete-core@1.17.2': + resolution: {integrity: sha512-Fi5cPV5pzEmJgTJ/KTcccJoR/v94OkBwJFyLTsmAx9jbBg5rlgoumRXQM41cgwzY1s/eBLNduUMak2KnZYofcA==} + + '@algolia/autocomplete-plugin-algolia-insights@1.17.2': + resolution: {integrity: sha512-bgVuThYaY9NSQMHOE/GMvlEzQxFzqDH3Lbls7fWuei8iIfcBWGtRUH01m/w5LY1mAw1wv8SyZ9xwuvfdXt8XkA==} + peerDependencies: + search-insights: '>= 1 < 3' + + '@algolia/autocomplete-shared@1.17.2': + resolution: {integrity: sha512-L9gmDgv2J6cXXefV4tg/xlfomd+jjbzKmoc6kcvtS2USkxowoLNvqkLRNQP8bHvX+RXXGNLJBwJj+Ul7JIpv8A==} + peerDependencies: + '@algolia/client-search': '>= 4.9.1 < 6' + algoliasearch: '>= 4.9.1 < 6' + + '@algolia/cache-browser-local-storage@4.23.3': + resolution: {integrity: sha512-vRHXYCpPlTDE7i6UOy2xE03zHF2C8MEFjPN2v7fRbqVpcOvAUQK81x3Kc21xyb5aSIpYCjWCZbYZuz8Glyzyyg==} + + '@algolia/cache-common@4.23.3': + resolution: {integrity: sha512-h9XcNI6lxYStaw32pHpB1TMm0RuxphF+Ik4o7tcQiodEdpKK+wKufY6QXtba7t3k8eseirEMVB83uFFF3Nu54A==} + + '@algolia/cache-in-memory@4.23.3': + resolution: {integrity: sha512-yvpbuUXg/+0rbcagxNT7un0eo3czx2Uf0y4eiR4z4SD7SiptwYTpbuS0IHxcLHG3lq22ukx1T6Kjtk/rT+mqNg==} + + '@algolia/client-account@4.23.3': + resolution: {integrity: sha512-hpa6S5d7iQmretHHF40QGq6hz0anWEHGlULcTIT9tbUssWUriN9AUXIFQ8Ei4w9azD0hc1rUok9/DeQQobhQMA==} + + '@algolia/client-analytics@4.23.3': + resolution: {integrity: sha512-LBsEARGS9cj8VkTAVEZphjxTjMVCci+zIIiRhpFun9jGDUlS1XmhCW7CTrnaWeIuCQS/2iPyRqSy1nXPjcBLRA==} + + '@algolia/client-common@4.23.3': + resolution: {integrity: sha512-l6EiPxdAlg8CYhroqS5ybfIczsGUIAC47slLPOMDeKSVXYG1n0qGiz4RjAHLw2aD0xzh2EXZ7aRguPfz7UKDKw==} + + '@algolia/client-personalization@4.23.3': + resolution: {integrity: sha512-3E3yF3Ocr1tB/xOZiuC3doHQBQ2zu2MPTYZ0d4lpfWads2WTKG7ZzmGnsHmm63RflvDeLK/UVx7j2b3QuwKQ2g==} + + '@algolia/client-search@4.23.3': + resolution: {integrity: sha512-P4VAKFHqU0wx9O+q29Q8YVuaowaZ5EM77rxfmGnkHUJggh28useXQdopokgwMeYw2XUht49WX5RcTQ40rZIabw==} + + '@algolia/logger-common@4.23.3': + resolution: {integrity: sha512-y9kBtmJwiZ9ZZ+1Ek66P0M68mHQzKRxkW5kAAXYN/rdzgDN0d2COsViEFufxJ0pb45K4FRcfC7+33YB4BLrZ+g==} + + '@algolia/logger-console@4.23.3': + resolution: {integrity: sha512-8xoiseoWDKuCVnWP8jHthgaeobDLolh00KJAdMe9XPrWPuf1by732jSpgy2BlsLTaT9m32pHI8CRfrOqQzHv3A==} + + '@algolia/recommend@4.23.3': + resolution: {integrity: sha512-9fK4nXZF0bFkdcLBRDexsnGzVmu4TSYZqxdpgBW2tEyfuSSY54D4qSRkLmNkrrz4YFvdh2GM1gA8vSsnZPR73w==} + + '@algolia/requester-browser-xhr@4.23.3': + resolution: {integrity: sha512-jDWGIQ96BhXbmONAQsasIpTYWslyjkiGu0Quydjlowe+ciqySpiDUrJHERIRfELE5+wFc7hc1Q5hqjGoV7yghw==} + + '@algolia/requester-common@4.23.3': + resolution: {integrity: sha512-xloIdr/bedtYEGcXCiF2muajyvRhwop4cMZo+K2qzNht0CMzlRkm8YsDdj5IaBhshqfgmBb3rTg4sL4/PpvLYw==} + + '@algolia/requester-node-http@4.23.3': + resolution: {integrity: sha512-zgu++8Uj03IWDEJM3fuNl34s746JnZOWn1Uz5taV1dFyJhVM/kTNw9Ik7YJWiUNHJQXcaD8IXD1eCb0nq/aByA==} + + '@algolia/transporter@4.23.3': + resolution: {integrity: sha512-Wjl5gttqnf/gQKJA+dafnD0Y6Yw97yvfY8R9h0dQltX1GXTgNs1zWgvtWW0tHl1EgMdhAyw189uWiZMnL3QebQ==} + + '@alloc/quick-lru@5.2.0': + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@babel/code-frame@7.24.7': + resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.24.7': + resolution: {integrity: sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.24.7': + resolution: {integrity: sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.24.7': + resolution: {integrity: sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-annotate-as-pure@7.24.7': + resolution: {integrity: sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-builder-binary-assignment-operator-visitor@7.24.7': + resolution: {integrity: sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.24.7': + resolution: {integrity: sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-create-class-features-plugin@7.24.7': + resolution: {integrity: sha512-kTkaDl7c9vO80zeX1rJxnuRpEsD5tA81yh11X1gQo+PhSti3JS+7qeZo9U4RHobKRiFPKaGK3svUAeb8D0Q7eg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-create-regexp-features-plugin@7.24.7': + resolution: {integrity: sha512-03TCmXy2FtXJEZfbXDTSqq1fRJArk7lX9DOFC/47VthYcxyIOx+eXQmdo6DOQvrbpIix+KfXwvuXdFDZHxt+rA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-define-polyfill-provider@0.6.2': + resolution: {integrity: sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + '@babel/helper-environment-visitor@7.24.7': + resolution: {integrity: sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-function-name@7.24.7': + resolution: {integrity: sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-hoist-variables@7.24.7': + resolution: {integrity: sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-member-expression-to-functions@7.24.7': + resolution: {integrity: sha512-LGeMaf5JN4hAT471eJdBs/GK1DoYIJ5GCtZN/EsL6KUiiDZOvO/eKE11AMZJa2zP4zk4qe9V2O/hxAmkRc8p6w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.24.7': + resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.24.7': + resolution: {integrity: sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-optimise-call-expression@7.24.7': + resolution: {integrity: sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==} + engines: {node: '>=6.9.0'} + + '@babel/helper-plugin-utils@7.24.7': + resolution: {integrity: sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-remap-async-to-generator@7.24.7': + resolution: {integrity: sha512-9pKLcTlZ92hNZMQfGCHImUpDOlAgkkpqalWEeftW5FBya75k8Li2ilerxkM/uBEj01iBZXcCIB/bwvDYgWyibA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-replace-supers@7.24.7': + resolution: {integrity: sha512-qTAxxBM81VEyoAY0TtLrx1oAEJc09ZK67Q9ljQToqCnA+55eNwCORaxlKyu+rNfX86o8OXRUSNUnrtsAZXM9sg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-simple-access@7.24.7': + resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-skip-transparent-expression-wrappers@7.24.7': + resolution: {integrity: sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-split-export-declaration@7.24.7': + resolution: {integrity: sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.24.7': + resolution: {integrity: sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.24.7': + resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.24.7': + resolution: {integrity: sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-wrap-function@7.24.7': + resolution: {integrity: sha512-N9JIYk3TD+1vq/wn77YnJOqMtfWhNewNE+DJV4puD2X7Ew9J4JvrzrFDfTfyv5EgEXVy9/Wt8QiOErzEmv5Ifw==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.24.7': + resolution: {integrity: sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg==} + engines: {node: '>=6.9.0'} + + '@babel/highlight@7.24.7': + resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.24.7': + resolution: {integrity: sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.24.7': + resolution: {integrity: sha512-TiT1ss81W80eQsN+722OaeQMY/G4yTb4G9JrqeiDADs3N8lbPMGldWi9x8tyqCW5NLx1Jh2AvkE6r6QvEltMMQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.24.7': + resolution: {integrity: sha512-unaQgZ/iRu/By6tsjMZzpeBZjChYfLYry6HrEXPoz3KmfF0sVBQ1l8zKMQ4xRGLWVsjuvB8nQfjNP/DcfEOCsg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.7': + resolution: {integrity: sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.13.0 + + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.24.7': + resolution: {integrity: sha512-utA4HuR6F4Vvcr+o4DnjL8fCOlgRFGbeeBEGNg3ZTrLFw6VWG5XmUrvcQ0FjIYMU2ST4XcR2Wsp7t9qOAPnxMg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2': + resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-async-generators@7.8.4': + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-class-properties@7.12.13': + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-class-static-block@7.14.5': + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-dynamic-import@7.8.3': + resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-export-namespace-from@7.8.3': + resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-flow@7.24.7': + resolution: {integrity: sha512-9G8GYT/dxn/D1IIKOUBmGX0mnmj46mGH9NnZyJLwtCpgh5f7D2VbuKodb+2s9m1Yavh1s7ASQN8lf0eqrb1LTw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-assertions@7.24.7': + resolution: {integrity: sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-attributes@7.24.7': + resolution: {integrity: sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-meta@7.10.4': + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-json-strings@7.8.3': + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-jsx@7.24.7': + resolution: {integrity: sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-logical-assignment-operators@7.10.4': + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3': + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-numeric-separator@7.10.4': + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-object-rest-spread@7.8.3': + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-optional-catch-binding@7.8.3': + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-optional-chaining@7.8.3': + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-private-property-in-object@7.14.5': + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-top-level-await@7.14.5': + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-typescript@7.24.7': + resolution: {integrity: sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-unicode-sets-regex@7.18.6': + resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-arrow-functions@7.24.7': + resolution: {integrity: sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-async-generator-functions@7.24.7': + resolution: {integrity: sha512-o+iF77e3u7ZS4AoAuJvapz9Fm001PuD2V3Lp6OSE4FYQke+cSewYtnek+THqGRWyQloRCyvWL1OkyfNEl9vr/g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-async-to-generator@7.24.7': + resolution: {integrity: sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-block-scoped-functions@7.24.7': + resolution: {integrity: sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-block-scoping@7.24.7': + resolution: {integrity: sha512-Nd5CvgMbWc+oWzBsuaMcbwjJWAcp5qzrbg69SZdHSP7AMY0AbWFqFO0WTFCA1jxhMCwodRwvRec8k0QUbZk7RQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-class-properties@7.24.7': + resolution: {integrity: sha512-vKbfawVYayKcSeSR5YYzzyXvsDFWU2mD8U5TFeXtbCPLFUqe7GyCgvO6XDHzje862ODrOwy6WCPmKeWHbCFJ4w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-class-static-block@7.24.7': + resolution: {integrity: sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 + + '@babel/plugin-transform-classes@7.24.7': + resolution: {integrity: sha512-CFbbBigp8ln4FU6Bpy6g7sE8B/WmCmzvivzUC6xDAdWVsjYTXijpuuGJmYkAaoWAzcItGKT3IOAbxRItZ5HTjw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-computed-properties@7.24.7': + resolution: {integrity: sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-destructuring@7.24.7': + resolution: {integrity: sha512-19eJO/8kdCQ9zISOf+SEUJM/bAUIsvY3YDnXZTupUCQ8LgrWnsG/gFB9dvXqdXnRXMAM8fvt7b0CBKQHNGy1mw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-dotall-regex@7.24.7': + resolution: {integrity: sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-duplicate-keys@7.24.7': + resolution: {integrity: sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-dynamic-import@7.24.7': + resolution: {integrity: sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-exponentiation-operator@7.24.7': + resolution: {integrity: sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-export-namespace-from@7.24.7': + resolution: {integrity: sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-flow-strip-types@7.24.7': + resolution: {integrity: sha512-cjRKJ7FobOH2eakx7Ja+KpJRj8+y+/SiB3ooYm/n2UJfxu0oEaOoxOinitkJcPqv9KxS0kxTGPUaR7L2XcXDXA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-for-of@7.24.7': + resolution: {integrity: sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-function-name@7.24.7': + resolution: {integrity: sha512-U9FcnA821YoILngSmYkW6FjyQe2TyZD5pHt4EVIhmcTkrJw/3KqcrRSxuOo5tFZJi7TE19iDyI1u+weTI7bn2w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-json-strings@7.24.7': + resolution: {integrity: sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-literals@7.24.7': + resolution: {integrity: sha512-vcwCbb4HDH+hWi8Pqenwnjy+UiklO4Kt1vfspcQYFhJdpthSnW8XvWGyDZWKNVrVbVViI/S7K9PDJZiUmP2fYQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-logical-assignment-operators@7.24.7': + resolution: {integrity: sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-member-expression-literals@7.24.7': + resolution: {integrity: sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-amd@7.24.7': + resolution: {integrity: sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-commonjs@7.24.7': + resolution: {integrity: sha512-iFI8GDxtevHJ/Z22J5xQpVqFLlMNstcLXh994xifFwxxGslr2ZXXLWgtBeLctOD63UFDArdvN6Tg8RFw+aEmjQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-systemjs@7.24.7': + resolution: {integrity: sha512-GYQE0tW7YoaN13qFh3O1NCY4MPkUiAH3fiF7UcV/I3ajmDKEdG3l+UOcbAm4zUE3gnvUU+Eni7XrVKo9eO9auw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-umd@7.24.7': + resolution: {integrity: sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-named-capturing-groups-regex@7.24.7': + resolution: {integrity: sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-new-target@7.24.7': + resolution: {integrity: sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-nullish-coalescing-operator@7.24.7': + resolution: {integrity: sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-numeric-separator@7.24.7': + resolution: {integrity: sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-object-rest-spread@7.24.7': + resolution: {integrity: sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-object-super@7.24.7': + resolution: {integrity: sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-optional-catch-binding@7.24.7': + resolution: {integrity: sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-optional-chaining@7.24.7': + resolution: {integrity: sha512-tK+0N9yd4j+x/4hxF3F0e0fu/VdcxU18y5SevtyM/PCFlQvXbR0Zmlo2eBrKtVipGNFzpq56o8WsIIKcJFUCRQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-parameters@7.24.7': + resolution: {integrity: sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-private-methods@7.24.7': + resolution: {integrity: sha512-COTCOkG2hn4JKGEKBADkA8WNb35TGkkRbI5iT845dB+NyqgO8Hn+ajPbSnIQznneJTa3d30scb6iz/DhH8GsJQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-private-property-in-object@7.24.7': + resolution: {integrity: sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-property-literals@7.24.7': + resolution: {integrity: sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-regenerator@7.24.7': + resolution: {integrity: sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-reserved-words@7.24.7': + resolution: {integrity: sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-shorthand-properties@7.24.7': + resolution: {integrity: sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-spread@7.24.7': + resolution: {integrity: sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-sticky-regex@7.24.7': + resolution: {integrity: sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-template-literals@7.24.7': + resolution: {integrity: sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-typeof-symbol@7.24.7': + resolution: {integrity: sha512-VtR8hDy7YLB7+Pet9IarXjg/zgCMSF+1mNS/EQEiEaUPoFXCVsHG64SIxcaaI2zJgRiv+YmgaQESUfWAdbjzgg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-typescript@7.24.7': + resolution: {integrity: sha512-iLD3UNkgx2n/HrjBesVbYX6j0yqn/sJktvbtKKgcaLIQ4bTTQ8obAypc1VpyHPD2y4Phh9zHOaAt8e/L14wCpw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-escapes@7.24.7': + resolution: {integrity: sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-property-regex@7.24.7': + resolution: {integrity: sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-regex@7.24.7': + resolution: {integrity: sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-sets-regex@7.24.7': + resolution: {integrity: sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/preset-env@7.24.7': + resolution: {integrity: sha512-1YZNsc+y6cTvWlDHidMBsQZrZfEFjRIo/BZCT906PMdzOyXtSLTgqGdrpcuTDCXyd11Am5uQULtDIcCfnTc8fQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/preset-flow@7.24.7': + resolution: {integrity: sha512-NL3Lo0NorCU607zU3NwRyJbpaB6E3t0xtd3LfAQKDfkeX4/ggcDXvkmkW42QWT5owUeW/jAe4hn+2qvkV1IbfQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/preset-modules@0.1.6-no-external-plugins': + resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} + peerDependencies: + '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 + + '@babel/preset-typescript@7.24.7': + resolution: {integrity: sha512-SyXRe3OdWwIwalxDg5UtJnJQO+YPcTfwiIY2B0Xlddh9o7jpWLvv8X1RthIeDOxQ+O1ML5BLPCONToObyVQVuQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/register@7.24.6': + resolution: {integrity: sha512-WSuFCc2wCqMeXkz/i3yfAAsxwWflEgbVkZzivgAmXl/MxrXeoYFZOOPllbC8R8WTF7u61wSRQtDVZ1879cdu6w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/regjsgen@0.8.0': + resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} + + '@babel/runtime@7.24.6': + resolution: {integrity: sha512-Ja18XcETdEl5mzzACGd+DKgaGJzPTCow7EglgwTmHdwokzDFYh/MHua6lU6DV/hjF2IaOJ4oX2nqnjG7RElKOw==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.24.7': + resolution: {integrity: sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.24.7': + resolution: {integrity: sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.24.7': + resolution: {integrity: sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==} + engines: {node: '>=6.9.0'} + + '@codemirror/autocomplete@6.17.0': + resolution: {integrity: sha512-fdfj6e6ZxZf8yrkMHUSJJir7OJkHkZKaOZGzLWIYp2PZ3jd+d+UjG8zVPqJF6d3bKxkhvXTPan/UZ1t7Bqm0gA==} + peerDependencies: + '@codemirror/language': ^6.0.0 + '@codemirror/state': ^6.0.0 + '@codemirror/view': ^6.0.0 + '@lezer/common': ^1.0.0 + + '@codemirror/commands@6.6.0': + resolution: {integrity: sha512-qnY+b7j1UNcTS31Eenuc/5YJB6gQOzkUoNmJQc0rznwqSRpeaWWpjkWy2C/MPTcePpsKJEM26hXrOXl1+nceXg==} + + '@codemirror/lang-css@6.2.1': + resolution: {integrity: sha512-/UNWDNV5Viwi/1lpr/dIXJNWiwDxpw13I4pTUAsNxZdg6E0mI2kTQb0P2iHczg1Tu+H4EBgJR+hYhKiHKko7qg==} + + '@codemirror/lang-html@6.4.9': + resolution: {integrity: sha512-aQv37pIMSlueybId/2PVSP6NPnmurFDVmZwzc7jszd2KAF8qd4VBbvNYPXWQq90WIARjsdVkPbw29pszmHws3Q==} + + '@codemirror/lang-javascript@6.2.2': + resolution: {integrity: sha512-VGQfY+FCc285AhWuwjYxQyUQcYurWlxdKYT4bqwr3Twnd5wP5WSeu52t4tvvuWmljT4EmgEgZCqSieokhtY8hg==} + + '@codemirror/lang-json@6.0.1': + resolution: {integrity: sha512-+T1flHdgpqDDlJZ2Lkil/rLiRy684WMLc74xUnjJH48GQdfJo/pudlTRreZmKwzP8/tGdKf83wlbAdOCzlJOGQ==} + + '@codemirror/lang-yaml@6.1.1': + resolution: {integrity: sha512-HV2NzbK9bbVnjWxwObuZh5FuPCowx51mEfoFT9y3y+M37fA3+pbxx4I7uePuygFzDsAmCTwQSc/kXh/flab4uw==} + + '@codemirror/language@6.10.2': + resolution: {integrity: sha512-kgbTYTo0Au6dCSc/TFy7fK3fpJmgHDv1sG1KNQKJXVi+xBTEeBPY/M30YXiU6mMXeH+YIDLsbrT4ZwNRdtF+SA==} + + '@codemirror/lint@6.8.1': + resolution: {integrity: sha512-IZ0Y7S4/bpaunwggW2jYqwLuHj0QtESf5xcROewY6+lDNwZ/NzvR4t+vpYgg9m7V8UXLPYqG+lu3DF470E5Oxg==} + + '@codemirror/search@6.5.6': + resolution: {integrity: sha512-rpMgcsh7o0GuCDUXKPvww+muLA1pDJaFrpq/CCHtpQJYz8xopu4D1hPcKRoDD0YlF8gZaqTNIRa4VRBWyhyy7Q==} + + '@codemirror/state@6.4.1': + resolution: {integrity: sha512-QkEyUiLhsJoZkbumGZlswmAhA7CBU02Wrz7zvH4SrcifbsqwlXShVXg65f3v/ts57W3dqyamEriMhij1Z3Zz4A==} + + '@codemirror/view@6.28.4': + resolution: {integrity: sha512-QScv95fiviSQ/CaVGflxAvvvDy/9wi0RFyDl4LkHHWiMr/UPebyuTspmYSeN5Nx6eujcPYwsQzA6ZIZucKZVHQ==} + + '@effect/platform@0.58.21': + resolution: {integrity: sha512-q6NSWisGbQO/qcP+ce4axnuaYOgZPrzG7V3joaNGZqxuF55A0dRpErmpzrlOq/7qsMV5G5/2zBGxN9abK5Z4VA==} + peerDependencies: + '@effect/schema': ^0.68.18 + effect: ^3.4.8 + + '@effect/schema@0.68.18': + resolution: {integrity: sha512-+knLs36muKsyqIvQTB0itGp5Lwy+5jgEC0G5P8wSsrB6EWGFirS87QjbaFYGbg32l/P51RM+9cPMiAEyICwN6g==} + peerDependencies: + effect: ^3.4.8 + + '@emnapi/runtime@0.44.0': + resolution: {integrity: sha512-ZX/etZEZw8DR7zAB1eVQT40lNo0jeqpb6dCgOvctB6FIQ5PoXfMuNY8+ayQfu8tNQbAB8gQWSSJupR8NxeiZXw==} + + '@emotion/is-prop-valid@0.8.8': + resolution: {integrity: sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==} + + '@emotion/memoize@0.7.4': + resolution: {integrity: sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==} + + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.4.0': + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.10.0': + resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/eslintrc@2.1.4': + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@eslint/js@8.57.0': + resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@floating-ui/core@1.6.2': + resolution: {integrity: sha512-+2XpQV9LLZeanU4ZevzRnGFg2neDeKHgFLjP6YLW+tly0IvrhqT4u8enLGjLH3qeh85g19xY5rsAusfwTdn5lg==} + + '@floating-ui/dom@1.6.5': + resolution: {integrity: sha512-Nsdud2X65Dz+1RHjAIP0t8z5e2ff/IRbei6BqFrl1urT8sDVzM1HMQ+R0XcU5ceRfyO3I6ayeqIfh+6Wb8LGTw==} + + '@floating-ui/dom@1.6.7': + resolution: {integrity: sha512-wmVfPG5o2xnKDU4jx/m4w5qva9FWHcnZ8BvzEe90D/RpwsJaTAVYPEPdQ8sbr/N8zZTAHlZUTQdqg8ZUbzHmng==} + + '@floating-ui/react-dom@2.1.0': + resolution: {integrity: sha512-lNzj5EQmEKn5FFKc04+zasr09h/uX8RtJRNj5gUXsSQIXHVWTVh+hVAg1vOMCexkX8EgvemMvIFpQfkosnVNyA==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/react@0.26.16': + resolution: {integrity: sha512-HEf43zxZNAI/E781QIVpYSF3K2VH4TTYZpqecjdsFkjsaU1EbaWcM++kw0HXFffj7gDUcBFevX8s0rQGQpxkow==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/utils@0.2.2': + resolution: {integrity: sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw==} + + '@floating-ui/utils@0.2.4': + resolution: {integrity: sha512-dWO2pw8hhi+WrXq1YJy2yCuWoL20PddgGaqTgVe4cOS9Q6qklXCiA1tJEqX6BEwRNSCP84/afac9hd4MS+zEUA==} + + '@floating-ui/vue@1.1.1': + resolution: {integrity: sha512-cyawjk9etPZPl/RVtMRnWrwtAhWbPVSrRVYARgOzhLIqxr0k2up1APrrFjqP9QwRQ0AwjKSvbWg4YC6jESutow==} + + '@headlessui/react@2.0.4': + resolution: {integrity: sha512-16d/rOLeYsFsmPlRmXGu8DCBzrWD0zV1Ccx3n73wN87yFu8Y9+X04zflv8EJEt9TAYRyLKOmQXUnOnqQl6NgpA==} + engines: {node: '>=10'} + peerDependencies: + react: ^18 + react-dom: ^18 + + '@headlessui/tailwindcss@0.2.1': + resolution: {integrity: sha512-2+5+NZ+RzMyrVeCZOxdbvkUSssSxGvcUxphkIfSVLpRiKsj+/63T2TOL9dBYMXVfj/CGr6hMxSRInzXv6YY7sA==} + engines: {node: '>=10'} + peerDependencies: + tailwindcss: ^3.0 + + '@headlessui/vue@1.7.22': + resolution: {integrity: sha512-Hoffjoolq1rY+LOfJ+B/OvkhuBXXBFgd8oBlN+l1TApma2dB0En0ucFZrwQtb33SmcCqd32EQd0y07oziXWNYg==} + engines: {node: '>=10'} + peerDependencies: + vue: ^3.2.0 + + '@heroicons/react@2.1.3': + resolution: {integrity: sha512-fEcPfo4oN345SoqdlCDdSa4ivjaKbk0jTd+oubcgNxnNgAfzysfwWfQUr+51wigiWHQQRiZNd1Ao0M5Y3M2EGg==} + peerDependencies: + react: '>= 16' + + '@humanwhocodes/config-array@0.11.14': + resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} + engines: {node: '>=10.10.0'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/object-schema@2.0.3': + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + + '@img/sharp-darwin-arm64@0.33.1': + resolution: {integrity: sha512-esr2BZ1x0bo+wl7Gx2hjssYhjrhUsD88VQulI0FrG8/otRQUOxLWHMBd1Y1qo2Gfg2KUvXNpT0ASnV9BzJCexw==} + engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm64] + os: [darwin] + + '@img/sharp-darwin-x64@0.33.1': + resolution: {integrity: sha512-YrnuB3bXuWdG+hJlXtq7C73lF8ampkhU3tMxg5Hh+E7ikxbUVOU9nlNtVTloDXz6pRHt2y2oKJq7DY/yt+UXYw==} + engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-darwin-arm64@1.0.0': + resolution: {integrity: sha512-VzYd6OwnUR81sInf3alj1wiokY50DjsHz5bvfnsFpxs5tqQxESoHtJO6xyksDs3RIkyhMWq2FufXo6GNSU9BMw==} + engines: {macos: '>=11', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm64] + os: [darwin] + + '@img/sharp-libvips-darwin-x64@1.0.0': + resolution: {integrity: sha512-dD9OznTlHD6aovRswaPNEy8dKtSAmNo4++tO7uuR4o5VxbVAOoEQ1uSmN4iFAdQneTHws1lkTZeiXPrcCkh6IA==} + engines: {macos: '>=10.13', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-linux-arm64@1.0.0': + resolution: {integrity: sha512-xTYThiqEZEZc0PRU90yVtM3KE7lw1bKdnDQ9kCTHWbqWyHOe4NpPOtMGy27YnN51q0J5dqRrvicfPbALIOeAZA==} + engines: {glibc: '>=2.26', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linux-arm@1.0.0': + resolution: {integrity: sha512-VwgD2eEikDJUk09Mn9Dzi1OW2OJFRQK+XlBTkUNmAWPrtj8Ly0yq05DFgu1VCMx2/DqCGQVi5A1dM9hTmxf3uw==} + engines: {glibc: '>=2.28', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm] + os: [linux] + + '@img/sharp-libvips-linux-s390x@1.0.0': + resolution: {integrity: sha512-o9E46WWBC6JsBlwU4QyU9578G77HBDT1NInd+aERfxeOPbk0qBZHgoDsQmA2v9TbqJRWzoBPx1aLOhprBMgPjw==} + engines: {glibc: '>=2.28', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [s390x] + os: [linux] + + '@img/sharp-libvips-linux-x64@1.0.0': + resolution: {integrity: sha512-naldaJy4hSVhWBgEjfdBY85CAa4UO+W1nx6a1sWStHZ7EUfNiuBTTN2KUYT5dH1+p/xij1t2QSXfCiFJoC5S/Q==} + engines: {glibc: '>=2.26', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [x64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-arm64@1.0.0': + resolution: {integrity: sha512-OdorplCyvmSAPsoJLldtLh3nLxRrkAAAOHsGWGDYfN0kh730gifK+UZb3dWORRa6EusNqCTjfXV4GxvgJ/nPDQ==} + engines: {musl: '>=1.2.2', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-x64@1.0.0': + resolution: {integrity: sha512-FW8iK6rJrg+X2jKD0Ajhjv6y74lToIBEvkZhl42nZt563FfxkCYacrXZtd+q/sRQDypQLzY5WdLkVTbJoPyqNg==} + engines: {musl: '>=1.2.2', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [x64] + os: [linux] + + '@img/sharp-linux-arm64@0.33.1': + resolution: {integrity: sha512-59B5GRO2d5N3tIfeGHAbJps7cLpuWEQv/8ySd9109ohQ3kzyCACENkFVAnGPX00HwPTQcaBNF7HQYEfZyZUFfw==} + engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm64] + os: [linux] + + '@img/sharp-linux-arm@0.33.1': + resolution: {integrity: sha512-Ii4X1vnzzI4j0+cucsrYA5ctrzU9ciXERfJR633S2r39CiD8npqH2GMj63uFZRCFt3E687IenAdbwIpQOJ5BNA==} + engines: {glibc: '>=2.28', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm] + os: [linux] + + '@img/sharp-linux-s390x@0.33.1': + resolution: {integrity: sha512-tRGrb2pHnFUXpOAj84orYNxHADBDIr0J7rrjwQrTNMQMWA4zy3StKmMvwsI7u3dEZcgwuMMooIIGWEWOjnmG8A==} + engines: {glibc: '>=2.28', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [s390x] + os: [linux] + + '@img/sharp-linux-x64@0.33.1': + resolution: {integrity: sha512-4y8osC0cAc1TRpy02yn5omBeloZZwS62fPZ0WUAYQiLhSFSpWJfY/gMrzKzLcHB9ulUV6ExFiu2elMaixKDbeg==} + engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [x64] + os: [linux] + + '@img/sharp-linuxmusl-arm64@0.33.1': + resolution: {integrity: sha512-D3lV6clkqIKUizNS8K6pkuCKNGmWoKlBGh5p0sLO2jQERzbakhu4bVX1Gz+RS4vTZBprKlWaf+/Rdp3ni2jLfA==} + engines: {musl: '>=1.2.2', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm64] + os: [linux] + + '@img/sharp-linuxmusl-x64@0.33.1': + resolution: {integrity: sha512-LOGKNu5w8uu1evVqUAUKTix2sQu1XDRIYbsi5Q0c/SrXhvJ4QyOx+GaajxmOg5PZSsSnCYPSmhjHHsRBx06/wQ==} + engines: {musl: '>=1.2.2', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [x64] + os: [linux] + + '@img/sharp-wasm32@0.33.1': + resolution: {integrity: sha512-vWI/sA+0p+92DLkpAMb5T6I8dg4z2vzCUnp8yvxHlwBpzN8CIcO3xlSXrLltSvK6iMsVMNswAv+ub77rsf25lA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [wasm32] + + '@img/sharp-win32-ia32@0.33.1': + resolution: {integrity: sha512-/xhYkylsKL05R+NXGJc9xr2Tuw6WIVl2lubFJaFYfW4/MQ4J+dgjIo/T4qjNRizrqs/szF/lC9a5+updmY9jaQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [ia32] + os: [win32] + + '@img/sharp-win32-x64@0.33.1': + resolution: {integrity: sha512-XaM69X0n6kTEsp9tVYYLhXdg7Qj32vYJlAKRutxUsm1UlgQNx6BOhHwZPwukCGXBU2+tH87ip2eV1I/E8MQnZg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [x64] + os: [win32] + + '@internationalized/date@3.5.4': + resolution: {integrity: sha512-qoVJVro+O0rBaw+8HPjUB1iH8Ihf8oziEnqMnvhJUSuVIrHOuZ6eNLHNvzXJKUvAtaDiqMnRlg8Z2mgh09BlUw==} + + '@internationalized/number@3.5.3': + resolution: {integrity: sha512-rd1wA3ebzlp0Mehj5YTuTI50AQEx80gWFyHcQu+u91/5NgdwBecO8BH6ipPfE+lmQ9d63vpB3H9SHoIUiupllw==} + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@jest/schemas@29.6.3': + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jridgewell/gen-mapping@0.3.5': + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/source-map@0.3.6': + resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} + + '@jridgewell/sourcemap-codec@1.4.15': + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@lezer/common@1.2.1': + resolution: {integrity: sha512-yemX0ZD2xS/73llMZIK6KplkjIjf2EvAHcinDi/TfJ9hS25G0388+ClHt6/3but0oOxinTcQHJLDXh6w1crzFQ==} + + '@lezer/css@1.1.8': + resolution: {integrity: sha512-7JhxupKuMBaWQKjQoLtzhGj83DdnZY9MckEOG5+/iLKNK2ZJqKc6hf6uc0HjwCX7Qlok44jBNqZhHKDhEhZYLA==} + + '@lezer/highlight@1.2.0': + resolution: {integrity: sha512-WrS5Mw51sGrpqjlh3d4/fOwpEV2Hd3YOkp9DBt4k8XZQcoTHZFB7sx030A6OcahF4J1nDQAa3jXlTVVYH50IFA==} + + '@lezer/html@1.3.10': + resolution: {integrity: sha512-dqpT8nISx/p9Do3AchvYGV3qYc4/rKr3IBZxlHmpIKam56P47RSHkSF5f13Vu9hebS1jM0HmtJIwLbWz1VIY6w==} + + '@lezer/javascript@1.4.17': + resolution: {integrity: sha512-bYW4ctpyGK+JMumDApeUzuIezX01H76R1foD6LcRX224FWfyYit/HYxiPGDjXXe/wQWASjCvVGoukTH68+0HIA==} + + '@lezer/json@1.0.2': + resolution: {integrity: sha512-xHT2P4S5eeCYECyKNPhr4cbEL9tc8w83SPwRC373o9uEdrvGKTZoJVAGxpOsZckMlEh9W23Pc72ew918RWQOBQ==} + + '@lezer/lr@1.4.1': + resolution: {integrity: sha512-CHsKq8DMKBf9b3yXPDIU4DbH+ZJd/sJdYOW2llbW/HudP5u0VS6Bfq1hLYfgU7uAYGFIyGGQIsSOXGPEErZiJw==} + + '@lezer/yaml@1.0.3': + resolution: {integrity: sha512-GuBLekbw9jDBDhGur82nuwkxKQ+a3W5H0GfaAthDXcAu+XdpS43VlnxA9E9hllkpSP5ellRDKjLLj7Lu9Wr6xA==} + + '@mdx-js/loader@3.0.1': + resolution: {integrity: sha512-YbYUt7YyEOdFxhyuCWmLKf5vKhID/hJAojEUnheJk4D8iYVLFQw+BAoBWru/dHGch1omtmZOPstsmKPyBF68Tw==} + peerDependencies: + webpack: '>=5' + + '@mdx-js/mdx@3.0.1': + resolution: {integrity: sha512-eIQ4QTrOWyL3LWEe/bu6Taqzq2HQvHcyTMaOrI95P2/LmJE7AsfPfgJGuFLPVqBUE1BC1rik3VIhU+s9u72arA==} + + '@mdx-js/react@3.0.1': + resolution: {integrity: sha512-9ZrPIU4MGf6et1m1ov3zKf+q9+deetI51zprKB1D/z3NOb+rUxxtEl3mCjW5wTGh6VhRdwPueh1oRzi6ezkA8A==} + peerDependencies: + '@types/react': '>=16' + react: '>=16' + + '@next/env@14.2.3': + resolution: {integrity: sha512-W7fd7IbkfmeeY2gXrzJYDx8D2lWKbVoTIj1o1ScPHNzvp30s1AuoEFSdr39bC5sjxJaxTtq3OTCZboNp0lNWHA==} + + '@next/eslint-plugin-next@14.2.3': + resolution: {integrity: sha512-L3oDricIIjgj1AVnRdRor21gI7mShlSwU/1ZGHmqM3LzHhXXhdkrfeNY5zif25Bi5Dd7fiJHsbhoZCHfXYvlAw==} + + '@next/mdx@14.2.3': + resolution: {integrity: sha512-oVz7BWpoLQ9dKvCKxPIX9X6BILPTrpTJnYDn2lAsZvK7J9Ela6xNm57vNwgZ8q7xw1THSDdSlbPNgIalM7U/+A==} + peerDependencies: + '@mdx-js/loader': '>=0.15.0' + '@mdx-js/react': '>=0.15.0' + peerDependenciesMeta: + '@mdx-js/loader': + optional: true + '@mdx-js/react': + optional: true + + '@next/swc-darwin-arm64@14.2.3': + resolution: {integrity: sha512-3pEYo/RaGqPP0YzwnlmPN2puaF2WMLM3apt5jLW2fFdXD9+pqcoTzRk+iZsf8ta7+quAe4Q6Ms0nR0SFGFdS1A==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@next/swc-darwin-x64@14.2.3': + resolution: {integrity: sha512-6adp7waE6P1TYFSXpY366xwsOnEXM+y1kgRpjSRVI2CBDOcbRjsJ67Z6EgKIqWIue52d2q/Mx8g9MszARj8IEA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@next/swc-linux-arm64-gnu@14.2.3': + resolution: {integrity: sha512-cuzCE/1G0ZSnTAHJPUT1rPgQx1w5tzSX7POXSLaS7w2nIUJUD+e25QoXD/hMfxbsT9rslEXugWypJMILBj/QsA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@next/swc-linux-arm64-musl@14.2.3': + resolution: {integrity: sha512-0D4/oMM2Y9Ta3nGuCcQN8jjJjmDPYpHX9OJzqk42NZGJocU2MqhBq5tWkJrUQOQY9N+In9xOdymzapM09GeiZw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@next/swc-linux-x64-gnu@14.2.3': + resolution: {integrity: sha512-ENPiNnBNDInBLyUU5ii8PMQh+4XLr4pG51tOp6aJ9xqFQ2iRI6IH0Ds2yJkAzNV1CfyagcyzPfROMViS2wOZ9w==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@next/swc-linux-x64-musl@14.2.3': + resolution: {integrity: sha512-BTAbq0LnCbF5MtoM7I/9UeUu/8ZBY0i8SFjUMCbPDOLv+un67e2JgyN4pmgfXBwy/I+RHu8q+k+MCkDN6P9ViQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@next/swc-win32-arm64-msvc@14.2.3': + resolution: {integrity: sha512-AEHIw/dhAMLNFJFJIJIyOFDzrzI5bAjI9J26gbO5xhAKHYTZ9Or04BesFPXiAYXDNdrwTP2dQceYA4dL1geu8A==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@next/swc-win32-ia32-msvc@14.2.3': + resolution: {integrity: sha512-vga40n1q6aYb0CLrM+eEmisfKCR45ixQYXuBXxOOmmoV8sYST9k7E3US32FsY+CkkF7NtzdcebiFT4CHuMSyZw==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + + '@next/swc-win32-x64-msvc@14.2.3': + resolution: {integrity: sha512-Q1/zm43RWynxrO7lW4ehciQVj+5ePBhOK+/K2P7pLFX3JaJ/IZVC69SHidrmZSOkqz7ECIOhhy7XhAFG4JYyHA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@popperjs/core@2.11.8': + resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} + + '@react-aria/focus@3.17.1': + resolution: {integrity: sha512-FLTySoSNqX++u0nWZJPPN5etXY0WBxaIe/YuL/GTEeuqUIuC/2bJSaw5hlsM6T2yjy6Y/VAxBcKSdAFUlU6njQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-aria/interactions@3.21.3': + resolution: {integrity: sha512-BWIuf4qCs5FreDJ9AguawLVS0lV9UU+sK4CCnbCNNmYqOWY+1+gRXCsnOM32K+oMESBxilAjdHW5n1hsMqYMpA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-aria/ssr@3.9.4': + resolution: {integrity: sha512-4jmAigVq409qcJvQyuorsmBR4+9r3+JEC60wC+Y0MZV0HCtTmm8D9guYXlJMdx0SSkgj0hHAyFm/HvPNFofCoQ==} + engines: {node: '>= 12'} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-aria/utils@3.24.1': + resolution: {integrity: sha512-O3s9qhPMd6n42x9sKeJ3lhu5V1Tlnzhu6Yk8QOvDuXf7UGuUjXf9mzfHJt1dYzID4l9Fwm8toczBzPM9t0jc8Q==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-stately/utils@3.10.1': + resolution: {integrity: sha512-VS/EHRyicef25zDZcM/ClpzYMC5i2YGN6uegOeQawmgfGjb02yaCX0F0zR69Pod9m2Hr3wunTbtpgVXvYbZItg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-types/shared@3.23.1': + resolution: {integrity: sha512-5d+3HbFDxGZjhbMBeFHRQhexMFt4pUce3okyRtUVKbbedQFUrtXSBg9VszgF2RTeQDKDkMCIQDtz5ccP/Lk1gw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@replit/codemirror-css-color-picker@6.1.1': + resolution: {integrity: sha512-e/wYHcgt3HRDpvYuwqXyjv3LEY6VyFjJeDQK1UtFmaykp86R6Cbw3ULH9pvuJuelaW6nS4CVtIRHuOfbFLlqwQ==} + peerDependencies: + '@codemirror/language': ^6.0.0 + '@codemirror/state': ^6.0.0 + '@codemirror/view': ^6.0.0 + + '@rushstack/eslint-patch@1.10.3': + resolution: {integrity: sha512-qC/xYId4NMebE6w/V33Fh9gWxLgURiNYgVNObbJl2LZv0GUUItCcCqC5axQSwRaAgaxl2mELq1rMzlswaQ0Zxg==} + + '@scalar/api-client@2.0.15': + resolution: {integrity: sha512-k/DEkS3kWALOM4KacMXrd6v01V086fuyYRsiBIvdzyyUb1GwXXqrYMlPYVU80HDRZCjGUiovObixbTdour8AiQ==} + engines: {node: '>=18'} + + '@scalar/api-reference-react@0.3.37': + resolution: {integrity: sha512-XVm2CQcW6r6XVkT+i/JdaBqKizyVDfgp4Za//VWp3q1ZLHhdbwJD4TxZ1M7gWWuqK8I5uFKH2AnmTYv4MPEYGQ==} + engines: {node: '>=18'} + + '@scalar/api-reference@1.24.39': + resolution: {integrity: sha512-H2WJVQdT5W9GiEWNCCiBEmjnfZ3nQl1H2zNDJJ3nv8UR3vWcTZ9JfwyX7vqeNCZAio0CNAzamGqau+j19Q4u0g==} + engines: {node: '>=18'} + + '@scalar/code-highlight@0.0.7': + resolution: {integrity: sha512-YUSlnNapSUuLKDFiiQ54ok+gHD9ufCifI2CAU5HtIvt8pS/Ns4r0D/N+RuEWu5HccbBt/S4cLYkwlg4q76ym/A==} + engines: {node: '>=18'} + + '@scalar/components@0.12.12': + resolution: {integrity: sha512-zer4YrrMo15KW7SE8wkHEYZ5LGSXi47a4DCO5zZAk/V/XPZrRMt/5ZEV4z+m9zpBkYYClcJDpGZUiqT5GqHjOg==} + engines: {node: '>=18'} + + '@scalar/draggable@0.1.3': + resolution: {integrity: sha512-A6lUgTV8q/zJGkzHerY1T+X3l3GXmCCg09Z7OU7j6yDyyuj2BSTblthncoD5sN3BdwLjHwkm9ecehfvaE0pj5w==} + engines: {node: '>=18'} + + '@scalar/oas-utils@0.2.13': + resolution: {integrity: sha512-wYlOuSE49pD3TQ4wmw1sHdMJMFajuu3x1DYsWzpJtKnJX8ij3UtKi8EaPgjxvH9GZ8sNzIlI9ZddPU1llYjQhg==} + engines: {node: '>=18'} + + '@scalar/object-utils@1.1.4': + resolution: {integrity: sha512-9+aPspcxdi7NfcFE/CflbmAVClRbSeiXvxaEtk0At7sYG3tQHyP9OrD3fFGqmlPKruvxX9aWJ2OWeC+5Q9vh0A==} + engines: {node: '>=18'} + + '@scalar/openapi-parser@0.7.2': + resolution: {integrity: sha512-kgzFox4KzC3NLrOZeT9m/iQ2VMNvL7JNz8ec+hz0sYulvMtYQ1qTqEyjQjALyCDzmzrSJA11Vg8JMMHDw3AA7A==} + engines: {node: '>=18'} + + '@scalar/snippetz-core@0.1.4': + resolution: {integrity: sha512-NMnDzl5dHgUj0k8ZtfssDfy6wv1wO/M+GhpdGr/4OH3m8UZB27CZ3hM7wXh+fm75hZO5XIBsANW20kJVnzpaHg==} + + '@scalar/snippetz-plugin-js-fetch@0.1.1': + resolution: {integrity: sha512-9ODfi0OaEvZHdCe09c91eH1R5QPynL+FPxtYuK/9K5ElRE2NqxYysri9AsgOhr1Fqhpy5qKzDj4Gi5FHsJSGXw==} + + '@scalar/snippetz-plugin-js-ofetch@0.1.1': + resolution: {integrity: sha512-fPIJlY4q1j5gbnsYSxix0IJ7hqcvm8Ly7iVoK66vaL738AIMiGZMhGKtLrTVPad77PimwO+jeq5iDIZ495UY7Q==} + + '@scalar/snippetz-plugin-node-fetch@0.1.2': + resolution: {integrity: sha512-kD6erA6aAqjHkj+JrJQKqrqcH4fnCrLi2uYw16CmELIGtqVHFau7ew2c087y4OQTltdi5rEk2zj5zOBu9yaS3Q==} + + '@scalar/snippetz-plugin-node-ofetch@0.1.1': + resolution: {integrity: sha512-9NpvdMKebg82FkVWoWyOxd1JXAB8KNxmrsFFwQKNjhAw0A5hjNR5oW9lD+FtB1Laupg2FNtw9dcCydnF+LcCWw==} + + '@scalar/snippetz-plugin-node-undici@0.1.6': + resolution: {integrity: sha512-CivUl7wgZ6vlUb01FMdqOt/NVyOWqT0iHZRp5YlPp1pflXZLnAyi5antUTtBEUHUtHM2EO/WR7vx4kRsPcrgLg==} + + '@scalar/snippetz@0.1.6': + resolution: {integrity: sha512-z3DEpT/FIZq9yeHL/tz2v6WvdHIiZ4uvK96RdeTPKUUJ0IXvA5vONG3PF5LE0Q/408PCzWsZpGs9f97ztaeJSQ==} + + '@scalar/themes@0.9.13': + resolution: {integrity: sha512-ok1hC5ez9cYnVr2F8WF0FyE5P0GWiim12H3aOoPvq1VFI+ASoFjJNgo7rT4nhVbO3htcBh1Le9KfIFTyO7bhYA==} + engines: {node: '>=18'} + + '@scalar/use-codemirror@0.11.5': + resolution: {integrity: sha512-JPAkSukziVpkASpTFejxP0cnopiBrNvTFEbwGCGJXbxklKSyHQ9FQXo0iIv/USRBI6l64x+kSIljFk0SKXiD3Q==} + engines: {node: '>=18'} + + '@scalar/use-toasts@0.7.4': + resolution: {integrity: sha512-LvnY0Gl0G09kgf65A3ArtZ1pOjB3Y7Rs29IS2GRlVKICGYOgdiWEdeWzXZCMtvvmIEM+LH5FTbuoqpiwXJ1OXg==} + engines: {node: '>=18'} + + '@scalar/use-tooltip@1.0.2': + resolution: {integrity: sha512-bj3RkmGGtCPNgEuopNLOXfQtFM3KnsfAQc9LQEr6iC9FNUa+Ddrlq85wgAK4W740aducchrgK+fBZDpXQbzQTw==} + engines: {node: '>=18'} + + '@shikijs/core@1.10.3': + resolution: {integrity: sha512-D45PMaBaeDHxww+EkcDQtDAtzv00Gcsp72ukBtaLSmqRvh0WgGMq3Al0rl1QQBZfuneO75NXMIzEZGFitThWbg==} + + '@shikijs/core@1.6.2': + resolution: {integrity: sha512-guW5JeDzZ7uwOjTfCOFZ2VtVXk5tmkMzBYbKGfXsmAH1qYOej49L5jQDcGmwd6/OgvpmWhzO2GNJkQIFnbwLPQ==} + + '@shikijs/transformers@1.10.3': + resolution: {integrity: sha512-MNjsyye2WHVdxfZUSr5frS97sLGe6G1T+1P41QjyBFJehZphMcr4aBlRLmq6OSPBslYe9byQPVvt/LJCOfxw8Q==} + + '@sinclair/typebox@0.27.8': + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + + '@sindresorhus/merge-streams@2.3.0': + resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} + engines: {node: '>=18'} + + '@sindresorhus/slugify@2.2.1': + resolution: {integrity: sha512-MkngSCRZ8JdSOCHRaYd+D01XhvU3Hjy6MGl06zhOk614hp9EOAp5gIkBeQg7wtmxpitU6eAL4kdiRMcJa2dlrw==} + engines: {node: '>=12'} + + '@sindresorhus/transliterate@1.6.0': + resolution: {integrity: sha512-doH1gimEu3A46VX6aVxpHTeHrytJAG6HgdxntYnCFiIFHEM/ZGpG8KiZGBChchjQmG0XFIBL552kBTjVcMZXwQ==} + engines: {node: '>=12'} + + '@storybook/codemod@8.2.0': + resolution: {integrity: sha512-uSC1fhceHC/yB8QXWZcKZAGml6TFbK9pEsu/UdUmhlLknG3HTzQN3gAm8ctWbKx2vk5VEQGUwTpMdUCEs0gM3g==} + + '@storybook/core@8.2.0': + resolution: {integrity: sha512-9NYEReh90shD9o2GH2ZKFoDcxvOay6B+ThA6M8XkI+hkdUzQ0oTIr3gG628p0Aj5erVB0aey7JVoDfzV5Vud/w==} + + '@storybook/csf@0.1.11': + resolution: {integrity: sha512-dHYFQH3mA+EtnCkHXzicbLgsvzYjcDJ1JWsogbItZogkPHgSJM/Wr71uMkcvw8v9mmCyP4NpXJuu6bPoVsOnzg==} + + '@storybook/global@5.0.0': + resolution: {integrity: sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==} + + '@storybook/instrumenter@8.2.0': + resolution: {integrity: sha512-TdJkzZgjVYN0HpAppFSrNMvjO6TcWt66bEQXLxr7o6E1eJvD6I258Lxkejf7dc5VXy/sb2fzh6oGH3l+812ziA==} + peerDependencies: + storybook: ^8.2.0 + + '@storybook/test@8.2.0': + resolution: {integrity: sha512-BJa1iPNODG25QnNHDL0BTkZmYHdDcqG+hifRI36jdwmKIoL2+6Ei75q5lIDBxNzUSkd+g7yX+0KXaylBW6tFPw==} + peerDependencies: + storybook: ^8.2.0 + + '@swc/counter@0.1.3': + resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + + '@swc/helpers@0.5.11': + resolution: {integrity: sha512-YNlnKRWF2sVojTpIyzwou9XoTNbzbzONwRhOoniEioF1AtaitTvVZblaQRrAzChWQ1bLYyYSWzM18y4WwgzJ+A==} + + '@swc/helpers@0.5.5': + resolution: {integrity: sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==} + + '@tailwindcss/typography@0.5.13': + resolution: {integrity: sha512-ADGcJ8dX21dVVHIwTRgzrcunY6YY9uSlAHHGVKvkA+vLc5qLwEszvKts40lx7z0qc4clpjclwLeK5rVCV2P/uw==} + peerDependencies: + tailwindcss: '>=3.0.0 || insiders' + + '@tanstack/react-virtual@3.5.0': + resolution: {integrity: sha512-rtvo7KwuIvqK9zb0VZ5IL7fiJAEnG+0EiFZz8FUOs+2mhGqdGmjKIaT1XU7Zq0eFqL0jonLlhbayJI/J2SA/Bw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + + '@tanstack/virtual-core@3.5.0': + resolution: {integrity: sha512-KnPRCkQTyqhanNC0K63GBG3wA8I+D1fQuVnAvcBF8f13akOKeQp1gSbu6f77zCxhEk727iV5oQnbHLYzHrECLg==} + + '@tanstack/virtual-core@3.8.2': + resolution: {integrity: sha512-ffpN6kTaPGwQPoWMcBAHbdv2ZCpj1SugldoYAcY0C4xH+Pej1KCOEUisNeEgbUnXOp8Y/4q6wGPu2tFHthOIQw==} + + '@tanstack/vue-virtual@3.8.2': + resolution: {integrity: sha512-mVix+nFKajrA+48ky5s7/IYP5/uHHLTz1ZRJfwg2bOLcHUcKyvsLE2UGG4+8hd62ueprWg5MgTudGyR2TYfwpw==} + peerDependencies: + vue: ^2.7.0 || ^3.0.0 + + '@testing-library/dom@10.1.0': + resolution: {integrity: sha512-wdsYKy5zupPyLCW2Je5DLHSxSfbIp6h80WoHOQc+RPtmPGA52O9x5MJEkv92Sjonpq+poOAtUKhh1kBGAXBrNA==} + engines: {node: '>=18'} + + '@testing-library/jest-dom@6.4.5': + resolution: {integrity: sha512-AguB9yvTXmCnySBP1lWjfNNUwpbElsaQ567lt2VdGqAdHtpieLgjmcVyv1q7PMIvLbgpDdkWV5Ydv3FEejyp2A==} + engines: {node: '>=14', npm: '>=6', yarn: '>=1'} + peerDependencies: + '@jest/globals': '>= 28' + '@types/bun': latest + '@types/jest': '>= 28' + jest: '>= 28' + vitest: '>= 0.32' + peerDependenciesMeta: + '@jest/globals': + optional: true + '@types/bun': + optional: true + '@types/jest': + optional: true + jest: + optional: true + vitest: + optional: true + + '@testing-library/user-event@14.5.2': + resolution: {integrity: sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ==} + engines: {node: '>=12', npm: '>=6'} + peerDependencies: + '@testing-library/dom': '>=7.21.4' + + '@types/acorn@4.0.6': + resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} + + '@types/aria-query@5.0.4': + resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} + + '@types/body-parser@1.19.5': + resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} + + '@types/connect@3.4.38': + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + + '@types/cross-spawn@6.0.6': + resolution: {integrity: sha512-fXRhhUkG4H3TQk5dBhQ7m/JDdSNHKwR2BBia62lhwEIq9xGiQKLxd6LymNhn47SjXhsUEPmxi+PKw2OkW4LLjA==} + + '@types/debug@4.1.12': + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + + '@types/emscripten@1.39.13': + resolution: {integrity: sha512-cFq+fO/isvhvmuP/+Sl4K4jtU6E23DoivtbO4r50e3odaxAiVdbfSYRDdJ4gCdxx+3aRjhphS5ZMwIH4hFy/Cw==} + + '@types/eslint-scope@3.7.7': + resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} + + '@types/eslint@8.56.10': + resolution: {integrity: sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==} + + '@types/estree-jsx@1.0.5': + resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} + + '@types/estree@1.0.5': + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + + '@types/express-serve-static-core@4.19.5': + resolution: {integrity: sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==} + + '@types/express@4.17.21': + resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} + + '@types/har-format@1.2.15': + resolution: {integrity: sha512-RpQH4rXLuvTXKR0zqHq3go0RVXYv/YVqv4TnPH95VbwUxZdQlK1EtcMvQvMpDngHbt13Csh9Z4qT9AbkiQH5BA==} + + '@types/hast@3.0.4': + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + + '@types/http-errors@2.0.4': + resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/json5@0.0.29': + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + + '@types/mdast@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + + '@types/mdx@2.0.13': + resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==} + + '@types/mime@1.3.5': + resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} + + '@types/ms@0.7.34': + resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} + + '@types/node@18.19.39': + resolution: {integrity: sha512-nPwTRDKUctxw3di5b4TfT3I0sWDiWoPQCZjXhvdkINntwr8lcoVCKsTgnXeRubKIlfnV+eN/HYk6Jb40tbcEAQ==} + + '@types/node@20.12.13': + resolution: {integrity: sha512-gBGeanV41c1L171rR7wjbMiEpEI/l5XFQdLLfhr/REwpgDy/4U8y89+i8kRiLzDyZdOkXh+cRaTetUnCYutoXA==} + + '@types/prop-types@15.7.12': + resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} + + '@types/qs@6.9.15': + resolution: {integrity: sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==} + + '@types/range-parser@1.2.7': + resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + + '@types/react-dom@18.3.0': + resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==} + + '@types/react-highlight-words@0.16.7': + resolution: {integrity: sha512-+upXTIaRd3rGvh1aDQSs9z5X+sV3UM6Jrmjk03GN2GXl4v/+iOJKQj2LZHo6Vp2IoTvMdtxgME26feqo12xXLg==} + + '@types/react@18.3.3': + resolution: {integrity: sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==} + + '@types/semver@7.5.8': + resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} + + '@types/send@0.17.4': + resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} + + '@types/serve-static@1.15.7': + resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==} + + '@types/unist@2.0.10': + resolution: {integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==} + + '@types/unist@3.0.2': + resolution: {integrity: sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==} + + '@types/web-bluetooth@0.0.20': + resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==} + + '@typescript-eslint/parser@7.2.0': + resolution: {integrity: sha512-5FKsVcHTk6TafQKQbuIVkXq58Fnbkd2wDL4LB7AURN7RUOu1utVP+G8+6u3ZhEroW3DF6hyo3ZEXxgKgp4KeCg==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/scope-manager@7.2.0': + resolution: {integrity: sha512-Qh976RbQM/fYtjx9hs4XkayYujB/aPwglw2choHmf3zBjB4qOywWSdt9+KLRdHubGcoSwBnXUH2sR3hkyaERRg==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@typescript-eslint/types@7.2.0': + resolution: {integrity: sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@typescript-eslint/typescript-estree@7.2.0': + resolution: {integrity: sha512-cyxS5WQQCoBwSakpMrvMXuMDEbhOo9bNHHrNcEWis6XHx6KF518tkF1wBvKIn/tpq5ZpUYK7Bdklu8qY0MsFIA==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/visitor-keys@7.2.0': + resolution: {integrity: sha512-c6EIQRHhcpl6+tO8EMR+kjkkV+ugUNXOmeASA1rlzkd8EPIriavpWoiEz1HR/VLhbVIdhqnV6E7JZm00cBDx2A==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@uiw/codemirror-themes@4.23.0': + resolution: {integrity: sha512-9fiji9xooZyBQozR1i6iTr56YP7j/Dr/VgsNWbqf5Szv+g+4WM1iZuiDGwNXmFMWX8gbkDzp6ASE21VCPSofWw==} + peerDependencies: + '@codemirror/language': '>=6.0.0' + '@codemirror/state': '>=6.0.0' + '@codemirror/view': '>=6.0.0' + + '@ungap/structured-clone@1.2.0': + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + + '@unhead/dom@1.9.15': + resolution: {integrity: sha512-4sdP/2Unt4zFRO8pBZVXvebidGmrLEvnDU6ZpasZfInjiiuuaQOVTJaiKnEnug3cmW2YjglPG2d1c2xAsHr3NQ==} + + '@unhead/schema@1.9.15': + resolution: {integrity: sha512-9ADZuXOH+tOKHIjXsgg+SPINnh/YJEBMCjpg+8VLGgE2r5med3jAnOU8g7ALfuVEBRBrbFgs1qVKoKm1NkTXJQ==} + + '@unhead/shared@1.9.15': + resolution: {integrity: sha512-+U5r04eRtCNcniWjzNPRtwVuF9rW/6EXxhGvuohJBDaIE57J6BHWo5cEp7Pqts7DlTFs7LiDtH8ONNDv4QqRaw==} + + '@unhead/vue@1.9.15': + resolution: {integrity: sha512-h866wYOs6Q6+lc0av4EU0CPTtTvaz9UWwwsiNoulzJa95QyUN/gDPI/NiDuKweHswY+a0SSzEqe9Nhg+LlmHew==} + peerDependencies: + vue: '>=2.7 || >=3' + + '@uploadthing/dropzone@0.4.2-canary.7cbef70': + resolution: {integrity: sha512-cf/C1PWZ00SYwyx9d4/J6g6ZPv4VXKZ3wGFxc38hcfNSf/NRAEReWPTGz0PmbqJYK4jB/xwcyqfukKzP0CCW4A==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + solid-js: ^1.7.11 + svelte: ^4.2.12 + vue: ^3.4.0 + peerDependenciesMeta: + react: + optional: true + solid-js: + optional: true + svelte: + optional: true + vue: + optional: true + + '@uploadthing/mime-types@0.2.11-canary.7cbef70': + resolution: {integrity: sha512-nH0BpVSLaOGBmjf2ayKL4HWQbK3XgwbbLQ/df0WQNX/cVgXCbniYo/rSPOVBv2sh8WDyJCfurFItPsbjCR2Awg==} + + '@uploadthing/react@6.7.3-canary.7cbef70': + resolution: {integrity: sha512-K75LHqseeMdvY/bw2fkNbi3BBdwt/Xt8b1rg9cXjkcyUrlTwHHkbW3+oRqUz0WR6dT6W9y4m50gpHirlnryeBA==} + peerDependencies: + next: '*' + react: ^17.0.2 || ^18.0.0 + uploadthing: 6.13.3-canary.7cbef70 + peerDependenciesMeta: + next: + optional: true + + '@uploadthing/shared@6.7.9-canary.7cbef70': + resolution: {integrity: sha512-jXsdPppYfKMbnkgpbU/itXZb9f/4+RefHq0UszJpgFnjgaaTUs37IFcViXmaRQ7CvqifuOVd+v0HE9NwkBVNsw==} + + '@vitest/expect@1.6.0': + resolution: {integrity: sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==} + + '@vitest/spy@1.6.0': + resolution: {integrity: sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw==} + + '@vitest/utils@1.6.0': + resolution: {integrity: sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==} + + '@vue/compiler-core@3.4.31': + resolution: {integrity: sha512-skOiodXWTV3DxfDhB4rOf3OGalpITLlgCeOwb+Y9GJpfQ8ErigdBUHomBzvG78JoVE8MJoQsb+qhZiHfKeNeEg==} + + '@vue/compiler-dom@3.4.31': + resolution: {integrity: sha512-wK424WMXsG1IGMyDGyLqB+TbmEBFM78hIsOJ9QwUVLGrcSk0ak6zYty7Pj8ftm7nEtdU/DGQxAXp0/lM/2cEpQ==} + + '@vue/compiler-sfc@3.4.31': + resolution: {integrity: sha512-einJxqEw8IIJxzmnxmJBuK2usI+lJonl53foq+9etB2HAzlPjAS/wa7r0uUpXw5ByX3/0uswVSrjNb17vJm1kQ==} + + '@vue/compiler-ssr@3.4.31': + resolution: {integrity: sha512-RtefmITAje3fJ8FSg1gwgDhdKhZVntIVbwupdyZDSifZTRMiWxWehAOTCc8/KZDnBOcYQ4/9VWxsTbd3wT0hAA==} + + '@vue/devtools-api@6.6.3': + resolution: {integrity: sha512-0MiMsFma/HqA6g3KLKn+AGpL1kgKhFWszC9U29NfpWK5LE7bjeXxySWJrOJ77hBz+TBrBQ7o4QJqbPbqbs8rJw==} + + '@vue/reactivity@3.4.31': + resolution: {integrity: sha512-VGkTani8SOoVkZNds1PfJ/T1SlAIOf8E58PGAhIOUDYPC4GAmFA2u/E14TDAFcf3vVDKunc4QqCe/SHr8xC65Q==} + + '@vue/runtime-core@3.4.31': + resolution: {integrity: sha512-LDkztxeUPazxG/p8c5JDDKPfkCDBkkiNLVNf7XZIUnJ+66GVGkP+TIh34+8LtPisZ+HMWl2zqhIw0xN5MwU1cw==} + + '@vue/runtime-dom@3.4.31': + resolution: {integrity: sha512-2Auws3mB7+lHhTFCg8E9ZWopA6Q6L455EcU7bzcQ4x6Dn4cCPuqj6S2oBZgN2a8vJRS/LSYYxwFFq2Hlx3Fsaw==} + + '@vue/server-renderer@3.4.31': + resolution: {integrity: sha512-D5BLbdvrlR9PE3by9GaUp1gQXlCNadIZytMIb8H2h3FMWJd4oUfkUTEH2wAr3qxoRz25uxbTcbqd3WKlm9EHQA==} + peerDependencies: + vue: 3.4.31 + + '@vue/shared@3.4.31': + resolution: {integrity: sha512-Yp3wtJk//8cO4NItOPpi3QkLExAr/aLBGZMmTtW9WpdwBCJpRM6zj9WgWktXAl8IDIozwNMByT45JP3tO3ACWA==} + + '@vueuse/core@10.11.0': + resolution: {integrity: sha512-x3sD4Mkm7PJ+pcq3HX8PLPBadXCAlSDR/waK87dz0gQE+qJnaaFhc/dZVfJz+IUYzTMVGum2QlR7ImiJQN4s6g==} + + '@vueuse/metadata@10.11.0': + resolution: {integrity: sha512-kQX7l6l8dVWNqlqyN3ePW3KmjCQO3ZMgXuBMddIu83CmucrsBfXlH+JoviYyRBws/yLTQO8g3Pbw+bdIoVm4oQ==} + + '@vueuse/shared@10.11.0': + resolution: {integrity: sha512-fyNoIXEq3PfX1L3NkNhtVQUSRtqYwJtJg+Bp9rIzculIZWHTkKSysujrOk2J+NrRulLTQH9+3gGSfYLWSEWU1A==} + + '@webassemblyjs/ast@1.12.1': + resolution: {integrity: sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==} + + '@webassemblyjs/floating-point-hex-parser@1.11.6': + resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} + + '@webassemblyjs/helper-api-error@1.11.6': + resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} + + '@webassemblyjs/helper-buffer@1.12.1': + resolution: {integrity: sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==} + + '@webassemblyjs/helper-numbers@1.11.6': + resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} + + '@webassemblyjs/helper-wasm-bytecode@1.11.6': + resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} + + '@webassemblyjs/helper-wasm-section@1.12.1': + resolution: {integrity: sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==} + + '@webassemblyjs/ieee754@1.11.6': + resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} + + '@webassemblyjs/leb128@1.11.6': + resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} + + '@webassemblyjs/utf8@1.11.6': + resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} + + '@webassemblyjs/wasm-edit@1.12.1': + resolution: {integrity: sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==} + + '@webassemblyjs/wasm-gen@1.12.1': + resolution: {integrity: sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==} + + '@webassemblyjs/wasm-opt@1.12.1': + resolution: {integrity: sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==} + + '@webassemblyjs/wasm-parser@1.12.1': + resolution: {integrity: sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==} + + '@webassemblyjs/wast-printer@1.12.1': + resolution: {integrity: sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==} + + '@xtuc/ieee754@1.2.0': + resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + + '@xtuc/long@4.2.2': + resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + + '@yarnpkg/fslib@2.10.3': + resolution: {integrity: sha512-41H+Ga78xT9sHvWLlFOZLIhtU6mTGZ20pZ29EiZa97vnxdohJD2AF42rCoAoWfqUz486xY6fhjMH+DYEM9r14A==} + engines: {node: '>=12 <14 || 14.2 - 14.9 || >14.10.0'} + + '@yarnpkg/libzip@2.3.0': + resolution: {integrity: sha512-6xm38yGVIa6mKm/DUCF2zFFJhERh/QWp1ufm4cNUvxsONBmfPg8uZ9pZBdOmF6qFGr/HlT6ABBkCSx/dlEtvWg==} + engines: {node: '>=12 <14 || 14.2 - 14.9 || >14.10.0'} + + accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + + acorn-import-assertions@1.9.0: + resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} + peerDependencies: + acorn: ^8 + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.11.3: + resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv-draft-04@1.0.0: + resolution: {integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==} + peerDependencies: + ajv: ^8.5.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv-formats@3.0.1: + resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv-keywords@3.5.2: + resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + peerDependencies: + ajv: ^6.9.1 + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ajv@8.16.0: + resolution: {integrity: sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==} + + algoliasearch@4.23.3: + resolution: {integrity: sha512-Le/3YgNvjW9zxIQMRhUHuhiUjAlKY/zsdZpfq4dlLqg6mEm0nL6yk+7f2hDOtLpxsgE4jSzDmvHL7nXdBp5feg==} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + aria-hidden@1.2.4: + resolution: {integrity: sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==} + engines: {node: '>=10'} + + aria-query@5.3.0: + resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + + array-buffer-byte-length@1.0.1: + resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} + engines: {node: '>= 0.4'} + + array-flatten@1.1.1: + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + + array-includes@3.1.8: + resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} + engines: {node: '>= 0.4'} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + array.prototype.findlast@1.2.5: + resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} + engines: {node: '>= 0.4'} + + array.prototype.findlastindex@1.2.5: + resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} + engines: {node: '>= 0.4'} + + array.prototype.flat@1.3.2: + resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} + engines: {node: '>= 0.4'} + + array.prototype.flatmap@1.3.2: + resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} + engines: {node: '>= 0.4'} + + array.prototype.toreversed@1.1.2: + resolution: {integrity: sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==} + + array.prototype.tosorted@1.1.3: + resolution: {integrity: sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==} + + arraybuffer.prototype.slice@1.0.3: + resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} + engines: {node: '>= 0.4'} + + assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + + ast-types-flow@0.0.8: + resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} + + ast-types@0.16.1: + resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} + engines: {node: '>=4'} + + astring@1.8.6: + resolution: {integrity: sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==} + hasBin: true + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + autoprefixer@10.4.19: + resolution: {integrity: sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + + axe-core@4.7.0: + resolution: {integrity: sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==} + engines: {node: '>=4'} + + axios@1.7.2: + resolution: {integrity: sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==} + + axobject-query@3.2.1: + resolution: {integrity: sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==} + + babel-core@7.0.0-bridge.0: + resolution: {integrity: sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + babel-plugin-polyfill-corejs2@0.4.11: + resolution: {integrity: sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-polyfill-corejs3@0.10.4: + resolution: {integrity: sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-polyfill-regenerator@0.6.2: + resolution: {integrity: sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + big.js@5.2.2: + resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + + body-parser@1.20.2: + resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browser-assert@1.2.1: + resolution: {integrity: sha512-nfulgvOR6S4gt9UKCeGJOuSGBPGiFT6oQ/2UBnvTY/5aQ1PnksW72fhZkM30DzoRRv2WpwZf1vHHEr3mtuXIWQ==} + + browserslist@4.23.0: + resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + + busboy@1.6.0: + resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} + engines: {node: '>=10.16.0'} + + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + + call-bind@1.0.7: + resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camelcase-css@2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} + + caniuse-lite@1.0.30001625: + resolution: {integrity: sha512-4KE9N2gcRH+HQhpeiRZXd+1niLB/XNLAhSy4z7fI8EzcbcPoAqjNInxVHTiTwWfTIV4w096XG8OtCOCQQKPv3w==} + + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + + chai@4.4.1: + resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} + engines: {node: '>=4'} + + chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + + chalk@3.0.0: + resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} + engines: {node: '>=8'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + + character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + + character-reference-invalid@2.0.1: + resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + + check-error@1.0.3: + resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + + chrome-trace-event@1.0.4: + resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} + engines: {node: '>=6.0'} + + citty@0.1.6: + resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==} + + cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + + cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + + client-only@0.0.1: + resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + + clone-deep@4.0.1: + resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} + engines: {node: '>=6'} + + clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + + clsx@2.0.0: + resolution: {integrity: sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==} + engines: {node: '>=6'} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + + codemirror@6.0.1: + resolution: {integrity: sha512-J8j+nZ+CdWmIeFIGXEFbFPtpiYacFMDR8GlHK3IyHQJMCaVRfGx9NT+Hxivv1ckLWPvNdZqndbr/7lVhrf/Svg==} + + collapse-white-space@2.1.0: + resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==} + + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + color-string@1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + + color@4.2.3: + resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} + engines: {node: '>=12.5.0'} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + + commander@6.2.1: + resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==} + engines: {node: '>= 6'} + + commondir@1.0.1: + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + confbox@0.1.7: + resolution: {integrity: sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==} + + consola@3.2.3: + resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==} + engines: {node: ^14.18.0 || >=16.10.0} + + content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + cookie-signature@1.0.6: + resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + + cookie@0.6.0: + resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} + engines: {node: '>= 0.6'} + + core-js-compat@3.37.1: + resolution: {integrity: sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==} + + crelt@1.0.6: + resolution: {integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==} + + cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + + crypto-random-string@4.0.0: + resolution: {integrity: sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==} + engines: {node: '>=12'} + + css.escape@1.5.1: + resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + cva@1.0.0-beta.1: + resolution: {integrity: sha512-gznFqTgERU9q4wg7jfgqtt34+RUt9S5t0xDAAEuDwQEAXEgjdDkKXpLLNjwSxsB4Ln/sqWJEH7yhE8Ny0mxd0w==} + peerDependencies: + typescript: '>= 4.5.5 < 6' + peerDependenciesMeta: + typescript: + optional: true + + damerau-levenshtein@1.0.8: + resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} + + data-view-buffer@1.0.1: + resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} + engines: {node: '>= 0.4'} + + data-view-byte-length@1.0.1: + resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} + engines: {node: '>= 0.4'} + + data-view-byte-offset@1.0.0: + resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} + engines: {node: '>= 0.4'} + + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decode-named-character-reference@1.0.2: + resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} + + deep-eql@4.1.4: + resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} + engines: {node: '>=6'} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + defu@6.1.4: + resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + detect-indent@6.1.0: + resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} + engines: {node: '>=8'} + + detect-libc@2.0.3: + resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} + engines: {node: '>=8'} + + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + + didyoumean@1.2.2: + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + + diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + + doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + + dom-accessibility-api@0.5.16: + resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} + + dom-accessibility-api@0.6.3: + resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + effect-log@0.31.5: + resolution: {integrity: sha512-2nxwnpKNHiPbG/eVgGpKfxyoLfbdIyH6oeg4DJpOsl/1jhrFcn6fSAAW03SweFu68ikl4b5WbQscfAT0dcNHmA==} + peerDependencies: + effect: ^3.4.0 + + effect@3.4.8: + resolution: {integrity: sha512-qOQNrSSN3ITuAtARtN2Ldq6E5f42splY9VV18LqpKOXMwQCCEWkXdns4by3D2CJnDXQD2KCE0iGcRR2KowiQIA==} + + electron-to-chromium@1.4.784: + resolution: {integrity: sha512-9CZwh+sDrhDAeOEFh8s3PqwduzTyYIeYwZolc1b9ENAUt3ePu7R1sJSCWr/820ISssRxCJUyHI9Wb7j+0Uo1AA==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + emojis-list@3.0.0: + resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} + engines: {node: '>= 4'} + + encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + + enhanced-resolve@5.16.1: + resolution: {integrity: sha512-4U5pNsuDl0EhuZpq46M5xPslstkviJuhrdobaRDBk2Jy2KO37FDAJl4lb2KlNabxT0m4MTK2UHNrsAcphE8nyw==} + engines: {node: '>=10.13.0'} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + envinfo@7.13.0: + resolution: {integrity: sha512-cvcaMr7KqXVh4nyzGTVqTum+gAiL265x5jUWQIDLq//zOGbW+gSW/C+OWLleY/rs9Qole6AZLMXPbtIFQbqu+Q==} + engines: {node: '>=4'} + hasBin: true + + es-abstract@1.23.3: + resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} + engines: {node: '>= 0.4'} + + es-define-property@1.0.0: + resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-iterator-helpers@1.0.19: + resolution: {integrity: sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==} + engines: {node: '>= 0.4'} + + es-module-lexer@1.5.3: + resolution: {integrity: sha512-i1gCgmR9dCl6Vil6UKPI/trA69s08g/syhiDK9TG0Nf1RJjjFI+AzoWW7sPufzkgYAn861skuCwJa0pIIHYxvg==} + + es-object-atoms@1.0.0: + resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.0.3: + resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} + engines: {node: '>= 0.4'} + + es-shim-unscopables@1.0.2: + resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} + + es-to-primitive@1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} + + esbuild-register@3.5.0: + resolution: {integrity: sha512-+4G/XmakeBAsvJuDugJvtyF1x+XJT4FMocynNpxrvEBViirpfUn2PgNpCHedfWhF4WokNsO/OvMKrmJOIJsI5A==} + peerDependencies: + esbuild: '>=0.12 <1' + + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true + + escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + engines: {node: '>=6'} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + + eslint-config-next@14.2.3: + resolution: {integrity: sha512-ZkNztm3Q7hjqvB1rRlOX8P9E/cXRL9ajRcs8jufEtwMfTVYRqnmtnaSu57QqHyBlovMuiB8LEzfLBkh5RYV6Fg==} + peerDependencies: + eslint: ^7.23.0 || ^8.0.0 + typescript: '>=3.3.1' + peerDependenciesMeta: + typescript: + optional: true + + eslint-import-resolver-node@0.3.9: + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + + eslint-import-resolver-typescript@3.6.1: + resolution: {integrity: sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + eslint: '*' + eslint-plugin-import: '*' + + eslint-module-utils@2.8.1: + resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + + eslint-plugin-import@2.29.1: + resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + + eslint-plugin-jsx-a11y@6.8.0: + resolution: {integrity: sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==} + engines: {node: '>=4.0'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + + eslint-plugin-react-hooks@4.6.2: + resolution: {integrity: sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + + eslint-plugin-react@7.34.2: + resolution: {integrity: sha512-2HCmrU+/JNigDN6tg55cRDKCQWicYAPB38JGSFDQt95jDm8rrvSUo7YPkOIm5l6ts1j1zCvysNcasvfTMQzUOw==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + + eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + + eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint@8.57.0: + resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-util-attach-comments@3.0.0: + resolution: {integrity: sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==} + + estree-util-build-jsx@3.0.1: + resolution: {integrity: sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==} + + estree-util-is-identifier-name@3.0.0: + resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} + + estree-util-to-js@2.0.0: + resolution: {integrity: sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==} + + estree-util-visit@1.2.1: + resolution: {integrity: sha512-xbgqcrkIVbIG+lI/gzbvd9SGTJL4zqJKBFttUl5pP27KhAjtMKbX/mQXJ7qgyXpMgVy/zvpm0xoQQaGL8OloOw==} + + estree-util-visit@2.0.0: + resolution: {integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + + execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + + express@4.19.2: + resolution: {integrity: sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==} + engines: {node: '>= 0.10.0'} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + fast-check@3.19.0: + resolution: {integrity: sha512-CO2JX/8/PT9bDGO1iXa5h5ey1skaKI1dvecERyhH4pp3PGjwd3KIjMAXEg79Ps9nclsdt4oPbfqiAnLU0EwrAQ==} + engines: {node: '>=8.0.0'} + + fast-decode-uri-component@1.0.1: + resolution: {integrity: sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fast-querystring@1.1.2: + resolution: {integrity: sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==} + + fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + + fd-package-json@1.2.0: + resolution: {integrity: sha512-45LSPmWf+gC5tdCQMNH4s9Sr00bIkiD9aN7dc5hqkrEw1geRYyDQS1v1oMHAW3ysfxfndqGsrDREHHjNNbKUfA==} + + file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + + file-selector@0.6.0: + resolution: {integrity: sha512-QlZ5yJC0VxHxQQsQhXvBaC7VRJ2uaxTf+Tfpu4Z/OcVQJVpZO+DGU0rkoVW5ce2SccxugvpBJoMvUs59iILYdw==} + engines: {node: '>= 12'} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + finalhandler@1.2.0: + resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} + engines: {node: '>= 0.8'} + + find-cache-dir@2.1.0: + resolution: {integrity: sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==} + engines: {node: '>=6'} + + find-my-way-ts@0.1.4: + resolution: {integrity: sha512-naNl2YZ8m9LlYtPZathQBjXQQ8069uYBFq8We6w9AEGddJErVh0JZw8jd/C/2W9Ib3BjTnu+YN0/rR+ytWxNdw==} + + find-up@3.0.0: + resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} + engines: {node: '>=6'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + + flatted@3.3.1: + resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + + flexsearch@0.7.43: + resolution: {integrity: sha512-c5o/+Um8aqCSOXGcZoqZOm+NqtVwNsvVpWv6lfmSclU954O3wvQKxxK8zj74fPaSJbXpSLTs4PRhh+wnoCXnKg==} + + flow-parser@0.239.1: + resolution: {integrity: sha512-topOrETNxJ6T2gAnQiWqAlzGPj8uI2wtmNOlDIMNB+qyvGJZ6R++STbUOTAYmvPhOMz2gXnXPH0hOvURYmrBow==} + engines: {node: '>=0.4.0'} + + follow-redirects@1.15.6: + resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + + foreground-child@3.1.1: + resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + engines: {node: '>=14'} + + form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + + formdata-node@4.4.1: + resolution: {integrity: sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==} + engines: {node: '>= 12.20'} + + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + fraction.js@4.3.7: + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + + framer-motion@10.18.0: + resolution: {integrity: sha512-oGlDh1Q1XqYPksuTD/usb0I70hq95OUzmL9+6Zd+Hs4XV0oaISBa/UUMSjYiq6m8EUF32132mOJ8xVZS+I0S6w==} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + + fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + + fs-extra@11.2.0: + resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} + engines: {node: '>=14.14'} + + fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + function.prototype.name@1.1.6: + resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} + engines: {node: '>= 0.4'} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + fuse.js@7.0.0: + resolution: {integrity: sha512-14F4hBIxqKvD4Zz/XjDc3y94mNZN6pRv3U13Udo0lNLCWRBUsrMv2xwcF/y/Z5sV6+FQW+/ow68cHpm4sunt8Q==} + engines: {node: '>=10'} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} + + get-intrinsic@1.2.4: + resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + engines: {node: '>= 0.4'} + + get-own-enumerable-property-symbols@3.0.2: + resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==} + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + + get-symbol-description@1.0.2: + resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} + engines: {node: '>= 0.4'} + + get-tsconfig@4.7.5: + resolution: {integrity: sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw==} + + giget@1.2.3: + resolution: {integrity: sha512-8EHPljDvs7qKykr6uw8b+lqLiUc/vUg+KVTI0uND4s63TdsZM2Xus3mflvF0DDG9SiM4RlCkFGL+7aAjRmV7KA==} + hasBin: true + + github-slugger@2.0.0: + resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + + glob@10.3.10: + resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + + glob@10.4.1: + resolution: {integrity: sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw==} + engines: {node: '>=16 || 14 >=14.18'} + hasBin: true + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + globby@14.0.2: + resolution: {integrity: sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==} + engines: {node: '>=18'} + + gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + has-bigints@1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.0.3: + resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} + engines: {node: '>= 0.4'} + + has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + hast-util-embedded@3.0.0: + resolution: {integrity: sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA==} + + hast-util-from-html@2.0.1: + resolution: {integrity: sha512-RXQBLMl9kjKVNkJTIO6bZyb2n+cUH8LFaSSzo82jiLT6Tfc+Pt7VQCS+/h3YwG4jaNE2TA2sdJisGWR+aJrp0g==} + + hast-util-from-parse5@8.0.1: + resolution: {integrity: sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==} + + hast-util-has-property@3.0.0: + resolution: {integrity: sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==} + + hast-util-is-body-ok-link@3.0.0: + resolution: {integrity: sha512-VFHY5bo2nY8HiV6nir2ynmEB1XkxzuUffhEGeVx7orbu/B1KaGyeGgMZldvMVx5xWrDlLLG/kQ6YkJAMkBEx0w==} + + hast-util-is-element@3.0.0: + resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} + + hast-util-parse-selector@4.0.0: + resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} + + hast-util-phrasing@3.0.1: + resolution: {integrity: sha512-6h60VfI3uBQUxHqTyMymMZnEbNl1XmEGtOxxKYL7stY2o601COo62AWAYBQR9lZbYXYSBoxag8UpPRXK+9fqSQ==} + + hast-util-raw@9.0.4: + resolution: {integrity: sha512-LHE65TD2YiNsHD3YuXcKPHXPLuYh/gjp12mOfU8jxSrm1f/yJpsb0F/KKljS6U9LJoP0Ux+tCe8iJ2AsPzTdgA==} + + hast-util-sanitize@5.0.1: + resolution: {integrity: sha512-IGrgWLuip4O2nq5CugXy4GI2V8kx4sFVy5Hd4vF7AR2gxS0N9s7nEAVUyeMtZKZvzrxVsHt73XdTsno1tClIkQ==} + + hast-util-to-estree@3.1.0: + resolution: {integrity: sha512-lfX5g6hqVh9kjS/B9E2gSkvHH4SZNiQFiqWS0x9fENzEl+8W12RqdRxX6d/Cwxi30tPQs3bIO+aolQJNp1bIyw==} + + hast-util-to-html@9.0.1: + resolution: {integrity: sha512-hZOofyZANbyWo+9RP75xIDV/gq+OUKx+T46IlwERnKmfpwp81XBFbT9mi26ws+SJchA4RVUQwIBJpqEOBhMzEQ==} + + hast-util-to-jsx-runtime@2.3.0: + resolution: {integrity: sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==} + + hast-util-to-parse5@8.0.0: + resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==} + + hast-util-to-text@4.0.2: + resolution: {integrity: sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==} + + hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + + hastscript@8.0.0: + resolution: {integrity: sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==} + + highlight-words-core@1.2.2: + resolution: {integrity: sha512-BXUKIkUuh6cmmxzi5OIbUJxrG8OAk2MqoL1DtO3Wo9D2faJg2ph5ntyuQeLqaHJmzER6H5tllCDA9ZnNe9BVGg==} + + highlight.js@11.10.0: + resolution: {integrity: sha512-SYVnVFswQER+zu1laSya563s+F8VDGt7o35d4utbamowvUNLLMovFqwCLSocpZTz3MgaSRA1IbqRWZv97dtErQ==} + engines: {node: '>=12.0.0'} + + highlight.js@11.9.0: + resolution: {integrity: sha512-fJ7cW7fQGCYAkgv4CPfwFHrfd/cLS4Hau96JuJ+ZTOWhjnhoeN1ub1tFmALm/+lW5z4WCAuAV9bm05AP0mS6Gw==} + engines: {node: '>=12.0.0'} + + highlightjs-curl@1.3.0: + resolution: {integrity: sha512-50UEfZq1KR0Lfk2Tr6xb/MUIZH3h10oNC0OTy9g7WELcs5Fgy/mKN1vEhuKTkKbdo8vr5F9GXstu2eLhApfQ3A==} + + highlightjs-vue@1.0.0: + resolution: {integrity: sha512-PDEfEF102G23vHmPhLyPboFCD+BkMGu+GuJe2d9/eH4FsCwvgBpnc9n0pGE+ffKdph38s6foEZiEjdgHdzp+IA==} + + hookable@5.5.3: + resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} + + html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + + html-whitespace-sensitive-tag-names@3.0.0: + resolution: {integrity: sha512-KlClZ3/Qy5UgvpvVvDomGhnQhNWH5INE8GwvSIQ9CWt1K0zbbXrl7eN5bWaafOZgtmO3jMPwUqmrmEwinhPq1w==} + + http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + + httpsnippet-lite@3.0.5: + resolution: {integrity: sha512-So4qTXY5iFj5XtFDwyz2PicUu+8NWrI8e8h+ZeZoVtMNcFQp4FFIntBHUE+JPUG6QQU8o1VHCy+X4ETRDwt9CA==} + engines: {node: '>=14.13'} + + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + + human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + ignore@5.3.1: + resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + engines: {node: '>= 4'} + + import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + inline-style-parser@0.1.1: + resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} + + inline-style-parser@0.2.3: + resolution: {integrity: sha512-qlD8YNDqyTKTyuITrDOffsl6Tdhv+UC4hcdAVuQsK4IMQ99nSgd1MIA/Q+jQYoh9r3hVUXhYh7urSRmXPkW04g==} + + internal-slot@1.0.7: + resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} + engines: {node: '>= 0.4'} + + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + + is-absolute-url@4.0.1: + resolution: {integrity: sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + is-alphabetical@2.0.1: + resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} + + is-alphanumerical@2.0.1: + resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + + is-arguments@1.1.1: + resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} + engines: {node: '>= 0.4'} + + is-array-buffer@3.0.4: + resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} + engines: {node: '>= 0.4'} + + is-arrayish@0.3.2: + resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + + is-async-function@2.0.0: + resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} + engines: {node: '>= 0.4'} + + is-bigint@1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-boolean-object@1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-core-module@2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + + is-data-view@1.0.1: + resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} + engines: {node: '>= 0.4'} + + is-date-object@1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} + + is-decimal@2.0.1: + resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-finalizationregistry@1.0.2: + resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-generator-function@1.0.10: + resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + engines: {node: '>= 0.4'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-hexadecimal@2.0.1: + resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + + is-interactive@1.0.0: + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} + engines: {node: '>=8'} + + is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} + + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + + is-number-object@1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + engines: {node: '>= 0.4'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-obj@1.0.1: + resolution: {integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==} + engines: {node: '>=0.10.0'} + + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + + is-plain-object@2.0.4: + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} + engines: {node: '>=0.10.0'} + + is-reference@3.0.2: + resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==} + + is-regex@1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} + + is-regexp@1.0.0: + resolution: {integrity: sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==} + engines: {node: '>=0.10.0'} + + is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} + + is-shared-array-buffer@1.0.3: + resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} + engines: {node: '>= 0.4'} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + is-string@1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} + + is-symbol@1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} + + is-typed-array@1.1.13: + resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} + engines: {node: '>= 0.4'} + + is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + + is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} + + is-weakref@1.0.2: + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + + is-weakset@2.0.3: + resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} + engines: {node: '>= 0.4'} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isobject@3.0.1: + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} + engines: {node: '>=0.10.0'} + + isomorphic.js@0.2.5: + resolution: {integrity: sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw==} + + iterator.prototype@1.1.2: + resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} + + jackspeak@2.3.6: + resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} + engines: {node: '>=14'} + + jackspeak@3.1.2: + resolution: {integrity: sha512-kWmLKn2tRtfYMF/BakihVVRzBKOxz4gJMiL2Rj91WnAB5TPZumSH99R/Yf1qE1u4uRimvCSJfm6hnxohXeEXjQ==} + engines: {node: '>=14'} + + jest-worker@27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} + + jiti@1.21.0: + resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} + hasBin: true + + js-cookie@3.0.5: + resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} + engines: {node: '>=14'} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jscodeshift@0.15.2: + resolution: {integrity: sha512-FquR7Okgmc4Sd0aEDwqho3rEiKR3BdvuG9jfdHjLJ6JQoWSMpavug3AoIfnfWhxFlf+5pzQh8qjqz0DWFrNQzA==} + hasBin: true + peerDependencies: + '@babel/preset-env': ^7.1.6 + peerDependenciesMeta: + '@babel/preset-env': + optional: true + + jsesc@0.5.0: + resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} + hasBin: true + + jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + + jsonpointer@5.0.1: + resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} + engines: {node: '>=0.10.0'} + + jsx-ast-utils@3.3.5: + resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} + engines: {node: '>=4.0'} + + just-clone@6.2.0: + resolution: {integrity: sha512-1IynUYEc/HAwxhi3WDpIpxJbZpMCvvrrmZVqvj9EhpvbH8lls7HhdhiByjL7DkAaWlLIzpC0Xc/VPvy/UxLNjA==} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + + language-subtag-registry@0.3.23: + resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} + + language-tags@1.0.9: + resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} + engines: {node: '>=0.10'} + + leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + + leven@4.0.0: + resolution: {integrity: sha512-puehA3YKku3osqPlNuzGDUHq8WpwXupUg1V6NXdV38G+gr+gkBwFC8g1b/+YcIvp8gnqVIus+eJCH/eGsRmJNw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lib0@0.2.94: + resolution: {integrity: sha512-hZ3p54jL4Wpu7IOg26uC7dnEWiMyNlUrb9KoG7+xYs45WkQwpVvKFndVq2+pqLYKe1u8Fp3+zAfZHVvTK34PvQ==} + engines: {node: '>=16'} + hasBin: true + + lilconfig@2.1.0: + resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} + engines: {node: '>=10'} + + lilconfig@3.1.1: + resolution: {integrity: sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==} + engines: {node: '>=14'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + loader-runner@4.3.0: + resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} + engines: {node: '>=6.11.5'} + + loader-utils@2.0.4: + resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} + engines: {node: '>=8.9.0'} + + locate-path@3.0.0: + resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} + engines: {node: '>=6'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.castarray@4.4.0: + resolution: {integrity: sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==} + + lodash.debounce@4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + + lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + + longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + loupe@2.3.7: + resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + + lowlight@3.1.0: + resolution: {integrity: sha512-CEbNVoSikAxwDMDPjXlqlFYiZLkDJHwyGu/MfOsJnF3d7f3tds5J3z8s/l9TMXhzfsJCCJEAsD78842mwmg0PQ==} + + lru-cache@10.2.2: + resolution: {integrity: sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==} + engines: {node: 14 || >=16.14} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + lz-string@1.5.0: + resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} + hasBin: true + + magic-string@0.30.10: + resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==} + + make-dir@2.1.0: + resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} + engines: {node: '>=6'} + + markdown-extensions@2.0.0: + resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==} + engines: {node: '>=16'} + + markdown-table@3.0.3: + resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} + + mdast-util-find-and-replace@3.0.1: + resolution: {integrity: sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==} + + mdast-util-from-markdown@2.0.1: + resolution: {integrity: sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA==} + + mdast-util-gfm-autolink-literal@2.0.0: + resolution: {integrity: sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg==} + + mdast-util-gfm-footnote@2.0.0: + resolution: {integrity: sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==} + + mdast-util-gfm-strikethrough@2.0.0: + resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} + + mdast-util-gfm-table@2.0.0: + resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} + + mdast-util-gfm-task-list-item@2.0.0: + resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} + + mdast-util-gfm@3.0.0: + resolution: {integrity: sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==} + + mdast-util-mdx-expression@2.0.0: + resolution: {integrity: sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw==} + + mdast-util-mdx-jsx@3.1.2: + resolution: {integrity: sha512-eKMQDeywY2wlHc97k5eD8VC+9ASMjN8ItEZQNGwJ6E0XWKiW/Z0V5/H8pvoXUf+y+Mj0VIgeRRbujBmFn4FTyA==} + + mdast-util-mdx@3.0.0: + resolution: {integrity: sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==} + + mdast-util-mdxjs-esm@2.0.1: + resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} + + mdast-util-phrasing@4.1.0: + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + + mdast-util-to-hast@13.1.0: + resolution: {integrity: sha512-/e2l/6+OdGp/FB+ctrJ9Avz71AN/GRH3oi/3KAx/kMnoUsD6q0woXlDT8lLEeViVKE7oZxE7RXzvO3T8kF2/sA==} + + mdast-util-to-markdown@2.1.0: + resolution: {integrity: sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==} + + mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + + mdx-annotations@0.1.4: + resolution: {integrity: sha512-SUYBUXP1qbgr0nRFFnUBg4HxxTbYyl5rE38fLTaIm0naPK+EhmKa0wRlUdgTMlMBj5gdCMwP1n7+L47JIHHWUQ==} + + media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + + memoize-one@4.0.3: + resolution: {integrity: sha512-QmpUu4KqDmX0plH4u+tf0riMc1KHE1+lw95cMrLlXQAFOx/xnBtwhZ52XJxd9X2O6kwKBqX32kmhbhlobD0cuw==} + + merge-descriptors@1.0.1: + resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + + micromark-core-commonmark@2.0.1: + resolution: {integrity: sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==} + + micromark-extension-gfm-autolink-literal@2.0.0: + resolution: {integrity: sha512-rTHfnpt/Q7dEAK1Y5ii0W8bhfJlVJFnJMHIPisfPK3gpVNuOP0VnRl96+YJ3RYWV/P4gFeQoGKNlT3RhuvpqAg==} + + micromark-extension-gfm-footnote@2.0.0: + resolution: {integrity: sha512-6Rzu0CYRKDv3BfLAUnZsSlzx3ak6HAoI85KTiijuKIz5UxZxbUI+pD6oHgw+6UtQuiRwnGRhzMmPRv4smcz0fg==} + + micromark-extension-gfm-strikethrough@2.0.0: + resolution: {integrity: sha512-c3BR1ClMp5fxxmwP6AoOY2fXO9U8uFMKs4ADD66ahLTNcwzSCyRVU4k7LPV5Nxo/VJiR4TdzxRQY2v3qIUceCw==} + + micromark-extension-gfm-table@2.0.0: + resolution: {integrity: sha512-PoHlhypg1ItIucOaHmKE8fbin3vTLpDOUg8KAr8gRCF1MOZI9Nquq2i/44wFvviM4WuxJzc3demT8Y3dkfvYrw==} + + micromark-extension-gfm-tagfilter@2.0.0: + resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} + + micromark-extension-gfm-task-list-item@2.0.1: + resolution: {integrity: sha512-cY5PzGcnULaN5O7T+cOzfMoHjBW7j+T9D2sucA5d/KbsBTPcYdebm9zUd9zzdgJGCwahV+/W78Z3nbulBYVbTw==} + + micromark-extension-gfm@3.0.0: + resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} + + micromark-extension-mdx-expression@3.0.0: + resolution: {integrity: sha512-sI0nwhUDz97xyzqJAbHQhp5TfaxEvZZZ2JDqUo+7NvyIYG6BZ5CPPqj2ogUoPJlmXHBnyZUzISg9+oUmU6tUjQ==} + + micromark-extension-mdx-jsx@3.0.0: + resolution: {integrity: sha512-uvhhss8OGuzR4/N17L1JwvmJIpPhAd8oByMawEKx6NVdBCbesjH4t+vjEp3ZXft9DwvlKSD07fCeI44/N0Vf2w==} + + micromark-extension-mdx-md@2.0.0: + resolution: {integrity: sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==} + + micromark-extension-mdxjs-esm@3.0.0: + resolution: {integrity: sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==} + + micromark-extension-mdxjs@3.0.0: + resolution: {integrity: sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==} + + micromark-factory-destination@2.0.0: + resolution: {integrity: sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==} + + micromark-factory-label@2.0.0: + resolution: {integrity: sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==} + + micromark-factory-mdx-expression@2.0.1: + resolution: {integrity: sha512-F0ccWIUHRLRrYp5TC9ZYXmZo+p2AM13ggbsW4T0b5CRKP8KHVRB8t4pwtBgTxtjRmwrK0Irwm7vs2JOZabHZfg==} + + micromark-factory-space@2.0.0: + resolution: {integrity: sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==} + + micromark-factory-title@2.0.0: + resolution: {integrity: sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==} + + micromark-factory-whitespace@2.0.0: + resolution: {integrity: sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==} + + micromark-util-character@2.1.0: + resolution: {integrity: sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==} + + micromark-util-chunked@2.0.0: + resolution: {integrity: sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==} + + micromark-util-classify-character@2.0.0: + resolution: {integrity: sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==} + + micromark-util-combine-extensions@2.0.0: + resolution: {integrity: sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==} + + micromark-util-decode-numeric-character-reference@2.0.1: + resolution: {integrity: sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==} + + micromark-util-decode-string@2.0.0: + resolution: {integrity: sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==} + + micromark-util-encode@2.0.0: + resolution: {integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==} + + micromark-util-events-to-acorn@2.0.2: + resolution: {integrity: sha512-Fk+xmBrOv9QZnEDguL9OI9/NQQp6Hz4FuQ4YmCb/5V7+9eAh1s6AYSvL20kHkD67YIg7EpE54TiSlcsf3vyZgA==} + + micromark-util-html-tag-name@2.0.0: + resolution: {integrity: sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==} + + micromark-util-normalize-identifier@2.0.0: + resolution: {integrity: sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==} + + micromark-util-resolve-all@2.0.0: + resolution: {integrity: sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==} + + micromark-util-sanitize-uri@2.0.0: + resolution: {integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==} + + micromark-util-subtokenize@2.0.1: + resolution: {integrity: sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==} + + micromark-util-symbol@2.0.0: + resolution: {integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==} + + micromark-util-types@2.0.0: + resolution: {integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==} + + micromark@4.0.0: + resolution: {integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==} + + micromatch@4.0.7: + resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + + min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@9.0.3: + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} + + minimatch@9.0.4: + resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + + minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + + mlly@1.7.1: + resolution: {integrity: sha512-rrVRZRELyQzrIUAVMHxP97kv+G786pHmOKzuFII8zDYahFBS7qnHh2AlYSl1GAHhaMPCz6/oHjVMcfFYgFYHgA==} + + ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + multipasta@0.2.2: + resolution: {integrity: sha512-KKGdmXIJUmt9BV45LsbUdMnju8eCNSyF9KpbyqK2E3wQXjpPQOg52/Hc+nsmBacmEkNxLVT5h1y3ZgEXB4prXg==} + + mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + + nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + nanoid@5.0.7: + resolution: {integrity: sha512-oLxFY2gd2IqnjcYyOXD8XGCftpGtZP2AbHbOkthDkvRywH5ayNtPVy9YlOPcHckXzbLTCHpkb7FB+yuxKV13pQ==} + engines: {node: ^18 || >=20} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + next-themes@0.2.1: + resolution: {integrity: sha512-B+AKNfYNIzh0vqQQKqQItTS8evEouKD7H5Hj3kmuPERwddR2TxvDSFZuTj6T7Jfn1oyeUyJMydPl1Bkxkh0W7A==} + peerDependencies: + next: '*' + react: '*' + react-dom: '*' + + next-view-transitions@0.3.0: + resolution: {integrity: sha512-EfMG4sQR48Q40apCl0rWqTvpDNk4TcdlFjcsGd2ZOBJMNlwfuB8lnwhOL5A0kKWnZwXlMgDPFXY7qwoOY+NhtQ==} + peerDependencies: + next: ^14.0.0 + react: ^18.2.0 + react-dom: ^18.2.0 + + next@14.2.3: + resolution: {integrity: sha512-dowFkFTR8v79NPJO4QsBUtxv0g9BrS/phluVpMAt2ku7H+cbcBJlopXjkWlwxrk/xGqMemr7JkGPGemPrLLX7A==} + engines: {node: '>=18.17.0'} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.1.0 + '@playwright/test': ^1.41.2 + react: ^18.2.0 + react-dom: ^18.2.0 + sass: ^1.3.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + '@playwright/test': + optional: true + sass: + optional: true + + node-dir@0.1.17: + resolution: {integrity: sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==} + engines: {node: '>= 0.10.5'} + + node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + + node-fetch-native@1.6.4: + resolution: {integrity: sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ==} + + node-releases@2.0.14: + resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + + npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + npm-to-yarn@2.2.1: + resolution: {integrity: sha512-O/j/ROyX0KGLG7O6Ieut/seQ0oiTpHF2tXAcFbpdTLQFiaNtkyTXXocM1fwpaa60dg1qpWj0nHlbNhx6qwuENQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + nypm@0.3.9: + resolution: {integrity: sha512-BI2SdqqTHg2d4wJh8P9A1W+bslg33vOE9IZDY6eR2QC+Pu1iNBVZUqczrd43rJb+fMzHU7ltAYKsEFY/kHMFcw==} + engines: {node: ^14.16.0 || >=16.10.0} + hasBin: true + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + + object-inspect@1.13.1: + resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object.assign@4.1.5: + resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} + engines: {node: '>= 0.4'} + + object.entries@1.1.8: + resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==} + engines: {node: '>= 0.4'} + + object.fromentries@2.0.8: + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} + engines: {node: '>= 0.4'} + + object.groupby@1.0.3: + resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} + engines: {node: '>= 0.4'} + + object.hasown@1.1.4: + resolution: {integrity: sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==} + engines: {node: '>= 0.4'} + + object.values@1.2.0: + resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} + engines: {node: '>= 0.4'} + + ohash@1.1.3: + resolution: {integrity: sha512-zuHHiGTYTA1sYJ/wZN+t5HKZaH23i4yI1HMwbuXm24Nid7Dv0KcuRlKoNKS9UNfAVSBlnGLcuQrnOKWOZoEGaw==} + + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + ora@5.4.1: + resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} + engines: {node: '>=10'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@3.0.0: + resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} + engines: {node: '>=6'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-entities@4.0.1: + resolution: {integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==} + + parse-ms@3.0.0: + resolution: {integrity: sha512-Tpb8Z7r7XbbtBTrM9UhpkzzaMrqA2VXMT3YChzYltwV3P3pM6t8wl7TvpMnSTosz1aQAdVib7kdoys7vYOPerw==} + engines: {node: '>=12'} + + parse5@7.1.2: + resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + + path-exists@3.0.0: + resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} + engines: {node: '>=4'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + path-to-regexp@0.1.7: + resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + path-type@5.0.0: + resolution: {integrity: sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==} + engines: {node: '>=12'} + + pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + + pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + + periscopic@3.1.0: + resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} + + picocolors@1.0.1: + resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + + pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + + pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + + pkg-dir@3.0.0: + resolution: {integrity: sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==} + engines: {node: '>=6'} + + pkg-types@1.1.3: + resolution: {integrity: sha512-+JrgthZG6m3ckicaOB74TwQ+tBWsFl3qVQg7mN8ulwSOElJ7gBhKzj2VkCPnZ4NlF6kEquYU+RIYNVAvzd54UA==} + + possible-typed-array-names@1.0.0: + resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} + engines: {node: '>= 0.4'} + + postcss-import@15.1.0: + resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} + engines: {node: '>=14.0.0'} + peerDependencies: + postcss: ^8.0.0 + + postcss-js@4.0.1: + resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.4.21 + + postcss-load-config@4.0.2: + resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} + engines: {node: '>= 14'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + + postcss-nested@6.0.1: + resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + + postcss-selector-parser@6.0.10: + resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} + engines: {node: '>=4'} + + postcss-selector-parser@6.1.0: + resolution: {integrity: sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ==} + engines: {node: '>=4'} + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss@8.4.31: + resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} + engines: {node: ^10 || ^12 || >=14} + + postcss@8.4.38: + resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} + engines: {node: ^10 || ^12 || >=14} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier-plugin-tailwindcss@0.5.14: + resolution: {integrity: sha512-Puaz+wPUAhFp8Lo9HuciYKM2Y2XExESjeT+9NQoVFXZsPPnc9VYss2SpxdQ6vbatmt8/4+SN0oe0I1cPDABg9Q==} + engines: {node: '>=14.21.3'} + peerDependencies: + '@ianvs/prettier-plugin-sort-imports': '*' + '@prettier/plugin-pug': '*' + '@shopify/prettier-plugin-liquid': '*' + '@trivago/prettier-plugin-sort-imports': '*' + '@zackad/prettier-plugin-twig-melody': '*' + prettier: ^3.0 + prettier-plugin-astro: '*' + prettier-plugin-css-order: '*' + prettier-plugin-import-sort: '*' + prettier-plugin-jsdoc: '*' + prettier-plugin-marko: '*' + prettier-plugin-organize-attributes: '*' + prettier-plugin-organize-imports: '*' + prettier-plugin-sort-imports: '*' + prettier-plugin-style-order: '*' + prettier-plugin-svelte: '*' + peerDependenciesMeta: + '@ianvs/prettier-plugin-sort-imports': + optional: true + '@prettier/plugin-pug': + optional: true + '@shopify/prettier-plugin-liquid': + optional: true + '@trivago/prettier-plugin-sort-imports': + optional: true + '@zackad/prettier-plugin-twig-melody': + optional: true + prettier-plugin-astro: + optional: true + prettier-plugin-css-order: + optional: true + prettier-plugin-import-sort: + optional: true + prettier-plugin-jsdoc: + optional: true + prettier-plugin-marko: + optional: true + prettier-plugin-organize-attributes: + optional: true + prettier-plugin-organize-imports: + optional: true + prettier-plugin-sort-imports: + optional: true + prettier-plugin-style-order: + optional: true + prettier-plugin-svelte: + optional: true + + prettier@3.2.5: + resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==} + engines: {node: '>=14'} + hasBin: true + + pretty-bytes@6.1.1: + resolution: {integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==} + engines: {node: ^14.13.1 || >=16.0.0} + + pretty-format@27.5.1: + resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + + pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + pretty-ms@8.0.0: + resolution: {integrity: sha512-ASJqOugUF1bbzI35STMBUpZqdfYKlJugy6JBziGi2EE+AL5JPJGSzvpeVXojxrr0ViUYoToUjb5kjSEGf7Y83Q==} + engines: {node: '>=14.16'} + + process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + + prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + + prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + + property-information@6.5.0: + resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} + + proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + pure-rand@6.1.0: + resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} + + qs@6.11.0: + resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} + engines: {node: '>=0.6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + radix-vue@1.9.0: + resolution: {integrity: sha512-Ds1GpB6IBhSyFePWyxDhnqA7Ymgmcxah3t5qWxamftqX/zFRkkf5RaRxzuGB8QgdbP6Q/t7scIdMEcndhFc+Tg==} + peerDependencies: + vue: '>= 3.2.0' + + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + + range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + + raw-body@2.5.2: + resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} + engines: {node: '>= 0.8'} + + react-dom@18.3.1: + resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} + peerDependencies: + react: ^18.3.1 + + react-highlight-words@0.20.0: + resolution: {integrity: sha512-asCxy+jCehDVhusNmCBoxDf2mm1AJ//D+EzDx1m5K7EqsMBIHdZ5G4LdwbSEXqZq1Ros0G0UySWmAtntSph7XA==} + peerDependencies: + react: ^0.14.0 || ^15.0.0 || ^16.0.0-0 || ^17.0.0-0 || ^18.0.0-0 + + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + react-is@17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + + react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + + react@18.3.1: + resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} + engines: {node: '>=0.10.0'} + + read-cache@1.0.0: + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + recast@0.23.9: + resolution: {integrity: sha512-Hx/BGIbwj+Des3+xy5uAtAbdCyqK9y9wbBcDFDYanLS9JnMqf7OeF87HQwUimE87OEc72mr6tkKUKMBBL+hF9Q==} + engines: {node: '>= 4'} + + recma-import-images@0.0.3: + resolution: {integrity: sha512-XoPDnUP8XVH13UrSfvdawq3gcZYoOVRoW2CtYHMR68hRejCAhLmgjjgPY/Xf1Ftkjj5ASD8wx9eVNjYTW2yWbw==} + + redent@3.0.0: + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} + engines: {node: '>=8'} + + reflect.getprototypeof@1.0.6: + resolution: {integrity: sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==} + engines: {node: '>= 0.4'} + + regenerate-unicode-properties@10.1.1: + resolution: {integrity: sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==} + engines: {node: '>=4'} + + regenerate@1.4.2: + resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} + + regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + + regenerator-transform@0.15.2: + resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} + + regexp.prototype.flags@1.5.2: + resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} + engines: {node: '>= 0.4'} + + regexpu-core@5.3.2: + resolution: {integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==} + engines: {node: '>=4'} + + regjsparser@0.9.1: + resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==} + hasBin: true + + rehype-external-links@3.0.0: + resolution: {integrity: sha512-yp+e5N9V3C6bwBeAC4n796kc86M4gJCdlVhiMTxIrJG5UHDMh+PJANf9heqORJbt1nrCbDwIlAZKjANIaVBbvw==} + + rehype-format@5.0.0: + resolution: {integrity: sha512-kM4II8krCHmUhxrlvzFSptvaWh280Fr7UGNJU5DCMuvmAwGCNmGfi9CvFAQK6JDjsNoRMWQStglK3zKJH685Wg==} + + rehype-minify-whitespace@6.0.0: + resolution: {integrity: sha512-i9It4YHR0Sf3GsnlR5jFUKXRr9oayvEk9GKQUkwZv6hs70OH9q3OCZrq9PpLvIGKt3W+JxBOxCidNVpH/6rWdA==} + + rehype-parse@9.0.0: + resolution: {integrity: sha512-WG7nfvmWWkCR++KEkZevZb/uw41E8TsH4DsY9UxsTbIXCVGbAs4S+r8FrQ+OtH5EEQAs+5UxKC42VinkmpA1Yw==} + + rehype-raw@7.0.0: + resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} + + rehype-sanitize@6.0.0: + resolution: {integrity: sha512-CsnhKNsyI8Tub6L4sm5ZFsme4puGfc6pYylvXo1AeqaGbjOYyzNv3qZPwvs0oMJ39eryyeOdmxwUIo94IpEhqg==} + + rehype-stringify@10.0.0: + resolution: {integrity: sha512-1TX1i048LooI9QoecrXy7nGFFbFSufxVRAfc6Y9YMRAi56l+oB0zP51mLSV312uRuvVLPV1opSlJmslozR1XHQ==} + + remark-gfm@4.0.0: + resolution: {integrity: sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==} + + remark-mdx@3.0.1: + resolution: {integrity: sha512-3Pz3yPQ5Rht2pM5R+0J2MrGoBSrzf+tJG94N+t/ilfdh8YLyyKYtidAYwTveB20BoHAcwIopOUqhcmh2F7hGYA==} + + remark-parse@11.0.0: + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + + remark-rehype@11.1.0: + resolution: {integrity: sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g==} + + remark-stringify@11.0.0: + resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + + remark-unwrap-images@4.0.0: + resolution: {integrity: sha512-Ilr5ZhrhZSvnjemy1rRuxlTC0I/39YyWDRiE9d5vF079APcwdYYzwcZL8RGehlCtQCiik8hWMyo4Xhz2Fq0JhA==} + + remark@15.0.1: + resolution: {integrity: sha512-Eht5w30ruCXgFmxVUSlNWQ9iiimq07URKeFS3hNc8cUWy1llX4KDWfyEDZRycMc+znsN9Ux5/tJ/BFdgdOwA3A==} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + + resolve@2.0.0-next.5: + resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} + hasBin: true + + restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rimraf@2.6.3: + resolution: {integrity: sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + safe-array-concat@1.1.2: + resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} + engines: {node: '>=0.4'} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-regex-test@1.0.3: + resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} + engines: {node: '>= 0.4'} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + scheduler@0.23.2: + resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + + schema-utils@3.3.0: + resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} + engines: {node: '>= 10.13.0'} + + search-insights@2.14.0: + resolution: {integrity: sha512-OLN6MsPMCghDOqlCtsIsYgtsC0pnwVTyT9Mu6A3ewOj1DxvzZF6COrn2g86E/c05xbktB0XN04m/t1Z+n+fTGw==} + + semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.6.2: + resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==} + engines: {node: '>=10'} + hasBin: true + + send@0.18.0: + resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} + engines: {node: '>= 0.8.0'} + + serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + + serve-static@1.15.0: + resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} + engines: {node: '>= 0.8.0'} + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + shallow-clone@3.0.1: + resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} + engines: {node: '>=8'} + + sharp@0.33.1: + resolution: {integrity: sha512-iAYUnOdTqqZDb3QjMneBKINTllCJDZ3em6WaWy7NPECM4aHncvqHRm0v0bN9nqJxMiwamv5KIdauJ6lUzKDpTQ==} + engines: {libvips: '>=8.15.0', node: ^18.17.0 || ^20.3.0 || >=21.0.0} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + shiki@1.10.3: + resolution: {integrity: sha512-eneCLncGuvPdTutJuLyUGS8QNPAVFO5Trvld2wgEq1e002mwctAhJKeMGWtWVXOIEzmlcLRqcgPSorR6AVzOmQ==} + + shiki@1.6.2: + resolution: {integrity: sha512-X3hSm5GzzBd/BmPmGfkueOUADLyBoZo1ojYQXhd+NU2VJn458yt4duaS0rVzC+WtqftSV7mTVvDw+OB9AHi3Eg==} + + side-channel@1.0.6: + resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + engines: {node: '>= 0.4'} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + simple-functional-loader@1.2.1: + resolution: {integrity: sha512-GPDrxrQkE7ijm35QlfPFVp5hBHR6ZcaUq42TEDgf1U5iTL3IDLFvKAbHE/ODqpdfJJ7Xn4cr/slBn12jjNPkaQ==} + + simple-swizzle@0.2.2: + resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + slash@5.1.0: + resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} + engines: {node: '>=14.16'} + + source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + engines: {node: '>=0.10.0'} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + source-map@0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} + + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + + statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + + storybook@8.2.0: + resolution: {integrity: sha512-oW918bYpxDJnklYpxv+7mA6OUBnkGCFt7M65A7Fs44fWN5SKTmwxYjSfwgexsoKxiMa5j7pmGm+nP3L9uNFR0w==} + hasBin: true + + streamsearch@1.1.0: + resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} + engines: {node: '>=10.0.0'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string.prototype.matchall@4.0.11: + resolution: {integrity: sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==} + engines: {node: '>= 0.4'} + + string.prototype.trim@1.2.9: + resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.8: + resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} + + string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + + stringify-object@3.3.0: + resolution: {integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==} + engines: {node: '>=4'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + + strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + style-mod@4.1.2: + resolution: {integrity: sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw==} + + style-to-object@0.4.4: + resolution: {integrity: sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==} + + style-to-object@1.0.6: + resolution: {integrity: sha512-khxq+Qm3xEyZfKd/y9L3oIWQimxuc4STrQKtQn8aSDRHb8mFgpukgX1hdzfrMEW6JCjyJ8p89x+IUMVnCBI1PA==} + + styled-jsx@5.1.1: + resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@babel/core': '*' + babel-plugin-macros: '*' + react: '>= 16.8.0 || 17.x.x || ^18.0.0-0' + peerDependenciesMeta: + '@babel/core': + optional: true + babel-plugin-macros: + optional: true + + sucrase@3.35.0: + resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + tabbable@6.2.0: + resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} + + tailwind-merge@2.3.0: + resolution: {integrity: sha512-vkYrLpIP+lgR0tQCG6AP7zZXCTLc1Lnv/CCRT3BqJ9CZ3ui2++GPaGb1x/ILsINIMSYqqvrpqjUFsMNLlW99EA==} + + tailwindcss@3.4.3: + resolution: {integrity: sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==} + engines: {node: '>=14.0.0'} + hasBin: true + + tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + + tar@6.2.1: + resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} + engines: {node: '>=10'} + + temp-dir@3.0.0: + resolution: {integrity: sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==} + engines: {node: '>=14.16'} + + temp@0.8.4: + resolution: {integrity: sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg==} + engines: {node: '>=6.0.0'} + + tempy@3.1.0: + resolution: {integrity: sha512-7jDLIdD2Zp0bDe5r3D2qtkd1QOCacylBuL7oa4udvN6v2pqr4+LcCr67C8DR1zkpaZ8XosF5m1yQSabKAW6f2g==} + engines: {node: '>=14.16'} + + terser-webpack-plugin@5.3.10: + resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + + terser@5.31.0: + resolution: {integrity: sha512-Q1JFAoUKE5IMfI4Z/lkE/E6+SwgzO+x4tq4v1AyBLRj8VSYvRO6A/rQrPg1yud4g0En9EKI1TvFRF2tQFcoUkg==} + engines: {node: '>=10'} + hasBin: true + + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + + tiny-invariant@1.3.3: + resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + + tinyspy@2.2.1: + resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} + engines: {node: '>=14.0.0'} + + tippy.js@6.3.7: + resolution: {integrity: sha512-E1d3oP2emgJ9dRQZdf3Kkn0qJgI6ZLpyS5z6ZkY1DF3kaQaBsGZsndEpHwx+eC+tYM41HaSNvNtLx8tU57FzTQ==} + + to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + + trough@2.2.0: + resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + + ts-api-utils@1.3.0: + resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} + engines: {node: '>=16'} + peerDependencies: + typescript: '>=4.2.0' + + ts-dedent@2.2.0: + resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} + engines: {node: '>=6.10'} + + ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + + tsconfig-paths@3.15.0: + resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + + tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + + tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + type-fest@1.4.0: + resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} + engines: {node: '>=10'} + + type-fest@2.19.0: + resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} + engines: {node: '>=12.20'} + + type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + + typed-array-buffer@1.0.2: + resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.1: + resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.2: + resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} + engines: {node: '>= 0.4'} + + typed-array-length@1.0.6: + resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} + engines: {node: '>= 0.4'} + + typescript@5.4.5: + resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} + engines: {node: '>=14.17'} + hasBin: true + + ufo@1.5.3: + resolution: {integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==} + + unbox-primitive@1.0.2: + resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + + undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + unhead@1.9.15: + resolution: {integrity: sha512-/99Wft1CT0fxsWzmBeOwuH/k4HdMeyfDGyB4wFNVZVNTffRHDOqaqQ6RS+LHPsIiCKmm9FP7Vq7Rz09Zs/fQJQ==} + + unicode-canonical-property-names-ecmascript@2.0.0: + resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} + engines: {node: '>=4'} + + unicode-match-property-ecmascript@2.0.0: + resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} + engines: {node: '>=4'} + + unicode-match-property-value-ecmascript@2.1.0: + resolution: {integrity: sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==} + engines: {node: '>=4'} + + unicode-property-aliases-ecmascript@2.1.0: + resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} + engines: {node: '>=4'} + + unicorn-magic@0.1.0: + resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} + engines: {node: '>=18'} + + unified@11.0.4: + resolution: {integrity: sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==} + + unique-string@3.0.0: + resolution: {integrity: sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==} + engines: {node: '>=12'} + + unist-util-filter@5.0.1: + resolution: {integrity: sha512-pHx7D4Zt6+TsfwylH9+lYhBhzyhEnCXs/lbq/Hstxno5z4gVdyc2WEW0asfjGKPyG4pEKrnBv5hdkO6+aRnQJw==} + + unist-util-find-after@5.0.0: + resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==} + + unist-util-is@5.2.1: + resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==} + + unist-util-is@6.0.0: + resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + + unist-util-position-from-estree@2.0.0: + resolution: {integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==} + + unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + + unist-util-remove-position@5.0.0: + resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} + + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + + unist-util-visit-parents@5.1.3: + resolution: {integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==} + + unist-util-visit-parents@6.0.1: + resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + + unist-util-visit@4.1.2: + resolution: {integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==} + + unist-util-visit@5.0.0: + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + update-browserslist-db@1.0.16: + resolution: {integrity: sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uploadthing@6.13.3-canary.7cbef70: + resolution: {integrity: sha512-3dCzjz0anpyMxewzJ1f+mik+ZVgZkzHrVhFQk+QA3ZQkR68RNRrRMAgzBse/EfetlAPf0t3nZ/ZRgh98+fHXgA==} + engines: {node: '>=18.13.0'} + peerDependencies: + express: '*' + fastify: '*' + h3: '*' + next: '*' + tailwindcss: '*' + peerDependenciesMeta: + express: + optional: true + fastify: + optional: true + h3: + optional: true + next: + optional: true + tailwindcss: + optional: true + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + use-sync-external-store@1.2.0: + resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + util@0.12.5: + resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} + + utils-merge@1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + vfile-location@5.0.2: + resolution: {integrity: sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==} + + vfile-message@4.0.2: + resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} + + vfile@6.0.1: + resolution: {integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==} + + vue-demi@0.14.8: + resolution: {integrity: sha512-Uuqnk9YE9SsWeReYqK2alDI5YzciATE0r2SkA6iMAtuXvNTMNACJLJEXNXaEy94ECuBe4Sk6RzRU80kjdbIo1Q==} + engines: {node: '>=12'} + hasBin: true + peerDependencies: + '@vue/composition-api': ^1.0.0-rc.1 + vue: ^3.0.0-0 || ^2.6.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + + vue-router@4.4.0: + resolution: {integrity: sha512-HB+t2p611aIZraV2aPSRNXf0Z/oLZFrlygJm+sZbdJaW6lcFqEDQwnzUBXn+DApw+/QzDU/I9TeWx9izEjTmsA==} + peerDependencies: + vue: ^3.2.0 + + vue-sonner@1.1.3: + resolution: {integrity: sha512-6I+5GNobKvE2nR5MPhO+T59d4j2LXRQoc/ZCmGtCoBWKDQr5nzSqjFaOOdPysHFI2p42wNLhQMafd0N540UW9Q==} + + vue@3.4.31: + resolution: {integrity: sha512-njqRrOy7W3YLAlVqSKpBebtZpDVg21FPoaq1I7f/+qqBThK9ChAIjkRWgeP6Eat+8C+iia4P3OYqpATP21BCoQ==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + w3c-keyname@2.2.8: + resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==} + + walk-up-path@3.0.1: + resolution: {integrity: sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA==} + + watchpack@2.4.1: + resolution: {integrity: sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==} + engines: {node: '>=10.13.0'} + + wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + + web-namespaces@2.0.1: + resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} + + web-streams-polyfill@4.0.0-beta.3: + resolution: {integrity: sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==} + engines: {node: '>= 14'} + + webpack-sources@3.2.3: + resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} + engines: {node: '>=10.13.0'} + + webpack@5.91.0: + resolution: {integrity: sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + + which-boxed-primitive@1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + + which-builtin-type@1.1.3: + resolution: {integrity: sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==} + engines: {node: '>= 0.4'} + + which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} + + which-typed-array@1.1.15: + resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} + engines: {node: '>= 0.4'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + write-file-atomic@2.4.3: + resolution: {integrity: sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==} + + ws@8.18.0: + resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} + 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 + + y-codemirror.next@0.3.5: + resolution: {integrity: sha512-VluNu3e5HfEXybnypnsGwKAj+fKLd4iAnR7JuX1Sfyydmn1jCBS5wwEL/uS04Ch2ib0DnMAOF6ZRR/8kK3wyGw==} + peerDependencies: + '@codemirror/state': ^6.0.0 + '@codemirror/view': ^6.0.0 + yjs: ^13.5.6 + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yaml@2.4.2: + resolution: {integrity: sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA==} + engines: {node: '>= 14'} + hasBin: true + + yaml@2.4.5: + resolution: {integrity: sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg==} + engines: {node: '>= 14'} + hasBin: true + + yjs@13.6.18: + resolution: {integrity: sha512-GBTjO4QCmv2HFKFkYIJl7U77hIB1o22vSCSQD1Ge8ZxWbIbn8AltI4gyXbtL+g5/GJep67HCMq3Y5AmNwDSyEg==} + engines: {node: '>=16.0.0', npm: '>=8.0.0'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + zhead@2.2.4: + resolution: {integrity: sha512-8F0OI5dpWIA5IGG5NHUg9staDwz/ZPxZtvGVf01j7vHqSyZ0raHY+78atOVxRqb73AotX22uV1pXt3gYSstGag==} + + zod@3.23.8: + resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} + + zustand@4.5.2: + resolution: {integrity: sha512-2cN1tPkDVkwCy5ickKrI7vijSjPksFRfqS6237NzT0vqSsztTNnQdHw9mmN7uBdk3gceVXU0a+21jFzFzAc9+g==} + engines: {node: '>=12.7.0'} + peerDependencies: + '@types/react': '>=16.8' + immer: '>=9.0.6' + react: '>=16.8' + peerDependenciesMeta: + '@types/react': + optional: true + immer: + optional: true + react: + optional: true + + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + +snapshots: + + '@adobe/css-tools@4.4.0': {} + + '@algolia/autocomplete-core@1.17.2(@algolia/client-search@4.23.3)(algoliasearch@4.23.3)(search-insights@2.14.0)': + dependencies: + '@algolia/autocomplete-plugin-algolia-insights': 1.17.2(@algolia/client-search@4.23.3)(algoliasearch@4.23.3)(search-insights@2.14.0) + '@algolia/autocomplete-shared': 1.17.2(@algolia/client-search@4.23.3)(algoliasearch@4.23.3) + transitivePeerDependencies: + - '@algolia/client-search' + - algoliasearch + - search-insights + + '@algolia/autocomplete-plugin-algolia-insights@1.17.2(@algolia/client-search@4.23.3)(algoliasearch@4.23.3)(search-insights@2.14.0)': + dependencies: + '@algolia/autocomplete-shared': 1.17.2(@algolia/client-search@4.23.3)(algoliasearch@4.23.3) + search-insights: 2.14.0 + transitivePeerDependencies: + - '@algolia/client-search' + - algoliasearch + + '@algolia/autocomplete-shared@1.17.2(@algolia/client-search@4.23.3)(algoliasearch@4.23.3)': + dependencies: + '@algolia/client-search': 4.23.3 + algoliasearch: 4.23.3 + + '@algolia/cache-browser-local-storage@4.23.3': + dependencies: + '@algolia/cache-common': 4.23.3 + + '@algolia/cache-common@4.23.3': {} + + '@algolia/cache-in-memory@4.23.3': + dependencies: + '@algolia/cache-common': 4.23.3 + + '@algolia/client-account@4.23.3': + dependencies: + '@algolia/client-common': 4.23.3 + '@algolia/client-search': 4.23.3 + '@algolia/transporter': 4.23.3 + + '@algolia/client-analytics@4.23.3': + dependencies: + '@algolia/client-common': 4.23.3 + '@algolia/client-search': 4.23.3 + '@algolia/requester-common': 4.23.3 + '@algolia/transporter': 4.23.3 + + '@algolia/client-common@4.23.3': + dependencies: + '@algolia/requester-common': 4.23.3 + '@algolia/transporter': 4.23.3 + + '@algolia/client-personalization@4.23.3': + dependencies: + '@algolia/client-common': 4.23.3 + '@algolia/requester-common': 4.23.3 + '@algolia/transporter': 4.23.3 + + '@algolia/client-search@4.23.3': + dependencies: + '@algolia/client-common': 4.23.3 + '@algolia/requester-common': 4.23.3 + '@algolia/transporter': 4.23.3 + + '@algolia/logger-common@4.23.3': {} + + '@algolia/logger-console@4.23.3': + dependencies: + '@algolia/logger-common': 4.23.3 + + '@algolia/recommend@4.23.3': + dependencies: + '@algolia/cache-browser-local-storage': 4.23.3 + '@algolia/cache-common': 4.23.3 + '@algolia/cache-in-memory': 4.23.3 + '@algolia/client-common': 4.23.3 + '@algolia/client-search': 4.23.3 + '@algolia/logger-common': 4.23.3 + '@algolia/logger-console': 4.23.3 + '@algolia/requester-browser-xhr': 4.23.3 + '@algolia/requester-common': 4.23.3 + '@algolia/requester-node-http': 4.23.3 + '@algolia/transporter': 4.23.3 + + '@algolia/requester-browser-xhr@4.23.3': + dependencies: + '@algolia/requester-common': 4.23.3 + + '@algolia/requester-common@4.23.3': {} + + '@algolia/requester-node-http@4.23.3': + dependencies: + '@algolia/requester-common': 4.23.3 + + '@algolia/transporter@4.23.3': + dependencies: + '@algolia/cache-common': 4.23.3 + '@algolia/logger-common': 4.23.3 + '@algolia/requester-common': 4.23.3 + + '@alloc/quick-lru@5.2.0': {} + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + + '@babel/code-frame@7.24.7': + dependencies: + '@babel/highlight': 7.24.7 + picocolors: 1.0.1 + + '@babel/compat-data@7.24.7': {} + + '@babel/core@7.24.7': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.24.7 + '@babel/generator': 7.24.7 + '@babel/helper-compilation-targets': 7.24.7 + '@babel/helper-module-transforms': 7.24.7(@babel/core@7.24.7) + '@babel/helpers': 7.24.7 + '@babel/parser': 7.24.7 + '@babel/template': 7.24.7 + '@babel/traverse': 7.24.7 + '@babel/types': 7.24.7 + convert-source-map: 2.0.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.24.7': + dependencies: + '@babel/types': 7.24.7 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 2.5.2 + + '@babel/helper-annotate-as-pure@7.24.7': + dependencies: + '@babel/types': 7.24.7 + + '@babel/helper-builder-binary-assignment-operator-visitor@7.24.7': + dependencies: + '@babel/traverse': 7.24.7 + '@babel/types': 7.24.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-compilation-targets@7.24.7': + dependencies: + '@babel/compat-data': 7.24.7 + '@babel/helper-validator-option': 7.24.7 + browserslist: 4.23.0 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-create-class-features-plugin@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-annotate-as-pure': 7.24.7 + '@babel/helper-environment-visitor': 7.24.7 + '@babel/helper-function-name': 7.24.7 + '@babel/helper-member-expression-to-functions': 7.24.7 + '@babel/helper-optimise-call-expression': 7.24.7 + '@babel/helper-replace-supers': 7.24.7(@babel/core@7.24.7) + '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 + '@babel/helper-split-export-declaration': 7.24.7 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-create-regexp-features-plugin@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-annotate-as-pure': 7.24.7 + regexpu-core: 5.3.2 + semver: 6.3.1 + + '@babel/helper-define-polyfill-provider@0.6.2(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-compilation-targets': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + debug: 4.3.4 + lodash.debounce: 4.0.8 + resolve: 1.22.8 + transitivePeerDependencies: + - supports-color + + '@babel/helper-environment-visitor@7.24.7': + dependencies: + '@babel/types': 7.24.7 + + '@babel/helper-function-name@7.24.7': + dependencies: + '@babel/template': 7.24.7 + '@babel/types': 7.24.7 + + '@babel/helper-hoist-variables@7.24.7': + dependencies: + '@babel/types': 7.24.7 + + '@babel/helper-member-expression-to-functions@7.24.7': + dependencies: + '@babel/traverse': 7.24.7 + '@babel/types': 7.24.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-imports@7.24.7': + dependencies: + '@babel/traverse': 7.24.7 + '@babel/types': 7.24.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-environment-visitor': 7.24.7 + '@babel/helper-module-imports': 7.24.7 + '@babel/helper-simple-access': 7.24.7 + '@babel/helper-split-export-declaration': 7.24.7 + '@babel/helper-validator-identifier': 7.24.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-optimise-call-expression@7.24.7': + dependencies: + '@babel/types': 7.24.7 + + '@babel/helper-plugin-utils@7.24.7': {} + + '@babel/helper-remap-async-to-generator@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-annotate-as-pure': 7.24.7 + '@babel/helper-environment-visitor': 7.24.7 + '@babel/helper-wrap-function': 7.24.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-replace-supers@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-environment-visitor': 7.24.7 + '@babel/helper-member-expression-to-functions': 7.24.7 + '@babel/helper-optimise-call-expression': 7.24.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-simple-access@7.24.7': + dependencies: + '@babel/traverse': 7.24.7 + '@babel/types': 7.24.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-skip-transparent-expression-wrappers@7.24.7': + dependencies: + '@babel/traverse': 7.24.7 + '@babel/types': 7.24.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-split-export-declaration@7.24.7': + dependencies: + '@babel/types': 7.24.7 + + '@babel/helper-string-parser@7.24.7': {} + + '@babel/helper-validator-identifier@7.24.7': {} + + '@babel/helper-validator-option@7.24.7': {} + + '@babel/helper-wrap-function@7.24.7': + dependencies: + '@babel/helper-function-name': 7.24.7 + '@babel/template': 7.24.7 + '@babel/traverse': 7.24.7 + '@babel/types': 7.24.7 + transitivePeerDependencies: + - supports-color + + '@babel/helpers@7.24.7': + dependencies: + '@babel/template': 7.24.7 + '@babel/types': 7.24.7 + + '@babel/highlight@7.24.7': + dependencies: + '@babel/helper-validator-identifier': 7.24.7 + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.0.1 + + '@babel/parser@7.24.7': + dependencies: + '@babel/types': 7.24.7 + + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-environment-visitor': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 + '@babel/plugin-transform-optional-chaining': 7.24.7(@babel/core@7.24.7) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-environment-visitor': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-syntax-flow@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-syntax-import-assertions@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-syntax-import-attributes@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-syntax-jsx@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-syntax-typescript@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-create-regexp-features-plugin': 7.24.7(@babel/core@7.24.7) + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-transform-arrow-functions@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-transform-async-generator-functions@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-environment-visitor': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + '@babel/helper-remap-async-to-generator': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.7) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-async-to-generator@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-module-imports': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + '@babel/helper-remap-async-to-generator': 7.24.7(@babel/core@7.24.7) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-block-scoped-functions@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-transform-block-scoping@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-transform-class-properties@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-create-class-features-plugin': 7.24.7(@babel/core@7.24.7) + '@babel/helper-plugin-utils': 7.24.7 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-class-static-block@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-create-class-features-plugin': 7.24.7(@babel/core@7.24.7) + '@babel/helper-plugin-utils': 7.24.7 + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.7) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-classes@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-annotate-as-pure': 7.24.7 + '@babel/helper-compilation-targets': 7.24.7 + '@babel/helper-environment-visitor': 7.24.7 + '@babel/helper-function-name': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + '@babel/helper-replace-supers': 7.24.7(@babel/core@7.24.7) + '@babel/helper-split-export-declaration': 7.24.7 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-computed-properties@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + '@babel/template': 7.24.7 + + '@babel/plugin-transform-destructuring@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-transform-dotall-regex@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-create-regexp-features-plugin': 7.24.7(@babel/core@7.24.7) + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-transform-duplicate-keys@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-transform-dynamic-import@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.7) + + '@babel/plugin-transform-exponentiation-operator@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-export-namespace-from@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.7) + + '@babel/plugin-transform-flow-strip-types@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + '@babel/plugin-syntax-flow': 7.24.7(@babel/core@7.24.7) + + '@babel/plugin-transform-for-of@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-function-name@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-compilation-targets': 7.24.7 + '@babel/helper-function-name': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-transform-json-strings@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.7) + + '@babel/plugin-transform-literals@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-transform-logical-assignment-operators@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.7) + + '@babel/plugin-transform-member-expression-literals@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-transform-modules-amd@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-module-transforms': 7.24.7(@babel/core@7.24.7) + '@babel/helper-plugin-utils': 7.24.7 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-commonjs@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-module-transforms': 7.24.7(@babel/core@7.24.7) + '@babel/helper-plugin-utils': 7.24.7 + '@babel/helper-simple-access': 7.24.7 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-systemjs@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-hoist-variables': 7.24.7 + '@babel/helper-module-transforms': 7.24.7(@babel/core@7.24.7) + '@babel/helper-plugin-utils': 7.24.7 + '@babel/helper-validator-identifier': 7.24.7 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-umd@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-module-transforms': 7.24.7(@babel/core@7.24.7) + '@babel/helper-plugin-utils': 7.24.7 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-named-capturing-groups-regex@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-create-regexp-features-plugin': 7.24.7(@babel/core@7.24.7) + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-transform-new-target@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-transform-nullish-coalescing-operator@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.7) + + '@babel/plugin-transform-numeric-separator@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.7) + + '@babel/plugin-transform-object-rest-spread@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-compilation-targets': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.7) + '@babel/plugin-transform-parameters': 7.24.7(@babel/core@7.24.7) + + '@babel/plugin-transform-object-super@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + '@babel/helper-replace-supers': 7.24.7(@babel/core@7.24.7) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-optional-catch-binding@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.7) + + '@babel/plugin-transform-optional-chaining@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.7) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-parameters@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-transform-private-methods@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-create-class-features-plugin': 7.24.7(@babel/core@7.24.7) + '@babel/helper-plugin-utils': 7.24.7 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-private-property-in-object@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-annotate-as-pure': 7.24.7 + '@babel/helper-create-class-features-plugin': 7.24.7(@babel/core@7.24.7) + '@babel/helper-plugin-utils': 7.24.7 + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.7) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-property-literals@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-transform-regenerator@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + regenerator-transform: 0.15.2 + + '@babel/plugin-transform-reserved-words@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-transform-shorthand-properties@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-transform-spread@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-sticky-regex@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-transform-template-literals@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-transform-typeof-symbol@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-transform-typescript@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-annotate-as-pure': 7.24.7 + '@babel/helper-create-class-features-plugin': 7.24.7(@babel/core@7.24.7) + '@babel/helper-plugin-utils': 7.24.7 + '@babel/plugin-syntax-typescript': 7.24.7(@babel/core@7.24.7) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-unicode-escapes@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-transform-unicode-property-regex@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-create-regexp-features-plugin': 7.24.7(@babel/core@7.24.7) + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-transform-unicode-regex@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-create-regexp-features-plugin': 7.24.7(@babel/core@7.24.7) + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-transform-unicode-sets-regex@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-create-regexp-features-plugin': 7.24.7(@babel/core@7.24.7) + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/preset-env@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/compat-data': 7.24.7 + '@babel/core': 7.24.7 + '@babel/helper-compilation-targets': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + '@babel/helper-validator-option': 7.24.7 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.7) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.7) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.7) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.7) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.7) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.7) + '@babel/plugin-syntax-import-assertions': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-syntax-import-attributes': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.7) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.7) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.7) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.7) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.7) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.7) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.7) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.7) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.7) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.7) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.24.7) + '@babel/plugin-transform-arrow-functions': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-async-generator-functions': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-async-to-generator': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-block-scoped-functions': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-block-scoping': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-class-properties': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-class-static-block': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-classes': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-computed-properties': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-destructuring': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-dotall-regex': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-duplicate-keys': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-dynamic-import': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-exponentiation-operator': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-export-namespace-from': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-for-of': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-function-name': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-json-strings': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-literals': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-logical-assignment-operators': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-member-expression-literals': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-modules-amd': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-modules-commonjs': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-modules-systemjs': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-modules-umd': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-named-capturing-groups-regex': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-new-target': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-nullish-coalescing-operator': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-numeric-separator': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-object-rest-spread': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-object-super': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-optional-catch-binding': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-optional-chaining': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-parameters': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-private-methods': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-private-property-in-object': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-property-literals': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-regenerator': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-reserved-words': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-shorthand-properties': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-spread': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-sticky-regex': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-template-literals': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-typeof-symbol': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-unicode-escapes': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-unicode-property-regex': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-unicode-regex': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-unicode-sets-regex': 7.24.7(@babel/core@7.24.7) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.24.7) + babel-plugin-polyfill-corejs2: 0.4.11(@babel/core@7.24.7) + babel-plugin-polyfill-corejs3: 0.10.4(@babel/core@7.24.7) + babel-plugin-polyfill-regenerator: 0.6.2(@babel/core@7.24.7) + core-js-compat: 3.37.1 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/preset-flow@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + '@babel/helper-validator-option': 7.24.7 + '@babel/plugin-transform-flow-strip-types': 7.24.7(@babel/core@7.24.7) + + '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + '@babel/types': 7.24.7 + esutils: 2.0.3 + + '@babel/preset-typescript@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + '@babel/helper-validator-option': 7.24.7 + '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-modules-commonjs': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-typescript': 7.24.7(@babel/core@7.24.7) + transitivePeerDependencies: + - supports-color + + '@babel/register@7.24.6(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + clone-deep: 4.0.1 + find-cache-dir: 2.1.0 + make-dir: 2.1.0 + pirates: 4.0.6 + source-map-support: 0.5.21 + + '@babel/regjsgen@0.8.0': {} + + '@babel/runtime@7.24.6': + dependencies: + regenerator-runtime: 0.14.1 + + '@babel/template@7.24.7': + dependencies: + '@babel/code-frame': 7.24.7 + '@babel/parser': 7.24.7 + '@babel/types': 7.24.7 + + '@babel/traverse@7.24.7': + dependencies: + '@babel/code-frame': 7.24.7 + '@babel/generator': 7.24.7 + '@babel/helper-environment-visitor': 7.24.7 + '@babel/helper-function-name': 7.24.7 + '@babel/helper-hoist-variables': 7.24.7 + '@babel/helper-split-export-declaration': 7.24.7 + '@babel/parser': 7.24.7 + '@babel/types': 7.24.7 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.24.7': + dependencies: + '@babel/helper-string-parser': 7.24.7 + '@babel/helper-validator-identifier': 7.24.7 + to-fast-properties: 2.0.0 + + '@codemirror/autocomplete@6.17.0(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.28.4)(@lezer/common@1.2.1)': + dependencies: + '@codemirror/language': 6.10.2 + '@codemirror/state': 6.4.1 + '@codemirror/view': 6.28.4 + '@lezer/common': 1.2.1 + + '@codemirror/commands@6.6.0': + dependencies: + '@codemirror/language': 6.10.2 + '@codemirror/state': 6.4.1 + '@codemirror/view': 6.28.4 + '@lezer/common': 1.2.1 + + '@codemirror/lang-css@6.2.1(@codemirror/view@6.28.4)': + dependencies: + '@codemirror/autocomplete': 6.17.0(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.28.4)(@lezer/common@1.2.1) + '@codemirror/language': 6.10.2 + '@codemirror/state': 6.4.1 + '@lezer/common': 1.2.1 + '@lezer/css': 1.1.8 + transitivePeerDependencies: + - '@codemirror/view' + + '@codemirror/lang-html@6.4.9': + dependencies: + '@codemirror/autocomplete': 6.17.0(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.28.4)(@lezer/common@1.2.1) + '@codemirror/lang-css': 6.2.1(@codemirror/view@6.28.4) + '@codemirror/lang-javascript': 6.2.2 + '@codemirror/language': 6.10.2 + '@codemirror/state': 6.4.1 + '@codemirror/view': 6.28.4 + '@lezer/common': 1.2.1 + '@lezer/css': 1.1.8 + '@lezer/html': 1.3.10 + + '@codemirror/lang-javascript@6.2.2': + dependencies: + '@codemirror/autocomplete': 6.17.0(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.28.4)(@lezer/common@1.2.1) + '@codemirror/language': 6.10.2 + '@codemirror/lint': 6.8.1 + '@codemirror/state': 6.4.1 + '@codemirror/view': 6.28.4 + '@lezer/common': 1.2.1 + '@lezer/javascript': 1.4.17 + + '@codemirror/lang-json@6.0.1': + dependencies: + '@codemirror/language': 6.10.2 + '@lezer/json': 1.0.2 + + '@codemirror/lang-yaml@6.1.1(@codemirror/view@6.28.4)': + dependencies: + '@codemirror/autocomplete': 6.17.0(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.28.4)(@lezer/common@1.2.1) + '@codemirror/language': 6.10.2 + '@codemirror/state': 6.4.1 + '@lezer/common': 1.2.1 + '@lezer/highlight': 1.2.0 + '@lezer/yaml': 1.0.3 + transitivePeerDependencies: + - '@codemirror/view' + + '@codemirror/language@6.10.2': + dependencies: + '@codemirror/state': 6.4.1 + '@codemirror/view': 6.28.4 + '@lezer/common': 1.2.1 + '@lezer/highlight': 1.2.0 + '@lezer/lr': 1.4.1 + style-mod: 4.1.2 + + '@codemirror/lint@6.8.1': + dependencies: + '@codemirror/state': 6.4.1 + '@codemirror/view': 6.28.4 + crelt: 1.0.6 + + '@codemirror/search@6.5.6': + dependencies: + '@codemirror/state': 6.4.1 + '@codemirror/view': 6.28.4 + crelt: 1.0.6 + + '@codemirror/state@6.4.1': {} + + '@codemirror/view@6.28.4': + dependencies: + '@codemirror/state': 6.4.1 + style-mod: 4.1.2 + w3c-keyname: 2.2.8 + + '@effect/platform@0.58.21(@effect/schema@0.68.18(effect@3.4.8))(effect@3.4.8)': + dependencies: + '@effect/schema': 0.68.18(effect@3.4.8) + effect: 3.4.8 + find-my-way-ts: 0.1.4 + multipasta: 0.2.2 + path-browserify: 1.0.1 + + '@effect/schema@0.68.18(effect@3.4.8)': + dependencies: + effect: 3.4.8 + fast-check: 3.19.0 + + '@emnapi/runtime@0.44.0': + dependencies: + tslib: 2.6.2 + optional: true + + '@emotion/is-prop-valid@0.8.8': + dependencies: + '@emotion/memoize': 0.7.4 + optional: true + + '@emotion/memoize@0.7.4': + optional: true + + '@esbuild/aix-ppc64@0.21.5': + optional: true + + '@esbuild/android-arm64@0.21.5': + optional: true + + '@esbuild/android-arm@0.21.5': + optional: true + + '@esbuild/android-x64@0.21.5': + optional: true + + '@esbuild/darwin-arm64@0.21.5': + optional: true + + '@esbuild/darwin-x64@0.21.5': + optional: true + + '@esbuild/freebsd-arm64@0.21.5': + optional: true + + '@esbuild/freebsd-x64@0.21.5': + optional: true + + '@esbuild/linux-arm64@0.21.5': + optional: true + + '@esbuild/linux-arm@0.21.5': + optional: true + + '@esbuild/linux-ia32@0.21.5': + optional: true + + '@esbuild/linux-loong64@0.21.5': + optional: true + + '@esbuild/linux-mips64el@0.21.5': + optional: true + + '@esbuild/linux-ppc64@0.21.5': + optional: true + + '@esbuild/linux-riscv64@0.21.5': + optional: true + + '@esbuild/linux-s390x@0.21.5': + optional: true + + '@esbuild/linux-x64@0.21.5': + optional: true + + '@esbuild/netbsd-x64@0.21.5': + optional: true + + '@esbuild/openbsd-x64@0.21.5': + optional: true + + '@esbuild/sunos-x64@0.21.5': + optional: true + + '@esbuild/win32-arm64@0.21.5': + optional: true + + '@esbuild/win32-ia32@0.21.5': + optional: true + + '@esbuild/win32-x64@0.21.5': + optional: true + + '@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)': + dependencies: + eslint: 8.57.0 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.10.0': {} + + '@eslint/eslintrc@2.1.4': + dependencies: + ajv: 6.12.6 + debug: 4.3.4 + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.1 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@8.57.0': {} + + '@floating-ui/core@1.6.2': + dependencies: + '@floating-ui/utils': 0.2.2 + + '@floating-ui/dom@1.6.5': + dependencies: + '@floating-ui/core': 1.6.2 + '@floating-ui/utils': 0.2.2 + + '@floating-ui/dom@1.6.7': + dependencies: + '@floating-ui/core': 1.6.2 + '@floating-ui/utils': 0.2.4 + + '@floating-ui/react-dom@2.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@floating-ui/dom': 1.6.5 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@floating-ui/react@0.26.16(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@floating-ui/react-dom': 2.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@floating-ui/utils': 0.2.2 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + tabbable: 6.2.0 + + '@floating-ui/utils@0.2.2': {} + + '@floating-ui/utils@0.2.4': {} + + '@floating-ui/vue@1.1.1(vue@3.4.31(typescript@5.4.5))': + dependencies: + '@floating-ui/dom': 1.6.7 + '@floating-ui/utils': 0.2.4 + vue-demi: 0.14.8(vue@3.4.31(typescript@5.4.5)) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + + '@headlessui/react@2.0.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@floating-ui/react': 0.26.16(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/focus': 3.17.1(react@18.3.1) + '@react-aria/interactions': 3.21.3(react@18.3.1) + '@tanstack/react-virtual': 3.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@headlessui/tailwindcss@0.2.1(tailwindcss@3.4.3)': + dependencies: + tailwindcss: 3.4.3 + + '@headlessui/vue@1.7.22(vue@3.4.31(typescript@5.4.5))': + dependencies: + '@tanstack/vue-virtual': 3.8.2(vue@3.4.31(typescript@5.4.5)) + vue: 3.4.31(typescript@5.4.5) + + '@heroicons/react@2.1.3(react@18.3.1)': + dependencies: + react: 18.3.1 + + '@humanwhocodes/config-array@0.11.14': + dependencies: + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.3.4 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/object-schema@2.0.3': {} + + '@img/sharp-darwin-arm64@0.33.1': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.0.0 + optional: true + + '@img/sharp-darwin-x64@0.33.1': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.0.0 + optional: true + + '@img/sharp-libvips-darwin-arm64@1.0.0': + optional: true + + '@img/sharp-libvips-darwin-x64@1.0.0': + optional: true + + '@img/sharp-libvips-linux-arm64@1.0.0': + optional: true + + '@img/sharp-libvips-linux-arm@1.0.0': + optional: true + + '@img/sharp-libvips-linux-s390x@1.0.0': + optional: true + + '@img/sharp-libvips-linux-x64@1.0.0': + optional: true + + '@img/sharp-libvips-linuxmusl-arm64@1.0.0': + optional: true + + '@img/sharp-libvips-linuxmusl-x64@1.0.0': + optional: true + + '@img/sharp-linux-arm64@0.33.1': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.0.0 + optional: true + + '@img/sharp-linux-arm@0.33.1': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.0.0 + optional: true + + '@img/sharp-linux-s390x@0.33.1': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.0.0 + optional: true + + '@img/sharp-linux-x64@0.33.1': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.0.0 + optional: true + + '@img/sharp-linuxmusl-arm64@0.33.1': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.0.0 + optional: true + + '@img/sharp-linuxmusl-x64@0.33.1': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.0.0 + optional: true + + '@img/sharp-wasm32@0.33.1': + dependencies: + '@emnapi/runtime': 0.44.0 + optional: true + + '@img/sharp-win32-ia32@0.33.1': + optional: true + + '@img/sharp-win32-x64@0.33.1': + optional: true + + '@internationalized/date@3.5.4': + dependencies: + '@swc/helpers': 0.5.11 + + '@internationalized/number@3.5.3': + dependencies: + '@swc/helpers': 0.5.11 + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@jest/schemas@29.6.3': + dependencies: + '@sinclair/typebox': 0.27.8 + + '@jridgewell/gen-mapping@0.3.5': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/source-map@0.3.6': + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/sourcemap-codec@1.4.15': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + + '@lezer/common@1.2.1': {} + + '@lezer/css@1.1.8': + dependencies: + '@lezer/common': 1.2.1 + '@lezer/highlight': 1.2.0 + '@lezer/lr': 1.4.1 + + '@lezer/highlight@1.2.0': + dependencies: + '@lezer/common': 1.2.1 + + '@lezer/html@1.3.10': + dependencies: + '@lezer/common': 1.2.1 + '@lezer/highlight': 1.2.0 + '@lezer/lr': 1.4.1 + + '@lezer/javascript@1.4.17': + dependencies: + '@lezer/common': 1.2.1 + '@lezer/highlight': 1.2.0 + '@lezer/lr': 1.4.1 + + '@lezer/json@1.0.2': + dependencies: + '@lezer/common': 1.2.1 + '@lezer/highlight': 1.2.0 + '@lezer/lr': 1.4.1 + + '@lezer/lr@1.4.1': + dependencies: + '@lezer/common': 1.2.1 + + '@lezer/yaml@1.0.3': + dependencies: + '@lezer/common': 1.2.1 + '@lezer/highlight': 1.2.0 + '@lezer/lr': 1.4.1 + + '@mdx-js/loader@3.0.1(webpack@5.91.0(esbuild@0.21.5))': + dependencies: + '@mdx-js/mdx': 3.0.1 + source-map: 0.7.4 + webpack: 5.91.0(esbuild@0.21.5) + transitivePeerDependencies: + - supports-color + + '@mdx-js/mdx@3.0.1': + dependencies: + '@types/estree': 1.0.5 + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdx': 2.0.13 + collapse-white-space: 2.1.0 + devlop: 1.1.0 + estree-util-build-jsx: 3.0.1 + estree-util-is-identifier-name: 3.0.0 + estree-util-to-js: 2.0.0 + estree-walker: 3.0.3 + hast-util-to-estree: 3.1.0 + hast-util-to-jsx-runtime: 2.3.0 + markdown-extensions: 2.0.0 + periscopic: 3.1.0 + remark-mdx: 3.0.1 + remark-parse: 11.0.0 + remark-rehype: 11.1.0 + source-map: 0.7.4 + unified: 11.0.4 + unist-util-position-from-estree: 2.0.0 + unist-util-stringify-position: 4.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.1 + transitivePeerDependencies: + - supports-color + + '@mdx-js/react@3.0.1(@types/react@18.3.3)(react@18.3.1)': + dependencies: + '@types/mdx': 2.0.13 + '@types/react': 18.3.3 + react: 18.3.1 + + '@next/env@14.2.3': {} + + '@next/eslint-plugin-next@14.2.3': + dependencies: + glob: 10.3.10 + + '@next/mdx@14.2.3(@mdx-js/loader@3.0.1(webpack@5.91.0(esbuild@0.21.5)))(@mdx-js/react@3.0.1(@types/react@18.3.3)(react@18.3.1))': + dependencies: + source-map: 0.7.4 + optionalDependencies: + '@mdx-js/loader': 3.0.1(webpack@5.91.0(esbuild@0.21.5)) + '@mdx-js/react': 3.0.1(@types/react@18.3.3)(react@18.3.1) + + '@next/swc-darwin-arm64@14.2.3': + optional: true + + '@next/swc-darwin-x64@14.2.3': + optional: true + + '@next/swc-linux-arm64-gnu@14.2.3': + optional: true + + '@next/swc-linux-arm64-musl@14.2.3': + optional: true + + '@next/swc-linux-x64-gnu@14.2.3': + optional: true + + '@next/swc-linux-x64-musl@14.2.3': + optional: true + + '@next/swc-win32-arm64-msvc@14.2.3': + optional: true + + '@next/swc-win32-ia32-msvc@14.2.3': + optional: true + + '@next/swc-win32-x64-msvc@14.2.3': + optional: true + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.17.1 + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@popperjs/core@2.11.8': {} + + '@react-aria/focus@3.17.1(react@18.3.1)': + dependencies: + '@react-aria/interactions': 3.21.3(react@18.3.1) + '@react-aria/utils': 3.24.1(react@18.3.1) + '@react-types/shared': 3.23.1(react@18.3.1) + '@swc/helpers': 0.5.11 + clsx: 2.1.1 + react: 18.3.1 + + '@react-aria/interactions@3.21.3(react@18.3.1)': + dependencies: + '@react-aria/ssr': 3.9.4(react@18.3.1) + '@react-aria/utils': 3.24.1(react@18.3.1) + '@react-types/shared': 3.23.1(react@18.3.1) + '@swc/helpers': 0.5.11 + react: 18.3.1 + + '@react-aria/ssr@3.9.4(react@18.3.1)': + dependencies: + '@swc/helpers': 0.5.11 + react: 18.3.1 + + '@react-aria/utils@3.24.1(react@18.3.1)': + dependencies: + '@react-aria/ssr': 3.9.4(react@18.3.1) + '@react-stately/utils': 3.10.1(react@18.3.1) + '@react-types/shared': 3.23.1(react@18.3.1) + '@swc/helpers': 0.5.11 + clsx: 2.1.1 + react: 18.3.1 + + '@react-stately/utils@3.10.1(react@18.3.1)': + dependencies: + '@swc/helpers': 0.5.11 + react: 18.3.1 + + '@react-types/shared@3.23.1(react@18.3.1)': + dependencies: + react: 18.3.1 + + '@replit/codemirror-css-color-picker@6.1.1(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.28.4)': + dependencies: + '@codemirror/language': 6.10.2 + '@codemirror/state': 6.4.1 + '@codemirror/view': 6.28.4 + + '@rushstack/eslint-patch@1.10.3': {} + + '@scalar/api-client@2.0.15(storybook@8.2.0(@babel/preset-env@7.24.7(@babel/core@7.24.7)))(tailwindcss@3.4.3)(typescript@5.4.5)': + dependencies: + '@headlessui/tailwindcss': 0.2.1(tailwindcss@3.4.3) + '@headlessui/vue': 1.7.22(vue@3.4.31(typescript@5.4.5)) + '@scalar/components': 0.12.12(storybook@8.2.0(@babel/preset-env@7.24.7(@babel/core@7.24.7)))(typescript@5.4.5) + '@scalar/draggable': 0.1.3(typescript@5.4.5) + '@scalar/oas-utils': 0.2.13(typescript@5.4.5) + '@scalar/object-utils': 1.1.4(vue@3.4.31(typescript@5.4.5)) + '@scalar/openapi-parser': 0.7.2 + '@scalar/themes': 0.9.13(typescript@5.4.5) + '@scalar/use-codemirror': 0.11.5(typescript@5.4.5) + '@scalar/use-toasts': 0.7.4(typescript@5.4.5) + '@scalar/use-tooltip': 1.0.2(typescript@5.4.5) + '@vueuse/core': 10.11.0(vue@3.4.31(typescript@5.4.5)) + axios: 1.7.2 + cva: 1.0.0-beta.1(typescript@5.4.5) + fuse.js: 7.0.0 + js-cookie: 3.0.5 + nanoid: 5.0.7 + pretty-bytes: 6.1.1 + pretty-ms: 8.0.0 + vue: 3.4.31(typescript@5.4.5) + vue-router: 4.4.0(vue@3.4.31(typescript@5.4.5)) + zod: 3.23.8 + transitivePeerDependencies: + - '@jest/globals' + - '@types/bun' + - '@types/jest' + - '@vue/composition-api' + - debug + - jest + - storybook + - supports-color + - tailwindcss + - typescript + - vitest + + '@scalar/api-reference-react@0.3.37(postcss@8.4.38)(storybook@8.2.0(@babel/preset-env@7.24.7(@babel/core@7.24.7)))(tailwindcss@3.4.3)(typescript@5.4.5)': + dependencies: + '@scalar/api-reference': 1.24.39(postcss@8.4.38)(storybook@8.2.0(@babel/preset-env@7.24.7(@babel/core@7.24.7)))(tailwindcss@3.4.3)(typescript@5.4.5) + react: 18.3.1 + transitivePeerDependencies: + - '@jest/globals' + - '@types/bun' + - '@types/jest' + - '@vue/composition-api' + - debug + - jest + - postcss + - storybook + - supports-color + - tailwindcss + - typescript + - vitest + + '@scalar/api-reference@1.24.39(postcss@8.4.38)(storybook@8.2.0(@babel/preset-env@7.24.7(@babel/core@7.24.7)))(tailwindcss@3.4.3)(typescript@5.4.5)': + dependencies: + '@floating-ui/vue': 1.1.1(vue@3.4.31(typescript@5.4.5)) + '@headlessui/vue': 1.7.22(vue@3.4.31(typescript@5.4.5)) + '@scalar/api-client': 2.0.15(storybook@8.2.0(@babel/preset-env@7.24.7(@babel/core@7.24.7)))(tailwindcss@3.4.3)(typescript@5.4.5) + '@scalar/components': 0.12.12(storybook@8.2.0(@babel/preset-env@7.24.7(@babel/core@7.24.7)))(typescript@5.4.5) + '@scalar/oas-utils': 0.2.13(typescript@5.4.5) + '@scalar/openapi-parser': 0.7.2 + '@scalar/snippetz': 0.1.6 + '@scalar/themes': 0.9.13(typescript@5.4.5) + '@scalar/use-toasts': 0.7.4(typescript@5.4.5) + '@scalar/use-tooltip': 1.0.2(typescript@5.4.5) + '@unhead/schema': 1.9.15 + '@unhead/vue': 1.9.15(vue@3.4.31(typescript@5.4.5)) + '@vueuse/core': 10.11.0(vue@3.4.31(typescript@5.4.5)) + axios: 1.7.2 + fuse.js: 7.0.0 + github-slugger: 2.0.0 + httpsnippet-lite: 3.0.5 + nanoid: 5.0.7 + postcss-nested: 6.0.1(postcss@8.4.38) + unhead: 1.9.15 + unified: 11.0.4 + vue: 3.4.31(typescript@5.4.5) + transitivePeerDependencies: + - '@jest/globals' + - '@types/bun' + - '@types/jest' + - '@vue/composition-api' + - debug + - jest + - postcss + - storybook + - supports-color + - tailwindcss + - typescript + - vitest + + '@scalar/code-highlight@0.0.7': + dependencies: + hast-util-to-text: 4.0.2 + highlight.js: 11.10.0 + highlightjs-curl: 1.3.0 + highlightjs-vue: 1.0.0 + lowlight: 3.1.0 + rehype-external-links: 3.0.0 + rehype-format: 5.0.0 + rehype-parse: 9.0.0 + rehype-raw: 7.0.0 + rehype-sanitize: 6.0.0 + rehype-stringify: 10.0.0 + remark-gfm: 4.0.0 + remark-parse: 11.0.0 + remark-rehype: 11.1.0 + unified: 11.0.4 + unist-util-visit: 5.0.0 + transitivePeerDependencies: + - supports-color + + '@scalar/components@0.12.12(storybook@8.2.0(@babel/preset-env@7.24.7(@babel/core@7.24.7)))(typescript@5.4.5)': + dependencies: + '@floating-ui/utils': 0.2.4 + '@floating-ui/vue': 1.1.1(vue@3.4.31(typescript@5.4.5)) + '@headlessui/vue': 1.7.22(vue@3.4.31(typescript@5.4.5)) + '@scalar/code-highlight': 0.0.7 + '@storybook/test': 8.2.0(storybook@8.2.0(@babel/preset-env@7.24.7(@babel/core@7.24.7))) + '@vueuse/core': 10.11.0(vue@3.4.31(typescript@5.4.5)) + cva: 1.0.0-beta.1(typescript@5.4.5) + nanoid: 5.0.7 + radix-vue: 1.9.0(vue@3.4.31(typescript@5.4.5)) + tailwind-merge: 2.3.0 + vue: 3.4.31(typescript@5.4.5) + transitivePeerDependencies: + - '@jest/globals' + - '@types/bun' + - '@types/jest' + - '@vue/composition-api' + - jest + - storybook + - supports-color + - typescript + - vitest + + '@scalar/draggable@0.1.3(typescript@5.4.5)': + dependencies: + vue: 3.4.31(typescript@5.4.5) + transitivePeerDependencies: + - typescript + + '@scalar/oas-utils@0.2.13(typescript@5.4.5)': + dependencies: + '@scalar/themes': 0.9.13(typescript@5.4.5) + axios: 1.7.2 + nanoid: 5.0.7 + yaml: 2.4.5 + zod: 3.23.8 + transitivePeerDependencies: + - debug + - typescript + + '@scalar/object-utils@1.1.4(vue@3.4.31(typescript@5.4.5))': + dependencies: + '@vueuse/core': 10.11.0(vue@3.4.31(typescript@5.4.5)) + just-clone: 6.2.0 + transitivePeerDependencies: + - '@vue/composition-api' + - vue + + '@scalar/openapi-parser@0.7.2': + dependencies: + ajv: 8.16.0 + ajv-draft-04: 1.0.0(ajv@8.16.0) + ajv-formats: 3.0.1(ajv@8.16.0) + jsonpointer: 5.0.1 + leven: 4.0.0 + yaml: 2.4.5 + + '@scalar/snippetz-core@0.1.4': + dependencies: + '@types/har-format': 1.2.15 + + '@scalar/snippetz-plugin-js-fetch@0.1.1': + dependencies: + '@scalar/snippetz-core': 0.1.4 + + '@scalar/snippetz-plugin-js-ofetch@0.1.1': + dependencies: + '@scalar/snippetz-core': 0.1.4 + + '@scalar/snippetz-plugin-node-fetch@0.1.2': + dependencies: + '@scalar/snippetz-core': 0.1.4 + + '@scalar/snippetz-plugin-node-ofetch@0.1.1': + dependencies: + '@scalar/snippetz-core': 0.1.4 + + '@scalar/snippetz-plugin-node-undici@0.1.6': + dependencies: + '@scalar/snippetz-core': 0.1.4 + + '@scalar/snippetz@0.1.6': + dependencies: + '@scalar/snippetz-core': 0.1.4 + '@scalar/snippetz-plugin-js-fetch': 0.1.1 + '@scalar/snippetz-plugin-js-ofetch': 0.1.1 + '@scalar/snippetz-plugin-node-fetch': 0.1.2 + '@scalar/snippetz-plugin-node-ofetch': 0.1.1 + '@scalar/snippetz-plugin-node-undici': 0.1.6 + + '@scalar/themes@0.9.13(typescript@5.4.5)': + dependencies: + vue: 3.4.31(typescript@5.4.5) + transitivePeerDependencies: + - typescript + + '@scalar/use-codemirror@0.11.5(typescript@5.4.5)': + dependencies: + '@codemirror/autocomplete': 6.17.0(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.28.4)(@lezer/common@1.2.1) + '@codemirror/commands': 6.6.0 + '@codemirror/lang-css': 6.2.1(@codemirror/view@6.28.4) + '@codemirror/lang-html': 6.4.9 + '@codemirror/lang-json': 6.0.1 + '@codemirror/lang-yaml': 6.1.1(@codemirror/view@6.28.4) + '@codemirror/language': 6.10.2 + '@codemirror/lint': 6.8.1 + '@codemirror/state': 6.4.1 + '@codemirror/view': 6.28.4 + '@lezer/common': 1.2.1 + '@lezer/highlight': 1.2.0 + '@lezer/lr': 1.4.1 + '@replit/codemirror-css-color-picker': 6.1.1(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.28.4) + '@uiw/codemirror-themes': 4.23.0(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.28.4) + codemirror: 6.0.1(@lezer/common@1.2.1) + vue: 3.4.31(typescript@5.4.5) + optionalDependencies: + y-codemirror.next: 0.3.5(@codemirror/state@6.4.1)(@codemirror/view@6.28.4)(yjs@13.6.18) + yjs: 13.6.18 + transitivePeerDependencies: + - typescript + + '@scalar/use-toasts@0.7.4(typescript@5.4.5)': + dependencies: + nanoid: 5.0.7 + vue: 3.4.31(typescript@5.4.5) + vue-sonner: 1.1.3 + transitivePeerDependencies: + - typescript + + '@scalar/use-tooltip@1.0.2(typescript@5.4.5)': + dependencies: + tippy.js: 6.3.7 + vue: 3.4.31(typescript@5.4.5) + transitivePeerDependencies: + - typescript + + '@shikijs/core@1.10.3': + dependencies: + '@types/hast': 3.0.4 + + '@shikijs/core@1.6.2': {} + + '@shikijs/transformers@1.10.3': + dependencies: + shiki: 1.10.3 + + '@sinclair/typebox@0.27.8': {} + + '@sindresorhus/merge-streams@2.3.0': {} + + '@sindresorhus/slugify@2.2.1': + dependencies: + '@sindresorhus/transliterate': 1.6.0 + escape-string-regexp: 5.0.0 + + '@sindresorhus/transliterate@1.6.0': + dependencies: + escape-string-regexp: 5.0.0 + + '@storybook/codemod@8.2.0': + dependencies: + '@babel/core': 7.24.7 + '@babel/preset-env': 7.24.7(@babel/core@7.24.7) + '@babel/types': 7.24.7 + '@storybook/core': 8.2.0 + '@storybook/csf': 0.1.11 + '@types/cross-spawn': 6.0.6 + cross-spawn: 7.0.3 + globby: 14.0.2 + jscodeshift: 0.15.2(@babel/preset-env@7.24.7(@babel/core@7.24.7)) + lodash: 4.17.21 + prettier: 3.2.5 + recast: 0.23.9 + tiny-invariant: 1.3.3 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + '@storybook/core@8.2.0': + dependencies: + '@storybook/csf': 0.1.11 + '@types/express': 4.17.21 + '@types/node': 18.19.39 + browser-assert: 1.2.1 + esbuild: 0.21.5 + esbuild-register: 3.5.0(esbuild@0.21.5) + express: 4.19.2 + process: 0.11.10 + recast: 0.23.9 + util: 0.12.5 + ws: 8.18.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + '@storybook/csf@0.1.11': + dependencies: + type-fest: 2.19.0 + + '@storybook/global@5.0.0': {} + + '@storybook/instrumenter@8.2.0(storybook@8.2.0(@babel/preset-env@7.24.7(@babel/core@7.24.7)))': + dependencies: + '@storybook/global': 5.0.0 + '@vitest/utils': 1.6.0 + storybook: 8.2.0(@babel/preset-env@7.24.7(@babel/core@7.24.7)) + util: 0.12.5 + + '@storybook/test@8.2.0(storybook@8.2.0(@babel/preset-env@7.24.7(@babel/core@7.24.7)))': + dependencies: + '@storybook/csf': 0.1.11 + '@storybook/instrumenter': 8.2.0(storybook@8.2.0(@babel/preset-env@7.24.7(@babel/core@7.24.7))) + '@testing-library/dom': 10.1.0 + '@testing-library/jest-dom': 6.4.5 + '@testing-library/user-event': 14.5.2(@testing-library/dom@10.1.0) + '@vitest/expect': 1.6.0 + '@vitest/spy': 1.6.0 + storybook: 8.2.0(@babel/preset-env@7.24.7(@babel/core@7.24.7)) + util: 0.12.5 + transitivePeerDependencies: + - '@jest/globals' + - '@types/bun' + - '@types/jest' + - jest + - vitest + + '@swc/counter@0.1.3': {} + + '@swc/helpers@0.5.11': + dependencies: + tslib: 2.6.2 + + '@swc/helpers@0.5.5': + dependencies: + '@swc/counter': 0.1.3 + tslib: 2.6.2 + + '@tailwindcss/typography@0.5.13(tailwindcss@3.4.3)': + dependencies: + lodash.castarray: 4.4.0 + lodash.isplainobject: 4.0.6 + lodash.merge: 4.6.2 + postcss-selector-parser: 6.0.10 + tailwindcss: 3.4.3 + + '@tanstack/react-virtual@3.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@tanstack/virtual-core': 3.5.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@tanstack/virtual-core@3.5.0': {} + + '@tanstack/virtual-core@3.8.2': {} + + '@tanstack/vue-virtual@3.8.2(vue@3.4.31(typescript@5.4.5))': + dependencies: + '@tanstack/virtual-core': 3.8.2 + vue: 3.4.31(typescript@5.4.5) + + '@testing-library/dom@10.1.0': + dependencies: + '@babel/code-frame': 7.24.7 + '@babel/runtime': 7.24.6 + '@types/aria-query': 5.0.4 + aria-query: 5.3.0 + chalk: 4.1.2 + dom-accessibility-api: 0.5.16 + lz-string: 1.5.0 + pretty-format: 27.5.1 + + '@testing-library/jest-dom@6.4.5': + dependencies: + '@adobe/css-tools': 4.4.0 + '@babel/runtime': 7.24.6 + aria-query: 5.3.0 + chalk: 3.0.0 + css.escape: 1.5.1 + dom-accessibility-api: 0.6.3 + lodash: 4.17.21 + redent: 3.0.0 + + '@testing-library/user-event@14.5.2(@testing-library/dom@10.1.0)': + dependencies: + '@testing-library/dom': 10.1.0 + + '@types/acorn@4.0.6': + dependencies: + '@types/estree': 1.0.5 + + '@types/aria-query@5.0.4': {} + + '@types/body-parser@1.19.5': + dependencies: + '@types/connect': 3.4.38 + '@types/node': 20.12.13 + + '@types/connect@3.4.38': + dependencies: + '@types/node': 20.12.13 + + '@types/cross-spawn@6.0.6': + dependencies: + '@types/node': 20.12.13 + + '@types/debug@4.1.12': + dependencies: + '@types/ms': 0.7.34 + + '@types/emscripten@1.39.13': {} + + '@types/eslint-scope@3.7.7': + dependencies: + '@types/eslint': 8.56.10 + '@types/estree': 1.0.5 + + '@types/eslint@8.56.10': + dependencies: + '@types/estree': 1.0.5 + '@types/json-schema': 7.0.15 + + '@types/estree-jsx@1.0.5': + dependencies: + '@types/estree': 1.0.5 + + '@types/estree@1.0.5': {} + + '@types/express-serve-static-core@4.19.5': + dependencies: + '@types/node': 20.12.13 + '@types/qs': 6.9.15 + '@types/range-parser': 1.2.7 + '@types/send': 0.17.4 + + '@types/express@4.17.21': + dependencies: + '@types/body-parser': 1.19.5 + '@types/express-serve-static-core': 4.19.5 + '@types/qs': 6.9.15 + '@types/serve-static': 1.15.7 + + '@types/har-format@1.2.15': {} + + '@types/hast@3.0.4': + dependencies: + '@types/unist': 3.0.2 + + '@types/http-errors@2.0.4': {} + + '@types/json-schema@7.0.15': {} + + '@types/json5@0.0.29': {} + + '@types/mdast@4.0.4': + dependencies: + '@types/unist': 3.0.2 + + '@types/mdx@2.0.13': {} + + '@types/mime@1.3.5': {} + + '@types/ms@0.7.34': {} + + '@types/node@18.19.39': + dependencies: + undici-types: 5.26.5 + + '@types/node@20.12.13': + dependencies: + undici-types: 5.26.5 + + '@types/prop-types@15.7.12': {} + + '@types/qs@6.9.15': {} + + '@types/range-parser@1.2.7': {} + + '@types/react-dom@18.3.0': + dependencies: + '@types/react': 18.3.3 + + '@types/react-highlight-words@0.16.7': + dependencies: + '@types/react': 18.3.3 + + '@types/react@18.3.3': + dependencies: + '@types/prop-types': 15.7.12 + csstype: 3.1.3 + + '@types/semver@7.5.8': {} + + '@types/send@0.17.4': + dependencies: + '@types/mime': 1.3.5 + '@types/node': 20.12.13 + + '@types/serve-static@1.15.7': + dependencies: + '@types/http-errors': 2.0.4 + '@types/node': 20.12.13 + '@types/send': 0.17.4 + + '@types/unist@2.0.10': {} + + '@types/unist@3.0.2': {} + + '@types/web-bluetooth@0.0.20': {} + + '@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.5)': + dependencies: + '@typescript-eslint/scope-manager': 7.2.0 + '@typescript-eslint/types': 7.2.0 + '@typescript-eslint/typescript-estree': 7.2.0(typescript@5.4.5) + '@typescript-eslint/visitor-keys': 7.2.0 + debug: 4.3.4 + eslint: 8.57.0 + optionalDependencies: + typescript: 5.4.5 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@7.2.0': + dependencies: + '@typescript-eslint/types': 7.2.0 + '@typescript-eslint/visitor-keys': 7.2.0 + + '@typescript-eslint/types@7.2.0': {} + + '@typescript-eslint/typescript-estree@7.2.0(typescript@5.4.5)': + dependencies: + '@typescript-eslint/types': 7.2.0 + '@typescript-eslint/visitor-keys': 7.2.0 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.3 + semver: 7.6.2 + ts-api-utils: 1.3.0(typescript@5.4.5) + optionalDependencies: + typescript: 5.4.5 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/visitor-keys@7.2.0': + dependencies: + '@typescript-eslint/types': 7.2.0 + eslint-visitor-keys: 3.4.3 + + '@uiw/codemirror-themes@4.23.0(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.28.4)': + dependencies: + '@codemirror/language': 6.10.2 + '@codemirror/state': 6.4.1 + '@codemirror/view': 6.28.4 + + '@ungap/structured-clone@1.2.0': {} + + '@unhead/dom@1.9.15': + dependencies: + '@unhead/schema': 1.9.15 + '@unhead/shared': 1.9.15 + + '@unhead/schema@1.9.15': + dependencies: + hookable: 5.5.3 + zhead: 2.2.4 + + '@unhead/shared@1.9.15': + dependencies: + '@unhead/schema': 1.9.15 + + '@unhead/vue@1.9.15(vue@3.4.31(typescript@5.4.5))': + dependencies: + '@unhead/schema': 1.9.15 + '@unhead/shared': 1.9.15 + hookable: 5.5.3 + unhead: 1.9.15 + vue: 3.4.31(typescript@5.4.5) + + '@uploadthing/dropzone@0.4.2-canary.7cbef70(react@18.3.1)(vue@3.4.31(typescript@5.4.5))': + dependencies: + file-selector: 0.6.0 + optionalDependencies: + react: 18.3.1 + vue: 3.4.31(typescript@5.4.5) + + '@uploadthing/mime-types@0.2.11-canary.7cbef70': {} + + '@uploadthing/react@6.7.3-canary.7cbef70(next@14.2.3(@babel/core@7.24.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(uploadthing@6.13.3-canary.7cbef70(express@4.19.2)(next@14.2.3(@babel/core@7.24.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(tailwindcss@3.4.3))(vue@3.4.31(typescript@5.4.5))': + dependencies: + '@uploadthing/dropzone': 0.4.2-canary.7cbef70(react@18.3.1)(vue@3.4.31(typescript@5.4.5)) + '@uploadthing/shared': 6.7.9-canary.7cbef70 + file-selector: 0.6.0 + react: 18.3.1 + tailwind-merge: 2.3.0 + uploadthing: 6.13.3-canary.7cbef70(express@4.19.2)(next@14.2.3(@babel/core@7.24.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(tailwindcss@3.4.3) + optionalDependencies: + next: 14.2.3(@babel/core@7.24.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + transitivePeerDependencies: + - solid-js + - svelte + - vue + + '@uploadthing/shared@6.7.9-canary.7cbef70': + dependencies: + '@uploadthing/mime-types': 0.2.11-canary.7cbef70 + effect: 3.4.8 + + '@vitest/expect@1.6.0': + dependencies: + '@vitest/spy': 1.6.0 + '@vitest/utils': 1.6.0 + chai: 4.4.1 + + '@vitest/spy@1.6.0': + dependencies: + tinyspy: 2.2.1 + + '@vitest/utils@1.6.0': + dependencies: + diff-sequences: 29.6.3 + estree-walker: 3.0.3 + loupe: 2.3.7 + pretty-format: 29.7.0 + + '@vue/compiler-core@3.4.31': + dependencies: + '@babel/parser': 7.24.7 + '@vue/shared': 3.4.31 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.2.0 + + '@vue/compiler-dom@3.4.31': + dependencies: + '@vue/compiler-core': 3.4.31 + '@vue/shared': 3.4.31 + + '@vue/compiler-sfc@3.4.31': + dependencies: + '@babel/parser': 7.24.7 + '@vue/compiler-core': 3.4.31 + '@vue/compiler-dom': 3.4.31 + '@vue/compiler-ssr': 3.4.31 + '@vue/shared': 3.4.31 + estree-walker: 2.0.2 + magic-string: 0.30.10 + postcss: 8.4.38 + source-map-js: 1.2.0 + + '@vue/compiler-ssr@3.4.31': + dependencies: + '@vue/compiler-dom': 3.4.31 + '@vue/shared': 3.4.31 + + '@vue/devtools-api@6.6.3': {} + + '@vue/reactivity@3.4.31': + dependencies: + '@vue/shared': 3.4.31 + + '@vue/runtime-core@3.4.31': + dependencies: + '@vue/reactivity': 3.4.31 + '@vue/shared': 3.4.31 + + '@vue/runtime-dom@3.4.31': + dependencies: + '@vue/reactivity': 3.4.31 + '@vue/runtime-core': 3.4.31 + '@vue/shared': 3.4.31 + csstype: 3.1.3 + + '@vue/server-renderer@3.4.31(vue@3.4.31(typescript@5.4.5))': + dependencies: + '@vue/compiler-ssr': 3.4.31 + '@vue/shared': 3.4.31 + vue: 3.4.31(typescript@5.4.5) + + '@vue/shared@3.4.31': {} + + '@vueuse/core@10.11.0(vue@3.4.31(typescript@5.4.5))': + dependencies: + '@types/web-bluetooth': 0.0.20 + '@vueuse/metadata': 10.11.0 + '@vueuse/shared': 10.11.0(vue@3.4.31(typescript@5.4.5)) + vue-demi: 0.14.8(vue@3.4.31(typescript@5.4.5)) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + + '@vueuse/metadata@10.11.0': {} + + '@vueuse/shared@10.11.0(vue@3.4.31(typescript@5.4.5))': + dependencies: + vue-demi: 0.14.8(vue@3.4.31(typescript@5.4.5)) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + + '@webassemblyjs/ast@1.12.1': + dependencies: + '@webassemblyjs/helper-numbers': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + + '@webassemblyjs/floating-point-hex-parser@1.11.6': {} + + '@webassemblyjs/helper-api-error@1.11.6': {} + + '@webassemblyjs/helper-buffer@1.12.1': {} + + '@webassemblyjs/helper-numbers@1.11.6': + dependencies: + '@webassemblyjs/floating-point-hex-parser': 1.11.6 + '@webassemblyjs/helper-api-error': 1.11.6 + '@xtuc/long': 4.2.2 + + '@webassemblyjs/helper-wasm-bytecode@1.11.6': {} + + '@webassemblyjs/helper-wasm-section@1.12.1': + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-buffer': 1.12.1 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/wasm-gen': 1.12.1 + + '@webassemblyjs/ieee754@1.11.6': + dependencies: + '@xtuc/ieee754': 1.2.0 + + '@webassemblyjs/leb128@1.11.6': + dependencies: + '@xtuc/long': 4.2.2 + + '@webassemblyjs/utf8@1.11.6': {} + + '@webassemblyjs/wasm-edit@1.12.1': + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-buffer': 1.12.1 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/helper-wasm-section': 1.12.1 + '@webassemblyjs/wasm-gen': 1.12.1 + '@webassemblyjs/wasm-opt': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 + '@webassemblyjs/wast-printer': 1.12.1 + + '@webassemblyjs/wasm-gen@1.12.1': + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/ieee754': 1.11.6 + '@webassemblyjs/leb128': 1.11.6 + '@webassemblyjs/utf8': 1.11.6 + + '@webassemblyjs/wasm-opt@1.12.1': + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-buffer': 1.12.1 + '@webassemblyjs/wasm-gen': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 + + '@webassemblyjs/wasm-parser@1.12.1': + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-api-error': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/ieee754': 1.11.6 + '@webassemblyjs/leb128': 1.11.6 + '@webassemblyjs/utf8': 1.11.6 + + '@webassemblyjs/wast-printer@1.12.1': + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@xtuc/long': 4.2.2 + + '@xtuc/ieee754@1.2.0': {} + + '@xtuc/long@4.2.2': {} + + '@yarnpkg/fslib@2.10.3': + dependencies: + '@yarnpkg/libzip': 2.3.0 + tslib: 1.14.1 + + '@yarnpkg/libzip@2.3.0': + dependencies: + '@types/emscripten': 1.39.13 + tslib: 1.14.1 + + accepts@1.3.8: + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + + acorn-import-assertions@1.9.0(acorn@8.11.3): + dependencies: + acorn: 8.11.3 + + acorn-jsx@5.3.2(acorn@8.11.3): + dependencies: + acorn: 8.11.3 + + acorn@8.11.3: {} + + ajv-draft-04@1.0.0(ajv@8.16.0): + optionalDependencies: + ajv: 8.16.0 + + ajv-formats@3.0.1(ajv@8.16.0): + optionalDependencies: + ajv: 8.16.0 + + ajv-keywords@3.5.2(ajv@6.12.6): + dependencies: + ajv: 6.12.6 + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ajv@8.16.0: + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + + algoliasearch@4.23.3: + dependencies: + '@algolia/cache-browser-local-storage': 4.23.3 + '@algolia/cache-common': 4.23.3 + '@algolia/cache-in-memory': 4.23.3 + '@algolia/client-account': 4.23.3 + '@algolia/client-analytics': 4.23.3 + '@algolia/client-common': 4.23.3 + '@algolia/client-personalization': 4.23.3 + '@algolia/client-search': 4.23.3 + '@algolia/logger-common': 4.23.3 + '@algolia/logger-console': 4.23.3 + '@algolia/recommend': 4.23.3 + '@algolia/requester-browser-xhr': 4.23.3 + '@algolia/requester-common': 4.23.3 + '@algolia/requester-node-http': 4.23.3 + '@algolia/transporter': 4.23.3 + + ansi-regex@5.0.1: {} + + ansi-regex@6.0.1: {} + + ansi-styles@3.2.1: + dependencies: + color-convert: 1.9.3 + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@5.2.0: {} + + ansi-styles@6.2.1: {} + + any-promise@1.3.0: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + arg@5.0.2: {} + + argparse@2.0.1: {} + + aria-hidden@1.2.4: + dependencies: + tslib: 2.6.2 + + aria-query@5.3.0: + dependencies: + dequal: 2.0.3 + + array-buffer-byte-length@1.0.1: + dependencies: + call-bind: 1.0.7 + is-array-buffer: 3.0.4 + + array-flatten@1.1.1: {} + + array-includes@3.1.8: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 + get-intrinsic: 1.2.4 + is-string: 1.0.7 + + array-union@2.1.0: {} + + array.prototype.findlast@1.2.5: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + es-shim-unscopables: 1.0.2 + + array.prototype.findlastindex@1.2.5: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + es-shim-unscopables: 1.0.2 + + array.prototype.flat@1.3.2: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-shim-unscopables: 1.0.2 + + array.prototype.flatmap@1.3.2: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-shim-unscopables: 1.0.2 + + array.prototype.toreversed@1.1.2: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-shim-unscopables: 1.0.2 + + array.prototype.tosorted@1.1.3: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + es-shim-unscopables: 1.0.2 + + arraybuffer.prototype.slice@1.0.3: + dependencies: + array-buffer-byte-length: 1.0.1 + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + is-array-buffer: 3.0.4 + is-shared-array-buffer: 1.0.3 + + assertion-error@1.1.0: {} + + ast-types-flow@0.0.8: {} + + ast-types@0.16.1: + dependencies: + tslib: 2.6.2 + + astring@1.8.6: {} + + asynckit@0.4.0: {} + + autoprefixer@10.4.19(postcss@8.4.38): + dependencies: + browserslist: 4.23.0 + caniuse-lite: 1.0.30001625 + fraction.js: 4.3.7 + normalize-range: 0.1.2 + picocolors: 1.0.1 + postcss: 8.4.38 + postcss-value-parser: 4.2.0 + + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.0.0 + + axe-core@4.7.0: {} + + axios@1.7.2: + dependencies: + follow-redirects: 1.15.6 + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + + axobject-query@3.2.1: + dependencies: + dequal: 2.0.3 + + babel-core@7.0.0-bridge.0(@babel/core@7.24.7): + dependencies: + '@babel/core': 7.24.7 + + babel-plugin-polyfill-corejs2@0.4.11(@babel/core@7.24.7): + dependencies: + '@babel/compat-data': 7.24.7 + '@babel/core': 7.24.7 + '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.24.7) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + babel-plugin-polyfill-corejs3@0.10.4(@babel/core@7.24.7): + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.24.7) + core-js-compat: 3.37.1 + transitivePeerDependencies: + - supports-color + + babel-plugin-polyfill-regenerator@0.6.2(@babel/core@7.24.7): + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.24.7) + transitivePeerDependencies: + - supports-color + + bail@2.0.2: {} + + balanced-match@1.0.2: {} + + base64-js@1.5.1: {} + + big.js@5.2.2: {} + + binary-extensions@2.3.0: {} + + bl@4.1.0: + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + + body-parser@1.20.2: + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.11.0 + raw-body: 2.5.2 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browser-assert@1.2.1: {} + + browserslist@4.23.0: + dependencies: + caniuse-lite: 1.0.30001625 + electron-to-chromium: 1.4.784 + node-releases: 2.0.14 + update-browserslist-db: 1.0.16(browserslist@4.23.0) + + buffer-from@1.1.2: {} + + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + busboy@1.6.0: + dependencies: + streamsearch: 1.1.0 + + bytes@3.1.2: {} + + call-bind@1.0.7: + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + set-function-length: 1.2.2 + + callsites@3.1.0: {} + + camelcase-css@2.0.1: {} + + caniuse-lite@1.0.30001625: {} + + ccount@2.0.1: {} + + chai@4.4.1: + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.3 + deep-eql: 4.1.4 + get-func-name: 2.0.2 + loupe: 2.3.7 + pathval: 1.1.1 + type-detect: 4.0.8 + + chalk@2.4.2: + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + + chalk@3.0.0: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + character-entities-html4@2.1.0: {} + + character-entities-legacy@3.0.0: {} + + character-entities@2.0.2: {} + + character-reference-invalid@2.0.1: {} + + check-error@1.0.3: + dependencies: + get-func-name: 2.0.2 + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + chownr@2.0.0: {} + + chrome-trace-event@1.0.4: {} + + citty@0.1.6: + dependencies: + consola: 3.2.3 + + cli-cursor@3.1.0: + dependencies: + restore-cursor: 3.1.0 + + cli-spinners@2.9.2: {} + + client-only@0.0.1: {} + + clone-deep@4.0.1: + dependencies: + is-plain-object: 2.0.4 + kind-of: 6.0.3 + shallow-clone: 3.0.1 + + clone@1.0.4: {} + + clsx@2.0.0: {} + + clsx@2.1.1: {} + + codemirror@6.0.1(@lezer/common@1.2.1): + dependencies: + '@codemirror/autocomplete': 6.17.0(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.28.4)(@lezer/common@1.2.1) + '@codemirror/commands': 6.6.0 + '@codemirror/language': 6.10.2 + '@codemirror/lint': 6.8.1 + '@codemirror/search': 6.5.6 + '@codemirror/state': 6.4.1 + '@codemirror/view': 6.28.4 + transitivePeerDependencies: + - '@lezer/common' + + collapse-white-space@2.1.0: {} + + color-convert@1.9.3: + dependencies: + color-name: 1.1.3 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.3: {} + + color-name@1.1.4: {} + + color-string@1.9.1: + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.2 + + color@4.2.3: + dependencies: + color-convert: 2.0.1 + color-string: 1.9.1 + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + comma-separated-tokens@2.0.3: {} + + commander@2.20.3: {} + + commander@4.1.1: {} + + commander@6.2.1: {} + + commondir@1.0.1: {} + + concat-map@0.0.1: {} + + confbox@0.1.7: {} + + consola@3.2.3: {} + + content-disposition@0.5.4: + dependencies: + safe-buffer: 5.2.1 + + content-type@1.0.5: {} + + convert-source-map@2.0.0: {} + + cookie-signature@1.0.6: {} + + cookie@0.6.0: {} + + core-js-compat@3.37.1: + dependencies: + browserslist: 4.23.0 + + crelt@1.0.6: {} + + cross-spawn@7.0.3: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + crypto-random-string@4.0.0: + dependencies: + type-fest: 1.4.0 + + css.escape@1.5.1: {} + + cssesc@3.0.0: {} + + csstype@3.1.3: {} + + cva@1.0.0-beta.1(typescript@5.4.5): + dependencies: + clsx: 2.0.0 + optionalDependencies: + typescript: 5.4.5 + + damerau-levenshtein@1.0.8: {} + + data-view-buffer@1.0.1: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + + data-view-byte-length@1.0.1: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + + data-view-byte-offset@1.0.0: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + + debug@2.6.9: + dependencies: + ms: 2.0.0 + + debug@3.2.7: + dependencies: + ms: 2.1.3 + + debug@4.3.4: + dependencies: + ms: 2.1.2 + + decode-named-character-reference@1.0.2: + dependencies: + character-entities: 2.0.2 + + deep-eql@4.1.4: + dependencies: + type-detect: 4.0.8 + + deep-is@0.1.4: {} + + defaults@1.0.4: + dependencies: + clone: 1.0.4 + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + gopd: 1.0.1 + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + + defu@6.1.4: {} + + delayed-stream@1.0.0: {} + + depd@2.0.0: {} + + dequal@2.0.3: {} + + destroy@1.2.0: {} + + detect-indent@6.1.0: {} + + detect-libc@2.0.3: {} + + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + + didyoumean@1.2.2: {} + + diff-sequences@29.6.3: {} + + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + + dlv@1.1.3: {} + + doctrine@2.1.0: + dependencies: + esutils: 2.0.3 + + doctrine@3.0.0: + dependencies: + esutils: 2.0.3 + + dom-accessibility-api@0.5.16: {} + + dom-accessibility-api@0.6.3: {} + + eastasianwidth@0.2.0: {} + + ee-first@1.1.1: {} + + effect-log@0.31.5(effect@3.4.8): + dependencies: + effect: 3.4.8 + + effect@3.4.8: {} + + electron-to-chromium@1.4.784: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + emojis-list@3.0.0: {} + + encodeurl@1.0.2: {} + + enhanced-resolve@5.16.1: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + + entities@4.5.0: {} + + envinfo@7.13.0: {} + + es-abstract@1.23.3: + dependencies: + array-buffer-byte-length: 1.0.1 + arraybuffer.prototype.slice: 1.0.3 + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + data-view-buffer: 1.0.1 + data-view-byte-length: 1.0.1 + data-view-byte-offset: 1.0.0 + es-define-property: 1.0.0 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + es-set-tostringtag: 2.0.3 + es-to-primitive: 1.2.1 + function.prototype.name: 1.1.6 + get-intrinsic: 1.2.4 + get-symbol-description: 1.0.2 + globalthis: 1.0.4 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.2 + internal-slot: 1.0.7 + is-array-buffer: 3.0.4 + is-callable: 1.2.7 + is-data-view: 1.0.1 + is-negative-zero: 2.0.3 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.3 + is-string: 1.0.7 + is-typed-array: 1.1.13 + is-weakref: 1.0.2 + object-inspect: 1.13.1 + object-keys: 1.1.1 + object.assign: 4.1.5 + regexp.prototype.flags: 1.5.2 + safe-array-concat: 1.1.2 + safe-regex-test: 1.0.3 + string.prototype.trim: 1.2.9 + string.prototype.trimend: 1.0.8 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.2 + typed-array-byte-length: 1.0.1 + typed-array-byte-offset: 1.0.2 + typed-array-length: 1.0.6 + unbox-primitive: 1.0.2 + which-typed-array: 1.1.15 + + es-define-property@1.0.0: + dependencies: + get-intrinsic: 1.2.4 + + es-errors@1.3.0: {} + + es-iterator-helpers@1.0.19: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + es-set-tostringtag: 2.0.3 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + globalthis: 1.0.4 + has-property-descriptors: 1.0.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + internal-slot: 1.0.7 + iterator.prototype: 1.1.2 + safe-array-concat: 1.1.2 + + es-module-lexer@1.5.3: {} + + es-object-atoms@1.0.0: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.0.3: + dependencies: + get-intrinsic: 1.2.4 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + es-shim-unscopables@1.0.2: + dependencies: + hasown: 2.0.2 + + es-to-primitive@1.2.1: + dependencies: + is-callable: 1.2.7 + is-date-object: 1.0.5 + is-symbol: 1.0.4 + + esbuild-register@3.5.0(esbuild@0.21.5): + dependencies: + debug: 4.3.4 + esbuild: 0.21.5 + transitivePeerDependencies: + - supports-color + + esbuild@0.21.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + + escalade@3.1.2: {} + + escape-html@1.0.3: {} + + escape-string-regexp@1.0.5: {} + + escape-string-regexp@4.0.0: {} + + escape-string-regexp@5.0.0: {} + + eslint-config-next@14.2.3(eslint@8.57.0)(typescript@5.4.5): + dependencies: + '@next/eslint-plugin-next': 14.2.3 + '@rushstack/eslint-patch': 1.10.3 + '@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.4.5) + eslint: 8.57.0 + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) + eslint-plugin-jsx-a11y: 6.8.0(eslint@8.57.0) + eslint-plugin-react: 7.34.2(eslint@8.57.0) + eslint-plugin-react-hooks: 4.6.2(eslint@8.57.0) + optionalDependencies: + typescript: 5.4.5 + transitivePeerDependencies: + - eslint-import-resolver-webpack + - supports-color + + eslint-import-resolver-node@0.3.9: + dependencies: + debug: 3.2.7 + is-core-module: 2.13.1 + resolve: 1.22.8 + transitivePeerDependencies: + - supports-color + + eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0): + dependencies: + debug: 4.3.4 + enhanced-resolve: 5.16.1 + eslint: 8.57.0 + eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) + fast-glob: 3.3.2 + get-tsconfig: 4.7.5 + is-core-module: 2.13.1 + is-glob: 4.0.3 + transitivePeerDependencies: + - '@typescript-eslint/parser' + - eslint-import-resolver-node + - eslint-import-resolver-webpack + - supports-color + + eslint-module-utils@2.8.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0): + dependencies: + debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.4.5) + eslint: 8.57.0 + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0) + transitivePeerDependencies: + - supports-color + + eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0): + dependencies: + array-includes: 3.1.8 + array.prototype.findlastindex: 1.2.5 + array.prototype.flat: 1.3.2 + array.prototype.flatmap: 1.3.2 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 8.57.0 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) + hasown: 2.0.2 + is-core-module: 2.13.1 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.fromentries: 2.0.8 + object.groupby: 1.0.3 + object.values: 1.2.0 + semver: 6.3.1 + tsconfig-paths: 3.15.0 + optionalDependencies: + '@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.4.5) + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + + eslint-plugin-jsx-a11y@6.8.0(eslint@8.57.0): + dependencies: + '@babel/runtime': 7.24.6 + aria-query: 5.3.0 + array-includes: 3.1.8 + array.prototype.flatmap: 1.3.2 + ast-types-flow: 0.0.8 + axe-core: 4.7.0 + axobject-query: 3.2.1 + damerau-levenshtein: 1.0.8 + emoji-regex: 9.2.2 + es-iterator-helpers: 1.0.19 + eslint: 8.57.0 + hasown: 2.0.2 + jsx-ast-utils: 3.3.5 + language-tags: 1.0.9 + minimatch: 3.1.2 + object.entries: 1.1.8 + object.fromentries: 2.0.8 + + eslint-plugin-react-hooks@4.6.2(eslint@8.57.0): + dependencies: + eslint: 8.57.0 + + eslint-plugin-react@7.34.2(eslint@8.57.0): + dependencies: + array-includes: 3.1.8 + array.prototype.findlast: 1.2.5 + array.prototype.flatmap: 1.3.2 + array.prototype.toreversed: 1.1.2 + array.prototype.tosorted: 1.1.3 + doctrine: 2.1.0 + es-iterator-helpers: 1.0.19 + eslint: 8.57.0 + estraverse: 5.3.0 + jsx-ast-utils: 3.3.5 + minimatch: 3.1.2 + object.entries: 1.1.8 + object.fromentries: 2.0.8 + object.hasown: 1.1.4 + object.values: 1.2.0 + prop-types: 15.8.1 + resolve: 2.0.0-next.5 + semver: 6.3.1 + string.prototype.matchall: 4.0.11 + + eslint-scope@5.1.1: + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + + eslint-scope@7.2.2: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint@8.57.0: + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@eslint-community/regexpp': 4.10.0 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.57.0 + '@humanwhocodes/config-array': 0.11.14 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.2.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.24.0 + graphemer: 1.4.0 + ignore: 5.3.1 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + + espree@9.6.1: + dependencies: + acorn: 8.11.3 + acorn-jsx: 5.3.2(acorn@8.11.3) + eslint-visitor-keys: 3.4.3 + + esprima@4.0.1: {} + + esquery@1.5.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@4.3.0: {} + + estraverse@5.3.0: {} + + estree-util-attach-comments@3.0.0: + dependencies: + '@types/estree': 1.0.5 + + estree-util-build-jsx@3.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + estree-walker: 3.0.3 + + estree-util-is-identifier-name@3.0.0: {} + + estree-util-to-js@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.5 + astring: 1.8.6 + source-map: 0.7.4 + + estree-util-visit@1.2.1: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/unist': 2.0.10 + + estree-util-visit@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/unist': 3.0.2 + + estree-walker@2.0.2: {} + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.5 + + esutils@2.0.3: {} + + etag@1.8.1: {} + + events@3.3.0: {} + + execa@5.1.1: + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + + execa@8.0.1: + dependencies: + cross-spawn: 7.0.3 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.3.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 + + express@4.19.2: + dependencies: + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.2 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookie: 0.6.0 + cookie-signature: 1.0.6 + debug: 2.6.9 + depd: 2.0.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.2.0 + fresh: 0.5.2 + http-errors: 2.0.0 + merge-descriptors: 1.0.1 + methods: 1.1.2 + on-finished: 2.4.1 + parseurl: 1.3.3 + path-to-regexp: 0.1.7 + proxy-addr: 2.0.7 + qs: 6.11.0 + range-parser: 1.2.1 + safe-buffer: 5.2.1 + send: 0.18.0 + serve-static: 1.15.0 + setprototypeof: 1.2.0 + statuses: 2.0.1 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + extend@3.0.2: {} + + fast-check@3.19.0: + dependencies: + pure-rand: 6.1.0 + + fast-decode-uri-component@1.0.1: {} + + fast-deep-equal@3.1.3: {} + + fast-glob@3.3.2: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.7 + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fast-querystring@1.1.2: + dependencies: + fast-decode-uri-component: 1.0.1 + + fastq@1.17.1: + dependencies: + reusify: 1.0.4 + + fd-package-json@1.2.0: + dependencies: + walk-up-path: 3.0.1 + + file-entry-cache@6.0.1: + dependencies: + flat-cache: 3.2.0 + + file-selector@0.6.0: + dependencies: + tslib: 2.6.2 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + finalhandler@1.2.0: + dependencies: + debug: 2.6.9 + encodeurl: 1.0.2 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.1 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + find-cache-dir@2.1.0: + dependencies: + commondir: 1.0.1 + make-dir: 2.1.0 + pkg-dir: 3.0.0 + + find-my-way-ts@0.1.4: + dependencies: + fast-querystring: 1.1.2 + + find-up@3.0.0: + dependencies: + locate-path: 3.0.0 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@3.2.0: + dependencies: + flatted: 3.3.1 + keyv: 4.5.4 + rimraf: 3.0.2 + + flatted@3.3.1: {} + + flexsearch@0.7.43: {} + + flow-parser@0.239.1: {} + + follow-redirects@1.15.6: {} + + for-each@0.3.3: + dependencies: + is-callable: 1.2.7 + + foreground-child@3.1.1: + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.1.0 + + form-data@4.0.0: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + formdata-node@4.4.1: + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 4.0.0-beta.3 + + forwarded@0.2.0: {} + + fraction.js@4.3.7: {} + + framer-motion@10.18.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + tslib: 2.6.2 + optionalDependencies: + '@emotion/is-prop-valid': 0.8.8 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + fresh@0.5.2: {} + + fs-extra@11.2.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + + fs-minipass@2.1.0: + dependencies: + minipass: 3.3.6 + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + function.prototype.name@1.1.6: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + functions-have-names: 1.2.3 + + functions-have-names@1.2.3: {} + + fuse.js@7.0.0: {} + + gensync@1.0.0-beta.2: {} + + get-func-name@2.0.2: {} + + get-intrinsic@1.2.4: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.2 + + get-own-enumerable-property-symbols@3.0.2: {} + + get-stream@6.0.1: {} + + get-stream@8.0.1: {} + + get-symbol-description@1.0.2: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + + get-tsconfig@4.7.5: + dependencies: + resolve-pkg-maps: 1.0.0 + + giget@1.2.3: + dependencies: + citty: 0.1.6 + consola: 3.2.3 + defu: 6.1.4 + node-fetch-native: 1.6.4 + nypm: 0.3.9 + ohash: 1.1.3 + pathe: 1.1.2 + tar: 6.2.1 + + github-slugger@2.0.0: {} + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob-to-regexp@0.4.1: {} + + glob@10.3.10: + dependencies: + foreground-child: 3.1.1 + jackspeak: 2.3.6 + minimatch: 9.0.4 + minipass: 7.1.2 + path-scurry: 1.11.1 + + glob@10.4.1: + dependencies: + foreground-child: 3.1.1 + jackspeak: 3.1.2 + minimatch: 9.0.4 + minipass: 7.1.2 + path-scurry: 1.11.1 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + globals@11.12.0: {} + + globals@13.24.0: + dependencies: + type-fest: 0.20.2 + + globalthis@1.0.4: + dependencies: + define-properties: 1.2.1 + gopd: 1.0.1 + + globby@11.1.0: + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.2 + ignore: 5.3.1 + merge2: 1.4.1 + slash: 3.0.0 + + globby@14.0.2: + dependencies: + '@sindresorhus/merge-streams': 2.3.0 + fast-glob: 3.3.2 + ignore: 5.3.1 + path-type: 5.0.0 + slash: 5.1.0 + unicorn-magic: 0.1.0 + + gopd@1.0.1: + dependencies: + get-intrinsic: 1.2.4 + + graceful-fs@4.2.11: {} + + graphemer@1.4.0: {} + + has-bigints@1.0.2: {} + + has-flag@3.0.0: {} + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.0 + + has-proto@1.0.3: {} + + has-symbols@1.0.3: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.0.3 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + hast-util-embedded@3.0.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-is-element: 3.0.0 + + hast-util-from-html@2.0.1: + dependencies: + '@types/hast': 3.0.4 + devlop: 1.1.0 + hast-util-from-parse5: 8.0.1 + parse5: 7.1.2 + vfile: 6.0.1 + vfile-message: 4.0.2 + + hast-util-from-parse5@8.0.1: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.2 + devlop: 1.1.0 + hastscript: 8.0.0 + property-information: 6.5.0 + vfile: 6.0.1 + vfile-location: 5.0.2 + web-namespaces: 2.0.1 + + hast-util-has-property@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-is-body-ok-link@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-is-element@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-parse-selector@4.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-phrasing@3.0.1: + dependencies: + '@types/hast': 3.0.4 + hast-util-embedded: 3.0.0 + hast-util-has-property: 3.0.0 + hast-util-is-body-ok-link: 3.0.0 + hast-util-is-element: 3.0.0 + + hast-util-raw@9.0.4: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.2 + '@ungap/structured-clone': 1.2.0 + hast-util-from-parse5: 8.0.1 + hast-util-to-parse5: 8.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.1.0 + parse5: 7.1.2 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.1 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + + hast-util-sanitize@5.0.1: + dependencies: + '@types/hast': 3.0.4 + '@ungap/structured-clone': 1.2.0 + unist-util-position: 5.0.0 + + hast-util-to-estree@3.1.0: + dependencies: + '@types/estree': 1.0.5 + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + devlop: 1.1.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.1.2 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + style-to-object: 0.4.4 + unist-util-position: 5.0.0 + zwitch: 2.0.4 + transitivePeerDependencies: + - supports-color + + hast-util-to-html@9.0.1: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.2 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-raw: 9.0.4 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.1.0 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.4 + zwitch: 2.0.4 + + hast-util-to-jsx-runtime@2.3.0: + dependencies: + '@types/estree': 1.0.5 + '@types/hast': 3.0.4 + '@types/unist': 3.0.2 + comma-separated-tokens: 2.0.3 + devlop: 1.1.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.1.2 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + style-to-object: 1.0.6 + unist-util-position: 5.0.0 + vfile-message: 4.0.2 + transitivePeerDependencies: + - supports-color + + hast-util-to-parse5@8.0.0: + dependencies: + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + + hast-util-to-text@4.0.2: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.2 + hast-util-is-element: 3.0.0 + unist-util-find-after: 5.0.0 + + hast-util-whitespace@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hastscript@8.0.0: + dependencies: + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + hast-util-parse-selector: 4.0.0 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + + highlight-words-core@1.2.2: {} + + highlight.js@11.10.0: {} + + highlight.js@11.9.0: {} + + highlightjs-curl@1.3.0: {} + + highlightjs-vue@1.0.0: {} + + hookable@5.5.3: {} + + html-void-elements@3.0.0: {} + + html-whitespace-sensitive-tag-names@3.0.0: {} + + http-errors@2.0.0: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + + httpsnippet-lite@3.0.5: + dependencies: + '@types/har-format': 1.2.15 + formdata-node: 4.4.1 + stringify-object: 3.3.0 + + human-signals@2.1.0: {} + + human-signals@5.0.0: {} + + iconv-lite@0.4.24: + dependencies: + safer-buffer: 2.1.2 + + ieee754@1.2.1: {} + + ignore@5.3.1: {} + + import-fresh@3.3.0: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + imurmurhash@0.1.4: {} + + indent-string@4.0.0: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + inline-style-parser@0.1.1: {} + + inline-style-parser@0.2.3: {} + + internal-slot@1.0.7: + dependencies: + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.0.6 + + ipaddr.js@1.9.1: {} + + is-absolute-url@4.0.1: {} + + is-alphabetical@2.0.1: {} + + is-alphanumerical@2.0.1: + dependencies: + is-alphabetical: 2.0.1 + is-decimal: 2.0.1 + + is-arguments@1.1.1: + dependencies: + call-bind: 1.0.7 + has-tostringtag: 1.0.2 + + is-array-buffer@3.0.4: + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + + is-arrayish@0.3.2: {} + + is-async-function@2.0.0: + dependencies: + has-tostringtag: 1.0.2 + + is-bigint@1.0.4: + dependencies: + has-bigints: 1.0.2 + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-boolean-object@1.1.2: + dependencies: + call-bind: 1.0.7 + has-tostringtag: 1.0.2 + + is-callable@1.2.7: {} + + is-core-module@2.13.1: + dependencies: + hasown: 2.0.2 + + is-data-view@1.0.1: + dependencies: + is-typed-array: 1.1.13 + + is-date-object@1.0.5: + dependencies: + has-tostringtag: 1.0.2 + + is-decimal@2.0.1: {} + + is-extglob@2.1.1: {} + + is-finalizationregistry@1.0.2: + dependencies: + call-bind: 1.0.7 + + is-fullwidth-code-point@3.0.0: {} + + is-generator-function@1.0.10: + dependencies: + has-tostringtag: 1.0.2 + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-hexadecimal@2.0.1: {} + + is-interactive@1.0.0: {} + + is-map@2.0.3: {} + + is-negative-zero@2.0.3: {} + + is-number-object@1.0.7: + dependencies: + has-tostringtag: 1.0.2 + + is-number@7.0.0: {} + + is-obj@1.0.1: {} + + is-path-inside@3.0.3: {} + + is-plain-obj@4.1.0: {} + + is-plain-object@2.0.4: + dependencies: + isobject: 3.0.1 + + is-reference@3.0.2: + dependencies: + '@types/estree': 1.0.5 + + is-regex@1.1.4: + dependencies: + call-bind: 1.0.7 + has-tostringtag: 1.0.2 + + is-regexp@1.0.0: {} + + is-set@2.0.3: {} + + is-shared-array-buffer@1.0.3: + dependencies: + call-bind: 1.0.7 + + is-stream@2.0.1: {} + + is-stream@3.0.0: {} + + is-string@1.0.7: + dependencies: + has-tostringtag: 1.0.2 + + is-symbol@1.0.4: + dependencies: + has-symbols: 1.0.3 + + is-typed-array@1.1.13: + dependencies: + which-typed-array: 1.1.15 + + is-unicode-supported@0.1.0: {} + + is-weakmap@2.0.2: {} + + is-weakref@1.0.2: + dependencies: + call-bind: 1.0.7 + + is-weakset@2.0.3: + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + + isarray@2.0.5: {} + + isexe@2.0.0: {} + + isobject@3.0.1: {} + + isomorphic.js@0.2.5: + optional: true + + iterator.prototype@1.1.2: + dependencies: + define-properties: 1.2.1 + get-intrinsic: 1.2.4 + has-symbols: 1.0.3 + reflect.getprototypeof: 1.0.6 + set-function-name: 2.0.2 + + jackspeak@2.3.6: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + jackspeak@3.1.2: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + jest-worker@27.5.1: + dependencies: + '@types/node': 20.12.13 + merge-stream: 2.0.0 + supports-color: 8.1.1 + + jiti@1.21.0: {} + + js-cookie@3.0.5: {} + + js-tokens@4.0.0: {} + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + jscodeshift@0.15.2(@babel/preset-env@7.24.7(@babel/core@7.24.7)): + dependencies: + '@babel/core': 7.24.7 + '@babel/parser': 7.24.7 + '@babel/plugin-transform-class-properties': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-modules-commonjs': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-nullish-coalescing-operator': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-optional-chaining': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-private-methods': 7.24.7(@babel/core@7.24.7) + '@babel/preset-flow': 7.24.7(@babel/core@7.24.7) + '@babel/preset-typescript': 7.24.7(@babel/core@7.24.7) + '@babel/register': 7.24.6(@babel/core@7.24.7) + babel-core: 7.0.0-bridge.0(@babel/core@7.24.7) + chalk: 4.1.2 + flow-parser: 0.239.1 + graceful-fs: 4.2.11 + micromatch: 4.0.7 + neo-async: 2.6.2 + node-dir: 0.1.17 + recast: 0.23.9 + temp: 0.8.4 + write-file-atomic: 2.4.3 + optionalDependencies: + '@babel/preset-env': 7.24.7(@babel/core@7.24.7) + transitivePeerDependencies: + - supports-color + + jsesc@0.5.0: {} + + jsesc@2.5.2: {} + + json-buffer@3.0.1: {} + + json-parse-even-better-errors@2.3.1: {} + + json-schema-traverse@0.4.1: {} + + json-schema-traverse@1.0.0: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + json5@1.0.2: + dependencies: + minimist: 1.2.8 + + json5@2.2.3: {} + + jsonfile@6.1.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + jsonpointer@5.0.1: {} + + jsx-ast-utils@3.3.5: + dependencies: + array-includes: 3.1.8 + array.prototype.flat: 1.3.2 + object.assign: 4.1.5 + object.values: 1.2.0 + + just-clone@6.2.0: {} + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + kind-of@6.0.3: {} + + kleur@3.0.3: {} + + language-subtag-registry@0.3.23: {} + + language-tags@1.0.9: + dependencies: + language-subtag-registry: 0.3.23 + + leven@3.1.0: {} + + leven@4.0.0: {} + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + lib0@0.2.94: + dependencies: + isomorphic.js: 0.2.5 + optional: true + + lilconfig@2.1.0: {} + + lilconfig@3.1.1: {} + + lines-and-columns@1.2.4: {} + + loader-runner@4.3.0: {} + + loader-utils@2.0.4: + dependencies: + big.js: 5.2.2 + emojis-list: 3.0.0 + json5: 2.2.3 + + locate-path@3.0.0: + dependencies: + p-locate: 3.0.0 + path-exists: 3.0.0 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash.castarray@4.4.0: {} + + lodash.debounce@4.0.8: {} + + lodash.isplainobject@4.0.6: {} + + lodash.merge@4.6.2: {} + + lodash@4.17.21: {} + + log-symbols@4.1.0: + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + + longest-streak@3.1.0: {} + + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + + loupe@2.3.7: + dependencies: + get-func-name: 2.0.2 + + lowlight@3.1.0: + dependencies: + '@types/hast': 3.0.4 + devlop: 1.1.0 + highlight.js: 11.9.0 + + lru-cache@10.2.2: {} + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + lz-string@1.5.0: {} + + magic-string@0.30.10: + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + + make-dir@2.1.0: + dependencies: + pify: 4.0.1 + semver: 5.7.2 + + markdown-extensions@2.0.0: {} + + markdown-table@3.0.3: {} + + mdast-util-find-and-replace@3.0.1: + dependencies: + '@types/mdast': 4.0.4 + escape-string-regexp: 5.0.0 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + + mdast-util-from-markdown@2.0.1: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.2 + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.0 + micromark-util-decode-numeric-character-reference: 2.0.1 + 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 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-autolink-literal@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-find-and-replace: 3.0.1 + micromark-util-character: 2.1.0 + + mdast-util-gfm-footnote@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.1 + mdast-util-to-markdown: 2.1.0 + micromark-util-normalize-identifier: 2.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-strikethrough@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.1 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-table@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + markdown-table: 3.0.3 + mdast-util-from-markdown: 2.0.1 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-task-list-item@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.1 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm@3.0.0: + dependencies: + mdast-util-from-markdown: 2.0.1 + mdast-util-gfm-autolink-literal: 2.0.0 + mdast-util-gfm-footnote: 2.0.0 + mdast-util-gfm-strikethrough: 2.0.0 + mdast-util-gfm-table: 2.0.0 + mdast-util-gfm-task-list-item: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-expression@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.1 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-jsx@3.1.2: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@types/unist': 3.0.2 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.1 + mdast-util-to-markdown: 2.1.0 + parse-entities: 4.0.1 + stringify-entities: 4.0.4 + unist-util-remove-position: 5.0.0 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx@3.0.0: + dependencies: + mdast-util-from-markdown: 2.0.1 + mdast-util-mdx-expression: 2.0.0 + mdast-util-mdx-jsx: 3.1.2 + mdast-util-mdxjs-esm: 2.0.1 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + + mdast-util-mdxjs-esm@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.1 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + + mdast-util-phrasing@4.1.0: + dependencies: + '@types/mdast': 4.0.4 + unist-util-is: 6.0.0 + + mdast-util-to-hast@13.1.0: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.2.0 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.0 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.1 + + mdast-util-to-markdown@2.1.0: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.2 + longest-streak: 3.1.0 + mdast-util-phrasing: 4.1.0 + mdast-util-to-string: 4.0.0 + micromark-util-decode-string: 2.0.0 + unist-util-visit: 5.0.0 + zwitch: 2.0.4 + + mdast-util-to-string@4.0.0: + dependencies: + '@types/mdast': 4.0.4 + + mdx-annotations@0.1.4: + dependencies: + acorn: 8.11.3 + estree-util-visit: 1.2.1 + unist-util-visit: 4.1.2 + + media-typer@0.3.0: {} + + memoize-one@4.0.3: {} + + merge-descriptors@1.0.1: {} + + merge-stream@2.0.0: {} + + merge2@1.4.1: {} + + methods@1.1.2: {} + + micromark-core-commonmark@2.0.1: + dependencies: + decode-named-character-reference: 1.0.2 + devlop: 1.1.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.1.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.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-gfm-autolink-literal@2.0.0: + dependencies: + micromark-util-character: 2.1.0 + micromark-util-sanitize-uri: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-gfm-footnote@2.0.0: + dependencies: + devlop: 1.1.0 + micromark-core-commonmark: 2.0.1 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-sanitize-uri: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-gfm-strikethrough@2.0.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-classify-character: 2.0.0 + micromark-util-resolve-all: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-gfm-table@2.0.0: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-gfm-tagfilter@2.0.0: + dependencies: + micromark-util-types: 2.0.0 + + micromark-extension-gfm-task-list-item@2.0.1: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-gfm@3.0.0: + dependencies: + micromark-extension-gfm-autolink-literal: 2.0.0 + micromark-extension-gfm-footnote: 2.0.0 + micromark-extension-gfm-strikethrough: 2.0.0 + micromark-extension-gfm-table: 2.0.0 + micromark-extension-gfm-tagfilter: 2.0.0 + micromark-extension-gfm-task-list-item: 2.0.1 + micromark-util-combine-extensions: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-mdx-expression@3.0.0: + dependencies: + '@types/estree': 1.0.5 + devlop: 1.1.0 + micromark-factory-mdx-expression: 2.0.1 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-events-to-acorn: 2.0.2 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-mdx-jsx@3.0.0: + dependencies: + '@types/acorn': 4.0.6 + '@types/estree': 1.0.5 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + micromark-factory-mdx-expression: 2.0.1 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + vfile-message: 4.0.2 + + micromark-extension-mdx-md@2.0.0: + dependencies: + micromark-util-types: 2.0.0 + + micromark-extension-mdxjs-esm@3.0.0: + dependencies: + '@types/estree': 1.0.5 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.1 + micromark-util-character: 2.1.0 + micromark-util-events-to-acorn: 2.0.2 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + unist-util-position-from-estree: 2.0.0 + vfile-message: 4.0.2 + + micromark-extension-mdxjs@3.0.0: + dependencies: + acorn: 8.11.3 + acorn-jsx: 5.3.2(acorn@8.11.3) + 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 + + micromark-factory-destination@2.0.0: + dependencies: + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-factory-label@2.0.0: + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-factory-mdx-expression@2.0.1: + dependencies: + '@types/estree': 1.0.5 + devlop: 1.1.0 + micromark-util-character: 2.1.0 + micromark-util-events-to-acorn: 2.0.2 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + unist-util-position-from-estree: 2.0.0 + vfile-message: 4.0.2 + + micromark-factory-space@2.0.0: + dependencies: + micromark-util-character: 2.1.0 + micromark-util-types: 2.0.0 + + micromark-factory-title@2.0.0: + dependencies: + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-factory-whitespace@2.0.0: + dependencies: + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-util-character@2.1.0: + dependencies: + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-util-chunked@2.0.0: + dependencies: + micromark-util-symbol: 2.0.0 + + micromark-util-classify-character@2.0.0: + dependencies: + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-util-combine-extensions@2.0.0: + dependencies: + micromark-util-chunked: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-util-decode-numeric-character-reference@2.0.1: + dependencies: + micromark-util-symbol: 2.0.0 + + micromark-util-decode-string@2.0.0: + dependencies: + decode-named-character-reference: 1.0.2 + micromark-util-character: 2.1.0 + micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-symbol: 2.0.0 + + micromark-util-encode@2.0.0: {} + + micromark-util-events-to-acorn@2.0.2: + dependencies: + '@types/acorn': 4.0.6 + '@types/estree': 1.0.5 + '@types/unist': 3.0.2 + devlop: 1.1.0 + estree-util-visit: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + vfile-message: 4.0.2 + + micromark-util-html-tag-name@2.0.0: {} + + micromark-util-normalize-identifier@2.0.0: + dependencies: + micromark-util-symbol: 2.0.0 + + micromark-util-resolve-all@2.0.0: + dependencies: + micromark-util-types: 2.0.0 + + micromark-util-sanitize-uri@2.0.0: + dependencies: + micromark-util-character: 2.1.0 + micromark-util-encode: 2.0.0 + micromark-util-symbol: 2.0.0 + + micromark-util-subtokenize@2.0.1: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-util-symbol@2.0.0: {} + + micromark-util-types@2.0.0: {} + + micromark@4.0.0: + dependencies: + '@types/debug': 4.1.12 + debug: 4.3.4 + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.1 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-combine-extensions: 2.0.0 + micromark-util-decode-numeric-character-reference: 2.0.1 + 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.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + transitivePeerDependencies: + - supports-color + + micromatch@4.0.7: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mime@1.6.0: {} + + mimic-fn@2.1.0: {} + + mimic-fn@4.0.0: {} + + min-indent@1.0.1: {} + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.11 + + minimatch@9.0.3: + dependencies: + brace-expansion: 2.0.1 + + minimatch@9.0.4: + dependencies: + brace-expansion: 2.0.1 + + minimist@1.2.8: {} + + minipass@3.3.6: + dependencies: + yallist: 4.0.0 + + minipass@5.0.0: {} + + minipass@7.1.2: {} + + minizlib@2.1.2: + dependencies: + minipass: 3.3.6 + yallist: 4.0.0 + + mkdirp@1.0.4: {} + + mlly@1.7.1: + dependencies: + acorn: 8.11.3 + pathe: 1.1.2 + pkg-types: 1.1.3 + ufo: 1.5.3 + + ms@2.0.0: {} + + ms@2.1.2: {} + + ms@2.1.3: {} + + multipasta@0.2.2: {} + + mz@2.7.0: + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + + nanoid@3.3.7: {} + + nanoid@5.0.7: {} + + natural-compare@1.4.0: {} + + negotiator@0.6.3: {} + + neo-async@2.6.2: {} + + next-themes@0.2.1(next@14.2.3(@babel/core@7.24.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + next: 14.2.3(@babel/core@7.24.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + next-view-transitions@0.3.0(next@14.2.3(@babel/core@7.24.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + next: 14.2.3(@babel/core@7.24.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + next@14.2.3(@babel/core@7.24.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@next/env': 14.2.3 + '@swc/helpers': 0.5.5 + busboy: 1.6.0 + caniuse-lite: 1.0.30001625 + graceful-fs: 4.2.11 + postcss: 8.4.31 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + styled-jsx: 5.1.1(@babel/core@7.24.7)(react@18.3.1) + optionalDependencies: + '@next/swc-darwin-arm64': 14.2.3 + '@next/swc-darwin-x64': 14.2.3 + '@next/swc-linux-arm64-gnu': 14.2.3 + '@next/swc-linux-arm64-musl': 14.2.3 + '@next/swc-linux-x64-gnu': 14.2.3 + '@next/swc-linux-x64-musl': 14.2.3 + '@next/swc-win32-arm64-msvc': 14.2.3 + '@next/swc-win32-ia32-msvc': 14.2.3 + '@next/swc-win32-x64-msvc': 14.2.3 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + + node-dir@0.1.17: + dependencies: + minimatch: 3.1.2 + + node-domexception@1.0.0: {} + + node-fetch-native@1.6.4: {} + + node-releases@2.0.14: {} + + normalize-path@3.0.0: {} + + normalize-range@0.1.2: {} + + npm-run-path@4.0.1: + dependencies: + path-key: 3.1.1 + + npm-run-path@5.3.0: + dependencies: + path-key: 4.0.0 + + npm-to-yarn@2.2.1: {} + + nypm@0.3.9: + dependencies: + citty: 0.1.6 + consola: 3.2.3 + execa: 8.0.1 + pathe: 1.1.2 + pkg-types: 1.1.3 + ufo: 1.5.3 + + object-assign@4.1.1: {} + + object-hash@3.0.0: {} + + object-inspect@1.13.1: {} + + object-keys@1.1.1: {} + + object.assign@4.1.5: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + has-symbols: 1.0.3 + object-keys: 1.1.1 + + object.entries@1.1.8: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + + object.fromentries@2.0.8: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 + + object.groupby@1.0.3: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + + object.hasown@1.1.4: + dependencies: + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 + + object.values@1.2.0: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + + ohash@1.1.3: {} + + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + + onetime@6.0.0: + dependencies: + mimic-fn: 4.0.0 + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + ora@5.4.1: + dependencies: + bl: 4.1.0 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-spinners: 2.9.2 + is-interactive: 1.0.0 + is-unicode-supported: 0.1.0 + log-symbols: 4.1.0 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@3.0.0: + dependencies: + p-limit: 2.3.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + p-try@2.2.0: {} + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-entities@4.0.1: + dependencies: + '@types/unist': 2.0.10 + character-entities: 2.0.2 + character-entities-legacy: 3.0.0 + character-reference-invalid: 2.0.1 + decode-named-character-reference: 1.0.2 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + is-hexadecimal: 2.0.1 + + parse-ms@3.0.0: {} + + parse5@7.1.2: + dependencies: + entities: 4.5.0 + + parseurl@1.3.3: {} + + path-browserify@1.0.1: {} + + path-exists@3.0.0: {} + + path-exists@4.0.0: {} + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-key@4.0.0: {} + + path-parse@1.0.7: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.2.2 + minipass: 7.1.2 + + path-to-regexp@0.1.7: {} + + path-type@4.0.0: {} + + path-type@5.0.0: {} + + pathe@1.1.2: {} + + pathval@1.1.1: {} + + periscopic@3.1.0: + dependencies: + '@types/estree': 1.0.5 + estree-walker: 3.0.3 + is-reference: 3.0.2 + + picocolors@1.0.1: {} + + picomatch@2.3.1: {} + + pify@2.3.0: {} + + pify@4.0.1: {} + + pirates@4.0.6: {} + + pkg-dir@3.0.0: + dependencies: + find-up: 3.0.0 + + pkg-types@1.1.3: + dependencies: + confbox: 0.1.7 + mlly: 1.7.1 + pathe: 1.1.2 + + possible-typed-array-names@1.0.0: {} + + postcss-import@15.1.0(postcss@8.4.38): + dependencies: + postcss: 8.4.38 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.8 + + postcss-js@4.0.1(postcss@8.4.38): + dependencies: + camelcase-css: 2.0.1 + postcss: 8.4.38 + + postcss-load-config@4.0.2(postcss@8.4.38): + dependencies: + lilconfig: 3.1.1 + yaml: 2.4.2 + optionalDependencies: + postcss: 8.4.38 + + postcss-nested@6.0.1(postcss@8.4.38): + dependencies: + postcss: 8.4.38 + postcss-selector-parser: 6.1.0 + + postcss-selector-parser@6.0.10: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-selector-parser@6.1.0: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-value-parser@4.2.0: {} + + postcss@8.4.31: + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.1 + source-map-js: 1.2.0 + + postcss@8.4.38: + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.1 + source-map-js: 1.2.0 + + prelude-ls@1.2.1: {} + + prettier-plugin-tailwindcss@0.5.14(prettier@3.2.5): + dependencies: + prettier: 3.2.5 + + prettier@3.2.5: {} + + pretty-bytes@6.1.1: {} + + pretty-format@27.5.1: + dependencies: + ansi-regex: 5.0.1 + ansi-styles: 5.2.0 + react-is: 17.0.2 + + pretty-format@29.7.0: + dependencies: + '@jest/schemas': 29.6.3 + ansi-styles: 5.2.0 + react-is: 18.3.1 + + pretty-ms@8.0.0: + dependencies: + parse-ms: 3.0.0 + + process@0.11.10: {} + + prompts@2.4.2: + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + + prop-types@15.8.1: + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + + property-information@6.5.0: {} + + proxy-addr@2.0.7: + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + + proxy-from-env@1.1.0: {} + + punycode@2.3.1: {} + + pure-rand@6.1.0: {} + + qs@6.11.0: + dependencies: + side-channel: 1.0.6 + + queue-microtask@1.2.3: {} + + radix-vue@1.9.0(vue@3.4.31(typescript@5.4.5)): + dependencies: + '@floating-ui/dom': 1.6.7 + '@floating-ui/vue': 1.1.1(vue@3.4.31(typescript@5.4.5)) + '@internationalized/date': 3.5.4 + '@internationalized/number': 3.5.3 + '@tanstack/vue-virtual': 3.8.2(vue@3.4.31(typescript@5.4.5)) + '@vueuse/core': 10.11.0(vue@3.4.31(typescript@5.4.5)) + '@vueuse/shared': 10.11.0(vue@3.4.31(typescript@5.4.5)) + aria-hidden: 1.2.4 + defu: 6.1.4 + fast-deep-equal: 3.1.3 + nanoid: 5.0.7 + vue: 3.4.31(typescript@5.4.5) + transitivePeerDependencies: + - '@vue/composition-api' + + randombytes@2.1.0: + dependencies: + safe-buffer: 5.2.1 + + range-parser@1.2.1: {} + + raw-body@2.5.2: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + + react-dom@18.3.1(react@18.3.1): + dependencies: + loose-envify: 1.4.0 + react: 18.3.1 + scheduler: 0.23.2 + + react-highlight-words@0.20.0(react@18.3.1): + dependencies: + highlight-words-core: 1.2.2 + memoize-one: 4.0.3 + prop-types: 15.8.1 + react: 18.3.1 + + react-is@16.13.1: {} + + react-is@17.0.2: {} + + react-is@18.3.1: {} + + react@18.3.1: + dependencies: + loose-envify: 1.4.0 + + read-cache@1.0.0: + dependencies: + pify: 2.3.0 + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + recast@0.23.9: + dependencies: + ast-types: 0.16.1 + esprima: 4.0.1 + source-map: 0.6.1 + tiny-invariant: 1.3.3 + tslib: 2.6.2 + + recma-import-images@0.0.3: + dependencies: + '@sindresorhus/slugify': 2.2.1 + estree-util-visit: 1.2.1 + + redent@3.0.0: + dependencies: + indent-string: 4.0.0 + strip-indent: 3.0.0 + + reflect.getprototypeof@1.0.6: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + globalthis: 1.0.4 + which-builtin-type: 1.1.3 + + regenerate-unicode-properties@10.1.1: + dependencies: + regenerate: 1.4.2 + + regenerate@1.4.2: {} + + regenerator-runtime@0.14.1: {} + + regenerator-transform@0.15.2: + dependencies: + '@babel/runtime': 7.24.6 + + regexp.prototype.flags@1.5.2: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-errors: 1.3.0 + set-function-name: 2.0.2 + + regexpu-core@5.3.2: + dependencies: + '@babel/regjsgen': 0.8.0 + regenerate: 1.4.2 + regenerate-unicode-properties: 10.1.1 + regjsparser: 0.9.1 + unicode-match-property-ecmascript: 2.0.0 + unicode-match-property-value-ecmascript: 2.1.0 + + regjsparser@0.9.1: + dependencies: + jsesc: 0.5.0 + + rehype-external-links@3.0.0: + dependencies: + '@types/hast': 3.0.4 + '@ungap/structured-clone': 1.2.0 + hast-util-is-element: 3.0.0 + is-absolute-url: 4.0.1 + space-separated-tokens: 2.0.2 + unist-util-visit: 5.0.0 + + rehype-format@5.0.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-embedded: 3.0.0 + hast-util-is-element: 3.0.0 + hast-util-phrasing: 3.0.1 + hast-util-whitespace: 3.0.0 + html-whitespace-sensitive-tag-names: 3.0.0 + rehype-minify-whitespace: 6.0.0 + unist-util-visit-parents: 6.0.1 + + rehype-minify-whitespace@6.0.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-embedded: 3.0.0 + hast-util-is-element: 3.0.0 + hast-util-whitespace: 3.0.0 + unist-util-is: 6.0.0 + + rehype-parse@9.0.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-from-html: 2.0.1 + unified: 11.0.4 + + rehype-raw@7.0.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-raw: 9.0.4 + vfile: 6.0.1 + + rehype-sanitize@6.0.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-sanitize: 5.0.1 + + rehype-stringify@10.0.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.1 + unified: 11.0.4 + + remark-gfm@4.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-gfm: 3.0.0 + micromark-extension-gfm: 3.0.0 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.4 + transitivePeerDependencies: + - supports-color + + remark-mdx@3.0.1: + dependencies: + mdast-util-mdx: 3.0.0 + micromark-extension-mdxjs: 3.0.0 + transitivePeerDependencies: + - supports-color + + remark-parse@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.1 + micromark-util-types: 2.0.0 + unified: 11.0.4 + transitivePeerDependencies: + - supports-color + + remark-rehype@11.1.0: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + mdast-util-to-hast: 13.1.0 + unified: 11.0.4 + vfile: 6.0.1 + + remark-stringify@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-to-markdown: 2.1.0 + unified: 11.0.4 + + remark-unwrap-images@4.0.0: + dependencies: + '@types/mdast': 4.0.4 + hast-util-whitespace: 3.0.0 + unist-util-visit: 5.0.0 + + remark@15.0.1: + dependencies: + '@types/mdast': 4.0.4 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.4 + transitivePeerDependencies: + - supports-color + + require-from-string@2.0.2: {} + + resolve-from@4.0.0: {} + + resolve-pkg-maps@1.0.0: {} + + resolve@1.22.8: + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + resolve@2.0.0-next.5: + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + restore-cursor@3.1.0: + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + + reusify@1.0.4: {} + + rimraf@2.6.3: + dependencies: + glob: 7.2.3 + + rimraf@3.0.2: + dependencies: + glob: 7.2.3 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + safe-array-concat@1.1.2: + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + has-symbols: 1.0.3 + isarray: 2.0.5 + + safe-buffer@5.2.1: {} + + safe-regex-test@1.0.3: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-regex: 1.1.4 + + safer-buffer@2.1.2: {} + + scheduler@0.23.2: + dependencies: + loose-envify: 1.4.0 + + schema-utils@3.3.0: + dependencies: + '@types/json-schema': 7.0.15 + ajv: 6.12.6 + ajv-keywords: 3.5.2(ajv@6.12.6) + + search-insights@2.14.0: {} + + semver@5.7.2: {} + + semver@6.3.1: {} + + semver@7.6.2: {} + + send@0.18.0: + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.0 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + + serialize-javascript@6.0.2: + dependencies: + randombytes: 2.1.0 + + serve-static@1.15.0: + dependencies: + encodeurl: 1.0.2 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.18.0 + transitivePeerDependencies: + - supports-color + + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + + set-function-name@2.0.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + + setprototypeof@1.2.0: {} + + shallow-clone@3.0.1: + dependencies: + kind-of: 6.0.3 + + sharp@0.33.1: + dependencies: + color: 4.2.3 + detect-libc: 2.0.3 + semver: 7.6.2 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.33.1 + '@img/sharp-darwin-x64': 0.33.1 + '@img/sharp-libvips-darwin-arm64': 1.0.0 + '@img/sharp-libvips-darwin-x64': 1.0.0 + '@img/sharp-libvips-linux-arm': 1.0.0 + '@img/sharp-libvips-linux-arm64': 1.0.0 + '@img/sharp-libvips-linux-s390x': 1.0.0 + '@img/sharp-libvips-linux-x64': 1.0.0 + '@img/sharp-libvips-linuxmusl-arm64': 1.0.0 + '@img/sharp-libvips-linuxmusl-x64': 1.0.0 + '@img/sharp-linux-arm': 0.33.1 + '@img/sharp-linux-arm64': 0.33.1 + '@img/sharp-linux-s390x': 0.33.1 + '@img/sharp-linux-x64': 0.33.1 + '@img/sharp-linuxmusl-arm64': 0.33.1 + '@img/sharp-linuxmusl-x64': 0.33.1 + '@img/sharp-wasm32': 0.33.1 + '@img/sharp-win32-ia32': 0.33.1 + '@img/sharp-win32-x64': 0.33.1 + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + shiki@1.10.3: + dependencies: + '@shikijs/core': 1.10.3 + '@types/hast': 3.0.4 + + shiki@1.6.2: + dependencies: + '@shikijs/core': 1.6.2 + + side-channel@1.0.6: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + object-inspect: 1.13.1 + + signal-exit@3.0.7: {} + + signal-exit@4.1.0: {} + + simple-functional-loader@1.2.1: + dependencies: + loader-utils: 2.0.4 + + simple-swizzle@0.2.2: + dependencies: + is-arrayish: 0.3.2 + + sisteransi@1.0.5: {} + + slash@3.0.0: {} + + slash@5.1.0: {} + + source-map-js@1.2.0: {} + + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.6.1: {} + + source-map@0.7.4: {} + + space-separated-tokens@2.0.2: {} + + statuses@2.0.1: {} + + storybook@8.2.0(@babel/preset-env@7.24.7(@babel/core@7.24.7)): + dependencies: + '@babel/core': 7.24.7 + '@babel/types': 7.24.7 + '@storybook/codemod': 8.2.0 + '@storybook/core': 8.2.0 + '@types/semver': 7.5.8 + '@yarnpkg/fslib': 2.10.3 + '@yarnpkg/libzip': 2.3.0 + chalk: 4.1.2 + commander: 6.2.1 + cross-spawn: 7.0.3 + detect-indent: 6.1.0 + envinfo: 7.13.0 + execa: 5.1.1 + fd-package-json: 1.2.0 + find-up: 5.0.0 + fs-extra: 11.2.0 + giget: 1.2.3 + globby: 14.0.2 + jscodeshift: 0.15.2(@babel/preset-env@7.24.7(@babel/core@7.24.7)) + leven: 3.1.0 + ora: 5.4.1 + prettier: 3.2.5 + prompts: 2.4.2 + semver: 7.6.2 + strip-json-comments: 3.1.1 + tempy: 3.1.0 + tiny-invariant: 1.3.3 + ts-dedent: 2.2.0 + transitivePeerDependencies: + - '@babel/preset-env' + - bufferutil + - supports-color + - utf-8-validate + + streamsearch@1.1.0: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + + string.prototype.matchall@4.0.11: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + get-intrinsic: 1.2.4 + gopd: 1.0.1 + has-symbols: 1.0.3 + internal-slot: 1.0.7 + regexp.prototype.flags: 1.5.2 + set-function-name: 2.0.2 + side-channel: 1.0.6 + + string.prototype.trim@1.2.9: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 + + string.prototype.trimend@1.0.8: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + + string.prototype.trimstart@1.0.8: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + stringify-entities@4.0.4: + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + + stringify-object@3.3.0: + dependencies: + get-own-enumerable-property-symbols: 3.0.2 + is-obj: 1.0.1 + is-regexp: 1.0.0 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.0.1 + + strip-bom@3.0.0: {} + + strip-final-newline@2.0.0: {} + + strip-final-newline@3.0.0: {} + + strip-indent@3.0.0: + dependencies: + min-indent: 1.0.1 + + strip-json-comments@3.1.1: {} + + style-mod@4.1.2: {} + + style-to-object@0.4.4: + dependencies: + inline-style-parser: 0.1.1 + + style-to-object@1.0.6: + dependencies: + inline-style-parser: 0.2.3 + + styled-jsx@5.1.1(@babel/core@7.24.7)(react@18.3.1): + dependencies: + client-only: 0.0.1 + react: 18.3.1 + optionalDependencies: + '@babel/core': 7.24.7 + + sucrase@3.35.0: + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + commander: 4.1.1 + glob: 10.4.1 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.6 + ts-interface-checker: 0.1.13 + + supports-color@5.5.0: + dependencies: + has-flag: 3.0.0 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + tabbable@6.2.0: {} + + tailwind-merge@2.3.0: + dependencies: + '@babel/runtime': 7.24.6 + + tailwindcss@3.4.3: + 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.0 + lilconfig: 2.1.0 + micromatch: 4.0.7 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.0.1 + postcss: 8.4.38 + postcss-import: 15.1.0(postcss@8.4.38) + postcss-js: 4.0.1(postcss@8.4.38) + postcss-load-config: 4.0.2(postcss@8.4.38) + postcss-nested: 6.0.1(postcss@8.4.38) + postcss-selector-parser: 6.1.0 + resolve: 1.22.8 + sucrase: 3.35.0 + transitivePeerDependencies: + - ts-node + + tapable@2.2.1: {} + + tar@6.2.1: + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 5.0.0 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + + temp-dir@3.0.0: {} + + temp@0.8.4: + dependencies: + rimraf: 2.6.3 + + tempy@3.1.0: + dependencies: + is-stream: 3.0.0 + temp-dir: 3.0.0 + type-fest: 2.19.0 + unique-string: 3.0.0 + + terser-webpack-plugin@5.3.10(esbuild@0.21.5)(webpack@5.91.0(esbuild@0.21.5)): + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + jest-worker: 27.5.1 + schema-utils: 3.3.0 + serialize-javascript: 6.0.2 + terser: 5.31.0 + webpack: 5.91.0(esbuild@0.21.5) + optionalDependencies: + esbuild: 0.21.5 + + terser@5.31.0: + dependencies: + '@jridgewell/source-map': 0.3.6 + acorn: 8.11.3 + commander: 2.20.3 + source-map-support: 0.5.21 + + text-table@0.2.0: {} + + thenify-all@1.6.0: + dependencies: + thenify: 3.3.1 + + thenify@3.3.1: + dependencies: + any-promise: 1.3.0 + + tiny-invariant@1.3.3: {} + + tinyspy@2.2.1: {} + + tippy.js@6.3.7: + dependencies: + '@popperjs/core': 2.11.8 + + to-fast-properties@2.0.0: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + toidentifier@1.0.1: {} + + trim-lines@3.0.1: {} + + trough@2.2.0: {} + + ts-api-utils@1.3.0(typescript@5.4.5): + dependencies: + typescript: 5.4.5 + + ts-dedent@2.2.0: {} + + ts-interface-checker@0.1.13: {} + + tsconfig-paths@3.15.0: + dependencies: + '@types/json5': 0.0.29 + json5: 1.0.2 + minimist: 1.2.8 + strip-bom: 3.0.0 + + tslib@1.14.1: {} + + tslib@2.6.2: {} + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + type-detect@4.0.8: {} + + type-fest@0.20.2: {} + + type-fest@1.4.0: {} + + type-fest@2.19.0: {} + + type-is@1.6.18: + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + + typed-array-buffer@1.0.2: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-typed-array: 1.1.13 + + typed-array-byte-length@1.0.1: + dependencies: + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + + typed-array-byte-offset@1.0.2: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + + typed-array-length@1.0.6: + dependencies: + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + possible-typed-array-names: 1.0.0 + + typescript@5.4.5: {} + + ufo@1.5.3: {} + + unbox-primitive@1.0.2: + dependencies: + call-bind: 1.0.7 + has-bigints: 1.0.2 + has-symbols: 1.0.3 + which-boxed-primitive: 1.0.2 + + undici-types@5.26.5: {} + + unhead@1.9.15: + dependencies: + '@unhead/dom': 1.9.15 + '@unhead/schema': 1.9.15 + '@unhead/shared': 1.9.15 + hookable: 5.5.3 + + unicode-canonical-property-names-ecmascript@2.0.0: {} + + unicode-match-property-ecmascript@2.0.0: + dependencies: + unicode-canonical-property-names-ecmascript: 2.0.0 + unicode-property-aliases-ecmascript: 2.1.0 + + unicode-match-property-value-ecmascript@2.1.0: {} + + unicode-property-aliases-ecmascript@2.1.0: {} + + unicorn-magic@0.1.0: {} + + unified@11.0.4: + dependencies: + '@types/unist': 3.0.2 + bail: 2.0.2 + devlop: 1.1.0 + extend: 3.0.2 + is-plain-obj: 4.1.0 + trough: 2.2.0 + vfile: 6.0.1 + + unique-string@3.0.0: + dependencies: + crypto-random-string: 4.0.0 + + unist-util-filter@5.0.1: + dependencies: + '@types/unist': 3.0.2 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + + unist-util-find-after@5.0.0: + dependencies: + '@types/unist': 3.0.2 + unist-util-is: 6.0.0 + + unist-util-is@5.2.1: + dependencies: + '@types/unist': 2.0.10 + + unist-util-is@6.0.0: + dependencies: + '@types/unist': 3.0.2 + + unist-util-position-from-estree@2.0.0: + dependencies: + '@types/unist': 3.0.2 + + unist-util-position@5.0.0: + dependencies: + '@types/unist': 3.0.2 + + unist-util-remove-position@5.0.0: + dependencies: + '@types/unist': 3.0.2 + unist-util-visit: 5.0.0 + + unist-util-stringify-position@4.0.0: + dependencies: + '@types/unist': 3.0.2 + + unist-util-visit-parents@5.1.3: + dependencies: + '@types/unist': 2.0.10 + unist-util-is: 5.2.1 + + unist-util-visit-parents@6.0.1: + dependencies: + '@types/unist': 3.0.2 + unist-util-is: 6.0.0 + + unist-util-visit@4.1.2: + dependencies: + '@types/unist': 2.0.10 + unist-util-is: 5.2.1 + unist-util-visit-parents: 5.1.3 + + unist-util-visit@5.0.0: + dependencies: + '@types/unist': 3.0.2 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + + universalify@2.0.1: {} + + unpipe@1.0.0: {} + + update-browserslist-db@1.0.16(browserslist@4.23.0): + dependencies: + browserslist: 4.23.0 + escalade: 3.1.2 + picocolors: 1.0.1 + + uploadthing@6.13.3-canary.7cbef70(express@4.19.2)(next@14.2.3(@babel/core@7.24.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(tailwindcss@3.4.3): + dependencies: + '@effect/platform': 0.58.21(@effect/schema@0.68.18(effect@3.4.8))(effect@3.4.8) + '@effect/schema': 0.68.18(effect@3.4.8) + '@uploadthing/mime-types': 0.2.11-canary.7cbef70 + '@uploadthing/shared': 6.7.9-canary.7cbef70 + effect: 3.4.8 + effect-log: 0.31.5(effect@3.4.8) + optionalDependencies: + express: 4.19.2 + next: 14.2.3(@babel/core@7.24.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + tailwindcss: 3.4.3 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + use-sync-external-store@1.2.0(react@18.3.1): + dependencies: + react: 18.3.1 + + util-deprecate@1.0.2: {} + + util@0.12.5: + dependencies: + inherits: 2.0.4 + is-arguments: 1.1.1 + is-generator-function: 1.0.10 + is-typed-array: 1.1.13 + which-typed-array: 1.1.15 + + utils-merge@1.0.1: {} + + vary@1.1.2: {} + + vfile-location@5.0.2: + dependencies: + '@types/unist': 3.0.2 + vfile: 6.0.1 + + vfile-message@4.0.2: + dependencies: + '@types/unist': 3.0.2 + unist-util-stringify-position: 4.0.0 + + vfile@6.0.1: + dependencies: + '@types/unist': 3.0.2 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.2 + + vue-demi@0.14.8(vue@3.4.31(typescript@5.4.5)): + dependencies: + vue: 3.4.31(typescript@5.4.5) + + vue-router@4.4.0(vue@3.4.31(typescript@5.4.5)): + dependencies: + '@vue/devtools-api': 6.6.3 + vue: 3.4.31(typescript@5.4.5) + + vue-sonner@1.1.3: {} + + vue@3.4.31(typescript@5.4.5): + dependencies: + '@vue/compiler-dom': 3.4.31 + '@vue/compiler-sfc': 3.4.31 + '@vue/runtime-dom': 3.4.31 + '@vue/server-renderer': 3.4.31(vue@3.4.31(typescript@5.4.5)) + '@vue/shared': 3.4.31 + optionalDependencies: + typescript: 5.4.5 + + w3c-keyname@2.2.8: {} + + walk-up-path@3.0.1: {} + + watchpack@2.4.1: + dependencies: + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + + wcwidth@1.0.1: + dependencies: + defaults: 1.0.4 + + web-namespaces@2.0.1: {} + + web-streams-polyfill@4.0.0-beta.3: {} + + webpack-sources@3.2.3: {} + + webpack@5.91.0(esbuild@0.21.5): + dependencies: + '@types/eslint-scope': 3.7.7 + '@types/estree': 1.0.5 + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/wasm-edit': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 + acorn: 8.11.3 + acorn-import-assertions: 1.9.0(acorn@8.11.3) + browserslist: 4.23.0 + chrome-trace-event: 1.0.4 + enhanced-resolve: 5.16.1 + es-module-lexer: 1.5.3 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.0 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 3.3.0 + tapable: 2.2.1 + terser-webpack-plugin: 5.3.10(esbuild@0.21.5)(webpack@5.91.0(esbuild@0.21.5)) + watchpack: 2.4.1 + webpack-sources: 3.2.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + + which-boxed-primitive@1.0.2: + dependencies: + is-bigint: 1.0.4 + is-boolean-object: 1.1.2 + is-number-object: 1.0.7 + is-string: 1.0.7 + is-symbol: 1.0.4 + + which-builtin-type@1.1.3: + dependencies: + function.prototype.name: 1.1.6 + has-tostringtag: 1.0.2 + is-async-function: 2.0.0 + is-date-object: 1.0.5 + is-finalizationregistry: 1.0.2 + is-generator-function: 1.0.10 + is-regex: 1.1.4 + is-weakref: 1.0.2 + isarray: 2.0.5 + which-boxed-primitive: 1.0.2 + which-collection: 1.0.2 + which-typed-array: 1.1.15 + + which-collection@1.0.2: + dependencies: + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.3 + + which-typed-array@1.1.15: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-tostringtag: 1.0.2 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + word-wrap@1.2.5: {} + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + + wrappy@1.0.2: {} + + write-file-atomic@2.4.3: + dependencies: + graceful-fs: 4.2.11 + imurmurhash: 0.1.4 + signal-exit: 3.0.7 + + ws@8.18.0: {} + + y-codemirror.next@0.3.5(@codemirror/state@6.4.1)(@codemirror/view@6.28.4)(yjs@13.6.18): + dependencies: + '@codemirror/state': 6.4.1 + '@codemirror/view': 6.28.4 + lib0: 0.2.94 + yjs: 13.6.18 + optional: true + + yallist@3.1.1: {} + + yallist@4.0.0: {} + + yaml@2.4.2: {} + + yaml@2.4.5: {} + + yjs@13.6.18: + dependencies: + lib0: 0.2.94 + optional: true + + yocto-queue@0.1.0: {} + + zhead@2.2.4: {} + + zod@3.23.8: {} + + zustand@4.5.2(@types/react@18.3.3)(react@18.3.1): + dependencies: + use-sync-external-store: 1.2.0(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + react: 18.3.1 + + zwitch@2.0.4: {} diff --git a/docs/postcss.config.js b/docs/postcss.config.cjs similarity index 73% rename from docs/postcss.config.js rename to docs/postcss.config.cjs index ee5f90b309..12a703d900 100644 --- a/docs/postcss.config.js +++ b/docs/postcss.config.cjs @@ -1,5 +1,6 @@ module.exports = { plugins: { tailwindcss: {}, + autoprefixer: {}, }, }; diff --git a/docs/public/android-chrome-192x192.png b/docs/public/android-chrome-192x192.png deleted file mode 100644 index 26c0039a74..0000000000 Binary files a/docs/public/android-chrome-192x192.png and /dev/null differ diff --git a/docs/public/android-chrome-512x512.png b/docs/public/android-chrome-512x512.png deleted file mode 100644 index 06333e5644..0000000000 Binary files a/docs/public/android-chrome-512x512.png and /dev/null differ diff --git a/docs/public/favicon-16x16.png b/docs/public/favicon-16x16.png deleted file mode 100644 index dddf52390c..0000000000 Binary files a/docs/public/favicon-16x16.png and /dev/null differ diff --git a/docs/public/favicon-32x32.png b/docs/public/favicon-32x32.png deleted file mode 100644 index 745ab34bf0..0000000000 Binary files a/docs/public/favicon-32x32.png and /dev/null differ diff --git a/docs/public/images/blog/incident-report-20240910-og.png b/docs/public/images/blog/incident-report-20240910-og.png new file mode 100644 index 0000000000..e94199ff45 Binary files /dev/null and b/docs/public/images/blog/incident-report-20240910-og.png differ diff --git a/docs/public/images/blog/v7-launch-og.png b/docs/public/images/blog/v7-launch-og.png new file mode 100644 index 0000000000..2337385120 Binary files /dev/null and b/docs/public/images/blog/v7-launch-og.png differ diff --git a/docs/public/og.jpg b/docs/public/og.jpg deleted file mode 100644 index b657a38f6d..0000000000 Binary files a/docs/public/og.jpg and /dev/null differ diff --git a/docs/src/app/(api)/api/og/blog/route.tsx b/docs/src/app/(api)/api/og/blog/route.tsx new file mode 100644 index 0000000000..e25446512b --- /dev/null +++ b/docs/src/app/(api)/api/og/blog/route.tsx @@ -0,0 +1,97 @@ +import { ImageResponse } from "next/og"; + +import { blogParams, getFont } from "../utils"; + +export const runtime = "edge"; + +export const GET = async (req: Request) => { + const poppins = await getFont({ + family: "Poppins", + weights: [400, 700, 900], + }); + + const parsed = blogParams.decodeRequest(req); + + if (!parsed.success) { + return new Response(parsed.error.toString(), { status: 400 }); + } + + const props = parsed.data.input; + + return new ImageResponse( + ( +
+
+ +

{props.title}

+
+ {props.authors.map((author) => ( +
+ + {props.authors.length < 2 && ( +
+

{author.name}

+

{author.role}

+
+ )} +
+ ))} +
+
+
+ ), + { + width: 1200, + height: 600, + fonts: [ + { name: "Poppins", data: poppins[900], weight: 900 }, + { name: "Poppins", data: poppins[700], weight: 700 }, + { name: "Poppins", data: poppins[400], weight: 400 }, + ], + }, + ); +}; + +const Logo = () => ( +
+ + + {" "} + + + + + + +
+); diff --git a/docs/src/app/(api)/api/og/docs/route.tsx b/docs/src/app/(api)/api/og/docs/route.tsx new file mode 100644 index 0000000000..29a99cd0f8 --- /dev/null +++ b/docs/src/app/(api)/api/og/docs/route.tsx @@ -0,0 +1,86 @@ +import { ImageResponse } from "next/og"; + +import { docsParams, getFont } from "../utils"; + +export const runtime = "edge"; + +export const GET = async (req: Request) => { + const poppins = await getFont({ + family: "Poppins", + weights: [400, 700, 900], + }); + + const parsed = docsParams.decodeRequest(req); + + if (!parsed.success) { + return new Response(parsed.error.toString(), { status: 400 }); + } + + const props = parsed.data.input; + + return new ImageResponse( + ( +
+
+ +

{props.category}

+

{props.title}

+

{props.description}

+
+
+ ), + { + width: 1200, + height: 600, + fonts: [ + { name: "Poppins", data: poppins[900], weight: 900 }, + { name: "Poppins", data: poppins[700], weight: 700 }, + { name: "Poppins", data: poppins[400], weight: 400 }, + ], + }, + ); +}; + +const Logo = () => ( +
+ + + {" "} + + + + + + +
+); diff --git a/docs/src/app/(api)/api/og/page.tsx b/docs/src/app/(api)/api/og/page.tsx new file mode 100644 index 0000000000..aff025f76a --- /dev/null +++ b/docs/src/app/(api)/api/og/page.tsx @@ -0,0 +1,67 @@ +import { blogParams, docsParams } from "./utils"; + +export default async function Page() { + return ( +
+
+

Landing (todo)

+ OpenGraph metadata for the landing +
+ +
+

Docs

+ OpenGraph metadata for the page +
+ +
+

Blog

+ OpenGraph metadata for blog posts + OpenGraph metadata for blog posts +
+
+ ); +} diff --git a/docs/src/app/(api)/api/og/utils.ts b/docs/src/app/(api)/api/og/utils.ts new file mode 100644 index 0000000000..b1573c09fe --- /dev/null +++ b/docs/src/app/(api)/api/og/utils.ts @@ -0,0 +1,109 @@ +import { z } from "zod"; + +type Primitives = string | number | boolean | null; +type JsonValue = Primitives | JsonValue[] | { [key: string]: JsonValue }; + +const jsonStr = z.string().transform((str, ctx) => { + try { + return JSON.parse(str) as JsonValue; + } catch (error) { + ctx.addIssue({ code: "custom", message: "Needs to be JSON" }); + } +}); + +export function zodParams(schema: z.ZodType) { + const querySchema = z.object({ + input: jsonStr.pipe(schema), + }); + return { + decodeRequest: (req: Request) => { + const url = new URL(req.url); + const obj = Object.fromEntries(url.searchParams.entries()); + + return querySchema.safeParse(obj); + }, + toSearchString: (obj: (typeof schema)["_input"]) => { + schema.parse(obj); + return `input=${encodeURIComponent(JSON.stringify(obj))}`; + }, + }; +} + +function truncateWordsFn(str: string, maxCharacters: number) { + if (str.length <= maxCharacters) { + return str; + } + // break at closest word + const truncated = str.slice(0, maxCharacters); + const lastSpace = truncated.lastIndexOf(" "); + return truncated.slice(0, lastSpace) + " …"; +} +function truncatedWordSchema(opts: { maxCharacters: number }) { + return z + .string() + .transform((str) => truncateWordsFn(str, opts.maxCharacters)); +} + +export const docsParams = zodParams( + z.object({ + title: z.string(), + category: z.string(), + description: truncatedWordSchema({ maxCharacters: 215 }), + }), +); + +export const blogParams = zodParams( + z.object({ + authors: z.array( + z.object({ name: z.string(), role: z.string(), src: z.string() }), + ), + title: z.string(), + }), +); + +export const getFont = async ({ + family, + weights, + text, +}: { + family: string; + weights: TWeights; + text?: string; +}) => { + const sorted = [...weights].sort(); + const API = `https://fonts.googleapis.com/css2?family=${family}:wght@${sorted.join( + ";", + )}${text ? `&text=${encodeURIComponent(text)}` : ""}`; + + const css = (await ( + await fetch(API, { + headers: { + // Make sure it returns TTF. + "User-Agent": + "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; de-at) AppleWebKit/533.21.1 (KHTML, like Gecko) Version/5.0.5 Safari/533.21.1", + }, + }) + ).text()) as string; + + const fonts = css + .split("@font-face {") + .splice(1) + .map((font) => { + const u = font.match(/src: url\((.+)\) format\('(opentype|truetype)'\)/); + const w = font.match(/font-weight: (\d+)/); + return u?.[1] && w?.[1] ? { url: u[1], weight: parseInt(w[1]) } : null; + }) + .filter( + (font): font is { url: string; weight: TWeights[number] } => !!font, + ); + + const promises = fonts.map(async (font) => { + const res = await fetch(font.url); + return [font.weight, await res.arrayBuffer()]; + }); + + return Object.fromEntries(await Promise.all(promises)) as Record< + TWeights[number], + ArrayBuffer + >; +}; diff --git a/docs/src/pages/api/uploadthing.ts b/docs/src/app/(api)/api/uploadthing/route.ts similarity index 59% rename from docs/src/pages/api/uploadthing.ts rename to docs/src/app/(api)/api/uploadthing/route.ts index 850c58564c..7b03e01244 100644 --- a/docs/src/pages/api/uploadthing.ts +++ b/docs/src/app/(api)/api/uploadthing/route.ts @@ -1,4 +1,4 @@ -import { createRouteHandler, createUploadthing } from "uploadthing/next-legacy"; +import { createRouteHandler, createUploadthing } from "uploadthing/next"; const f = createUploadthing(); const router = { @@ -9,8 +9,12 @@ const router = { }) .onUploadComplete(() => {}), }; +export type UploadRouter = typeof router; -export default createRouteHandler({ +export const { GET, POST } = createRouteHandler({ router, - config: { uploadthingSecret: "sk_foo" }, + config: { + token: + "eyJhcHBJZCI6ImFwcC0xIiwiYXBpS2V5Ijoic2tfZm9vIiwicmVnaW9ucyI6WyJmcmExIl19", + }, }); diff --git a/docs/src/app/(docs)/api-reference/client/page.mdx b/docs/src/app/(docs)/api-reference/client/page.mdx new file mode 100644 index 0000000000..0a05ccee86 --- /dev/null +++ b/docs/src/app/(docs)/api-reference/client/page.mdx @@ -0,0 +1,274 @@ +import { docsMetadata } from "@/lib/utils"; + +export const metadata = docsMetadata({ + title: "uploadthing/client", + description: + "The UploadThing Client module provides utilities for working files in your application and communicating with your backend file router.", + category: "API Reference", +}); + +# uploadthing/client + +The UploadThing Client module provides utilities for working files in your +application and communicating with your backend file router. + +## `uploadFiles` {{ tag: 'function', since: '5.0' }} + +This function is used to perform +[client side uploads](/uploading-files#client-side-uploads) by requesting +presigned URLs from your backend file router, and then uploading the files to +the storage provider. + +Use the `genUploader` factory function to generate a typed function that matches +the signature of your file router, which will allow autocompletion and type +checking on endpoint, route input and callback data types. + +```ts +import { genUploader } from "uploadthing/client"; + +import type { UploadRouter } from "~/server/uploadthing"; + +export const { uploadFiles } = genUploader(); + +const response = await uploadFiles("routeEndpoint", { + files: [], +}); +``` + +### Parameters + +The first parameter is the route endpoint to upload to, and the second parameter +is an options object: + + + + An array of files to upload. + + + Input JSON data matching your validator set on the [FileRoute](/file-routes#input) + to send with the request. + + + Headers to be sent along the request to request the presigned URLs. Useful + for authentication outside full-stack framework setups. + + + An abort signal to abort the upload. + + + Callback function called after the presigned URLs have been retrieved, just before + the files are uploaded to the storage provider. + + + Callback function that gets continuously called as the file is uploaded to the storage provider. + + + + +### Returns + +The function returns a `Promise` that resolves to an array of objects: + + + + The name of the file. + + + The size of the file in bytes. + + + The type of the file. + + + The file key of the file. + + + The url of the file. + + + The custom id of the file, if provided on upload. + + + The data returned from the `onUploadComplete` callback on the file route. + This will be `null` if `RouteOptions.awaitServerData` isn't enabled. + + + +## `createUpload` {{ tag: 'function', since: '7.0' }} + +Create a resumable upload. Resumable uploads allows you to start an upload, +pause it, and then resume it at a later time. As long as the presigned URL is +valid, you can continue the upload from where it left off. + +As for `uploadFiles`, use the `genUploader` factory function to generate a typed +function that matches the signature of your file router, which will allow +autocompletion and type checking on endpoint, route input and callback data +types. + +```ts +import { genUploader } from "uploadthing/client"; + +import type { UploadRouter } from "~/server/uploadthing"; + +export const { createUpload } = genUploader(); + +// Create the upload. The files will start uploading immediately. +const { pauseUpload, resumeUpload, done } = createUpload("routeEndpoint", { + files: [], +}); + +// Pause the upload of a file +pauseUpload(file); + +// Resume the upload of a file +resumeUpload(file); + +// Await the completion of all files +const files = await done(); +``` + +### Parameters + +The first parameter is the route endpoint to upload to, and the second parameter +is an options object: + + + + An array of files to upload. + + + Input JSON data matching your validator set on the + [FileRoute](/file-routes#input) to send with the request. + + + Headers to be sent along the request to request the presigned URLs. Useful + for authentication outside full-stack framework setups. + + + Callback function that gets continuously called as the file is uploaded to + the storage provider. + + + +### Returns + + + + Pause the upload of a file. If no file is provided, all files will be + paused. + + + Resume the upload of a file. If no file is provided, all files will be + resumed. + + + Await the completion of the upload of a file. If no file is provided, all + files will be awaited. The returned object is the same as the one returned + by `uploadFiles`. If a file is provided, the function returns an object, + else it returns an array. + + + +## `generateClientDropzoneAccept` {{ tag: 'function', since: '6.0' }} + +Generate an accepted object that can be passed to the `accept` prop of a +`useDropzone` hook or `Dropzone` component. + +### Parameters + + + + The route config to generate the accept props for. + + + +### Returns + +`object` + +## `generateMimeTypes` {{ tag: 'function', since: '6.0' }} + +Generate an array of accepted mime types given a route config. + +### Parameters + + + + The route config to generate the accept props for. + + + +### Returns + +`string[]` + +## `generatePermittedFileTypes` {{ tag: 'function', since: '6.0' }} + +Utility function to generate accept props for a `` element. + +### Parameters + + + + The route config to generate the accept props for. + + + +### Returns + + + + The route config to generate the accept props for. + + + Whether the accept props should be for multiple files. + + + +## `isValidSize` {{ tag: 'function', since: '6.11' }} + +This function is used to validate that a file is of a valid size given a route +config. + +### Parameters + + + + The size of the file to validate. + + + The maximum size of the file to validate. + + + +### Returns + +`boolean` + +## `isValidType` {{ tag: 'function', since: '6.11' }} + +This function is used to validate that a file is of a valid type given a route +config. + +### Parameters + + + + The type of the file to validate. + + + The allowed types of the file to validate. + + + +### Returns + +`boolean` diff --git a/docs/src/app/(docs)/api-reference/expo/page.mdx b/docs/src/app/(docs)/api-reference/expo/page.mdx new file mode 100644 index 0000000000..02bf963144 --- /dev/null +++ b/docs/src/app/(docs)/api-reference/expo/page.mdx @@ -0,0 +1,211 @@ +import { docsMetadata } from "@/lib/utils"; + +export const metadata = docsMetadata({ + title: "@uploadthing/expo", + description: "Expo bindings for UploadThing.", + category: "API Reference", +}); + +# UploadThing Expo + +Expo bindings for UploadThing. + +## `generateReactNativeHelpers` {{ tag: 'function', since: '6.6' }} + +The `generateReactNativeHelpers` function is used to generate the +useImageUploader and useDocumentUploader hooks you use to interact with +UploadThing in your app. + +```tsx {{ title: "utils/uploadthing.tsx" }} +import { generateReactNativeHelpers } from "@uploadthing/expo"; + +import type { UploadRouter } from "~/app/api/uploadthing+api"; + +export const { useImageUploader, useDocumentUploader } = + generateReactNativeHelpers({ + /** + * Your server url. + * @default process.env.EXPO_PUBLIC_SERVER_URL + * @remarks In dev we will also try to use Expo.debuggerHost + */ + url: "https://my-server.com", + }); +``` + +## `useImageUploader` {{ tag: 'hook', since: '6.6' }} + +A hook wrapping the native `expo-image-picker` module that allows access to the +camera and photo library and uploads files to your server. The first time the +user triggers the picker they will be prompted to grant your app permission to +access the camera or photo library. + +```tsx {{ title: "app/example-uploader.tsx" }} +import { Alert, Pressable, Text, View } from "react-native"; + +import { useImageUploader } from "@uploadthing/expo"; + +export function MultiUploader() { + const { openImagePicker, isUploading } = useImageUploader("imageUploader", { + /** + * Any props here are forwarded to the underlying `useUploadThing` hook. + * Refer to the React API reference for more info. + */ + onClientUploadComplete: () => Alert.alert("Upload Completed"), + onUploadError: (error) => Alert.alert("Upload Error", error.message), + }); + + return ( + + { + openImagePicker({ + input, // Matches the input schema from the FileRouter endpoint + source: "library", // or "camera" + onInsufficientPermissions: () => { + Alert.alert( + "No Permissions", + "You need to grant permission to your Photos to use this", + [ + { text: "Dismiss" }, + { text: "Open Settings", onPress: openSettings }, + ], + ); + }, + }); + }} + > + Select Image + + + ); +} +``` + +### Parameters + + + + The name of the [route](./server#FileRouter) you want this button to upload + to + + + Props forwarded to the underlying `useUploadThing` hook from + `@uploadthing/react` + + + +### Returns + + + + Function to open the native image picker and start uploading the selected + files. + + ```ts + type OpenImagePickerOptions = { + input: TInput // Matches the input schema from the FileRouter endpoint + source: 'library' | 'camera' + /** + * Callback to run if the user cancels the picker. + */ + onCancel?: () => void + /** + * Callback to run if the user hasn't granted your app permission to the camera or photo library. + */ + onInsufficientPermissions: () => void + } + ``` + + + + Flag whether file(s) are currently uploading + + + +## `useDocumentUploader` {{ tag: 'hook', since: '6.6' }} + +A hook wrapping the native `expo-document-picker` module that allows access to +the native file system and uploads files to your server. + +```tsx {{ title: "app/example-uploader.tsx" }} +import { Alert, Pressable, Text, View } from "react-native"; + +import { useDocumentUploader } from "@uploadthing/expo"; + +export function MultiUploader() { + const { openDocumentPicker, isUploading } = useDocumentUploader("document", { + /** + * Any props here are forwarded to the underlying `useUploadThing` hook. + * Refer to the React API reference for more info. + */ + onClientUploadComplete: () => Alert.alert("Upload Completed"), + onUploadError: (error) => Alert.alert("Upload Error", error.message), + }); + + return ( + + { + openDocumentPicker({ + input, // Matches the input schema from the FileRouter endpoint + onInsufficientPermissions: () => { + Alert.alert( + "No Permissions", + "You need to grant permission to your Photos to use this", + [ + { text: "Dismiss" }, + { text: "Open Settings", onPress: openSettings }, + ], + ); + }, + }); + }} + > + Select Document + + + ); +} +``` + +### Paramerers + + + + The name of the [route](./server#FileRouter) you want this button to upload + to + + + Props forwarded to the underlying `useUploadThing` hook from + `@uploadthing/react` + + + +### Returns + + + + Function to open the native image picker and start uploading the selected + files. + + ```ts + type OpenImagePickerOptions = { + input: TInput // Matches the input schema from the FileRouter endpoint + /** + * Callback to run if the user cancels the picker. + */ + onCancel?: () => void + } + ``` + + + + Flag whether file(s) are currently uploading + + diff --git a/docs/src/app/(docs)/api-reference/openapi-spec/page.mdx b/docs/src/app/(docs)/api-reference/openapi-spec/page.mdx new file mode 100644 index 0000000000..dc8cfdc8ad --- /dev/null +++ b/docs/src/app/(docs)/api-reference/openapi-spec/page.mdx @@ -0,0 +1,18 @@ +import { docsMetadata } from "@/lib/utils"; + +export const metadata = docsMetadata({ + title: "OpenAPI Specification", + description: + "The UploadThing REST API specification for developers building SDKs", + category: "API Reference", +}); + +# UploadThing REST API Specification + +You can use the UploadThing REST API to build SDKs for languages and frameworks +we don't natively support. The API is designed to be simple and easy to use. The +latest version of all endpoints are documented here. + +import { Scalar } from "./scalar-server"; + + diff --git a/docs/src/app/(docs)/api-reference/openapi-spec/scalar-client.tsx b/docs/src/app/(docs)/api-reference/openapi-spec/scalar-client.tsx new file mode 100644 index 0000000000..89a2c51831 --- /dev/null +++ b/docs/src/app/(docs)/api-reference/openapi-spec/scalar-client.tsx @@ -0,0 +1,88 @@ +"use client"; + +// import '@scalar/api-reference-react/style.css' +import { RefObject, useEffect, useRef, useState } from "react"; +import { ApiReferenceReact } from "@scalar/api-reference-react"; +import { useTheme } from "next-themes"; + +const specUrl = "https://api.uploadthing.com/openapi-spec.json"; + +const useMutationObserver = ( + ref: RefObject, + callback: (...args: Parameters) => boolean, + options = { + attributes: true, + characterData: true, + childList: true, + subtree: true, + }, +) => { + useEffect(() => { + if (ref.current) { + const observer = new MutationObserver((args) => { + if (callback(args, observer)) { + observer.disconnect(); + } + }); + observer.observe(ref.current, options); + return () => observer.disconnect(); + } + }, [callback, options]); +}; + +export function Loader() { + return ( +
+
+
+
+
+
+
+ ); +} + +export default function ScalarApiRef() { + const theme = useTheme(); + const isDark = theme.resolvedTheme === "dark"; + + const [loaded, setLoaded] = useState(false); + + const ref = useRef(null); + useMutationObserver(ref, (args) => { + if ( + args.filter( + (a) => + a.type === "attributes" && + a.target instanceof Element && + a.target.classList.contains("scalar-app") && + a.target.classList.contains("references-layout"), + ).length > 0 + ) { + setLoaded(true); + return true; + } + + return false; + }); + + return ( +
+ {!loaded && } + +
+ ); +} diff --git a/docs/src/app/(docs)/api-reference/openapi-spec/scalar-server.tsx b/docs/src/app/(docs)/api-reference/openapi-spec/scalar-server.tsx new file mode 100644 index 0000000000..9075de485a --- /dev/null +++ b/docs/src/app/(docs)/api-reference/openapi-spec/scalar-server.tsx @@ -0,0 +1,9 @@ +import ScalarApiRef from "./scalar-client"; + +export function Scalar() { + return ( +
+ +
+ ); +} diff --git a/docs/src/app/(docs)/api-reference/react/page.mdx b/docs/src/app/(docs)/api-reference/react/page.mdx new file mode 100644 index 0000000000..b056353e49 --- /dev/null +++ b/docs/src/app/(docs)/api-reference/react/page.mdx @@ -0,0 +1,594 @@ +import { docsMetadata } from "@/lib/utils"; + +export const metadata = docsMetadata({ + title: "@uploadthing/react", + description: "React bindings for UploadThing.", + category: "API Reference", +}); + +# UploadThing React + +React bindings for UploadThing. + +## generateComponents {{ tag: 'factory', deprecated: true }} + + + As of `v6.2.1`, the `generateComponents` function has been deprecated in favor + of the `generateUploadButton` and `generateUploadDropzone` functions to + improve tree-shaking. + + +The `generateComponents` function is used to generate the UploadButton and +UploadDropzone components you use to interact with UploadThing. Generating +components allows for fully typesafe components bound to the type of your file +router. + +```tsx {{ title: "utils/uploadthing.tsx" }} +import { generateComponents } from "@uploadthing/react"; + +import type { OurFileRouter } from "~/app/api/uploadthing/core"; + +export const { UploadButton, UploadDropzone } = + generateComponents(); +``` + +## generateUploadButton {{ tag: 'factory', since: '6.2' }} + +The `generateUploadButton` function is used to generate the UploadButton +component you use to interact with UploadThing. Generating components allows for +fully typesafe components bound to the type of your file router. + +```tsx {{ title: "utils/uploadthing.tsx" }} +import { generateUploadButton } from "@uploadthing/react"; + +export const UploadButton = generateUploadButton(); +``` + +### Parameters + + + + The url to where you are serving your uploadthing file router. + + Required if your [route + handler](/api-reference/server#create-route-handler) is not served from + `/api/uploadthing` + + + + +### Returns + +[`UploadButton`](/api-reference/react#upload-button) + +## generateUploadDropzone {{ tag: 'factory', since: '6.2' }} + +The `generateUploadDropzone` function is used to generate the UploadDropzone +component you use to interact with UploadThing. Generating components allows for +fully typesafe components bound to the type of your file router. + +```tsx {{ title: "utils/uploadthing.tsx" }} +import { generateUploadDropzone } from "@uploadthing/react"; + +export const UploadDropzone = generateUploadDropzone(); +``` + +### Parameters + + + + The url to where you are serving your uploadthing file router. + + Required if your [route + handler](/api-reference/server#create-route-handler) is not served from + `/api/uploadthing` + + + + +### Returns + +[`UploadDropzone`](/api-reference/react#upload-dropzone) + +## generateReactHelpers {{ tag: 'factory', since: '5.0' }} + +The `generateReactHelpers` function is used to generate the +[useUploadThing](/api-reference/react#use-upload-thing) hook and the +[uploadFiles]/api-reference/client#upload-files) functions you use to interact +with UploadThing in custom components. It takes your File Router as a generic + +```tsx +import { generateReactHelpers } from "@uploadthing/react"; + +import type { OurFileRouter } from "~/app/api/uploadthing/core"; + +export const { useUploadThing, uploadFiles } = + generateReactHelpers(); +``` + +### Parameters + + + + The url to where you are serving your uploadthing file router. + + Required if your [route + handler](/api-reference/server#create-route-handler) is not served from + `/api/uploadthing` + + + + +### Returns + + + + The typed [useUploadThing](/api-reference/react#use-upload-thing) hook + + + The typed [uploadFiles](/api-reference/client#upload-files) function + + + Get the config for a given endpoint outside of React context. + Can only be used if the NextSSRPlugin is used in the app. + + + +## UploadButton {{ tag: 'component', since: '5.0' }} + + + We strongly recommend using the + [`generateUploadButton`](/api-reference/react#generate-upload-button) function + instead of importing it from `@uploadthing/react` directly for a fully + typesafe component. + + +A simple button that opens the native file picker and uploads the selected +files. The default button is shown below. See [Theming](/concepts/theming) on +how to customize it. + +import { UploadButton } from "@/components/UploadThing"; + + + +```tsx {{ title: "app/example-uploader.tsx" }} +import { UploadButton } from "@uploadthing/react"; + +import { OurFileRouter } from "./api/uploadthing/core"; + +export const OurUploadButton = () => ( + + endpoint="imageUploader" + onClientUploadComplete={(res) => { + // Do something with the response + console.log("Files: ", res); + alert("Upload Completed"); + }} + onUploadError={(error: Error) => { + // Do something with the error. + alert(`ERROR! ${error.message}`); + }} + onBeforeUploadBegin={(files) => { + // Preprocess files before uploading (e.g. rename them) + return files.map( + (f) => new File([f], "renamed-" + f.name, { type: f.type }), + ); + }} + onUploadBegin={(name) => { + // Do something once upload begins + console.log("Uploading: ", name); + }} + /> +); +``` + +### Props + + + + The name/slug of the [route](/file-routes) you want to upload to + + + Input JSON data matching your validator set on the [FileRoute](/file-routes#input) + to send with the request. + + + Headers to be sent along the request to request the presigned URLs. Useful + for authentication outside full-stack framework setups. + + + Callback function that runs **after** the serverside + [`onUploadComplete`](/file-routes#on-upload-complete) callback. + ```ts + export type UploadFileResponse = { + name: string + size: number + key: string + url: string + customId: string | null + // The data returned from the `onUploadComplete` callback on + // the file route. Note that if `RouteOptions.awaitServerData` + // isn't enabled this will be `null`. + serverData: TServerOutput + } + ``` + + + + Callback function when that runs when an upload fails. + + + Callback function when that runs when an upload is aborted. + + + Callback function that gets continuously called as the file is uploaded to + the storage provider. + + + Callback function called before requesting the presigned URLs. The files + returned are the files that will be uploaded, meaning you can use this to + e.g. rename or resize the files. + + + Callback function called after the presigned URLs have been retrieved, just + before the files are uploaded to the storage provider. + + + Disables the button. + + + Enables ability to paste files from clipboard when the button is focused. + + + Set the mode of the button. 'auto' triggers upload right after selection, + 'manual' requires an extra click to start uploading. + + + Function that merges classes together. May be required if you are [are theming components with TailwindCSS](/concepts/theming#theming-with-tailwind-css) + and your classes are not applied correctly. + + + + + If you want to disable the button based on when your `input` is not satisfied, + you can place your validator in a shared file, so that you can import it in + both the server-side `.input()` and on the client-side for your `disabled` + prop logic. + + +## UploadDropzone {{ tag: 'component', since: '5.0' }} + + + We strongly recommend using the + [`generateUploadDropzone`](/api-reference/react#generate-upload-dropzone) + function instead of importing it from `@uploadthing/react` directly for a + fully typesafe component. + + +A `react-dropzone` powered dropzone that let's you drag and drop files to +upload. The default dropzone is shown below. See [Theming](/concepts/theming) on +how to customize it. + +import { UploadDropzone } from "@/components/UploadThing"; + + + +```tsx {{ title: "app/example-uploader.tsx" }} +import { UploadDropzone } from "@uploadthing/react"; + +import { OurFileRouter } from "./api/uploadthing/core"; + +export const OurUploadDropzone = () => ( + + endpoint="withoutMdwr" + onClientUploadComplete={(res) => { + // Do something with the response + console.log("Files: ", res); + alert("Upload Completed"); + }} + onUploadError={(error: Error) => { + alert(`ERROR! ${error.message}`); + }} + onUploadBegin={(name) => { + // Do something once upload begins + console.log("Uploading: ", name); + }} + onDrop={(acceptedFiles) => { + // Do something with the accepted files + console.log("Accepted files: ", acceptedFiles); + }} + /> +); +``` + +### Props + + + + The name/slug of the [route](/file-routes) you want to upload to upload to + + + Input JSON data matching your validator set on the [FileRoute](/file-routes#input) + to send with the request. + + + Headers to be sent along the request to request the presigned URLs. Useful + for authentication outside full-stack framework setups. + + + Callback function that runs **after** the serverside + [`onUploadComplete`](/file-routes#on-upload-complete) callback. + ```ts + export type UploadFileResponse = { + name: string + size: number + key: string + url: string + customId: string | null + // The data returned from the `onUploadComplete` callback on + // the file route. Note that if `RouteOptions.awaitServerData` + // isn't enabled this will be `null`. + serverData: TServerOutput + } + ``` + + + + Callback function when that runs when an upload fails. + + + Callback function when that runs when an upload is aborted. + + + Callback function that gets continuously called as the file is uploaded to + the storage provider. + + + Callback function called before requesting the presigned URLs. The files + returned are the files that will be uploaded, meaning you can use this to + e.g. rename or resize the files. + + + Callback function called after the presigned URLs have been retrieved, just + before the files are uploaded to the storage provider. + + + Disables the button. + + + Enables ability to paste files from clipboard when the button is focused. + + + Set the mode of the button. 'auto' triggers upload right after selection, + 'manual' requires an extra click to start uploading. + + + Function that merges classes together. May be required if you are [are theming components with TailwindCSS](/concepts/theming#theming-with-tailwind-css) + and your classes are not applied correctly. + + + + + If you want to disable the dropzone based on when your `input` is not + satisfied, you can place your validator in a shared file, so that you can + import it in both the server-side `.input()` and on the client-side for your + `disabled` prop logic. + + +## useDropzone {{ tag: 'hook', since: '5.6' }} + +This hook is currently a minified fork of +[react-dropzone](https://github.com/react-dropzone/react-dropzone) with better +ESM support. See [their docs](https://react-dropzone.js.org/) for reference. + +You can import the minified hook from `@uploadthing/react`. If you need access +to any of the removed APIs, you should import the original hook from +`react-dropzone`. + + + This hook isn't strictly covered by semver as we might make changes to tailor + it to our needs in a future minor release. Migration guides will be provided + if this happens. + + +## useUploadThing {{ tag: 'hook', since: '5.0' }} + +This hook provides a function to start uploading, an `isUploading` state, and +the `permittedFileInfo` which gives information about what file types, sizes and +counts are allowed by the endpoint. + + + You have to generate this hook using the + [`generateReactHelpers`](/api-reference/react#generate-react-helpers) + function. + + +### Parameters + +The first parameter is the route endpoint to upload to, and the second parameter +is an options object: + + + + An array of files to upload. + + + Headers to be sent along the request to request the presigned URLs. Useful + for authentication outside full-stack framework setups. + + + An abort signal to abort the upload. + + + Callback function that runs **after** the serverside + [`onUploadComplete`](/file-routes#on-upload-complete) callback. + ```ts + export type UploadFileResponse = { + name: string + size: number + key: string + url: string + customId: string | null + // The data returned from the `onUploadComplete` callback on + // the file route. Note that if `RouteOptions.awaitServerData` + // isn't enabled this will be `null`. + serverData: TServerOutput + } + ``` + + + Callback function when that runs when an upload fails. + + + Callback function when that runs when an upload is aborted. + + + Callback function that gets continuously called as the file is uploaded to + the storage provider. + + + Callback function called after the presigned URLs have been retrieved, just + before the files are uploaded to the storage provider. + + + +### Returns + + + + Function to start the upload. `TInput` is inferred from what you've defined + on [the fileroute](/file-routes#input) on the backend. + + + Flag for if file(s) are currently uploading + + + Information on permitted file types, sizes, and counts etc. + + + Information on permitted file types, sizes, and counts etc. + + + +### Example + +The following example shows a simple dropzone component using the `useDropzone` +and `useUploadThing` hooks. For a more complete example, take a look at +[our prebuilt components](https://github.com/pingdotgg/uploadthing/tree/main/packages/react/src/components). + +```tsx {{ title: "app/example-custom-uploader.tsx" }} +// import { useDropzone } from "@uploadthing/react"; +import { generateClientDropzoneAccept } from "uploadthing/client"; + +import { useUploadThing } from "~/utils/uploadthing"; + +export function MultiUploader() { + const [files, setFiles] = useState([]); + const onDrop = useCallback((acceptedFiles: File[]) => { + setFiles(acceptedFiles); + }, []); + + const { startUpload, routeConfig } = useUploadThing("myUploadEndpoint", { + onClientUploadComplete: () => { + alert("uploaded successfully!"); + }, + onUploadError: () => { + alert("error occurred while uploading"); + }, + onUploadBegin: () => { + alert("upload has begun"); + }, + }); + + const { getRootProps, getInputProps } = useDropzone({ + onDrop, + accept: generateClientDropzoneAccept( + generatePermittedFileTypes(routeConfig).fileTypes, + ), + }); + + return ( +
+ +
+ {files.length > 0 && ( + + )} +
+ Drop files here! +
+ ); +} +``` diff --git a/docs/src/app/(docs)/api-reference/server/page.mdx b/docs/src/app/(docs)/api-reference/server/page.mdx new file mode 100644 index 0000000000..c3111a3da3 --- /dev/null +++ b/docs/src/app/(docs)/api-reference/server/page.mdx @@ -0,0 +1,315 @@ +import { docsMetadata } from "@/lib/utils"; + +export const metadata = docsMetadata({ + title: "uploadthing/server", + description: "Server bindings for UploadThing.", + category: "API Reference", +}); + +# UploadThing Server + +Server bindings for UploadThing. + +## createUploadthing {{ tag: 'function', since: '5.0' }} + +The helper function to create an UploadThing instance. MAKE SURE YOU IMPORT IT +FROM THE RIGHT PLACE. The export name ensures your file routes' +[`middleware`](/api-reference/file-routes#middleware) functions are typed +correctly. + + + + ```ts + import { createUploadthing, type FileRouter } from "uploadthing/next"; + + const f = createUploadthing(); + export const uploadRouter = { }; + + // ... + f({ }) + .middleware(({ req }) => { + // ^? req: NextRequest + return {} + }) + ``` + + + + ```ts + import { createUploadthing, type FileRouter } from "uploadthing/next-legacy"; + + const f = createUploadthing(); + export const uploadRouter = { ... }; + + // ... + f({ ... }) + .middleware(({ req, res }) => { + // ^? req: NextApiRequest, res: NextApiResponse + }) + ``` + + + + ```ts + import { createUploadthing, type FileRouter } from "uploadthing/server"; + + const f = createUploadthing(); + export const uploadRouter = { ... }; + + // ... + f({ ... }) + .middleware(({ req }) => { + // ^? req: Request + }) + ``` + + + + + ```ts + import { createUploadthing, type FileRouter } from "uploadthing/express"; + + const f = createUploadthing(); + export const uploadRouter = { ... }; + + // ... + f({ ... }) + .middleware(({ req, res }) => { + // ^? req: ExpressRequest, res: ExpressResponse + }) + ``` + + + + + ```ts + import { createUploadthing, type FileRouter } from "uploadthing/fastify"; + + const f = createUploadthing(); + export const uploadRouter = { ... }; + + // ... + f({ ... }) + .middleware(({ req, res }) => { + // ^? req: FastifyRequest, res: FastifyReply + }) + ``` + + + + + ```ts + import { createUploadthing, type FileRouter } from "uploadthing/h3"; + + const f = createUploadthing(); + export const uploadRouter = { ... }; + + // ... + f({ ... }) + .middleware(({ event }) => { + // ^? event: H3Event + }) + ``` + + + + +## `createRouteHandler` {{ tag: 'function', since: '6.3' }} + +All adapters exports a `createRouteHandler` function that exposes your router to +the world. By default, you should only have to pass your router to this +function, although there are some extra configuration options available. + +> The names of the exported `createRouteHandler` is different prior to `v6.3`. + + + + ```ts + import { createRouteHandler } from "uploadthing/next"; + import { uploadRouter } from "~/server/uploadthing.ts"; + + export const { GET, POST } = createRouteHandler({ + router: uploadRouter, + // config: { ... }, + }); + ``` + + + + ```ts + import { createRouteHandler } from "uploadthing/next-legacy"; + import { uploadRouter } from "~/server/uploadthing.ts"; + + export default createRouteHandler({ + router: uploadRouter, + // config: { ... }, + }); + ``` + + + + ```ts + import { createRouteHandler } from "uploadthing/server"; + import { uploadRouter } from "~/server/uploadthing.ts"; + + export const handlers = createRouteHandler({ + router: uploadRouter, + // config: { ... }, + }); + export { handlers as GET, handlers as POST }; + ``` + + + + + ```ts + import express from "express"; + import { createRouteHandler } from "uploadthing/express"; + import { uploadRouter } from "~/server/uploadthing.ts"; + + const app = express(); + + app.use("/api/uploadthing", createRouteHandler({ + router: uploadRouter, + // config: { ... }, + })); + ``` + + + + + ```ts + import Fastify from "fastify"; + import { createRouteHandler } from "uploadthing/fastify"; + import { uploadRouter } from "~/server/uploadthing.ts"; + + const fastify = Fastify(); + + fastify.register(createRouteHandler({ + router: uploadRouter, + // config: { ... }, + })); + ``` + + + + + ```ts + import { createApp, createRouter } from "h3"; + import { createRouteHandler } from "uploadthing/h3"; + import { uploadRouter } from "~/server/uploadthing.ts"; + + const app = createApp(); + const router = createRouter(); + + router.use("/api/uploadthing", createRouteHandler({ + router: uploadRouter, + // config: { ... }, + })); + app.use(router.handler); + ``` + + + + +### Config Parameters + +You can configure the route handler either by passing a config object to the +`createRouteHandler` function, or by setting them as environment variables. +Environment variables follows the naming convention of `UPLOADTHING_` +,where `` is the name of the config option in constant case, e.g. +`UPLOADTHING_LOG_LEVEL`. If both are set, the config object takes precedence. + + + + The URL to where your route handler is hosted. This is called via webhook + after your file is uploaded. UploadThing attempts to automatically detect + this value based on the request URL and headers. You can override this if + the automatic detection fails. + + + Your UploadThing token. You can find this on the UploadThing dashboard. + + + Enable more verbose logging. + If using an older version of the SDK, levels might vary. + + + Used to determine whether to run dev hook or not + + + Used to override the fetch implementation + + + The URL of the UploadThing Ingest API. Will be decoded from the `token` if + not specified. + + This option should only be set for self-hosted instances or for testing. + + + + +## `UTApi` {{ tag: 'class', since: '5.7' }} + +See [UTApi](/api-reference/ut-api) + +## `UTFile` {{ tag: 'class', since: '6.4' }} + +A helper class to construct +[`File`](https://developer.mozilla.org/en-US/docs/Web/API/File) in environments +that don't support it natively. + +Also accepts a `customId` property to set a custom identifier for the file to be +uploaded using [UTApi.uploadFiles](/api-reference/ut-api#upload-files). + +### Constructor + + + + The parts of the file to be uploaded. + + + The name of the file to be uploaded. + + + The type of the file to be uploaded. + + + A custom identifier for the file to be uploaded using + [UTApi.uploadFiles](/api-reference/ut-api#upload-files). + + + The last modified time of the file to be uploaded. + + + +### Example + +```ts +import { UTApi, UTFile } from "uploadthing/server"; + +const utapi = new UTApi(); + +const file = new UTFile(["foo"], "foo.txt", { customId: "foo" }); +const response = await utapi.uploadFiles([file]); +``` diff --git a/docs/src/app/(docs)/api-reference/solid/page.mdx b/docs/src/app/(docs)/api-reference/solid/page.mdx new file mode 100644 index 0000000000..a85726597c --- /dev/null +++ b/docs/src/app/(docs)/api-reference/solid/page.mdx @@ -0,0 +1,17 @@ +import { docsMetadata } from "@/lib/utils"; + +export const metadata = docsMetadata({ + title: "@uploadthing/solid", + description: "Solid bindings for UploadThing.", + category: "API Reference", +}); + +# UploadThing Solid + +Solid bindings for UploadThing. + + + Docs for `@uploadthing/solid` are currently not available, however the + [`@uploadthing/react`](/api-reference/react) package is almost identical so so + we recommend following those docs for now. + diff --git a/docs/src/app/(docs)/api-reference/svelte/page.mdx b/docs/src/app/(docs)/api-reference/svelte/page.mdx new file mode 100644 index 0000000000..704e88aa4a --- /dev/null +++ b/docs/src/app/(docs)/api-reference/svelte/page.mdx @@ -0,0 +1,17 @@ +import { docsMetadata } from "@/lib/utils"; + +export const metadata = docsMetadata({ + title: "@uploadthing/svelte", + description: "Svelte bindings for UploadThing.", + category: "API Reference", +}); + +# UploadThing Svelte + +Svelte bindings for UploadThing. + + + Docs for `@uploadthing/svelte` are currently not available, however the + [`@uploadthing/react`](/api-reference/react) package is almost identical so so + we recommend following those docs for now. + diff --git a/docs/src/app/(docs)/api-reference/ut-api/page.mdx b/docs/src/app/(docs)/api-reference/ut-api/page.mdx new file mode 100644 index 0000000000..6995b45449 --- /dev/null +++ b/docs/src/app/(docs)/api-reference/ut-api/page.mdx @@ -0,0 +1,497 @@ +import { docsMetadata } from "@/lib/utils"; + +export const metadata = docsMetadata({ + title: "UTApi", + description: "TypeScript SDK for consuming the UploadThing REST API.", + category: "API Reference", +}); + +# UTApi + +The UploadThing API Helper, for use ON YOUR SERVER. It's basically just a REST +API but better. + + + Please note that external API calls will almost always be slower than querying + your own database. We recommend storing the file data you need in your own + database, either in [`.onUploadComplete()`](/file-routes#on-upload-complete) + or after uploading files using + [`uploadFiles()`](/api-reference/ut-api#upload-files), instead of relying on + the API for your application's core data flow. + + +## Constructor {{ since: '5.7' }} + + + Prior to `v5.7`, the `UTApi` was exported as an object called `utapi` without + any custom intialization support. + + +To get started, initialize an instance of `UTApi`. + +```ts {{ title: "~/server/uploadthing.ts" }} +import { UTApi } from "uploadthing/server"; + +export const utapi = new UTApi(); +``` + +### Options + +You can configure the SDK either by passing a config object to the +`createRouteHandler` function, or by setting them as environment variables. +Environment variables follows the naming convention of `UPLOADTHING_` +,where `` is the name of the config option in constant case, e.g. +`UPLOADTHING_LOG_LEVEL`. If both are set, the config object takes precedence. + + + + Provide a custom fetch function. + + + Your UploadThing token. You can find this on the UploadThing dashboard. + + + Enable more verbose logging. + If using an older version of the SDK, levels might vary. + + + Set the default key type for file operations. Allows you to set your + preferred filter for file keys or custom identifiers without needing to + specify it on every call. + + + The URL of the UploadThing API. Defaults to `https://api.uploadthing.com`. + + This option should only be set for self-hosted instances or for testing. + + + + The URL of the UploadThing Ingest API. Will be decoded from the `token` if + not specified. + + This option should only be set for self-hosted instances or for testing. + + + + +## `uploadFiles` {{ tag: 'method', since: '5.3'}} + +Upload files directly from your server **without** using the file router. Useful +for server-side file processing, uploading from a server action, and much more. + +```tsx +import { utapi } from "~/server/uploadthing.ts"; + +async function uploadFiles(formData: FormData) { + "use server"; + const files = formData.getAll("files"); + const response = await utapi.uploadFiles(files); + // ^? UploadedFileResponse[] +} + +function MyForm() { + return ( +
+ + +
+ ); +} +``` + +When uploading files using `uploadFiles`, the files must be present on your +server. Then presigned URLs are generated on our servers before the files can be +uploaded to the storage provider. + +### Parameters + + + + The files to upload + ```ts + // FileEsque is a blob with a name: + interface FileEsque extends Blob { + name: string + customId?: string + } + + // For Node.js > 20, File is a global Class + File; + + // or use UTFile which satisfies the File interface + // and allows passing in a customId + import { UTFile } from 'uploadthing/server' + ``` + + + + Metadata to be added to the uploaded files. This is useful for adding + additional information to the files that can be used later. + + + The content disposition to set on the storage provider. Content disposition + indicates how the file is expected to be displayed in the browser. Read more about content disposition on + [MDN](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition). + + + What [ACL](/concepts/regions-acl#access-controls) should be set on the + storage provider. Default value is is [configured on your app + settings](/concepts/regions-acl#access-controls) and can only be used if the + app allows per-request overrides. + + + +### Returns + +Returns an `Option` of `UploadedFileResponse`. If the `files` argument is an +array, the returned value will also be an array. + +```ts +type UploadFileResponse = + | { data: UploadData; error: null } + | { data: null; error: UploadError }; + +type UploadData = { + key: string; + url: string; + name: string; + size: number; +}; + +type UploadError = { + code: string; + message: string; + data: any; +}; +``` + +## `uploadFilesFromUrl` {{ tag: 'method', since: '5.3'}} + +Have a file hosted somewhere else you want to upload on UploadThing? This is the +function you're looking for. + + + When uploading files from URL, the file is first downloaded on **your** + server, before presigned URLs are created and the file is uploaded to the + storage provider. + + +```tsx +import { utapi } from "~/server/uploadthing.ts"; + +const fileUrl = "https://test.com/some.png"; +const uploadedFile = await utapi.uploadFilesFromUrl(fileUrl); +// ^? UploadedFileResponse + +const fileUrls = ["https://test.com/some.png", "https://test.com/some2.png"]; +const uploadedFiles = await utapi.uploadFilesFromUrl(fileUrls); +// ^? UploadedFileResponse[] +``` + +### Parameters + +The first argument are the URLs of the files you want to upload. They may also +be an object with a `url` property in case you want to override the `name`, or +set a `customId` for the files. The function also takes some optional options: + + + + Metadata to be added to the uploaded files. This is useful for adding + additional information to the files that can be used later. + ```ts + type MaybeURL = string | URL + type URLWithOverrides = { url: MaybeURL; name?: string; customId?: string } + ``` + + + + Metadata to be added to the uploaded files. This is useful for adding + additional information to the files that can be used later. + + + The content disposition to set on the storage provider. Content disposition + indicates how the file is expected to be displayed in the browser. Read more about content disposition on + [MDN](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition). + + + What [ACL](/concepts/regions-acl#access-controls) should be set on the + storage provider. Default value is is [configured on your app + settings](/concepts/regions-acl#access-controls) and can only be used if the + app allows per-request overrides. + + + +### Returns + +Same as [`uploadFiles`](#upload-files) + +## `deleteFiles` {{ tag: 'method', since: '4.0'}} + +`deleteFiles` takes in a fileKey or an array of fileKeys and deletes them from +the server. + +```ts +import { utapi } from "~/server/uploadthing.ts"; + +await utapi.deleteFiles("2e0fdb64-9957-4262-8e45-f372ba903ac8_image.jpg"); +await utapi.deleteFiles([ + "2e0fdb64-9957-4262-8e45-f372ba903ac8_image.jpg", + "1649353b-04ea-48a2-9db7-31de7f562c8d_image2.jpg", +]); +await deleteFiles("myCustomIdentifier", { keyType: "customId" }); +``` + +### Parameters + +Pass in the key(s) you want to delete as the first argument. Additionally, you +may pass some options as a second argument: + + + + The fileKeys (or customIds) you want to delete + + + The type of key you are passing in. + + + +### Returns + +`object` + +## `getFileUrls` {{ tag: 'method', since: '4.0', deprecated: true }} + +`getFileUrls` takes in a fileKey or an array of fileKeys and returns the URLs to +access them. + + + This method is deprecated and will be removed in a future version. Please + refer to [Accessing Files](/working-with-files#accessing-files) to learn how + to access your files without extra roundtrips for API calls. + + +```ts +import { utapi } from "~/server/uploadthing.ts"; + +const oneUrl = await utapi.getFileUrls( + "2e0fdb64-9957-4262-8e45-f372ba903ac8_image.jpg", +); +const multipleUrls = await utapi.getFileUrls([ + "2e0fdb64-9957-4262-8e45-f372ba903ac8_image.jpg", + "1649353b-04ea-48a2-9db7-31de7f562c8d_image2.jpg", +]); +``` + +### Parameters + +Pass in the key(s) you want to get the URLs for as the first argument. +Additionally, you may pass some options as a second argument: + + + + The fileKeys (or customIds) you want to get the URLs for + + + The type of key you are passing in. + + + +### Returns + +`object` + +## `listFiles` {{ tag: 'method', since: '5.3'}} + +`listFiles` returns a paginated list of objects containing file ids and keys for +all files that have been uploaded to the application your API key corresponds +to. + +```ts +import { utapi } from "~/server/uploadthing.ts"; + +const files = await utapi.listFiles(); +``` + +### Parameters + + + + The maximum number of files to return + + + The number of files to skip + + + +### Returns + +`object` + +## `renameFiles` {{ tag: 'method', since: '5.3'}} + +Rename a file or a list of files. You may specify either a file key or a custom +id. + +```ts +import { utapi } from "~/server/uploadthing.ts"; + +await utapi.renameFiles({ + key: "2e0fdb64-9957-4262-8e45-f372ba903ac8_image.jpg", + newName: "myImage.jpg", +}); +await utapi.renameFiles({ + customId: "my-identifier", + newName: "myImage.jpg", +}); + +await utapi.renameFiles([ + { + key: "2e0fdb64-9957-4262-8e45-f372ba903ac8_image.jpg", + newName: "myImage.jpg", + }, + { + key: "1649353b-04ea-48a2-9db7-31de7f562c8d_image2.jpg", + newName: "myOtherImage.jpg", + }, +]); +``` + +### Returns + +`object` + +## `getSignedURL` {{ tag: 'method', since: '6.2'}} + +Retrieve a [signed URL](/concepts/regions-acl#access-controls) for a private +file. + +```ts +import { utapi } from "~/server/uploadthing.ts"; + +const fileKey = "2e0fdb64-9957-4262-8e45-f372ba903ac8_image.jpg"; +const url = await utapi.getSignedURL(fileKey, { + expiresIn: 60 * 60, // 1 hour + // expiresIn: '1 hour', + // expiresIn: '3d', + // expiresIn: '7 days', +}); +``` + + + The `expiresIn` option can only be used if you allow overrides in your app + settings on the UploadThing dashboard. + + +### Parameters + + + + The key of the file to get a signed URL for + + + Options for the signed URL. The parsed duration cannot exceed 7 days (604 + 800). + + `TimeString` refers to a human-readable string that can be parsed as a + number, followed by a unit of time. For example, `1s`, `1 second`, `2m`, + `2 minutes`, `7 days` etc. If no unit is specified, seconds are assumed. + + + + The type of key to use for the signed URL. + + + +### Returns + +`string` + +## `updateACL` {{ tag: 'method', since: '6.8'}} + +Update the [ACL](/concepts/regions-acl#access-controls) of a file or a list of +files. + +```ts +import { utapi } from "~/server/uploadthing.ts"; + +// Make a single file public +await utapi.updateACL( + "2e0fdb64-9957-4262-8e45-f372ba903ac8_image.jpg", + "public-read", +); + +// Make multiple files private +await utapi.updateACL( + [ + "2e0fdb64-9957-4262-8e45-f372ba903ac8_image.jpg", + "1649353b-04ea-48a2-9db7-31de7f562c8d_image2.jpg", + ], + "private", +); +``` + + + + The fileKeys (or customIds) you want to update the ACL for + + + The ACL to update to. + + + The type of key you are passing in. + + + +### Returns + +`object` diff --git a/docs/src/app/(docs)/api-reference/vue/page.mdx b/docs/src/app/(docs)/api-reference/vue/page.mdx new file mode 100644 index 0000000000..1300db22f2 --- /dev/null +++ b/docs/src/app/(docs)/api-reference/vue/page.mdx @@ -0,0 +1,17 @@ +import { docsMetadata } from "@/lib/utils"; + +export const metadata = docsMetadata({ + title: "@uploadthing/vue", + description: "Vue bindings for UploadThing.", + category: "API Reference", +}); + +# UploadThing Vue + +Vue bindings for UploadThing. + + + Docs for `@uploadthing/svelte` are currently not available, however the + [`@uploadthing/react`](/api-reference/react) package is almost identical so so + we recommend following those docs for now. + diff --git a/docs/src/pages/backend-adapters/express.mdx b/docs/src/app/(docs)/backend-adapters/express/page.mdx similarity index 67% rename from docs/src/pages/backend-adapters/express.mdx rename to docs/src/app/(docs)/backend-adapters/express/page.mdx index e9a0477068..0fa8987e24 100644 --- a/docs/src/pages/backend-adapters/express.mdx +++ b/docs/src/app/(docs)/backend-adapters/express/page.mdx @@ -1,4 +1,10 @@ -import { Callout, Steps } from "nextra-theme-docs"; +import { docsMetadata } from "@/lib/utils"; + +export const metadata = docsMetadata({ + title: "Express", + description: "Adapter to integrate UploadThing into your Express application", + category: "Backend Adapters", +}); # Getting started with Express @@ -6,8 +12,6 @@ import { Callout, Steps } from "nextra-theme-docs"; ## Package Setup - - ### Install the package ```sh npm2yarn @@ -16,23 +20,18 @@ npm install uploadthing ### Add env variables - + If you don't already have a uploadthing secret key, [sign up](https://uploadthing.com/sign-in) and create one from the [dashboard!](https://uploadthing.com/dashboard) - + -```bash copy -UPLOADTHING_SECRET=... # A secret key for your app (starts with sk_live_) -UPLOADTHING_APP_ID=... # Your app id +```bash +UPLOADTHING_TOKEN=... # A token for interacting with the SDK ``` - - ## Set Up A FileRouter - - ### Creating your first FileRoute All files uploaded to uploadthing are associated with a FileRoute. The following @@ -45,9 +44,9 @@ of a FileRoute similar to an endpoint, it has: - `onUploadComplete` callback for when uploads are completed To get full insight into what you can do with the FileRoutes, please refer to -the [File Router API](/api-reference/server#file-routes). +the [File Router API](/file-routes). -```ts copy filename="src/uploadthing.ts" +```ts {{ title: "src/uploadthing.ts" }} import { createUploadthing, type FileRouter } from "uploadthing/express"; const f = createUploadthing(); @@ -68,11 +67,12 @@ export type OurFileRouter = typeof uploadRouter; ### Create an API route using the FileRouter - - Note: You need to serve this API from `/api/uploadthing` on your application. - + + File path here doesn't matter, you can serve this from any route. We recommend + serving it from `/api/uploadthing`. + -```ts copy filename="src/index.ts" +```ts {{ title: "src/index.ts" }} import express from "express"; import { createRouteHandler } from "uploadthing/express"; @@ -91,7 +91,7 @@ app.use( ``` > See configuration options in -> [server API reference](/api-reference/server#createroutehandler) +> [server API reference](/api-reference/server#create-route-handler) ### Use the FileRouter in your app @@ -108,16 +108,20 @@ export const UploadButton = generateUploadButton({ // ... ``` - + Please note that you might need to setup some CORS rules on your server to allow the client to make requests to the server. - + For the remaining usage, please refer to client side examples of the fullstack framework guides: -- [NextJS App directory](/getting-started/appdir#create-the-uploadthing-components-optional) -- [NextJS Pages directory](/getting-started/pagedir#create-the-uploadthing-components-optional) -- [SolidStart](/getting-started/solid#use-the-filerouter-in-your-app) +- [Next.js](/getting-started/appdir#create-the-upload-thing-components) +- [Solid.js](/getting-started/solid#creating-the-upload-thing-components) +- [Vue](https://github.com/pingdotgg/uploadthing/tree/main/examples/backend-adapters/client-vue) +- [Svelte](/getting-started/svelte#creating-the-upload-thing-helpers) + +or check out the full API reference: - +- [`@uploadthing/react`](/api-reference/react) +- [`uploadthing/client`](/api-reference/client) diff --git a/docs/src/pages/backend-adapters/fastify.mdx b/docs/src/app/(docs)/backend-adapters/fastify/page.mdx similarity index 70% rename from docs/src/pages/backend-adapters/fastify.mdx rename to docs/src/app/(docs)/backend-adapters/fastify/page.mdx index c9a60d2f73..b3eaa72b83 100644 --- a/docs/src/pages/backend-adapters/fastify.mdx +++ b/docs/src/app/(docs)/backend-adapters/fastify/page.mdx @@ -1,4 +1,10 @@ -import { Callout, Steps } from "nextra-theme-docs"; +import { docsMetadata } from "@/lib/utils"; + +export const metadata = docsMetadata({ + title: "Fastify", + description: "Adapter to integrate UploadThing into your Fastify application", + category: "Backend Adapters", +}); # Getting started with Fastify @@ -6,35 +12,26 @@ import { Callout, Steps } from "nextra-theme-docs"; ## Package Setup - - ### Install the package -import { Tab, Tabs } from "nextra-theme-docs"; - ```sh npm2yarn npm install uploadthing ``` ### Add env variables - + If you don't already have a uploadthing secret key, [sign up](https://uploadthing.com/sign-in) and create one from the [dashboard!](https://uploadthing.com/dashboard) - + -```bash copy -UPLOADTHING_SECRET=... # A secret key for your app (starts with sk_live_) -UPLOADTHING_APP_ID=... # Your app id +```bash +UPLOADTHING_TOKEN=... # A token for interacting with the SDK ``` - - ## Set Up A FileRouter - - ### Creating your first FileRoute All files uploaded to uploadthing are associated with a FileRoute. The following @@ -47,9 +44,9 @@ of a FileRoute similar to an endpoint, it has: - `onUploadComplete` callback for when uploads are completed To get full insight into what you can do with the FileRoutes, please refer to -the [File Router API](/api-reference/server#file-routes). +the [File Router API](/file-routes). -```ts copy filename="src/uploadthing.ts" +```ts {{ title: "src/uploadthing.ts" }} import { createUploadthing, type FileRouter } from "uploadthing/fastify"; const f = createUploadthing(); @@ -70,7 +67,7 @@ export type OurFileRouter = typeof uploadRouter; ### Register the UploadThing plugin -```ts copy filename="src/index.ts" +```ts {{ title: "src/index.ts" }} import Fastify from "fastify"; import { createRouteHandler } from "uploadthing/fastify"; @@ -88,7 +85,7 @@ fastify ``` > See configuration options in -> [server API reference](/api-reference/server#createroutehandler) +> [server API reference](/api-reference/server#create-route-handler) ### Use the FileRouter in your app @@ -105,16 +102,20 @@ export const UploadButton = generateUploadButton({ // ... ``` - + Please note that you might need to setup some CORS rules on your server to allow the client to make requests to the server. - + For the remaining usage, please refer to client side examples of the fullstack framework guides: -- [NextJS App directory](/getting-started/appdir#create-the-uploadthing-components-optional) -- [NextJS Pages directory](/getting-started/pagedir#create-the-uploadthing-components-optional) -- [SolidStart](/getting-started/solid#use-the-filerouter-in-your-app) +- [Next.js](/getting-started/appdir#create-the-upload-thing-components) +- [Solid.js](/getting-started/solid#creating-the-upload-thing-components) +- [Vue](https://github.com/pingdotgg/uploadthing/tree/main/examples/backend-adapters/client-vue) +- [Svelte](/getting-started/svelte#creating-the-upload-thing-helpers) + +or check out the full API reference: - +- [`@uploadthing/react`](/api-reference/react) +- [`uploadthing/client`](/api-reference/client) diff --git a/docs/src/pages/backend-adapters/fetch.mdx b/docs/src/app/(docs)/backend-adapters/fetch/page.mdx similarity index 69% rename from docs/src/pages/backend-adapters/fetch.mdx rename to docs/src/app/(docs)/backend-adapters/fetch/page.mdx index 68ddc98d3e..3827d62479 100644 --- a/docs/src/pages/backend-adapters/fetch.mdx +++ b/docs/src/app/(docs)/backend-adapters/fetch/page.mdx @@ -1,4 +1,11 @@ -import { Callout, Steps } from "nextra-theme-docs"; +import { docsMetadata } from "@/lib/utils"; + +export const metadata = docsMetadata({ + title: "Fetch / Edge Runtimes", + description: + "UploadThing adheres to web standards and can be used with any server implementing the Fetch API", + category: "Backend Adapters", +}); # Getting started with Fetch / Edge Runtimes @@ -9,27 +16,22 @@ UploadThing is compatible with any runtime that follow the ### Package Setup - - ### Install the package -import { Tab, Tabs } from "nextra-theme-docs"; - ```sh npm2yarn npm install uploadthing ``` #### Add env variables - + If you don't already have a uploadthing secret key, [sign up](https://uploadthing.com/sign-in) and create one from the [dashboard!](https://uploadthing.com/dashboard) - + -```bash copy -UPLOADTHING_SECRET=... # A secret key for your app (starts with sk_live_) -UPLOADTHING_APP_ID=... # Your app id +```bash +UPLOADTHING_TOKEN=... # A token for interacting with the SDK ``` ### Set Up A FileRouter @@ -44,9 +46,9 @@ of a FileRoute similar to an endpoint, it has: - `onUploadComplete` callback for when uploads are completed To get full insight into what you can do with the FileRoutes, please refer to -the [File Router API](/api-reference/server#file-routes). +the [File Router API](/file-routes). -```ts copy filename="uploadthing.ts" +```ts import { createUploadthing, type FileRouter } from "uploadthing/server"; const f = createUploadthing(); @@ -65,83 +67,80 @@ export const uploadRouter = { export type OurFileRouter = typeof uploadRouter; ``` - - ## Runtimes-specific setup > See configuration options in -> [server API reference](/api-reference/server#createroutehandler) +> [server API reference](/api-reference/server#create-route-handler) ### Astro -```ts filename="pages/api/uploadthing.ts" +```ts import { createRouteHandler } from "uploadthing/server"; import { uploadRouter } from "../../server/uploadthing"; -export const { GET, POST } = createRouteHandler({ +const handlers = createRouteHandler({ router: uploadRouter, config: { ... }, }); +export { handlers as GET, handlers as POST }; ``` - + Read more in our [Getting Started with Astro](/getting-started/astro) guide. - + ### Elysia -```ts filename="src/index.ts" +```ts import { Elysia } from "elysia"; import { createRouteHandler } from "uploadthing/server"; import { uploadRouter } from "./uploadthing.ts"; -const { GET, POST } = createRouteHandler({ +const handlers = createRouteHandler({ router: uploadRouter, config: { ... }, }); const app = new Elysia().get("/", () => "Hello Elysia"); -app.group("/api/uploadthing", (app) => - app - .post("/", (context) => POST(context.request)) - .get("/", (context) => GET(context.request)), -); +app.all("/api/uploadthing", handlers); app.listen(3000); ``` ### Hono -```ts filename="src/index.ts" +```ts import { Hono } from "hono"; import { createRouteHandler } from "uploadthing/server"; import { uploadRouter } from "./uploadthing.ts"; -const { GET, POST } = createRouteHandler({ +const handlers = createRouteHandler({ router: uploadRouter, config: { ... }, }); const app = new Hono(); -const ut = new Hono() - .get("/", (context) => GET(context.req.raw)) - .post("/", (context) => POST(context.req.raw)); - -app.route("/api/uploadthing", ut); +app.all("/api/uploadthing", (context) => handlers(context.req.raw)); export default app; ``` ### Cloudflare Workers -```ts filename="src/worker.ts" + + Due to Cloudflare's lack of global environment variables and lack of + `init.cache` on `fetch`, we need to due some manual setup to make it + compatible. + + +```ts import { createRouteHandler } from "uploadthing/server"; import { uploadRouter } from "./uploadthing.ts"; @@ -155,7 +154,7 @@ export default { * Since workers doesn't have envs on `process`. We need to pass * secret and isDev flag manually. */ - uploadthingSecret: env.UPLOADTHING_SECRET, + token: env.UPLOADTHING_TOKEN, isDev: env.ENVIRONMENT === "development", /* * Cloudflare Workers doesn't support the cache option @@ -165,6 +164,11 @@ export default { if (init && "cache" in init) delete init.cache; return fetch(url, init); }, + /** + * UploadThing dev server leaves some promises hanging around that we + * need to wait for to prevent the worker from exiting prematurely. + */ + handleDaemonPromise: (promise) => ctx.waitUntil(promise), }, }); @@ -174,16 +178,7 @@ export default { if (request.method !== "POST" && request.method !== "GET") { return new Response("Method not allowed", { status: 405 }); } - - const response = await handlers[request.method](request); - if ("cleanup" in response && response.cleanup) { - /** - * UploadThing dev server leaves some promises hanging around that we - * need to wait for to prevent the worker from exiting prematurely. - */ - ctx.waitUntil(response.cleanup); - } - return response; + return await handlers[request.method](request); } default: { return new Response("Not found", { status: 404 }); @@ -208,14 +203,20 @@ export const UploadButton = generateUploadButton({ // ... ``` - + Please note that you might need to setup some CORS rules on your server to allow the client to make requests to the server. - + For the remaining usage, please refer to client side examples of the fullstack framework guides: -- [NextJS App directory](/getting-started/appdir#create-the-uploadthing-components-optional) -- [NextJS Pages directory](/getting-started/pagedir#create-the-uploadthing-components-optional) -- [SolidStart](/getting-started/solid#use-the-filerouter-in-your-app) +- [Next.js](/getting-started/appdir#create-the-upload-thing-components) +- [Solid.js](/getting-started/solid#creating-the-upload-thing-components) +- [Vue](https://github.com/pingdotgg/uploadthing/tree/main/examples/backend-adapters/client-vue) +- [Svelte](/getting-started/svelte#creating-the-upload-thing-helpers) + +or check out the full API reference: + +- [`@uploadthing/react`](/api-reference/react) +- [`uploadthing/client`](/api-reference/client) diff --git a/docs/src/pages/backend-adapters/h3.mdx b/docs/src/app/(docs)/backend-adapters/h3/page.mdx similarity index 53% rename from docs/src/pages/backend-adapters/h3.mdx rename to docs/src/app/(docs)/backend-adapters/h3/page.mdx index ffe22003a6..59088c788e 100644 --- a/docs/src/pages/backend-adapters/h3.mdx +++ b/docs/src/app/(docs)/backend-adapters/h3/page.mdx @@ -1,4 +1,10 @@ -import { Callout, Steps, Tabs } from "nextra-theme-docs"; +import { docsMetadata } from "@/lib/utils"; + +export const metadata = docsMetadata({ + title: "H3", + description: "Adapter to integrate UploadThing into your H3 application", + category: "Backend Adapters", +}); # Getting started with H3 @@ -10,8 +16,6 @@ for all frameworks that use H3 under the hood. ## Package Setup - - ### Install the package ```sh npm2yarn @@ -20,23 +24,18 @@ npm install uploadthing ### Add env variables - + If you don't already have a uploadthing secret key, [sign up](https://uploadthing.com/sign-in) and create one from the [dashboard!](https://uploadthing.com/dashboard) - + -```bash copy -UPLOADTHING_SECRET=... # A secret key for your app (starts with sk_live_) -UPLOADTHING_APP_ID=... # Your app id +```bash +UPLOADTHING_TOKEN=... # A token for interacting with the SDK ``` - - ## Set Up A FileRouter - - ### Creating your first FileRoute All files uploaded to uploadthing are associated with a FileRoute. The following @@ -49,9 +48,9 @@ of a FileRoute similar to an endpoint, it has: - `onUploadComplete` callback for when uploads are completed To get full insight into what you can do with the FileRoutes, please refer to -the [File Router API](/api-reference/server#file-routes). +the [File Router API](/file-routes). -```ts copy filename="src/uploadthing.ts" +```ts {{ title: "src/uploadthing.ts" }} import { createUploadthing, type FileRouter } from "uploadthing/h3"; const f = createUploadthing(); @@ -72,61 +71,45 @@ export type OurFileRouter = typeof uploadRouter; ### Create the H3 event handlers - - - ```ts - import { createApp, createRouter } from "h3"; + - import { createRouteHandler } from "uploadthing/h3"; - import { uploadRouter } from "./router"; +```ts {{ title: 'Vanilla H3' }} +import { createApp, createRouter } from "h3"; - const app = createApp(); - const router = createRouter(); +import { createRouteHandler } from "uploadthing/h3"; +import { uploadRouter } from "./router"; - router.use( - "/api/uploadthing", - createRouteHandler({ - router: uploadRouter, - config: { ... }, - }) - ); +const app = createApp(); +const router = createRouter(); - app.use(router); +router.use( + "/api/uploadthing", + createRouteHandler({ + router: uploadRouter, + config: { ... }, + }) +); - export { app }; // Run server with e.g. `listhen` - ``` +app.use(router); - - - ```ts filename="routes/api/uploadthing.ts" - import { createRouteHandler } from "uploadthing/h3"; - - import { uploadRouter } from "./router"; - - export default createRouteHandler({ - router: uploadRouter, - config: { ... }, - }); - ``` +export { app }; // Run server with e.g. `listhen` +``` - - - ```ts filename="server/api/uploadthing.ts" - import { createRouteHandler } from "uploadthing/h3"; +```ts {{ title: 'Nitro' }} +import { createRouteHandler } from "uploadthing/h3"; - import { uploadRouter } from "./router"; +import { uploadRouter } from "./router"; - export default createRouteHandler({ - router: uploadRouter, - config: { ... }, - }); - ``` +export default createRouteHandler({ + router: uploadRouter, + config: { ... }, +}); +``` - - + > See configuration options in -> [server API reference](/api-reference/server#createroutehandler) +> [server API reference](/api-reference/server#create-route-handler) ### Use the FileRouter in your app @@ -143,21 +126,20 @@ export const UploadButton = generateUploadButton({ // ... ``` - + Please note that you might need to setup some CORS rules on your server to allow the client to make requests to the server. - + For the remaining usage, please refer to client side examples of the fullstack framework guides: - - Support for Vue is coming soon which will allow you to use the fullstack - framework Nuxt with Uploadthing. - +- [Next.js](/getting-started/appdir#create-the-upload-thing-components) +- [Solid.js](/getting-started/solid#creating-the-upload-thing-components) +- [Vue](https://github.com/pingdotgg/uploadthing/tree/main/examples/backend-adapters/client-vue) +- [Svelte](/getting-started/svelte#creating-the-upload-thing-helpers) -- [NextJS App directory](/getting-started/appdir#create-the-uploadthing-components-optional) -- [NextJS Pages directory](/getting-started/pagedir#create-the-uploadthing-components-optional) -- [SolidStart](/getting-started/solid#use-the-filerouter-in-your-app) +or check out the full API reference: - +- [`@uploadthing/react`](/api-reference/react) +- [`uploadthing/client`](/api-reference/client) diff --git a/docs/src/app/(docs)/client-layout.tsx b/docs/src/app/(docs)/client-layout.tsx new file mode 100644 index 0000000000..20888050af --- /dev/null +++ b/docs/src/app/(docs)/client-layout.tsx @@ -0,0 +1,108 @@ +"use client"; + +import { useEffect, useState } from "react"; +import { usePathname } from "next/navigation"; +import { Footer } from "@/components/Footer"; +import { Header } from "@/components/Header"; +import { LogoBlob, LogoText } from "@/components/Logo"; +import { Navigation } from "@/components/Navigation"; +import { SectionProvider, type Section } from "@/components/SectionProvider"; +import { XMarkIcon } from "@heroicons/react/20/solid"; +import { motion } from "framer-motion"; +import { Link } from "next-view-transitions"; + +const PreviewBanner = (props: { + open: boolean; + setOpen: (open: boolean) => void; +}) => { + return ( + +
+

+ + New Docs! + + You're looking at documentation for the latest version of + UploadThing. Go to legacy documentation{" "} + + +

+ +
+
+ ); +}; + +export function Layout({ + children, + allSections, +}: { + children: React.ReactNode; + allSections: Record>; +}) { + let pathname = usePathname(); + const [bannerOpen, setBannerOpen] = useState(false); + useEffect(() => { + setTimeout(() => { + setBannerOpen(true); + }, 1000); + }, []); + + return ( + +
+ +
+
+ + + + +
+
+ +
+
+ +
+ +
+
{children}
+
+
+
+ + ); +} diff --git a/docs/src/pages/auth-security.mdx b/docs/src/app/(docs)/concepts/auth-security/page.mdx similarity index 79% rename from docs/src/pages/auth-security.mdx rename to docs/src/app/(docs)/concepts/auth-security/page.mdx index e16ac9c690..8574a352d5 100644 --- a/docs/src/pages/auth-security.mdx +++ b/docs/src/app/(docs)/concepts/auth-security/page.mdx @@ -1,12 +1,11 @@ -import Image from "next/image"; -import { Callout } from "nextra-theme-docs"; +import { docsMetadata } from "@/lib/utils"; -import { - Accordion, - AccordionContent, - AccordionItem, - AccordionTrigger, -} from "../components/accordion"; +export const metadata = docsMetadata({ + title: "Authentication & Security", + description: + "Authentication is a vital part in protecting your app from malicious usage. In this section we'll go over how to protect different parts of the UploadThing flow.", + category: "Concepts", +}); # Authentication & Security @@ -14,11 +13,11 @@ Authentication is a vital part in protecting your app from malicious usage. In this section we'll go over how to protect different parts of the UploadThing flow. - + Do not protect the entire `/api/uploadthing` route from being called by unauthenticated users. The endpoint is called as a webhook by our server and thus must be publically available. - + ## Protecting the endpoint from spoofing @@ -33,8 +32,8 @@ endpoint is appropriately protected. ## Protecting unauthenticated users from uploading files You can protect unauthenticated users from uploading files via the -[`.middleware()`](/api-reference/server#middleware) function in each file route. -This makes it trivial to protect some file routes, and keep some public. +[`.middleware()`](/file-routes#middleware) function in each file route. This +makes it trivial to protect some file routes, and keep some public. Using your favorite authentication provider (or self-roll if that's your thing), retrieve the current user's session from the incoming request. If it's not @@ -43,7 +42,7 @@ following example, we have a public file route that is protected by rate limiting, and a protected route that allows any authenticated user to upload files: -```ts filename="~/server/uploadthing" +```ts import { auth } from "auth"; import { createUploadthing, UploadThingError } from "uploadthing/server"; @@ -83,9 +82,9 @@ export const uploadRouter = { }; ``` - + By throwing an `UploadThingError`, the error message is automatically sent down to the client. If throwing other errors, you need an - [`errorFormatter`](/errors#error-formatting) to control what is sent down to - the client. - + [`errorFormatter`](/concepts/error-handling#error-formatting) to control what + is sent down to the client. + diff --git a/docs/src/pages/errors.mdx b/docs/src/app/(docs)/concepts/error-handling/page.mdx similarity index 92% rename from docs/src/pages/errors.mdx rename to docs/src/app/(docs)/concepts/error-handling/page.mdx index e9f267c684..434cb275e4 100644 --- a/docs/src/pages/errors.mdx +++ b/docs/src/app/(docs)/concepts/error-handling/page.mdx @@ -1,3 +1,12 @@ +import { docsMetadata } from "@/lib/utils"; + +export const metadata = docsMetadata({ + title: "Error Handling", + description: + "Customize the server-side behavior when an error occurs in your file router", + category: "Concepts", +}); + # Error Handling ## Error Formatting @@ -20,9 +29,12 @@ the error message to the client. All other error types will use a generic error message. Regardless of what error is thrown, you can still change the defaults with `errorFormatter`. -```ts filename="server/uploadthing.ts" -import { createUploadthing, type FileRouter } from "uploadthing/next"; -import { UploadThingError } from "uploadthing/server"; +```ts +import { + createUploadthing, + UploadThingError, + type FileRouter, +} from "uploadthing/server"; const f = createUploadthing(); @@ -102,7 +114,7 @@ fields failed validation by checking if the cause is a `ZodError`. Zod provides a `flatten` method that returns a JSON-serializable object which we can return to the client. -```ts filename="server/uploadthing.ts" +```ts import * as z from "zod"; import { createUploadthing } from "uploadthing/next"; diff --git a/docs/src/pages/regions-and-acl.mdx b/docs/src/app/(docs)/concepts/regions-acl/page.mdx similarity index 62% rename from docs/src/pages/regions-and-acl.mdx rename to docs/src/app/(docs)/concepts/regions-acl/page.mdx index b591e2d8ee..8190eda411 100644 --- a/docs/src/pages/regions-and-acl.mdx +++ b/docs/src/app/(docs)/concepts/regions-acl/page.mdx @@ -1,8 +1,13 @@ -import { Callout } from "nextra-theme-docs"; +import { docsMetadata } from "@/lib/utils"; - - Regions and Private files are only available on paid plans. - +export const metadata = docsMetadata({ + title: "Regions & ACL", + description: + "UploadThing has support for multiple regions and access control lists to help you secure your files", + category: "Concepts", +}); + +Regions and Private files are only available on paid plans. ## Regions @@ -10,28 +15,37 @@ UploadThing allows you to select where your files are stored by configuring your app's region on the UploadThing dashboard. If no configuration is set, your files are uploaded to our default region which is currently `AWS us-west-2`. +### Available regions + +The following regions are currently supported by UploadThing: + +| Region | Region Alias | +| ------------------------------- | ------------ | +| Asia - Mumbai | bom1 | +| Asia - Seoul | icn1 | +| Asia - Sydney | syd1 | +| Canada - Central | can1 | +| EU Central - Frankfurt | fra1 | +| EU Central - Zurich | zrh1 | +| EU West - Dublin | dub1 | +| US East - Ohio | cle1 | +| US West - San Fransisco | sfo1 | +| US West - Seattle **(default)** | sea1 | + ### Configuring region Go to your app's settings on the UploadThing dashboard. Under `Regions and ACL`, you can select the region you want to upload your files to. Once changed, all **new** file uploads will go to the selected region. -import Image from "next/image"; - -Region settings +![Region settings](@/images/region-settings.png) - + Changing your app's region will not move your existing files to the new region, it will only affect new files. For assistance migrating your existing files to the new region, please reach out on [Discord](https://t3.gg/discord) or via [email](mailto:ut-support@ping.gg). - + ## Access Controls @@ -53,23 +67,17 @@ dashboard. Under `Regions and ACL`, you can select the ACL you want to use as default. You may also toggle the ability to override the default ACL on a per-request basis. - + Private files are currently only available on regions other than the default (`AWS us-west-2`). - + -Access control settings +![Access control settings](@/images/acl-settings.png) ### Using signed URLs Signed URLs can be retrieved using the -[`getSignedURL`](/api-reference/ut-api#getsignedurl) method on the UTApi. It +[`getSignedURL`](/api-reference/ut-api#get-signed-url) method on the UTApi. It accepts the expiration time in seconds as a parameter, which defaults to whatever you've set in your app's settings. Overriding this value is only allowed if you've enabled the diff --git a/docs/src/app/(docs)/concepts/theming/demos.tsx b/docs/src/app/(docs)/concepts/theming/demos.tsx new file mode 100644 index 0000000000..740f7dee41 --- /dev/null +++ b/docs/src/app/(docs)/concepts/theming/demos.tsx @@ -0,0 +1,381 @@ +"use client"; + +import { UploadButton, UploadDropzone } from "@/components/UploadThing"; + +export const TWClassName1 = () => ( + +); + +export const TWClassName2 = () => ( + +); + +export const TWClassName3 = () => ( + +); + +export const TWClassName4 = () => ( + +); + +export const TWClassName5 = () => ( + +); + +export const TWClassName6 = () => ( + +); + +export const CustomClassClassName1 = () => ( + +); + +export const CustomClassClassName2 = () => ( + +); + +export const CustomClassClassName3 = () => ( + +); + +export const CustomClassAppearance1 = () => ( + +); + +export const CustomClassAppearance2 = () => ( + +); + +export const CustomClassAppearance3 = () => ( + +); + +export const InlineClassAppearance1 = () => ( + +); + +export const InlineClassAppearance2 = () => ( + +); + +export const InlineClassAppearance3 = () => ( + +); + +export const CustomContent1 = () => ( + Upload stuff
; + + return "Getting ready..."; + }, + allowedContent({ ready, fileTypes, isUploading }) { + if (!ready) return "Checking what you allow"; + if (isUploading) return "Seems like stuff is uploading"; + return `Stuff you can upload: ${fileTypes.join(", ")}`; + }, + }} + // @ts-expect-error - internal prop + __internal_button_disabled + __internal_state="readying" + /> +); + +export const CustomContent2 = () => ( + Upload stuff; + + return "Getting ready..."; + }, + allowedContent({ ready, fileTypes, isUploading }) { + if (!ready) return "Checking what you allow"; + if (isUploading) return "Seems like stuff is uploading"; + return `Stuff you can upload: ${fileTypes.join(", ")}`; + }, + }} + appearance={{ + container: { + marginTop: "1rem", + }, + allowedContent: "text-zinc-500", + }} + // @ts-expect-error - internal prop + __internal_button_disabled + __internal_state="ready" + /> +); + +export const CustomContent3 = () => ( + Upload stuff; + + return "Getting ready..."; + }, + allowedContent({ ready, fileTypes, isUploading }) { + if (!ready) return "Checking what you allow"; + if (isUploading) return "Seems like stuff is uploading"; + return `Stuff you can upload: ${fileTypes.join(", ")}`; + }, + }} + appearance={{ + container: { + marginTop: "1rem", + }, + allowedContent: "text-zinc-500", + }} + // @ts-expect-error - internal prop + __internal_button_disabled + __internal_state="uploading" + /> +); diff --git a/docs/src/pages/theming.mdx b/docs/src/app/(docs)/concepts/theming/page.mdx similarity index 54% rename from docs/src/pages/theming.mdx rename to docs/src/app/(docs)/concepts/theming/page.mdx index 5a7545db8d..1214c08d99 100644 --- a/docs/src/pages/theming.mdx +++ b/docs/src/app/(docs)/concepts/theming/page.mdx @@ -1,47 +1,51 @@ -import { Callout } from "nextra-theme-docs"; +import { docsMetadata } from "@/lib/utils"; -import { UploadButton, UploadDropzone } from "@uploadthing/react"; +export const metadata = docsMetadata({ + title: "Theming", + description: + "Customize the look and feel of your UploadThing components using our theming system", + category: "Concepts", +}); + +import * as d from "./demos"; # Theming -## Components anatomy +Our prebuilt components are customizable so you can make them fit with the theme +of your application. -### UploadButton +## UploadButton Anatomy Simplified component structure: ```tsx
-
``` - + UploadDropzone consists of five themeable elements: `container`, `upload icon`, `label`, `button`, and `allowed content`. - + - + Note: While in UploadButton the button element is defined using `label`, in UploadDropzone it is defined using `button`. As an abstraction layer, the button element in these two components has a special data attribute applied: `data-ut-element="button"`. - - -Upload dropzone anatomy + + +![UploadDropzone anatomy](@/images/upload-dropzone-anatomy.png) ## Theming props @@ -131,14 +129,6 @@ type UploadDropzoneProps = { where the `CallbackArguments` is defined as (depending on the component): - - For `Signal`-based frameworks, such as - [Solid.js](https://www.solidjs.com/tutorial/introduction_signals), the - attributes of the interfaces are getter-methods. For example, the - `ButtonCallbackArguments.ready: boolean` property is a getter-method - `ButtonCallbackArguments.ready(): boolean` in Solid.js. - - ```ts type ButtonCallbackArguments = { ready: boolean; @@ -156,11 +146,37 @@ type DropzoneCallbackArguments = { }; ``` -## How to theme + + For `Signal`-based frameworks, such as + [Solid.js](https://www.solidjs.com/tutorial/introduction_signals), the + attributes of the interfaces are getter-methods. For example, the + `ButtonCallbackArguments.ready: boolean` property is a getter-method + `ButtonCallbackArguments.ready(): boolean` in Solid.js. + -### With TailwindCSS +## Theming with TailwindCSS -#### Configuring TailwindCSS + + If some classes are not working as expected, you may have to override the + default class merger to use something like [`tailwind-merge`](https://github.com/dcastil/tailwind-merge): + +```tsx +import { twMerge } from 'tailwind-merge' +import { UploadButton } from '~/lib/uploadthing' + +export function Page() { + return ( + + ) +} +``` + + + +### Configuring TailwindCSS To leverage the best developer experience, we strongly recommend wrapping your Tailwind config with our utility function `withUt`. This utility function adds @@ -172,7 +188,9 @@ duplicated styles in your bundle. Therefore, when using `withUt`, you should not import our stylesheet into your app. If you choose not to use `withUt`, you have to import the default stylesheet to make the components look right. -```ts filename="tailwind.config.ts" + + +```ts {{title: "tailwind.config.ts" }} import { withUt } from "uploadthing/tw"; export default withUt({ @@ -180,7 +198,7 @@ export default withUt({ }); ``` -```js filename="tailwind.config.js" +```js {{title: "tailwind.config.js" }} // @ts-check const { withUt } = require("uploadthing/tw"); @@ -189,19 +207,21 @@ module.exports = withUt({ }); ``` - + + + If you're not wrapping your config as shown above, you have to import our stylesheet into your app. Otherwise, components will not look right. -```ts filename="app/layout.tsx" +```ts import "@uploadthing/react/styles.css"; // ... ``` - + -#### Style using the `className` prop +### Style using the `className` prop `className` accepts any classes and will merge them using `tailwind-merge`, meaning you can pass any class you like and it will be applied correctly, @@ -210,25 +230,20 @@ overriding the default styles if necessary. The `withUt` wrapper adds custom variants that you can leverage to easily target different elements of the component and its state: -
- | Variant | Description | | --------------------- | ----------------------------------------------------------------- | | `ut-button:` | Applied to the button element. | | `ut-allowed-content:` | Applied to the allowed content element. | | `ut-label:` | Applied to the label element. | | `ut-upload-icon:` | Applied to the upload icon element. | -| --- | --- | | `ut-readying:` | Applied to the container element when the component is readying. | | `ut-ready:` | Applied to the container element when the component is ready. | | `ut-uploading:` | Applied to the container element when the component is uploading. | -
- - + If you're not using the `withUt` wrapper, the state variants can be applied using `data-[state="..."]:` - + These variants and classes can be used in conjunction with each other to make component match your design in the exact way you want. @@ -241,26 +256,8 @@ component match your design in the exact way you want. /> ``` - - - + + ```jsx ``` - + + - - -#### Style using the `appearance` prop +### Style using the `appearance` prop If you're not using the `withUt` wrapper, or prefer splitting your styles up a bit, you can use the `appearance` prop to target the different elements of the @@ -313,43 +290,12 @@ component. /> ``` - + + - +## Theming with custom classes -### With custom classes - -#### `className` prop +### `className` prop `className` prop accepts any classes so you can pass there anything you like. When it comes to custom classes, you can use `data` attributes to target @@ -392,50 +338,11 @@ specific elements of components. } ``` - - - - - + + + -#### `appearance` prop +### `appearance` prop If you need, you can pass classes directly to specific elements of components or provide a callback that will be called with the current state of the component @@ -498,68 +405,13 @@ and will return a string } ``` - + + + - +## Theming with inline styles - - -### With inline styles - -#### `appearance` prop +### `appearance` prop If you need, you can pass inline styles directly to specific elements of component or provide a callback that will be called with the current state of @@ -586,84 +438,13 @@ the component and will return a `CSSProperties` object /> ``` - - - - - + + + -## Content customisation +## Content customization -To customise the content of `UploadButton` and `UploadDropzone`, you can use the +To customize the content of `UploadButton` and `UploadDropzone`, you can use the `content` prop that accepts an object with the following shape: > `ReactNode` in the type definitions below will be the equivalent depending on @@ -691,17 +472,17 @@ type UploadDropzoneProps = { }; ``` - + When you take over the `content` of an element, you get full responsibility to control the different states of the component. For example, if you customize the `button` element, we will not show a spinner when the component is uploading. - + - + If you're using svelte, checkout the [svelte docs](/getting-started/svelte#theming-svelte-components). - + ### Example @@ -723,71 +504,6 @@ type UploadDropzoneProps = { /> ``` -Upload stuff; - - return "Getting ready..."; - }, - allowedContent({ ready, fileTypes, isUploading }) { - if (!ready) return "Checking what you allow"; - if (isUploading) return "Seems like stuff is uploading"; - return `Stuff you can upload: ${fileTypes.join(", ")}`; - }, - -}} /> - -Upload stuff; - - return "Getting ready..."; - }, - allowedContent({ ready, fileTypes, isUploading }) { - if (!ready) return "Checking what you allow"; - if (isUploading) return "Seems like stuff is uploading"; - return `Stuff you can upload: ${fileTypes.join(", ")}`; - }, - -}} - -appearance={{ - container: { - marginTop: "1rem", - }, - allowedContent: "text-zinc-500", - }} /> - -Upload stuff; - - return "Getting ready..."; - }, - allowedContent({ ready, fileTypes, isUploading }) { - if (!ready) return "Checking what you allow"; - if (isUploading) return "Seems like stuff is uploading"; - return `Stuff you can upload: ${fileTypes.join(", ")}`; - }, - -}} - -appearance={{ - container: { - marginTop: "1rem", - }, - allowedContent: "text-zinc-500", - }} /> + + + diff --git a/docs/src/pages/faq.mdx b/docs/src/app/(docs)/faq/page.mdx similarity index 89% rename from docs/src/pages/faq.mdx rename to docs/src/app/(docs)/faq/page.mdx index aa6ee31438..1c7b0072f0 100644 --- a/docs/src/pages/faq.mdx +++ b/docs/src/app/(docs)/faq/page.mdx @@ -1,5 +1,12 @@ +import { docsMetadata } from "@/lib/utils"; + +export const metadata = docsMetadata({ + title: "Frequently Asked Questions", + description: "Browse common questions and answers about UploadThing", + category: "FAQ", +}); + import Image from "next/image"; -import { Callout } from "nextra-theme-docs"; ### The UploadThing components look all weird, what's going on? @@ -44,16 +51,16 @@ or use the node runtime instead: export const runtime = "nodejs"; ``` - + Since `next@14.1.2-canary.38`, this limitation has been fixed and you should safely be able to use the edge runtime in development. - + ### I'm getting a `Type ... is not assignable to type '"You forgot to pass the generic"'` error This occurs when you're importing the `UploadButton` or `UploadDropzone` components from `@uploadthing/react` or `@uploadthing/solid` directly, and not -[generating your own typesafe components](/api-reference/react#generateComponents) +[generating your own typesafe components](/api-reference/react#generate-components) using `generateUploadButton` or `generateUploadDropzone`. While you can do this, it is not recommended as you have to provide the generics yourself in order to get full typesafety. @@ -63,10 +70,14 @@ import { UploadButton } from "@uploadthing/react"; import type { OurFileRouter } from "~/app/api/uploadthing/core"; - - endpoint="myFileRoute" - // ... -/>; +function MyComponent() { + return ( + // <-- + endpoint="myFileRoute" // <-- note how you have to double-pass the endpoint + // ... + /> + ); +} ``` As you can see, it's quite cumbersome having to provide the generics yourself, @@ -123,9 +134,4 @@ header, which will allow uploadthing callbacks to bypass the authentication. 5. Enter the header name and value 6. Click "Save Changes" -Screenshot of the uploadthing dashboard showing the 'Add Header' button +![Screenshot of the uploadthing dashboard showing the 'Add Header' button](@/images/add-header-settings.png) diff --git a/docs/src/app/(docs)/file-routes/page.mdx b/docs/src/app/(docs)/file-routes/page.mdx new file mode 100644 index 0000000000..4b0e19f1de --- /dev/null +++ b/docs/src/app/(docs)/file-routes/page.mdx @@ -0,0 +1,282 @@ +import { docsMetadata } from "@/lib/utils"; + +export const metadata = docsMetadata({ + title: "File Routes", + description: + "File Routes is a core concept of UploadThing that defines what your users can upload", + category: "API Reference", +}); + +# File Routes + +File Routes are the routes you create with the helper instantiated by +[`createUploadthing`](/api-reference/server#create-uploadthing). Think of them +as the "endpoints" for what your users can upload. An object with file routes +constructs a file router where the keys (slugs) in the object are the names of +your endpoints. You can name your routes whatever you want, preferably something +that explains what the route does, e.g. `profilePicture`, `resume`, +`messageAttachment`, etc. + +Below you can see an example file router with a few routes: + +```ts +import { createUploadthing, type FileRouter } from "uploadthing/server"; + +const f = createUploadthing(); + +export const uploadRouter = { + // Example "profile picture upload" route - these can be named whatever you want! + profilePicture: f(["image"]) + .middleware(({ req }) => auth(req)) + .onUploadComplete((data) => console.log("file", data)), + + // This route takes an attached image OR video + messageAttachment: f(["image", "video"]) + .middleware(({ req }) => auth(req)) + .onUploadComplete((data) => console.log("file", data)), + + // Takes exactly ONE image up to 2MB + strictImageAttachment: f({ + image: { maxFileSize: "2MB", maxFileCount: 1, minFileCount: 1 }, + }) + .middleware(({ req }) => auth(req)) + .onUploadComplete((data) => console.log("file", data)), + + // Takes up to 4 2mb images and/or 1 256mb video + mediaPost: f({ + image: { maxFileSize: "2MB", maxFileCount: 4 }, + video: { maxFileSize: "256MB", maxFileCount: 1 }, + }) + .middleware(({ req }) => auth(req)) + .onUploadComplete((data) => console.log("file", data)), + + // Takes up to 4 2mb images, and the client will not resolve + // the upload until the `onUploadComplete` resolved. + withAwaitedServerData: f( + { image: { maxFileSize: "2MB", maxFileCount: 4 } }, + { awaitServerData: true }, + ) + .middleware(({ req }) => auth(req)) + .onUploadComplete((data) => { + return { foo: "bar" as const }; + }), +} satisfies FileRouter; + +export type UploadRouter = typeof uploadRouter; +``` + +## Route Config {{ since: '5.0' }} + +The `f` function takes two arguments. The first can be an array of `FileType`, +or a record mapping each `FileType` with a route config. The route config allow +more granular control, for example what files can be uploaded and how many of +them can be uploaded for a given upload. The array syntax will fallback to +applying the [defaults](#defaults) to all file types. + +A `FileType` can be any valid +[web MIME type](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_Types). +For example: use `application/json` to only allow JSON files to be uploaded. + +Additionally, you may pass any of the following custom types: `image`, `video`, +`audio`, `pdf` or `text`. These are shorthands that allows you to specify the +type of file without specifying the exact MIME type. Lastly, there's `blob` +which allows any file type. + +A route config can have the following properties: + + + + The maximum file size for a file of this type. `FileSize` is a string that + can be parsed as a number followed by a unit of measurement (`B`, `KB`, `MB`, or `GB`) + + \* The default max file size depends on the file type. 4MB is the default unless + using one of the custom file types: + + | File Type | Default Max Size | + | :-------- | :--------------- | + | image | 4MB | + | video | 16MB | + | audio | 8MB | + | blob | 8MB | + | pdf | 4MB | + | text | 64kB | + + + + The maximum number of files of this type that can be uploaded. + + + The minimum number of files of this type that must be uploaded. + + + The content disposition to set on the storage provider. Content disposition + indicates how the file is expected to be displayed in the browser. Read more + about content disposition on + [MDN](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition). + + + The [ACL](/concepts/regions-acl#access-controls) to set on the storage + provider. + + + + + ACL can only be overridden if you have enabled the "Allow Overriding ACL" + setting on the UploadThing dashboard. Attempts to override the ACL without + enabling this setting will result in an error. + + +## Route Options {{ since: '7.0' }} + +The second argument to the `f` function is an optional object of route options. +Route options are shared configurations for all file types in a route. These +configurations are not bound to a specific type of file that is uploaded, but +will apply to the entire route. + + + + Set this to `true` to wait for the server onUploadComplete data on the + client before running `onClientUploadComplete`. + + + + + +The `f` function returns a builder object that allows you to chain methods that +will run during the upload process. + +```ts +import { z } from "zod"; + +f(["image"]) + .input(z.object({ foo: z.string() })) + .middleware(async ({ req, input }) => { + input; + // ^? { foo: string } + return {}; + }) + .onUploadError(({ error, fileKey }) => {}) + .onUploadComplete(async (opts) => {}); +``` + +## `input` {{ since: '5.0' }} + +You can pass a [Zod](https://github.com/colinhacks/zod) schema to validate user +input from the client. This data comes from the client when the upload starts. +If validation here fails, an error will be thrown and none of your `middleware` +n'or `onUploadComplete` functions will be executed. + +The input is validated on **your** server and only leaves your server if you +pass it along from the `.middleware` to the `.onUploadComplete`. If you only use +the input in the middleware without returning it, the Uploadthing server won't +have any knowledge of it. + +## `middleware` {{ since: '5.0' }} + +This is the function where you authorize a user to do an upload. You can also +tag the upload with metadata here. Example using Clerk: + +```ts +import { currentUser } from "@clerk/nextjs"; + +import { UploadThingError } from "uploadthing/server"; + +f(["image"]) + .middleware(async ({ req, res }) => { + const user = await currentUser(); + + // Throw if user isn't signed in + if (!user) + throw new UploadThingError( + "You must be logged in to upload a profile picture", + ); + + // Return userId to be used in onUploadComplete + return { userId: user.id }; + }) + .onUploadComplete(async ({ metadata }) => { + console.log("Uploaded by user", metadata.userId); + }); +``` + + + Note: By default, a thrown `UploadThingError`'s message will be sent to the + client's `onError`. All other errors are turned into generic failure messages + to avoid leaking sensitive information. Read more about [error handling + here](/concepts/error-handling). + + +As of `v6.4`, you can also tag your metadata using the `UTFiles` symbol to +override the uploaded files attributes. This can be used to either rename the +file, or set a custom identifer for the file: + +```ts +import { UTFiles } from "uploadthing/server"; + +f(["image"]) + .middleware(async ({ req, files }) => { + const fileOverrides = files.map((file) => { + const newName = sluggify(file.name); + const myIdentifier = generateId(); + return { ...file, name: newName, customId: myIdentifier }; + }); + + // Return userId to be used in onUploadComplete + return { foo: "bar" as const, [UTFiles]: fileOverrides }; + }) + .onUploadComplete(async ({ metadata, file }) => { + // The UTFIles symbol is stripped from the metadata + metadata; // { foo: "bar" } + file.customId; // myIdentifier + }); +``` + +## `onUploadError` {{ since: '5.5' }} + +Called when an error occurs during the upload process. + +The function is called with a single object argument with the following +properties: + + + + The error that occurred. + + + The key of the file that failed to upload. + + + +## `onUploadComplete` {{ since: '5.0' }} + +This is the function you use to do something with the uploaded file, such as +persisting it to your database. Whatever you returned in the middleware will be +accessible here. Please note that `onUploadComplete` is the end of the chain, +each route must have one and it must be the last method in the builder chain. + +As of v6.0, you can return JSON serializable data from this function, which will +be passed to the clientside `onClientUploadComplete` callback. + +The function is called with a single object argument with the following +properties: + + + + The metadata that was returned from the [`middleware`](#middleware) + function. + + + An object with info for the file that was uploaded, such as the name, key, + size, url etc. + + diff --git a/docs/src/pages/getting-started/appdir.mdx b/docs/src/app/(docs)/getting-started/appdir/page.mdx similarity index 71% rename from docs/src/pages/getting-started/appdir.mdx rename to docs/src/app/(docs)/getting-started/appdir/page.mdx index 5d989f5e6a..d095074fab 100644 --- a/docs/src/pages/getting-started/appdir.mdx +++ b/docs/src/app/(docs)/getting-started/appdir/page.mdx @@ -1,18 +1,38 @@ -import { Callout, Steps, Tab, Tabs } from "nextra-theme-docs"; +import { docsMetadata } from "@/lib/utils"; -import EnvSetup from "./_shared/env-setup.mdx"; -import TailwindSetup from "./_shared/tailwind-setup.mdx"; +export const metadata = docsMetadata({ + title: "Next.js App Router Setup", + description: "Learn how to set up a Next.js app router with UploadThing", + category: "Getting Started", +}); # Next.js App Router Setup Oh, a little bleeding edge are we? We're big fans of `app/` and server components, and we think you'll love what we've built 🙏 - +## Setting up your environment + +### Install the packages + +```bash npm2yarn +npm install uploadthing @uploadthing/react +``` + +### Add env variables + +```bash {{ title: '.env' }} +UPLOADTHING_TOKEN=... # A token for interacting with the SDK +``` + + + If you don't already have a uploadthing secret key, [sign + up](https://uploadthing.com/sign-in) and create one from the + [dashboard!](https://uploadthing.com/dashboard) + ## Set Up A FileRouter - ### Creating your first FileRoute All files uploaded to uploadthing are associated with a FileRoute. The following @@ -25,9 +45,9 @@ of a FileRoute similar to an endpoint, it has: - `onUploadComplete` callback for when uploads are completed To get full insight into what you can do with the FileRoutes, please refer to -the [File Router API](/api-reference/server#file-routes). +the [File Router API](/file-routes). -```ts copy filename="app/api/uploadthing/core.ts" +```ts {{ title: 'app/api/uploadthing/core.ts' }} import { createUploadthing, type FileRouter } from "uploadthing/next"; import { UploadThingError } from "uploadthing/server"; @@ -66,12 +86,12 @@ export type OurFileRouter = typeof ourFileRouter; ### Create a Next.js API route using the FileRouter - + File path here doesn't matter, you can serve this from any route. We recommend serving it from `/api/uploadthing`. - + -```ts copy filename="app/api/uploadthing/route.ts" +```ts {{ title: 'app/api/uploadthing/route.ts' }} import { createRouteHandler } from "uploadthing/next"; import { ourFileRouter } from "./core"; @@ -86,31 +106,15 @@ export const { GET, POST } = createRouteHandler({ ``` > See configuration options in -> [server API reference](/api-reference/server#createroutehandler) - -### Add UploadThing's Styles +> [server API reference](/api-reference/server#create-route-handler) - - - - - - Include our CSS file in the root layout to make sure the components look right! - - ```tsx copy filename="app/layout.tsx" - import "@uploadthing/react/styles.css"; - ``` - - - - -### Create The UploadThing Components (Recommended) +## Create The UploadThing Components We provide components to make uploading easier. We **highly recommend re-exporting them with the types assigned**, but you CAN import the components individually from `@uploadthing/react` instead. -```ts copy filename="src/utils/uploadthing.ts" +```ts {{ title: 'src/utils/uploadthing.ts' }} import { generateUploadButton, generateUploadDropzone, @@ -122,14 +126,43 @@ export const UploadButton = generateUploadButton(); export const UploadDropzone = generateUploadDropzone(); ``` -### Mount A Button And Upload! +### Add UploadThing's Styles + + + + Wrap your Tailwind config with the `withUt` helper. You can learn more about our + Tailwind helper in the ["Theming" page](/concepts/theming#theming-with-tailwind-css) + + ```tsx + import { withUt } from "uploadthing/tw"; + + export default withUt({ + // Your existing Tailwind config + content: ["./src/**/*.{ts,tsx,mdx}"], + ... + }); + ``` + + + + Include our CSS file in the root layout to make sure the components look right! - + ```tsx + import "@uploadthing/react/styles.css"; + ``` + + + + + +## Mount A Button And Upload! + + Don't forget to add the `"use client;"` directive at the top of your file, since the `UploadButton` component needs to run on the client-side. - + -```tsx copy filename="app/example-uploader/page.tsx" +```tsx {{ title: "app/example-uploader/page.tsx" }} "use client"; import { UploadButton } from "~/utils/uploadthing"; @@ -154,12 +187,12 @@ export default function Home() { } ``` -### (Optional) UploadThing SSR Plugin +## Improving SSR {{ label: '💡 Optional' }} UploadThing needs to get info from your server to get permissions info. Normally this means a loading state. We built an optional plugin to prevent that -import { WithoutSSR, WithSSR } from "../../components/ssr-diff"; +import { WithoutSSR, WithSSR } from "@/components/SSRDiff";
@@ -170,7 +203,7 @@ To add SSR hydration and avoid that loading state, simply render the `` hydration helper in the body of your root layout **before** the children. -```tsx copy filename="app/layout.tsx" +```tsx {{title: "app/layout.tsx" }} import { NextSSRPlugin } from "@uploadthing/react/next-ssr-plugin"; import { extractRouterConfig } from "uploadthing/server"; @@ -200,13 +233,12 @@ export default function RootLayout({ } ``` - - --- ### 🎉 You're Done! -Want to customize the components? Check out the ["Theming" page](/theming) +Want to customize the components? Check out the +["Theming" page](/concepts/theming) Want to make your own components? Check out our -[useUploadThing hook](/api-reference/react#useuploadthing) +[useUploadThing hook](/api-reference/react#use-upload-thing) diff --git a/docs/src/pages/getting-started/astro.mdx b/docs/src/app/(docs)/getting-started/astro/page.mdx similarity index 72% rename from docs/src/pages/getting-started/astro.mdx rename to docs/src/app/(docs)/getting-started/astro/page.mdx index 0be4e0ff79..647e2426a5 100644 --- a/docs/src/pages/getting-started/astro.mdx +++ b/docs/src/app/(docs)/getting-started/astro/page.mdx @@ -1,7 +1,10 @@ -import { Callout, Steps, Tab, Tabs } from "nextra-theme-docs"; +import { docsMetadata } from "@/lib/utils"; -import EnvSetup from "./_shared/env-setup.mdx"; -import TailwindSetup from "./_shared/tailwind-setup.mdx"; +export const metadata = docsMetadata({ + title: "Astro Setup", + description: "Learn how to set up an Astro project with UploadThing", + category: "Getting Started", +}); # Astro Setup @@ -9,16 +12,33 @@ You can use Astro with any of the frontend frameworks we support. This guide will walk you through setting it up using React, but the steps will be near identical for other frameworks too. - + Check out a full example [here](https://github.com/pingdotgg/uploadthing/tree/main/examples/minimal-astro-react) - + + +## Setting up your environment + +### Install the packages - +```bash npm2yarn +npm install uploadthing @uploadthing/react +``` + +### Add env variables + +```bash +UPLOADTHING_TOKEN=... # A token for interacting with the SDK +``` + + + If you don't already have a uploadthing secret key, [sign + up](https://uploadthing.com/sign-in) and create one from the + [dashboard!](https://uploadthing.com/dashboard) + ## Set Up A FileRouter - ### Creating your first FileRoute All files uploaded to uploadthing are associated with a FileRoute. The following @@ -31,9 +51,9 @@ of a FileRoute similar to an endpoint, it has: - `onUploadComplete` callback for when uploads are completed To get full insight into what you can do with the FileRoutes, please refer to -the [File Router API](/api-reference/server#file-routes). +the [File Router API](/file-routes). -```ts copy filename="src/server/uploadthing.ts" +```ts {{title: "src/server/uploadthing.ts" }} import { createUploadthing, type FileRouter } from "uploadthing/server"; const f = createUploadthing(); @@ -71,54 +91,36 @@ export type OurFileRouter = typeof ourFileRouter; ### Create a Astro API route using the FileRouter - + File path here doesn't matter, you can serve this from any route. We recommend serving it from `/api/uploadthing`. - + -```ts copy filename="src/pages/api/uploadthing.ts" +```ts {{ title: "src/pages/api/uploadthing.ts" }} import { createRouteHandler } from "uploadthing/server"; import { ourFileRouter } from "~/server/uploadthing"; // Export routes for Next App Router -export const { GET, POST } = createRouteHandler({ +const handlers = createRouteHandler({ router: ourFileRouter, config: { - uploadthingSecret: import.meta.env.UPLOADTHING_SECRET, + token: import.meta.env.UPLOADTHING_TOKEN, }, }); +export { handlers as GET, handlers as POST }; ``` > See configuration options in -> [server API reference](/api-reference/server#createroutehandler) - -### Add UploadThing's Styles - - - - - - - Include our CSS file in the root layout to make sure the components look right! - - ```astro copy filename="src/layouts/root.astro" - --- - import "@uploadthing/react/styles.css"; - // ... - --- - ``` - - - +> [server API reference](/api-reference/server#create-route-handler) -### Create The UploadThing Components (Recommended) +## Create The UploadThing Components We provide components to make uploading easier. We **highly recommend re-exporting them with the types assigned**, but you CAN import the components individually from `@uploadthing/react` instead. -```ts copy filename="src/utils/uploadthing.ts" +```ts {{ title: "src/utils/uploadthing.ts" }} import { generateUploadButton, generateUploadDropzone, @@ -130,9 +132,40 @@ export const UploadButton = generateUploadButton(); export const UploadDropzone = generateUploadDropzone(); ``` +### Add UploadThing's Styles + + + + Wrap your Tailwind config with the `withUt` helper. You can learn more about our + Tailwind helper in the ["Theming" page](/concepts/theming#theming-with-tailwind-css) + + ```tsx + import { withUt } from "uploadthing/tw"; + + export default withUt({ + // Your existing Tailwind config + content: ["./src/**/*.{ts,tsx,mdx}"], + ... + }); + ``` + + + + Include our CSS file in the root layout to make sure the components look right! + + ```astro + --- + import "@uploadthing/react/styles.css"; + // ... + --- + ``` + + + + ### Mount A Button And Upload! -```tsx copy filename="src/components/image-uploader.tsx" +```tsx {{title: "src/components/image-uploader.tsx" }} import { UploadButton } from "~/utils/uploadthing"; export function ImageUploader() { @@ -153,12 +186,12 @@ export function ImageUploader() { } ``` - + Don't forget to add the `client:load` directive when mounting your component in an Astro island. - + -```astro copy filename="src/pages/index.astro" +```astro {{ title: "src/pages/index.astro" }} --- import Layout from "~/layouts/root.astro" import { ImageUploader } from "~/components/image-uploader"; @@ -168,9 +201,9 @@ import { ImageUploader } from "~/components/image-uploader"; ``` -### (Optional) Rendering with SSR +## Improving SSR {{ label: '💡 Optional' }} -import { WithoutSSR, WithSSR } from "../../components/ssr-diff"; +import { WithoutSSR, WithSSR } from "@/components/SSRDiff";
@@ -181,7 +214,7 @@ UploadThing needs to get info from your server to get permissions info. Normally this means a loading state, but you can inject the router config from server-rendered Astro components: -```astro copy filename="src/components/uploadthing-ssr.astro" +```astro {{ title: "src/components/uploadthing-ssr.astro" }} --- import { extractRouterConfig } from "uploadthing/server" import { uploadRouter } from "~/server/uploadthing"; @@ -206,7 +239,7 @@ const routerConfig = extractRouterConfig(uploadRouter); Then render this component in your layout: -```astro copy filename="src/layouts/root.astro" +```astro {{ title: "src/layouts/root.astro" }} --- import UploadThingSSR from "~/components/uploadthing-ssr.astro"; --- @@ -221,13 +254,12 @@ import UploadThingSSR from "~/components/uploadthing-ssr.astro"; ``` - - --- ### 🎉 You're Done! -Want to customize the components? Check out the ["Theming" page](/theming) +Want to customize the components? Check out the +["Theming" page](/concepts/theming) Want to make your own components? Check out our -[useUploadThing hook](/api-reference/react#useuploadthing) +[useUploadThing hook](/api-reference/react#use-upload-thing) diff --git a/docs/src/pages/getting-started/expo.mdx b/docs/src/app/(docs)/getting-started/expo/page.mdx similarity index 86% rename from docs/src/pages/getting-started/expo.mdx rename to docs/src/app/(docs)/getting-started/expo/page.mdx index 09f2fd4a42..f4122ff2a5 100644 --- a/docs/src/pages/getting-started/expo.mdx +++ b/docs/src/app/(docs)/getting-started/expo/page.mdx @@ -1,58 +1,53 @@ -import { Callout, Steps } from "nextra-theme-docs"; +import { docsMetadata } from "@/lib/utils"; + +export const metadata = docsMetadata({ + title: "Expo Setup", + description: "Learn how to set up an Expo project with UploadThing", + category: "Getting Started", +}); # Expo Setup UploadThing is the easiest way to add file uploads to your native mobile -applications powered by expo. +applications powered by export. - + Check out a full example [here](https://github.com/pingdotgg/uploadthing/tree/main/examples/minimal-expo) - + -## Package Setup - - +## Setting up your environment ### Install the packages -```bash copy npm2yarn +```bash npm2yarn npm install uploadthing @uploadthing/expo expo-image-picker expo-document-picker ``` ### Add env variables - - If you don't already have a uploadthing secret key, [sign - up](https://uploadthing.com/sign-in) and create one from the - [dashboard!](https://uploadthing.com/dashboard) - - -```bash copy -UPLOADTHING_SECRET=... # A secret key for your app (starts with sk_live_) -UPLOADTHING_APP_ID=... # Your app id +```bash +UPLOADTHING_TOKEN=... # A token for interacting with the SDK EXPO_PUBLIC_SERVER_URL=... # Absolute URL to your server ``` - + + If you don't already have a uploadthing secret key, [sign + up](https://uploadthing.com/sign-in) and create one from the + [dashboard!](https://uploadthing.com/dashboard) + ## Set Up A FileRouter - + Steps 1 and 2 below assumes you're using [Expo API routes](https://docs.expo.dev/router/reference/api-routes/) which are currently experimental. You can also choose to use a standalone server using some of our [backend adapters, e.g. Fetch](/backend-adapters/fetch) - + - ### Creating your first FileRoute - - For more details on how to create a file router, see the - [router](/api-reference/server#file-routes) docs - - All files uploaded to uploadthing are associated with a FileRoute. The following is a very minimalistic example, with a single FileRoute "imageUploader". Think of a FileRoute similar to an endpoint, it has: @@ -63,9 +58,9 @@ of a FileRoute similar to an endpoint, it has: - `onUploadComplete` callback for when uploads are completed To get full insight into what you can do with the FileRoutes, please refer to -the [File Router API](/api-reference/server#file-routes). +the [File Router API](/file-routes). -```ts copy filename="src/app/api/uploadthing+api.ts" +```ts {{ title: "src/app/api/uploadthing+api.ts" }} import { createUploadthing, UploadThingError } from "uploadthing/server"; import type { FileRouter } from "uploadthing/server"; @@ -104,18 +99,19 @@ export type UploadRouter = typeof uploadRouter; ### Create an API route using the FileRouter -```ts copy filename="src/app/api/uploadthing+api.ts" +```ts {{ title: 'src/app/api/uploadthing+api.ts' }} import { createRouteHandler } from "uploadthing/server"; const uploadRouter = { ... } satisfies FileRouter; export type UploadRouter = typeof uploadRouter; -export const { GET, POST } = createRouteHandler({ +const handlers = createRouteHandler({ router: uploadRouter, // Apply an (optional) custom config: // config: { ... }, -}); +}) +export { handlers as GET, handlers as POST } ``` > See configuration options in @@ -127,7 +123,7 @@ Unlike the other UploadThing packages, the Expo package does not include any prebuilt components. Instead, we provide some helper hooks to help interact with the native file pickers. -```tsx copy filename="src/utils/uploadthing.ts" +```tsx {{title: "src/utils/uploadthing.ts" }} import { generateReactNativeHelpers } from "@uploadthing/expo"; import type { UploadRouter } from "~/app/api/uploadthing+api"; @@ -145,7 +141,7 @@ export const { useImageUploader, useDocumentUploader } = ### Use the FileRouter in your app -```tsx copy filename="src/routes/index.tsx" +```tsx {{title: "src/routes/index.tsx" }} import { openSettings } from "expo-linking"; import { Alert, Pressable, StyleSheet, Text, View } from "react-native"; @@ -193,8 +189,6 @@ const styles = StyleSheet.create({ }); ``` - - ## Deployment Follow the diff --git a/docs/src/pages/getting-started/nuxt.mdx b/docs/src/app/(docs)/getting-started/nuxt/page.mdx similarity index 79% rename from docs/src/pages/getting-started/nuxt.mdx rename to docs/src/app/(docs)/getting-started/nuxt/page.mdx index 5f43faf25b..3e697690c3 100644 --- a/docs/src/pages/getting-started/nuxt.mdx +++ b/docs/src/app/(docs)/getting-started/nuxt/page.mdx @@ -1,52 +1,51 @@ -import { Callout, Steps, Tab, Tabs } from "nextra-theme-docs"; +import { docsMetadata } from "@/lib/utils"; -import EnvSetup from "./_shared/env-setup.mdx"; -import TailwindSetup from "./_shared/tailwind-setup.mdx"; +export const metadata = docsMetadata({ + title: "Nuxt Setup", + description: "Learn how to set up a Nuxt project with UploadThing", + category: "Getting Started", +}); # Getting Started using Nuxt The UploadThing Nuxt module makes it super easy to get started with uploading in Nuxt apps. It is a wrapper around `@uploadthing/vue` and the H3 backend adapter. - + Check out a full example [here](https://github.com/pingdotgg/uploadthing/tree/Mr0Bread/nuxt-support/examples/minimal-nuxt) - - + + Using standalone Vue without Nuxt? Checkout the standalone example [here](https://github.com/pingdotgg/uploadthing/tree/Mr0Bread/nuxt-support/examples/backend-adapters/client-vue) - + ## Package Setup - - ### Install the packages -```bash copy npm2yarn +```bash npm2yarn npm install uploadthing @uploadthing/nuxt ``` ### Add env variables ```bash -NUXT_UPLOADTHING_SECRET=... # A secret key for your app (starts with sk_live_) -# 🖕 NUXT_ prefix is **important** +NUXT_UPLOADTHING_TOKEN=... # A token for interacting with the SDK +# 👆 NUXT_ prefix is **important** ``` - + If you don't already have a uploadthing secret key, [sign up](https://uploadthing.com/sign-in) and create one from the [dashboard!](https://uploadthing.com/dashboard) - - - + ## Initialize the Uploadthing module -Add the `@uploadthing/nuxt` module to your `nuxt.config.js` file: +Add the `@uploadthing/nuxt` module to your `nuxt.config.ts` file: -```ts copy filename="nuxt.config.js" +```ts {{ title: "nuxt.config.ts" }} export default { modules: ["@uploadthing/nuxt"], uploadthing: { @@ -60,32 +59,19 @@ export default { ``` You can set some module options in the `uploadthing` property of your -`nuxt.config.js` file: +`nuxt.config.ts` file: ```ts /** * See https://docs.uploadthing.com/api-reference/server#createroutehandler * for more information about the `RouteHandlerConfig` options. */ -export type ModuleOptions = Omit< - RouteHandlerConfig, - "uploadthingSecret" | "uploadthingId" -> & { +export type ModuleOptions = RouteHandlerConfig & { /** * Path to your router definition file * @default `~/server/uploadthing.ts` */ routerPath?: string; - /** - * Your UploadThing secret key - * @default `process.env.NUXT_UPLOADTHING_SECRET` - */ - secret?: string; - /** - * Your UploadThing app ID - * @default `process.env.NUXT_UPLOADTHING_APP_ID` - */ - appId?: string; }; ``` @@ -101,14 +87,14 @@ of a FileRoute similar to an endpoint, it has: - `onUploadComplete` callback for when uploads are completed To get full insight into what you can do with the FileRoutes, please refer to -the [File Router API](/api-reference/server#file-routes). +the [File Router API](/file-routes). - + It is import you export the router as `uploadRouter` and the inferred type as `UploadRouter` for the module to pick up your router and it's types. - + -```ts copy filename="src/lib/server/uploadthing.ts" +```ts {{ title: "src/lib/server/uploadthing.ts" }} import type { H3Event } from "h3"; import { createUploadthing } from "uploadthing/h3"; @@ -144,11 +130,11 @@ export const uploadRouter = { export type UploadRouter = typeof uploadRouter; ``` -### Upload some files! +## Upload some files! Just mount one of our components in your app and start uploading files! -```vue copy filename="pages/index.vue" +```vue {{ title: "pages/index.vue" }} @@ -130,28 +148,14 @@ export { GET, POST }; -### Creating the UploadThing Helpers - -Generating the `createUploadThing` helper function lets you create your own -components, with full type safety: - -```ts copy filename="src/lib/utils/uploadthing.ts" -import type { OurFileRouter } from "$lib/server/uploadthing"; - -import { generateSvelteHelpers } from "@uploadthing/svelte"; - -export const { createUploader, createUploadThing } = - generateSvelteHelpers(); -``` - -### Use the FileRouter in your app +## Use the FileRouter in your app The `@uploadthing/svelte` package includes an "Uploader" component that you can simply drop into your app, and start uploading files immediately. To create the "Uploader" props you can use the "createUploader" helper you generated in the previous step. -```svelte copy filename="src/routes/+page.svelte" +```svelte {{ title: "src/routes/+page.svelte" }}
diff --git a/packages/svelte/src/lib/create-uploadthing.ts b/packages/svelte/src/lib/create-uploadthing.ts index 824c4dc9e0..b314b04a0c 100644 --- a/packages/svelte/src/lib/create-uploadthing.ts +++ b/packages/svelte/src/lib/create-uploadthing.ts @@ -34,16 +34,13 @@ export const INTERNAL_createUploadThingGen = < */ url: URL; }) => { - const uploadFiles = genUploader({ + const { uploadFiles } = genUploader({ url: initOpts.url, package: "@uploadthing/svelte", }); - const useUploadThing = < - TEndpoint extends keyof TRouter, - TSkipPolling extends boolean = false, - >( + const useUploadThing = ( endpoint: TEndpoint, - opts?: UseUploadthingProps, + opts?: UseUploadthingProps, ) => { const isUploading = writable(false); const permittedFileInfo = createEndpointMetadata( @@ -51,7 +48,7 @@ export const INTERNAL_createUploadThingGen = < endpoint as string, ); let uploadProgress = 0; - let fileProgress = new Map(); + let fileProgress = new Map(); type InferredInput = inferEndpointInput; type FuncInput = undefined extends InferredInput @@ -63,11 +60,10 @@ export const INTERNAL_createUploadThingGen = < const input = args[1]; isUploading.set(true); opts?.onUploadProgress?.(0); - files.forEach((f) => fileProgress.set(f.name, 0)); + files.forEach((f) => fileProgress.set(f, 0)); try { const res = await uploadFiles(endpoint, { files, - skipPolling: opts?.skipPolling, onUploadProgress: (progress) => { if (!opts?.onUploadProgress) return; fileProgress.set(progress.file, progress.progress); @@ -120,15 +116,9 @@ export const INTERNAL_createUploadThingGen = < }; const generateUploader = () => { - return < - TEndpoint extends keyof TRouter, - TSkipPolling extends boolean = false, - >( + return ( endpoint: TEndpoint, - props: Omit< - UploadthingComponentProps, - "endpoint" - >, + props: Omit, "endpoint">, ) => ({ endpoint, ...props }); }; @@ -139,10 +129,10 @@ export const generateSvelteHelpers = ( return { createUploadThing: INTERNAL_createUploadThingGen({ url }), - uploadFiles: genUploader({ + createUploader: generateUploader(), + ...genUploader({ url, package: "@uploadthing/svelte", }), - createUploader: generateUploader(), } as const; }; diff --git a/packages/svelte/src/lib/types.ts b/packages/svelte/src/lib/types.ts index 4cf7fbbd38..b2b6309e88 100644 --- a/packages/svelte/src/lib/types.ts +++ b/packages/svelte/src/lib/types.ts @@ -1,4 +1,6 @@ import type { + ClassListMerger, + ErrorMessage, ExtendObjectIf, MaybePromise, UploadThingError, @@ -27,10 +29,7 @@ export interface GenerateTypedHelpersOptions { export type UseUploadthingProps< TRouter extends FileRouter, TEndpoint extends keyof TRouter, - TSkipPolling extends boolean = false, - TServerOutput = false extends TSkipPolling - ? inferEndpointOutput - : null, + TServerOutput = inferEndpointOutput, > = { /** * Called when the upload is submitted and the server is about to be queried for presigned URLs @@ -46,18 +45,24 @@ export type UseUploadthingProps< */ onUploadProgress?: (p: number) => void; /** - * Skip polling for server data after upload is complete - * Useful if you want faster response times and don't need - * any data returned from the server `onUploadComplete` callback - * @default false + * This option has been moved to your serverside route config. + * Please opt-in by setting `awaitServerData: false` in your route + * config instead. + * ### Example + * ```ts + * f( + * { image: { maxFileSize: "1MB" } }, + * { awaitServerData: false } + * ).middleware(...) + * ``` + * @deprecated + * @see https://docs.uploadthing.com/api-reference/server#route-options */ - skipPolling?: TSkipPolling; + skipPolling?: ErrorMessage<"This option has been moved to your serverside route config. Please use `awaitServerData` in your route config instead.">; /** * Called when the file uploads are completed - * - If `skipPolling` is `true`, this will be called once - * all the files are uploaded to the storage provider. - * - If `skipPolling` is `false`, this will be called after - * the serverside `onUploadComplete` callback has finished + * @remarks If `RouteOptions.awaitServerData` is `true`, this will be + * called after the serverside `onUploadComplete` callback has finished */ onClientUploadComplete?: ( res: ClientUploadedFileData[], @@ -78,9 +83,8 @@ export type UseUploadthingProps< export type UploadthingComponentProps< TRouter extends FileRouter, TEndpoint extends keyof TRouter, - TSkipPolling extends boolean = false, > = Omit< - UseUploadthingProps, + UseUploadthingProps, /** * Signal is omitted, component has its own AbortController * If you need to control the interruption with more granularity, @@ -111,6 +115,13 @@ export type UploadthingComponentProps< config?: { mode?: "auto" | "manual"; appendOnPaste?: boolean; + /** + * Override the default class name merger, with e.g. tailwind-merge + * This may be required if you're customizing the component + * appearance with additional TailwindCSS classes to ensure + * classes are sorted and applied in the correct order + */ + cn?: ClassListMerger; }; disabled?: boolean; } & ExtendObjectIf< diff --git a/packages/uploadthing/package.json b/packages/uploadthing/package.json index 68a4f59547..6ec3314c98 100644 --- a/packages/uploadthing/package.json +++ b/packages/uploadthing/package.json @@ -99,6 +99,16 @@ "default": "./h3/index.cjs" } }, + "./remix": { + "import": { + "types": "./remix/index.d.ts", + "default": "./remix/index.js" + }, + "require": { + "types": "./remix/index.d.cts", + "default": "./remix/index.cjs" + } + }, "./types": { "types": "./types/index.d.ts", "default": "./types/index.js" @@ -123,6 +133,7 @@ "internal", "next", "next-legacy", + "remix", "server", "types", "tw" @@ -139,15 +150,15 @@ "typecheck": "tsc --noEmit" }, "dependencies": { - "@effect/schema": "0.68.18", + "@effect/platform": "0.63.2", + "@effect/schema": "0.72.2", "@uploadthing/mime-types": "workspace:*", "@uploadthing/shared": "workspace:*", - "consola": "^3.2.3", - "effect": "3.4.8", - "std-env": "^3.7.0" + "effect": "3.7.2", + "effect-log": "0.32.0" }, "devDependencies": { - "@effect/platform": "0.58.21", + "@remix-run/server-runtime": "^2.12.0", "@types/body-parser": "^1.19.5", "@types/express": "^4.17.21", "@types/express-serve-static-core": "^4.17.43", @@ -160,7 +171,7 @@ "express": "^4.18.2", "fastify": "^4.26.1", "h3": "^1.11.1", - "next": "14.2.3", + "next": "14.2.11", "nuxt": "^3.11.2", "solid-js": "^1.8.15", "tailwindcss": "^3.4.1", @@ -172,7 +183,6 @@ "zod": "^3.23.8" }, "peerDependencies": { - "@effect/platform": "*", "express": "*", "fastify": "*", "h3": "*", @@ -180,9 +190,6 @@ "tailwindcss": "*" }, "peerDependenciesMeta": { - "@effect/platform": { - "optional": true - }, "next": { "optional": true }, @@ -211,10 +218,6 @@ { "name": "fetch", "message": "fetch should be passed as parameter to support overriding default behaviors" - }, - { - "name": "process", - "message": "Use `import { process } from 'std-env` instead" } ], "no-restricted-imports": [ diff --git a/packages/uploadthing/src/client.ts b/packages/uploadthing/src/client.ts index 819a3589a6..058be62120 100644 --- a/packages/uploadthing/src/client.ts +++ b/packages/uploadthing/src/client.ts @@ -1,44 +1,29 @@ -import * as Arr from "effect/Array"; -import { unsafeCoerce } from "effect/Function"; import * as Micro from "effect/Micro"; -import * as Option from "effect/Option"; -import type { - ExpandedRouteConfig, - FetchError, - InvalidJsonError, -} from "@uploadthing/shared"; +import type { ExpandedRouteConfig } from "@uploadthing/shared"; import { - exponentialDelay, + asArray, FetchContext, - fetchEff, fileSizeToBytes, - getErrorTypeFromStatusCode, getTypeFromFileName, - isObject, objectKeys, - parseResponseJson, resolveMaybeUrlArg, - RetryError, UploadAbortedError, - UploadThingError, + UploadPausedError, } from "@uploadthing/shared"; import * as pkgJson from "../package.json"; -import { UPLOADTHING_VERSION } from "./internal/constants"; -import { uploadMultipartWithProgress } from "./internal/multi-part.browser"; -import { uploadPresignedPostWithProgress } from "./internal/presigned-post.browser"; -import type { - FileRouter, - inferEndpointOutput, - PresignedURLs, -} from "./internal/types"; -import type { UTReporter } from "./internal/ut-reporter"; +import type { Deferred } from "./internal/deferred"; +import { createDeferred } from "./internal/deferred"; +import type { FileRouter, inferEndpointOutput } from "./internal/types"; +import { uploadFile, uploadFilesInternal } from "./internal/upload.browser"; import { createUTReporter } from "./internal/ut-reporter"; import type { ClientUploadedFileData, + CreateUploadOptions, GenerateUploaderOptions, inferEndpointInput, + NewPresignedUrl, UploadFilesOptions, } from "./types"; @@ -53,6 +38,8 @@ export { generatePermittedFileTypes, /** @public */ UploadAbortedError, + /** @public */ + UploadPausedError, } from "@uploadthing/shared"; /** @@ -93,35 +80,181 @@ export const isValidFileSize = ( export const genUploader = ( initOpts: GenerateUploaderOptions, ) => { - return < + const controllableUpload = async < TEndpoint extends keyof TRouter, - TSkipPolling extends boolean = false, + TServerOutput = inferEndpointOutput, >( + slug: TEndpoint, + opts: Omit< + CreateUploadOptions, + keyof GenerateUploaderOptions + >, + ) => { + const uploads = new Map< + File, + { + presigned: NewPresignedUrl; + deferred: Deferred>; + } + >(); + + const utReporter = createUTReporter({ + endpoint: String(slug), + package: initOpts.package, + url: resolveMaybeUrlArg(initOpts?.url), + headers: opts.headers, + }); + + const presigneds = await Micro.runPromise( + utReporter("upload", { + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment + input: "input" in opts ? (opts.input as any) : null, + files: opts.files.map((f) => ({ + name: f.name, + size: f.size, + type: f.type, + lastModified: f.lastModified, + })), + }).pipe(Micro.provideService(FetchContext, window.fetch)), + ); + + const totalSize = opts.files.reduce((acc, f) => acc + f.size, 0); + let totalLoaded = 0; + + const uploadEffect = (file: File, presigned: NewPresignedUrl) => + uploadFile(file, presigned, { + onUploadProgress: (progressEvent) => { + totalLoaded += progressEvent.delta; + opts.onUploadProgress?.({ + ...progressEvent, + file, + progress: Math.round((progressEvent.loaded / file.size) * 100), + totalLoaded, + totalProgress: Math.round((totalLoaded / totalSize) * 100), + }); + }, + }).pipe(Micro.provideService(FetchContext, window.fetch)); + + for (const [i, p] of presigneds.entries()) { + const file = opts.files[i]; + + const deferred = createDeferred>(); + uploads.set(file, { deferred, presigned: p }); + + void Micro.runPromiseExit(uploadEffect(file, p), { + signal: deferred.ac.signal, + }) + .then((result) => { + if (result._tag === "Right") { + return deferred.resolve(result.right); + } else if (result.left._tag === "Interrupt") { + throw new UploadPausedError(); + } + throw Micro.causeSquash(result.left); + }) + .catch((err) => { + if (err instanceof UploadPausedError) return; + deferred.reject(err); + }); + } + + /** + * Pause an ongoing upload + * @param file The file upload you want to pause. Can be omitted to pause all files + */ + const pauseUpload = (file?: File) => { + const files = asArray(file ?? opts.files); + for (const file of files) { + const upload = uploads.get(file); + if (!upload) return; + + if (upload.deferred.ac.signal.aborted) { + // Cancel the upload if it's already been paused + throw new UploadAbortedError(); + } + + upload.deferred.ac.abort(); + } + }; + + /** + * Resume a paused upload + * @param file The file upload you want to resume. Can be omitted to resume all files + */ + const resumeUpload = (file?: File) => { + const files = asArray(file ?? opts.files); + for (const file of files) { + const upload = uploads.get(file); + if (!upload) throw "No upload found"; + + upload.deferred.ac = new AbortController(); + void Micro.runPromiseExit(uploadEffect(file, upload.presigned), { + signal: upload.deferred.ac.signal, + }) + .then((result) => { + if (result._tag === "Right") { + return upload.deferred.resolve(result.right); + } else if (result.left._tag === "Interrupt") { + throw new UploadPausedError(); + } + throw Micro.causeSquash(result.left); + }) + .catch((err) => { + if (err instanceof UploadPausedError) return; + upload.deferred.reject(err); + }); + } + }; + + /** + * Wait for an upload to complete + * @param file The file upload you want to wait for. Can be omitted to wait for all files + */ + const done = async ( + file?: T, + ): Promise< + T extends File + ? ClientUploadedFileData + : ClientUploadedFileData[] + > => { + const promises = []; + + const files = asArray(file ?? opts.files); + for (const file of files) { + const upload = uploads.get(file); + if (!upload) throw "No upload found"; + + promises.push(upload.deferred.promise); + } + + const results = await Promise.all(promises); + return (file ? results[0] : results) as never; + }; + + return { pauseUpload, resumeUpload, done }; + }; + + /** + * One step upload function that both requests presigned URLs + * and then uploads the files to UploadThing + */ + const typedUploadFiles = ( endpoint: TEndpoint, opts: Omit< - UploadFilesOptions, + UploadFilesOptions, keyof GenerateUploaderOptions >, ) => - uploadFilesInternal(endpoint, { + uploadFilesInternal(endpoint, { ...opts, + skipPolling: {} as never, // Remove in a future version, it's type right not is an ErrorMessage to help migrations. url: resolveMaybeUrlArg(initOpts?.url), package: initOpts.package, // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access input: (opts as any).input as inferEndpointInput, }) - .pipe( - Micro.provideService(FetchContext, { - fetch: globalThis.fetch.bind(globalThis), - baseHeaders: { - "x-uploadthing-version": UPLOADTHING_VERSION, - "x-uploadthing-api-key": undefined, - "x-uploadthing-fe-package": initOpts.package, - "x-uploadthing-be-adapter": undefined, - }, - }), - (e) => - Micro.runPromiseExit(e, opts.signal ? { signal: opts.signal } : {}), + .pipe((effect) => + Micro.runPromiseExit(effect, opts.signal && { signal: opts.signal }), ) .then((exit) => { if (exit._tag === "Right") { @@ -131,146 +264,6 @@ export const genUploader = ( } throw Micro.causeSquash(exit.left); }); -}; - -const uploadFilesInternal = < - TRouter extends FileRouter, - TEndpoint extends keyof TRouter, - TSkipPolling extends boolean = false, - TServerOutput = false extends TSkipPolling - ? inferEndpointOutput - : null, ->( - endpoint: TEndpoint, - opts: UploadFilesOptions, -): Micro.Micro< - ClientUploadedFileData[], - // TODO: Handle these errors instead of letting them bubble - UploadThingError | RetryError | FetchError | InvalidJsonError, - FetchContext -> => { - // classic service right here - const reportEventToUT = createUTReporter({ - endpoint: String(endpoint), - package: opts.package, - url: resolveMaybeUrlArg(opts.url), - headers: opts.headers, - }); - return reportEventToUT("upload", { - input: "input" in opts ? opts.input : null, - files: opts.files.map((f) => ({ - name: f.name, - size: f.size, - type: f.type, - })), - }).pipe( - Micro.flatMap((responses) => - Micro.forEach( - responses, - (presigned) => - uploadFile( - String(endpoint), - { ...opts, reportEventToUT }, - presigned, - ).pipe( - Micro.onInterrupt( - reportEventToUT("failure", { - fileKey: presigned.key, - uploadId: "uploadId" in presigned ? presigned.uploadId : null, - fileName: presigned.fileName, - }).pipe(Micro.ignore), - ), - ), - { concurrency: 6 }, - ), - ), - ); + return { uploadFiles: typedUploadFiles, createUpload: controllableUpload }; }; - -type Done = { status: "done"; callbackData: unknown }; -type StillWaiting = { status: "still waiting" }; -type PollingResponse = Done | StillWaiting; - -const isPollingResponse = (input: unknown): input is PollingResponse => { - if (!isObject(input)) return false; - if (input.status === "done") return "callbackData" in input; - return input.status === "still waiting"; -}; - -const isPollingDone = (input: PollingResponse): input is Done => { - return input.status === "done"; -}; - -const uploadFile = < - TRouter extends FileRouter, - TEndpoint extends keyof TRouter, - TSkipPolling extends boolean = false, - TServerOutput = false extends TSkipPolling - ? inferEndpointOutput - : null, ->( - slug: string, - opts: UploadFilesOptions & { - reportEventToUT: UTReporter; - }, - presigned: PresignedURLs[number], -) => - Arr.findFirst(opts.files, (file) => file.name === presigned.fileName).pipe( - Micro.fromOption, - Micro.mapError(() => { - // eslint-disable-next-line no-console - console.error("No file found for presigned URL", presigned); - return new UploadThingError({ - code: "NOT_FOUND", - message: "No file found for presigned URL", - cause: `Expected file with name ${presigned.fileName} but got '${opts.files.join(",")}'`, - }); - }), - Micro.tap((file) => opts.onUploadBegin?.({ file: file.name })), - Micro.tap((file) => - "urls" in presigned - ? uploadMultipartWithProgress(file, presigned, opts) - : uploadPresignedPostWithProgress(file, presigned, opts), - ), - Micro.zip( - fetchEff(presigned.pollingUrl, { - headers: { authorization: presigned.pollingJwt }, - }).pipe( - Micro.flatMap(parseResponseJson), - Micro.catchTag("BadRequestError", (e) => - Micro.fail( - new UploadThingError({ - code: getErrorTypeFromStatusCode(e.status), - message: e.message, - cause: e, - }), - ), - ), - Micro.filterOrFailCause(isPollingResponse, (_) => - Micro.causeDie( - "received a non PollingResponse from the polling endpoint", - ), - ), - Micro.filterOrFail(isPollingDone, () => new RetryError()), - Micro.map(({ callbackData }) => callbackData), - Micro.retry({ - while: (res) => res._tag === "RetryError", - schedule: exponentialDelay(), - }), - Micro.when(() => !opts.skipPolling), - Micro.map(Option.getOrNull), - Micro.map(unsafeCoerce), - ), - ), - Micro.map(([file, serverData]) => ({ - name: file.name, - size: file.size, - key: presigned.key, - serverData, - url: presigned.fileUrl, - appUrl: presigned.appUrl, - customId: presigned.customId, - type: file.type, - })), - ); diff --git a/packages/uploadthing/src/effect-platform.ts b/packages/uploadthing/src/effect-platform.ts index 5ac4f690fd..89eb171469 100644 --- a/packages/uploadthing/src/effect-platform.ts +++ b/packages/uploadthing/src/effect-platform.ts @@ -1,29 +1,12 @@ -import type { HttpBody } from "@effect/platform"; -import { - HttpMiddleware, - HttpRouter, - HttpServerRequest, - HttpServerResponse, -} from "@effect/platform"; +import { HttpRouter, HttpServerRequest } from "@effect/platform"; import * as Effect from "effect/Effect"; +import * as Layer from "effect/Layer"; import type { Json } from "@uploadthing/shared"; -import { - FetchContext, - getStatusCodeFromError, - UploadThingError, -} from "@uploadthing/shared"; -import { UPLOADTHING_VERSION } from "./internal/constants"; -import { formatError } from "./internal/error-formatter"; -import { - buildPermissionsInfoHandler, - buildRequestHandler, -} from "./internal/handler"; -import { incompatibleNodeGuard } from "./internal/incompat-node-guard"; -import { ConsolaLogger, withMinimalLogLevel } from "./internal/logger"; -import { toWebRequest } from "./internal/to-web-request"; -import type { FileRouter, RouteHandlerOptions } from "./internal/types"; +import { configProvider } from "./internal/config"; +import { createRequestHandler, MiddlewareArguments } from "./internal/handler"; +import type { FileRouter, RouteHandlerConfig } from "./internal/types"; import type { CreateBuilderOptions } from "./internal/upload-builder"; import { createBuilder } from "./internal/upload-builder"; @@ -40,77 +23,40 @@ export const createUploadthing = ( opts?: CreateBuilderOptions, ) => createBuilder(opts); -export const createRouteHandler = ( - opts: RouteHandlerOptions, -): HttpRouter.HttpRouter => { - incompatibleNodeGuard(); - - const requestHandler = buildRequestHandler( - opts, - "effect-platform", - ); - const getBuildPerms = buildPermissionsInfoHandler(opts); - - const appendUploadThingResponseHeaders = HttpMiddleware.make( - Effect.map( - HttpServerResponse.setHeader( - "x-uploadthing-version", - UPLOADTHING_VERSION, - ), - ), +export const createRouteHandler = (opts: { + router: TRouter; + /** + * @remarks In order to obey by Effect conventions, we have omitted the `config.fetch` and `config.logLevel` options. + * You can provide these layers on your own if you need to. + * + * @example + * ```ts + * import { Effect, Layer, Logger, LogLevel } from "effect"; + * import { HttpClient } from "@effect/platform"; + + * // Set logLevel + * Logger.withMinimumLogLevel(LogLevel.Debug) + * + * // Override fetch implementation + * Layer.succeed( + * HttpClient.Fetch, + * myFetchImplementation, + * ); + * ``` + */ + config?: Omit; +}) => { + const router = Effect.runSync( + createRequestHandler(opts, "effect-platform"), ); - return HttpRouter.empty.pipe( - HttpRouter.get("/", HttpServerResponse.json(getBuildPerms())), - HttpRouter.post( - "/", - Effect.flatMap(HttpServerRequest.HttpServerRequest, (req) => - requestHandler({ - /** - * TODO: Redo this to be more cross-platform - * This should handle WinterCG and Node.js runtimes, - * unsure about others... - * Perhaps we can use `Http.request.ServerRequest` internally? - */ - req: Effect.if(req.source instanceof Request, { - onTrue: () => Effect.succeed(req.source as Request), - onFalse: () => - req.json.pipe( - // eslint-disable-next-line @typescript-eslint/no-unsafe-argument - Effect.flatMap((body) => toWebRequest(req.source as any, body)), - Effect.catchTags({ - RequestError: (error) => - new UploadThingError({ - code: "BAD_REQUEST", - message: "INVALID_JSON", - cause: error, - }), - }), - ), - }), - middlewareArgs: { req, res: undefined, event: undefined }, - }).pipe( - withMinimalLogLevel(opts.config?.logLevel), - Effect.provide(ConsolaLogger), - Effect.provideService(FetchContext, { - fetch: opts.config?.fetch ?? globalThis.fetch, - baseHeaders: { - "x-uploadthing-version": UPLOADTHING_VERSION, - // These are filled in later in `parseAndValidateRequest` - "x-uploadthing-api-key": undefined, - "x-uploadthing-be-adapter": undefined, - "x-uploadthing-fe-package": undefined, - }, - }), - Effect.andThen((response) => HttpServerResponse.json(response.body)), - Effect.catchTag("UploadThingError", (error) => - HttpServerResponse.json(formatError(error, opts.router), { - status: getStatusCodeFromError(error), - }), - ), - ), - ), - ), - HttpRouter.use(appendUploadThingResponseHeaders), - ); + return HttpRouter.provideServiceEffect( + router, + MiddlewareArguments, + Effect.map(HttpServerRequest.HttpServerRequest, (serverRequest) => ({ + req: serverRequest, + res: undefined, + event: undefined, + })), + ).pipe(Effect.provide(Layer.setConfigProvider(configProvider(opts.config)))); }; diff --git a/packages/uploadthing/src/express.ts b/packages/uploadthing/src/express.ts index d96ed5bd13..7807b4d550 100644 --- a/packages/uploadthing/src/express.ts +++ b/packages/uploadthing/src/express.ts @@ -1,3 +1,4 @@ +import { Readable } from "node:stream"; import * as Effect from "effect/Effect"; import type { Request as ExpressRequest, @@ -6,16 +7,8 @@ import type { import { Router as ExpressRouter } from "express"; import type { Json } from "@uploadthing/shared"; -import { getStatusCodeFromError } from "@uploadthing/shared"; -import { UPLOADTHING_VERSION } from "./internal/constants"; -import { formatError } from "./internal/error-formatter"; -import { - buildPermissionsInfoHandler, - buildRequestHandler, - runRequestHandlerAsync, -} from "./internal/handler"; -import { incompatibleNodeGuard } from "./internal/incompat-node-guard"; +import { makeAdapterHandler } from "./internal/handler"; import { getPostBody, toWebRequest } from "./internal/to-web-request"; import type { FileRouter, RouteHandlerOptions } from "./internal/types"; import type { CreateBuilderOptions } from "./internal/upload-builder"; @@ -37,50 +30,26 @@ export const createUploadthing = ( export const createRouteHandler = ( opts: RouteHandlerOptions, ): ExpressRouter => { - incompatibleNodeGuard(); - - const requestHandler = buildRequestHandler( + const handler = makeAdapterHandler<[ExpressRequest, ExpressResponse]>( + (req, res) => Effect.succeed({ req, res, event: undefined }), + (req) => + Effect.flatMap(getPostBody({ req }), (body) => + toWebRequest(req, body), + ).pipe(Effect.orDie), opts, "express", ); - const getBuildPerms = buildPermissionsInfoHandler(opts); - const router = ExpressRouter(); - - // eslint-disable-next-line @typescript-eslint/no-misused-promises - router.post("/", async (req, res) => { - const response = await runRequestHandlerAsync( - requestHandler, - { - req: getPostBody({ req }).pipe( - Effect.andThen((body) => toWebRequest(req, body)), - ), - middlewareArgs: { req, res, event: undefined }, - }, - opts.config, - ); - - if (response.success === false) { - res.status(getStatusCodeFromError(response.error)); - res.setHeader("x-uploadthing-version", UPLOADTHING_VERSION); - res.send(JSON.stringify(formatError(response.error, opts.router))); - return; - } - - res.setHeader("x-uploadthing-version", UPLOADTHING_VERSION); - res.send(JSON.stringify(response.body)); - }); - router.get("/", (_req, res) => { - res.status(200); - res.setHeader("x-uploadthing-version", UPLOADTHING_VERSION); - - res.send(JSON.stringify(getBuildPerms())); - }); - - return router; + return ExpressRouter().all( + "/", + // eslint-disable-next-line @typescript-eslint/no-misused-promises + async (req, res) => { + const response = await handler(req, res); + res.writeHead(response.status, Object.fromEntries(response.headers)); + if (!response.body) return res.end(); + // Slight type mismatch in `node:stream.ReadableStream` and Fetch's `ReadableStream`. + // eslint-disable-next-line @typescript-eslint/no-unsafe-argument + return Readable.fromWeb(response.body as any).pipe(res); + }, + ); }; - -/** - * @deprecated Use {@link createRouteHandler} instead - */ -export const createUploadthingExpressHandler = createRouteHandler; diff --git a/packages/uploadthing/src/fastify.ts b/packages/uploadthing/src/fastify.ts index 7326714c0d..cfc104d40d 100644 --- a/packages/uploadthing/src/fastify.ts +++ b/packages/uploadthing/src/fastify.ts @@ -1,21 +1,9 @@ -import type { - FastifyInstance, - FastifyReply, - FastifyRequest, - RouteHandlerMethod, -} from "fastify"; +import * as Effect from "effect/Effect"; +import type { FastifyInstance, FastifyReply, FastifyRequest } from "fastify"; import type { Json } from "@uploadthing/shared"; -import { getStatusCodeFromError } from "@uploadthing/shared"; -import { UPLOADTHING_VERSION } from "./internal/constants"; -import { formatError } from "./internal/error-formatter"; -import { - buildPermissionsInfoHandler, - buildRequestHandler, - runRequestHandlerAsync, -} from "./internal/handler"; -import { incompatibleNodeGuard } from "./internal/incompat-node-guard"; +import { makeAdapterHandler } from "./internal/handler"; import { toWebRequest } from "./internal/to-web-request"; import type { FileRouter, RouteHandlerOptions } from "./internal/types"; import type { CreateBuilderOptions } from "./internal/upload-builder"; @@ -39,52 +27,20 @@ export const createRouteHandler = ( opts: RouteHandlerOptions, done: (err?: Error) => void, ) => { - incompatibleNodeGuard(); - - const requestHandler = buildRequestHandler( + const handler = makeAdapterHandler<[FastifyRequest, FastifyReply]>( + (req, res) => Effect.succeed({ req, res, event: undefined }), + (req) => toWebRequest(req), opts, "fastify", ); - const getBuildPerms = buildPermissionsInfoHandler(opts); - - const POST: RouteHandlerMethod = async (req, res) => { - const response = await runRequestHandlerAsync( - requestHandler, - { - req: toWebRequest(req), - middlewareArgs: { req, res, event: undefined }, - }, - opts.config, - ); - - if (response.success === false) { - void res - .status(getStatusCodeFromError(response.error)) - .headers({ "x-uploadthing-version": UPLOADTHING_VERSION }) - .send(formatError(response.error, opts.router)); - return; - } - void res - .headers({ "x-uploadthing-version": UPLOADTHING_VERSION }) + fastify.all("/api/uploadthing", async (req, res) => { + const response = await handler(req, res); + return res + .status(response.status) + .headers(Object.fromEntries(response.headers)) .send(response.body); - }; - - const GET: RouteHandlerMethod = async (req, res) => { - void res - .status(200) - .headers({ - "x-uploadthing-version": UPLOADTHING_VERSION, - }) - .send(getBuildPerms()); - }; - - fastify.post("/api/uploadthing", POST).get("/api/uploadthing", GET); + }); done(); }; - -/** - * @deprecated Use {@link createRouteHandler} instead - */ -export const fastifyUploadthingPlugin = createRouteHandler; diff --git a/packages/uploadthing/src/h3.ts b/packages/uploadthing/src/h3.ts index 226f25ab8a..5dddf4e001 100644 --- a/packages/uploadthing/src/h3.ts +++ b/packages/uploadthing/src/h3.ts @@ -1,23 +1,10 @@ +import * as Effect from "effect/Effect"; import type { H3Event } from "h3"; -import { - assertMethod, - defineEventHandler, - setHeader, - setResponseStatus, - toWebRequest, -} from "h3"; +import { defineEventHandler, toWebRequest } from "h3"; import type { Json } from "@uploadthing/shared"; -import { getStatusCodeFromError } from "@uploadthing/shared"; -import { UPLOADTHING_VERSION } from "./internal/constants"; -import { formatError } from "./internal/error-formatter"; -import { - buildPermissionsInfoHandler, - buildRequestHandler, - runRequestHandlerAsync, -} from "./internal/handler"; -import { incompatibleNodeGuard } from "./internal/incompat-node-guard"; +import { makeAdapterHandler } from "./internal/handler"; import type { FileRouter, RouteHandlerOptions } from "./internal/types"; import type { CreateBuilderOptions } from "./internal/upload-builder"; import { createBuilder } from "./internal/upload-builder"; @@ -34,43 +21,12 @@ export const createUploadthing = ( export const createRouteHandler = ( opts: RouteHandlerOptions, ) => { - incompatibleNodeGuard(); - - const requestHandler = buildRequestHandler( + const handler = makeAdapterHandler<[H3Event]>( + (event) => Effect.succeed({ req: undefined, res: undefined, event }), + (event) => Effect.succeed(toWebRequest(event)), opts, "h3", ); - const getBuildPerms = buildPermissionsInfoHandler(opts); - - return defineEventHandler(async (event) => { - assertMethod(event, ["GET", "POST"]); - setHeader(event, "x-uploadthing-version", UPLOADTHING_VERSION); - - // GET - if (event.method === "GET") { - return getBuildPerms(); - } - // POST - const response = await runRequestHandlerAsync( - requestHandler, - { - req: toWebRequest(event), - middlewareArgs: { req: undefined, res: undefined, event }, - }, - opts.config, - ); - - if (response.success === false) { - setResponseStatus(event, getStatusCodeFromError(response.error)); - return formatError(response.error, opts.router); - } - - return response.body ?? { ok: true }; - }); + return defineEventHandler(handler); }; - -/** - * @deprecated Use {@link createRouteHandler} instead - */ -export const createH3EventHandler = createRouteHandler; diff --git a/packages/uploadthing/src/internal/config.test.ts b/packages/uploadthing/src/internal/config.test.ts new file mode 100644 index 0000000000..edf39c24ad --- /dev/null +++ b/packages/uploadthing/src/internal/config.test.ts @@ -0,0 +1,316 @@ +import { after } from "node:test"; +import * as S from "@effect/schema/Schema"; +import { it } from "@effect/vitest"; +import * as Effect from "effect/Effect"; +import * as Exit from "effect/Exit"; +import * as Layer from "effect/Layer"; +import { afterEach, beforeEach, describe, expect } from "vitest"; + +import { UploadThingError } from "@uploadthing/shared"; + +import { configProvider, IngestUrl, IsDevelopment, UTToken } from "./config"; +import { ParsedToken, UploadThingToken } from "./shared-schemas"; + +const app1TokenData = { + apiKey: "sk_foo", + appId: "app-1", + regions: ["fra1"] as const, +}; +const app2TokenData = { + apiKey: "sk_bar", + appId: "app-2", + regions: ["dub1"] as const, +}; + +beforeEach(() => { + process.env = {} as any; + // import.meta.env = {} as any; +}); + +describe("utToken", () => { + it.effect("fails if no token is provided as env", () => + Effect.gen(function* () { + const token = yield* UTToken.pipe( + Effect.provide(Layer.setConfigProvider(configProvider(null))), + Effect.exit, + ); + + expect(token).toEqual( + Exit.fail( + new UploadThingError({ + code: "MISSING_ENV", + message: + "Missing token. Please set the `UPLOADTHING_TOKEN` environment variable or provide a token manually through config.", + }), + ), + ); + }), + ); + + it.effect("fails if an invalid token is provided", () => + Effect.gen(function* () { + process.env.UPLOADTHING_TOKEN = "some-token-that-is-not-a-token"; + + const token = yield* UTToken.pipe( + Effect.provide(Layer.setConfigProvider(configProvider(null))), + Effect.exit, + ); + + expect(token).toEqual( + Exit.fail( + new UploadThingError({ + code: "INVALID_SERVER_CONFIG", + message: + "Invalid token. A token is a base64 encoded JSON object matching { apiKey: string, appId: string, regions: string[] }.", + }), + ), + ); + }), + ); + + it.effect("succeeds if token is provided as env", () => + Effect.gen(function* () { + process.env.UPLOADTHING_TOKEN = yield* S.encode(UploadThingToken)( + ParsedToken.make(app1TokenData), + ); + + const token = yield* UTToken.pipe( + Effect.provide(Layer.setConfigProvider(configProvider(null))), + Effect.exit, + ); + + expect(token).toEqual( + Exit.succeed({ + ...app1TokenData, + ingestHost: "ingest.uploadthing.com", + }), + ); + }), + ); + + it.effect("with import.meta.env", () => + Effect.gen(function* () { + import.meta.env.UPLOADTHING_TOKEN = yield* S.encode(UploadThingToken)( + ParsedToken.make(app1TokenData), + ); + + const token = yield* UTToken.pipe( + Effect.provide(Layer.setConfigProvider(configProvider(null))), + Effect.exit, + ); + + expect(token).toEqual( + Exit.succeed({ + ...app1TokenData, + ingestHost: "ingest.uploadthing.com", + }), + ); + + delete import.meta.env.UPLOADTHING_TOKEN; + }), + ); + + it.effect("fails if no token is provided as option", () => + Effect.gen(function* () { + const token = yield* UTToken.pipe( + Effect.provide( + Layer.setConfigProvider(configProvider({ noToken: "here" })), + ), + Effect.exit, + ); + + expect(token).toEqual( + Exit.fail( + new UploadThingError({ + code: "MISSING_ENV", + message: + "Missing token. Please set the `UPLOADTHING_TOKEN` environment variable or provide a token manually through config.", + }), + ), + ); + }), + ); + + it.effect("fails if an invalid token is provided as option", () => + Effect.gen(function* () { + const badToken = "some-token"; + + const token = yield* UTToken.pipe( + Effect.provide( + Layer.setConfigProvider(configProvider({ token: badToken })), + ), + Effect.exit, + ); + + expect(token).toEqual( + Exit.fail( + new UploadThingError({ + code: "INVALID_SERVER_CONFIG", + message: + "Invalid token. A token is a base64 encoded JSON object matching { apiKey: string, appId: string, regions: string[] }.", + }), + ), + ); + }), + ); + + it.effect("succeeds if token is provided as option", () => + Effect.gen(function* () { + const testTokenStr = yield* S.encode(UploadThingToken)( + ParsedToken.make(app1TokenData), + ); + + const token = yield* UTToken.pipe( + Effect.provide( + Layer.setConfigProvider(configProvider({ token: testTokenStr })), + ), + Effect.exit, + ); + + expect(token).toEqual( + Exit.succeed({ + ...app1TokenData, + ingestHost: "ingest.uploadthing.com", + }), + ); + }), + ); + + it.effect("with ingestHost specified", () => + Effect.gen(function* () { + const testTokenStr = yield* S.encode(UploadThingToken)( + ParsedToken.make({ + ...app1TokenData, + ingestHost: "ingest.ut-staging.com", + }), + ); + + const token = yield* UTToken.pipe( + Effect.provide( + Layer.setConfigProvider(configProvider({ token: testTokenStr })), + ), + Effect.exit, + ); + + expect(token).toEqual( + Exit.succeed({ + ...app1TokenData, + ingestHost: "ingest.ut-staging.com", + }), + ); + }), + ); + + it.effect("options take precedence over env", () => + Effect.gen(function* () { + process.env.UPLOADTHING_TOKEN = yield* S.encode(UploadThingToken)( + ParsedToken.make(app1TokenData), + ); + + const token2Str = yield* S.encode(UploadThingToken)( + ParsedToken.make(app2TokenData), + ); + + const token = yield* UTToken.pipe( + Effect.provide( + Layer.setConfigProvider(configProvider({ token: token2Str })), + ), + Effect.exit, + ); + + expect(token).toEqual( + Exit.succeed({ + ...app2TokenData, + ingestHost: "ingest.uploadthing.com", + }), + ); + }), + ); +}); + +describe("ingest url infers correctly", () => { + it.effect("takes from env if provided", () => + Effect.gen(function* () { + process.env.UPLOADTHING_TOKEN = yield* S.encode(UploadThingToken)( + ParsedToken.make(app1TokenData), + ); + process.env.UPLOADTHING_INGEST_URL = "http://localhost:1234"; + + const url = yield* IngestUrl.pipe( + Effect.provide(Layer.setConfigProvider(configProvider(null))), + Effect.exit, + ); + + expect(url).toEqual(Exit.succeed("http://localhost:1234")); + }), + ); + + it.effect("infers from token region if no env is provided", () => + Effect.gen(function* () { + process.env.UPLOADTHING_TOKEN = yield* S.encode(UploadThingToken)( + ParsedToken.make(app1TokenData), + ); + + const url = yield* IngestUrl.pipe( + Effect.provide(Layer.setConfigProvider(configProvider(null))), + Effect.exit, + ); + + expect(url).toEqual(Exit.succeed("https://fra1.ingest.uploadthing.com")); + }), + ); +}); + +describe("IsDevelopment", () => { + it.effect("defaults to false", () => + Effect.gen(function* () { + const isDev = yield* IsDevelopment.pipe( + Effect.provide(Layer.setConfigProvider(configProvider(null))), + Effect.exit, + ); + + expect(isDev).toEqual(Exit.succeed(false)); + }), + ); + + it.effect("is true if NODE_ENV is development", () => + Effect.gen(function* () { + // @ts-expect-error - it says it's readonly but we can mutate it + process.env.NODE_ENV = "development"; + + const isDev = yield* IsDevelopment.pipe( + Effect.provide(Layer.setConfigProvider(configProvider(null))), + Effect.exit, + ); + + expect(isDev).toEqual(Exit.succeed(true)); + }), + ); + + it.effect("is true if UPLOADTHING_IS_DEV is true", () => + Effect.gen(function* () { + // eslint-disable-next-line turbo/no-undeclared-env-vars + process.env.UPLOADTHING_IS_DEV = "true"; + + const isDev = yield* IsDevelopment.pipe( + Effect.provide(Layer.setConfigProvider(configProvider(null))), + Effect.exit, + ); + + expect(isDev).toEqual(Exit.succeed(true)); + }), + ); + + it.effect("is true if config set", () => + Effect.gen(function* () { + const isDev = yield* IsDevelopment.pipe( + Effect.provide( + Layer.setConfigProvider(configProvider({ isDev: true })), + ), + Effect.exit, + ); + + expect(isDev).toEqual(Exit.succeed(true)); + }), + ); +}); diff --git a/packages/uploadthing/src/internal/config.ts b/packages/uploadthing/src/internal/config.ts new file mode 100644 index 0000000000..6a77d311c1 --- /dev/null +++ b/packages/uploadthing/src/internal/config.ts @@ -0,0 +1,91 @@ +import * as S from "@effect/schema/Schema"; +import * as Config from "effect/Config"; +import * as ConfigProvider from "effect/ConfigProvider"; +import * as Effect from "effect/Effect"; + +import { + filterDefinedObjectValues, + UploadThingError, +} from "@uploadthing/shared"; + +import { UploadThingToken } from "./shared-schemas"; + +export { version as UPLOADTHING_VERSION } from "../../package.json"; + +/** + * Merge in `import.meta.env` to the built-in `process.env` provider + * Prefix keys with `UPLOADTHING_` so we can reference just the name. + * @example + * process.env.UPLOADTHING_TOKEN = "foo" + * Config.string("token"); // Config<"foo"> + */ +const envProvider = ConfigProvider.fromEnv().pipe( + ConfigProvider.orElse(() => + ConfigProvider.fromMap( + new Map( + Object.entries( + filterDefinedObjectValues( + // fuck this I give up. import.meta is a mistake, someone else can fix it + (import.meta as unknown as { env: Record })?.env ?? + {}, + ), + ), + ), + { + pathDelim: "_", + }, + ), + ), + ConfigProvider.nested("uploadthing"), + ConfigProvider.constantCase, +); + +/** + * Config provider that merges the options from the object + * and environment variables prefixed with `UPLOADTHING_`. + * @remarks Options take precedence over environment variables. + */ +export const configProvider = (options: unknown) => + ConfigProvider.fromJson(options ?? {}).pipe( + ConfigProvider.orElse(() => envProvider), + ); + +export const IsDevelopment = Config.boolean("isDev").pipe( + Config.orElse(() => + Config.succeed( + typeof process !== "undefined" ? process.env.NODE_ENV : undefined, + ).pipe(Config.map((_) => _ === "development")), + ), + Config.withDefault(false), +); + +export const UTToken = S.Config("token", UploadThingToken).pipe( + Effect.catchTags({ + ConfigError: (e) => + new UploadThingError({ + code: e._op === "InvalidData" ? "INVALID_SERVER_CONFIG" : "MISSING_ENV", + message: + e._op === "InvalidData" + ? "Invalid token. A token is a base64 encoded JSON object matching { apiKey: string, appId: string, regions: string[] }." + : "Missing token. Please set the `UPLOADTHING_TOKEN` environment variable or provide a token manually through config.", + cause: e, + }), + }), +); + +export const ApiUrl = Config.string("apiUrl").pipe( + Config.withDefault("https://api.uploadthing.com"), + Config.mapAttempt((_) => new URL(_)), + Config.map((url) => url.href.replace(/\/$/, "")), +); + +export const IngestUrl = Effect.gen(function* () { + const { regions, ingestHost } = yield* UTToken; + const region = regions[0]; // Currently only support 1 region per app + + return yield* Config.string("ingestUrl").pipe( + Config.withDefault(`https://${region}.${ingestHost}`), + Config.mapAttempt((_) => new URL(_)), + Config.map((url) => url.href.replace(/\/$/, "")), + ); +}); diff --git a/packages/uploadthing/src/internal/constants.ts b/packages/uploadthing/src/internal/constants.ts deleted file mode 100644 index 816698aeb7..0000000000 --- a/packages/uploadthing/src/internal/constants.ts +++ /dev/null @@ -1 +0,0 @@ -export { version as UPLOADTHING_VERSION } from "../../package.json"; diff --git a/packages/uploadthing/src/internal/deferred.ts b/packages/uploadthing/src/internal/deferred.ts new file mode 100644 index 0000000000..aca485c05d --- /dev/null +++ b/packages/uploadthing/src/internal/deferred.ts @@ -0,0 +1,17 @@ +export type Deferred = { + resolve: (value: T) => void; + reject: (reason?: any) => void; + ac: AbortController; + promise: Promise; +}; + +export const createDeferred = (): Deferred => { + let resolve!: (value: T) => void; + let reject!: (reason?: any) => void; + const ac = new AbortController(); + const promise = new Promise((res, rej) => { + resolve = res; + reject = rej; + }); + return { promise, ac, resolve, reject }; +}; diff --git a/packages/uploadthing/src/internal/dev-hook.ts b/packages/uploadthing/src/internal/dev-hook.ts deleted file mode 100644 index 72bc097890..0000000000 --- a/packages/uploadthing/src/internal/dev-hook.ts +++ /dev/null @@ -1,123 +0,0 @@ -import * as S from "@effect/schema/Schema"; -import * as Duration from "effect/Duration"; -import * as Effect from "effect/Effect"; -import * as Schedule from "effect/Schedule"; - -import { - fetchEff, - generateUploadThingURL, - parseResponseJson, - RetryError, - signPayload, - UploadThingError, -} from "@uploadthing/shared"; -import type { ResponseEsque } from "@uploadthing/shared"; - -import type { MPUResponse, PSPResponse } from "./shared-schemas"; -import { PollUploadResponse, UploadedFileData } from "./shared-schemas"; - -const isValidResponse = (response: ResponseEsque) => { - if (!response.ok) return false; - if (response.status >= 400) return false; - if (!response.headers.has("x-uploadthing-version")) return false; - - return true; -}; - -export const conditionalDevServer = ( - presigned: PSPResponse | MPUResponse, - apiKey: string, -) => { - return Effect.gen(function* () { - const file = yield* fetchEff( - generateUploadThingURL(`/v6/pollUpload/${presigned.key}`), - ).pipe( - Effect.andThen(parseResponseJson), - Effect.andThen(S.decodeUnknown(PollUploadResponse)), - Effect.andThen((res) => - res.status === "done" && res.fileData - ? Effect.succeed(res.fileData) - : Effect.fail(new RetryError()), - ), - Effect.retry({ - while: (err) => err instanceof RetryError, - schedule: Schedule.exponential(10, 4).pipe( - // 10ms, 40ms, 160ms, 640ms... - Schedule.union(Schedule.spaced(1000)), - Schedule.compose(Schedule.elapsed), - Schedule.whileOutput(Duration.lessThanOrEqualTo(Duration.minutes(1))), - ), - }), - Effect.catchTag( - "RetryError", - () => - new UploadThingError({ - code: "UPLOAD_FAILED", - message: "File took too long to upload", - }), - ), - ); - - let callbackUrl = file.callbackUrl + `?slug=${file.callbackSlug}`; - if (!callbackUrl.startsWith("http")) callbackUrl = "http://" + callbackUrl; - - yield* Effect.logInfo( - `SIMULATING FILE UPLOAD WEBHOOK CALLBACK`, - callbackUrl, - ); - - const payload = JSON.stringify({ - status: "uploaded", - metadata: JSON.parse(file.metadata ?? "{}") as unknown, - file: new UploadedFileData({ - url: presigned.fileUrl, - appUrl: presigned.appUrl, - key: presigned.key, - name: file.fileName, - size: file.fileSize, - customId: file.customId, - type: file.fileType, - }), - }); - - const signature = yield* Effect.tryPromise({ - try: () => signPayload(payload, apiKey), - catch: (e) => - new UploadThingError({ - code: "INTERNAL_SERVER_ERROR", - message: "Failed to sign payload", - cause: e, - }), - }); - - const callbackResponse = yield* fetchEff(callbackUrl, { - method: "POST", - body: payload, - headers: { - "Content-Type": "application/json", - "uploadthing-hook": "callback", - "x-uploadthing-signature": signature, - }, - }).pipe( - Effect.catchTag("FetchError", () => - Effect.succeed(new Response(null, { status: 500 })), - ), - ); - - if (isValidResponse(callbackResponse)) { - yield* Effect.logInfo( - "Successfully simulated callback for file", - presigned.key, - ); - } else { - yield* Effect.logError( - ` -Failed to simulate callback for file '${file.fileKey}'. Is your webhook configured correctly? - - Make sure the URL '${callbackUrl}' is accessible without any authentication. You can verify this by running 'curl -X POST ${callbackUrl}' in your terminal - - Still facing issues? Read https://docs.uploadthing.com/faq for common issues -`.trim(), - ); - } - return file; - }); -}; diff --git a/packages/uploadthing/src/internal/get-api-key.ts b/packages/uploadthing/src/internal/get-api-key.ts deleted file mode 100644 index 50b5723993..0000000000 --- a/packages/uploadthing/src/internal/get-api-key.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { process } from "std-env"; - -import { UploadThingError } from "@uploadthing/shared"; - -export const getApiKey = (apiKey?: string) => { - if (apiKey) return apiKey; - if (process.env.UPLOADTHING_SECRET) return process.env.UPLOADTHING_SECRET; - return undefined; -}; - -export const getApiKeyOrThrow = (apiKey?: string) => { - const key = getApiKey(apiKey); - if (!key?.startsWith("sk_")) { - throw new UploadThingError({ - code: "MISSING_ENV", - message: "Missing or invalid API key. API keys must start with `sk_`.", - }); - } - return key; -}; diff --git a/packages/uploadthing/src/internal/handler.ts b/packages/uploadthing/src/internal/handler.ts index b42fbf8a61..227dd8228c 100644 --- a/packages/uploadthing/src/internal/handler.ts +++ b/packages/uploadthing/src/internal/handler.ts @@ -1,228 +1,419 @@ +import { + HttpApp, + HttpBody, + HttpClient, + HttpClientRequest, + HttpClientResponse, + HttpRouter, + HttpServerRequest, + HttpServerResponse, +} from "@effect/platform"; import * as S from "@effect/schema/Schema"; +import { PrettyLogger } from "effect-log"; +import * as Config from "effect/Config"; +import * as Context from "effect/Context"; import * as Effect from "effect/Effect"; +import * as Layer from "effect/Layer"; +import * as ManagedRuntime from "effect/ManagedRuntime"; +import * as Match from "effect/Match"; import { - FetchContext, - fetchEff, fillInputRouteConfig, - generateUploadThingURL, + generateKey, + generateSignedURL, + getStatusCodeFromError, + getTypeFromFileName, objectKeys, - parseRequestJson, - parseResponseJson, UploadThingError, verifySignature, } from "@uploadthing/shared"; -import { UPLOADTHING_VERSION } from "./constants"; -import { conditionalDevServer } from "./dev-hook"; -import { ConsolaLogger, withMinimalLogLevel } from "./logger"; -import { - abortMultipartUpload, - completeMultipartUpload, -} from "./multi-part.server"; +import * as pkgJson from "../../package.json"; +import { configProvider, IngestUrl, IsDevelopment, UTToken } from "./config"; +import { formatError } from "./error-formatter"; +import { handleJsonLineStream } from "./jsonl"; +import { withMinimalLogLevel } from "./logger"; import { getParseFn } from "./parser"; -import { resolveCallbackUrl } from "./resolve-url"; +import { assertFilesMeetConfig, extractRouterConfig } from "./route-config"; import { - FailureActionPayload, - MultipartCompleteActionPayload, - PresignedURLResponse, - ServerCallbackPostResponse, + ActionType, + CallbackResultResponse, + MetadataFetchResponse, + MetadataFetchStreamPart, UploadActionPayload, UploadedFileData, + UploadThingHook, } from "./shared-schemas"; +import { UTFiles } from "./types"; import type { + AnyParams, FileRouter, MiddlewareFnArgs, - RequestHandler, - RequestHandlerInput, - RequestHandlerOutput, - RequestHandlerSuccess, - RouteHandlerConfig, RouteHandlerOptions, + Uploader, UTEvents, ValidMiddlewareObject, } from "./types"; -import { UTFiles } from "./types"; -import { - assertFilesMeetConfig, - parseAndValidateRequest, - RequestInput, -} from "./validate-request-input"; - -/** - * Allows adapters to be fully async/await instead of providing services and running Effect programs - */ -export const runRequestHandlerAsync = < - TArgs extends MiddlewareFnArgs, ->( - handler: RequestHandler, - args: RequestHandlerInput, - config?: RouteHandlerConfig | undefined, -) => - handler(args).pipe( - withMinimalLogLevel(config?.logLevel), - Effect.provide(ConsolaLogger), - Effect.provideService(FetchContext, { - fetch: config?.fetch ?? globalThis.fetch, - baseHeaders: { - "x-uploadthing-version": UPLOADTHING_VERSION, - // These are filled in later in `parseAndValidateRequest` - "x-uploadthing-api-key": undefined, - "x-uploadthing-be-adapter": undefined, - "x-uploadthing-fe-package": undefined, - }, - }), - asHandlerOutput, - Effect.runPromise, + +export class MiddlewareArguments extends Context.Tag( + "uploadthing/MiddlewareArguments", +)>() {} + +export const makeAdapterHandler = ( + makeMiddlewareArgs: ( + ...args: Args + ) => Effect.Effect>, + toRequest: (...args: Args) => Effect.Effect, + opts: RouteHandlerOptions, + beAdapter: string, +): ((...args: Args) => Promise) => { + const layer = Layer.provide( + Layer.mergeAll( + PrettyLogger.layer({ showFiberId: false }), + withMinimalLogLevel, + HttpClient.layer, + Layer.succeed( + HttpClient.Fetch, + opts.config?.fetch as typeof globalThis.fetch, + ), + ), + Layer.setConfigProvider(configProvider(opts.config)), ); -const asHandlerOutput = ( - effect: Effect.Effect, -): Effect.Effect => - Effect.catchAll(effect, (error) => Effect.succeed({ success: false, error })); - -const handleRequest = RequestInput.pipe( - Effect.andThen(({ action, hook }) => { - if (hook === "callback") return handleCallbackRequest; - switch (action) { - case "upload": - return handleUploadAction; - case "multipart-complete": - return handleMultipartCompleteAction; - case "failure": - return handleMultipartFailureAction; - } - }), - Effect.map((output): RequestHandlerSuccess => ({ success: true, ...output })), -); - -export const buildRequestHandler = - >( - opts: RouteHandlerOptions, - adapter: string, - ): RequestHandler => - (input) => - handleRequest.pipe( + const managed = ManagedRuntime.make(layer); + + const handle = Effect.promise(() => + managed.runtime().then(HttpApp.toWebHandlerRuntime), + ); + + const app = (...args: Args) => + Effect.map( + Effect.promise(() => + managed.runPromise(createRequestHandler(opts, beAdapter)), + ), Effect.provideServiceEffect( - RequestInput, - parseAndValidateRequest(input, opts, adapter), + MiddlewareArguments, + makeMiddlewareArgs(...args), ), - Effect.catchTags({ - InvalidJson: (e) => - new UploadThingError({ - code: "INTERNAL_SERVER_ERROR", - message: "An error occured while parsing input/output", - cause: e, - }), - BadRequestError: (e) => - new UploadThingError({ - code: "INTERNAL_SERVER_ERROR", - message: e.getMessage(), - cause: e, - data: e.json as never, - }), - FetchError: (e) => - new UploadThingError({ - code: "INTERNAL_SERVER_ERROR", - message: typeof e.error === "string" ? e.error : e.message, - cause: e, - data: e.error as never, + ); + + return async (...args: Args) => + await handle.pipe( + Effect.ap(app(...args)), + Effect.ap(toRequest(...args)), + Effect.withLogSpan("requestHandler"), + managed.runPromise, + ); +}; + +export const createRequestHandler = ( + opts: RouteHandlerOptions, + beAdapter: string, +) => + Effect.gen(function* () { + const isDevelopment = yield* IsDevelopment; + const routerConfig = yield* extractRouterConfig(opts.router); + + const handleDaemon = (() => { + if (opts.config?.handleDaemonPromise) { + return opts.config.handleDaemonPromise; + } + return isDevelopment ? "void" : "await"; + })(); + if (isDevelopment && handleDaemon === "await") { + return yield* new UploadThingError({ + code: "INVALID_SERVER_CONFIG", + message: 'handleDaemonPromise: "await" is forbidden in development.', + }); + } + + const GET = Effect.gen(function* () { + return yield* HttpServerResponse.json(routerConfig); + }); + + const POST = Effect.gen(function* () { + const { + "uploadthing-hook": uploadthingHook, + "x-uploadthing-package": fePackage, + "x-uploadthing-version": clientVersion, + } = yield* HttpServerRequest.schemaHeaders( + S.Struct({ + "uploadthing-hook": UploadThingHook.pipe(S.optional), + "x-uploadthing-package": S.String.pipe( + S.optionalWith({ default: () => "unknown" }), + ), + "x-uploadthing-version": S.String.pipe( + S.optionalWith({ default: () => pkgJson.version }), + ), + }), + ); + + if (clientVersion !== pkgJson.version) { + const msg = `Server version: ${pkgJson.version}, Client version: ${clientVersion}`; + yield* Effect.logError(msg); + return yield* new UploadThingError({ + code: "BAD_REQUEST", + message: "Client version mismatch", + cause: msg, + }); + } + + const { slug, actionType } = yield* HttpRouter.schemaParams( + S.Struct({ + actionType: ActionType.pipe(S.optional), + slug: S.String, + }), + ); + + const uploadable = opts.router[slug]; + if (!uploadable) { + const msg = `No file route found for slug ${slug}`; + yield* Effect.logError(msg); + return yield* new UploadThingError({ + code: "NOT_FOUND", + message: msg, + }); + } + + const { body, fiber } = yield* Match.value({ + actionType, + uploadthingHook, + }).pipe( + Match.when({ actionType: "upload", uploadthingHook: undefined }, () => + handleUploadAction({ + uploadable, + fePackage, + beAdapter, + slug, }), + ), + Match.when({ actionType: undefined, uploadthingHook: "callback" }, () => + handleCallbackRequest({ uploadable, fePackage, beAdapter }), + ), + Match.when({ actionType: undefined, uploadthingHook: "error" }, () => + handleErrorRequest({ uploadable }), + ), + Match.orElse(() => Effect.succeed({ body: null, fiber: null })), + ); + + if (fiber) { + yield* Effect.logDebug("Running fiber as daemon").pipe( + Effect.annotateLogs("handleDaemon", handleDaemon), + ); + if (handleDaemon === "void") { + // noop + } else if (handleDaemon === "await") { + yield* fiber.await; + } else if (typeof handleDaemon === "function") { + handleDaemon(Effect.runPromise(fiber.await)); + } + } + + yield* Effect.logDebug("Sending response").pipe( + Effect.annotateLogs("body", body), + ); + + return yield* HttpServerResponse.json(body); + }).pipe( + Effect.catchTags({ ParseError: (e) => - new UploadThingError({ - code: "INTERNAL_SERVER_ERROR", - message: "An error occured while parsing input/output", - cause: e, + HttpServerResponse.json( + formatError( + new UploadThingError({ + code: "BAD_REQUEST", + message: "Invalid input", + cause: e.message, + }), + opts.router, + ), + { status: 400 }, + ), + UploadThingError: (e) => + // eslint-disable-next-line @typescript-eslint/no-unsafe-argument + HttpServerResponse.json(formatError(e, opts.router), { + status: getStatusCodeFromError(e), }), }), - Effect.tapError((e) => Effect.logError(e.message)), ); -const handleCallbackRequest = Effect.gen(function* () { - const { req, uploadable, apiKey } = yield* RequestInput; - const verified = yield* Effect.tryPromise({ - try: async () => - verifySignature( - await req.clone().text(), - req.headers.get("x-uploadthing-signature"), - apiKey, - ), - catch: () => - new UploadThingError({ + const appendResponseHeaders = Effect.map( + HttpServerResponse.setHeader("x-uploadthing-version", pkgJson.version), + ); + + return HttpRouter.empty.pipe( + HttpRouter.get("*", GET), + HttpRouter.post("*", POST), + HttpRouter.use(appendResponseHeaders), + ); + }).pipe(Effect.withLogSpan("createRequestHandler")); + +const handleErrorRequest = (opts: { uploadable: Uploader }) => + Effect.gen(function* () { + const { uploadable } = opts; + const request = yield* HttpServerRequest.HttpServerRequest; + const { apiKey } = yield* UTToken; + const verified = yield* verifySignature( + yield* request.text, + request.headers["x-uploadthing-signature"], + apiKey, + ); + yield* Effect.logDebug(`Signature verified: ${verified}`); + if (!verified) { + yield* Effect.logError("Invalid signature"); + return yield* new UploadThingError({ code: "BAD_REQUEST", message: "Invalid signature", + }); + } + + const requestInput = yield* HttpServerRequest.schemaBodyJson( + S.Struct({ + fileKey: S.String, + error: S.String, }), - }); - yield* Effect.logDebug("Signature verified:", verified); - if (!verified) { - yield* Effect.logError("Invalid signature"); - return yield* new UploadThingError({ - code: "BAD_REQUEST", - message: "Invalid signature", - }); - } + ); + yield* Effect.logDebug("Handling error callback request with input:").pipe( + Effect.annotateLogs("json", requestInput), + ); + + const fiber = yield* Effect.tryPromise({ + try: async () => + uploadable._def.onUploadError({ + error: new UploadThingError({ + code: "UPLOAD_FAILED", + message: `Upload failed for ${requestInput.fileKey}: ${requestInput.error}`, + }), + fileKey: requestInput.fileKey, + }), + catch: (error) => + new UploadThingError({ + code: "INTERNAL_SERVER_ERROR", + message: "Failed to run onUploadError", + cause: error, + }), + }) + .pipe( + Effect.tapError((error) => + Effect.logError( + "Failed to run onUploadError. You probably shouldn't be throwing errors here.", + ).pipe(Effect.annotateLogs("error", error)), + ), + ) + .pipe(Effect.ignoreLogged, Effect.forkDaemon); + + return { + body: null, + fiber, + }; + }).pipe(Effect.withLogSpan("handleErrorRequest")); + +const handleCallbackRequest = (opts: { + uploadable: Uploader; + fePackage: string; + beAdapter: string; +}) => + Effect.gen(function* () { + const { uploadable, fePackage, beAdapter } = opts; + const request = yield* HttpServerRequest.HttpServerRequest; + const { apiKey } = yield* UTToken; + const verified = yield* verifySignature( + yield* request.text, + request.headers["x-uploadthing-signature"], + apiKey, + ); + yield* Effect.logDebug(`Signature verified: ${verified}`); + if (!verified) { + yield* Effect.logError("Invalid signature"); + return yield* new UploadThingError({ + code: "BAD_REQUEST", + message: "Invalid signature", + }); + } - const requestInput = yield* Effect.flatMap( - parseRequestJson(req), - S.decodeUnknown( + const requestInput = yield* HttpServerRequest.schemaBodyJson( S.Struct({ status: S.String, file: UploadedFileData, - metadata: S.Record(S.String, S.Unknown), + metadata: S.Record({ key: S.String, value: S.Unknown }), }), - ), - ); - yield* Effect.logDebug("Handling callback request with input:", requestInput); - - const serverData = yield* Effect.tryPromise({ - try: async () => - uploadable.resolver({ - file: requestInput.file, - metadata: requestInput.metadata, - }) as Promise, - catch: (error) => - new UploadThingError({ - code: "INTERNAL_SERVER_ERROR", - message: "Failed to run onUploadComplete", - cause: error, - }), - }).pipe( - Effect.tapError((error) => - Effect.logError( - "Failed to run onUploadComplete. You probably shouldn't be throwing errors here.", - error, - ), - ), - ); - const payload = { - fileKey: requestInput.file.key, - callbackData: serverData ?? null, - }; - yield* Effect.logDebug( - "'onUploadComplete' callback finished. Sending response to UploadThing:", - payload, - ); + ); + yield* Effect.logDebug("Handling callback request with input:").pipe( + Effect.annotateLogs("json", requestInput), + ); - yield* fetchEff(generateUploadThingURL("/v6/serverCallback"), { - method: "POST", - body: JSON.stringify(payload), - headers: { "Content-Type": "application/json" }, - }).pipe( - Effect.andThen(parseResponseJson), - Effect.andThen(S.decodeUnknown(ServerCallbackPostResponse)), - ); - return { body: null }; -}); + /** + * Run `.onUploadComplete` as a daemon to prevent the + * request from UT to potentially timeout. + */ + const fiber = yield* Effect.gen(function* () { + const serverData = yield* Effect.tryPromise({ + try: async () => + uploadable.resolver({ + file: requestInput.file, + metadata: requestInput.metadata, + }) as Promise, + catch: (error) => + new UploadThingError({ + code: "INTERNAL_SERVER_ERROR", + message: + "Failed to run onUploadComplete. You probably shouldn't be throwing errors here.", + cause: error, + }), + }); + const payload = { + fileKey: requestInput.file.key, + callbackData: serverData ?? null, + }; + yield* Effect.logDebug( + "'onUploadComplete' callback finished. Sending response to UploadThing:", + ).pipe(Effect.annotateLogs("callbackData", payload)); + + const baseUrl = yield* IngestUrl; + const httpClient = yield* HttpClient.HttpClient; + yield* HttpClientRequest.post(`/callback-result`).pipe( + HttpClientRequest.prependUrl(baseUrl), + HttpClientRequest.setHeaders({ + "x-uploadthing-api-key": apiKey, + "x-uploadthing-version": pkgJson.version, + "x-uploadthing-be-adapter": beAdapter, + "x-uploadthing-fe-package": fePackage, + }), + HttpClientRequest.jsonBody(payload), + Effect.flatMap(HttpClient.filterStatusOk(httpClient)), + Effect.tapErrorTag("ResponseError", ({ response: res }) => + Effect.flatMap(res.json, (json) => + Effect.logError( + `Failed to register callback result (${res.status})`, + ).pipe(Effect.annotateLogs("error", json)), + ), + ), + HttpClientResponse.schemaBodyJsonScoped(CallbackResultResponse), + Effect.tap(Effect.log("Sent callback result to UploadThing")), + ); + }).pipe(Effect.ignoreLogged, Effect.forkDaemon); + + return { body: null, fiber }; + }).pipe(Effect.withLogSpan("handleCallbackRequest")); -const runRouteMiddleware = (opts: S.Schema.Type) => +const runRouteMiddleware = (opts: { + json: typeof UploadActionPayload.Type; + uploadable: Uploader; +}) => Effect.gen(function* () { - const { uploadable, middlewareArgs } = yield* RequestInput; - const { files, input } = opts; + const middlewareArgs = yield* MiddlewareArguments; + const { + json: { files, input }, + uploadable, + } = opts; yield* Effect.logDebug("Running middleware"); - const metadata: ValidMiddlewareObject = yield* Effect.tryPromise({ + const metadata = yield* Effect.tryPromise({ try: async () => - uploadable._def.middleware({ ...middlewareArgs, input, files }), + uploadable._def.middleware({ + ...middlewareArgs, + input, + files, + }) as Promise, catch: (error) => error instanceof UploadThingError ? error @@ -231,11 +422,7 @@ const runRouteMiddleware = (opts: S.Schema.Type) => message: "Failed to run middleware", cause: error, }), - }).pipe( - Effect.tapError((error) => - Effect.logError("An error occured in your middleware function", error), - ), - ); + }); if (metadata[UTFiles] && metadata[UTFiles].length !== files.length) { const msg = `Expected files override to have the same length as original files, got ${metadata[UTFiles].length} but expected ${files.length}`; @@ -259,234 +446,244 @@ const runRouteMiddleware = (opts: S.Schema.Type) => return { name: theirs?.name ?? file.name, size: file.size, + type: file.type, customId: theirs?.customId, + lastModified: theirs?.lastModified ?? Date.now(), }; }), ); return { metadata, filesWithCustomIds }; - }); - -const handleUploadAction = Effect.gen(function* () { - const opts = yield* RequestInput; - const { files, input } = yield* Effect.flatMap( - parseRequestJson(opts.req), - S.decodeUnknown(UploadActionPayload), - ); - yield* Effect.logDebug("Handling upload request with input:", { - files, - input, - }); - - // validate the input - yield* Effect.logDebug("Parsing user input"); - const inputParser = opts.uploadable._def.inputParser; - const parsedInput = yield* Effect.tryPromise({ - try: async () => getParseFn(inputParser)(input), - catch: (error) => - new UploadThingError({ - code: "BAD_REQUEST", - message: "Invalid input", - cause: error, - }), - }).pipe( - Effect.tapError((error) => - Effect.logError("An error occured trying to parse input", error), - ), - ); - yield* Effect.logDebug("Input parsed successfully", parsedInput); - - const { metadata, filesWithCustomIds } = yield* runRouteMiddleware({ - input: parsedInput, - files, - }); + }).pipe(Effect.withLogSpan("runRouteMiddleware")); + +const handleUploadAction = (opts: { + uploadable: Uploader; + fePackage: string; + beAdapter: string; + slug: string; +}) => + Effect.gen(function* () { + const httpClient = yield* HttpClient.HttpClient; + const { uploadable, fePackage, beAdapter, slug } = opts; + const json = yield* HttpServerRequest.schemaBodyJson(UploadActionPayload); + yield* Effect.logDebug("Handling upload request").pipe( + Effect.annotateLogs("json", json), + ); - yield* Effect.logDebug( - "Parsing route config", - opts.uploadable._def.routerConfig, - ); - const parsedConfig = yield* fillInputRouteConfig( - opts.uploadable._def.routerConfig, - ).pipe( - Effect.catchTag( - "InvalidRouteConfig", - (err) => + // validate the input + yield* Effect.logDebug("Parsing user input"); + const inputParser = uploadable._def.inputParser; + const parsedInput = yield* Effect.tryPromise({ + try: async () => getParseFn(inputParser)(json.input), + catch: (error) => new UploadThingError({ code: "BAD_REQUEST", - message: "Invalid config", - cause: err, + message: "Invalid input", + cause: error, }), - ), - ); - yield* Effect.logDebug("Route config parsed successfully", parsedConfig); + }); + yield* Effect.logDebug("Input parsed successfully").pipe( + Effect.annotateLogs("input", parsedInput), + ); - yield* Effect.logDebug( - "Validating files meet the config requirements", - files, - ); - yield* assertFilesMeetConfig(files, parsedConfig).pipe( - Effect.mapError( - (e) => - new UploadThingError({ - code: "BAD_REQUEST", - message: `Invalid config: ${e._tag}`, - cause: "reason" in e ? e.reason : e.message, - }), - ), - ); + const { metadata, filesWithCustomIds } = yield* runRouteMiddleware({ + json: { input: parsedInput, files: json.files }, + uploadable, + }); - const callbackUrl = yield* resolveCallbackUrl.pipe( - Effect.tapError((error) => - Effect.logError("Failed to resolve callback URL", error), - ), - Effect.catchTag( - "InvalidURL", - (err) => - new UploadThingError({ - code: "INTERNAL_SERVER_ERROR", - message: err.message, - }), - ), - ); - yield* Effect.logDebug( - "Retrieving presigned URLs from UploadThing. Callback URL is:", - callbackUrl.href, - ); + yield* Effect.logDebug("Parsing route config").pipe( + Effect.annotateLogs("routerConfig", uploadable._def.routerConfig), + ); + const parsedConfig = yield* fillInputRouteConfig( + uploadable._def.routerConfig, + ).pipe( + Effect.catchTag( + "InvalidRouteConfig", + (err) => + new UploadThingError({ + code: "BAD_REQUEST", + message: "Invalid route config", + cause: err, + }), + ), + ); + yield* Effect.logDebug("Route config parsed successfully").pipe( + Effect.annotateLogs("routeConfig", parsedConfig), + ); - const presignedUrls = yield* fetchEff( - generateUploadThingURL("/v6/prepareUpload"), - { - method: "POST", - body: JSON.stringify({ - files: filesWithCustomIds, - routeConfig: parsedConfig, - metadata, - callbackUrl: callbackUrl.origin + callbackUrl.pathname, - callbackSlug: opts.slug, + yield* Effect.logDebug( + "Validating files meet the config requirements", + ).pipe(Effect.annotateLogs("files", json.files)); + yield* assertFilesMeetConfig(json.files, parsedConfig).pipe( + Effect.mapError( + (e) => + new UploadThingError({ + code: "BAD_REQUEST", + message: `Invalid config: ${e._tag}`, + cause: "reason" in e ? e.reason : e.message, + }), + ), + ); + yield* Effect.logDebug("Files validated."); + + const fileUploadRequests = yield* Effect.forEach( + filesWithCustomIds, + (file) => + Effect.map( + getTypeFromFileName(file.name, objectKeys(parsedConfig)), + (type) => ({ + name: file.name, + size: file.size, + type: file.type, + lastModified: file.lastModified, + customId: file.customId, + contentDisposition: + parsedConfig[type]?.contentDisposition ?? "inline", + acl: parsedConfig[type]?.acl, + }), + ), + ).pipe( + Effect.catchTags({ + /** Shouldn't happen since config is validated above so just dying is fine I think */ + InvalidFileType: (e) => Effect.die(e), + UnknownFileType: (e) => Effect.die(e), }), - headers: { "Content-Type": "application/json" }, - }, - ).pipe( - Effect.andThen(parseResponseJson), - Effect.andThen(S.decodeUnknown(PresignedURLResponse)), - ); + ); - yield* Effect.logDebug("UploadThing responded with:", presignedUrls); - yield* Effect.logDebug("Sending presigned URLs to client"); - - let promise: Promise | undefined = undefined; - if (opts.isDev) { - const fetchContext = yield* FetchContext; - promise = Effect.forEach( - presignedUrls, - (presigned) => - conditionalDevServer(presigned, opts.apiKey).pipe(Effect.either), - { concurrency: 10 }, - ).pipe( - Effect.provide(ConsolaLogger), - Effect.provideService(FetchContext, fetchContext), - Effect.runPromise, + const routeOptions = uploadable._def.routeOptions; + const { apiKey, appId } = yield* UTToken; + const ingestUrl = yield* IngestUrl; + const isDev = yield* IsDevelopment; + + yield* Effect.logDebug("Generating presigned URLs").pipe( + Effect.annotateLogs("fileUploadRequests", fileUploadRequests), + Effect.annotateLogs("ingestUrl", ingestUrl), ); - } - - return { - body: presignedUrls satisfies UTEvents["upload"]["out"], - cleanup: promise, - }; -}); - -const handleMultipartCompleteAction = Effect.gen(function* () { - const opts = yield* RequestInput; - const requestInput = yield* Effect.flatMap( - parseRequestJson(opts.req), - S.decodeUnknown(MultipartCompleteActionPayload), - ); - yield* Effect.logDebug( - "Handling multipart-complete request with input:", - requestInput, - ); - yield* Effect.logDebug( - "Notifying UploadThing that multipart upload is complete", - ); + const presignedUrls = yield* Effect.forEach( + fileUploadRequests, + (file) => + Effect.gen(function* () { + const key = yield* generateKey( + file, + appId, + routeOptions.getFileHashParts, + ); - const completionResponse = yield* completeMultipartUpload( - { - key: requestInput.fileKey, - uploadId: requestInput.uploadId, - }, - requestInput.etags, - ); - yield* Effect.logDebug("UploadThing responded with:", completionResponse); - - return { - body: null satisfies UTEvents["multipart-complete"]["out"], - }; -}); - -const handleMultipartFailureAction = Effect.gen(function* () { - const { req, uploadable } = yield* RequestInput; - const { fileKey, uploadId } = yield* Effect.flatMap( - parseRequestJson(req), - S.decodeUnknown(FailureActionPayload), - ); - yield* Effect.logDebug("Handling failure request with input:", { - fileKey, - uploadId, - }); - yield* Effect.logDebug("Notifying UploadThing that upload failed"); - - const failureResponse = yield* abortMultipartUpload({ - key: fileKey, - uploadId, - }); - yield* Effect.logDebug("UploadThing responded with:", failureResponse); - yield* Effect.logDebug("Running 'onUploadError' callback"); - - yield* Effect.try({ - try: () => { - uploadable._def.onUploadError({ - error: new UploadThingError({ - code: "UPLOAD_FAILED", - message: `Upload failed for ${fileKey}`, + const url = yield* generateSignedURL(`${ingestUrl}/${key}`, apiKey, { + ttlInSeconds: routeOptions.presignedURLTTL, + data: { + "x-ut-identifier": appId, + "x-ut-file-name": file.name, + "x-ut-file-size": file.size, + "x-ut-file-type": file.type, + "x-ut-slug": slug, + "x-ut-custom-id": file.customId, + "x-ut-content-disposition": file.contentDisposition, + "x-ut-acl": file.acl, + }, + }); + return { url, key }; }), - fileKey, - }); - }, - catch: (error) => - new UploadThingError({ - code: "INTERNAL_SERVER_ERROR", - message: "Failed to run onUploadError", - cause: error, - }), - }).pipe( - Effect.tapError((error) => - Effect.logError( - "Failed to run onUploadError. You probably shouldn't be throwing errors here.", - error, + { concurrency: "unbounded" }, + ); + + const serverReq = yield* HttpServerRequest.HttpServerRequest; + const requestUrl = yield* HttpServerRequest.toURL(serverReq); + + const devHookRequest = yield* Config.string("callbackUrl").pipe( + Config.withDefault(requestUrl.origin + requestUrl.pathname), + Effect.map((url) => + HttpClientRequest.post(url).pipe( + HttpClientRequest.appendUrlParam("slug", slug), + ), ), - ), - ); + ); - return { - body: null satisfies UTEvents["failure"]["out"], - }; -}); + const metadataRequest = HttpClientRequest.post("/route-metadata").pipe( + HttpClientRequest.prependUrl(ingestUrl), + HttpClientRequest.setHeaders({ + "x-uploadthing-api-key": apiKey, + "x-uploadthing-version": pkgJson.version, + "x-uploadthing-be-adapter": beAdapter, + "x-uploadthing-fe-package": fePackage, + }), + HttpClientRequest.jsonBody({ + fileKeys: presignedUrls.map(({ key }) => key), + metadata: metadata, + isDev, + callbackUrl: devHookRequest.url, + callbackSlug: slug, + awaitServerData: routeOptions.awaitServerData ?? true, + }), + Effect.flatMap(HttpClient.filterStatusOk(httpClient)), + Effect.tapBoth({ + onSuccess: (res) => + Effect.logDebug("Registerred metadata").pipe( + Effect.annotateLogs("response", res), + ), + onFailure: (err) => + err._tag === "ResponseError" + ? Effect.flatMap(err.response.json, (json) => + Effect.logError( + `Failed to register metadata (${err.response.status})`, + ).pipe( + Effect.annotateLogs("response", err.response), + Effect.annotateLogs("json", json), + ), + ) + : Effect.logError("Failed to register metadata").pipe( + Effect.annotateLogs("error", err), + ), + }), + ); -export const buildPermissionsInfoHandler = ( - opts: RouteHandlerOptions, -) => { - return () => { - const permissions = objectKeys(opts.router).map((slug) => { - const route = opts.router[slug]; - const config = Effect.runSync( - fillInputRouteConfig(route._def.routerConfig), - ); - return { - slug, - config, - }; - }); + // Send metadata to UT server (non blocking as a daemon) + // In dev, keep the stream open and simulate the callback requests as + // files complete uploading + const fiber = yield* Effect.if(isDev, { + onTrue: () => + metadataRequest.pipe( + HttpClientResponse.stream, + handleJsonLineStream( + MetadataFetchStreamPart, + ({ payload, signature, hook }) => + devHookRequest.pipe( + HttpClientRequest.setHeaders({ + "uploadthing-hook": hook, + "x-uploadthing-signature": signature, + }), + HttpClientRequest.setBody( + HttpBody.text(payload, "application/json"), + ), + httpClient, + HttpClientResponse.arrayBuffer, + Effect.asVoid, + Effect.tap( + Effect.log(`Successfully simulated '${hook}' event`), + ), + Effect.ignoreLogged, + ), + ), + ), + onFalse: () => + metadataRequest.pipe( + HttpClientResponse.schemaBodyJsonScoped(MetadataFetchResponse), + ), + }).pipe(Effect.forkDaemon); + + const presigneds = presignedUrls.map((p, i) => ({ + url: p.url, + key: p.key, + name: fileUploadRequests[i].name, + customId: fileUploadRequests[i].customId ?? null, + })); + + yield* Effect.logInfo("Sending presigned URLs to client").pipe( + Effect.annotateLogs("presignedUrls", presigneds), + ); - return permissions; - }; -}; + return { + body: presigneds satisfies UTEvents["upload"]["out"], + fiber, + }; + }).pipe(Effect.withLogSpan("handleUploadAction")); diff --git a/packages/uploadthing/src/internal/incompat-node-guard.ts b/packages/uploadthing/src/internal/incompat-node-guard.ts deleted file mode 100644 index 523a16e1e4..0000000000 --- a/packages/uploadthing/src/internal/incompat-node-guard.ts +++ /dev/null @@ -1,41 +0,0 @@ -import * as Effect from "effect/Effect"; -import { process } from "std-env"; - -export function incompatibleNodeGuard() { - if (typeof process === "undefined") return; - - let major: number | undefined; - let minor: number | undefined; - - const maybeNodeVersion = process.versions?.node?.split("."); - if (maybeNodeVersion) { - [major, minor] = maybeNodeVersion.map((v) => parseInt(v, 10)); - } - - const maybeNodePath = process.env?.NODE; - if (!major && maybeNodePath) { - const nodeVersion = /v(\d+)\.(\d+)\.(\d+)/.exec(maybeNodePath)?.[0]; - if (nodeVersion) { - [major, minor] = nodeVersion - .substring(1) - .split(".") - .map((v) => parseInt(v, 10)); - } - } - - if (!major || !minor) return; - - // Require ^18.13.0 - if (major > 18) return; - if (major === 18 && minor >= 13) return; - - Effect.runSync( - Effect.logError( - `YOU ARE USING A LEGACY (${major}.${minor}) NODE VERSION WHICH ISN'T OFFICIALLY SUPPORTED. PLEASE UPGRADE TO NODE ^18.13.`, - ), - ); - // Kill the process if it isn't going to work correctly anyway - // If we've gotten this far we know we have a Node.js runtime so exit is defined. Override std-env type. - // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call - (process as any).exit?.(1); -} diff --git a/packages/uploadthing/src/internal/jsonl.test.ts b/packages/uploadthing/src/internal/jsonl.test.ts new file mode 100644 index 0000000000..d08cab74e6 --- /dev/null +++ b/packages/uploadthing/src/internal/jsonl.test.ts @@ -0,0 +1,201 @@ +import { it } from "@effect/vitest"; +import * as Effect from "effect/Effect"; +import * as Exit from "effect/Exit"; +import * as Stream from "effect/Stream"; +import { beforeEach, describe, expect, vi } from "vitest"; + +import { signPayload } from "@uploadthing/shared"; + +import { handleJsonLineStream } from "./jsonl"; +import { MetadataFetchStreamPart } from "./shared-schemas"; + +const te = new TextEncoder(); + +const createChunk = (_payload: unknown) => { + const payload = JSON.stringify(_payload); + return Effect.map(signPayload(payload, "sk_123"), (signature) => + JSON.stringify( + MetadataFetchStreamPart.make({ payload, signature, hook: "callback" }), + ), + ); +}; + +const sleep = (ms: number) => Effect.runPromise(Effect.sleep(ms)); + +const onChunk = vi.fn(Effect.succeed); +const onError = vi.fn(); +beforeEach(() => { + vi.restoreAllMocks(); +}); + +describe("handleJsonLineStreaming", () => { + it.effect( + "parses chunks and calls onChunk for each with quick succession", + () => + Effect.gen(function* () { + const N_CHUNKS = 20; + const chunks = yield* Effect.forEach( + Array.from({ length: N_CHUNKS }), + (_, i) => createChunk({ foo: "bar", i }), + ); + + const readable = new ReadableStream({ + start(controller) { + for (const c of chunks) { + controller.enqueue(te.encode(c)); + } + controller.close(); + }, + }); + + const exit = yield* handleJsonLineStream( + MetadataFetchStreamPart, + onChunk, + )(Stream.fromReadableStream(() => readable, onError)).pipe(Effect.exit); + + expect(exit).toEqual(Exit.succeed(undefined)); + + expect(onChunk).toHaveBeenCalledTimes(N_CHUNKS); + expect(onChunk).toHaveBeenCalledWith( + expect.objectContaining({ + payload: '{"foo":"bar","i":0}', + hook: "callback", + }), + ); + }), + ); + + it.effect("handles payload with newlines", () => + Effect.gen(function* () { + const chunk = yield* createChunk({ foo: "bar\nbaz" }); + const stream = new ReadableStream({ + async start(controller) { + controller.enqueue(te.encode(chunk)); + controller.close(); + }, + }); + + const exit = yield* handleJsonLineStream( + MetadataFetchStreamPart, + onChunk, + )(Stream.fromReadableStream(() => stream, onError)).pipe(Effect.exit); + + expect(exit).toEqual(Exit.succeed(undefined)); + + expect(onChunk).toHaveBeenCalledTimes(1); + expect(onChunk).toHaveBeenCalledWith( + expect.objectContaining({ + payload: '{"foo":"bar\\nbaz"}', + hook: "callback", + }), + ); + }), + ); + + it.effect( + "parses chunks and calls onChunk for each when they are delayed", + () => + Effect.gen(function* () { + const N_CHUNKS = 10; + const chunks = yield* Effect.forEach( + Array.from({ length: N_CHUNKS }), + (_, i) => createChunk({ foo: "bar", i }), + ); + + const stream = new ReadableStream({ + async start(controller) { + for await (const c of chunks) { + await sleep(100); + controller.enqueue(te.encode(c)); + } + controller.close(); + }, + }); + + const exit = yield* handleJsonLineStream( + MetadataFetchStreamPart, + onChunk, + )(Stream.fromReadableStream(() => stream, onError)).pipe(Effect.exit); + + expect(exit).toEqual(Exit.succeed(undefined)); + + expect(onChunk).toHaveBeenCalledTimes(N_CHUNKS); + expect(onChunk).toHaveBeenCalledWith( + expect.objectContaining({ + payload: '{"foo":"bar","i":0}', + hook: "callback", + }), + ); + }), + ); + + it.effect("handles when chunks are not sent as a whole", () => + Effect.gen(function* () { + const N_CHUNKS = 2; + const chunks = yield* Effect.forEach( + Array.from({ length: N_CHUNKS }), + (_, i) => createChunk({ foo: "bar", i }), + ); + + const stream = new ReadableStream({ + async start(controller) { + await Promise.allSettled( + chunks.map(async (c) => { + const firstHalf = c.slice(0, c.length / 2); + controller.enqueue(te.encode(firstHalf)); + controller.enqueue(te.encode(c.slice(firstHalf.length))); + }), + ); + controller.close(); + }, + }); + + const exit = yield* handleJsonLineStream( + MetadataFetchStreamPart, + onChunk, + )(Stream.fromReadableStream(() => stream, onError)).pipe(Effect.exit); + + expect(exit).toEqual(Exit.succeed(undefined)); + + expect(onChunk).toHaveBeenCalledTimes(N_CHUNKS); + expect(onChunk).toHaveBeenCalledWith( + expect.objectContaining({ + payload: '{"foo":"bar","i":0}', + hook: "callback", + }), + ); + }), + ); + + it.effect("handles when chunks are concatenated", () => + Effect.gen(function* () { + const N_CHUNKS = 5; + const chunks = yield* Effect.forEach( + Array.from({ length: N_CHUNKS }), + (_, i) => createChunk({ foo: "bar", i }), + ); + + const stream = new ReadableStream({ + async start(controller) { + controller.enqueue(te.encode(chunks.join("\n"))); + controller.close(); + }, + }); + + const exit = yield* handleJsonLineStream( + MetadataFetchStreamPart, + onChunk, + )(Stream.fromReadableStream(() => stream, onError)).pipe(Effect.exit); + + expect(exit).toEqual(Exit.succeed(undefined)); + + expect(onChunk).toHaveBeenCalledTimes(N_CHUNKS); + expect(onChunk).toHaveBeenCalledWith( + expect.objectContaining({ + payload: '{"foo":"bar","i":0}', + hook: "callback", + }), + ); + }), + ); +}); diff --git a/packages/uploadthing/src/internal/jsonl.ts b/packages/uploadthing/src/internal/jsonl.ts new file mode 100644 index 0000000000..99d8582fe6 --- /dev/null +++ b/packages/uploadthing/src/internal/jsonl.ts @@ -0,0 +1,48 @@ +import * as S from "@effect/schema/Schema"; +import * as Effect from "effect/Effect"; +import * as Stream from "effect/Stream"; + +export const handleJsonLineStream = + ( + schema: S.Schema, + onChunk: (chunk: TChunk) => Effect.Effect, + ) => + (stream: Stream.Stream) => { + let buf = ""; + + return stream.pipe( + Stream.decodeText(), + Stream.mapEffect((chunk) => + Effect.gen(function* () { + buf += chunk; + + // Scan buffer for newlines + const parts = buf.split("\n"); + const validChunks: unknown[] = []; + + for (const part of parts) { + try { + // Attempt to parse chunk as JSON + validChunks.push(JSON.parse(part) as unknown); + // Advance buffer if parsing succeeded + buf = buf.slice(part.length + 1); + } catch { + // + } + } + + yield* Effect.logDebug("Received chunks").pipe( + Effect.annotateLogs("chunk", chunk), + Effect.annotateLogs("parsedChunks", validChunks), + Effect.annotateLogs("buf", buf), + ); + + return validChunks; + }), + ), + Stream.mapEffect(S.decodeUnknown(S.Array(schema))), + Stream.mapEffect(Effect.forEach((part) => onChunk(part))), + Stream.runDrain, + Effect.withLogSpan("handleJsonLineStream"), + ); + }; diff --git a/packages/uploadthing/src/internal/logger.ts b/packages/uploadthing/src/internal/logger.ts index 403b712fe1..0477a2a24e 100644 --- a/packages/uploadthing/src/internal/logger.ts +++ b/packages/uploadthing/src/internal/logger.ts @@ -1,146 +1,25 @@ -import type { LogObject, LogType } from "consola/core"; -import { createConsola, LogLevels } from "consola/core"; +import * as Config from "effect/Config"; +import * as Effect from "effect/Effect"; +import * as Layer from "effect/Layer"; import * as Logger from "effect/Logger"; -import * as EffectLogLevel from "effect/LogLevel"; -import { process } from "std-env"; - -import { isObject } from "@uploadthing/shared"; - -/** - * All the public log levels users can set. - */ -export type LogLevel = "error" | "warn" | "info" | "debug" | "trace"; - -const colorize = (str: string, level: LogType) => { - // TODO: Maybe check is shell supports colors - - switch (level) { - case "error": - case "fatal": - return `\x1b[41m\x1b[30m${str}\x1b[0m`; - case "warn": - return `\x1b[43m\x1b[30m${str}\x1b[0m`; - case "info": - case "log": - return `\x1b[44m\x1b[30m${str}\x1b[0m`; - case "debug": - return `\x1b[47m\x1b[30m${str}\x1b[0m`; - case "trace": - return `\x1b[47m\x1b[30m${str}\x1b[0m`; - case "success": - return `\x1b[42m\x1b[30m${str}\x1b[0m`; - default: - return str; - } -}; - -const icons: { [t in LogType]?: string } = { - fatal: "⨯", - error: "⨯", - warn: "⚠️", - info: "ℹ", - log: "ℹ", - debug: "⚙", - trace: "→", - success: "✓", -}; - -function formatStack(stack: string) { - const cwd = - "cwd" in process && typeof process.cwd === "function" - ? process.cwd() - : "__UnknownCWD__"; - return ( - " " + - stack - .split("\n") - .splice(1) - .map((l) => - l - .trim() - .replace("file://", "") - .replace(cwd + "/", ""), - ) - .join("\n ") - ); -} - -function formatArgs(args: any[]) { - const fmtArgs = args.map((arg) => { - if (isObject(arg) && typeof arg.stack === "string") { - return (arg.message as string) + "\n" + formatStack(arg.stack); - } - // eslint-disable-next-line @typescript-eslint/no-unsafe-return - return arg; - }); - - return fmtArgs.map((arg) => { - if (typeof arg === "string") { - return arg; - } - return JSON.stringify(arg, null, 4); - }); -} - -const logger = createConsola({ - reporters: [ - { - log: (logObj: LogObject) => { - const { type, tag, date, args } = logObj; - const icon = icons[type as LogLevel]; - - const logPrefix = colorize( - ` ${icon} ${tag} ${date.toLocaleTimeString()} `, - type as LogLevel, - ); - const lines = formatArgs(args) - .join(" ") // concat all arguments to one space-separated string (like console does) - .split("\n") // split all the newlines (e.g. from logged JSON.stringified objects) - .map((l) => logPrefix + " " + l) // prepend the log prefix to each line - .join("\n"); // join all the lines back together - - // eslint-disable-next-line no-console - console.log(lines); - }, - }, - ], - defaults: { - tag: "UPLOADTHING", - }, -}); - -const effectLoggerLevelToConsolaLevel: Record = - { - All: "verbose", - Fatal: "error", - Error: "error", - Info: "info", - Debug: "debug", - Trace: "trace", - Warning: "warn", - None: "silent", - }; - -export const withMinimalLogLevel = (level: LogLevel = "info") => { - logger.level = LogLevels[level]; - - return Logger.withMinimumLogLevel( - { - silent: EffectLogLevel.None, - error: EffectLogLevel.Error, - warn: EffectLogLevel.Warning, - info: EffectLogLevel.Info, - debug: EffectLogLevel.Debug, - trace: EffectLogLevel.Trace, - verbose: EffectLogLevel.All, - }[level], - ); -}; - -export const ConsolaLogger = Logger.replace( - Logger.defaultLogger, - Logger.make(({ logLevel, message }) => { - // FIXME: Probably log other stuff than just message? - logger[effectLoggerLevelToConsolaLevel[logLevel._tag]](message); - }), +import * as LogLevel from "effect/LogLevel"; + +import { UploadThingError } from "@uploadthing/shared"; + +export const withMinimalLogLevel = Config.logLevel("logLevel").pipe( + Config.withDefault(LogLevel.Info), + Effect.andThen((level) => Logger.minimumLogLevel(level)), + Effect.tapError((e) => + Effect.logError("Invalid log level").pipe(Effect.annotateLogs("error", e)), + ), + Effect.catchTag( + "ConfigError", + (e) => + new UploadThingError({ + code: "INVALID_SERVER_CONFIG", + message: "Invalid server configuration", + cause: e, + }), + ), + Layer.unwrapEffect, ); diff --git a/packages/uploadthing/src/internal/multi-part.browser.ts b/packages/uploadthing/src/internal/multi-part.browser.ts deleted file mode 100644 index fd4890ba96..0000000000 --- a/packages/uploadthing/src/internal/multi-part.browser.ts +++ /dev/null @@ -1,113 +0,0 @@ -import * as Micro from "effect/Micro"; -import { isTest } from "std-env"; - -import { - contentDisposition, - exponentialDelay, - RetryError, -} from "@uploadthing/shared"; -import type { ContentDisposition, UploadThingError } from "@uploadthing/shared"; - -import type { MPUResponse } from "./shared-schemas"; -import type { UTReporter } from "./ut-reporter"; - -export const uploadMultipartWithProgress = ( - file: File, - presigned: MPUResponse, - opts: { - reportEventToUT: UTReporter; - onUploadProgress?: - | ((opts: { file: string; progress: number }) => void) - | undefined; - }, -) => - Micro.gen(function* () { - let uploadedBytes = 0; - const etags = yield* Micro.forEach( - presigned.urls, - (url, index) => { - const offset = presigned.chunkSize * index; - const end = Math.min(offset + presigned.chunkSize, file.size); - const chunk = file.slice(offset, end); - - return uploadPart({ - url, - chunk: chunk, - contentDisposition: presigned.contentDisposition, - fileType: file.type, - fileName: file.name, - onProgress: (delta) => { - uploadedBytes += delta; - const percent = (uploadedBytes / file.size) * 100; - opts.onUploadProgress?.({ file: file.name, progress: percent }); - }, - }).pipe( - Micro.map((tag) => ({ tag, partNumber: index + 1 })), - Micro.retry({ - while: (error) => error instanceof RetryError, - times: isTest ? 3 : 10, // less retries in tests just to make it faster - schedule: exponentialDelay(), - }), - ); - }, - { concurrency: "inherit" }, - ).pipe( - Micro.tapError((error) => - opts.reportEventToUT("failure", { - fileKey: presigned.key, - uploadId: presigned.uploadId, - fileName: file.name, - storageProviderError: String(error), - }), - ), - ); - - // Tell the server that the upload is complete - yield* opts.reportEventToUT("multipart-complete", { - uploadId: presigned.uploadId, - fileKey: presigned.key, - etags, - }); - }); - -interface UploadPartOptions { - url: string; - chunk: Blob; - fileType: string; - fileName: string; - contentDisposition: ContentDisposition; - onProgress: (progressDelta: number) => void; -} - -const uploadPart = (opts: UploadPartOptions) => - Micro.async((resume) => { - const xhr = new XMLHttpRequest(); - - xhr.open("PUT", opts.url, true); - xhr.setRequestHeader("Content-Type", opts.fileType); - xhr.setRequestHeader( - "Content-Disposition", - contentDisposition(opts.contentDisposition, opts.fileName), - ); - - xhr.addEventListener("load", () => { - const etag = xhr.getResponseHeader("Etag"); - if (xhr.status >= 200 && xhr.status <= 299 && etag) { - return resume(Micro.succeed(etag)); - } - return resume(Micro.fail(new RetryError())); - }); - xhr.addEventListener("error", () => resume(Micro.fail(new RetryError()))); - - let lastProgress = 0; - xhr.upload.addEventListener("progress", (e) => { - const delta = e.loaded - lastProgress; - lastProgress += delta; - opts.onProgress(delta); - }); - - xhr.send(opts.chunk); - - // Cleanup function that runs on interruption - return Micro.sync(() => xhr.abort()); - }); diff --git a/packages/uploadthing/src/internal/multi-part.server.ts b/packages/uploadthing/src/internal/multi-part.server.ts deleted file mode 100644 index c31938e128..0000000000 --- a/packages/uploadthing/src/internal/multi-part.server.ts +++ /dev/null @@ -1,155 +0,0 @@ -import * as S from "@effect/schema/Schema"; -import * as Duration from "effect/Duration"; -import * as Effect from "effect/Effect"; -import * as Schedule from "effect/Schedule"; - -import { - contentDisposition, - fetchEff, - generateUploadThingURL, - parseResponseJson, - RetryError, - UploadThingError, -} from "@uploadthing/shared"; -import type { ContentDisposition } from "@uploadthing/shared"; - -import type { FileEsque } from "../sdk/types"; -import type { MPUResponse } from "./shared-schemas"; -import { FailureCallbackResponse } from "./shared-schemas"; - -export const uploadMultipart = (file: FileEsque, presigned: MPUResponse) => - Effect.gen(function* () { - yield* Effect.logDebug( - `Uploading file ${file.name} with ${presigned.urls.length} chunks of size ${presigned.chunkSize} bytes each`, - ); - - const etags = yield* Effect.forEach( - presigned.urls, - (url, index) => { - const offset = presigned.chunkSize * index; - const end = Math.min(offset + presigned.chunkSize, file.size); - const chunk = file.slice(offset, end); - - return uploadPart({ - url, - chunk: chunk as Blob, - contentDisposition: presigned.contentDisposition, - contentType: file.type, - fileName: file.name, - maxRetries: 10, - key: presigned.key, - uploadId: presigned.uploadId, - }).pipe( - Effect.andThen((etag) => ({ tag: etag, partNumber: index + 1 })), - Effect.catchTag("RetryError", (e) => Effect.die(e)), - ); - }, - { concurrency: "inherit" }, - ); - - yield* Effect.logDebug("File", file.name, "uploaded successfully."); - yield* Effect.logDebug("Completing multipart upload..."); - yield* completeMultipartUpload(presigned, etags); - yield* Effect.logDebug("Multipart upload complete."); - }); - -/** - * Used by server uploads where progress is not needed. - * Uses normal fetch API. - */ -const uploadPart = (opts: { - url: string; - key: string; - uploadId: string; - chunk: Blob; - contentType: string; - contentDisposition: ContentDisposition; - fileName: string; - maxRetries: number; -}) => - fetchEff(opts.url, { - method: "PUT", - body: opts.chunk, - headers: { - "Content-Type": opts.contentType, - "Content-Disposition": contentDisposition( - opts.contentDisposition, - opts.fileName, - ), - }, - }).pipe( - Effect.andThen((res) => - res.ok && res.headers.get("Etag") - ? Effect.succeed(res.headers.get("Etag")!) - : Effect.fail(new RetryError()), - ), - Effect.retry({ - while: (res) => res instanceof RetryError, - schedule: Schedule.exponential(Duration.millis(10), 4).pipe( - // 10ms, 40ms, 160ms, 640ms... - Schedule.andThenEither(Schedule.spaced(Duration.seconds(1))), - Schedule.compose(Schedule.elapsed), - Schedule.whileOutput(Duration.lessThanOrEqualTo(Duration.minutes(1))), - ), - times: opts.maxRetries, - }), - Effect.tapErrorTag("RetryError", () => - // Max retries exceeded, tell UT server that upload failed - abortMultipartUpload({ key: opts.key, uploadId: opts.uploadId }).pipe( - Effect.andThen((res) => { - new UploadThingError({ - code: "UPLOAD_FAILED", - message: `Failed to upload file ${opts.fileName} to S3`, - cause: res, - }); - }), - ), - ), - ); - -export const completeMultipartUpload = ( - presigned: { key: string; uploadId: string }, - etags: readonly { tag: string; partNumber: number }[], -) => - fetchEff(generateUploadThingURL("/v6/completeMultipart"), { - method: "POST", - body: JSON.stringify({ - fileKey: presigned.key, - uploadId: presigned.uploadId, - etags, - }), - headers: { "Content-Type": "application/json" }, - }).pipe( - Effect.andThen(parseResponseJson), - Effect.andThen( - S.decodeUnknown( - S.Struct({ success: S.Boolean, message: S.optional(S.String) }), - ), - ), - Effect.withSpan("completeMultipartUpload", { - attributes: { etags, presigned }, - }), - ); - -export const abortMultipartUpload = (presigned: { - key: string; - uploadId: string | null; -}) => - fetchEff( - generateUploadThingURL("/v6/failureCallback"), - - { - method: "POST", - body: JSON.stringify({ - fileKey: presigned.key, - uploadId: presigned.uploadId, - }), - headers: { "Content-Type": "application/json" }, - }, - ).pipe( - Effect.andThen(parseResponseJson), - Effect.andThen(S.decodeUnknown(FailureCallbackResponse)), - Effect.withSpan("abortMultipartUpload", { - attributes: { presigned }, - }), - ); diff --git a/packages/uploadthing/src/internal/presigned-post.browser.ts b/packages/uploadthing/src/internal/presigned-post.browser.ts deleted file mode 100644 index c60189bf24..0000000000 --- a/packages/uploadthing/src/internal/presigned-post.browser.ts +++ /dev/null @@ -1,64 +0,0 @@ -import * as Micro from "effect/Micro"; - -import type { FetchContext, UploadThingError } from "@uploadthing/shared"; - -import type { PSPResponse } from "./shared-schemas"; -import type { UTEvents } from "./types"; -import type { UTReporter } from "./ut-reporter"; - -export const uploadPresignedPostWithProgress = ( - file: File, - presigned: PSPResponse, - opts: { - reportEventToUT: UTReporter; - onUploadProgress?: - | ((opts: { file: string; progress: number }) => void) - | undefined; - }, -) => - Micro.async( - (resume) => { - const xhr = new XMLHttpRequest(); - xhr.open("POST", presigned.url); - xhr.setRequestHeader("Accept", "application/xml"); - - xhr.upload.addEventListener("progress", ({ loaded, total }) => { - opts.onUploadProgress?.({ - file: file.name, - progress: (loaded / total) * 100, - }); - }); - xhr.addEventListener("load", () => - resume( - xhr.status >= 200 && xhr.status < 300 - ? Micro.succeed(null) - : opts.reportEventToUT("failure", { - fileKey: presigned.key, - uploadId: null, - fileName: file.name, - storageProviderError: xhr.responseText, - }), - ), - ); - xhr.addEventListener("error", () => - resume( - opts.reportEventToUT("failure", { - fileKey: presigned.key, - uploadId: null, - fileName: file.name, - }), - ), - ); - - const formData = new FormData(); - Object.entries(presigned.fields).forEach(([k, v]) => - formData.append(k, v), - ); - formData.append("file", file); // File data **MUST GO LAST** - xhr.send(formData); - - return Micro.sync(() => { - xhr.abort(); - }); - }, - ); diff --git a/packages/uploadthing/src/internal/presigned-post.server.ts b/packages/uploadthing/src/internal/presigned-post.server.ts deleted file mode 100644 index 83805ace9c..0000000000 --- a/packages/uploadthing/src/internal/presigned-post.server.ts +++ /dev/null @@ -1,59 +0,0 @@ -import * as S from "@effect/schema/Schema"; -import * as Effect from "effect/Effect"; - -import { - fetchEff, - generateUploadThingURL, - parseResponseJson, - UploadThingError, -} from "@uploadthing/shared"; - -import type { FileEsque } from "../sdk/types"; -import type { PSPResponse } from "./shared-schemas"; -import { FailureCallbackResponse } from "./shared-schemas"; - -export const uploadPresignedPost = (file: FileEsque, presigned: PSPResponse) => - Effect.gen(function* () { - yield* Effect.logDebug( - `Uploading file ${file.name} using presigned POST URL`, - ); - const formData = new FormData(); - Object.entries(presigned.fields).forEach(([k, v]) => formData.append(k, v)); - formData.append("file", file as Blob); // File data **MUST GO LAST** - - const res = yield* fetchEff(presigned.url, { - method: "POST", - body: formData, - headers: new Headers({ - Accept: "application/xml", - }), - }).pipe( - Effect.tapErrorCause(() => - fetchEff(generateUploadThingURL("/v6/failureCallback"), { - method: "POST", - body: JSON.stringify({ - fileKey: presigned.key, - uploadId: null, - }), - headers: { "Content-Type": "application/json" }, - }).pipe( - Effect.andThen(parseResponseJson), - Effect.andThen(S.decodeUnknown(FailureCallbackResponse)), - ), - ), - ); - - if (!res.ok) { - const text = yield* Effect.promise(res.text); - yield* Effect.logError( - `Failed to upload file ${file.name} to presigned POST URL. Response: ${text}`, - ); - return yield* new UploadThingError({ - code: "UPLOAD_FAILED", - message: "Failed to upload file", - cause: text, - }); - } - - yield* Effect.logDebug("File", file.name, "uploaded successfully"); - }); diff --git a/packages/uploadthing/src/internal/resolve-url.ts b/packages/uploadthing/src/internal/resolve-url.ts deleted file mode 100644 index 6e5e1465e4..0000000000 --- a/packages/uploadthing/src/internal/resolve-url.ts +++ /dev/null @@ -1,46 +0,0 @@ -import * as Effect from "effect/Effect"; -import { process } from "std-env"; - -import { getFullApiUrl } from "@uploadthing/shared"; - -import { RequestInput } from "./validate-request-input"; - -export const resolveCallbackUrl = Effect.gen(function* () { - const { config, req, isDev } = yield* RequestInput; - let callbackUrl = new URL(req.url); - if (config?.callbackUrl) { - callbackUrl = yield* getFullApiUrl(config.callbackUrl); - } else if (process.env.UPLOADTHING_URL) { - callbackUrl = yield* getFullApiUrl(process.env.UPLOADTHING_URL); - } - - if (isDev || !callbackUrl.host.includes("localhost")) { - return callbackUrl; - } - - // Production builds have to have a public URL so UT can send webhook - // Parse the URL from the headers - let parsedFromHeaders = - req.headers.get("origin") ?? - req.headers.get("referer") ?? - req.headers.get("host") ?? - req.headers.get("x-forwarded-host"); - - if (parsedFromHeaders && !parsedFromHeaders.includes("http")) { - parsedFromHeaders = - (req.headers.get("x-forwarded-proto") ?? "https") + - "://" + - parsedFromHeaders; - } - - if (!parsedFromHeaders || parsedFromHeaders.includes("localhost")) { - // Didn't find a valid URL in the headers, log a warning and use the original url anyway - Effect.logWarning( - "You are using a localhost callback url in production which is not supported.", - "Read more and learn how to fix it here: https://docs.uploadthing.com/faq#my-callback-runs-in-development-but-not-in-production", - ); - return callbackUrl; - } - - return yield* getFullApiUrl(parsedFromHeaders); -}); diff --git a/packages/uploadthing/src/internal/route-config.ts b/packages/uploadthing/src/internal/route-config.ts new file mode 100644 index 0000000000..5a8f4e045e --- /dev/null +++ b/packages/uploadthing/src/internal/route-config.ts @@ -0,0 +1,128 @@ +import type * as S from "@effect/schema/Schema"; +import * as Data from "effect/Data"; +import * as Effect from "effect/Effect"; + +import type { + ExpandedRouteConfig, + FileRouterInputKey, + FileSize, + InvalidFileSizeError, + InvalidFileTypeError, + UnknownFileTypeError, +} from "@uploadthing/shared"; +import { + bytesToFileSize, + fileSizeToBytes, + fillInputRouteConfig, + getTypeFromFileName, + InvalidRouteConfigError, + objectKeys, + UploadThingError, +} from "@uploadthing/shared"; + +import type { UploadActionPayload } from "./shared-schemas"; +import type { FileRouter } from "./types"; + +class FileSizeMismatch extends Data.Error<{ + reason: string; +}> { + readonly _tag = "FileSizeMismatch"; + readonly name = "FileSizeMismatchError"; + constructor(type: FileRouterInputKey, max: FileSize, actual: number) { + const reason = `You uploaded a ${type} file that was ${bytesToFileSize(actual)}, but the limit for that type is ${max}`; + super({ reason }); + } +} + +class FileCountMismatch extends Data.Error<{ + reason: string; +}> { + readonly _tag = "FileCountMismatch"; + readonly name = "FileCountMismatchError"; + constructor( + type: FileRouterInputKey, + boundtype: "minimum" | "maximum", + bound: number, + actual: number, + ) { + const reason = `You uploaded ${actual} file(s) of type '${type}', but the ${boundtype} for that type is ${bound}`; + + super({ reason }); + } +} + +// Verify that the uploaded files doesn't violate the route config, +// e.g. uploading more videos than allowed, or a file that is larger than allowed. +// This is double-checked on infra side, but we want to fail early to avoid network latency. +export const assertFilesMeetConfig = ( + files: S.Schema.Type["files"], + routeConfig: ExpandedRouteConfig, +): Effect.Effect< + null, + | UploadThingError + | FileSizeMismatch + | FileCountMismatch + | InvalidRouteConfigError + | UnknownFileTypeError + | InvalidFileTypeError + | InvalidFileSizeError +> => + Effect.gen(function* () { + const counts: Record = {}; + + for (const file of files) { + const type = yield* getTypeFromFileName( + file.name, + objectKeys(routeConfig), + ); + counts[type] = (counts[type] ?? 0) + 1; + + const sizeLimit = routeConfig[type]?.maxFileSize; + if (!sizeLimit) { + return yield* new InvalidRouteConfigError(type, "maxFileSize"); + } + const sizeLimitBytes = yield* fileSizeToBytes(sizeLimit); + + if (file.size > sizeLimitBytes) { + return yield* new FileSizeMismatch(type, sizeLimit, file.size); + } + } + + for (const _key in counts) { + const key = _key as FileRouterInputKey; + const config = routeConfig[key]; + if (!config) return yield* new InvalidRouteConfigError(key); + + const count = counts[key]; + const min = config.minFileCount; + const max = config.maxFileCount; + + if (min > max) { + return yield* new UploadThingError({ + code: "BAD_REQUEST", + message: + "Invalid config during file count - minFileCount > maxFileCount", + cause: `minFileCount must be less than maxFileCount for key ${key}. got: ${min} > ${max}`, + }); + } + + if (count < min) { + return yield* new FileCountMismatch(key, "minimum", min, count); + } + if (count > max) { + return yield* new FileCountMismatch(key, "maximum", max, count); + } + } + + return null; + }); + +export const extractRouterConfig = ( + router: TRouter, +) => + Effect.forEach(objectKeys(router), (slug) => + Effect.map( + fillInputRouteConfig(router[slug]._def.routerConfig), + (config) => ({ slug, config }), + ), + ); diff --git a/packages/uploadthing/src/internal/s3-error-parser.ts b/packages/uploadthing/src/internal/s3-error-parser.ts deleted file mode 100644 index a0dfe5c205..0000000000 --- a/packages/uploadthing/src/internal/s3-error-parser.ts +++ /dev/null @@ -1,32 +0,0 @@ -import type { UploadThingError } from "@uploadthing/shared"; - -export const maybeParseResponseXML = (maybeXml: string) => { - const codeMatch = maybeXml.match(/(.*?)<\/Code>/s); - const messageMatch = maybeXml.match(/(.*?)<\/Message>/s); - - const code = codeMatch?.[1]; - const message = messageMatch?.[1]; - - if (!code || !message) return null; - - return { code: s3CodeToUploadThingCode[code] ?? DEFAULT_ERROR_CODE, message }; -}; - -/** - * Map S3 error codes to UploadThing error codes - * - * This is a subset of the S3 error codes, based on what seemed most likely to - * occur in uploadthing. For a full list of S3 error codes, see: - * https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html - */ -const DEFAULT_ERROR_CODE = "UPLOAD_FAILED"; -const s3CodeToUploadThingCode: Record = { - AccessDenied: "FORBIDDEN", // 403 Forbidden - EntityTooSmall: "TOO_SMALL", // 400 Bad Request - EntityTooLarge: "TOO_LARGE", // 400 Bad Request - ExpiredToken: "FORBIDDEN", // 400 Bad Request - IncorrectNumberOfFilesInPostRequest: "TOO_MANY_FILES", // 400 Bad Request - InternalError: "INTERNAL_SERVER_ERROR", // 500 Internal Server Error - KeyTooLongError: "KEY_TOO_LONG", // 400 Bad Request - MaxMessageLengthExceeded: "TOO_LARGE", // 400 Bad Request -}; diff --git a/packages/uploadthing/src/internal/shared-schemas.ts b/packages/uploadthing/src/internal/shared-schemas.ts index 7912496b09..e8f215efad 100644 --- a/packages/uploadthing/src/internal/shared-schemas.ts +++ b/packages/uploadthing/src/internal/shared-schemas.ts @@ -1,11 +1,46 @@ import * as S from "@effect/schema/Schema"; -import type { FileRouterInputKey, Json } from "@uploadthing/shared"; +import type { Json } from "@uploadthing/shared"; import { ValidACLs, ValidContentDispositions } from "@uploadthing/shared"; export const ContentDispositionSchema = S.Literal(...ValidContentDispositions); export const ACLSchema = S.Literal(...ValidACLs); +/** + * Valid options for the `?actionType` query param + */ +export const ActionType = S.Literal("upload"); + +/** + * Valid options for the `uploadthing-hook` header + * for requests coming from UT server + */ +export const UploadThingHook = S.Literal("callback", "error"); + +/** + * ============================================================================= + * =========================== Configuration =================================== + * ============================================================================= + */ +const DecodeString = S.transform(S.Uint8ArrayFromSelf, S.String, { + decode: (data) => new TextDecoder().decode(data), + encode: (data) => new TextEncoder().encode(data), +}); + +export const ParsedToken = S.Struct({ + apiKey: S.String.pipe(S.startsWith("sk_")), + appId: S.String, + regions: S.NonEmptyArray(S.String), + ingestHost: S.String.pipe( + S.optionalWith({ default: () => "ingest.uploadthing.com" }), + ), +}); + +export const UploadThingToken = S.Uint8ArrayFromBase64.pipe( + S.compose(DecodeString), + S.compose(S.parseJson(ParsedToken)), +); + /** * ============================================================================= * ======================== File Type Hierarchy =============================== @@ -19,6 +54,7 @@ export class FileUploadData extends S.Class("FileUploadData")({ name: S.String, size: S.Number, type: S.String, + lastModified: S.Number.pipe(S.optional), }) {} /** @@ -60,68 +96,33 @@ export interface ClientUploadedFileData extends UploadedFileData { * ============================================================================= */ -export class PresignedBase extends S.Class( - "PresignedBaseSchema", +export class NewPresignedUrl extends S.Class( + "NewPresignedUrl", )({ + url: S.String, key: S.String, - fileName: S.String, - fileType: S.String as S.Schema, - fileUrl: S.String, - appUrl: S.String, - pollingJwt: S.String, - pollingUrl: S.String, - contentDisposition: ContentDispositionSchema, customId: S.NullOr(S.String), + name: S.String, }) {} -export class MPUResponse extends PresignedBase.extend( - "MPUResponseSchema", -)({ - urls: S.Array(S.String), - uploadId: S.String, - chunkSize: S.Number, - chunkCount: S.Number, -}) {} - -export class PSPResponse extends PresignedBase.extend( - "PSPResponseSchema", -)({ - url: S.String, - fields: S.Record(S.String, S.String), -}) {} - -export const PresignedURLResponse = S.Array(S.Union(PSPResponse, MPUResponse)); - -export class PollUploadResponse extends S.Class( - "PollUploadResponse", +export class MetadataFetchStreamPart extends S.Class( + "MetadataFetchStreamPart", )({ - status: S.String, - fileData: S.optional( - S.Struct({ - fileKey: S.NullOr(S.String), - fileName: S.String, - fileSize: S.Number, - fileType: S.String, - metadata: S.NullOr(S.String), - customId: S.NullOr(S.String), - - callbackUrl: S.optional(S.String), - callbackSlug: S.optional(S.String), - }), - ), + payload: S.String, + signature: S.String, + hook: UploadThingHook, }) {} -export class FailureCallbackResponse extends S.Class( - "FailureCallbackResponse", +export class MetadataFetchResponse extends S.Class( + "MetadataFetchResponse", )({ - success: S.Boolean, - message: S.optional(S.String), + ok: S.Boolean, }) {} -export class ServerCallbackPostResponse extends S.Class( - "ServerCallbackPostResponse", +export class CallbackResultResponse extends S.Class( + "CallbackResultResponse", )({ - status: S.String, + ok: S.Boolean, }) {} /** @@ -136,25 +137,3 @@ export class UploadActionPayload extends S.Class( files: S.Array(FileUploadData), input: S.Unknown as S.Schema, }) {} - -export class FailureActionPayload extends S.Class( - "FailureActionPayload", -)({ - fileKey: S.String, - uploadId: S.NullOr(S.String), - storageProviderError: S.optional(S.String), - fileName: S.String, -}) {} - -export class MultipartCompleteActionPayload extends S.Class( - "MultipartCompleteActionPayload", -)({ - fileKey: S.String, - uploadId: S.String, - etags: S.Array( - S.Struct({ - tag: S.String, - partNumber: S.Number, - }), - ), -}) {} diff --git a/packages/uploadthing/src/internal/to-web-request.ts b/packages/uploadthing/src/internal/to-web-request.ts index c231c40f89..16e29a3eee 100644 --- a/packages/uploadthing/src/internal/to-web-request.ts +++ b/packages/uploadthing/src/internal/to-web-request.ts @@ -1,6 +1,6 @@ +import * as Config from "effect/Config"; import * as Data from "effect/Data"; import * as Effect from "effect/Effect"; -import { process } from "std-env"; import { UploadThingError } from "@uploadthing/shared"; @@ -38,17 +38,20 @@ const parseURL = (req: IncomingMessageLike): Effect.Effect => { const proto = headers?.["x-forwarded-proto"] ?? "http"; const host = headers?.["x-forwarded-host"] ?? headers?.host; - if (typeof proto !== "string" || typeof host !== "string") { - return Effect.try({ - try: () => new URL(relativeUrl, process.env.UPLOADTHING_URL), - catch: () => new InvalidURL(relativeUrl, process.env.UPLOADTHING_URL), - }); - } + const baseUrl = Config.string("url").pipe( + Config.withDefault(`${proto.toString()}://${host?.toString()}`), + ); - return Effect.try({ - try: () => new URL(`${proto}://${host}${relativeUrl}`), - catch: () => new InvalidURL(`${proto}://${host}${relativeUrl}`), - }); + return Effect.flatMap(baseUrl, (baseUrl) => + Effect.try({ + try: () => new URL(relativeUrl, baseUrl), + catch: () => new InvalidURL(relativeUrl, baseUrl), + }), + ).pipe( + Effect.catchTag("ConfigError", () => + Effect.fail(new InvalidURL(relativeUrl)), + ), + ); }; export const getPostBody = (opts: { diff --git a/packages/uploadthing/src/internal/types.ts b/packages/uploadthing/src/internal/types.ts index d0f9c0bccc..8aefb9977e 100644 --- a/packages/uploadthing/src/internal/types.ts +++ b/packages/uploadthing/src/internal/types.ts @@ -1,33 +1,25 @@ import type { Schema } from "@effect/schema/Schema"; -import type * as S from "@effect/schema/Schema"; -import type * as Effect from "effect/Effect"; +import type * as LogLevel from "effect/LogLevel"; import type { ErrorMessage, - FetchContext, FetchEsque, FileRouterInputConfig, Json, MaybePromise, + RouteOptions, Simplify, UploadThingError, } from "@uploadthing/shared"; -import type { FileUploadDataWithCustomId, UploadedFileData } from "../types"; -import type { LogLevel } from "./logger"; import type { JsonParser } from "./parser"; import type { - FailureActionPayload, - MultipartCompleteActionPayload, - PresignedURLResponse, + FileUploadDataWithCustomId, + NewPresignedUrl, UploadActionPayload, + UploadedFileData, } from "./shared-schemas"; -/** - * Returned by `/api/prepareUpload` and `/api/uploadFiles` - */ -export type PresignedURLs = S.Schema.Type; - /** * Marker used to append a `customId` to the incoming file data in `.middleware()` * @example @@ -74,6 +66,7 @@ export type MiddlewareFnArgs = { }; export interface AnyParams { + _routeOptions: any; _input: any; _metadata: any; // imaginary field used to bind metadata return type to an Upload resolver _middlewareArgs: MiddlewareFnArgs; @@ -100,7 +93,7 @@ type ResolverFn = ( type UploadErrorFn = (input: { error: UploadThingError; fileKey: string; -}) => void; +}) => Promise | void; export interface UploadBuilder { input: ( @@ -108,6 +101,7 @@ export interface UploadBuilder { ? TParser : ErrorMessage<"input is already set">, ) => UploadBuilder<{ + _routeOptions: TParams["_routeOptions"]; _input: TParser["_output"]; _metadata: TParams["_metadata"]; _middlewareArgs: TParams["_middlewareArgs"]; @@ -120,6 +114,7 @@ export interface UploadBuilder { ? MiddlewareFn : ErrorMessage<"middleware is already set">, ) => UploadBuilder<{ + _routeOptions: TParams["_routeOptions"]; _input: TParams["_input"]; _metadata: TOutput; _middlewareArgs: TParams["_middlewareArgs"]; @@ -130,6 +125,7 @@ export interface UploadBuilder { onUploadComplete: ( fn: ResolverFn, ) => Uploader<{ + _routeOptions: TParams["_routeOptions"]; _input: TParams["_input"]; _metadata: TParams["_metadata"]; _middlewareArgs: TParams["_middlewareArgs"]; @@ -142,6 +138,7 @@ export interface UploadBuilder { ? UploadErrorFn : ErrorMessage<"onUploadError is already set">, ) => UploadBuilder<{ + _routeOptions: TParams["_routeOptions"]; _input: TParams["_input"]; _metadata: TParams["_metadata"]; _middlewareArgs: TParams["_middlewareArgs"]; @@ -153,6 +150,7 @@ export interface UploadBuilder { export type UploadBuilderDef = { routerConfig: FileRouterInputConfig; + routeOptions: RouteOptions; inputParser: JsonParser; // eslint-disable-next-line @typescript-eslint/ban-types middleware: MiddlewareFn; @@ -172,10 +170,9 @@ export type FileRouter = Record< >; export type RouteHandlerConfig = { - logLevel?: LogLevel; + logLevel?: LogLevel.Literal; callbackUrl?: string; - uploadthingId?: string; - uploadthingSecret?: string; + token?: string; /** * Used to determine whether to run dev hook or not * @default `env.NODE_ENV === "development" || env.NODE_ENV === "dev"` @@ -186,6 +183,25 @@ export type RouteHandlerConfig = { * @default `globalThis.fetch` */ fetch?: FetchEsque; + /** + * Set how UploadThing should handle the daemon promise before returning a response to the client. + * You can also provide a synchronous function that will be called before returning a response to + * the client. This can be useful for things like: + * - [`@vercel/functions.waitUntil`](https://vercel.com/docs/functions/functions-api-reference#waituntil) + * - [`next/after`](https://nextjs.org/blog/next-15-rc#executing-code-after-a-response-with-nextafter-experimental) + * - or equivalent function from your serverless infrastructure provider that allows asynchronous streaming + * If deployed on a stateful server, you most likely want "void" to run the daemon in the background. + * @remarks - `"await"` is not allowed in development environments + * @default isDev === true ? "void" : "await" + */ + handleDaemonPromise?: + | "void" + | "await" + | ((promise: Promise) => void); + /** + * URL override for the ingest server + */ + ingestUrl?: string; }; export type RouteHandlerOptions = { @@ -193,26 +209,6 @@ export type RouteHandlerOptions = { config?: RouteHandlerConfig; }; -export type RequestHandlerInput> = - { - req: Request | Effect.Effect; - middlewareArgs: TArgs; - }; -export type RequestHandlerSuccess = { - success: true; - body: UTEvents[keyof UTEvents]["out"]; - cleanup?: Promise | undefined; -}; -export type RequestHandlerError = { - success: false; - error: UploadThingError; -}; -export type RequestHandlerOutput = RequestHandlerSuccess | RequestHandlerError; - -export type RequestHandler> = ( - input: RequestHandlerInput, -) => Effect.Effect; - export type inferEndpointInput> = TUploader["_def"]["_input"] extends UnsetMarker ? undefined @@ -221,48 +217,20 @@ export type inferEndpointInput> = export type inferEndpointOutput = TUploader["_def"]["_output"] extends UnsetMarker | void | undefined ? null - : TUploader["_def"]["_output"]; + : TUploader["_def"]["_routeOptions"]["awaitServerData"] extends false + ? null + : TUploader["_def"]["_output"]; export type inferErrorShape = TRouter[keyof TRouter]["_def"]["_errorShape"]; -/** - * Valid options for the `?actionType` query param - */ -export const VALID_ACTION_TYPES = [ - "upload", - "failure", - "multipart-complete", -] as const; -export type ActionType = (typeof VALID_ACTION_TYPES)[number]; -export const isActionType = (input: unknown): input is ActionType => - typeof input === "string" && VALID_ACTION_TYPES.includes(input as ActionType); - -/** - * Valid options for the `uploadthing-hook` header - * for requests coming from UT server - */ -export const VALID_UT_HOOKS = ["callback"] as const; -export type UploadThingHook = (typeof VALID_UT_HOOKS)[number]; -export const isUploadThingHook = (input: unknown): input is UploadThingHook => - typeof input === "string" && - VALID_UT_HOOKS.includes(input as UploadThingHook); - /** * Map actionType to the required payload for that action * @todo Look into using @effect/rpc :thinking: */ export type UTEvents = { upload: { - in: S.Schema.Type; - out: S.Schema.Type; - }; - failure: { - in: S.Schema.Type; - out: null; - }; - "multipart-complete": { - in: S.Schema.Type; - out: null; + in: typeof UploadActionPayload.Type; + out: ReadonlyArray; }; }; diff --git a/packages/uploadthing/src/internal/upload-builder.ts b/packages/uploadthing/src/internal/upload-builder.ts index facaaa63c2..13f1f8292d 100644 --- a/packages/uploadthing/src/internal/upload-builder.ts +++ b/packages/uploadthing/src/internal/upload-builder.ts @@ -1,6 +1,7 @@ import type { FileRouterInputConfig, Json, + RouteOptions, UploadThingError, } from "@uploadthing/shared"; @@ -16,10 +17,12 @@ import type { function internalCreateBuilder< TMiddlewareArgs extends MiddlewareFnArgs, + TRouteOptions extends RouteOptions, TErrorShape extends Json = { message: string }, >( initDef: Partial> = {}, ): UploadBuilder<{ + _routeOptions: TRouteOptions; _input: UnsetMarker; _metadata: UnsetMarker; _middlewareArgs: TMiddlewareArgs; @@ -34,6 +37,9 @@ function internalCreateBuilder< maxFileSize: "4MB", }, }, + routeOptions: { + awaitServerData: true, + }, inputParser: { parse: () => undefined, @@ -42,7 +48,9 @@ function internalCreateBuilder< }, middleware: () => ({}), - onUploadError: () => ({}), + onUploadError: () => { + // noop + }, errorFormatter: initDef.errorFormatter ?? defaultErrorFormatter, @@ -78,18 +86,6 @@ function internalCreateBuilder< }; } -type InOut< - TMiddlewareArgs extends MiddlewareFnArgs, - TErrorShape extends Json = { message: string }, -> = (input: FileRouterInputConfig) => UploadBuilder<{ - _input: UnsetMarker; - _metadata: UnsetMarker; - _middlewareArgs: TMiddlewareArgs; - _errorShape: TErrorShape; - _errorFn: UnsetMarker; - _output: UnsetMarker; -}>; - export type CreateBuilderOptions = { errorFormatter: (err: UploadThingError) => TErrorShape; }; @@ -97,12 +93,22 @@ export type CreateBuilderOptions = { export function createBuilder< TMiddlewareArgs extends MiddlewareFnArgs, TErrorShape extends Json = { message: string }, ->( - opts?: CreateBuilderOptions, -): InOut { - return (input: FileRouterInputConfig) => { - return internalCreateBuilder({ +>(opts?: CreateBuilderOptions) { + return ( + input: FileRouterInputConfig, + config?: TRouteOptions, + ): UploadBuilder<{ + _routeOptions: TRouteOptions; + _input: UnsetMarker; + _metadata: UnsetMarker; + _middlewareArgs: TMiddlewareArgs; + _errorShape: TErrorShape; + _errorFn: UnsetMarker; + _output: UnsetMarker; + }> => { + return internalCreateBuilder({ routerConfig: input, + routeOptions: config ?? {}, ...opts, }); }; diff --git a/packages/uploadthing/src/internal/upload.browser.ts b/packages/uploadthing/src/internal/upload.browser.ts new file mode 100644 index 0000000000..1b20257637 --- /dev/null +++ b/packages/uploadthing/src/internal/upload.browser.ts @@ -0,0 +1,171 @@ +import { unsafeCoerce } from "effect/Function"; +import * as Micro from "effect/Micro"; + +import type { FetchError } from "@uploadthing/shared"; +import { FetchContext, fetchEff, UploadThingError } from "@uploadthing/shared"; + +import type { + ClientUploadedFileData, + FileRouter, + inferEndpointOutput, + NewPresignedUrl, + UploadFilesOptions, +} from "../types"; +import { createUTReporter } from "./ut-reporter"; + +const uploadWithProgress = ( + file: File, + rangeStart: number, + presigned: NewPresignedUrl, + onUploadProgress?: + | ((opts: { loaded: number; delta: number }) => void) + | undefined, +) => + Micro.async((resume) => { + const xhr = new XMLHttpRequest(); + xhr.open("PUT", presigned.url, true); + xhr.setRequestHeader("Range", `bytes=${rangeStart}-`); + xhr.responseType = "json"; + + let previousLoaded = 0; + xhr.upload.addEventListener("progress", ({ loaded }) => { + const delta = loaded - previousLoaded; + onUploadProgress?.({ loaded, delta }); + previousLoaded = loaded; + }); + xhr.addEventListener("load", () => { + resume( + xhr.status >= 200 && xhr.status < 300 + ? Micro.succeed(xhr.response) + : Micro.die( + `XHR failed ${xhr.status} ${xhr.statusText} - ${JSON.stringify(xhr.response)}`, + ), + ); + }); + + // Is there a case when the client would throw and + // ingest server not knowing about it? idts? + xhr.addEventListener("error", () => { + resume( + new UploadThingError({ + code: "UPLOAD_FAILED", + }), + ); + }); + + const formData = new FormData(); + formData.append("file", file.slice(rangeStart)); + xhr.send(formData); + + return Micro.sync(() => xhr.abort()); + }); + +export const uploadFile = < + TRouter extends FileRouter, + TEndpoint extends keyof TRouter, + TServerOutput = inferEndpointOutput, +>( + file: File, + presigned: NewPresignedUrl, + opts: { + onUploadProgress?: (progressEvent: { + loaded: number; + delta: number; + }) => void; + }, +) => + fetchEff(presigned.url, { method: "HEAD" }).pipe( + Micro.map(({ headers }) => + parseInt(headers.get("x-ut-range-start") ?? "0", 10), + ), + Micro.tap((start) => + opts.onUploadProgress?.({ + delta: start, + loaded: start, + }), + ), + Micro.flatMap((start) => + uploadWithProgress(file, start, presigned, (progressEvent) => + opts.onUploadProgress?.({ + delta: progressEvent.delta, + loaded: progressEvent.loaded + start, + }), + ), + ), + Micro.map( + unsafeCoerce< + unknown, + { url: string; appUrl: string; serverData: TServerOutput } + >, + ), + Micro.map((uploadResponse) => ({ + name: file.name, + size: file.size, + key: presigned.key, + lastModified: file.lastModified, + serverData: uploadResponse.serverData, + url: uploadResponse.url, + appUrl: uploadResponse.appUrl, + customId: presigned.customId, + type: file.type, + })), + ); + +export const uploadFilesInternal = < + TRouter extends FileRouter, + TEndpoint extends keyof TRouter, + TServerOutput = inferEndpointOutput, +>( + endpoint: TEndpoint, + opts: UploadFilesOptions, +): Micro.Micro< + ClientUploadedFileData[], + UploadThingError | FetchError +> => { + // classic service right here + const reportEventToUT = createUTReporter({ + endpoint: String(endpoint), + package: opts.package, + url: opts.url, + headers: opts.headers, + }); + + const totalSize = opts.files.reduce((acc, f) => acc + f.size, 0); + let totalLoaded = 0; + + return reportEventToUT("upload", { + input: "input" in opts ? opts.input : null, + files: opts.files.map((f) => ({ + name: f.name, + size: f.size, + type: f.type, + lastModified: f.lastModified, + })), + }).pipe( + Micro.flatMap((presigneds) => + Micro.forEach( + presigneds, + (presigned, i) => + uploadFile( + opts.files[i], + presigned, + { + onUploadProgress: (ev) => { + totalLoaded += ev.delta; + opts.onUploadProgress?.({ + file: opts.files[i], + progress: Math.round((ev.loaded / opts.files[i].size) * 100), + loaded: ev.loaded, + delta: ev.delta, + totalLoaded, + totalProgress: Math.round((totalLoaded / totalSize) * 100), + }); + }, + }, + ), + { concurrency: 6 }, + ), + ), + Micro.provideService(FetchContext, window.fetch), + ); +}; diff --git a/packages/uploadthing/src/internal/upload.server.ts b/packages/uploadthing/src/internal/upload.server.ts new file mode 100644 index 0000000000..8d4f994466 --- /dev/null +++ b/packages/uploadthing/src/internal/upload.server.ts @@ -0,0 +1,43 @@ +import { + HttpClient, + HttpClientRequest, + HttpClientResponse, +} from "@effect/platform"; +import * as Effect from "effect/Effect"; +import { unsafeCoerce } from "effect/Function"; + +import { UploadThingError } from "@uploadthing/shared"; + +import type { FileEsque } from "../sdk/types"; + +export const uploadWithoutProgress = ( + file: FileEsque, + presigned: { key: string; url: string }, +) => + Effect.gen(function* () { + const formData = new FormData(); + formData.append("file", file as Blob); // File data **MUST GO LAST** + + const httpClient = yield* HttpClient.HttpClient; + const json = yield* HttpClientRequest.put(presigned.url).pipe( + HttpClientRequest.formDataBody(formData), + HttpClientRequest.setHeader("Range", "bytes=0-"), + HttpClient.filterStatusOk(httpClient), + Effect.mapError( + (e) => + new UploadThingError({ + code: "UPLOAD_FAILED", + message: "Failed to upload file", + cause: e, + }), + ), + HttpClientResponse.json, + + Effect.andThen(unsafeCoerce), + ); + + yield* Effect.logDebug(`File ${file.name} uploaded successfully`).pipe( + Effect.annotateLogs("json", json), + ); + return json; + }); diff --git a/packages/uploadthing/src/internal/ut-reporter.ts b/packages/uploadthing/src/internal/ut-reporter.ts index 0a291e4c7c..48941de6c8 100644 --- a/packages/uploadthing/src/internal/ut-reporter.ts +++ b/packages/uploadthing/src/internal/ut-reporter.ts @@ -9,9 +9,9 @@ import { UploadThingError, } from "@uploadthing/shared"; -import { UPLOADTHING_VERSION } from "./constants"; -import { maybeParseResponseXML } from "./s3-error-parser"; -import type { ActionType, UTEvents } from "./types"; +import * as pkgJson from "../../package.json"; +import type { ActionType } from "./shared-schemas"; +import type { UTEvents } from "./types"; const createAPIRequestUrl = (config: { /** @@ -21,7 +21,7 @@ const createAPIRequestUrl = (config: { */ url: URL; slug: string; - actionType: ActionType; + actionType: typeof ActionType.Type; }) => { const url = new URL(config.url); @@ -56,21 +56,19 @@ export const createUTReporter = slug: cfg.endpoint, actionType: type, }); - let headers = - typeof cfg.headers === "function" ? cfg.headers() : cfg.headers; - if (headers instanceof Promise) { - headers = yield* Micro.promise(() => headers as Promise); - } + const headers = new Headers( + yield* Micro.promise(async () => + typeof cfg.headers === "function" ? await cfg.headers() : cfg.headers, + ), + ); + headers.set("x-uploadthing-package", cfg.package); + headers.set("x-uploadthing-version", pkgJson.version); + headers.set("Content-Type", "application/json"); const response = yield* fetchEff(url, { method: "POST", body: JSON.stringify(payload), - headers: { - "Content-Type": "application/json", - "x-uploadthing-package": cfg.package, - "x-uploadthing-version": UPLOADTHING_VERSION, - ...headers, - }, + headers, }).pipe( Micro.andThen(parseResponseJson), /** @@ -108,25 +106,5 @@ export const createUTReporter = ), ); - switch (type) { - case "failure": { - // why isn't this narrowed automatically? - const p = payload as UTEvents["failure"]["in"]; - const parsed = maybeParseResponseXML(p.storageProviderError ?? ""); - if (parsed?.message) { - return yield* new UploadThingError({ - code: parsed.code, - message: parsed.message, - }); - } else { - return yield* new UploadThingError({ - code: "UPLOAD_FAILED", - message: `Failed to upload file ${p.fileName} to S3`, - cause: p.storageProviderError, - }); - } - } - } - return response; }); diff --git a/packages/uploadthing/src/internal/validate-request-input.ts b/packages/uploadthing/src/internal/validate-request-input.ts deleted file mode 100644 index 1ee2d00756..0000000000 --- a/packages/uploadthing/src/internal/validate-request-input.ts +++ /dev/null @@ -1,313 +0,0 @@ -import type * as S from "@effect/schema/Schema"; -import * as Context from "effect/Context"; -import * as Data from "effect/Data"; -import * as Effect from "effect/Effect"; -import { isDevelopment } from "std-env"; - -import type { - ExpandedRouteConfig, - FileRouterInputKey, - FileSize, - InvalidFileSizeError, - InvalidFileTypeError, - UnknownFileTypeError, -} from "@uploadthing/shared"; -import { - bytesToFileSize, - FetchContext, - fileSizeToBytes, - getTypeFromFileName, - InvalidRouteConfigError, - objectKeys, - UploadThingError, -} from "@uploadthing/shared"; - -import { UPLOADTHING_VERSION } from "./constants"; -import { getApiKey } from "./get-api-key"; -import type { UploadActionPayload } from "./shared-schemas"; -import type { - ActionType, - AnyParams, - FileRouter, - MiddlewareFnArgs, - RequestHandlerInput, - RouteHandlerConfig, - RouteHandlerOptions, - Uploader, - UploadThingHook, -} from "./types"; -import { - isActionType, - isUploadThingHook, - VALID_ACTION_TYPES, - VALID_UT_HOOKS, -} from "./types"; - -class FileSizeMismatch extends Data.Error<{ - reason: string; -}> { - readonly _tag = "FileSizeMismatch"; - readonly name = "FileSizeMismatchError"; - constructor(type: FileRouterInputKey, max: FileSize, actual: number) { - const reason = `You uploaded a ${type} file that was ${bytesToFileSize(actual)}, but the limit for that type is ${max}`; - super({ reason }); - } -} - -class FileCountMismatch extends Data.Error<{ - reason: string; -}> { - readonly _tag = "FileCountMismatch"; - readonly name = "FileCountMismatchError"; - constructor( - type: FileRouterInputKey, - boundtype: "minimum" | "maximum", - bound: number, - actual: number, - ) { - const reason = `You uploaded ${actual} file(s) of type '${type}', but the ${boundtype} for that type is ${bound}`; - - super({ reason }); - } -} - -// Verify that the uploaded files doesn't violate the route config, -// e.g. uploading more videos than allowed, or a file that is larger than allowed. -// This is double-checked on infra side, but we want to fail early to avoid network latency. -export const assertFilesMeetConfig = ( - files: S.Schema.Type["files"], - routeConfig: ExpandedRouteConfig, -): Effect.Effect< - null, - | UploadThingError - | FileSizeMismatch - | FileCountMismatch - | InvalidRouteConfigError - | UnknownFileTypeError - | InvalidFileTypeError - | InvalidFileSizeError -> => - Effect.gen(function* () { - const counts: Record = {}; - - for (const file of files) { - const type = yield* getTypeFromFileName( - file.name, - objectKeys(routeConfig), - ); - counts[type] = (counts[type] ?? 0) + 1; - - const sizeLimit = routeConfig[type]?.maxFileSize; - if (!sizeLimit) { - return yield* new InvalidRouteConfigError(type, "maxFileSize"); - } - const sizeLimitBytes = yield* fileSizeToBytes(sizeLimit); - - if (file.size > sizeLimitBytes) { - return yield* new FileSizeMismatch(type, sizeLimit, file.size); - } - } - - for (const _key in counts) { - const key = _key as FileRouterInputKey; - const config = routeConfig[key]; - if (!config) return yield* new InvalidRouteConfigError(key); - - const count = counts[key]; - const min = config.minFileCount; - const max = config.maxFileCount; - - if (min > max) { - return yield* new UploadThingError({ - code: "BAD_REQUEST", - message: - "Invalid config during file count - minFileCount > maxFileCount", - cause: `minFileCount must be less than maxFileCount for key ${key}. got: ${min} > ${max}`, - }); - } - - if (count < min) { - return yield* new FileCountMismatch(key, "minimum", min, count); - } - if (count > max) { - return yield* new FileCountMismatch(key, "maximum", max, count); - } - } - - return null; - }); - -type RequestInputBase = { - req: Request; - config: RouteHandlerConfig; - middlewareArgs: MiddlewareFnArgs; - isDev: boolean; - apiKey: string; - slug: string; - uploadable: Uploader; -}; - -type RequestInputService = RequestInputBase & - ( - | { hook: null; action: ActionType } - | { hook: UploadThingHook; action: null } - ); - -export class RequestInput - extends /** #__PURE__ */ Context.Tag("uploadthing/RequestInput")< - RequestInput, - RequestInputService - >() {} - -export const parseAndValidateRequest = ( - input: RequestHandlerInput>, - opts: RouteHandlerOptions, - adapter: string, -): Effect.Effect => - Effect.gen(function* () { - const req = yield* Effect.isEffect(input.req) - ? input.req - : Effect.succeed(input.req); - // Get inputs from query and params - const url = new URL(req.url); - const headers = req.headers; - const params = url.searchParams; - const action = params.get("actionType"); - const slug = params.get("slug"); - const hook = headers.get("uploadthing-hook"); - const utFrontendPackage = headers.get("x-uploadthing-package") ?? "unknown"; - const clientVersion = headers.get("x-uploadthing-version"); - const apiKey = getApiKey(opts.config?.uploadthingSecret); - - if (clientVersion != null && clientVersion !== UPLOADTHING_VERSION) { - yield* Effect.logError( - `Client version mismatch. Server version: ${UPLOADTHING_VERSION}, Client version: ${clientVersion}`, - ); - return yield* new UploadThingError({ - code: "BAD_REQUEST", - message: "Client version mismatch", - cause: `Server version: ${UPLOADTHING_VERSION}, Client version: ${clientVersion}`, - }); - } - - if (!slug) { - yield* Effect.logError("No slug provided in params:", params); - return yield* new UploadThingError({ - code: "BAD_REQUEST", - message: "No slug provided in params", - }); - } - - if (slug && typeof slug !== "string") { - const msg = `Expected slug to be of type 'string', got '${typeof slug}'`; - yield* Effect.logError(msg); - return yield* new UploadThingError({ - code: "BAD_REQUEST", - message: "`slug` must be a string", - cause: msg, - }); - } - - if (!apiKey) { - const msg = `No secret provided, please set UPLOADTHING_SECRET in your env file or in the config`; - yield* Effect.logError(msg); - return yield* new UploadThingError({ - code: "MISSING_ENV", - message: `No secret provided`, - cause: msg, - }); - } - - if (!apiKey.startsWith("sk_")) { - const msg = `Invalid secret provided, UPLOADTHING_SECRET must start with 'sk_'`; - yield* Effect.logError(msg); - return yield* new UploadThingError({ - code: "MISSING_ENV", - message: "Invalid API key. API keys must start with 'sk_'.", - cause: msg, - }); - } - - if (utFrontendPackage && typeof utFrontendPackage !== "string") { - const msg = `Expected x-uploadthing-package to be of type 'string', got '${typeof utFrontendPackage}'`; - yield* Effect.logError(msg); - return yield* new UploadThingError({ - code: "BAD_REQUEST", - message: - "`x-uploadthing-package` must be a string. eg. '@uploadthing/react'", - cause: msg, - }); - } - - const uploadable = opts.router[slug]; - if (!uploadable) { - const msg = `No file route found for slug ${slug}`; - yield* Effect.logError(msg); - return yield* new UploadThingError({ - code: "NOT_FOUND", - message: msg, - }); - } - - if (action && !isActionType(action)) { - const msg = `Expected ${VALID_ACTION_TYPES.map((x) => `"${x}"`) - .join(", ") - .replace(/,(?!.*,)/, " or")} but got "${action}"`; - yield* Effect.logError("Invalid action type", msg); - return yield* new UploadThingError({ - code: "BAD_REQUEST", - cause: `Invalid action type ${action}`, - message: msg, - }); - } - - if (hook && !isUploadThingHook(hook)) { - const msg = `Expected ${VALID_UT_HOOKS.map((x) => `"${x}"`) - .join(", ") - .replace(/,(?!.*,)/, " or")} but got "${hook}"`; - yield* Effect.logError("Invalid uploadthing hook", msg); - return yield* new UploadThingError({ - code: "BAD_REQUEST", - cause: `Invalid uploadthing hook ${hook}`, - message: msg, - }); - } - - if ((!action && !hook) || (action && hook)) { - const msg = `Exactly one of 'actionType' or 'uploadthing-hook' must be provided`; - yield* Effect.logError(msg); - return yield* new UploadThingError({ - code: "BAD_REQUEST", - message: msg, - }); - } - - yield* Effect.logDebug("✔︎ All request input is valid"); - - // FIXME: This should probably provide the full context at once instead of - // partially in the `runRequestHandlerAsync` and partially in here... - // Ref: https://discord.com/channels/@me/1201977154577891369/1207441839972548669 - const contextValue = yield* FetchContext; - contextValue.baseHeaders["x-uploadthing-api-key"] = apiKey; - contextValue.baseHeaders["x-uploadthing-fe-package"] = utFrontendPackage; - contextValue.baseHeaders["x-uploadthing-be-adapter"] = adapter; - - const { isDev = isDevelopment } = opts.config ?? {}; - if (isDev) yield* Effect.logInfo("UploadThing dev server is now running!"); - - const base = { - req, - config: opts.config ?? {}, - middlewareArgs: input.middlewareArgs, - isDev, - apiKey, - slug, - uploadable, - hook: null, - action: null, - }; - - return action - ? { ...base, action: action as ActionType } - : { ...base, hook: hook as UploadThingHook }; - }); diff --git a/packages/uploadthing/src/next-legacy.ts b/packages/uploadthing/src/next-legacy.ts index c517c9351b..11edb539ed 100644 --- a/packages/uploadthing/src/next-legacy.ts +++ b/packages/uploadthing/src/next-legacy.ts @@ -1,18 +1,9 @@ -// This node import should be fine since it's available in both node and edge runtimes -// https://vercel.com/docs/functions/edge-functions/edge-runtime#compatible-node.js-modules import type { NextApiRequest, NextApiResponse } from "next"; +import * as Effect from "effect/Effect"; import type { Json } from "@uploadthing/shared"; -import { getStatusCodeFromError } from "@uploadthing/shared"; -import { UPLOADTHING_VERSION } from "./internal/constants"; -import { formatError } from "./internal/error-formatter"; -import { - buildPermissionsInfoHandler, - buildRequestHandler, - runRequestHandlerAsync, -} from "./internal/handler"; -import { incompatibleNodeGuard } from "./internal/incompat-node-guard"; +import { makeAdapterHandler } from "./internal/handler"; import { toWebRequest } from "./internal/to-web-request"; import type { FileRouter, RouteHandlerOptions } from "./internal/types"; import type { CreateBuilderOptions } from "./internal/upload-builder"; @@ -34,44 +25,19 @@ export const createUploadthing = ( export const createRouteHandler = ( opts: RouteHandlerOptions, ) => { - incompatibleNodeGuard(); - - const requestHandler = buildRequestHandler( + const handler = makeAdapterHandler<[NextApiRequest, NextApiResponse]>( + (req, res) => Effect.succeed({ req, res, event: undefined }), + (req) => toWebRequest(req), opts, "nextjs-pages", ); - const getBuildPerms = buildPermissionsInfoHandler(opts); return async (req: NextApiRequest, res: NextApiResponse) => { - // Return valid endpoints - if (req.method === "GET") { - const perms = getBuildPerms(); - res.status(200).json(perms); - return; + const response = await handler(req, res); + res.status(response.status); + for (const [name, value] of response.headers) { + res.setHeader(name, value); } - - const response = await runRequestHandlerAsync( - requestHandler, - { - req: toWebRequest(req), - middlewareArgs: { req, res, event: undefined }, - }, - opts.config, - ); - - res.setHeader("x-uploadthing-version", UPLOADTHING_VERSION); - - if (response.success === false) { - res.status(getStatusCodeFromError(response.error)); - res.setHeader("x-uploadthing-version", UPLOADTHING_VERSION); - return res.json(formatError(response.error, opts.router)); - } - return res.json(response.body); }; }; - -/** - * @deprecated Use {@link createRouteHandler} instead - */ -export const createNextPageApiHandler = createRouteHandler; diff --git a/packages/uploadthing/src/next.ts b/packages/uploadthing/src/next.ts index afc2624681..aa48464ccf 100644 --- a/packages/uploadthing/src/next.ts +++ b/packages/uploadthing/src/next.ts @@ -1,38 +1,30 @@ import type { NextRequest } from "next/server"; +import * as Effect from "effect/Effect"; import type { Json } from "@uploadthing/shared"; +import { makeAdapterHandler } from "./internal/handler"; import type { FileRouter, RouteHandlerOptions } from "./internal/types"; import type { CreateBuilderOptions } from "./internal/upload-builder"; import { createBuilder } from "./internal/upload-builder"; -import { INTERNAL_DO_NOT_USE_createRouteHandlerCore } from "./server"; export type { FileRouter }; export { UTFiles } from "./internal/types"; +type MiddlewareArgs = { req: NextRequest; res: undefined; event: undefined }; + export const createUploadthing = ( opts?: CreateBuilderOptions, -) => - createBuilder< - { req: NextRequest; res: undefined; event: undefined }, - TErrorShape - >(opts); +) => createBuilder(opts); export const createRouteHandler = ( opts: RouteHandlerOptions, ) => { - const handlers = INTERNAL_DO_NOT_USE_createRouteHandlerCore( + const handler = makeAdapterHandler<[NextRequest]>( + (req) => Effect.succeed({ req, res: undefined, event: undefined }), + (req) => Effect.succeed(req), opts, "nextjs-app", ); - - return { - POST: (req: NextRequest) => handlers.POST(req), - GET: (req: NextRequest) => handlers.GET(req), - }; + return { POST: handler, GET: handler }; }; - -/** - * @deprecated Use {@link createRouteHandler} instead - */ -export const createNextRouteHandler = createRouteHandler; diff --git a/packages/uploadthing/src/remix.ts b/packages/uploadthing/src/remix.ts new file mode 100644 index 0000000000..d4e686f62f --- /dev/null +++ b/packages/uploadthing/src/remix.ts @@ -0,0 +1,34 @@ +import type { ActionFunctionArgs } from "@remix-run/server-runtime"; +import * as Effect from "effect/Effect"; + +import type { Json } from "@uploadthing/shared"; + +import { makeAdapterHandler } from "./internal/handler"; +import type { FileRouter, RouteHandlerOptions } from "./internal/types"; +import type { CreateBuilderOptions } from "./internal/upload-builder"; +import { createBuilder } from "./internal/upload-builder"; + +export type { FileRouter }; +export { UTFiles } from "./internal/types"; + +type MiddlewareArgs = { + req: undefined; + res: undefined; + event: ActionFunctionArgs; +}; + +export const createUploadthing = ( + opts?: CreateBuilderOptions, +) => createBuilder(opts); + +export const createRouteHandler = ( + opts: RouteHandlerOptions, +) => { + const handler = makeAdapterHandler<[ActionFunctionArgs]>( + (args) => Effect.succeed({ req: undefined, res: undefined, event: args }), + (args) => Effect.succeed(args.request), + opts, + "remix", + ); + return { action: handler, loader: handler }; +}; diff --git a/packages/uploadthing/src/sdk/index.ts b/packages/uploadthing/src/sdk/index.ts index a58bbd4aae..77eb36de22 100644 --- a/packages/uploadthing/src/sdk/index.ts +++ b/packages/uploadthing/src/sdk/index.ts @@ -1,27 +1,34 @@ +import { + HttpClient, + HttpClientRequest, + HttpClientResponse, +} from "@effect/platform"; import * as S from "@effect/schema/Schema"; +import { PrettyLogger } from "effect-log"; +import * as Arr from "effect/Array"; import * as Effect from "effect/Effect"; +import * as Layer from "effect/Layer"; +import * as Predicate from "effect/Predicate"; import type { ACL, - FetchContextService, FetchEsque, MaybeUrl, SerializedUploadThingError, } from "@uploadthing/shared"; import { asArray, - FetchContext, - fetchEff, - generateUploadThingURL, - parseResponseJson, + parseTimeToSeconds, UploadThingError, } from "@uploadthing/shared"; -import { UPLOADTHING_VERSION } from "../internal/constants"; -import { getApiKeyOrThrow } from "../internal/get-api-key"; -import { incompatibleNodeGuard } from "../internal/incompat-node-guard"; -import type { LogLevel } from "../internal/logger"; -import { ConsolaLogger, withMinimalLogLevel } from "../internal/logger"; +import { + ApiUrl, + configProvider, + UPLOADTHING_VERSION, + UTToken, +} from "../internal/config"; +import { withMinimalLogLevel } from "../internal/logger"; import type { ACLUpdateOptions, DeleteFilesOptions, @@ -36,91 +43,74 @@ import type { UTApiOptions, } from "./types"; import { UTFile } from "./ut-file"; -import { - downloadFiles, - guardServerOnly, - parseTimeToSeconds, - uploadFilesInternal, -} from "./utils"; +import { downloadFiles, guardServerOnly, uploadFilesInternal } from "./utils"; export { UTFile }; export class UTApi { private fetch: FetchEsque; - private defaultHeaders: FetchContextService["baseHeaders"]; private defaultKeyType: "fileKey" | "customId"; - private logLevel: LogLevel | undefined; - constructor(opts?: UTApiOptions) { + + constructor(private opts?: UTApiOptions) { // Assert some stuff guardServerOnly(); - incompatibleNodeGuard(); - const apiKey = getApiKeyOrThrow(opts?.apiKey); this.fetch = opts?.fetch ?? globalThis.fetch; - this.defaultHeaders = { - "x-uploadthing-api-key": apiKey, - "x-uploadthing-version": UPLOADTHING_VERSION, - "x-uploadthing-be-adapter": "server-sdk", - "x-uploadthing-fe-package": undefined, - }; this.defaultKeyType = opts?.defaultKeyType ?? "fileKey"; - this.logLevel = opts?.logLevel; } private requestUploadThing = ( pathname: `/${string}`, body: Record, responseSchema: S.Schema, - ) => { - const url = generateUploadThingURL(pathname); - Effect.runSync( - Effect.logDebug("Requesting UploadThing:", { - url, - body, - headers: this.defaultHeaders, - }), - ); - - const headers = new Headers([["Content-Type", "application/json"]]); - for (const [key, value] of Object.entries(this.defaultHeaders)) { - if (typeof value === "string") headers.set(key, value); - } - - return fetchEff(url, { - method: "POST", - cache: "no-store", - body: JSON.stringify(body), - headers, - }).pipe( - Effect.andThen(parseResponseJson), - Effect.andThen(S.decodeUnknown(responseSchema)), - Effect.catchTag("FetchError", (err) => - Effect.logError("Request failed:", err).pipe( - Effect.andThen(() => Effect.die(err)), - ), - ), - Effect.catchTag("ParseError", (err) => - Effect.logError("Response parsing failed:", err).pipe( - Effect.andThen(() => Effect.die(err)), - ), - ), - Effect.tap((res) => Effect.logDebug("UploadThing response:", res)), - ); - }; + ) => + Effect.gen(this, function* () { + const { apiKey } = yield* UTToken; + const baseUrl = yield* ApiUrl; + const httpClient = yield* HttpClient.HttpClient; + + return yield* HttpClientRequest.post(pathname).pipe( + HttpClientRequest.prependUrl(baseUrl), + HttpClientRequest.unsafeJsonBody(body), + HttpClientRequest.setHeaders({ + "x-uploadthing-version": UPLOADTHING_VERSION, + "x-uploadthing-be-adapter": "server-sdk", + "x-uploadthing-api-key": apiKey, + }), + HttpClient.filterStatusOk(httpClient), + Effect.tapBoth({ + onSuccess: (res) => + Effect.logDebug(`UT Response`).pipe( + Effect.annotateLogs("res", res), + ), + onFailure: (err) => + Effect.logError("UploadThing error").pipe( + Effect.annotateLogs("error", err), + ), + }), + HttpClientResponse.schemaBodyJsonScoped(responseSchema), + ); + }).pipe(Effect.withLogSpan("utapi.#requestUploadThing")); private executeAsync = ( - program: Effect.Effect, + program: Effect.Effect, signal?: AbortSignal, - ) => - program.pipe( - withMinimalLogLevel(this.logLevel), - Effect.provide(ConsolaLogger), - Effect.provideService(FetchContext, { - fetch: this.fetch, - baseHeaders: this.defaultHeaders, - }), + ) => { + return program.pipe( + Effect.provide(PrettyLogger.layer({ showFiberId: false })), + Effect.provide(withMinimalLogLevel), + Effect.provide(HttpClient.layer), + Effect.provide( + Layer.effect( + HttpClient.Fetch, + Effect.succeed(this.fetch as typeof globalThis.fetch), + ), + ), + Effect.provide(Layer.setConfigProvider(configProvider(this.opts))), + Effect.withLogSpan("utapi.#executeAsync"), (e) => Effect.runPromise(e, signal ? { signal } : undefined), ); + }; /** * Upload files to UploadThing storage. @@ -153,11 +143,17 @@ export class UTApi { uploadFilesInternal({ files: asArray(files), contentDisposition: opts?.contentDisposition ?? "inline", - metadata: opts?.metadata ?? {}, acl: opts?.acl, }), (ups) => Effect.succeed(Array.isArray(files) ? ups : ups[0]), - ).pipe(Effect.tap((res) => Effect.logDebug("Finished uploading:", res))), + ).pipe( + Effect.tap((res) => + Effect.logDebug("Finished uploading").pipe( + Effect.annotateLogs("uploadResult", res), + ), + ), + Effect.withLogSpan("uploadFiles"), + ), opts?.signal, ); return uploads; @@ -191,35 +187,42 @@ export class UTApi { guardServerOnly(); const downloadErrors: Record = {}; + const arr = asArray(urls); - const uploads = await this.executeAsync( - downloadFiles(asArray(urls), downloadErrors).pipe( - Effect.andThen((files) => files.filter((f): f is UTFile => f != null)), - Effect.andThen((files) => - uploadFilesInternal({ - files, - contentDisposition: opts?.contentDisposition ?? "inline", - metadata: opts?.metadata ?? {}, - acl: opts?.acl, - }), - ), - ), - opts?.signal, - ); + const program = Effect.gen(function* () { + const downloadedFiles = yield* downloadFiles(arr, downloadErrors).pipe( + Effect.map((files) => Arr.filter(files, Predicate.isNotNullable)), + ); - /** Put it all back together, preserve the order of files */ - const responses = asArray(urls).map((_, index) => { - if (downloadErrors[index]) { - return { data: null, error: downloadErrors[index] }; - } - return uploads.shift()!; - }); + yield* Effect.logDebug( + `Downloaded ${downloadedFiles.length}/${arr.length} files`, + ).pipe(Effect.annotateLogs("downloadedFiles", downloadedFiles)); - /** Return single object or array based on input urls */ - const uploadFileResponse = Array.isArray(urls) ? responses : responses[0]; + const uploads = yield* uploadFilesInternal({ + files: downloadedFiles, + contentDisposition: opts?.contentDisposition ?? "inline", + acl: opts?.acl, + }); - Effect.runSync(Effect.logDebug("Finished uploading:", uploadFileResponse)); - return uploadFileResponse; + /** Put it all back together, preserve the order of files */ + const responses = arr.map((_, index) => { + if (downloadErrors[index]) { + return { data: null, error: downloadErrors[index] }; + } + return uploads.shift()!; + }); + + /** Return single object or array based on input urls */ + const uploadFileResponse = Array.isArray(urls) ? responses : responses[0]; + yield* Effect.logDebug("Finished uploading").pipe( + Effect.annotateLogs("uploadResult", uploadFileResponse), + Effect.withLogSpan("utapi.uploadFilesFromUrl"), + ); + + return uploadFileResponse; + }).pipe(Effect.withLogSpan("uploadFilesFromUrl")); + + return await this.executeAsync(program, opts?.signal); } /** @@ -253,7 +256,7 @@ export class UTApi { ? { fileKeys: asArray(keys) } : { customIds: asArray(keys) }, DeleteFileResponse, - ), + ).pipe(Effect.withLogSpan("deleteFiles")), ); }; @@ -290,7 +293,7 @@ export class UTApi { "/v6/getFileUrl", keyType === "fileKey" ? { fileKeys: keys } : { customIds: keys }, GetFileUrlResponse, - ), + ).pipe(Effect.withLogSpan("getFileUrls")), ); }; @@ -328,7 +331,11 @@ export class UTApi { }) {} return await this.executeAsync( - this.requestUploadThing("/v6/listFiles", { ...opts }, ListFileResponse), + this.requestUploadThing( + "/v6/listFiles", + { ...opts }, + ListFileResponse, + ).pipe(Effect.withLogSpan("listFiles")), ); }; @@ -346,13 +353,10 @@ export class UTApi { "/v6/renameFiles", { updates: asArray(updates) }, RenameFileResponse, - ), + ).pipe(Effect.withLogSpan("renameFiles")), ); }; - /** @deprecated Use {@link renameFiles} instead. */ - public renameFile = this.renameFiles; - getUsageInfo = async () => { guardServerOnly(); @@ -366,7 +370,11 @@ export class UTApi { }) {} return await this.executeAsync( - this.requestUploadThing("/v6/getUsageInfo", {}, GetUsageInfoResponse), + this.requestUploadThing( + "/v6/getUsageInfo", + {}, + GetUsageInfoResponse, + ).pipe(Effect.withLogSpan("getUsageInfo")), ); }; @@ -406,7 +414,7 @@ export class UTApi { ? { fileKey: key, expiresIn } : { customId: key, expiresIn }, GetSignedUrlResponse, - ), + ).pipe(Effect.withLogSpan("getSignedURL")), ); }; @@ -445,7 +453,11 @@ export class UTApi { }); return await this.executeAsync( - this.requestUploadThing("/v6/updateACL", { updates }, responseSchema), + this.requestUploadThing( + "/v6/updateACL", + { updates }, + responseSchema, + ).pipe(Effect.withLogSpan("updateACL")), ); }; } diff --git a/packages/uploadthing/src/sdk/types.ts b/packages/uploadthing/src/sdk/types.ts index 3ce760adbc..25865b2617 100644 --- a/packages/uploadthing/src/sdk/types.ts +++ b/packages/uploadthing/src/sdk/types.ts @@ -1,19 +1,18 @@ /* eslint-disable @typescript-eslint/no-empty-interface */ import type { Blob as NodeBlob } from "buffer"; +import type * as LogLevel from "effect/LogLevel"; import type { ACL, ContentDisposition, Either, FetchEsque, - Json, MaybeUrl, SerializedUploadThingError, Time, } from "@uploadthing/shared"; -import type { LogLevel } from "../internal/logger"; import type { UploadedFileData } from "../types"; export interface UTApiOptions { @@ -23,20 +22,28 @@ export interface UTApiOptions { */ fetch?: FetchEsque; /** - * Provide a custom UploadThing API key. - * @default process.env.UPLOADTHING_SECRET + * Provide a custom UploadThing token + * @default process.env.UPLOADTHING_TOKEN */ - apiKey?: string; + token?: string; /** * @default "info" */ - logLevel?: LogLevel; + logLevel?: LogLevel.Literal; /** * Set the default key type for file operations. Allows you to set your preferred filter * for file keys or custom identifiers without needing to specify it on every call. * @default "fileKey" */ defaultKeyType?: "fileKey" | "customId"; + /** + * URL override for the API server + */ + apiUrl?: string; + /** + * URL override for the ingest server + */ + ingestUrl?: string; } export type UrlWithOverrides = { @@ -48,11 +55,11 @@ export type UrlWithOverrides = { type BlobEsque = NodeBlob | Blob; export type FileEsque = BlobEsque & { name: string; + lastModified?: number; customId?: string | null | undefined; }; export interface UploadFilesOptions { - metadata?: Json; contentDisposition?: ContentDisposition; acl?: ACL; /** diff --git a/packages/uploadthing/src/sdk/utils.ts b/packages/uploadthing/src/sdk/utils.ts index 8f44506c57..a5c4e81902 100644 --- a/packages/uploadthing/src/sdk/utils.ts +++ b/packages/uploadthing/src/sdk/utils.ts @@ -1,32 +1,25 @@ -import * as S from "@effect/schema/Schema"; -import * as Duration from "effect/Duration"; +import { + HttpClient, + HttpClientRequest, + HttpClientResponse, +} from "@effect/platform"; import * as Effect from "effect/Effect"; -import * as Schedule from "effect/Schedule"; import { - fetchEff, - generateUploadThingURL, + generateKey, + generateSignedURL, isObject, - parseResponseJson, - RetryError, UploadThingError, } from "@uploadthing/shared"; import type { ACL, ContentDisposition, - Json, MaybeUrl, SerializedUploadThingError, - Time, - TimeShort, } from "@uploadthing/shared"; -import { uploadMultipart } from "../internal/multi-part.server"; -import { uploadPresignedPost } from "../internal/presigned-post.server"; -import { - PollUploadResponse, - PresignedURLResponse, -} from "../internal/shared-schemas"; +import { IngestUrl, UTToken } from "../internal/config"; +import { uploadWithoutProgress } from "../internal/upload.server"; import type { UploadedFileData } from "../types"; import type { FileEsque, UrlWithOverrides } from "./types"; import { UTFile } from "./ut-file"; @@ -42,7 +35,6 @@ export function guardServerOnly() { type UploadFilesInternalOptions = { files: FileEsque[]; - metadata: Json; contentDisposition: ContentDisposition; acl: ACL | undefined; }; @@ -55,7 +47,9 @@ export const uploadFilesInternal = (input: UploadFilesInternalOptions) => (file) => uploadFile(file).pipe( Effect.tapError((error) => - Effect.logError("Upload failed:", error), + Effect.logError("Upload failed").pipe( + Effect.annotateLogs("error", error), + ), ), Effect.match({ onFailure: (error) => ({ @@ -113,67 +107,70 @@ export const downloadFiles = ( customId = undefined, } = isObject(_url) ? _url : {}; - const response = yield* fetchEff(url); - if (!response.ok) { - downloadErrors[idx] = UploadThingError.toObject( - new UploadThingError({ - code: "BAD_REQUEST", - message: "Failed to download requested file.", - cause: response, - }), - ); - return undefined; - } - - return yield* Effect.promise(() => response.blob()).pipe( - Effect.andThen((blob) => new UTFile([blob], name, { customId })), + const arrayBuffer = yield* HttpClientRequest.get(url).pipe( + HttpClientRequest.modify({ headers: {} }), + HttpClient.filterStatusOk(yield* HttpClient.HttpClient), + HttpClientResponse.arrayBuffer, + Effect.mapError((error) => { + downloadErrors[idx] = UploadThingError.toObject( + new UploadThingError({ + code: "BAD_REQUEST", + message: "Failed to download requested file.", + cause: error, + }), + ); + return Effect.succeed(undefined); + }), ); - }), + + return new UTFile([arrayBuffer], name, { + customId, + lastModified: Date.now(), + }); + }).pipe(Effect.withLogSpan("downloadFile")), { concurrency: 10 }, ); const getPresignedUrls = (input: UploadFilesInternalOptions) => Effect.gen(function* () { - const { files, metadata, contentDisposition, acl } = input; + const { files, contentDisposition, acl } = input; - const fileData = files.map((file) => ({ - name: file.name ?? "unnamed-blob", - type: file.type, - size: file.size, - ...("customId" in file ? { customId: file.customId } : {}), - })); - yield* Effect.logDebug("Getting presigned URLs for files", fileData); + yield* Effect.logDebug("Generating presigned URLs for files").pipe( + Effect.annotateLogs("files", files), + ); - const responseSchema = S.Struct({ - data: PresignedURLResponse, - }); + const { apiKey, appId } = yield* UTToken; + const baseUrl = yield* IngestUrl; + + const presigneds = yield* Effect.forEach(files, (file) => + Effect.gen(function* () { + const key = yield* generateKey(file, appId); + + const url = yield* generateSignedURL(`${baseUrl}/${key}`, apiKey, { + // ttlInSeconds: routeOptions.presignedURLTTL, + data: { + "x-ut-identifier": appId, + "x-ut-file-name": file.name, + "x-ut-file-size": file.size, + "x-ut-file-type": file.type, + "x-ut-custom-id": file.customId, + "x-ut-content-disposition": contentDisposition, + "x-ut-acl": acl, + }, + }); + return { url, key }; + }), + ); - const presigneds = yield* fetchEff( - generateUploadThingURL("/v6/uploadFiles"), - { - method: "POST", - cache: "no-store", - body: JSON.stringify({ - files: fileData, - metadata, - contentDisposition, - acl, - }), - headers: { "Content-Type": "application/json" }, - }, - ).pipe( - Effect.andThen(parseResponseJson), - Effect.andThen(S.decodeUnknown(responseSchema)), - Effect.catchTag("ParseError", (e) => Effect.die(e)), - Effect.catchTag("FetchError", (e) => Effect.die(e)), + yield* Effect.logDebug("Generated presigned URLs").pipe( + Effect.annotateLogs("presigneds", presigneds), ); - yield* Effect.logDebug("Got presigned URLs:", presigneds.data); return files.map((file, i) => ({ file, - presigned: presigneds.data[i], + presigned: presigneds[i], })); - }); + }).pipe(Effect.withLogSpan("getPresignedUrls")); const uploadFile = ( input: Effect.Effect.Success>[number], @@ -181,57 +178,16 @@ const uploadFile = ( Effect.gen(function* () { const { file, presigned } = input; - if ("urls" in presigned) { - yield* uploadMultipart(file, presigned); - } else { - yield* uploadPresignedPost(file, presigned); - } - - yield* fetchEff( - generateUploadThingURL(`/v6/pollUpload/${presigned.key}`), - ).pipe( - Effect.andThen(parseResponseJson), - Effect.andThen(S.decodeUnknown(PollUploadResponse)), - Effect.tap(Effect.logDebug("Polled upload", presigned.key)), - Effect.andThen((res) => - res.status === "done" - ? Effect.succeed(undefined) - : Effect.fail(new RetryError()), - ), - Effect.retry({ - while: (err) => err instanceof RetryError, - schedule: Schedule.exponential(Duration.millis(10), 4).pipe( - // 10ms, 40ms, 160ms, 640ms... - Schedule.andThenEither(Schedule.spaced(Duration.seconds(1))), - Schedule.compose(Schedule.elapsed), - Schedule.whileOutput(Duration.lessThanOrEqualTo(Duration.minutes(1))), - ), - }), - Effect.catchTag("RetryError", (e) => Effect.die(e)), - ); + const { url, appUrl } = yield* uploadWithoutProgress(file, presigned); return { key: presigned.key, - url: presigned.fileUrl, - appUrl: presigned.appUrl, + url: url, + appUrl: appUrl, + lastModified: file.lastModified ?? Date.now(), name: file.name, size: file.size, type: file.type, - customId: "customId" in file ? file.customId ?? null : null, + customId: file.customId ?? null, }; - }); - -export function parseTimeToSeconds(time: Time) { - const match = time.toString().split(/(\d+)/).filter(Boolean); - const num = Number(match[0]); - const unit = (match[1] ?? "s").trim().slice(0, 1) as TimeShort; - - const multiplier = { - s: 1, - m: 60, - h: 3600, - d: 86400, - }[unit]; - - return num * multiplier; -} + }).pipe(Effect.withLogSpan("uploadFile")); diff --git a/packages/uploadthing/src/server.ts b/packages/uploadthing/src/server.ts index 9e2af55a13..75cbb2ce1c 100644 --- a/packages/uploadthing/src/server.ts +++ b/packages/uploadthing/src/server.ts @@ -1,14 +1,10 @@ +import * as Effect from "effect/Effect"; + import type { Json } from "@uploadthing/shared"; -import { getStatusCodeFromError, UploadThingError } from "@uploadthing/shared"; +import { UploadThingError } from "@uploadthing/shared"; -import { UPLOADTHING_VERSION } from "./internal/constants"; -import { formatError } from "./internal/error-formatter"; -import { - buildPermissionsInfoHandler, - buildRequestHandler, - runRequestHandlerAsync, -} from "./internal/handler"; -import { incompatibleNodeGuard } from "./internal/incompat-node-guard"; +import { makeAdapterHandler } from "./internal/handler"; +import { extractRouterConfig as extractEffect } from "./internal/route-config"; import type { FileRouter, RouteHandlerOptions } from "./internal/types"; import type { CreateBuilderOptions } from "./internal/upload-builder"; import { createBuilder } from "./internal/upload-builder"; @@ -24,73 +20,16 @@ export const createUploadthing = ( opts?: CreateBuilderOptions, ) => createBuilder(opts); -export interface ResponseWithCleanup extends Response { - /** custom property where a Promise may be put that you can await in for example Cloudflare Workers */ - cleanup?: Promise; -} - -/** @internal */ -export const INTERNAL_DO_NOT_USE_createRouteHandlerCore = < - TRouter extends FileRouter, ->( +export const createRouteHandler = ( opts: RouteHandlerOptions, - adapter: string, ) => { - incompatibleNodeGuard(); - - const requestHandler = buildRequestHandler( + return makeAdapterHandler<[Request | { request: Request }]>( + (req) => Effect.succeed({ req, res: undefined, event: undefined }), + (ev) => Effect.succeed("request" in ev ? ev.request : ev), opts, - adapter, + "server", ); - const getBuildPerms = buildPermissionsInfoHandler(opts); - - const POST = async ( - request: Request | { request: Request }, - ): Promise => { - const req = request instanceof Request ? request : request.request; - const response = await runRequestHandlerAsync( - requestHandler, - { - req, - middlewareArgs: { req, event: undefined, res: undefined }, - }, - opts.config, - ); - - if (response.success === false) { - return Response.json(formatError(response.error, opts.router), { - status: getStatusCodeFromError(response.error), - headers: { "x-uploadthing-version": UPLOADTHING_VERSION }, - }); - } - - const res = Response.json(response.body, { - headers: { "x-uploadthing-version": UPLOADTHING_VERSION }, - }); - // @ts-expect-error - this is a custom property - res.cleanup = response.cleanup; - return res as ResponseWithCleanup; - }; - - const GET = (request: Request | { request: Request }) => { - const _req = request instanceof Request ? request : request.request; - - return Response.json(getBuildPerms(), { - headers: { "x-uploadthing-version": UPLOADTHING_VERSION }, - }); - }; - - return { GET, POST }; }; -export const createRouteHandler = ( - opts: RouteHandlerOptions, -) => INTERNAL_DO_NOT_USE_createRouteHandlerCore(opts, "server"); - export const extractRouterConfig = (router: FileRouter) => - buildPermissionsInfoHandler({ router })(); - -/** - * @deprecated Use {@link createRouteHandler} instead - */ -export const createServerHandler = createRouteHandler; + Effect.runSync(extractEffect(router)); diff --git a/packages/uploadthing/src/types.ts b/packages/uploadthing/src/types.ts index f4b54e5380..cbd73057a2 100644 --- a/packages/uploadthing/src/types.ts +++ b/packages/uploadthing/src/types.ts @@ -1,4 +1,8 @@ -import type { ExtendObjectIf, MaybePromise } from "@uploadthing/shared"; +import type { + ErrorMessage, + ExtendObjectIf, + MaybePromise, +} from "@uploadthing/shared"; import type { FileRouter, inferEndpointInput } from "./internal/types"; @@ -21,12 +25,12 @@ export type { FileUploadDataWithCustomId, UploadedFileData, ClientUploadedFileData, + NewPresignedUrl, } from "./internal/shared-schemas"; export type UploadFilesOptions< TRouter extends FileRouter, TEndpoint extends keyof TRouter, - TSkipPolling extends boolean = false, > = { /** * The files to upload @@ -46,15 +50,36 @@ export type UploadFilesOptions< * Called continuously as the file is uploaded to the storage provider */ onUploadProgress?: - | ((opts: { file: string; progress: number }) => void) + | ((opts: { + /** The file that triggered the progress event */ + file: File; + /** Percentage of the file that has been uploaded */ + progress: number; + /** Total bytes of the file that has been uploaded */ + loaded: number; + /** How many bytes have been uploaded since the last progress event for this file */ + delta: number; + /** Total bytes uploaded for all files in this upload */ + totalLoaded: number; + /** Percentage of the total loaded bytes for the upload */ + totalProgress: number; + }) => void) | undefined; /** - * Skip polling for server data after upload is complete - * Useful if you want faster response times and don't need - * any data returned from the server `onUploadComplete` callback - * @default false + * This option has been moved to your serverside route config. + * Please opt-in by setting `awaitServerData: false` in your route + * config instead. + * ### Example + * ```ts + * f( + * { image: { maxFileSize: "1MB" } }, + * { awaitServerData: false } + * ).middleware(...) + * ``` + * @deprecated + * @see https://docs.uploadthing.com/api-reference/server#route-options */ - skipPolling?: TSkipPolling | undefined; + skipPolling?: ErrorMessage<"This option has been moved to your serverside route config. Please use `awaitServerData` in your route config instead.">; /** * URL to the UploadThing API endpoint * @example URL { http://localhost:3000/api/uploadthing } @@ -78,6 +103,43 @@ export type UploadFilesOptions< { input: inferEndpointInput } >; +export type CreateUploadOptions< + TRouter extends FileRouter, + TEndpoint extends keyof TRouter, +> = { + /** + * The files to upload + */ + files: File[]; + /** + * Called continuously as the file is uploaded to the storage provider + */ + onUploadProgress?: + | ((opts: { + /** The file that triggered the progress event */ + file: File; + /** Percentage of the file that has been uploaded */ + progress: number; + /** Total bytes of the file that has been uploaded */ + loaded: number; + /** How many bytes have been uploaded since the last progress event for this file */ + delta: number; + /** Total bytes uploaded for all files in this upload */ + totalLoaded: number; + /** Percentage of the total loaded bytes for the upload */ + totalProgress: number; + }) => void) + | undefined; + /** + * Set custom headers that'll get sent with requests + * to your server + */ + headers?: HeadersInit | (() => MaybePromise) | undefined; +} & ExtendObjectIf< + inferEndpointInput, + { input: inferEndpointInput } +>; + export type GenerateUploaderOptions = { /** * URL to the UploadThing API endpoint diff --git a/packages/uploadthing/test/__test-helpers.ts b/packages/uploadthing/test/__test-helpers.ts index 4f31e8b055..7e6f27a914 100644 --- a/packages/uploadthing/test/__test-helpers.ts +++ b/packages/uploadthing/test/__test-helpers.ts @@ -1,20 +1,14 @@ +import * as S from "@effect/schema/Schema"; import type { StrictRequest } from "msw"; import { http, HttpResponse } from "msw"; import { setupServer } from "msw/node"; import { afterAll, beforeAll, it as itBase, vi } from "vitest"; -import { lookup } from "@uploadthing/mime-types"; -import { generateUploadThingURL } from "@uploadthing/shared"; +import { UPLOADTHING_VERSION } from "../src/internal/config"; +import { ParsedToken, UploadThingToken } from "../src/internal/shared-schemas"; +import type { ActionType } from "../src/internal/shared-schemas"; -import { UPLOADTHING_VERSION } from "../src/internal/constants"; -import type { - MPUResponse, - PresignedBase, - PSPResponse, -} from "../src/internal/shared-schemas"; -import type { ActionType } from "../src/internal/types"; - -export const requestSpy = vi.fn<[string, RequestInit]>(); +export const requestSpy = vi.fn<(url: string, req: RequestInit) => void>(); export const requestsToDomain = (domain: string) => requestSpy.mock.calls.filter(([url]) => url.includes(domain)); @@ -22,53 +16,45 @@ export const middlewareMock = vi.fn(); export const uploadCompleteMock = vi.fn(); export const onErrorMock = vi.fn(); -export const createApiUrl = (slug: string, action?: ActionType) => { +const tokenData = { + apiKey: "sk_foo", + appId: "app-1", + regions: ["fra1"] as const, +}; +export const testToken = { + encoded: S.encodeSync(UploadThingToken)(ParsedToken.make(tokenData)), + decoded: tokenData, +}; + +export const API_URL = + process.env.UPLOADTHING_API_URL ?? "https://api.uploadthing.com"; +export const UTFS_IO_URL = process.env.UPLOADTHING_API_URL + ? "https://staging.utfs.io" + : "https://utfs.io"; +export const INGEST_URL = process.env.UPLOADTHING_API_URL + ? "https://fra1.ingest.ut-staging.com" + : "https://fra1.ingest.uploadthing.com"; + +export const fileUrlPattern = new RegExp(`^${UTFS_IO_URL}/f/.+$`); +export const appUrlPattern = (appId = testToken.decoded.appId) => + new RegExp(`^${UTFS_IO_URL}/a/${appId}/.+$`); + +export const createApiUrl = (slug: string, action?: typeof ActionType.Type) => { const url = new URL("http://localhost:3000"); url.searchParams.set("slug", slug); if (action) url.searchParams.set("actionType", action); return url; }; +export const doNotExecute = (_fn: (...args: any[]) => any) => { + // noop +}; + export const baseHeaders = { "x-uploadthing-version": UPLOADTHING_VERSION, "x-uploadthing-package": "vitest", }; -const mockPresigned = (file: { - name: string; - size: number; - customId: string | null; -}): PSPResponse | MPUResponse => { - const base: PresignedBase = { - contentDisposition: "inline", - customId: file.customId ?? null, - fileName: file.name, - fileType: lookup(file.name) as any, - fileUrl: "https://utfs.io/f/abc-123.txt", - appUrl: "https://utfs.io/a/app-1/abc-123.txt", - key: "abc-123.txt", - pollingJwt: "random-jwt", - pollingUrl: generateUploadThingURL("/v6/serverCallback"), - }; - if (file.size > 5 * 1024 * 1024) { - return { - ...base, - chunkCount: 2, - chunkSize: file.size / 2, - uploadId: "random-upload-id", - urls: [ - "https://bucket.s3.amazonaws.com/abc-123.txt?partNumber=1&uploadId=random-upload-id", - "https://bucket.s3.amazonaws.com/abc-123.txt?partNumber=2&uploadId=random-upload-id", - ], - }; - } - return { - ...base, - url: "https://bucket.s3.amazonaws.com", - fields: { key: "abc-123.txt" }, - }; -}; - /** * Call this in each MSW handler to spy on the request * and provide an easy way to assert on the request @@ -87,14 +73,12 @@ const callRequestSpy = async (request: StrictRequest) => })(), }); -const msw = setupServer(); +export const msw = setupServer(); beforeAll(() => { msw.listen({ onUnhandledRequest: "bypass" }); }); afterAll(() => msw.close()); -export const resetMocks = () => msw.close(); - /** * Extend the base `it` function to provide a `db` instance to our tests * and extend the MSW handlers to mock the UploadThing API @@ -112,20 +96,6 @@ export const it = itBase.extend({ getFileByKey: (key: string) => files.find((f) => f.key === key), }; msw.use( - /** - * S3 - */ - http.post("https://bucket.s3.amazonaws.com", async ({ request }) => { - await callRequestSpy(request); - return new HttpResponse(); - }), - http.put("https://bucket.s3.amazonaws.com/:key", async ({ request }) => { - await callRequestSpy(request); - return new HttpResponse(null, { - status: 204, - headers: { ETag: "abc123" }, - }); - }), /** * Static Assets */ @@ -133,128 +103,38 @@ export const it = itBase.extend({ await callRequestSpy(request); return HttpResponse.text("Lorem ipsum doler sit amet"); }), - http.get("https://utfs.io/f/:key", async ({ request }) => { + http.get(`${UTFS_IO_URL}/f/:key`, async ({ request }) => { await callRequestSpy(request); return HttpResponse.text("Lorem ipsum doler sit amet"); }), /** - * UploadThing API + * UploadThing Ingest */ - http.post>( - "https://api.uploadthing.com/v6/prepareUpload", - async ({ request }) => { - await callRequestSpy(request); - const body = await request.json(); - - const presigneds = body.files.map((file) => { - const presigned = mockPresigned(file); - db.insertFile({ - ...file, - customId: file.customId ?? null, - type: presigned.fileType, - key: presigned.key, - callbackUrl: body.callbackUrl, - callbackSlug: body.callbackSlug, - metadata: JSON.stringify(body.metadata ?? "{}"), - }); - return presigned; - }); - return HttpResponse.json(presigneds); - }, - ), - http.post( - "https://api.uploadthing.com/v6/uploadFiles", - async ({ request }) => { - await callRequestSpy(request); - const body = await request.json(); - - const presigneds = body?.files.map((file) => { - const presigned = mockPresigned(file); - db.insertFile({ - key: presigned.key, - metadata: JSON.stringify(body.metadata ?? "{}"), - customId: file.customId ?? null, - ...file, - }); - return presigned; - }); - return HttpResponse.json({ data: presigneds }); - }, - ), - http.post( - "https://api.uploadthing.com/v6/completeMultipart", - async ({ request }) => { - await callRequestSpy(request); - return HttpResponse.json({ success: true }); - }, - ), - http.post( - "https://api.uploadthing.com/v6/failureCallback", - async ({ request }) => { - await callRequestSpy(request); - return HttpResponse.json({ success: true }); - }, - ), - http.get<{ key: string }>( - "https://api.uploadthing.com/v6/pollUpload/:key", - // @ts-expect-error - https://github.com/mswjs/msw/pull/2108 - async function* ({ request, params }) { + http.all<{ key: string }>( + `${INGEST_URL}/:key`, + async ({ request, params }) => { await callRequestSpy(request); - let file = null; - - // Simulate polling - at least once - yield HttpResponse.json({ status: "still waiting" }); - while (!file) { - file = db.getFileByKey(params.key); - if (file) break; - yield HttpResponse.json({ status: "still waiting" }); - } - + const appId = new URLSearchParams(request.url).get("x-ut-identifier"); return HttpResponse.json({ - status: "done", - fileData: { - ...file, - fileName: file.name, - fileSize: file.size, - fileType: file.type, - fileKey: file.key, - }, + url: `${UTFS_IO_URL}/f/${params.key}`, + appUrl: `${UTFS_IO_URL}/a/${appId}/${params.key}`, + serverData: null, }); }, ), - http.post( - "https://api.uploadthing.com/v6/requestFileAccess", - async ({ request }) => { - await callRequestSpy(request); - return HttpResponse.json({ - url: "https://utfs.io/f/someFileKey?x-some-amz=query-param", - }); - }, - ), - http.post( - "https://api.uploadthing.com/v6/serverCallback", - async ({ request }) => { - await callRequestSpy(request); - return HttpResponse.json({ status: "ok" }); - }, - ), - http.get( - "https://api.uploadthing.com/v6/serverCallback", - // @ts-expect-error - https://github.com/mswjs/msw/pull/2108 - async function* ({ request }) { - await callRequestSpy(request); - - yield HttpResponse.json({ status: "still waiting" }); - return HttpResponse.json({ status: "done", callbackData: null }); - }, - ), - http.post( - "https://api.uploadthing.com/v6/updateACL", - async ({ request }) => { - await callRequestSpy(request); - return HttpResponse.json({ success: true }); - }, - ), + /** + * UploadThing API + */ + http.post(`${API_URL}/v6/requestFileAccess`, async ({ request }) => { + await callRequestSpy(request); + return HttpResponse.json({ + url: `${UTFS_IO_URL}/f/someFileKey?x-some-amz=query-param`, + }); + }), + http.post(`${API_URL}/v6/updateACL`, async ({ request }) => { + await callRequestSpy(request); + return HttpResponse.json({ success: true }); + }), ); await use(db); // provide test context files.length = 0; // clear files after each test @@ -262,51 +142,20 @@ export const it = itBase.extend({ }); /** - * Call this in your test to make the S3 requests fail + * Call this in your test to make the ingest request fail */ -export const useBadS3 = () => +export const useBadIngestServer = () => msw.use( - http.post("https://bucket.s3.amazonaws.com", async ({ request }) => { + http.put(`${INGEST_URL}/f/:key`, async ({ request, params }) => { await callRequestSpy(request); + return new HttpResponse(null, { status: 403 }); }), - http.put("https://bucket.s3.amazonaws.com/:key", async ({ request }) => { - await callRequestSpy(request); - return new HttpResponse(null, { status: 204 }); - }), ); export const useBadUTApi = () => msw.use( - http.post("https://api.uploadthing.com/*", async () => { + http.post(`${API_URL}/*`, async () => { return HttpResponse.json({ error: "Not found" }, { status: 404 }); }), ); - -/** - * Call this in your test to make the S3 requests fail a couple times before succeeding - */ -export const useHalfBadS3 = () => - msw.use( - http.post( - "https://bucket.s3.amazonaws.com", - // @ts-expect-error - https://github.com/mswjs/msw/pull/2108 - async function* ({ request }) { - await callRequestSpy(request); - yield new HttpResponse(null, { status: 403 }); - return new HttpResponse(); - }, - ), - http.put( - "https://bucket.s3.amazonaws.com/:key", - // @ts-expect-error - https://github.com/mswjs/msw/pull/2108 - async function* ({ request }) { - await callRequestSpy(request); - yield new HttpResponse(null, { status: 403 }); - return new HttpResponse(null, { - status: 204, - headers: { ETag: "abc123" }, - }); - }, - ), - ); diff --git a/packages/uploadthing/test/adapters.test.ts b/packages/uploadthing/test/adapters.test.ts index 739c3ed195..3ef5993193 100644 --- a/packages/uploadthing/test/adapters.test.ts +++ b/packages/uploadthing/test/adapters.test.ts @@ -1,17 +1,29 @@ /* eslint-disable no-restricted-globals */ import type { NextApiRequest, NextApiResponse } from "next"; import { NextRequest } from "next/server"; +import { + HttpClient, + HttpServerRequest, + HttpServerResponse, +} from "@effect/platform"; +import * as ConfigProvider from "effect/ConfigProvider"; +import * as Effect from "effect/Effect"; +import * as Layer from "effect/Layer"; import * as express from "express"; import * as fastify from "fastify"; import { createApp, H3Event, toWebHandler } from "h3"; import { describe, expect, expectTypeOf, vi } from "vitest"; +import { configProvider } from "../src/internal/config"; import { baseHeaders, createApiUrl, + INGEST_URL, it, middlewareMock, requestSpy, + requestsToDomain, + testToken, uploadCompleteMock, } from "./__test-helpers"; @@ -36,9 +48,7 @@ describe("adapters:h3", async () => { it("gets H3Event in middleware args", async ({ db }) => { const eventHandler = createRouteHandler({ router, - config: { - uploadthingSecret: "sk_live_test", - }, + config: { token: testToken.encoded }, }); // FIXME: Didn't know how to declaratively create a H3Event to @@ -47,7 +57,11 @@ describe("adapters:h3", async () => { const res = await toWebHandler(createApp().use(eventHandler))( new Request(createApiUrl("middleware", "upload"), { method: "POST", - headers: baseHeaders, + headers: { + ...baseHeaders, + host: "localhost:3000", + "x-forwarded-proto": "http", + }, body: JSON.stringify({ files: [{ name: "foo.txt", size: 48, type: "text/plain" }], }), @@ -64,35 +78,39 @@ describe("adapters:h3", async () => { }), ); - // Should proceed to have requested URLs - expect(requestSpy).toHaveBeenCalledOnce(); - expect(requestSpy).toHaveBeenCalledWith( - "https://api.uploadthing.com/v6/prepareUpload", + // Should proceed to generate a signed URL + const json = await res.json(); + expect(json).toEqual([ { - body: { - files: [{ name: "foo.txt", size: 48 }], - routeConfig: { - blob: { - maxFileSize: "8MB", - maxFileCount: 1, - minFileCount: 1, - contentDisposition: "inline", - }, - }, - metadata: {}, - callbackUrl: "http://localhost:3000/", - callbackSlug: "middleware", - }, - headers: { - "content-type": "application/json", - "x-uploadthing-api-key": "sk_live_test", - "x-uploadthing-be-adapter": "h3", - "x-uploadthing-fe-package": "vitest", - "x-uploadthing-version": expect.stringMatching(/\d+\.\d+\.\d+/), - }, - method: "POST", + customId: null, + key: expect.stringMatching(/.+/), + url: expect.stringMatching( + `https://fra1.ingest.(uploadthing|ut-staging).com/.+`, + ), + name: "foo.txt", }, - ); + ]); + + // Should (asynchronously) register metadata at UploadThing + await vi.waitUntil(() => requestsToDomain(INGEST_URL).length); + expect(requestSpy).toHaveBeenCalledWith(`${INGEST_URL}/route-metadata`, { + body: { + isDev: false, + awaitServerData: true, + fileKeys: [json[0].key], + metadata: {}, + callbackUrl: "http://localhost:3000/", + callbackSlug: "middleware", + }, + headers: expect.objectContaining({ + "content-type": "application/json", + "x-uploadthing-api-key": "sk_foo", + "x-uploadthing-be-adapter": "h3", + "x-uploadthing-fe-package": "vitest", + "x-uploadthing-version": expect.stringMatching(/\d+\.\d+\.\d+/), + }), + method: "POST", + }); }); }); @@ -117,21 +135,23 @@ describe("adapters:server", async () => { }; it("gets Request in middleware args", async ({ db }) => { - const handlers = createRouteHandler({ + const handler = createRouteHandler({ router, - config: { - uploadthingSecret: "sk_live_test", - }, + config: { token: testToken.encoded }, }); const req = new Request(createApiUrl("middleware", "upload"), { method: "POST", - headers: baseHeaders, + headers: { + ...baseHeaders, + host: "localhost:3000", + "x-forwarded-proto": "http", + }, body: JSON.stringify({ files: [{ name: "foo.txt", size: 48, type: "text/plain" }], }), }); - const res = await handlers.POST(req); + const res = await handler(req); expect(res.status).toBe(200); expect(middlewareMock).toHaveBeenCalledOnce(); @@ -139,35 +159,37 @@ describe("adapters:server", async () => { expect.objectContaining({ event: undefined, req, res: undefined }), ); - // Should proceed to have requested URLs - expect(requestSpy).toHaveBeenCalledOnce(); - expect(requestSpy).toHaveBeenCalledWith( - "https://api.uploadthing.com/v6/prepareUpload", + // Should proceed to generate a signed URL + const json = await res.json(); + expect(json).toEqual([ { - body: { - files: [{ name: "foo.txt", size: 48 }], - routeConfig: { - blob: { - maxFileSize: "8MB", - maxFileCount: 1, - minFileCount: 1, - contentDisposition: "inline", - }, - }, - metadata: {}, - callbackUrl: "http://localhost:3000/", - callbackSlug: "middleware", - }, - headers: { - "content-type": "application/json", - "x-uploadthing-api-key": "sk_live_test", - "x-uploadthing-be-adapter": "server", - "x-uploadthing-fe-package": "vitest", - "x-uploadthing-version": expect.stringMatching(/\d+\.\d+\.\d+/), - }, - method: "POST", + customId: null, + key: expect.stringMatching(/.+/), + url: expect.stringMatching(`${INGEST_URL}/.+`), + name: "foo.txt", }, - ); + ]); + + // Should (asynchronously) register metadata at UploadThing + await vi.waitUntil(() => requestsToDomain(INGEST_URL).length); + expect(requestSpy).toHaveBeenCalledWith(`${INGEST_URL}/route-metadata`, { + body: { + isDev: false, + awaitServerData: true, + fileKeys: [json[0].key], + metadata: {}, + callbackUrl: "http://localhost:3000/", + callbackSlug: "middleware", + }, + headers: expect.objectContaining({ + "content-type": "application/json", + "x-uploadthing-api-key": "sk_foo", + "x-uploadthing-be-adapter": "server", + "x-uploadthing-fe-package": "vitest", + "x-uploadthing-version": expect.stringMatching(/\d+\.\d+\.\d+/), + }), + method: "POST", + }); }); }); @@ -192,14 +214,16 @@ describe("adapters:next", async () => { it("gets NextRequest in middleware args", async ({ db }) => { const handlers = createRouteHandler({ router, - config: { - uploadthingSecret: "sk_live_test", - }, + config: { token: testToken.encoded }, }); const req = new NextRequest(createApiUrl("middleware", "upload"), { method: "POST", - headers: baseHeaders, + headers: { + ...baseHeaders, + host: "localhost:3000", + "x-forwarded-proto": "http", + }, body: JSON.stringify({ files: [{ name: "foo.txt", size: 48, type: "text/plain" }], }), @@ -211,35 +235,38 @@ describe("adapters:next", async () => { expect(middlewareMock).toHaveBeenCalledWith( expect.objectContaining({ event: undefined, req, res: undefined }), ); - // Should proceed to have requested URLs - expect(requestSpy).toHaveBeenCalledOnce(); - expect(requestSpy).toHaveBeenCalledWith( - "https://api.uploadthing.com/v6/prepareUpload", + + // Should proceed to generate a signed URL + const json = await res.json(); + expect(json).toEqual([ { - body: { - files: [{ name: "foo.txt", size: 48 }], - routeConfig: { - blob: { - maxFileSize: "8MB", - maxFileCount: 1, - minFileCount: 1, - contentDisposition: "inline", - }, - }, - metadata: {}, - callbackUrl: "http://localhost:3000/", - callbackSlug: "middleware", - }, - headers: { - "content-type": "application/json", - "x-uploadthing-api-key": "sk_live_test", - "x-uploadthing-be-adapter": "nextjs-app", - "x-uploadthing-fe-package": "vitest", - "x-uploadthing-version": expect.stringMatching(/\d+\.\d+\.\d+/), - }, - method: "POST", + customId: null, + key: expect.stringMatching(/.+/), + url: expect.stringMatching(`${INGEST_URL}/.+`), + name: "foo.txt", }, - ); + ]); + + // Should (asynchronously) register metadata at UploadThing + await vi.waitUntil(() => requestsToDomain(INGEST_URL).length); + expect(requestSpy).toHaveBeenCalledWith(`${INGEST_URL}/route-metadata`, { + body: { + isDev: false, + awaitServerData: true, + fileKeys: [json[0].key], + metadata: {}, + callbackUrl: "http://localhost:3000/", + callbackSlug: "middleware", + }, + headers: expect.objectContaining({ + "content-type": "application/json", + "x-uploadthing-api-key": "sk_foo", + "x-uploadthing-be-adapter": "nextjs-app", + "x-uploadthing-fe-package": "vitest", + "x-uploadthing-version": expect.stringMatching(/\d+\.\d+\.\d+/), + }), + method: "POST", + }); }); }); @@ -302,9 +329,7 @@ describe("adapters:next-legacy", async () => { }) => { const handler = createRouteHandler({ router, - config: { - uploadthingSecret: "sk_live_test", - }, + config: { token: testToken.encoded }, }); const { req } = mockReq({ @@ -313,47 +338,64 @@ describe("adapters:next-legacy", async () => { files: [{ name: "foo.txt", size: 48, type: "text/plain" }], }, method: "POST", - headers: baseHeaders, + headers: { + ...baseHeaders, + host: "localhost:3000", + "x-forwarded-proto": "http", + }, }); - const { res, status } = mockRes(); + const { res, status, json } = mockRes(); await handler(req, res); - expect(status).not.toHaveBeenCalled(); // implicit 200 + expect(status).toHaveBeenCalledWith(200); expect(middlewareMock).toHaveBeenCalledOnce(); expect(middlewareMock).toHaveBeenCalledWith( expect.objectContaining({ event: undefined, req, res }), ); - // Should proceed to have requested URLs - expect(requestSpy).toHaveBeenCalledOnce(); - expect(requestSpy).toHaveBeenCalledWith( - "https://api.uploadthing.com/v6/prepareUpload", + // Should proceed to generate a signed URL + const resJson = (json.mock.calls[0] as any[])[0]; + const reader = (resJson as ReadableStream).getReader(); + let data = ""; + // eslint-disable-next-line no-constant-condition + while (true) { + const { done, value } = await reader.read(); + if (done) { + break; + } + data += new TextDecoder().decode(value); + } + const jsonData = JSON.parse(data); + expect(jsonData).toEqual([ { - body: { - files: [{ name: "foo.txt", size: 48 }], - routeConfig: { - blob: { - maxFileSize: "8MB", - maxFileCount: 1, - minFileCount: 1, - contentDisposition: "inline", - }, - }, - metadata: {}, - callbackUrl: "http://localhost:3000/", - callbackSlug: "middleware", - }, - headers: { - "content-type": "application/json", - "x-uploadthing-api-key": "sk_live_test", - "x-uploadthing-be-adapter": "nextjs-pages", - "x-uploadthing-fe-package": "vitest", - "x-uploadthing-version": expect.stringMatching(/\d+\.\d+\.\d+/), - }, - method: "POST", + customId: null, + key: expect.stringMatching(/.+/), + url: expect.stringMatching(`${INGEST_URL}/.+`), + name: "foo.txt", }, - ); + ]); + + // Should (asynchronously) register metadata at UploadThing + await vi.waitUntil(() => requestsToDomain(INGEST_URL).length); + expect(requestSpy).toHaveBeenCalledWith(`${INGEST_URL}/route-metadata`, { + body: { + isDev: false, + awaitServerData: true, + fileKeys: [jsonData[0]?.key], + metadata: {}, + callbackUrl: "http://localhost:3000/", + callbackSlug: "middleware", + }, + headers: expect.objectContaining({ + "content-type": "application/json", + "x-uploadthing-api-key": "sk_foo", + "x-uploadthing-be-adapter": "nextjs-pages", + "x-uploadthing-fe-package": "vitest", + "x-uploadthing-version": expect.stringMatching(/\d+\.\d+\.\d+/), + }), + method: "POST", + }); }); }); @@ -384,9 +426,7 @@ describe("adapters:express", async () => { "/api/uploadthing", createRouteHandler({ router, - config: { - uploadthingSecret: "sk_live_test", - }, + config: { token: testToken.encoded }, }), ); @@ -423,35 +463,37 @@ describe("adapters:express", async () => { }), ); - // Should proceed to have requested URLs - expect(requestSpy).toHaveBeenCalledOnce(); - expect(requestSpy).toHaveBeenCalledWith( - "https://api.uploadthing.com/v6/prepareUpload", + // Should proceed to generate a signed URL + const json = await res.json(); + expect(json).toEqual([ { - body: { - files: [{ name: "foo.txt", size: 48 }], - routeConfig: { - blob: { - maxFileSize: "8MB", - maxFileCount: 1, - minFileCount: 1, - contentDisposition: "inline", - }, - }, - metadata: {}, - callbackUrl: url, - callbackSlug: "middleware", - }, - headers: { - "content-type": "application/json", - "x-uploadthing-api-key": "sk_live_test", - "x-uploadthing-be-adapter": "express", - "x-uploadthing-fe-package": "vitest", - "x-uploadthing-version": expect.stringMatching(/\d+\.\d+\.\d+/), - }, - method: "POST", + customId: null, + key: expect.stringMatching(/.+/), + url: expect.stringMatching(`${INGEST_URL}/.+`), + name: "foo.txt", }, - ); + ]); + + // Should (asynchronously) register metadata at UploadThing + await vi.waitUntil(() => requestsToDomain(INGEST_URL).length); + expect(requestSpy).toHaveBeenCalledWith(`${INGEST_URL}/route-metadata`, { + body: { + isDev: false, + awaitServerData: true, + fileKeys: [json[0].key], + metadata: {}, + callbackUrl: url, + callbackSlug: "middleware", + }, + headers: expect.objectContaining({ + "content-type": "application/json", + "x-uploadthing-api-key": "sk_foo", + "x-uploadthing-be-adapter": "express", + "x-uploadthing-fe-package": "vitest", + "x-uploadthing-version": expect.stringMatching(/\d+\.\d+\.\d+/), + }), + method: "POST", + }); server.close(); }); @@ -522,9 +564,7 @@ describe("adapters:fastify", async () => { const app = fastify.default(); await app.register(createRouteHandler, { router, - config: { - uploadthingSecret: "sk_live_test", - }, + config: { token: testToken.encoded }, }); const addr = await app.listen(); @@ -561,36 +601,148 @@ describe("adapters:fastify", async () => { }), ); - // Should proceed to have requested URLs - expect(requestSpy).toHaveBeenCalledOnce(); - expect(requestSpy).toHaveBeenCalledWith( - "https://api.uploadthing.com/v6/prepareUpload", + // Should proceed to generate a signed URL + const json = await res.json(); + expect(json).toEqual([ { - body: { - files: [{ name: "foo.txt", size: 48 }], - routeConfig: { - blob: { - maxFileSize: "8MB", - maxFileCount: 1, - minFileCount: 1, - contentDisposition: "inline", - }, - }, - metadata: {}, - callbackUrl: url, - callbackSlug: "middleware", - }, - headers: { - "content-type": "application/json", - "x-uploadthing-api-key": "sk_live_test", - "x-uploadthing-be-adapter": "fastify", - "x-uploadthing-fe-package": "vitest", - "x-uploadthing-version": expect.stringMatching(/\d+\.\d+\.\d+/), - }, - method: "POST", + customId: null, + key: expect.stringMatching(/.+/), + url: expect.stringMatching(`${INGEST_URL}/.+`), + name: "foo.txt", }, - ); + ]); + + // Should (asynchronously) register metadata at UploadThing + await vi.waitUntil(() => requestsToDomain(INGEST_URL).length); + expect(requestSpy).toHaveBeenCalledWith(`${INGEST_URL}/route-metadata`, { + body: { + isDev: false, + awaitServerData: true, + fileKeys: [json[0].key], + metadata: {}, + callbackUrl: url, + callbackSlug: "middleware", + }, + headers: expect.objectContaining({ + "content-type": "application/json", + "x-uploadthing-api-key": "sk_foo", + "x-uploadthing-be-adapter": "fastify", + "x-uploadthing-fe-package": "vitest", + "x-uploadthing-version": expect.stringMatching(/\d+\.\d+\.\d+/), + }), + method: "POST", + }); await server.close(); }); }); + +describe("adapters:effect-platform", async () => { + const { it } = await import("@effect/vitest"); + + const { createUploadthing, createRouteHandler } = await import( + "../src/effect-platform" + ); + const f = createUploadthing(); + + const router = { + middleware: f({ blob: {} }) + .middleware((opts) => { + middlewareMock(opts); + expectTypeOf<{ + event: undefined; + req: HttpServerRequest.HttpServerRequest; + res: undefined; + }>(opts); + return {}; + }) + .onUploadComplete(uploadCompleteMock), + }; + + it.effect("gets HttpServerRequest in middleware args", () => + Effect.gen(function* () { + const handler = createRouteHandler({ + router, + config: { token: testToken.encoded }, + }).pipe(Effect.provide(HttpClient.layer)); + + const req = new Request(createApiUrl("middleware", "upload"), { + method: "POST", + headers: baseHeaders, + body: JSON.stringify({ + files: [{ name: "foo.txt", size: 48, type: "text/plain" }], + }), + }); + + const serverRequest = HttpServerRequest.fromWeb(req); + const response = yield* handler.pipe( + Effect.provideService( + HttpServerRequest.HttpServerRequest, + serverRequest, + ), + ); + + const json = yield* Effect.promise(() => + HttpServerResponse.toWeb(response).json(), + ); + + expect(json).toEqual([ + { + customId: null, + key: expect.stringMatching(/.+/), + url: expect.stringMatching(`${INGEST_URL}/.+`), + name: "foo.txt", + }, + ]); + expect(response.status).toBe(200); + + expect(middlewareMock).toHaveBeenCalledOnce(); + expect(middlewareMock).toHaveBeenCalledWith( + expect.objectContaining({ + event: undefined, + res: undefined, + req: serverRequest, + }), + ); + }), + ); + + /** + * I'm not entirely sure how this is supposed to work, but Datner + * gave some thoughts on how Effect users having their own ConfigProvider + * might conflict with the one provided by UploadThing. + */ + it.effect.skip("still finds the token with a custom config provider", () => + Effect.gen(function* () { + const handler = createRouteHandler({ + router, + }).pipe(Effect.provide(HttpClient.layer)); + + const req = new Request(createApiUrl("middleware", "upload"), { + method: "POST", + headers: baseHeaders, + body: JSON.stringify({ + files: [{ name: "foo.txt", size: 48, type: "text/plain" }], + }), + }); + + const serverRequest = HttpServerRequest.fromWeb(req); + const response = yield* handler.pipe( + Effect.provideService( + HttpServerRequest.HttpServerRequest, + serverRequest, + ), + ); + + expect(response.status).toBe(200); + }).pipe( + Effect.provide( + Layer.setConfigProvider( + ConfigProvider.fromJson({ + uploadthingToken: testToken.encoded, + }), + ), + ), + ), + ); +}); diff --git a/packages/uploadthing/test/client.test.ts b/packages/uploadthing/test/client.test.ts index 7cc89807d7..751509f891 100644 --- a/packages/uploadthing/test/client.test.ts +++ b/packages/uploadthing/test/client.test.ts @@ -2,21 +2,22 @@ import type { AddressInfo } from "node:net"; import express from "express"; -import { describe, expect, vi } from "vitest"; - -import { generateUploadThingURL } from "@uploadthing/shared"; +import { describe, expect, expectTypeOf, it as rawIt } from "vitest"; import { genUploader } from "../src/client"; import { createRouteHandler, createUploadthing } from "../src/express"; +import type { ClientUploadedFileData } from "../src/types"; import { + appUrlPattern, + doNotExecute, + fileUrlPattern, it, middlewareMock, onErrorMock, requestSpy, - requestsToDomain, + testToken, uploadCompleteMock, - useBadS3, - useHalfBadS3, + UTFS_IO_URL, } from "./__test-helpers"; export const setupUTServer = async () => { @@ -33,6 +34,34 @@ export const setupUTServer = async () => { }) .onUploadError(onErrorMock) .onUploadComplete(uploadCompleteMock), + withServerData: f( + { text: { maxFileSize: "4MB" } }, + { awaitServerData: true }, + ) + .middleware((opts) => { + middlewareMock(opts); + return {}; + }) + .onUploadError(onErrorMock) + .onUploadComplete((opts) => { + uploadCompleteMock(opts); + + return { foo: "bar" as const }; + }), + noServerData: f( + { text: { maxFileSize: "4MB" } }, + { awaitServerData: false }, + ) + .middleware((opts) => { + middlewareMock(opts); + return {}; + }) + .onUploadError(onErrorMock) + .onUploadComplete((opts) => { + uploadCompleteMock(opts); + + return { foo: "bar" as const }; + }), }; const app = express(); @@ -41,7 +70,7 @@ export const setupUTServer = async () => { createRouteHandler({ router, config: { - uploadthingSecret: "sk_test_123", + token: testToken.encoded, isDev: true, }, }), @@ -51,7 +80,7 @@ export const setupUTServer = async () => { const port = (server.address() as AddressInfo).port; await new Promise((res) => server.once("listening", res)); - const uploadFiles = genUploader({ + const { uploadFiles } = genUploader({ package: "vitest", url: `http://localhost:${port}`, }); @@ -62,85 +91,59 @@ export const setupUTServer = async () => { }; }; -describe("uploadFiles", () => { - it("uploads with presigned post", async ({ db }) => { +rawIt( + "propagates awaitServerData config on server to the client `serverData` property", + async () => { const { uploadFiles, close } = await setupUTServer(); const file = new File(["foo"], "foo.txt", { type: "text/plain" }); - await expect( - uploadFiles("foo", { - files: [file], - skipPolling: true, - }), - ).resolves.toEqual([ - { - name: "foo.txt", - size: 3, - type: "text/plain", - customId: null, - serverData: null, - key: "abc-123.txt", - url: "https://utfs.io/f/abc-123.txt", - appUrl: "https://utfs.io/a/app-1/abc-123.txt", - }, - ]); + doNotExecute(async () => { + const res1 = await uploadFiles("withServerData", { files: [file] }); + expectTypeOf[]>(res1); - expect(requestsToDomain("amazonaws.com")).toHaveLength(1); - expect(requestSpy).toHaveBeenCalledWith( - "https://bucket.s3.amazonaws.com/", - expect.objectContaining({ - method: "POST", - body: expect.any(FormData), - }), - ); - - expect(middlewareMock).toHaveBeenCalledOnce(); - expect(onErrorMock).not.toHaveBeenCalled(); - await vi.waitUntil(() => uploadCompleteMock.mock.calls.length > 0, { - timeout: 5000, + const res2 = await uploadFiles("noServerData", { files: [file] }); + expectTypeOf[]>(res2); }); await close(); - }); + }, +); - it("uploads with multipart upload", async ({ db }) => { +describe("uploadFiles", () => { + it("uploads file using presigned PUT", async ({ db }) => { const { uploadFiles, close } = await setupUTServer(); - const bigFile = new File([new ArrayBuffer(10 * 1024 * 1024)], "foo.txt", { - type: "text/plain", - }); + const file = new File(["foo"], "foo.txt", { type: "text/plain" }); - await expect( - uploadFiles("foo", { - files: [bigFile], - skipPolling: true, - }), - ).resolves.toEqual([ + await expect(uploadFiles("foo", { files: [file] })).resolves.toEqual([ { name: "foo.txt", - size: 10485760, + size: 3, type: "text/plain", customId: null, serverData: null, - key: "abc-123.txt", - url: "https://utfs.io/f/abc-123.txt", - appUrl: "https://utfs.io/a/app-1/abc-123.txt", + lastModified: expect.any(Number), + key: expect.stringMatching(/.+/), + url: expect.stringMatching(fileUrlPattern), + appUrl: expect.stringMatching(appUrlPattern()), }, ]); - expect(requestsToDomain("amazonaws.com")).toHaveLength(2); expect(requestSpy).toHaveBeenCalledWith( - "https://bucket.s3.amazonaws.com/abc-123.txt?partNumber=1&uploadId=random-upload-id", + expect.stringContaining("x-ut-file-name=foo.txt"), expect.objectContaining({ method: "PUT", - body: expect.any(Blob), + body: expect.any(FormData), }), ); expect(middlewareMock).toHaveBeenCalledOnce(); expect(onErrorMock).not.toHaveBeenCalled(); - await vi.waitUntil(() => uploadCompleteMock.mock.calls.length > 0, { - timeout: 5000, - }); + /** + * @todo: Make the mock streaming so we can hit the callback?? + */ + // await vi.waitUntil(() => uploadCompleteMock.mock.calls.length > 0, { + // timeout: 5000, + // }); await close(); }); @@ -152,7 +155,6 @@ describe("uploadFiles", () => { await expect( uploadFiles("foo", { files: [file], - skipPolling: true, headers: { authorization: "Bearer my-auth-token", }, @@ -164,9 +166,10 @@ describe("uploadFiles", () => { type: "text/plain", customId: null, serverData: null, - key: "abc-123.txt", - url: "https://utfs.io/f/abc-123.txt", - appUrl: "https://utfs.io/a/app-1/abc-123.txt", + lastModified: expect.any(Number), + key: expect.stringMatching(/.+/), + url: expect.stringMatching(fileUrlPattern), + appUrl: expect.stringMatching(appUrlPattern()), }, ]); @@ -186,7 +189,6 @@ describe("uploadFiles", () => { await expect( uploadFiles("foo", { files: [file], - skipPolling: true, headers: async () => ({ authorization: "Bearer my-auth-token", }), @@ -198,9 +200,10 @@ describe("uploadFiles", () => { type: "text/plain", customId: null, serverData: null, - key: "abc-123.txt", - url: "https://utfs.io/f/abc-123.txt", - appUrl: "https://utfs.io/a/app-1/abc-123.txt", + lastModified: expect.any(Number), + key: expect.stringMatching(/.+/), + url: expect.stringMatching(fileUrlPattern), + appUrl: expect.stringMatching(appUrlPattern()), }, ]); @@ -213,22 +216,19 @@ describe("uploadFiles", () => { await close(); }); - // We don't retry PSPs, maybe we should? - // it("succeeds after retries (PSP)", async ({ db }) => { + // Should we retry? + // it("succeeds after retries", { timeout: 15e3 }, async ({ db }) => { // const { uploadFiles, close } = await setupUTServer(); // useHalfBadS3(); - // const file = new File(["foo"], "foo.txt", { type: "text/plain" }); + // const bigFile = new File([new ArrayBuffer(10 * 1024 * 1024)], "foo.txt", { + // type: "text/plain", + // }); - // await expect( - // uploadFiles("foo", { - // files: [file], - // skipPolling: true, - // }), - // ).resolves.toEqual([ + // await expect(uploadFiles("foo", { files: [bigFile] })).resolves.toEqual([ // { // name: "foo.txt", - // size: 3, + // size: 10485760, // type: "text/plain", // customId: null, // serverData: null, @@ -236,119 +236,14 @@ describe("uploadFiles", () => { // url: "https://utfs.io/f/abc-123.txt", // }, // ]); - - // expect(requestsToDomain("amazonaws.com")).toHaveLength(3); // expect(onErrorMock).not.toHaveBeenCalled(); + // await vi.waitUntil(() => uploadCompleteMock.mock.calls.length > 0, { + // timeout: 5000, + // }); - // close(); + // await close(); // }); - it("succeeds after retries (MPU)", { timeout: 15e3 }, async ({ db }) => { - const { uploadFiles, close } = await setupUTServer(); - useHalfBadS3(); - - const bigFile = new File([new ArrayBuffer(10 * 1024 * 1024)], "foo.txt", { - type: "text/plain", - }); - - await expect( - uploadFiles("foo", { - files: [bigFile], - skipPolling: true, - }), - ).resolves.toEqual([ - { - name: "foo.txt", - size: 10485760, - type: "text/plain", - customId: null, - serverData: null, - key: "abc-123.txt", - url: "https://utfs.io/f/abc-123.txt", - appUrl: "https://utfs.io/a/app-1/abc-123.txt", - }, - ]); - - expect(onErrorMock).not.toHaveBeenCalled(); - await vi.waitUntil(() => uploadCompleteMock.mock.calls.length > 0, { - timeout: 5000, - }); - - await close(); - }); - - it("reports of failed post upload", async ({ db }) => { - const { uploadFiles, close } = await setupUTServer(); - useBadS3(); - - const file = new File(["foo"], "foo.txt", { type: "text/plain" }); - - await expect( - uploadFiles("foo", { - files: [file], - skipPolling: true, - }), - ).rejects.toThrowErrorMatchingInlineSnapshot( - `[UploadThingError: Failed to upload file foo.txt to S3]`, - ); - - expect(requestsToDomain("amazonaws.com")).toHaveLength(1); - expect(onErrorMock).toHaveBeenCalledOnce(); - expect(requestSpy).toHaveBeenCalledWith( - generateUploadThingURL("/v6/failureCallback"), - { - body: { fileKey: "abc-123.txt", uploadId: null }, - headers: { - "Content-Type": "application/json", - "x-uploadthing-api-key": "sk_test_123", - "x-uploadthing-be-adapter": "express", - "x-uploadthing-fe-package": "vitest", - "x-uploadthing-version": expect.stringMatching(/\d+\.\d+\.\d+/), - }, - method: "POST", - }, - ); - - await close(); - }); - - it("reports of failed multipart upload", async ({ db }) => { - const { uploadFiles, close } = await setupUTServer(); - useBadS3(); - - const bigFile = new File([new ArrayBuffer(10 * 1024 * 1024)], "foo.txt", { - type: "text/plain", - }); - - await expect( - uploadFiles("foo", { - files: [bigFile], - skipPolling: true, - }), - ).rejects.toThrowErrorMatchingInlineSnapshot( - `[UploadThingError: Failed to upload file foo.txt to S3]`, - ); - - expect(requestsToDomain("amazonaws.com")).toHaveLength(7); - expect(onErrorMock).toHaveBeenCalledOnce(); - expect(requestSpy).toHaveBeenCalledWith( - generateUploadThingURL("/v6/failureCallback"), - { - body: { fileKey: "abc-123.txt", uploadId: "random-upload-id" }, - headers: { - "Content-Type": "application/json", - "x-uploadthing-api-key": "sk_test_123", - "x-uploadthing-be-adapter": "express", - "x-uploadthing-fe-package": "vitest", - "x-uploadthing-version": expect.stringMatching(/\d+\.\d+\.\d+/), - }, - method: "POST", - }, - ); - - await close(); - }); - it("handles too big file size errors", async ({ db }) => { const { uploadFiles, close } = await setupUTServer(); @@ -361,10 +256,7 @@ describe("uploadFiles", () => { ); await expect( - uploadFiles("foo", { - files: [tooBigFile], - skipPolling: true, - }), + uploadFiles("foo", { files: [tooBigFile] }), ).rejects.toThrowErrorMatchingInlineSnapshot( `[UploadThingError: Invalid config: FileSizeMismatch]`, ); @@ -378,10 +270,7 @@ describe("uploadFiles", () => { const file = new File(["foo"], "foo.png", { type: "image/png" }); await expect( - uploadFiles("foo", { - files: [file], - skipPolling: true, - }), + uploadFiles("foo", { files: [file] }), ).rejects.toThrowErrorMatchingInlineSnapshot( `[UploadThingError: Invalid config: InvalidFileType]`, ); diff --git a/packages/uploadthing/test/gen-uploader.test.ts b/packages/uploadthing/test/gen-uploader.test.ts index 30f03df848..4f38cc22eb 100644 --- a/packages/uploadthing/test/gen-uploader.test.ts +++ b/packages/uploadthing/test/gen-uploader.test.ts @@ -4,16 +4,15 @@ import { z } from "zod"; import { genUploader } from "../src/client"; import { createBuilder } from "../src/internal/upload-builder"; import type { ClientUploadedFileData, FileRouter } from "../src/types"; - -const doNotExecute = (_fn: (...args: any[]) => any) => { - // noop -}; +import { doNotExecute } from "./__test-helpers"; describe("genuploader", () => { const f = createBuilder(); const router = { - uploadable1: f(["image", "video"]).onUploadComplete(() => { + uploadable1: f(["image", "video"], { + awaitServerData: false, + }).onUploadComplete(() => { return { foo: "bar" as const }; }), uploadable2: f(["image"]) @@ -23,7 +22,7 @@ describe("genuploader", () => { }), } satisfies FileRouter; - const uploader = genUploader({ + const { uploadFiles } = genUploader({ url: "0.0.0.0", package: "test", }); @@ -32,19 +31,19 @@ describe("genuploader", () => { it("typeerrors for invalid input", () => { doNotExecute(async () => { // @ts-expect-error - Argument of type '"random"' is not assignable to parameter of type '"uploadable"' - await uploader("random", { files }); + await uploadFiles("random", { files }); }); doNotExecute(async () => { // @ts-expect-error - Input should be required here - const res = await uploader("uploadable2", { files }); + const res = await uploadFiles("uploadable2", { files }); expectTypeOf[]>(res); }); }); it("types serverData as null if polling is skipped", () => { doNotExecute(async () => { - const res = await uploader("uploadable1", { files, skipPolling: true }); + const res = await uploadFiles("uploadable1", { files }); expectTypeOf[]>(res); }); }); diff --git a/packages/uploadthing/test/request-handler.test.ts b/packages/uploadthing/test/request-handler.test.ts index 5d63df0e7c..ca85767bca 100644 --- a/packages/uploadthing/test/request-handler.test.ts +++ b/packages/uploadthing/test/request-handler.test.ts @@ -1,3 +1,4 @@ +import * as Effect from "effect/Effect"; import { describe, expect } from "vitest"; import { z } from "zod"; @@ -11,8 +12,8 @@ import { it, middlewareMock, requestSpy, + testToken, uploadCompleteMock, - useBadUTApi, } from "./__test-helpers"; const f = createUploadthing({ @@ -67,18 +68,17 @@ const router = { .onUploadComplete(uploadCompleteMock), }; -const handlers = createRouteHandler({ +const handler = createRouteHandler({ router, config: { - uploadthingSecret: "sk_live_test123", - // @ts-expect-error - annoying to see error logs - logLevel: "silent", + token: testToken.encoded, + logLevel: "Fatal", }, }); describe("errors for invalid request input", () => { it("404s for invalid slugs", async ({ db }) => { - const res = await handlers.POST( + const res = await handler( new Request(createApiUrl("i-dont-exist", "upload"), { method: "POST", headers: baseHeaders, @@ -96,7 +96,7 @@ describe("errors for invalid request input", () => { }); it("400s for invalid action type", async ({ db }) => { - const res = await handlers.POST( + const res = await handler( // @ts-expect-error - invalid is not a valid action type new Request(createApiUrl("imageUploader", "invalid"), { method: "POST", @@ -110,16 +110,15 @@ describe("errors for invalid request input", () => { expect(requestSpy).toHaveBeenCalledTimes(0); expect(res.status).toBe(400); await expect(res.json()).resolves.toEqual({ - cause: "Error: Invalid action type invalid", - message: - 'Expected "upload", "failure" or "multipart-complete" but got "invalid"', + message: "Invalid input", + cause: expect.stringContaining('Expected "upload", actual "invalid"'), }); }); }); describe("file route config", () => { it("blocks unmatched file types", async ({ db }) => { - const res = await handlers.POST( + const res = await handler( new Request(createApiUrl("imageUploader", "upload"), { method: "POST", headers: baseHeaders, @@ -138,7 +137,7 @@ describe("file route config", () => { }); it("blocks for too big files", async ({ db }) => { - const res = await handlers.POST( + const res = await handler( new Request(createApiUrl("imageUploader", "upload"), { method: "POST", headers: baseHeaders, @@ -160,7 +159,7 @@ describe("file route config", () => { }); it("blocks for too many files", async ({ db }) => { - const res = await handlers.POST( + const res = await handler( new Request(createApiUrl("imageUploader", "upload"), { method: "POST", headers: baseHeaders, @@ -183,7 +182,7 @@ describe("file route config", () => { }); it("blocks for too few files", async ({ db }) => { - const res = await handlers.POST( + const res = await handler( new Request(createApiUrl("withMinInput", "upload"), { method: "POST", headers: baseHeaders, @@ -205,7 +204,7 @@ describe("file route config", () => { describe(".input()", () => { it("blocks when input is missing", async ({ db }) => { - const res = await handlers.POST( + const res = await handler( new Request(createApiUrl("withInput", "upload"), { method: "POST", headers: baseHeaders, @@ -228,7 +227,7 @@ describe(".input()", () => { }); it("blocks when input doesn't match schema", async ({ db }) => { - const res = await handlers.POST( + const res = await handler( new Request(createApiUrl("withInput", "upload"), { method: "POST", headers: baseHeaders, @@ -254,7 +253,7 @@ describe(".input()", () => { }); it("forwards input to middleware", async ({ db }) => { - const res = await handlers.POST( + const res = await handler( new Request(createApiUrl("withInput", "upload"), { method: "POST", headers: baseHeaders, @@ -276,7 +275,7 @@ describe(".input()", () => { describe(".middleware()", () => { it("forwards files to middleware", async ({ db }) => { - const res = await handlers.POST( + const res = await handler( new Request(createApiUrl("imageUploader", "upload"), { method: "POST", headers: baseHeaders, @@ -297,7 +296,7 @@ describe(".middleware()", () => { }); it("early exits if middleware throws", async ({ db }) => { - const res = await handlers.POST( + const res = await handler( new Request(createApiUrl("middlewareThrows", "upload"), { method: "POST", headers: baseHeaders, @@ -332,7 +331,7 @@ describe(".onUploadComplete()", () => { metadata: {}, file: new UploadedFileData({ url: "https://utfs.io/f/some-random-key.png", - appUrl: "https://utfs.io/a/app-1/some-random-key.png", + appUrl: `https://utfs.io/a/${testToken.decoded.appId}/some-random-key.png`, name: "foo.png", key: "some-random-key.png", size: 48, @@ -340,9 +339,11 @@ describe(".onUploadComplete()", () => { customId: null, }), }); - const signature = await signPayload(payload, "sk_live_test123"); + const signature = await Effect.runPromise( + signPayload(payload, testToken.decoded.apiKey), + ); - const res = await handlers.POST( + const res = await handler( new Request(createApiUrl("imageUploader"), { method: "POST", headers: { @@ -364,7 +365,7 @@ describe(".onUploadComplete()", () => { size: 48, type: "image/png", url: "https://utfs.io/f/some-random-key.png", - appUrl: "https://utfs.io/a/app-1/some-random-key.png", + appUrl: `https://utfs.io/a/${testToken.decoded.appId}/some-random-key.png`, }, metadata: {}, }); @@ -376,7 +377,7 @@ describe(".onUploadComplete()", () => { metadata: {}, file: new UploadedFileData({ url: "https://utfs.io/f/some-random-key.png", - appUrl: "https://utfs.io/a/app-1/some-random-key.png", + appUrl: `https://utfs.io/a/${testToken.decoded.appId}/some-random-key.png`, name: "foo.png", key: "some-random-key.png", size: 48, @@ -385,7 +386,7 @@ describe(".onUploadComplete()", () => { }), }); - const res = await handlers.POST( + const res = await handler( new Request(createApiUrl("imageUploader"), { method: "POST", headers: { @@ -408,7 +409,7 @@ describe(".onUploadComplete()", () => { metadata: {}, file: new UploadedFileData({ url: "https://utfs.io/f/some-random-key.png", - appUrl: "https://utfs.io/a/app-1/some-random-key.png", + appUrl: `https://utfs.io/a/${testToken.decoded.appId}/some-random-key.png`, name: "foo.png", key: "some-random-key.png", size: 48, @@ -416,9 +417,11 @@ describe(".onUploadComplete()", () => { customId: null, }), }); - const signature = await signPayload(payload, "sk_live_badkey"); + const signature = await Effect.runPromise( + signPayload(payload, "sk_live_badkey"), + ); - const res = await handlers.POST( + const res = await handler( new Request(createApiUrl("imageUploader"), { method: "POST", headers: { @@ -436,29 +439,3 @@ describe(".onUploadComplete()", () => { expect(uploadCompleteMock).not.toHaveBeenCalled(); }); }); - -describe("bad request handling", () => { - it("throws a more descriptive error instead of ParseError for bad request", async ({ - db, - }) => { - useBadUTApi(); - - const res = await handlers.POST( - new Request(createApiUrl("imageUploader", "upload"), { - method: "POST", - headers: baseHeaders, - body: JSON.stringify({ - files: [{ name: "foo.png", size: 48, type: "image/png" }], - }), - }), - ); - expect(res.status).toBe(500); - await expect(res.json()).resolves.toEqual({ - message: - "Request to https://api.uploadthing.com/v6/prepareUpload failed with status 404", - data: { error: "Not found" }, - cause: - "BadRequestError: Request to https://api.uploadthing.com/v6/prepareUpload failed with status 404", - }); - }); -}); diff --git a/packages/uploadthing/test/sdk.test.ts b/packages/uploadthing/test/sdk.test.ts index d7302cc3d3..b74803d3e5 100644 --- a/packages/uploadthing/test/sdk.test.ts +++ b/packages/uploadthing/test/sdk.test.ts @@ -1,5 +1,5 @@ /* eslint-disable no-restricted-globals */ -import { process } from "std-env"; +import * as S from "@effect/schema/Schema"; import { afterAll, beforeAll, @@ -9,65 +9,49 @@ import { it as rawIt, } from "vitest"; +import { UploadThingToken } from "../src/internal/shared-schemas"; import { UTApi, UTFile } from "../src/sdk"; import type { UploadFileResult } from "../src/sdk/types"; -import { it, requestSpy, resetMocks } from "./__test-helpers"; +import { + API_URL, + appUrlPattern, + fileUrlPattern, + INGEST_URL, + it, + msw, + requestSpy, + testToken, + UTFS_IO_URL, +} from "./__test-helpers"; describe("uploadFiles", () => { const fooFile = new File(["foo"], "foo.txt", { type: "text/plain" }); it("uploads successfully", async ({ db }) => { - const utapi = new UTApi({ apiKey: "sk_foo" }); + const utapi = new UTApi({ token: testToken.encoded }); const result = await utapi.uploadFiles(fooFile); - expect(requestSpy).toHaveBeenCalledTimes(3); - expect(requestSpy).toHaveBeenNthCalledWith( - 1, - "https://api.uploadthing.com/v6/uploadFiles", - { - body: { - files: [{ name: "foo.txt", type: "text/plain", size: 3 }], - metadata: {}, - contentDisposition: "inline", - }, - headers: { - "content-type": "application/json", - "x-uploadthing-api-key": "sk_foo", - "x-uploadthing-be-adapter": "server-sdk", - "x-uploadthing-version": expect.stringMatching(/\d+\.\d+\.\d+/), - }, - method: "POST", - }, - ); - expect(requestSpy).toHaveBeenNthCalledWith( - 2, - "https://bucket.s3.amazonaws.com/", + expect(requestSpy).toHaveBeenCalledTimes(1); + expect(requestSpy).toHaveBeenCalledWith( + expect.stringContaining(INGEST_URL), expect.objectContaining({ + method: "PUT", body: expect.any(FormData), - method: "POST", + headers: expect.objectContaining({ + range: "bytes=0-", + }), }), ); - expect(requestSpy).toHaveBeenNthCalledWith( - 3, - "https://api.uploadthing.com/v6/pollUpload/abc-123.txt", - { - body: null, - headers: { - "x-uploadthing-api-key": "sk_foo", - "x-uploadthing-be-adapter": "server-sdk", - "x-uploadthing-version": expect.stringMatching(/\d+\.\d+\.\d+/), - }, - method: "GET", - }, - ); + const key = result.data?.key; expect(result).toEqual({ data: { - key: "abc-123.txt", + key: expect.stringMatching(/.+/), name: "foo.txt", size: 3, - url: "https://utfs.io/f/abc-123.txt", - appUrl: "https://utfs.io/a/app-1/abc-123.txt", + lastModified: fooFile.lastModified, + url: `${UTFS_IO_URL}/f/${key}`, + appUrl: `${UTFS_IO_URL}/a/${testToken.decoded.appId}/${key}`, customId: null, type: "text/plain", }, @@ -76,112 +60,80 @@ describe("uploadFiles", () => { }); it("returns array if array is passed", async ({ db }) => { - const utapi = new UTApi({ apiKey: "sk_foo" }); + const utapi = new UTApi({ token: testToken.encoded }); const result = await utapi.uploadFiles([fooFile]); expectTypeOf(result); expect(Array.isArray(result)).toBe(true); }); it("returns single object if no array is passed", async ({ db }) => { - const utapi = new UTApi({ apiKey: "sk_foo" }); + const utapi = new UTApi({ token: testToken.encoded }); const result = await utapi.uploadFiles(fooFile); expectTypeOf(result); expect(Array.isArray(result)).toBe(false); }); it("accepts UTFile", async ({ db }) => { - const utapi = new UTApi({ apiKey: "sk_foo" }); + const utapi = new UTApi({ token: testToken.encoded }); const file = new UTFile(["foo"], "foo.txt"); await utapi.uploadFiles(file); expect(file.type).toBe("text/plain"); expect(requestSpy).toHaveBeenCalledWith( - "https://api.uploadthing.com/v6/uploadFiles", - expect.objectContaining({}), + expect.stringContaining(`x-ut-file-name=foo.txt`), + expect.objectContaining({ method: "PUT" }), ); }); it("accepts UndiciFile", async ({ db }) => { - const utapi = new UTApi({ apiKey: "sk_foo" }); + const utapi = new UTApi({ token: testToken.encoded }); const { File } = await import("undici"); const file = new File(["foo"], "foo.txt"); await utapi.uploadFiles(file); }); it("accepts UTFile with customId", async ({ db }) => { - const utapi = new UTApi({ apiKey: "sk_foo" }); + const utapi = new UTApi({ token: testToken.encoded }); const fileWithId = new UTFile(["foo"], "foo.txt", { customId: "foo" }); await utapi.uploadFiles(fileWithId); expect(fileWithId.customId).toBe("foo"); expect(requestSpy).toHaveBeenCalledWith( - "https://api.uploadthing.com/v6/uploadFiles", - { - body: { - files: [ - { name: "foo.txt", type: "text/plain", size: 3, customId: "foo" }, - ], - metadata: {}, - contentDisposition: "inline", - }, - headers: { - "content-type": "application/json", - "x-uploadthing-api-key": "sk_foo", - "x-uploadthing-be-adapter": "server-sdk", - "x-uploadthing-version": expect.stringMatching(/\d+\.\d+\.\d+/), - }, - method: "POST", - }, + expect.stringContaining(`x-ut-custom-id=foo`), + expect.objectContaining({ method: "PUT" }), ); }); }); describe("uploadFilesFromUrl", () => { it("downloads, then uploads successfully", async ({ db }) => { - const utapi = new UTApi({ apiKey: "sk_foo" }); + const utapi = new UTApi({ token: testToken.encoded }); const result = await utapi.uploadFilesFromUrl( "https://cdn.foo.com/foo.txt", ); - expect(requestSpy).toHaveBeenCalledTimes(4); // download, request url, upload, poll + expect(requestSpy).toHaveBeenCalledTimes(2); // download, upload expect(requestSpy).toHaveBeenNthCalledWith( 2, - "https://api.uploadthing.com/v6/uploadFiles", + expect.stringContaining(`x-ut-file-name=foo.txt`), { - body: { - files: [{ name: "foo.txt", type: "text/plain", size: 26 }], - metadata: {}, - contentDisposition: "inline", - }, - headers: { - "content-type": "application/json", - "x-uploadthing-api-key": "sk_foo", - "x-uploadthing-be-adapter": "server-sdk", - "x-uploadthing-version": expect.stringMatching(/\d+\.\d+\.\d+/), - }, - method: "POST", + method: "PUT", + body: expect.any(FormData), + headers: expect.objectContaining({ + range: "bytes=0-", + }), }, ); - expect(requestSpy).toHaveBeenNthCalledWith( - 3, - "https://bucket.s3.amazonaws.com/", - expect.objectContaining({ - method: "POST", - }), - ); - expect(requestSpy).toHaveBeenNthCalledWith( - 4, - "https://api.uploadthing.com/v6/pollUpload/abc-123.txt", - expect.objectContaining({}), - ); + const key = result.data?.key; expect(result).toEqual({ data: { - key: "abc-123.txt", + key: expect.stringMatching(/.+/), name: "foo.txt", size: 26, - url: "https://utfs.io/f/abc-123.txt", - appUrl: "https://utfs.io/a/app-1/abc-123.txt", + lastModified: expect.any(Number), + url: `${UTFS_IO_URL}/f/${key}`, + appUrl: `${UTFS_IO_URL}/a/${testToken.decoded.appId}/${key}`, customId: null, type: "text/plain", }, @@ -190,7 +142,7 @@ describe("uploadFilesFromUrl", () => { }); it("returns array if array is passed", async ({ db }) => { - const utapi = new UTApi({ apiKey: "sk_foo" }); + const utapi = new UTApi({ token: testToken.encoded }); const result = await utapi.uploadFilesFromUrl([ "https://cdn.foo.com/foo.txt", "https://cdn.foo.com/bar.txt", @@ -200,7 +152,7 @@ describe("uploadFilesFromUrl", () => { }); it("returns single object if no array is passed", async ({ db }) => { - const utapi = new UTApi({ apiKey: "sk_foo" }); + const utapi = new UTApi({ token: testToken.encoded }); const result = await utapi.uploadFilesFromUrl( "https://cdn.foo.com/foo.txt", ); @@ -209,206 +161,163 @@ describe("uploadFilesFromUrl", () => { }); it("can override name", async ({ db }) => { - const utapi = new UTApi({ apiKey: "sk_foo" }); + const utapi = new UTApi({ token: testToken.encoded }); await utapi.uploadFilesFromUrl({ url: "https://cdn.foo.com/my-super-long-pathname-thats-too-long-for-ut.txt", name: "bar.txt", }); expect(requestSpy).toHaveBeenCalledWith( - "https://api.uploadthing.com/v6/uploadFiles", + expect.stringContaining(`x-ut-file-name=bar.txt`), { - body: { - files: [{ name: "bar.txt", type: "text/plain", size: 26 }], - metadata: {}, - contentDisposition: "inline", - }, - headers: { - "content-type": "application/json", - "x-uploadthing-api-key": "sk_foo", - "x-uploadthing-be-adapter": "server-sdk", - "x-uploadthing-version": expect.stringMatching(/\d+\.\d+\.\d+/), - }, - method: "POST", + method: "PUT", + body: expect.any(FormData), + headers: expect.objectContaining({ + range: "bytes=0-", + }), }, ); }); it("can provide a customId", async ({ db }) => { - const utapi = new UTApi({ apiKey: "sk_foo" }); + const utapi = new UTApi({ token: testToken.encoded }); await utapi.uploadFilesFromUrl({ url: "https://cdn.foo.com/foo.txt", customId: "my-custom-id", }); expect(requestSpy).toHaveBeenCalledWith( - "https://api.uploadthing.com/v6/uploadFiles", + expect.stringContaining(`x-ut-custom-id=my-custom-id`), { - body: { - files: [ - { - name: "foo.txt", - type: "text/plain", - size: 26, - customId: "my-custom-id", - }, - ], - metadata: {}, - contentDisposition: "inline", - }, - headers: { - "content-type": "application/json", - "x-uploadthing-api-key": "sk_foo", - "x-uploadthing-be-adapter": "server-sdk", - "x-uploadthing-version": expect.stringMatching(/\d+\.\d+\.\d+/), - }, - method: "POST", + method: "PUT", + body: expect.any(FormData), + headers: expect.objectContaining({ + range: "bytes=0-", + }), }, ); }); // if passed data url, array contains UploadThingError it("returns error if data url is passed", async ({ db }) => { - const utapi = new UTApi({ apiKey: "sk_foo" }); + const utapi = new UTApi({ token: testToken.encoded }); const result = await utapi.uploadFilesFromUrl( "data:text/plain;base64,SGVsbG8sIFdvcmxkIQ==", ); - expect(result).toMatchInlineSnapshot(` - { - "data": null, - "error": { - "code": "BAD_REQUEST", - "data": undefined, - "message": "Please use uploadFiles() for data URLs. uploadFilesFromUrl() is intended for use with remote URLs only.", - }, - } - `); + expect(result).toStrictEqual({ + data: null, + error: { + code: "BAD_REQUEST", + data: undefined, + message: + "Please use uploadFiles() for data URLs. uploadFilesFromUrl() is intended for use with remote URLs only.", + }, + }); }); it("preserves order if some download fails", async ({ db }) => { - const utapi = new UTApi({ apiKey: "sk_foo" }); + const utapi = new UTApi({ token: testToken.encoded }); const result = await utapi.uploadFilesFromUrl([ "https://cdn.foo.com/foo.txt", "data:text/plain;base64,SGVsbG8sIFdvcmxkIQ==", "https://cdn.foo.com/bar.txt", ]); - expect(result).toMatchInlineSnapshot(` - [ - { - "data": { - "appUrl": "https://utfs.io/a/app-1/abc-123.txt", - "customId": null, - "key": "abc-123.txt", - "name": "foo.txt", - "size": 26, - "type": "text/plain", - "url": "https://utfs.io/f/abc-123.txt", - }, - "error": null, + const key1 = result[0].data?.key; + const key2 = result[2].data?.key; + expect(result).toStrictEqual([ + { + data: { + customId: null, + key: expect.stringMatching(/.+/), + lastModified: expect.any(Number), + name: "foo.txt", + size: 26, + type: "text/plain", + url: `${UTFS_IO_URL}/f/${key1}`, + appUrl: `${UTFS_IO_URL}/a/${testToken.decoded.appId}/${key1}`, }, - { - "data": null, - "error": { - "code": "BAD_REQUEST", - "data": undefined, - "message": "Please use uploadFiles() for data URLs. uploadFilesFromUrl() is intended for use with remote URLs only.", - }, + error: null, + }, + { + data: null, + error: { + code: "BAD_REQUEST", + data: undefined, + message: + "Please use uploadFiles() for data URLs. uploadFilesFromUrl() is intended for use with remote URLs only.", }, - { - "data": { - "appUrl": "https://utfs.io/a/app-1/abc-123.txt", - "customId": null, - "key": "abc-123.txt", - "name": "bar.txt", - "size": 26, - "type": "text/plain", - "url": "https://utfs.io/f/abc-123.txt", - }, - "error": null, + }, + { + data: { + customId: null, + key: expect.stringMatching(/.+/), + lastModified: expect.any(Number), + name: "bar.txt", + size: 26, + type: "text/plain", + url: `${UTFS_IO_URL}/f/${key2}`, + appUrl: `${UTFS_IO_URL}/a/${testToken.decoded.appId}/${key2}`, }, - ] - `); - }); -}); - -describe("constructor throws if no apiKey or secret is set", () => { - it("no secret or apikey", () => { - expect(() => new UTApi()).toThrowErrorMatchingInlineSnapshot( - `[UploadThingError: Missing or invalid API key. API keys must start with \`sk_\`.]`, - ); - }); - it("env is set", () => { - process.env.UPLOADTHING_SECRET = "sk_test_foo"; - expect(() => new UTApi()).not.toThrow(); - }); - it("apikey option is passed", () => { - expect(() => new UTApi({ apiKey: "sk_test_foo" })).not.toThrow(); + error: null, + }, + ]); }); }); describe("getSignedURL", () => { it("sends request without expiresIn", async ({ db }) => { - const utapi = new UTApi({ apiKey: "sk_foo" }); + const utapi = new UTApi({ token: testToken.encoded }); await utapi.getSignedURL("foo"); expect(requestSpy).toHaveBeenCalledOnce(); - expect(requestSpy).toHaveBeenCalledWith( - "https://api.uploadthing.com/v6/requestFileAccess", - { - body: { fileKey: "foo" }, - headers: { - "content-type": "application/json", - "x-uploadthing-api-key": "sk_foo", - "x-uploadthing-be-adapter": "server-sdk", - "x-uploadthing-version": expect.stringMatching(/\d+\.\d+\.\d+/), - }, - method: "POST", - }, - ); + expect(requestSpy).toHaveBeenCalledWith(`${API_URL}/v6/requestFileAccess`, { + body: { fileKey: "foo" }, + headers: expect.objectContaining({ + "content-type": "application/json", + "x-uploadthing-api-key": "sk_foo", + "x-uploadthing-be-adapter": "server-sdk", + "x-uploadthing-version": expect.stringMatching(/\d+\.\d+\.\d+/), + }), + method: "POST", + }); }); it("sends request with valid expiresIn (1)", async ({ db }) => { - const utapi = new UTApi({ apiKey: "sk_foo" }); + const utapi = new UTApi({ token: testToken.encoded }); await utapi.getSignedURL("foo", { expiresIn: "1d" }); expect(requestSpy).toHaveBeenCalledOnce(); - expect(requestSpy).toHaveBeenCalledWith( - "https://api.uploadthing.com/v6/requestFileAccess", - { - body: { fileKey: "foo", expiresIn: 86400 }, - headers: { - "content-type": "application/json", - "x-uploadthing-api-key": "sk_foo", - "x-uploadthing-be-adapter": "server-sdk", - "x-uploadthing-version": expect.stringMatching(/\d+\.\d+\.\d+/), - }, - method: "POST", - }, - ); + expect(requestSpy).toHaveBeenCalledWith(`${API_URL}/v6/requestFileAccess`, { + body: { fileKey: "foo", expiresIn: 86400 }, + headers: expect.objectContaining({ + "content-type": "application/json", + "x-uploadthing-api-key": "sk_foo", + "x-uploadthing-be-adapter": "server-sdk", + "x-uploadthing-version": expect.stringMatching(/\d+\.\d+\.\d+/), + }), + method: "POST", + }); }); it("sends request with valid expiresIn (2)", async ({ db }) => { - const utapi = new UTApi({ apiKey: "sk_foo" }); + const utapi = new UTApi({ token: testToken.encoded }); await utapi.getSignedURL("foo", { expiresIn: "3 minutes" }); expect(requestSpy).toHaveBeenCalledOnce(); - expect(requestSpy).toHaveBeenCalledWith( - "https://api.uploadthing.com/v6/requestFileAccess", - { - body: { fileKey: "foo", expiresIn: 180 }, - headers: { - "content-type": "application/json", - "x-uploadthing-api-key": "sk_foo", - "x-uploadthing-be-adapter": "server-sdk", - "x-uploadthing-version": expect.stringMatching(/\d+\.\d+\.\d+/), - }, - method: "POST", - }, - ); + expect(requestSpy).toHaveBeenCalledWith(`${API_URL}/v6/requestFileAccess`, { + body: { fileKey: "foo", expiresIn: 180 }, + headers: expect.objectContaining({ + "content-type": "application/json", + "x-uploadthing-api-key": "sk_foo", + "x-uploadthing-be-adapter": "server-sdk", + "x-uploadthing-version": expect.stringMatching(/\d+\.\d+\.\d+/), + }), + method: "POST", + }); }); it("throws if expiresIn is invalid", async ({ db }) => { - const utapi = new UTApi({ apiKey: "sk_foo" }); + const utapi = new UTApi({ token: testToken.encoded }); await expect(() => // @ts-expect-error - intentionally passing invalid expiresIn utapi.getSignedURL("foo", { expiresIn: "something" }), @@ -419,7 +328,7 @@ describe("getSignedURL", () => { }); it("throws if expiresIn is longer than 7 days", async ({ db }) => { - const utapi = new UTApi({ apiKey: "sk_foo" }); + const utapi = new UTApi({ token: testToken.encoded }); await expect(() => utapi.getSignedURL("foo", { expiresIn: "10 days" }), ).rejects.toThrowErrorMatchingInlineSnapshot( @@ -431,56 +340,50 @@ describe("getSignedURL", () => { describe("updateACL", () => { it("single file", async ({ db }) => { - const utapi = new UTApi({ apiKey: "sk_foo" }); + const utapi = new UTApi({ token: testToken.encoded }); await expect(utapi.updateACL("ut-key", "public-read")).resolves.toEqual({ success: true, }); - expect(requestSpy).toHaveBeenCalledWith( - "https://api.uploadthing.com/v6/updateACL", - { - body: { updates: [{ fileKey: "ut-key", acl: "public-read" }] }, - headers: { - "content-type": "application/json", - "x-uploadthing-api-key": "sk_foo", - "x-uploadthing-be-adapter": "server-sdk", - "x-uploadthing-version": expect.stringMatching(/\d+\.\d+\.\d+/), - }, - method: "POST", - }, - ); + expect(requestSpy).toHaveBeenCalledWith(`${API_URL}/v6/updateACL`, { + body: { updates: [{ fileKey: "ut-key", acl: "public-read" }] }, + headers: expect.objectContaining({ + "content-type": "application/json", + "x-uploadthing-api-key": "sk_foo", + "x-uploadthing-be-adapter": "server-sdk", + "x-uploadthing-version": expect.stringMatching(/\d+\.\d+\.\d+/), + }), + method: "POST", + }); }); it("many keys", async ({ db }) => { - const utapi = new UTApi({ apiKey: "sk_foo" }); + const utapi = new UTApi({ token: testToken.encoded }); await expect( utapi.updateACL(["ut-key1", "ut-key2"], "public-read"), ).resolves.toEqual({ success: true }); - expect(requestSpy).toHaveBeenCalledWith( - "https://api.uploadthing.com/v6/updateACL", - { - body: { - updates: [ - { fileKey: "ut-key1", acl: "public-read" }, - { fileKey: "ut-key2", acl: "public-read" }, - ], - }, - headers: { - "content-type": "application/json", - "x-uploadthing-api-key": "sk_foo", - "x-uploadthing-be-adapter": "server-sdk", - "x-uploadthing-version": expect.stringMatching(/\d+\.\d+\.\d+/), - }, - method: "POST", + expect(requestSpy).toHaveBeenCalledWith(`${API_URL}/v6/updateACL`, { + body: { + updates: [ + { fileKey: "ut-key1", acl: "public-read" }, + { fileKey: "ut-key2", acl: "public-read" }, + ], }, - ); + headers: expect.objectContaining({ + "content-type": "application/json", + "x-uploadthing-api-key": "sk_foo", + "x-uploadthing-be-adapter": "server-sdk", + "x-uploadthing-version": expect.stringMatching(/\d+\.\d+\.\d+/), + }), + method: "POST", + }); }); it("many keys with keytype override", async ({ db }) => { - const utapi = new UTApi({ apiKey: "sk_foo" }); + const utapi = new UTApi({ token: testToken.encoded }); await expect( utapi.updateACL(["my-custom-id1", "my-custom-id2"], "public-read", { @@ -488,45 +391,48 @@ describe("updateACL", () => { }), ).resolves.toEqual({ success: true }); - expect(requestSpy).toHaveBeenCalledWith( - "https://api.uploadthing.com/v6/updateACL", - { - body: { - updates: [ - { customId: "my-custom-id1", acl: "public-read" }, - { customId: "my-custom-id2", acl: "public-read" }, - ], - }, - headers: { - "content-type": "application/json", - "x-uploadthing-api-key": "sk_foo", - "x-uploadthing-be-adapter": "server-sdk", - "x-uploadthing-version": expect.stringMatching(/\d+\.\d+\.\d+/), - }, - method: "POST", + expect(requestSpy).toHaveBeenCalledWith(`${API_URL}/v6/updateACL`, { + body: { + updates: [ + { customId: "my-custom-id1", acl: "public-read" }, + { customId: "my-custom-id2", acl: "public-read" }, + ], }, - ); + headers: expect.objectContaining({ + "content-type": "application/json", + "x-uploadthing-api-key": "sk_foo", + "x-uploadthing-be-adapter": "server-sdk", + "x-uploadthing-version": expect.stringMatching(/\d+\.\d+\.\d+/), + }), + method: "POST", + }); }); }); const shouldRun = - typeof process.env.UPLOADTHING_TEST_SECRET === "string" && - process.env.UPLOADTHING_TEST_SECRET.length > 0; + typeof process.env.UPLOADTHING_TEST_TOKEN === "string" && + process.env.UPLOADTHING_TEST_TOKEN.length > 0; describe.runIf(shouldRun)( "smoke test with live api", { timeout: 15_000 }, () => { - const utapi = new UTApi({ - apiKey: shouldRun ? process.env.UPLOADTHING_TEST_SECRET! : "sk_foo", - }); + const token = shouldRun + ? process.env.UPLOADTHING_TEST_TOKEN! + : testToken.encoded; + const utapi = new UTApi({ token }); + + const appId = S.decodeSync(UploadThingToken)(token).appId; const localInfo = { totalBytes: 0, filesUploaded: 0 }; - const TEST_APP_LIMIT_BYTES = 2147483648; + const TEST_APP_LIMIT_BYTES = 2147483648; // free 2GB + // const TEST_APP_LIMIT_BYTES = 107374182400; // paid 100GB // Clean up any files before and after tests beforeAll(async () => { - resetMocks(); + // Close MSW proxy, don't want to interfere with these live tests + msw.close(); + const { files } = await utapi.listFiles(); await utapi.deleteFiles(files.map((f) => f.key)); }); @@ -561,13 +467,12 @@ describe.runIf(shouldRun)( data: { customId: null, key: expect.stringMatching(/.+/), + lastModified: file.lastModified, name: "foo.txt", size: 3, type: "text/plain", - url: "https://utfs.io/f/" + key, - appUrl: expect.stringMatching( - new RegExp(`^https://utfs.io/a/.+/${key}$`), - ), + url: expect.stringMatching(fileUrlPattern), + appUrl: expect.stringMatching(appUrlPattern(appId)), }, error: null, }); @@ -597,13 +502,12 @@ describe.runIf(shouldRun)( data: { customId: null, key: expect.stringMatching(/.+/), + lastModified: file.lastModified, name: "foo.txt", size: 3, type: "text/plain", - url: "https://utfs.io/f/" + key, - appUrl: expect.stringMatching( - new RegExp(`^https://utfs.io/a/.+/${key}$`), - ), + url: expect.stringMatching(fileUrlPattern), + appUrl: expect.stringMatching(appUrlPattern(appId)), }, error: null, }); @@ -628,13 +532,12 @@ describe.runIf(shouldRun)( data: { customId: null, key: expect.stringMatching(/.+/), + lastModified: expect.any(Number), name: "favicon.ico", size: expect.any(Number), type: "image/vnd.microsoft.icon", - url: "https://utfs.io/f/" + key, - appUrl: expect.stringMatching( - new RegExp(`^https://utfs.io/a/.+/${key}$`), - ), + url: expect.stringMatching(fileUrlPattern), + appUrl: expect.stringMatching(appUrlPattern(appId)), }, error: null, }); @@ -653,13 +556,13 @@ describe.runIf(shouldRun)( data: { customId: null, key: expect.stringMatching(/.+/), + lastModified: expect.any(Number), + name: "bar.txt", size: 3, type: "text/plain", - url: "https://utfs.io/f/" + fileKey, - appUrl: expect.stringMatching( - new RegExp(`^https://utfs.io/a/.+/${fileKey}$`), - ), + url: expect.stringMatching(fileUrlPattern), + appUrl: expect.stringMatching(appUrlPattern(appId)), }, error: null, }); @@ -696,13 +599,12 @@ describe.runIf(shouldRun)( data: { customId: customId, key: expect.stringMatching(/.+/), + lastModified: file.lastModified, name: "bar.txt", size: 3, type: "text/plain", - url: "https://utfs.io/f/" + key, - appUrl: expect.stringMatching( - new RegExp(`^https://utfs.io/a/.+/${key}$`), - ), + url: expect.stringMatching(fileUrlPattern), + appUrl: expect.stringMatching(appUrlPattern(appId)), }, error: null, }); @@ -737,13 +639,12 @@ describe.runIf(shouldRun)( data: { customId: null, key: expect.stringMatching(/.+/), + lastModified: file.lastModified, name: "foo.txt", size: 3, type: "text/plain", - url: "https://utfs.io/f/" + key, - appUrl: expect.stringMatching( - new RegExp(`^https://utfs.io/a/.+/${key}$`), - ), + url: expect.stringMatching(fileUrlPattern), + appUrl: expect.stringMatching(appUrlPattern(appId)), }, error: null, }); @@ -764,7 +665,7 @@ describe.runIf(shouldRun)( const { files } = await utapi.listFiles(); const someFile = files[0]; - const response = await fetch(`https://utfs.io/f/${someFile.key}`); + const response = await fetch(`${UTFS_IO_URL}/f/${someFile.key}`); const size = Number(response.headers.get("Content-Length")); const result = await utapi.deleteFiles(someFile.key); diff --git a/packages/uploadthing/turbo.json b/packages/uploadthing/turbo.json index 41a3ead626..24c2f8a688 100644 --- a/packages/uploadthing/turbo.json +++ b/packages/uploadthing/turbo.json @@ -12,6 +12,7 @@ "internal/**", "next/**", "next-legacy/**", + "remix/**", "server/**", "tw/**", "types/**" diff --git a/packages/vue/package.json b/packages/vue/package.json index 820e01e7f4..e26671444b 100644 --- a/packages/vue/package.json +++ b/packages/vue/package.json @@ -42,9 +42,7 @@ "dependencies": { "@uploadthing/dropzone": "workspace:*", "@uploadthing/shared": "workspace:*", - "@vueuse/core": "^10.9.0", - "file-selector": "^0.6.0", - "tailwind-merge": "^2.2.1" + "@vueuse/core": "^10.9.0" }, "devDependencies": { "@uploadthing/eslint-config": "workspace:*", diff --git a/packages/vue/src/components/button.tsx b/packages/vue/src/components/button.tsx index 7796024739..a4070d14f6 100644 --- a/packages/vue/src/components/button.tsx +++ b/packages/vue/src/components/button.tsx @@ -1,11 +1,10 @@ -import { twMerge } from "tailwind-merge"; import * as Vue from "vue"; import { computed, reactive, ref } from "vue"; -import type { ContentField, StyleField } from "@uploadthing/shared"; import { allowedContentTextLabelGenerator, contentFieldToContent, + defaultClassListMerger, generateMimeTypes, generatePermittedFileTypes, getFilesFromClipboardEvent, @@ -14,6 +13,7 @@ import { styleFieldToCssObject, UploadAbortedError, } from "@uploadthing/shared"; +import type { ContentField, StyleField } from "@uploadthing/shared"; import type { FileRouter } from "uploadthing/server"; import type { @@ -48,8 +48,7 @@ export type ButtonContent = { export type UploadButtonProps< TRouter extends FileRouter, TEndpoint extends keyof TRouter, - TSkipPolling extends boolean = false, -> = UploadthingComponentProps & { +> = UploadthingComponentProps & { /** * @see https://docs.uploadthing.com/theming#style-using-the-classname-prop */ @@ -72,15 +71,16 @@ export const generateUploadButton = ( }); return Vue.defineComponent( - < - TEndpoint extends keyof TRouter, - TSkipPolling extends boolean = false, - >(props: { - config: UploadButtonProps; + (props: { + config: UploadButtonProps; }) => { const $props = props.config; - const { mode = "auto", appendOnPaste = false } = $props.config ?? {}; + const { + mode = "auto", + appendOnPaste = false, + cn = defaultClassListMerger, + } = $props.config ?? {}; const fileInputRef = ref(null); const acRef = ref(new AbortController()); @@ -88,33 +88,26 @@ export const generateUploadButton = ( const uploadProgress = ref(0); const files = ref([]); - const useUploadthingProps: UseUploadthingProps< - TRouter, - TEndpoint, - TSkipPolling - > = reactive({ - signal: acRef.value.signal, - headers: $props.headers, - // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment - skipPolling: !$props?.onClientUploadComplete - ? true - : ($props?.skipPolling as any), - onClientUploadComplete: (res) => { - if (fileInputRef.value) { - fileInputRef.value.value = ""; - } - files.value = []; - $props.onClientUploadComplete?.(res); - uploadProgress.value = 0; - }, - onUploadProgress: (p) => { - uploadProgress.value = p; - $props.onUploadProgress?.(p); - }, - onUploadError: $props.onUploadError, - onUploadBegin: $props.onUploadBegin, - onBeforeUploadBegin: $props.onBeforeUploadBegin, - }); + const useUploadthingProps: UseUploadthingProps = + reactive({ + signal: acRef.value.signal, + headers: $props.headers, + onClientUploadComplete: (res) => { + if (fileInputRef.value) { + fileInputRef.value.value = ""; + } + files.value = []; + $props.onClientUploadComplete?.(res); + uploadProgress.value = 0; + }, + onUploadProgress: (p) => { + uploadProgress.value = p; + $props.onUploadProgress?.(p); + }, + onUploadError: $props.onUploadError, + onUploadBegin: $props.onUploadBegin, + onBeforeUploadBegin: $props.onBeforeUploadBegin, + }); const { startUpload, isUploading, permittedFileInfo } = useUploadThing( $props.endpoint, @@ -214,7 +207,7 @@ export const generateUploadButton = ( viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" - class={twMerge( + class={cn( "fill-none stroke-current stroke-2", "hidden size-4 group-hover:block", )} @@ -246,7 +239,7 @@ export const generateUploadButton = ( $props.onChange?.([]); }} - class={twMerge( + class={cn( "h-[1.25rem] cursor-pointer rounded border-none bg-transparent text-gray-500 transition-colors hover:bg-slate-200 hover:text-gray-600", styleFieldToClassName( $props.appearance?.clearBtn, @@ -269,7 +262,7 @@ export const generateUploadButton = ( const renderAllowedContent = () => (
( ); const labelClass = computed(() => - twMerge( + cn( "relative flex h-10 w-36 cursor-pointer items-center justify-center overflow-hidden rounded-md border-none text-base text-white after:transition-[width] after:duration-500 focus-within:ring-2 focus-within:ring-blue-600 focus-within:ring-offset-2", state.value === "disabled" && "cursor-not-allowed bg-blue-400", state.value === "uploading" && @@ -302,7 +295,7 @@ export const generateUploadButton = ( ), ); const containerClass = computed(() => - twMerge( + cn( "flex flex-col items-center justify-center gap-1", $props.class, styleFieldToClassName( diff --git a/packages/vue/src/components/dropzone.tsx b/packages/vue/src/components/dropzone.tsx index 55b936fec4..9eb5812c70 100644 --- a/packages/vue/src/components/dropzone.tsx +++ b/packages/vue/src/components/dropzone.tsx @@ -1,4 +1,3 @@ -import { twMerge } from "tailwind-merge"; import * as Vue from "vue"; import { computed, reactive, ref, watch } from "vue"; @@ -8,6 +7,7 @@ import type { ContentField, StyleField } from "@uploadthing/shared"; import { allowedContentTextLabelGenerator, contentFieldToContent, + defaultClassListMerger, generateClientDropzoneAccept, generatePermittedFileTypes, getFilesFromClipboardEvent, @@ -53,8 +53,7 @@ export type DropzoneContent = { export type UploadDropzoneProps< TRouter extends FileRouter, TEndpoint extends keyof TRouter, - TSkipPolling extends boolean = false, -> = UploadthingComponentProps & { +> = UploadthingComponentProps & { /** * @see https://docs.uploadthing.com/theming#style-using-the-classname-prop */ @@ -84,43 +83,37 @@ export const generateUploadDropzone = ( }); return Vue.defineComponent( - < - TEndpoint extends keyof TRouter, - TSkipPolling extends boolean = false, - >(props: { - config: UploadDropzoneProps; + (props: { + config: UploadDropzoneProps; }) => { const $props = props.config; - const { mode = "auto", appendOnPaste = false } = $props.config ?? {}; + const { + mode = "auto", + appendOnPaste = false, + cn = defaultClassListMerger, + } = $props.config ?? {}; const acRef = ref(new AbortController()); const files = ref([]); const uploadProgress = ref(0); - const useUploadthingProps: UseUploadthingProps< - TRouter, - TEndpoint, - TSkipPolling - > = reactive({ - headers: $props.headers, - // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment - skipPolling: !$props?.onClientUploadComplete - ? true - : ($props?.skipPolling as any), - onClientUploadComplete: (res) => { - files.value = []; - $props.onClientUploadComplete?.(res); - uploadProgress.value = 0; - }, - onUploadProgress: (p) => { - uploadProgress.value = p; - $props.onUploadProgress?.(p); - }, - onUploadError: $props.onUploadError, - onUploadBegin: $props.onUploadBegin, - onBeforeUploadBegin: $props.onBeforeUploadBegin, - }); + const useUploadthingProps: UseUploadthingProps = + reactive({ + headers: $props.headers, + onClientUploadComplete: (res) => { + files.value = []; + $props.onClientUploadComplete?.(res); + uploadProgress.value = 0; + }, + onUploadProgress: (p) => { + uploadProgress.value = p; + $props.onUploadProgress?.(p); + }, + onUploadError: $props.onUploadError, + onUploadBegin: $props.onUploadBegin, + onBeforeUploadBegin: $props.onBeforeUploadBegin, + }); const { startUpload, isUploading, permittedFileInfo } = useUploadThing( $props.endpoint, useUploadthingProps, @@ -224,7 +217,7 @@ export const generateUploadDropzone = ( ( viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" - class={twMerge( + class={cn( "fill-none stroke-current stroke-2", "hidden size-4 group-hover:block", )} @@ -314,7 +307,7 @@ export const generateUploadDropzone = ( }; const containerClass = computed(() => - twMerge( + cn( "mt-2 flex flex-col items-center justify-center rounded-lg border border-dashed border-gray-900/25 px-6 py-10 text-center", isDragActive.value && "bg-blue-600/10", $props.class, @@ -325,14 +318,14 @@ export const generateUploadDropzone = ( ), ); const labelClass = computed(() => - twMerge( + cn( "relative mt-4 flex w-64 cursor-pointer items-center justify-center text-sm font-semibold leading-6 text-gray-600 focus-within:outline-none focus-within:ring-2 focus-within:ring-blue-600 focus-within:ring-offset-2 hover:text-blue-500", state.value === "ready" ? "text-blue-600" : "text-gray-500", styleFieldToClassName($props.appearance?.label, styleFieldArg.value), ), ); const allowedContentClass = computed(() => - twMerge( + cn( "m-0 h-[1.25rem] text-xs leading-5 text-gray-600", styleFieldToClassName( $props.appearance?.allowedContent, @@ -341,7 +334,7 @@ export const generateUploadDropzone = ( ), ); const buttonClass = computed(() => - twMerge( + cn( "relative mt-4 flex h-10 w-36 cursor-pointer items-center justify-center overflow-hidden rounded-md border-none text-base text-white after:transition-[width] after:duration-500 focus-within:ring-2 focus-within:ring-blue-600 focus-within:ring-offset-2", state.value === "disabled" && "cursor-not-allowed bg-blue-400", state.value === "uploading" && diff --git a/packages/vue/src/types.ts b/packages/vue/src/types.ts index 36a0e85965..fa36e58f79 100644 --- a/packages/vue/src/types.ts +++ b/packages/vue/src/types.ts @@ -1,4 +1,6 @@ import type { + ClassListMerger, + ErrorMessage, ExtendObjectIf, MaybePromise, UploadThingError, @@ -27,10 +29,7 @@ export interface GenerateTypedHelpersOptions { export type UseUploadthingProps< TRouter extends FileRouter, TEndpoint extends keyof TRouter, - TSkipPolling extends boolean = false, - TServerOutput = false extends TSkipPolling - ? inferEndpointOutput - : null, + TServerOutput = inferEndpointOutput, > = { /** * Called when the upload is submitted and the server is about to be queried for presigned URLs @@ -48,18 +47,24 @@ export type UseUploadthingProps< */ onUploadProgress?: ((p: number) => void) | undefined; /** - * Skip polling for server data after upload is complete - * Useful if you want faster response times and don't need - * any data returned from the server `onUploadComplete` callback - * @default false + * This option has been moved to your serverside route config. + * Please opt-in by setting `awaitServerData: true` in your route + * config instead. + * ### Example + * ```ts + * f( + * { image: { maxFileSize: "1MB" } }, + * { awaitServerData: false } + * ).middleware(...) + * ``` + * @deprecated + * @see https://docs.uploadthing.com/api-reference/server#route-options */ - skipPolling?: TSkipPolling; + skipPolling?: ErrorMessage<"This option has been moved to your serverside route config. Please use `awaitServerData` in your route config instead.">; /** * Called when the file uploads are completed - * - If `skipPolling` is `true`, this will be called once - * all the files are uploaded to the storage provider. - * - If `skipPolling` is `false`, this will be called after - * the serverside `onUploadComplete` callback has finished + * @remarks If `RouteOptions.awaitServerData` is `true`, this will be + * called after the serverside `onUploadComplete` callback has finished */ onClientUploadComplete?: | ((res: ClientUploadedFileData[]) => void) @@ -80,9 +85,8 @@ export type UseUploadthingProps< export type UploadthingComponentProps< TRouter extends FileRouter, TEndpoint extends keyof TRouter, - TSkipPolling extends boolean = false, > = Omit< - UseUploadthingProps, + UseUploadthingProps, /** * Signal is omitted, component has its own AbortController * If you need to control the interruption with more granularity, @@ -103,6 +107,13 @@ export type UploadthingComponentProps< config?: { mode?: "auto" | "manual"; appendOnPaste?: boolean; + /** + * Override the default class name merger, with e.g. tailwind-merge + * This may be required if you're customizing the component + * appearance with additional TailwindCSS classes to ensure + * classes are sorted and applied in the correct order + */ + cn?: ClassListMerger; }; disabled?: boolean; /** diff --git a/packages/vue/src/useUploadThing.ts b/packages/vue/src/useUploadThing.ts index 6ec934de02..97ccd0a21c 100644 --- a/packages/vue/src/useUploadThing.ts +++ b/packages/vue/src/useUploadThing.ts @@ -45,21 +45,18 @@ export const INTERNAL_uploadthingHookGen = < */ url: URL; }) => { - const uploadFiles = genUploader({ + const { uploadFiles } = genUploader({ url: initOpts.url, package: "@uploadthing/vue", }); - const useUploadThing = < - TEndpoint extends keyof TRouter, - TSkipPolling extends boolean = false, - >( + const useUploadThing = ( endpoint: TEndpoint, - opts?: UseUploadthingProps, + opts?: UseUploadthingProps, ) => { const isUploading = ref(false); const uploadProgress = ref(0); - const fileProgress = ref(new Map()); + const fileProgress = ref(new Map()); const permittedFileInfo = useEndpointMetadata( initOpts.url, @@ -77,12 +74,11 @@ export const INTERNAL_uploadthingHookGen = < isUploading.value = true; opts?.onUploadProgress?.(0); - files.forEach((f) => fileProgress.value.set(f.name, 0)); + files.forEach((f) => fileProgress.value.set(f, 0)); try { const res = await uploadFiles(endpoint, { headers: opts?.headers, files, - skipPolling: opts?.skipPolling, onUploadProgress: (progress) => { if (!opts?.onUploadProgress) return; fileProgress.value.set(progress.file, progress.progress); @@ -122,7 +118,7 @@ export const INTERNAL_uploadthingHookGen = < opts?.onUploadError?.(error); } finally { isUploading.value = false; - fileProgress.value = new Map(); + fileProgress.value = new Map(); uploadProgress.value = 0; } }); @@ -144,7 +140,7 @@ export const generateVueHelpers = ( return { useUploadThing: INTERNAL_uploadthingHookGen({ url }), - uploadFiles: genUploader({ + ...genUploader({ url, package: "@uploadthing/vue", }), diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d6f33189af..69cb317bae 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -25,6 +25,9 @@ importers: '@changesets/cli': specifier: ^2.27.1 version: 2.27.1 + '@effect/vitest': + specifier: 0.9.2 + version: 0.9.2(effect@3.7.2)(vitest@2.0.5(@types/node@20.14.0)(@vitest/browser@2.0.5)(happy-dom@13.10.1)(lightningcss@1.24.1)(terser@5.32.0)) '@ianvs/prettier-plugin-sort-imports': specifier: ^4.2.1 version: 4.2.1(@vue/compiler-sfc@3.4.25)(prettier@3.3.2) @@ -56,8 +59,8 @@ importers: specifier: workspace:* version: link:tooling/eslint-config '@vitest/coverage-v8': - specifier: ^1.6.0 - version: 1.6.0(vitest@1.6.0(@types/node@20.14.0)(happy-dom@13.10.1)(lightningcss@1.24.1)(terser@5.19.2)) + specifier: ^2.0.5 + version: 2.0.5(vitest@2.0.5(@types/node@20.14.0)(@vitest/browser@2.0.5)(happy-dom@13.10.1)(lightningcss@1.24.1)(terser@5.32.0)) happy-dom: specifier: ^13.6.2 version: 13.10.1 @@ -81,56 +84,176 @@ importers: version: link:packages/uploadthing vite-tsconfig-paths: specifier: ^4.3.1 - version: 4.3.2(typescript@5.5.2)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2)) + version: 4.3.2(typescript@5.5.2)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0)) vitest: - specifier: ^1.6.0 - version: 1.6.0(@types/node@20.14.0)(happy-dom@13.10.1)(lightningcss@1.24.1)(terser@5.19.2) + specifier: ^2.0.5 + version: 2.0.5(@types/node@20.14.0)(@vitest/browser@2.0.5(typescript@5.5.2)(vitest@2.0.5))(happy-dom@13.10.1)(lightningcss@1.24.1)(terser@5.32.0) docs: dependencies: - '@radix-ui/react-accordion': - specifier: ^1.1.2 - version: 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@algolia/autocomplete-core': + specifier: ^1.17.4 + version: 1.17.4(@algolia/client-search@5.4.1)(algoliasearch@5.4.1)(search-insights@2.17.2) + '@headlessui/react': + specifier: ^2.1.8 + version: 2.1.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@headlessui/tailwindcss': + specifier: ^0.2.0 + version: 0.2.1(tailwindcss@3.4.3) + '@heroicons/react': + specifier: ^2.1.3 + version: 2.1.5(react@18.3.1) + '@mdx-js/loader': + specifier: ^3.0.1 + version: 3.0.1(webpack@5.94.0(esbuild@0.21.5)) + '@mdx-js/react': + specifier: ^3.0.1 + version: 3.0.1(@types/react@18.3.3)(react@18.3.1) + '@next/mdx': + specifier: ^14.2.11 + version: 14.2.11(@mdx-js/loader@3.0.1(webpack@5.94.0(esbuild@0.21.5)))(@mdx-js/react@3.0.1(@types/react@18.3.3)(react@18.3.1)) '@scalar/api-reference-react': - specifier: 0.3.37 - version: 0.3.37(@types/bun@1.1.5)(postcss@8.4.38)(storybook@8.2.1(@babel/preset-env@7.24.6(@babel/core@7.24.4)))(tailwindcss@3.4.3)(typescript@5.5.2)(vitest@1.6.0(@types/node@20.14.0)(happy-dom@13.10.1)(lightningcss@1.24.1)(terser@5.19.2)) + specifier: ^0.3.37 + version: 0.3.37(@types/bun@1.1.5)(postcss@8.4.38)(storybook@8.2.1(@babel/preset-env@7.24.6(@babel/core@7.24.4)))(tailwindcss@3.4.3)(typescript@5.5.2)(vitest@2.0.5(@types/node@20.14.0)(@vitest/browser@2.0.5(typescript@5.5.2)(vitest@2.0.5))(happy-dom@13.10.1)(lightningcss@1.24.1)(terser@5.32.0)) + '@sindresorhus/slugify': + specifier: ^2.1.1 + version: 2.2.1 + '@tailwindcss/typography': + specifier: ^0.5.10 + version: 0.5.13(tailwindcss@3.4.3) + '@types/mdast': + specifier: ^4.0.4 + version: 4.0.4 + '@types/mdx': + specifier: ^2.0.13 + version: 2.0.13 + '@types/node': + specifier: ^20.14.0 + version: 20.14.0 + '@types/react': + specifier: 18.3.3 + version: 18.3.3 + '@types/react-dom': + specifier: 18.3.0 + version: 18.3.0 + '@types/react-highlight-words': + specifier: ^0.20.0 + version: 0.20.0 '@uploadthing/react': specifier: workspace:* version: link:../packages/react + acorn: + specifier: ^8.12.1 + version: 8.12.1 + autoprefixer: + specifier: ^10.4.19 + version: 10.4.19(postcss@8.4.38) + clsx: + specifier: ^2.1.0 + version: 2.1.0 + fast-glob: + specifier: ^3.3.2 + version: 3.3.2 + flexsearch: + specifier: ^0.7.43 + version: 0.7.43 + framer-motion: + specifier: ^11.5.4 + version: 11.5.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + mdast-util-to-string: + specifier: ^4.0.0 + version: 4.0.0 + mdx-annotations: + specifier: ^0.1.4 + version: 0.1.4 next: - specifier: 14.2.3 - version: 14.2.3(@babel/core@7.24.4)(@playwright/test@1.45.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 14.2.11 + version: 14.2.11(@babel/core@7.24.4)(@playwright/test@1.45.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) next-sitemap: specifier: ^4.2.3 - version: 4.2.3(next@14.2.3(@babel/core@7.24.4)(@playwright/test@1.45.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) - nextra: - specifier: ^2.13.2 - version: 2.13.4(next@14.2.3(@babel/core@7.24.4)(@playwright/test@1.45.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - nextra-theme-docs: - specifier: ^2.13.2 - version: 2.13.4(next@14.2.3(@babel/core@7.24.4)(@playwright/test@1.45.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(nextra@2.13.4(next@14.2.3(@babel/core@7.24.4)(@playwright/test@1.45.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 4.2.3(next@14.2.11(@babel/core@7.24.4)(@playwright/test@1.45.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + next-themes: + specifier: ^0.3.0 + version: 0.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next-view-transitions: + specifier: ^0.3.0 + version: 0.3.0(next@14.2.11(@babel/core@7.24.4)(@playwright/test@1.45.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + npm-to-yarn: + specifier: ^3.0.0 + version: 3.0.0 react: specifier: 18.3.1 version: 18.3.1 react-dom: specifier: 18.3.1 version: 18.3.1(react@18.3.1) + react-highlight-words: + specifier: ^0.20.0 + version: 0.20.0(react@18.3.1) + recma-import-images: + specifier: ^0.0.3 + version: 0.0.3 + remark: + specifier: ^15.0.1 + version: 15.0.1 + remark-gfm: + specifier: ^4.0.0 + version: 4.0.0 + remark-mdx: + specifier: ^3.0.1 + version: 3.0.1 + remark-unwrap-images: + specifier: ^4.0.0 + version: 4.0.0 + shiki: + specifier: ^1.17.5 + version: 1.17.5 + simple-functional-loader: + specifier: ^1.2.1 + version: 1.2.1 + tailwindcss: + specifier: ^3.4.1 + version: 3.4.3 + typescript: + specifier: ^5.5.2 + version: 5.5.2 + unified: + specifier: ^11.0.5 + version: 11.0.5 + unist-util-filter: + specifier: ^5.0.1 + version: 5.0.1 + unist-util-visit: + specifier: ^5.0.0 + version: 5.0.0 uploadthing: specifier: workspace:* version: link:../packages/uploadthing + zod: + specifier: ^3.23.8 + version: 3.23.8 + zustand: + specifier: ^4.3.2 + version: 4.5.2(@types/react@18.3.3)(react@18.3.1) devDependencies: - '@types/react': - specifier: 18.3.3 - version: 18.3.3 - '@types/react-dom': - specifier: 18.3.0 - version: 18.3.0 - postcss: - specifier: 8.4.38 - version: 8.4.38 - tailwindcss: - specifier: ^3.4.1 - version: 3.4.3 + '@shikijs/transformers': + specifier: ^1.17.5 + version: 1.17.5 + eslint: + specifier: ^8.57.0 + version: 8.57.0 + eslint-config-next: + specifier: ^14.2.1 + version: 14.2.2(eslint@8.57.0)(typescript@5.5.2) + prettier: + specifier: ^3.3.2 + version: 3.3.2 + prettier-plugin-tailwindcss: + specifier: ^0.6.5 + version: 0.6.5(@ianvs/prettier-plugin-sort-imports@4.2.1(@vue/compiler-sfc@3.4.25)(prettier@3.3.2))(prettier@3.3.2) + sharp: + specifier: 0.33.1 + version: 0.33.1 examples/backend-adapters: dependencies: @@ -173,13 +296,13 @@ importers: version: 18.3.0 '@vitejs/plugin-react-swc': specifier: ^3.6.0 - version: 3.6.0(@swc/helpers@0.5.11)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2)) + version: 3.6.0(@swc/helpers@0.5.11)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0)) typescript: specifier: ^5.5.2 version: 5.5.2 vite: specifier: ^5.3.1 - version: 5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2) + version: 5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0) examples/backend-adapters/client-vanilla: dependencies: @@ -192,7 +315,7 @@ importers: version: 5.5.2 vite: specifier: ^5.3.1 - version: 5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2) + version: 5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0) examples/backend-adapters/client-vue: dependencies: @@ -208,13 +331,13 @@ importers: devDependencies: '@vitejs/plugin-vue': specifier: ^5.0.4 - version: 5.0.4(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2))(vue@3.4.25(typescript@5.5.2)) + version: 5.0.4(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0))(vue@3.4.25(typescript@5.5.2)) typescript: specifier: ^5.5.2 version: 5.5.2 vite: specifier: ^5.3.1 - version: 5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2) + version: 5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0) vue-tsc: specifier: ^2.0.6 version: 2.0.14(typescript@5.5.2) @@ -222,14 +345,14 @@ importers: examples/backend-adapters/server: dependencies: '@effect/platform': - specifier: 0.58.21 - version: 0.58.21(@effect/schema@0.68.18(effect@3.4.8))(effect@3.4.8) + specifier: 0.63.2 + version: 0.63.2(@effect/schema@0.72.2(effect@3.7.2))(effect@3.7.2) '@effect/platform-node': - specifier: 0.53.20 - version: 0.53.20(@effect/platform@0.58.21(@effect/schema@0.68.18(effect@3.4.8))(effect@3.4.8))(effect@3.4.8) + specifier: 0.58.2 + version: 0.58.2(@effect/platform@0.63.2(@effect/schema@0.72.2(effect@3.7.2))(effect@3.7.2))(effect@3.7.2) '@effect/schema': - specifier: 0.68.18 - version: 0.68.18(effect@3.4.8) + specifier: 0.72.2 + version: 0.72.2(effect@3.7.2) '@elysiajs/cors': specifier: ^0.8.0 version: 0.8.0(elysia@0.8.17(openapi-types@12.1.3)(typescript@5.5.2)) @@ -246,8 +369,8 @@ importers: specifier: ^16.4.5 version: 16.4.5 effect: - specifier: 3.4.8 - version: 3.4.8 + specifier: 3.7.2 + version: 3.7.2 elysia: specifier: ^0.8.17 version: 0.8.17(openapi-types@12.1.3)(typescript@5.5.2) @@ -295,8 +418,8 @@ importers: specifier: 6.8.0 version: link:../../packages/react next: - specifier: 14.2.3 - version: 14.2.3(@babel/core@7.24.4)(@playwright/test@1.45.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 14.2.11 + version: 14.2.11(@babel/core@7.24.4)(@playwright/test@1.45.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: specifier: 18.3.1 version: 18.3.1 @@ -327,16 +450,16 @@ importers: dependencies: '@astrojs/node': specifier: ^8.2.1 - version: 8.2.5(astro@4.6.3(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2)(typescript@5.5.2)) + version: 8.2.5(astro@4.6.3(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0)(typescript@5.5.2)) '@astrojs/react': specifier: ^3.0.10 - version: 3.3.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2)) + version: 3.3.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0)) '@uploadthing/react': specifier: 6.8.0 version: link:../../packages/react astro: specifier: ^4.4.5 - version: 4.6.3(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2)(typescript@5.5.2) + version: 4.6.3(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0)(typescript@5.5.2) react: specifier: 18.3.1 version: 18.3.1 @@ -473,7 +596,7 @@ importers: version: link:../../packages/nuxt nuxt: specifier: ^3.11.2 - version: 3.11.2(@parcel/watcher@2.4.1)(@types/node@20.14.0)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.3.2)(lightningcss@1.24.1)(magicast@0.3.4)(optionator@0.9.3)(rollup@4.18.0)(terser@5.19.2)(typescript@5.5.2)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2))(vue-tsc@2.0.14(typescript@5.5.2)) + version: 3.11.2(@parcel/watcher@2.4.1)(@types/node@20.14.0)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.3.2)(lightningcss@1.24.1)(magicast@0.3.4)(optionator@0.9.3)(rollup@4.18.0)(terser@5.32.0)(typescript@5.5.2)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0))(vue-tsc@2.0.14(typescript@5.5.2)) uploadthing: specifier: 6.13.3 version: link:../../packages/uploadthing @@ -490,8 +613,8 @@ importers: specifier: 6.8.0 version: link:../../packages/react next: - specifier: 14.2.3 - version: 14.2.3(@babel/core@7.24.4)(@playwright/test@1.45.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 14.2.11 + version: 14.2.11(@babel/core@7.24.4)(@playwright/test@1.45.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: specifier: 18.3.1 version: 18.3.1 @@ -525,7 +648,7 @@ importers: version: 0.12.5(solid-js@1.8.16) '@solidjs/start': specifier: ^0.6.0 - version: 0.6.1(@testing-library/jest-dom@6.4.8)(rollup@4.18.0)(solid-js@1.8.16)(vinxi@0.3.11(@types/node@20.14.0)(encoding@0.1.13)(ioredis@5.3.2)(lightningcss@1.24.1)(magicast@0.3.4)(terser@5.19.2))(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2)) + version: 0.6.1(@testing-library/jest-dom@6.4.8)(rollup@4.18.0)(solid-js@1.8.16)(vinxi@0.3.11(@types/node@20.14.0)(encoding@0.1.13)(ioredis@5.3.2)(lightningcss@1.24.1)(magicast@0.3.5)(terser@5.32.0))(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0)) '@uploadthing/solid': specifier: 6.6.0 version: link:../../packages/solid @@ -537,7 +660,7 @@ importers: version: link:../../packages/uploadthing vinxi: specifier: 0.3.11 - version: 0.3.11(@types/node@20.14.0)(encoding@0.1.13)(ioredis@5.3.2)(lightningcss@1.24.1)(magicast@0.3.4)(terser@5.19.2) + version: 0.3.11(@types/node@20.14.0)(encoding@0.1.13)(ioredis@5.3.2)(lightningcss@1.24.1)(magicast@0.3.5)(terser@5.32.0) devDependencies: '@types/node': specifier: ^20.14.0 @@ -566,13 +689,13 @@ importers: devDependencies: '@sveltejs/adapter-auto': specifier: ^3.1.1 - version: 3.2.0(@sveltejs/kit@2.5.7(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.15)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2)))(svelte@4.2.15)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2))) + version: 3.2.0(@sveltejs/kit@2.5.7(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.15)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0)))(svelte@4.2.15)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0))) '@sveltejs/kit': specifier: ^2.5.4 - version: 2.5.7(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.15)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2)))(svelte@4.2.15)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2)) + version: 2.5.7(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.15)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0)))(svelte@4.2.15)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0)) '@sveltejs/vite-plugin-svelte': specifier: ^3.1.0 - version: 3.1.0(svelte@4.2.15)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2)) + version: 3.1.0(svelte@4.2.15)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0)) svelte: specifier: ^4.2.12 version: 4.2.15 @@ -587,7 +710,7 @@ importers: version: 5.5.2 vite: specifier: ^5.3.1 - version: 5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2) + version: 5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0) examples/profile-picture: dependencies: @@ -623,16 +746,16 @@ importers: version: 0.30.10(@cloudflare/workers-types@4.20240620.0)(@libsql/client@0.6.0)(@types/react@18.3.3)(bun-types@1.1.14)(react@18.3.1) geist: specifier: ^1.3.0 - version: 1.3.0(next@14.2.3(@playwright/test@1.45.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + version: 1.3.0(next@14.2.11(@playwright/test@1.45.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) lucide-react: specifier: ^0.368.0 version: 0.368.0(react@18.3.1) next: - specifier: 14.2.3 - version: 14.2.3(@babel/core@7.24.4)(@playwright/test@1.45.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 14.2.11 + version: 14.2.11(@babel/core@7.24.4)(@playwright/test@1.45.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) next-auth: specifier: 5.0.0-beta.19 - version: 5.0.0-beta.19(next@14.2.3(@playwright/test@1.45.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + version: 5.0.0-beta.19(next@14.2.11(@playwright/test@1.45.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) react: specifier: 18.3.1 version: 18.3.1 @@ -693,7 +816,7 @@ importers: dependencies: '@clerk/nextjs': specifier: ^4.29.8 - version: 4.30.0(next@14.2.3(@playwright/test@1.45.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 4.30.0(next@14.2.11(@playwright/test@1.45.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@t3-oss/env-nextjs': specifier: ^0.10.1 version: 0.10.1(typescript@5.5.2)(zod@3.23.8) @@ -701,8 +824,8 @@ importers: specifier: 6.8.0 version: link:../../packages/react next: - specifier: 14.2.3 - version: 14.2.3(@babel/core@7.24.4)(@playwright/test@1.45.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 14.2.11 + version: 14.2.11(@babel/core@7.24.4)(@playwright/test@1.45.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: specifier: 18.3.1 version: 18.3.1 @@ -748,7 +871,7 @@ importers: dependencies: '@clerk/nextjs': specifier: ^4.29.8 - version: 4.30.0(next@14.2.3(@playwright/test@1.45.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 4.30.0(next@14.2.11(@playwright/test@1.45.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@t3-oss/env-nextjs': specifier: ^0.10.1 version: 0.10.1(typescript@5.5.2)(zod@3.23.8) @@ -756,8 +879,8 @@ importers: specifier: 6.8.0 version: link:../../packages/react next: - specifier: 14.2.3 - version: 14.2.3(@babel/core@7.24.4)(@playwright/test@1.45.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 14.2.11 + version: 14.2.11(@babel/core@7.24.4)(@playwright/test@1.45.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: specifier: 18.3.1 version: 18.3.1 @@ -799,6 +922,64 @@ importers: specifier: ^5.5.2 version: 5.5.2 + examples/with-clerk-remix: + dependencies: + '@clerk/remix': + specifier: ^4.2.25 + version: 4.2.25(@remix-run/react@2.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.2))(@remix-run/server-runtime@2.12.0(typescript@5.5.2))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@remix-run/node': + specifier: ^2.12.0 + version: 2.12.0(typescript@5.5.2) + '@remix-run/react': + specifier: ^2.12.0 + version: 2.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.2) + '@remix-run/serve': + specifier: ^2.12.0 + version: 2.12.0(typescript@5.5.2) + '@uploadthing/react': + specifier: 6.8.0 + version: link:../../packages/react + isbot: + specifier: ^4.1.0 + version: 4.4.0 + react: + specifier: 18.3.1 + version: 18.3.1 + react-dom: + specifier: 18.3.1 + version: 18.3.1(react@18.3.1) + uploadthing: + specifier: 6.13.3 + version: link:../../packages/uploadthing + devDependencies: + '@remix-run/dev': + specifier: ^2.12.0 + version: 2.12.0(@remix-run/react@2.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.2))(@remix-run/serve@2.12.0(typescript@5.5.2))(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0)(typescript@5.5.2)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0))(wrangler@3.62.0) + '@types/react': + specifier: 18.3.3 + version: 18.3.3 + '@types/react-dom': + specifier: 18.3.0 + version: 18.3.0 + autoprefixer: + specifier: ^10.4.19 + version: 10.4.19(postcss@8.4.38) + postcss: + specifier: 8.4.38 + version: 8.4.38 + tailwindcss: + specifier: ^3.4.1 + version: 3.4.3 + typescript: + specifier: ^5.5.2 + version: 5.5.2 + vite: + specifier: ^5.3.1 + version: 5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0) + vite-tsconfig-paths: + specifier: ^4.3.1 + version: 4.3.2(typescript@5.5.2)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0)) + examples/with-drizzle-appdir: dependencies: '@libsql/client': @@ -814,8 +995,8 @@ importers: specifier: ^0.30.10 version: 0.30.10(@cloudflare/workers-types@4.20240620.0)(@libsql/client@0.6.0)(@types/react@18.3.3)(bun-types@1.1.14)(react@18.3.1) next: - specifier: 14.2.3 - version: 14.2.3(@babel/core@7.24.4)(@playwright/test@1.45.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 14.2.11 + version: 14.2.11(@babel/core@7.24.4)(@playwright/test@1.45.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: specifier: 18.3.1 version: 18.3.1 @@ -875,8 +1056,8 @@ importers: specifier: ^0.30.10 version: 0.30.10(@cloudflare/workers-types@4.20240620.0)(@libsql/client@0.6.0)(@types/react@18.3.3)(bun-types@1.1.14)(react@18.3.1) next: - specifier: 14.2.3 - version: 14.2.3(@babel/core@7.24.4)(@playwright/test@1.45.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 14.2.11 + version: 14.2.11(@babel/core@7.24.4)(@playwright/test@1.45.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: specifier: 18.3.1 version: 18.3.1 @@ -951,8 +1132,8 @@ importers: specifier: ^0.368.0 version: 0.368.0(react@18.3.1) next: - specifier: 14.2.3 - version: 14.2.3(@babel/core@7.24.4)(@playwright/test@1.45.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 14.2.11 + version: 14.2.11(@babel/core@7.24.4)(@playwright/test@1.45.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) next-themes: specifier: ^0.3.0 version: 0.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -1003,8 +1184,8 @@ importers: specifier: 6.8.0 version: link:../../packages/react next: - specifier: 14.2.3 - version: 14.2.3(@babel/core@7.24.4)(@playwright/test@1.45.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 14.2.11 + version: 14.2.11(@babel/core@7.24.4)(@playwright/test@1.45.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: specifier: 18.3.1 version: 18.3.1 @@ -1034,8 +1215,8 @@ importers: examples/with-serveractions: dependencies: next: - specifier: 14.2.3 - version: 14.2.3(@babel/core@7.24.4)(@playwright/test@1.45.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 14.2.11 + version: 14.2.11(@babel/core@7.24.4)(@playwright/test@1.45.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: specifier: 18.3.1 version: 18.3.1 @@ -1065,8 +1246,8 @@ importers: specifier: 6.8.0 version: link:../../packages/react next: - specifier: 14.2.3 - version: 14.2.3(@babel/core@7.24.4)(@playwright/test@1.45.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 14.2.11 + version: 14.2.11(@babel/core@7.24.4)(@playwright/test@1.45.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: specifier: 18.3.1 version: 18.3.1 @@ -1204,7 +1385,7 @@ importers: dependencies: '@nuxt/kit': specifier: ^3.11.2 - version: 3.12.2(magicast@0.3.4)(rollup@3.29.4) + version: 3.12.2(magicast@0.3.5)(rollup@3.29.4) '@uploadthing/vue': specifier: workspace:* version: link:../vue @@ -1214,16 +1395,16 @@ importers: devDependencies: '@nuxt/devtools': specifier: latest - version: 1.4.1(rollup@3.29.4)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2)) + version: 1.4.2(rollup@3.29.4)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0))(vue@3.4.25(typescript@5.5.2)) '@nuxt/module-builder': specifier: ^0.5.5 - version: 0.5.5(@nuxt/kit@3.12.2(magicast@0.3.4)(rollup@3.29.4))(nuxi@3.11.1)(typescript@5.5.2) + version: 0.5.5(@nuxt/kit@3.12.2(magicast@0.3.5)(rollup@3.29.4))(nuxi@3.11.1)(typescript@5.5.2) '@nuxt/schema': specifier: ^3.11.2 version: 3.12.2(rollup@3.29.4) '@nuxt/test-utils': specifier: ^3.12.0 - version: 3.12.1(@playwright/test@1.45.0)(h3@1.11.1)(happy-dom@13.10.1)(magicast@0.3.4)(playwright-core@1.45.0)(rollup@3.29.4)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2))(vitest@1.6.0(@types/node@20.14.0)(happy-dom@13.10.1)(lightningcss@1.24.1)(terser@5.19.2))(vue-router@4.3.2(vue@3.4.25(typescript@5.5.2)))(vue@3.4.25(typescript@5.5.2)) + version: 3.12.1(@playwright/test@1.45.0)(h3@1.11.1)(happy-dom@13.10.1)(magicast@0.3.5)(playwright-core@1.45.0)(rollup@3.29.4)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0))(vitest@1.6.0(@types/node@20.14.0)(@vitest/browser@2.0.5(typescript@5.5.2)(vitest@2.0.5))(happy-dom@13.10.1)(lightningcss@1.24.1)(terser@5.32.0))(vue-router@4.3.2(vue@3.4.25(typescript@5.5.2)))(vue@3.4.25(typescript@5.5.2)) '@uploadthing/eslint-config': specifier: workspace:* version: link:../../tooling/eslint-config @@ -1235,7 +1416,7 @@ importers: version: 1.11.1 nuxt: specifier: ^3.11.2 - version: 3.11.2(@parcel/watcher@2.4.1)(@types/node@20.14.0)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.3.2)(lightningcss@1.24.1)(magicast@0.3.4)(optionator@0.9.3)(rollup@3.29.4)(terser@5.19.2)(typescript@5.5.2)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2))(vue-tsc@2.0.14(typescript@5.5.2)) + version: 3.11.2(@parcel/watcher@2.4.1)(@types/node@20.14.0)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.3.2)(lightningcss@1.24.1)(magicast@0.3.5)(optionator@0.9.3)(rollup@3.29.4)(terser@5.32.0)(typescript@5.5.2)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0))(vue-tsc@2.0.14(typescript@5.5.2)) uploadthing: specifier: workspace:* version: link:../uploadthing @@ -1248,12 +1429,6 @@ importers: '@uploadthing/shared': specifier: workspace:* version: link:../shared - file-selector: - specifier: ^0.6.0 - version: 0.6.0 - tailwind-merge: - specifier: ^2.2.1 - version: 2.3.0 devDependencies: '@types/node': specifier: ^20.14.0 @@ -1270,6 +1445,9 @@ importers: '@uploadthing/tsconfig': specifier: workspace:* version: link:../../tooling/tsconfig + '@vitest/browser': + specifier: 2.0.5 + version: 2.0.5(graphql@16.8.1)(playwright@1.45.0)(typescript@5.5.2)(vitest@2.0.5) bunchee: specifier: ^5.2.1 version: 5.2.1(typescript@5.5.2) @@ -1280,8 +1458,8 @@ importers: specifier: ^8.57.0 version: 8.57.0 next: - specifier: 14.2.3 - version: 14.2.3(@babel/core@7.24.4)(@playwright/test@1.45.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 14.2.11 + version: 14.2.11(@babel/core@7.24.4)(@playwright/test@1.45.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: specifier: 18.3.1 version: 18.3.1 @@ -1307,11 +1485,11 @@ importers: specifier: workspace:* version: link:../mime-types effect: - specifier: 3.4.8 - version: 3.4.8 - std-env: - specifier: ^3.7.0 - version: 3.7.0 + specifier: 3.7.2 + version: 3.7.2 + sqids: + specifier: ^0.3.0 + version: 0.3.0 devDependencies: '@types/react': specifier: 18.3.3 @@ -1352,9 +1530,6 @@ importers: '@uploadthing/shared': specifier: workspace:* version: link:../shared - tailwind-merge: - specifier: ^2.2.1 - version: 2.3.0 devDependencies: postcss: specifier: 8.4.38 @@ -1389,22 +1564,19 @@ importers: '@uploadthing/shared': specifier: workspace:* version: link:../shared - tailwind-merge: - specifier: ^2.2.1 - version: 2.3.0 devDependencies: '@sveltejs/adapter-auto': specifier: ^3.1.1 - version: 3.2.0(@sveltejs/kit@2.5.7(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.15)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2)))(svelte@4.2.15)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2))) + version: 3.2.0(@sveltejs/kit@2.5.7(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.15)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0)))(svelte@4.2.15)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0))) '@sveltejs/kit': specifier: ^2.5.4 - version: 2.5.7(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.15)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2)))(svelte@4.2.15)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2)) + version: 2.5.7(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.15)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0)))(svelte@4.2.15)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0)) '@sveltejs/package': specifier: ^2.3.0 version: 2.3.1(svelte@4.2.15)(typescript@5.5.2) '@sveltejs/vite-plugin-svelte': specifier: ^3.1.0 - version: 3.1.0(svelte@4.2.15)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2)) + version: 3.1.0(svelte@4.2.15)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0)) postcss: specifier: 8.4.38 version: 8.4.38 @@ -1434,32 +1606,32 @@ importers: version: link:../uploadthing vite: specifier: ^5.3.1 - version: 5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2) + version: 5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0) packages/uploadthing: dependencies: + '@effect/platform': + specifier: 0.63.2 + version: 0.63.2(@effect/schema@0.72.2(effect@3.7.2))(effect@3.7.2) '@effect/schema': - specifier: 0.68.18 - version: 0.68.18(effect@3.4.8) + specifier: 0.72.2 + version: 0.72.2(effect@3.7.2) '@uploadthing/mime-types': specifier: workspace:* version: link:../mime-types '@uploadthing/shared': specifier: workspace:* version: link:../shared - consola: - specifier: ^3.2.3 - version: 3.2.3 effect: - specifier: 3.4.8 - version: 3.4.8 - std-env: - specifier: ^3.7.0 - version: 3.7.0 + specifier: 3.7.2 + version: 3.7.2 + effect-log: + specifier: 0.32.0 + version: 0.32.0(effect@3.7.2) devDependencies: - '@effect/platform': - specifier: 0.58.21 - version: 0.58.21(@effect/schema@0.68.18(effect@3.4.8))(effect@3.4.8) + '@remix-run/server-runtime': + specifier: ^2.12.0 + version: 2.12.0(typescript@5.5.2) '@types/body-parser': specifier: ^1.19.5 version: 1.19.5 @@ -1497,11 +1669,11 @@ importers: specifier: ^1.11.1 version: 1.11.1 next: - specifier: 14.2.3 - version: 14.2.3(@babel/core@7.24.4)(@playwright/test@1.45.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 14.2.11 + version: 14.2.11(@babel/core@7.24.4)(@playwright/test@1.45.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) nuxt: specifier: ^3.11.2 - version: 3.11.2(@parcel/watcher@2.4.1)(@types/node@20.14.0)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.3.2)(lightningcss@1.24.1)(magicast@0.3.4)(optionator@0.9.3)(rollup@4.18.0)(terser@5.19.2)(typescript@5.5.2)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2))(vue-tsc@2.0.14(typescript@5.5.2)) + version: 3.11.2(@parcel/watcher@2.4.1)(@types/node@20.14.0)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.3.2)(lightningcss@1.24.1)(magicast@0.3.5)(optionator@0.9.3)(rollup@4.18.0)(terser@5.32.0)(typescript@5.5.2)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0))(vue-tsc@2.0.14(typescript@5.5.2)) solid-js: specifier: ^1.8.15 version: 1.8.16 @@ -1538,12 +1710,6 @@ importers: '@vueuse/core': specifier: ^10.9.0 version: 10.9.0(vue@3.4.25(typescript@5.5.2)) - file-selector: - specifier: ^0.6.0 - version: 0.6.0 - tailwind-merge: - specifier: ^2.2.1 - version: 2.3.0 devDependencies: '@uploadthing/eslint-config': specifier: workspace:* @@ -1652,6 +1818,56 @@ packages: '@adobe/css-tools@4.4.0': resolution: {integrity: sha512-Ff9+ksdQQB3rMncgqDK78uLznstjyfIf2Arnh22pW8kBpLs6rpKDwgnZT46hin5Hl1WzazzK64DOrhSwYpS7bQ==} + '@algolia/autocomplete-core@1.17.4': + resolution: {integrity: sha512-H1CAzj43RDeC4Vq9FW2JLtRDNxhjRG/aPX69nbNrKbYzX9P0YohxrEj3kJ9G+e20y0L0pYboAOeU6wgbKJ6gOA==} + + '@algolia/autocomplete-plugin-algolia-insights@1.17.4': + resolution: {integrity: sha512-fPABTwZtfD83qAzwnMYjJQ6ohCK7XE2l2++H+dOtV76cCIsAYYAC1bO5DnCbIi6Ma+OkNOgB1jCPI5EYOEsSpg==} + peerDependencies: + search-insights: '>= 1 < 3' + + '@algolia/autocomplete-shared@1.17.4': + resolution: {integrity: sha512-AM7KntpKinDZGVYfZ4j8zt5ymgYBRXOZg0CFEeHLmViqu5BvQzzoc1aoNHQx6lBjViGckBYP9szA+t2QzRXy3A==} + peerDependencies: + '@algolia/client-search': '>= 4.9.1 < 6' + algoliasearch: '>= 4.9.1 < 6' + + '@algolia/client-abtesting@5.4.1': + resolution: {integrity: sha512-wJQDAqGPnvKxBnE3IZ9hKaYAumlGN3zAcAXQiFdvDDj5EXwwNrdLDjmvzt+e/QGPgYPqSIjCeiQMqDHevBmMLA==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-analytics@5.4.1': + resolution: {integrity: sha512-u8jb5wvfDDOQj/u/qOacd+1GJjSjazFUtGBMFJ8SAlKmU0u/GL+sMrEC0fz0RmPqP/ivZ25qcyCk1n8CpSQGwg==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-common@5.4.1': + resolution: {integrity: sha512-IffPD+CETiR8YJMVC1lcjnhETLpJ2L0ORZCbbRvwo/S11D1j/keR7AqKVMn4TseRJCfjmBFOcFrC+m4sXjyQWA==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-personalization@5.4.1': + resolution: {integrity: sha512-WqxZRlOBcsJlxO6I0abnGkA1Grjcw0rEs4hEu0SZb+GL9lUsZnIVGNAn5h2GLaMx6kR48W8Ep4xU10jP0NNvKA==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-search@5.4.1': + resolution: {integrity: sha512-nCgWY2p0tZgBqJKmA5E6B3VW+7uqxi1Orf88zNWOihJBRFeOV932pzG4vGrX9l0+p0o/vJabYxuomO35rEt5dw==} + engines: {node: '>= 14.0.0'} + + '@algolia/recommend@5.4.1': + resolution: {integrity: sha512-OgXki3OHFthEVrsv8GtKNxqQw7ww4u2m0iXl+9a/E+FhTD0iJcS2rACrYB8y6/HRTFQMqML509M0I1B/dXy6ig==} + engines: {node: '>= 14.0.0'} + + '@algolia/requester-browser-xhr@5.4.1': + resolution: {integrity: sha512-J6+YfU+maR0nIbsYRHoq0UpneilX97hrZzPuuvSoBojQmPo8PeCXKGeT/F0D8uFI6G4CMTKEPGmQYrC9IpCbcQ==} + engines: {node: '>= 14.0.0'} + + '@algolia/requester-fetch@5.4.1': + resolution: {integrity: sha512-AO/C1pqqpIS8p2IsfM5x92S+UBKkcIen5dHfMEh1rnV0ArWDreeqrtxMD2A+6AjQVwYeZNy56w7o7PVIm6mc8g==} + engines: {node: '>= 14.0.0'} + + '@algolia/requester-node-http@5.4.1': + resolution: {integrity: sha512-2Y3vffc91egwFxz0SjXFEH4q8nvlNJHcz+0//NaWItRU68AvD+3aI/j66STPjkLQOC0Ku6ckA9ChhbOVfrv+Uw==} + engines: {node: '>= 14.0.0'} + '@alloc/quick-lru@5.2.0': resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} engines: {node: '>=10'} @@ -1825,10 +2041,18 @@ packages: resolution: {integrity: sha512-WdJjwMEkmBicq5T9fm/cHND3+UlFa2Yj8ALLgmoSQAJZysYbBjw+azChSGPN4DSPLXOcooGRvDwZWMcF/mLO2Q==} engines: {node: '>=6.9.0'} + '@babel/helper-string-parser@7.24.8': + resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==} + engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.24.6': resolution: {integrity: sha512-4yA7s865JHaqUdRbnaxarZREuPTHrjpDT+pXoAZ1yhyo6uFnIEpS8VMu16siFOHDpZNKYv5BObhsB//ycbICyw==} engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.24.7': + resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} + engines: {node: '>=6.9.0'} + '@babel/helper-validator-option@7.24.6': resolution: {integrity: sha512-Jktc8KkF3zIkePb48QO+IapbXlSapOW9S+ogZZkcO6bABgYAxtZcjZ/O005111YLf+j4M84uEgwYoidDkXbCkQ==} engines: {node: '>=6.9.0'} @@ -1850,6 +2074,11 @@ packages: engines: {node: '>=6.0.0'} hasBin: true + '@babel/parser@7.25.6': + resolution: {integrity: sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==} + engines: {node: '>=6.0.0'} + hasBin: true + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.24.6': resolution: {integrity: sha512-bYndrJ6Ph6Ar+GaB5VAc0JPoP80bQCm4qon6JEzXfRl5QZyQ8Ur1K6k7htxWmPA5z+k7JQvaMUrtXlqclWYzKw==} engines: {node: '>=6.9.0'} @@ -2474,6 +2703,10 @@ packages: resolution: {integrity: sha512-WaMsgi6Q8zMgMth93GvWPXkhAIEobfsIkLTacoVZoK1J0CevIPGYY2Vo5YvJGqyHqXM6P4ppOYGsIRU8MM9pFQ==} engines: {node: '>=6.9.0'} + '@babel/types@7.25.6': + resolution: {integrity: sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==} + engines: {node: '>=6.9.0'} + '@bacons/text-decoder@0.0.0': resolution: {integrity: sha512-8KNbnXSHfhZRR1S1IQEdWQNa9HE/ylWRisDdkoCmHiaP53mksnPaxyqUSlwpJ3DyG1xEekRwFDEG+pbCbSsrkQ==} peerDependencies: @@ -2482,15 +2715,15 @@ packages: '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - '@braintree/sanitize-url@6.0.4': - resolution: {integrity: sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A==} - '@bundled-es-modules/cookie@2.0.0': resolution: {integrity: sha512-Or6YHg/kamKHpxULAdSqhGqnWFneIXu1NKvvfBBzKGwpVsYuFIQ5aBPHDnnoR3ghW1nvSkALd+EF9iMtY7Vjxw==} '@bundled-es-modules/statuses@1.0.1': resolution: {integrity: sha512-yn7BklA5acgcBr+7w064fGV+SGIFySjCKpqjcWgBAIfrAkY+4GQTJJHQMeT3V/sgz23VTEVV8TtOmkvJAhFVfg==} + '@bundled-es-modules/tough-cookie@0.1.6': + resolution: {integrity: sha512-dvMHbL464C0zI+Yqxbz6kZ5TOEp7GLW+pry/RWndAR8MJQAXZ2rPmIs8tziTZjeIyhSNZgZbCePtfSbdWqStJw==} + '@cfcs/core@0.0.6': resolution: {integrity: sha512-FxfJMwoLB8MEMConeXUCqtMGqxdtePQxRBOiGip9ULcYYam3WfCgoY6xdnMaSkYvRvmosp5iuG+TiPofm65+Pw==} @@ -2556,12 +2789,23 @@ packages: resolution: {integrity: sha512-Zv3aKNVKSfr16bA98or5fOAQuFXw5sBRgOII5FhKFHU8GR1INjf3z0mWilo1AyYIYkh15I6nCPlJtWe+v8CzYg==} engines: {node: '>=14'} + '@clerk/backend@1.11.1': + resolution: {integrity: sha512-g+jk1wxS0j6s1or6e3rf8KK4bHaIxajCMHAASyhfl9a9OVBqtkeMgbQ3+LIFDRAOSQLxLKrIqJgPGPfOoHz17Q==} + engines: {node: '>=18.17.0'} + '@clerk/clerk-react@4.31.0': resolution: {integrity: sha512-jKr+wyCN5H14KQhzLjg9KFj9c021yfAf1+D4bfG3rSH4psUF4Cv99C2tezmCyX98KM+4tBouj79/XZwK2IXQgw==} engines: {node: '>=14'} peerDependencies: react: '>=16' + '@clerk/clerk-react@5.8.2': + resolution: {integrity: sha512-5wXr02TmxlGBjBTrM5URCk01b0q/Po6xg3SPo/U8HgrQ8qnY82hbnLxZ1dUuqH3MIzUh2VAoISJzF4TEZYqJJA==} + engines: {node: '>=18.17.0'} + peerDependencies: + react: '>=18 || >=19.0.0-beta' + react-dom: '>=18 || >=19.0.0-beta' + '@clerk/clerk-sdk-node@4.13.15': resolution: {integrity: sha512-+6abejj+5Q8Yg7nhcth53MUxGV++YHnvjjsW2nH7xUTpY/BOLDKcPRBMELzXMOhSSibffrQ8yNS9LwZZEmazAg==} engines: {node: '>=14'} @@ -2574,6 +2818,15 @@ packages: react: ^17.0.2 || ^18.0.0-0 react-dom: ^17.0.2 || ^18.0.0-0 + '@clerk/remix@4.2.25': + resolution: {integrity: sha512-MYq3R+DcbsYsELJ6K3Vw9L/j/o6WhZGnnBA3ltbhoGB6IE7ZL3tNrB6sFCNVKCKDAFsJfIk9vz9t0IPse9Bc+w==} + engines: {node: '>=18.17.0'} + peerDependencies: + '@remix-run/react': ^2.0.0 + '@remix-run/server-runtime': ^2.0.0 + react: '>=18' + react-dom: '>=18' + '@clerk/shared@1.4.1': resolution: {integrity: sha512-3rlZy0Hadnb1dw6x+4MGEC7dpZLlIVY3mZTwWRRS4CILWowVAccwfW84paN2XNlM12lJgMc+w66WNdw19XFtpg==} peerDependencies: @@ -2582,10 +2835,26 @@ packages: react: optional: true + '@clerk/shared@2.7.2': + resolution: {integrity: sha512-0SymNLqE5oMPf1XwtqNazNcpIoCKUv77f8rHpx4U8mg73uXYfuEQThNgCJyoM4/qxYLL3SBPKAlZl9MAHfSiyA==} + engines: {node: '>=18.17.0'} + peerDependencies: + react: '>=18 || >=19.0.0-beta' + react-dom: '>=18 || >=19.0.0-beta' + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + '@clerk/types@3.64.0': resolution: {integrity: sha512-fthhIAXaNIYQZ+82kUA00IUR8fwjewb/9sQI1J1NhoGbLp5rtxjKmNa6EQGKfcSG0svJyQ56kdSUUfawxRm5fw==} engines: {node: '>=14'} + '@clerk/types@4.20.1': + resolution: {integrity: sha512-s2v3wFgLsB+d0Ot5yN+5IjRNKWl63AAeEczTZDZYSWuNkGihvEXYjS2NtnYuhROBRgWEHEsm0JOp0rQkfTMkBw==} + engines: {node: '>=18.17.0'} + '@cloudflare/kv-asset-handler@0.3.1': resolution: {integrity: sha512-lKN2XCfKCmpKb86a1tl4GIwsJYDy9TGuwjhDELLmpKygQhw8X2xR4dusgpC5Tg7q1pB96Eb0rBo81kxSILQMwA==} @@ -2687,28 +2956,34 @@ packages: resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} engines: {node: '>=10.0.0'} - '@effect/platform-node-shared@0.8.20': - resolution: {integrity: sha512-0i3K23P4JDkfbAjaJ6sLfvq5PbSFDfU/jEn1f6POxacj86OwH1R3ypiUN48aXvLeCkVaZ9G2Wr4bBjk87g+uaA==} + '@effect/platform-node-shared@0.13.2': + resolution: {integrity: sha512-B0EvtkIGhqbcWUb6KtsWFOGqfZh8RUArVgcbzjmsRWfpwFxutwye4+zbw5XafgNwUxPm8gH8uOLl3rrxxDz3Pg==} + peerDependencies: + '@effect/platform': ^0.63.2 + effect: ^3.7.2 + + '@effect/platform-node@0.58.2': + resolution: {integrity: sha512-vMGQOx2c34pK0j8LlBzNyj47B9wrulne+8fIjDw7PDGwHY7iMD6dnSV6oo6kFurrYkQaDOz7/u3kErKrBccTrg==} peerDependencies: - '@effect/platform': ^0.58.21 - effect: ^3.4.8 + '@effect/platform': ^0.63.2 + effect: ^3.7.2 - '@effect/platform-node@0.53.20': - resolution: {integrity: sha512-Y9CqWYpFOUsmzexaZbjJdneD/oeB5AaR5qfNb9DjSnL2RrNOrmQwhP99btcYmcM3wP9VLSItgNPzlnwcM1rJfw==} + '@effect/platform@0.63.2': + resolution: {integrity: sha512-b39pVFw0NGo/tXjGShW7Yg0M+kG7bRrFR6+dQ3aIu99ePTkTp6bGb/kDB7n+dXsFFdIqHsQGYESeYcOQngxdFQ==} peerDependencies: - '@effect/platform': ^0.58.21 - effect: ^3.4.8 + '@effect/schema': ^0.72.2 + effect: ^3.7.2 - '@effect/platform@0.58.21': - resolution: {integrity: sha512-q6NSWisGbQO/qcP+ce4axnuaYOgZPrzG7V3joaNGZqxuF55A0dRpErmpzrlOq/7qsMV5G5/2zBGxN9abK5Z4VA==} + '@effect/schema@0.72.2': + resolution: {integrity: sha512-/x1BIA2pqcUidNrOMmwYe6Z58KtSgHSc5iJu7bNwIxi2LHMVuUao1BvpI5x6i7T/zkoi4dd1S6qasZzJIYDjdw==} peerDependencies: - '@effect/schema': ^0.68.18 - effect: ^3.4.8 + effect: ^3.7.2 - '@effect/schema@0.68.18': - resolution: {integrity: sha512-+knLs36muKsyqIvQTB0itGp5Lwy+5jgEC0G5P8wSsrB6EWGFirS87QjbaFYGbg32l/P51RM+9cPMiAEyICwN6g==} + '@effect/vitest@0.9.2': + resolution: {integrity: sha512-bzoW6v2jIkl68jEIkTbfFJL8n85mldHvQjjHmMVrb2ym7jt4eBI9U4P/TLoBA/3pAXEGhGkovq1jqET3LBmvFw==} peerDependencies: - effect: ^3.4.8 + effect: ^3.7.2 + vitest: ^2.0.4 '@egjs/agent@2.4.3': resolution: {integrity: sha512-XvksSENe8wPeFlEVouvrOhKdx8HMniJ3by7sro2uPF3M6QqWwjzVcmvwoPtdjiX8O1lfRoLhQMp1a7NGlVTdIA==} @@ -2731,6 +3006,12 @@ packages: peerDependencies: elysia: '>= 0.8.0' + '@emnapi/runtime@0.44.0': + resolution: {integrity: sha512-ZX/etZEZw8DR7zAB1eVQT40lNo0jeqpb6dCgOvctB6FIQ5PoXfMuNY8+ayQfu8tNQbAB8gQWSSJupR8NxeiZXw==} + + '@emotion/hash@0.9.2': + resolution: {integrity: sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==} + '@esbuild-kit/core-utils@3.1.0': resolution: {integrity: sha512-Uuk8RpCg/7fdHSceR1M6XbSZFSuMrxcePFuGgyvsBn+u339dk5OeL4jv2EojwTN2st/unJGsVm4qHWjWNmJ/tw==} @@ -2771,6 +3052,12 @@ packages: cpu: [arm64] os: [android] + '@esbuild/android-arm64@0.17.6': + resolution: {integrity: sha512-YnYSCceN/dUzUr5kdtUzB+wZprCafuD89Hs0Aqv9QSdwhYQybhXTaSTcrl6X/aWThn1a/j0eEpUBGOE7269REg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm64@0.18.20': resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} engines: {node: '>=12'} @@ -2801,6 +3088,12 @@ packages: cpu: [arm] os: [android] + '@esbuild/android-arm@0.17.6': + resolution: {integrity: sha512-bSC9YVUjADDy1gae8RrioINU6e1lCkg3VGVwm0QQ2E1CWcC4gnMce9+B6RpxuSsrsXsk1yojn7sp1fnG8erE2g==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + '@esbuild/android-arm@0.18.20': resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} engines: {node: '>=12'} @@ -2831,6 +3124,12 @@ packages: cpu: [x64] os: [android] + '@esbuild/android-x64@0.17.6': + resolution: {integrity: sha512-MVcYcgSO7pfu/x34uX9u2QIZHmXAB7dEiLQC5bBl5Ryqtpj9lT2sg3gNDEsrPEmimSJW2FXIaxqSQ501YLDsZQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + '@esbuild/android-x64@0.18.20': resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} engines: {node: '>=12'} @@ -2861,6 +3160,12 @@ packages: cpu: [arm64] os: [darwin] + '@esbuild/darwin-arm64@0.17.6': + resolution: {integrity: sha512-bsDRvlbKMQMt6Wl08nHtFz++yoZHsyTOxnjfB2Q95gato+Yi4WnRl13oC2/PJJA9yLCoRv9gqT/EYX0/zDsyMA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-arm64@0.18.20': resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} engines: {node: '>=12'} @@ -2891,6 +3196,12 @@ packages: cpu: [x64] os: [darwin] + '@esbuild/darwin-x64@0.17.6': + resolution: {integrity: sha512-xh2A5oPrYRfMFz74QXIQTQo8uA+hYzGWJFoeTE8EvoZGHb+idyV4ATaukaUvnnxJiauhs/fPx3vYhU4wiGfosg==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + '@esbuild/darwin-x64@0.18.20': resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} engines: {node: '>=12'} @@ -2921,6 +3232,12 @@ packages: cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-arm64@0.17.6': + resolution: {integrity: sha512-EnUwjRc1inT4ccZh4pB3v1cIhohE2S4YXlt1OvI7sw/+pD+dIE4smwekZlEPIwY6PhU6oDWwITrQQm5S2/iZgg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-arm64@0.18.20': resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} engines: {node: '>=12'} @@ -2951,6 +3268,12 @@ packages: cpu: [x64] os: [freebsd] + '@esbuild/freebsd-x64@0.17.6': + resolution: {integrity: sha512-Uh3HLWGzH6FwpviUcLMKPCbZUAFzv67Wj5MTwK6jn89b576SR2IbEp+tqUHTr8DIl0iDmBAf51MVaP7pw6PY5Q==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + '@esbuild/freebsd-x64@0.18.20': resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} engines: {node: '>=12'} @@ -2981,6 +3304,12 @@ packages: cpu: [arm64] os: [linux] + '@esbuild/linux-arm64@0.17.6': + resolution: {integrity: sha512-bUR58IFOMJX523aDVozswnlp5yry7+0cRLCXDsxnUeQYJik1DukMY+apBsLOZJblpH+K7ox7YrKrHmJoWqVR9w==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm64@0.18.20': resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} engines: {node: '>=12'} @@ -3011,6 +3340,12 @@ packages: cpu: [arm] os: [linux] + '@esbuild/linux-arm@0.17.6': + resolution: {integrity: sha512-7YdGiurNt7lqO0Bf/U9/arrPWPqdPqcV6JCZda4LZgEn+PTQ5SMEI4MGR52Bfn3+d6bNEGcWFzlIxiQdS48YUw==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + '@esbuild/linux-arm@0.18.20': resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} engines: {node: '>=12'} @@ -3041,6 +3376,12 @@ packages: cpu: [ia32] os: [linux] + '@esbuild/linux-ia32@0.17.6': + resolution: {integrity: sha512-ujp8uoQCM9FRcbDfkqECoARsLnLfCUhKARTP56TFPog8ie9JG83D5GVKjQ6yVrEVdMie1djH86fm98eY3quQkQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-ia32@0.18.20': resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} engines: {node: '>=12'} @@ -3071,6 +3412,12 @@ packages: cpu: [loong64] os: [linux] + '@esbuild/linux-loong64@0.17.6': + resolution: {integrity: sha512-y2NX1+X/Nt+izj9bLoiaYB9YXT/LoaQFYvCkVD77G/4F+/yuVXYCWz4SE9yr5CBMbOxOfBcy/xFL4LlOeNlzYQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-loong64@0.18.20': resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} engines: {node: '>=12'} @@ -3101,6 +3448,12 @@ packages: cpu: [mips64el] os: [linux] + '@esbuild/linux-mips64el@0.17.6': + resolution: {integrity: sha512-09AXKB1HDOzXD+j3FdXCiL/MWmZP0Ex9eR8DLMBVcHorrWJxWmY8Nms2Nm41iRM64WVx7bA/JVHMv081iP2kUA==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-mips64el@0.18.20': resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} engines: {node: '>=12'} @@ -3131,6 +3484,12 @@ packages: cpu: [ppc64] os: [linux] + '@esbuild/linux-ppc64@0.17.6': + resolution: {integrity: sha512-AmLhMzkM8JuqTIOhxnX4ubh0XWJIznEynRnZAVdA2mMKE6FAfwT2TWKTwdqMG+qEaeyDPtfNoZRpJbD4ZBv0Tg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-ppc64@0.18.20': resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} engines: {node: '>=12'} @@ -3161,6 +3520,12 @@ packages: cpu: [riscv64] os: [linux] + '@esbuild/linux-riscv64@0.17.6': + resolution: {integrity: sha512-Y4Ri62PfavhLQhFbqucysHOmRamlTVK10zPWlqjNbj2XMea+BOs4w6ASKwQwAiqf9ZqcY9Ab7NOU4wIgpxwoSQ==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-riscv64@0.18.20': resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} engines: {node: '>=12'} @@ -3191,6 +3556,12 @@ packages: cpu: [s390x] os: [linux] + '@esbuild/linux-s390x@0.17.6': + resolution: {integrity: sha512-SPUiz4fDbnNEm3JSdUW8pBJ/vkop3M1YwZAVwvdwlFLoJwKEZ9L98l3tzeyMzq27CyepDQ3Qgoba44StgbiN5Q==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-s390x@0.18.20': resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} engines: {node: '>=12'} @@ -3221,6 +3592,12 @@ packages: cpu: [x64] os: [linux] + '@esbuild/linux-x64@0.17.6': + resolution: {integrity: sha512-a3yHLmOodHrzuNgdpB7peFGPx1iJ2x6m+uDvhP2CKdr2CwOaqEFMeSqYAHU7hG+RjCq8r2NFujcd/YsEsFgTGw==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + '@esbuild/linux-x64@0.18.20': resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} engines: {node: '>=12'} @@ -3251,6 +3628,12 @@ packages: cpu: [x64] os: [netbsd] + '@esbuild/netbsd-x64@0.17.6': + resolution: {integrity: sha512-EanJqcU/4uZIBreTrnbnre2DXgXSa+Gjap7ifRfllpmyAU7YMvaXmljdArptTHmjrkkKm9BK6GH5D5Yo+p6y5A==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + '@esbuild/netbsd-x64@0.18.20': resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} engines: {node: '>=12'} @@ -3281,6 +3664,12 @@ packages: cpu: [x64] os: [openbsd] + '@esbuild/openbsd-x64@0.17.6': + resolution: {integrity: sha512-xaxeSunhQRsTNGFanoOkkLtnmMn5QbA0qBhNet/XLVsc+OVkpIWPHcr3zTW2gxVU5YOHFbIHR9ODuaUdNza2Vw==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + '@esbuild/openbsd-x64@0.18.20': resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} engines: {node: '>=12'} @@ -3311,6 +3700,12 @@ packages: cpu: [x64] os: [sunos] + '@esbuild/sunos-x64@0.17.6': + resolution: {integrity: sha512-gnMnMPg5pfMkZvhHee21KbKdc6W3GR8/JuE0Da1kjwpK6oiFU3nqfHuVPgUX2rsOx9N2SadSQTIYV1CIjYG+xw==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + '@esbuild/sunos-x64@0.18.20': resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} engines: {node: '>=12'} @@ -3341,6 +3736,12 @@ packages: cpu: [arm64] os: [win32] + '@esbuild/win32-arm64@0.17.6': + resolution: {integrity: sha512-G95n7vP1UnGJPsVdKXllAJPtqjMvFYbN20e8RK8LVLhlTiSOH1sd7+Gt7rm70xiG+I5tM58nYgwWrLs6I1jHqg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-arm64@0.18.20': resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} engines: {node: '>=12'} @@ -3371,6 +3772,12 @@ packages: cpu: [ia32] os: [win32] + '@esbuild/win32-ia32@0.17.6': + resolution: {integrity: sha512-96yEFzLhq5bv9jJo5JhTs1gI+1cKQ83cUpyxHuGqXVwQtY5Eq54ZEsKs8veKtiKwlrNimtckHEkj4mRh4pPjsg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-ia32@0.18.20': resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} engines: {node: '>=12'} @@ -3401,8 +3808,14 @@ packages: cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.18.20': - resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} + '@esbuild/win32-x64@0.17.6': + resolution: {integrity: sha512-n6d8MOyUrNp6G4VSpRcgjs5xj4A91svJSaiwLIDWVWEsZtpN5FA9NlBbZHDmAJc2e8e6SF4tkBD3HAvPF+7igA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.18.20': + resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} engines: {node: '>=12'} cpu: [x64] os: [win32] @@ -3572,14 +3985,23 @@ packages: react: '>=16.8.0' react-dom: '>=16.8.0' - '@floating-ui/utils@0.2.2': - resolution: {integrity: sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw==} + '@floating-ui/react-dom@2.1.1': + resolution: {integrity: sha512-4h84MJt3CHrtG18mGsXuLCHMrug49d7DFkU0RMIyshRveBeyV2hmV/pDaF2Uxtu8kgq5r46llp5E5FQiR0K2Yg==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/react@0.26.23': + resolution: {integrity: sha512-9u3i62fV0CFF3nIegiWiRDwOs7OW/KhSUJDNx2MkQM3LbE5zQOY01sL3nelcVBXvX7Ovvo3A49I8ql+20Wg/Hw==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' '@floating-ui/utils@0.2.4': resolution: {integrity: sha512-dWO2pw8hhi+WrXq1YJy2yCuWoL20PddgGaqTgVe4cOS9Q6qklXCiA1tJEqX6BEwRNSCP84/afac9hd4MS+zEUA==} - '@floating-ui/vue@1.0.6': - resolution: {integrity: sha512-EdrOljjkpkkqZnrpqUcPoz9NvHxuTjUtSInh6GMv3+Mcy+giY2cE2pHh9rpacRcZ2eMSCxel9jWkWXTjLmY55w==} + '@floating-ui/utils@0.2.7': + resolution: {integrity: sha512-X8R8Oj771YRl/w+c1HqAC1szL8zWQRwFvgDwT129k9ACdBoud/+/rX9V0qiMl6LWUdP9voC2nDVZYPMQQsb6eA==} '@floating-ui/vue@1.1.1': resolution: {integrity: sha512-cyawjk9etPZPl/RVtMRnWrwtAhWbPVSrRVYARgOzhLIqxr0k2up1APrrFjqP9QwRQ0AwjKSvbWg4YC6jESutow==} @@ -3619,12 +4041,12 @@ packages: '@hapi/topo@5.1.0': resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==} - '@headlessui/react@1.7.19': - resolution: {integrity: sha512-Ll+8q3OlMJfJbAKM/+/Y2q6PPYbryqNTXDbryx7SXLIDamkF6iQFbriYHga0dY44PvDhvvBWCx1Xj4U5+G4hOw==} + '@headlessui/react@2.1.8': + resolution: {integrity: sha512-uajqVkAcVG/wHwG9Fh5PFMcFpf2VxM4vNRNKxRjuK009kePVur8LkuuygHfIE+2uZ7z7GnlTtYsyUe6glPpTLg==} engines: {node: '>=10'} peerDependencies: - react: ^16 || ^17 || ^18 - react-dom: ^16 || ^17 || ^18 + react: ^18 + react-dom: ^18 '@headlessui/tailwindcss@0.2.1': resolution: {integrity: sha512-2+5+NZ+RzMyrVeCZOxdbvkUSssSxGvcUxphkIfSVLpRiKsj+/63T2TOL9dBYMXVfj/CGr6hMxSRInzXv6YY7sA==} @@ -3638,6 +4060,11 @@ packages: peerDependencies: vue: ^3.2.0 + '@heroicons/react@2.1.5': + resolution: {integrity: sha512-FuzFN+BsHa+7OxbvAERtgBTNeZpUjgM/MIizfVkSCL2/edriN0Hx/DWRCR//aPYwO5QX/YlgLGXk+E3PcfZwjA==} + peerDependencies: + react: '>= 16' + '@hono/node-server@1.11.0': resolution: {integrity: sha512-TLIJq9TMtD1NEG1mVoqNUn1Ita0qSaB5XboZErjFBcO/GJYXwWY4dVdTi9G0lbxtu0x+hJXDItcLaFHb7rlFTw==} engines: {node: '>=18.14.1'} @@ -3670,6 +4097,119 @@ packages: '@vue/compiler-sfc': optional: true + '@img/sharp-darwin-arm64@0.33.1': + resolution: {integrity: sha512-esr2BZ1x0bo+wl7Gx2hjssYhjrhUsD88VQulI0FrG8/otRQUOxLWHMBd1Y1qo2Gfg2KUvXNpT0ASnV9BzJCexw==} + engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm64] + os: [darwin] + + '@img/sharp-darwin-x64@0.33.1': + resolution: {integrity: sha512-YrnuB3bXuWdG+hJlXtq7C73lF8ampkhU3tMxg5Hh+E7ikxbUVOU9nlNtVTloDXz6pRHt2y2oKJq7DY/yt+UXYw==} + engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-darwin-arm64@1.0.0': + resolution: {integrity: sha512-VzYd6OwnUR81sInf3alj1wiokY50DjsHz5bvfnsFpxs5tqQxESoHtJO6xyksDs3RIkyhMWq2FufXo6GNSU9BMw==} + engines: {macos: '>=11', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm64] + os: [darwin] + + '@img/sharp-libvips-darwin-x64@1.0.0': + resolution: {integrity: sha512-dD9OznTlHD6aovRswaPNEy8dKtSAmNo4++tO7uuR4o5VxbVAOoEQ1uSmN4iFAdQneTHws1lkTZeiXPrcCkh6IA==} + engines: {macos: '>=10.13', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-linux-arm64@1.0.0': + resolution: {integrity: sha512-xTYThiqEZEZc0PRU90yVtM3KE7lw1bKdnDQ9kCTHWbqWyHOe4NpPOtMGy27YnN51q0J5dqRrvicfPbALIOeAZA==} + engines: {glibc: '>=2.26', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linux-arm@1.0.0': + resolution: {integrity: sha512-VwgD2eEikDJUk09Mn9Dzi1OW2OJFRQK+XlBTkUNmAWPrtj8Ly0yq05DFgu1VCMx2/DqCGQVi5A1dM9hTmxf3uw==} + engines: {glibc: '>=2.28', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm] + os: [linux] + + '@img/sharp-libvips-linux-s390x@1.0.0': + resolution: {integrity: sha512-o9E46WWBC6JsBlwU4QyU9578G77HBDT1NInd+aERfxeOPbk0qBZHgoDsQmA2v9TbqJRWzoBPx1aLOhprBMgPjw==} + engines: {glibc: '>=2.28', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [s390x] + os: [linux] + + '@img/sharp-libvips-linux-x64@1.0.0': + resolution: {integrity: sha512-naldaJy4hSVhWBgEjfdBY85CAa4UO+W1nx6a1sWStHZ7EUfNiuBTTN2KUYT5dH1+p/xij1t2QSXfCiFJoC5S/Q==} + engines: {glibc: '>=2.26', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [x64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-arm64@1.0.0': + resolution: {integrity: sha512-OdorplCyvmSAPsoJLldtLh3nLxRrkAAAOHsGWGDYfN0kh730gifK+UZb3dWORRa6EusNqCTjfXV4GxvgJ/nPDQ==} + engines: {musl: '>=1.2.2', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-x64@1.0.0': + resolution: {integrity: sha512-FW8iK6rJrg+X2jKD0Ajhjv6y74lToIBEvkZhl42nZt563FfxkCYacrXZtd+q/sRQDypQLzY5WdLkVTbJoPyqNg==} + engines: {musl: '>=1.2.2', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [x64] + os: [linux] + + '@img/sharp-linux-arm64@0.33.1': + resolution: {integrity: sha512-59B5GRO2d5N3tIfeGHAbJps7cLpuWEQv/8ySd9109ohQ3kzyCACENkFVAnGPX00HwPTQcaBNF7HQYEfZyZUFfw==} + engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm64] + os: [linux] + + '@img/sharp-linux-arm@0.33.1': + resolution: {integrity: sha512-Ii4X1vnzzI4j0+cucsrYA5ctrzU9ciXERfJR633S2r39CiD8npqH2GMj63uFZRCFt3E687IenAdbwIpQOJ5BNA==} + engines: {glibc: '>=2.28', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm] + os: [linux] + + '@img/sharp-linux-s390x@0.33.1': + resolution: {integrity: sha512-tRGrb2pHnFUXpOAj84orYNxHADBDIr0J7rrjwQrTNMQMWA4zy3StKmMvwsI7u3dEZcgwuMMooIIGWEWOjnmG8A==} + engines: {glibc: '>=2.28', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [s390x] + os: [linux] + + '@img/sharp-linux-x64@0.33.1': + resolution: {integrity: sha512-4y8osC0cAc1TRpy02yn5omBeloZZwS62fPZ0WUAYQiLhSFSpWJfY/gMrzKzLcHB9ulUV6ExFiu2elMaixKDbeg==} + engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [x64] + os: [linux] + + '@img/sharp-linuxmusl-arm64@0.33.1': + resolution: {integrity: sha512-D3lV6clkqIKUizNS8K6pkuCKNGmWoKlBGh5p0sLO2jQERzbakhu4bVX1Gz+RS4vTZBprKlWaf+/Rdp3ni2jLfA==} + engines: {musl: '>=1.2.2', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm64] + os: [linux] + + '@img/sharp-linuxmusl-x64@0.33.1': + resolution: {integrity: sha512-LOGKNu5w8uu1evVqUAUKTix2sQu1XDRIYbsi5Q0c/SrXhvJ4QyOx+GaajxmOg5PZSsSnCYPSmhjHHsRBx06/wQ==} + engines: {musl: '>=1.2.2', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [x64] + os: [linux] + + '@img/sharp-wasm32@0.33.1': + resolution: {integrity: sha512-vWI/sA+0p+92DLkpAMb5T6I8dg4z2vzCUnp8yvxHlwBpzN8CIcO3xlSXrLltSvK6iMsVMNswAv+ub77rsf25lA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [wasm32] + + '@img/sharp-win32-ia32@0.33.1': + resolution: {integrity: sha512-/xhYkylsKL05R+NXGJc9xr2Tuw6WIVl2lubFJaFYfW4/MQ4J+dgjIo/T4qjNRizrqs/szF/lC9a5+updmY9jaQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [ia32] + os: [win32] + + '@img/sharp-win32-x64@0.33.1': + resolution: {integrity: sha512-XaM69X0n6kTEsp9tVYYLhXdg7Qj32vYJlAKRutxUsm1UlgQNx6BOhHwZPwukCGXBU2+tH87ip2eV1I/E8MQnZg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [x64] + os: [win32] + '@inquirer/confirm@3.1.5': resolution: {integrity: sha512-6+dwZrpko5vr5EFEQmUbfBVhtu6IsnB8lQNsLHgO9S9fbfS5J6MuUj+NY0h98pPpYZXEazLR7qzypEDqVzf6aQ==} engines: {node: '>=18'} @@ -3758,6 +4298,9 @@ packages: '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + '@jspm/core@2.0.1': + resolution: {integrity: sha512-Lg3PnLp0QXpxwLIAuuJboLeRaIhrgJjeuh797QADg3xz8wGLugQOS5DpsE8A6i6Adgzf+bacllkKZG3J0tGfDw==} + '@kwsites/file-exists@1.1.1': resolution: {integrity: sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==} @@ -3865,12 +4408,21 @@ packages: resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==} hasBin: true + '@mdx-js/loader@3.0.1': + resolution: {integrity: sha512-YbYUt7YyEOdFxhyuCWmLKf5vKhID/hJAojEUnheJk4D8iYVLFQw+BAoBWru/dHGch1omtmZOPstsmKPyBF68Tw==} + peerDependencies: + webpack: '>=5' + '@mdx-js/mdx@2.3.0': resolution: {integrity: sha512-jLuwRlz8DQfQNiUCJR50Y09CGPq3fLtmtUQfVrj79E0JWu3dvsVcxVIcfhR5h0iXu+/z++zDrYeiJqifRynJkA==} - '@mdx-js/react@2.3.0': - resolution: {integrity: sha512-zQH//gdOmuu7nt2oJR29vFhDv88oGPmVw6BggmrHeMI+xgEkp1B2dX9/bMBSYtK0dyLX/aOmesKS09g222K1/g==} + '@mdx-js/mdx@3.0.1': + resolution: {integrity: sha512-eIQ4QTrOWyL3LWEe/bu6Taqzq2HQvHcyTMaOrI95P2/LmJE7AsfPfgJGuFLPVqBUE1BC1rik3VIhU+s9u72arA==} + + '@mdx-js/react@3.0.1': + resolution: {integrity: sha512-9ZrPIU4MGf6et1m1ov3zKf+q9+deetI51zprKB1D/z3NOb+rUxxtEl3mCjW5wTGh6VhRdwPueh1oRzi6ezkA8A==} peerDependencies: + '@types/react': '>=16' react: '>=16' '@mswjs/cookies@1.1.0': @@ -3881,75 +4433,9 @@ packages: resolution: {integrity: sha512-HM47Lu1YFmnYHKMBynFfjCp0U/yRskHj/8QEJW0CBEPOlw8Gkmjfll+S9b8M7V5CNDw2/ciRxjjnWeaCiblSIQ==} engines: {node: '>=18'} - '@napi-rs/simple-git-android-arm-eabi@0.1.16': - resolution: {integrity: sha512-dbrCL0Pl5KZG7x7tXdtVsA5CO6At5ohDX3myf5xIYn9kN4jDFxsocl8bNt6Vb/hZQoJd8fI+k5VlJt+rFhbdVw==} - engines: {node: '>= 10'} - cpu: [arm] - os: [android] - - '@napi-rs/simple-git-android-arm64@0.1.16': - resolution: {integrity: sha512-xYz+TW5J09iK8SuTAKK2D5MMIsBUXVSs8nYp7HcMi8q6FCRO7yJj96YfP9PvKsc/k64hOyqGmL5DhCzY9Cu1FQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [android] - - '@napi-rs/simple-git-darwin-arm64@0.1.16': - resolution: {integrity: sha512-XfgsYqxhUE022MJobeiX563TJqyQyX4FmYCnqrtJwAfivESVeAJiH6bQIum8dDEYMHXCsG7nL8Ok0Dp8k2m42g==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - '@napi-rs/simple-git-darwin-x64@0.1.16': - resolution: {integrity: sha512-tkEVBhD6vgRCbeWsaAQqM3bTfpIVGeitamPPRVSbsq8qgzJ5Dx6ZedH27R7KSsA/uao7mZ3dsrNLXbu1Wy5MzA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - '@napi-rs/simple-git-linux-arm-gnueabihf@0.1.16': - resolution: {integrity: sha512-R6VAyNnp/yRaT7DV1Ao3r67SqTWDa+fNq2LrNy0Z8gXk2wB9ZKlrxFtLPE1WSpWknWtyRDLpRlsorh7Evk7+7w==} - engines: {node: '>= 10'} - cpu: [arm] - os: [linux] - - '@napi-rs/simple-git-linux-arm64-gnu@0.1.16': - resolution: {integrity: sha512-LAGI0opFKw/HBMCV2qIBK3uWSEW9h4xd2ireZKLJy8DBPymX6NrWIamuxYNyCuACnFdPRxR4LaRFy4J5ZwuMdw==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - - '@napi-rs/simple-git-linux-arm64-musl@0.1.16': - resolution: {integrity: sha512-I57Ph0F0Yn2KW93ep+V1EzKhACqX0x49vvSiapqIsdDA2PifdEWLc1LJarBolmK7NKoPqKmf6lAKKO9lhiZzkg==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - - '@napi-rs/simple-git-linux-x64-gnu@0.1.16': - resolution: {integrity: sha512-AZYYFY2V7hlcQASPEOWyOa3e1skzTct9QPzz0LiDM3f/hCFY/wBaU2M6NC5iG3d2Kr38heuyFS/+JqxLm5WaKA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@napi-rs/simple-git-linux-x64-musl@0.1.16': - resolution: {integrity: sha512-9TyMcYSBJwjT8jwjY9m24BZbu7ozyWTjsmYBYNtK3B0Um1Ov6jthSNneLVvouQ6x+k3Ow+00TiFh6bvmT00r8g==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@napi-rs/simple-git-win32-arm64-msvc@0.1.16': - resolution: {integrity: sha512-uslJ1WuAHCYJWui6xjsyT47SjX6KOHDtClmNO8hqKz1pmDSNY7AjyUY8HxvD1lK9bDnWwc4JYhikS9cxCqHybw==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - - '@napi-rs/simple-git-win32-x64-msvc@0.1.16': - resolution: {integrity: sha512-SoEaVeCZCDF1MP+M9bMSXsZWgEjk4On9GWADO5JOulvzR1bKjk0s9PMHwe/YztR9F0sJzrCxwtvBZowhSJsQPg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - - '@napi-rs/simple-git@0.1.16': - resolution: {integrity: sha512-C5wRPw9waqL2jk3jEDeJv+f7ScuO3N0a39HVdyFLkwKxHH4Sya4ZbzZsu2JLi6eEqe7RuHipHL6mC7B2OfYZZw==} - engines: {node: '>= 10'} + '@mswjs/interceptors@0.29.1': + resolution: {integrity: sha512-3rDakgJZ77+RiQUuSK69t1F0m8BQKA8Vh5DCS5V0DWvNY67zob2JhhQrhCO0AKLGINTRSFd1tBaHcJTkhefoSw==} + engines: {node: '>=18'} '@neon-rs/load@0.0.4': resolution: {integrity: sha512-kTPhdZyTQxB+2wpiRcFWrDcejc4JI6tkPuS7UZCG4l6Zvc5kU/gGQ/ozvHTh1XR5tS+UlfAfGuPajjzQjCiHCw==} @@ -3972,8 +4458,8 @@ packages: '@next/env@13.5.6': resolution: {integrity: sha512-Yac/bV5sBGkkEXmAX5FWPS9Mmo2rthrOPRQQNfycJPkjUAUclomCPH7QFVCDQ4Mp2k2K1SSM6m0zrxYrOwtFQw==} - '@next/env@14.2.3': - resolution: {integrity: sha512-W7fd7IbkfmeeY2gXrzJYDx8D2lWKbVoTIj1o1ScPHNzvp30s1AuoEFSdr39bC5sjxJaxTtq3OTCZboNp0lNWHA==} + '@next/env@14.2.11': + resolution: {integrity: sha512-HYsQRSIXwiNqvzzYThrBwq6RhXo3E0n8j8nQnAs8i4fCEo2Zf/3eS0IiRA8XnRg9Ha0YnpkyJZIZg1qEwemrHw==} '@next/eslint-plugin-next@14.2.2': resolution: {integrity: sha512-q+Ec2648JtBpKiu/FSJm8HAsFXlNvioHeBCbTP12T1SGcHYwhqHULSfQgFkPgHDu3kzNp2Kem4J54bK4rPQ5SQ==} @@ -3981,56 +4467,67 @@ packages: '@next/eslint-plugin-next@14.2.3': resolution: {integrity: sha512-L3oDricIIjgj1AVnRdRor21gI7mShlSwU/1ZGHmqM3LzHhXXhdkrfeNY5zif25Bi5Dd7fiJHsbhoZCHfXYvlAw==} - '@next/swc-darwin-arm64@14.2.3': - resolution: {integrity: sha512-3pEYo/RaGqPP0YzwnlmPN2puaF2WMLM3apt5jLW2fFdXD9+pqcoTzRk+iZsf8ta7+quAe4Q6Ms0nR0SFGFdS1A==} + '@next/mdx@14.2.11': + resolution: {integrity: sha512-aTs8U7N5FLXArb1YfHMsomMtHa0sulAWrfbPdZKDIpF9DUNwY8tbRVpHLz/AbIwoJk/4oDhDwDSJBFZXYxrjzw==} + peerDependencies: + '@mdx-js/loader': '>=0.15.0' + '@mdx-js/react': '>=0.15.0' + peerDependenciesMeta: + '@mdx-js/loader': + optional: true + '@mdx-js/react': + optional: true + + '@next/swc-darwin-arm64@14.2.11': + resolution: {integrity: sha512-eiY9u7wEJZWp/Pga07Qy3ZmNEfALmmSS1HtsJF3y1QEyaExu7boENz11fWqDmZ3uvcyAxCMhTrA1jfVxITQW8g==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@14.2.3': - resolution: {integrity: sha512-6adp7waE6P1TYFSXpY366xwsOnEXM+y1kgRpjSRVI2CBDOcbRjsJ67Z6EgKIqWIue52d2q/Mx8g9MszARj8IEA==} + '@next/swc-darwin-x64@14.2.11': + resolution: {integrity: sha512-lnB0zYCld4yE0IX3ANrVMmtAbziBb7MYekcmR6iE9bujmgERl6+FK+b0MBq0pl304lYe7zO4yxJus9H/Af8jbg==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@14.2.3': - resolution: {integrity: sha512-cuzCE/1G0ZSnTAHJPUT1rPgQx1w5tzSX7POXSLaS7w2nIUJUD+e25QoXD/hMfxbsT9rslEXugWypJMILBj/QsA==} + '@next/swc-linux-arm64-gnu@14.2.11': + resolution: {integrity: sha512-Ulo9TZVocYmUAtzvZ7FfldtwUoQY0+9z3BiXZCLSUwU2bp7GqHA7/bqrfsArDlUb2xeGwn3ZuBbKtNK8TR0A8w==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@14.2.3': - resolution: {integrity: sha512-0D4/oMM2Y9Ta3nGuCcQN8jjJjmDPYpHX9OJzqk42NZGJocU2MqhBq5tWkJrUQOQY9N+In9xOdymzapM09GeiZw==} + '@next/swc-linux-arm64-musl@14.2.11': + resolution: {integrity: sha512-fH377DnKGyUnkWlmUpFF1T90m0dADBfK11dF8sOQkiELF9M+YwDRCGe8ZyDzvQcUd20Rr5U7vpZRrAxKwd3Rzg==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-x64-gnu@14.2.3': - resolution: {integrity: sha512-ENPiNnBNDInBLyUU5ii8PMQh+4XLr4pG51tOp6aJ9xqFQ2iRI6IH0Ds2yJkAzNV1CfyagcyzPfROMViS2wOZ9w==} + '@next/swc-linux-x64-gnu@14.2.11': + resolution: {integrity: sha512-a0TH4ZZp4NS0LgXP/488kgvWelNpwfgGTUCDXVhPGH6pInb7yIYNgM4kmNWOxBFt+TIuOH6Pi9NnGG4XWFUyXQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@14.2.3': - resolution: {integrity: sha512-BTAbq0LnCbF5MtoM7I/9UeUu/8ZBY0i8SFjUMCbPDOLv+un67e2JgyN4pmgfXBwy/I+RHu8q+k+MCkDN6P9ViQ==} + '@next/swc-linux-x64-musl@14.2.11': + resolution: {integrity: sha512-DYYZcO4Uir2gZxA4D2JcOAKVs8ZxbOFYPpXSVIgeoQbREbeEHxysVsg3nY4FrQy51e5opxt5mOHl/LzIyZBoKA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-win32-arm64-msvc@14.2.3': - resolution: {integrity: sha512-AEHIw/dhAMLNFJFJIJIyOFDzrzI5bAjI9J26gbO5xhAKHYTZ9Or04BesFPXiAYXDNdrwTP2dQceYA4dL1geu8A==} + '@next/swc-win32-arm64-msvc@14.2.11': + resolution: {integrity: sha512-PwqHeKG3/kKfPpM6of1B9UJ+Er6ySUy59PeFu0Un0LBzJTRKKAg2V6J60Yqzp99m55mLa+YTbU6xj61ImTv9mg==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-ia32-msvc@14.2.3': - resolution: {integrity: sha512-vga40n1q6aYb0CLrM+eEmisfKCR45ixQYXuBXxOOmmoV8sYST9k7E3US32FsY+CkkF7NtzdcebiFT4CHuMSyZw==} + '@next/swc-win32-ia32-msvc@14.2.11': + resolution: {integrity: sha512-0U7PWMnOYIvM74GY6rbH6w7v+vNPDVH1gUhlwHpfInJnNe5LkmUZqhp7FNWeNa5wbVgRcRi1F1cyxp4dmeLLvA==} engines: {node: '>= 10'} cpu: [ia32] os: [win32] - '@next/swc-win32-x64-msvc@14.2.3': - resolution: {integrity: sha512-Q1/zm43RWynxrO7lW4ehciQVj+5ePBhOK+/K2P7pLFX3JaJ/IZVC69SHidrmZSOkqz7ECIOhhy7XhAFG4JYyHA==} + '@next/swc-win32-x64-msvc@14.2.11': + resolution: {integrity: sha512-gQpS7mcgovWoaTG1FbS5/ojF7CGfql1Q0ZLsMrhcsi2Sr9HEqsUZ70MPJyaYBXbk6iEAP7UXMD9HC8KY1qNwvA==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -4055,6 +4552,18 @@ packages: resolution: {integrity: sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + '@npmcli/git@4.1.0': + resolution: {integrity: sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + '@npmcli/package-json@4.0.1': + resolution: {integrity: sha512-lRCEGdHZomFsURroh522YvA/2cVb9oPIJrjHanCJZkiasz1BzcnLr3tBJhlV7S86MBJBuAQ33is2D60YitZL2Q==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + '@npmcli/promise-spawn@6.0.2': + resolution: {integrity: sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + '@npmcli/redact@2.0.0': resolution: {integrity: sha512-SEjCPAVHWYUIQR+Yn03kJmrJjZDtJLYpj300m3HV9OTRZNpC5YpbMsM3eTkECyT4aWj8lDr9WeY6TWefpubtYQ==} engines: {node: ^16.14.0 || >=18.0.0} @@ -4067,8 +4576,8 @@ packages: peerDependencies: vite: '*' - '@nuxt/devtools-kit@1.4.1': - resolution: {integrity: sha512-6h7T9B0tSZVap13/hf7prEAgIzraj/kyux6/Iif455Trew96jHIFCCboBApUMastYEuCo3l17tgZKe0HW+jrtA==} + '@nuxt/devtools-kit@1.4.2': + resolution: {integrity: sha512-8a5PhVnC7E94318/sHbNSe9mI2MlsQ8+pJLGs2Hh1OJyidB9SWe6hoFc8q4K9VOtXak9uCFVb5V2JGXS1q+1aA==} peerDependencies: vite: '*' @@ -4076,8 +4585,8 @@ packages: resolution: {integrity: sha512-W0ncRMeWWrkbBhu3yhk/5PP6hXNgmeKA70Y4lpMe7aNe/Q8Zm5qwILD09DY026AMQoF9m0tswCI6uBvtur/Avg==} hasBin: true - '@nuxt/devtools-wizard@1.4.1': - resolution: {integrity: sha512-X9uTh5rgt0pw3UjXcHyl8ZFYmCgw8ITRe9Nr2VLCtNROfKz9yol/ESEhYMwTFiFlqSyfJP6/qtogJBjUt6dzTw==} + '@nuxt/devtools-wizard@1.4.2': + resolution: {integrity: sha512-TyhmPBg/xJKPOdnwR3DAh8KMUt6/0dUNABCxGVeY7PYbIiXt4msIGVJkBc4y+WwIJHOYPrSRClmZVsXQfRlB4A==} hasBin: true '@nuxt/devtools@1.3.7': @@ -4086,8 +4595,8 @@ packages: peerDependencies: vite: '*' - '@nuxt/devtools@1.4.1': - resolution: {integrity: sha512-BtmGRAr/pjSE3dBrM7iceNT6OZAQ/MHxq1brkHJDs2VdyZPnqqGS4n3/98saASoRdj0dddsuIElsqC/zIABhgg==} + '@nuxt/devtools@1.4.2': + resolution: {integrity: sha512-Ok3g2P7iwKyK8LiwozbYVAZTo8t91iXSmlJj2ozeo1okKQ2Qi1AtwB6nYgIlkUHZmo155ZjG/LCHYI5uhQ/sGw==} hasBin: true peerDependencies: vite: '*' @@ -4104,6 +4613,10 @@ packages: resolution: {integrity: sha512-gbhSbDvYfkGQ0R2ztqTLQLHRMv+7g50kAKKuN6mbF4tL9jg7NPnQ8bAarn2I4Qx8xtmwO+qY1ABkmYMn5S1CpA==} engines: {node: ^14.18.0 || >=16.10.0} + '@nuxt/kit@3.13.1': + resolution: {integrity: sha512-FkUL349lp/3nVfTIyws4UDJ3d2jyv5Pk1DC1HQUCOkSloYYMdbRcQAUcb4fe2TCLNWvHM+FhU8jnzGTzjALZYA==} + engines: {node: ^14.18.0 || >=16.10.0} + '@nuxt/module-builder@0.5.5': resolution: {integrity: sha512-ifFfwA1rbSXSae25RmqA2kAbV3xoShZNrq1yK8VXB/EnIcDn4WiaYR1PytaSxIt5zsvWPn92BJXiIUBiMQZ0hw==} hasBin: true @@ -4123,6 +4636,10 @@ packages: resolution: {integrity: sha512-JBGSjF9Hd8guvTV2312eM1RulCMJc50yR3CeMZPLDsI02A8TXQnABS8EbgvGRvxD43q/ITjj21B2ffG1wEVrnQ==} engines: {node: ^14.18.0 || >=16.10.0} + '@nuxt/schema@3.13.1': + resolution: {integrity: sha512-ishbhzVGspjshG9AG0hYnKYY6LWXzCtua7OXV7C/DQ2yA7rRcy1xHpzKZUDbIRyxCHHCAcBd8jfHEUmEuhEPrA==} + engines: {node: ^14.18.0 || >=16.10.0} + '@nuxt/telemetry@2.5.4': resolution: {integrity: sha512-KH6wxzsNys69daSO0xUv0LEBAfhwwjK1M+0Cdi1/vxmifCslMIY7lN11B4eywSfscbyVPAYJvANyc7XiVPImBQ==} hasBin: true @@ -4373,19 +4890,6 @@ packages: '@radix-ui/primitive@1.0.1': resolution: {integrity: sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==} - '@radix-ui/react-accordion@1.1.2': - resolution: {integrity: sha512-fDG7jcoNKVjSK6yfmuAs0EnPDro0WMXIhMtXdTBWqEioVW206ku+4Lw07e+13lUkFkpoEQ2PdeMIAGpdqEAmDg==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - '@radix-ui/react-arrow@1.0.3': resolution: {integrity: sha512-wSP+pHsB/jQRaL6voubsQ/ZlrGBHHrOjmBnr19hxYgtS0WvAFwZhK2WP/YY5yF9uKECCEEDGxuLxq1NBK51wFA==} peerDependencies: @@ -4399,19 +4903,6 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-collapsible@1.0.3': - resolution: {integrity: sha512-UBmVDkmR6IvDsloHVN+3rtx4Mi5TFvylYXpluuv0f37dtaz3H99bp8No0LGXRigVpl3UAT4l9j6bIchh42S/Gg==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - '@radix-ui/react-collection@1.0.3': resolution: {integrity: sha512-3SzW+0PW7yBBoQlT8wNcGtaxaD0XSu0uLUFgrtHY08Acx05TaHaOmVLR73c0j/cqpDy53KBMO7s0dx2wmOIDIA==} peerDependencies: @@ -4778,6 +5269,27 @@ packages: '@radix-ui/rect@1.0.1': resolution: {integrity: sha512-fyrgCaedtvMg9NK3en0pnOYJdtfwxUcNolezkNPUsoX57X8oQk+NkqcvzHXD2uKNij6GXmWU9NDru2IWjrO4BQ==} + '@react-aria/focus@3.18.2': + resolution: {integrity: sha512-Jc/IY+StjA3uqN73o6txKQ527RFU7gnG5crEl5Xy3V+gbYp2O5L3ezAo/E0Ipi2cyMbG6T5Iit1IDs7hcGu8aw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-aria/interactions@3.22.2': + resolution: {integrity: sha512-xE/77fRVSlqHp2sfkrMeNLrqf2amF/RyuAS6T5oDJemRSgYM3UoxTbWjucPhfnoW7r32pFPHHgz4lbdX8xqD/g==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-aria/ssr@3.9.5': + resolution: {integrity: sha512-xEwGKoysu+oXulibNUSkXf8itW0npHHTa6c4AyYeZIJyRoegeteYuFpZUBPtIDE8RfHdNsSmE1ssOkxRnwbkuQ==} + engines: {node: '>= 12'} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-aria/utils@3.25.2': + resolution: {integrity: sha512-GdIvG8GBJJZygB4L2QJP1Gabyn2mjFsha73I2wSe+o4DYeGWoJiMZRM06PyTIxLH4S7Sn7eVDtsSBfkc2VY/NA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-native-community/cli-clean@13.6.6': resolution: {integrity: sha512-cBwJTwl0NyeA4nyMxbhkWZhxtILYkbU3TW3k8AXLg+iGphe0zikYMGB3T+haTvTc6alTyEFwPbimk9bGIqkjAQ==} @@ -4919,24 +5431,80 @@ packages: '@react-navigation/routers@6.1.9': resolution: {integrity: sha512-lTM8gSFHSfkJvQkxacGM6VJtBt61ip2XO54aNfswD+KMw6eeZ4oehl7m0me3CR9hnDE4+60iAZR8sAhvCiI3NA==} + '@react-stately/utils@3.10.3': + resolution: {integrity: sha512-moClv7MlVSHpbYtQIkm0Cx+on8Pgt1XqtPx6fy9rQFb2DNc9u1G3AUVnqA17buOkH1vLxAtX4MedlxMWyRCYYA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-types/shared@3.24.1': + resolution: {integrity: sha512-AUQeGYEm/zDTN6zLzdXolDxz3Jk5dDL7f506F07U8tBwxNNI3WRdhU84G0/AaFikOZzDXhOZDr3MhQMzyE7Ydw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@remirror/core-constants@2.0.2': resolution: {integrity: sha512-dyHY+sMF0ihPus3O27ODd4+agdHMEmuRdyiZJ2CCWjPV5UFmn17ZbElvk6WOGVE4rdCJKZQCrPV2BcikOMLUGQ==} - '@remix-run/node@2.9.2': - resolution: {integrity: sha512-2Mt2107pfelz4T+ziDBef3P4A7kgPqCDshnEYCVGxInivJ3HHwAKUcb7MhGa8uMMMA6LMWxbAPYNHPzC3iKv2A==} + '@remix-run/dev@2.12.0': + resolution: {integrity: sha512-/87YQORdlJg5YChd7nVBM/hRXHZA4GfUjhKbZyNrh03bazCQBF+6EsXbzpJ6cCFOpZgecsN0Xv648Qw0VuJjwg==} + engines: {node: '>=18.0.0'} + hasBin: true + peerDependencies: + '@remix-run/react': ^2.12.0 + '@remix-run/serve': ^2.12.0 + typescript: ^5.1.0 + vite: ^5.1.0 + wrangler: ^3.28.2 + peerDependenciesMeta: + '@remix-run/serve': + optional: true + typescript: + optional: true + vite: + optional: true + wrangler: + optional: true + + '@remix-run/express@2.12.0': + resolution: {integrity: sha512-8RmF0TITWxEW20HU5YPreuN0H8rPeShPCQUoMKN1b5zfcQ3E/tD5VWwwXicguQS8ffloc+ejhtQjnWA3drlsgw==} + engines: {node: '>=18.0.0'} + peerDependencies: + express: ^4.19.2 + typescript: ^5.1.0 + peerDependenciesMeta: + typescript: + optional: true + + '@remix-run/node@2.12.0': + resolution: {integrity: sha512-83Jaoc6gpSuD4e6rCk7N5ZHAXNmDw4fJC+kPeDCsd6+wLtTLSi7u9Zo9/Q7moLZ3oyH+aR+LGdkxLULYv+Q6Og==} + engines: {node: '>=18.0.0'} + peerDependencies: + typescript: ^5.1.0 + peerDependenciesMeta: + typescript: + optional: true + + '@remix-run/react@2.12.0': + resolution: {integrity: sha512-Y109tI37Icr0BSU8sWSo8jDPkXaErJ/e1h0fkPvq6LZ0DrlcmHWBxzWJKID431I/KJvhVvBgVCuDamZTRVOZ5Q==} engines: {node: '>=18.0.0'} peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 typescript: ^5.1.0 peerDependenciesMeta: typescript: optional: true - '@remix-run/router@1.16.1': - resolution: {integrity: sha512-es2g3dq6Nb07iFxGk5GuHN20RwBZOsuDQN7izWIisUcv9r+d2C5jQxqmgkdebXgReWfiyUabcki6Fg77mSNrig==} + '@remix-run/router@1.19.2': + resolution: {integrity: sha512-baiMx18+IMuD1yyvOGaHM9QrVUPGGG0jC+z+IPHnRJWUAUvaKuWKyE8gjDj2rzv3sz9zOGoRSPgeBVHRhZnBlA==} engines: {node: '>=14.0.0'} - '@remix-run/server-runtime@2.9.2': - resolution: {integrity: sha512-dX37FEeMVVg7KUbpRhX4hD0nUY0Sscz/qAjU4lYCdd6IzwJGariTmz+bQTXKCjploZuXj09OQZHSOS/ydkUVDA==} + '@remix-run/serve@2.12.0': + resolution: {integrity: sha512-QRWn2prUQXrygiXPl93QCk/xxmnSPMJ/vRZtI6FDYjznyWnroNmyF9MBbg7q/6NbgPfuKBc5QoQzvm1IP1W2pw==} + engines: {node: '>=18.0.0'} + hasBin: true + + '@remix-run/server-runtime@2.12.0': + resolution: {integrity: sha512-o9ukOr3XKmyY8UufTrDdkgD3fiy+z+f4qEzvCQnvC0+EasCyN9hb1Vbui6Koo/5HKvahC4Ga8RcWyvhykKrG3g==} engines: {node: '>=18.0.0'} peerDependencies: typescript: ^5.1.0 @@ -5177,11 +5745,9 @@ packages: '@scalar/snippetz-core@0.1.4': resolution: {integrity: sha512-NMnDzl5dHgUj0k8ZtfssDfy6wv1wO/M+GhpdGr/4OH3m8UZB27CZ3hM7wXh+fm75hZO5XIBsANW20kJVnzpaHg==} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. '@scalar/snippetz-plugin-js-fetch@0.1.1': resolution: {integrity: sha512-9ODfi0OaEvZHdCe09c91eH1R5QPynL+FPxtYuK/9K5ElRE2NqxYysri9AsgOhr1Fqhpy5qKzDj4Gi5FHsJSGXw==} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. '@scalar/snippetz-plugin-js-ofetch@0.1.1': resolution: {integrity: sha512-fPIJlY4q1j5gbnsYSxix0IJ7hqcvm8Ly7iVoK66vaL738AIMiGZMhGKtLrTVPad77PimwO+jeq5iDIZ495UY7Q==} @@ -5189,7 +5755,6 @@ packages: '@scalar/snippetz-plugin-node-fetch@0.1.2': resolution: {integrity: sha512-kD6erA6aAqjHkj+JrJQKqrqcH4fnCrLi2uYw16CmELIGtqVHFau7ew2c087y4OQTltdi5rEk2zj5zOBu9yaS3Q==} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. '@scalar/snippetz-plugin-node-ofetch@0.1.1': resolution: {integrity: sha512-9NpvdMKebg82FkVWoWyOxd1JXAB8KNxmrsFFwQKNjhAw0A5hjNR5oW9lD+FtB1Laupg2FNtw9dcCydnF+LcCWw==} @@ -5197,7 +5762,6 @@ packages: '@scalar/snippetz-plugin-node-undici@0.1.6': resolution: {integrity: sha512-CivUl7wgZ6vlUb01FMdqOt/NVyOWqT0iHZRp5YlPp1pflXZLnAyi5antUTtBEUHUtHM2EO/WR7vx4kRsPcrgLg==} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. '@scalar/snippetz@0.1.6': resolution: {integrity: sha512-z3DEpT/FIZq9yeHL/tz2v6WvdHIiZ4uvK96RdeTPKUUJ0IXvA5vONG3PF5LE0Q/408PCzWsZpGs9f97ztaeJSQ==} @@ -5230,8 +5794,23 @@ packages: '@segment/loosely-validate-event@2.0.0': resolution: {integrity: sha512-ZMCSfztDBqwotkl848ODgVcAmN4OItEWDCkshcKz0/W6gGSQayuuCtWV/MlodFivAZD793d6UgANd6wCXUfrIw==} - '@shikijs/core@1.5.2': - resolution: {integrity: sha512-wSAOgaz48GmhILFElMCeQypSZmj6Ru6DttOOtl3KNkdJ17ApQuGNCfzpk4cClasVrnIu45++2DBwG4LNMQAfaA==} + '@shikijs/core@1.17.5': + resolution: {integrity: sha512-JDgFZbJvfZ1g0lRVHtPTv6n2MwWnbTSGwncL/Qmlg7BZBzHCcDY2CxYGkNUm7k+lljOrFzXFGh38s8CRRZH+TQ==} + + '@shikijs/engine-javascript@1.17.5': + resolution: {integrity: sha512-129knB7yGxq51i5f9ci1lsrC/9rJwo7yzOmHVjQIRk+e1C0caaSwzm4mhLJ506ui0vEmQZ9LzY6a/crW1UsReA==} + + '@shikijs/engine-oniguruma@1.17.5': + resolution: {integrity: sha512-GcuDWdUcs06sCoRS/JwbcO8M55MOvirTs3wIR7E6pMoePJWgAxhIYDQHURvSrgKgyUrTl3EKwujHljivS5BJVA==} + + '@shikijs/transformers@1.17.5': + resolution: {integrity: sha512-yewHT5+G/J2SYuY7fC1W0yk44QiGUlwO/dKUEjEv1EhEfa3hgKsgqErF5IZnH3m1aWkVAMWZNtDf/2GqVKH8Xw==} + + '@shikijs/types@1.17.5': + resolution: {integrity: sha512-xDIczjZ7QB6opNrCObX/6/78Jb/BFglRPo7E7f9swd1TCabhumOLsv23103pNUOMZrJYARUkHJpEx7ryFLM3FA==} + + '@shikijs/vscode-textmate@9.2.2': + resolution: {integrity: sha512-TMp15K+GGYrWlZM8+Lnj9EaHEFmOen0WJBrfa17hF7taDOYthuPPV0GWzfd/9iMij0akS/8Yw2ikquH7uVi/fg==} '@shopify/flash-list@1.6.4': resolution: {integrity: sha512-M2momcnY7swsvmpHIFDVbdOaFw4aQocJXA/lFP0Gpz+alQjFylqVKvszxl4atYO2SNbjxlb2L6hEP9WEcAknGQ==} @@ -5260,6 +5839,14 @@ packages: resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} engines: {node: '>=18'} + '@sindresorhus/slugify@2.2.1': + resolution: {integrity: sha512-MkngSCRZ8JdSOCHRaYd+D01XhvU3Hjy6MGl06zhOk614hp9EOAp5gIkBeQg7wtmxpitU6eAL4kdiRMcJa2dlrw==} + engines: {node: '>=12'} + + '@sindresorhus/transliterate@1.6.0': + resolution: {integrity: sha512-doH1gimEu3A46VX6aVxpHTeHrytJAG6HgdxntYnCFiIFHEM/ZGpG8KiZGBChchjQmG0XFIBL552kBTjVcMZXwQ==} + engines: {node: '>=12'} + '@sinonjs/commons@3.0.1': resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} @@ -5520,23 +6107,18 @@ packages: peerDependencies: react: ^18.0.0 - '@tanstack/react-virtual@3.4.0': - resolution: {integrity: sha512-GZN4xn/Tg5w7gvYeVcMVCeL4pEyUhvg+Cp6KX2Z01C4FRNxIWMgIQ9ibgMarNQfo+gt0PVLcEER4A9sNv/jlow==} + '@tanstack/react-virtual@3.10.7': + resolution: {integrity: sha512-yeP+M0G8D+15ZFPivpuQ5hoM4Fa/PzERBx8P8EGcfEsXX3JOb9G9UUrqc47ZXAxvK+YqzM9T5qlJUYUFOwCZJw==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - '@tanstack/virtual-core@3.4.0': - resolution: {integrity: sha512-75jXqXxqq5M5Veb9KP1STi8kA5u408uOOAefk2ftHDGCpUk3RP6zX++QqfbmHJTBiU72NQ+ghgCZVts/Wocz8Q==} + '@tanstack/virtual-core@3.10.7': + resolution: {integrity: sha512-ND5dfsU0n9F4gROzwNNDJmg6y8n9pI8YWxtgbfJ5UcNn7Hx+MxEXtXcQ189tS7sh8pmCObgz2qSiyRKTZxT4dg==} '@tanstack/virtual-core@3.8.2': resolution: {integrity: sha512-ffpN6kTaPGwQPoWMcBAHbdv2ZCpj1SugldoYAcY0C4xH+Pej1KCOEUisNeEgbUnXOp8Y/4q6wGPu2tFHthOIQw==} - '@tanstack/vue-virtual@3.4.0': - resolution: {integrity: sha512-OHZGsmE89rpouVDGDOCtJTu64gLUzVq5FGkL2YY/wtZXu5QRSi5ep3T25Ivd53HQI3A169H01uwVPD0mEXKm9A==} - peerDependencies: - vue: ^2.7.0 || ^3.0.0 - '@tanstack/vue-virtual@3.8.2': resolution: {integrity: sha512-mVix+nFKajrA+48ky5s7/IYP5/uHHLTz1ZRJfwg2bOLcHUcKyvsLE2UGG4+8hd62ueprWg5MgTudGyR2TYfwpw==} peerDependencies: @@ -5596,14 +6178,6 @@ packages: peerDependencies: '@testing-library/dom': '>=7.21.4' - '@theguild/remark-mermaid@0.0.5': - resolution: {integrity: sha512-e+ZIyJkEv9jabI4m7q29wZtZv+2iwPGsXJ2d46Zi7e+QcFudiyuqhLhHG/3gX3ZEB+hxTch+fpItyMS8jwbIcw==} - peerDependencies: - react: ^18.2.0 - - '@theguild/remark-npm2yarn@0.2.1': - resolution: {integrity: sha512-jUTFWwDxtLEFtGZh/TW/w30ySaDJ8atKWH8dq2/IiQF61dPrGfETpl0WxD0VdBfuLOeU14/kop466oBSRO/5CA==} - '@tiptap/core@2.3.2': resolution: {integrity: sha512-4sMpzYuxiG+fYMwPRXy+mLRVU315KEqzQUcBc2FEgSsmw9Kionykmkq3DvEco7rH8r0NdV/l9R49wVEtX54VqQ==} peerDependencies: @@ -5851,15 +6425,6 @@ packages: '@types/cross-spawn@6.0.6': resolution: {integrity: sha512-fXRhhUkG4H3TQk5dBhQ7m/JDdSNHKwR2BBia62lhwEIq9xGiQKLxd6LymNhn47SjXhsUEPmxi+PKw2OkW4LLjA==} - '@types/d3-scale-chromatic@3.0.3': - resolution: {integrity: sha512-laXM4+1o5ImZv3RpFAsTRn3TEkzqkytiOY0Dz0sq5cnd1dtNlk6sHLon4OvqaiJb28T0S/TdsBI3Sjsy+keJrw==} - - '@types/d3-scale@4.0.8': - resolution: {integrity: sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==} - - '@types/d3-time@3.0.3': - resolution: {integrity: sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==} - '@types/debug@4.1.8': resolution: {integrity: sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ==} @@ -5914,18 +6479,12 @@ packages: '@types/istanbul-reports@3.0.4': resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} - '@types/js-yaml@4.0.5': - resolution: {integrity: sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA==} - '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} '@types/json5@0.0.29': resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - '@types/katex@0.16.2': - resolution: {integrity: sha512-dHsSjSlU/EWEEbeNADr3FtZZOAXPkFPUO457QCnoNqcZQXNqNEu/svQd0Nritvd3wNff4vvC/f4e6xgX3Llt8A==} - '@types/keygrip@1.0.6': resolution: {integrity: sha512-lZuNAY9xeJt7Bx4t4dx0rYCDqGPW8RXhQZK1td7d4H6E9zYbLoOtjBvfwdTKpsyxQI/2jv+armjX/RW+ZNpXOQ==} @@ -5938,14 +6497,14 @@ packages: '@types/mdast@3.0.12': resolution: {integrity: sha512-DT+iNIRNX884cx0/Q1ja7NyUPpZuv0KPyL5rGNxm1WC1OtHstl7n4Jb7nk+xacNShQMbczJjt8uFzznpp6kYBg==} - '@types/mdast@4.0.3': - resolution: {integrity: sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==} + '@types/mdast@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} '@types/mdurl@1.0.5': resolution: {integrity: sha512-6L6VymKTzYSrEf4Nev4Xa1LCHKrlTlYCBMTlQKFuddo1CvQcE52I0mwfOJayueUC7MJuXOeHTcIU683lzd0cUA==} - '@types/mdx@2.0.6': - resolution: {integrity: sha512-sVcwEG10aFU2KcM7cIA0M410UPv/DesOPyG8zMVk0QUDexHA3lYmGucpEpZ2dtWWhi2ip3CG+5g/iH0PwoW4Fw==} + '@types/mdx@2.0.13': + resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==} '@types/micromatch@4.0.7': resolution: {integrity: sha512-C/FMQ8HJAZhTsDpl4wDKZdMeeW5USjgzOczUwTGbRc1ZopPgOhIEnxY2ZgUrsuyy4DwK1JVOJZKFakv3TbCKiA==} @@ -6004,6 +6563,9 @@ packages: '@types/react-dom@18.3.0': resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==} + '@types/react-highlight-words@0.20.0': + resolution: {integrity: sha512-Qm512TiOakvtNzHJ2+TNVHnLn5cJ2wLQV0+LrhuispVth6dRf5b8ydjq3Kc0thpZ7bz4s6RnG6meboAXHWRK+Q==} + '@types/react@18.3.3': resolution: {integrity: sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==} @@ -6028,6 +6590,9 @@ packages: '@types/statuses@2.0.5': resolution: {integrity: sha512-jmIUGWrAiwu3dZpxntxieC+1n/5c3mjrImkmOSQ2NC5uP6cYO4aAZDdSmRcI5C1oiTmqlZGHC+/NmJrKogbP5A==} + '@types/tough-cookie@4.0.5': + resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} + '@types/unist@2.0.7': resolution: {integrity: sha512-cputDpIbFgLUaGQn6Vqg3/YsJwxUwHLO13v3i5ouxT4lat0khip9AEWxtERujXV9wxIB1EyF97BSJFt6vpdI8g==} @@ -6074,8 +6639,8 @@ packages: typescript: optional: true - '@typescript-eslint/parser@6.3.0': - resolution: {integrity: sha512-ibP+y2Gr6p0qsUkhs7InMdXrwldjxZw66wpcQq9/PzAroM45wdwyu81T+7RibNCh8oc0AgrsyCwJByncY0Ongg==} + '@typescript-eslint/parser@6.21.0': + resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 @@ -6104,8 +6669,8 @@ packages: typescript: optional: true - '@typescript-eslint/scope-manager@6.3.0': - resolution: {integrity: sha512-WlNFgBEuGu74ahrXzgefiz/QlVb+qg8KDTpknKwR7hMH+lQygWyx0CQFoUmMn1zDkQjTBBIn75IxtWss77iBIQ==} + '@typescript-eslint/scope-manager@6.21.0': + resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==} engines: {node: ^16.0.0 || >=18.0.0} '@typescript-eslint/scope-manager@7.13.1': @@ -6136,8 +6701,8 @@ packages: typescript: optional: true - '@typescript-eslint/types@6.3.0': - resolution: {integrity: sha512-K6TZOvfVyc7MO9j60MkRNWyFSf86IbOatTKGrpTQnzarDZPYPVy0oe3myTMq7VjhfsUAbNUW8I5s+2lZvtx1gg==} + '@typescript-eslint/types@6.21.0': + resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==} engines: {node: ^16.0.0 || >=18.0.0} '@typescript-eslint/types@7.13.1': @@ -6148,8 +6713,8 @@ packages: resolution: {integrity: sha512-oZQD9HEWQanl9UfsbGVcZ2cGaR0YT5476xfWE0oE5kQa2sNK2frxOlkeacLOTh9po4AlUT5rtkGyYM5kew0z5w==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/typescript-estree@6.3.0': - resolution: {integrity: sha512-Xh4NVDaC4eYKY4O3QGPuQNp5NxBAlEvNQYOqJquR2MePNxO11E5K3t5x4M4Mx53IZvtpW+mBxIT0s274fLUocg==} + '@typescript-eslint/typescript-estree@6.21.0': + resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: typescript: '*' @@ -6187,8 +6752,8 @@ packages: peerDependencies: eslint: ^8.56.0 - '@typescript-eslint/visitor-keys@6.3.0': - resolution: {integrity: sha512-kEhRRj7HnvaSjux1J9+7dBen15CdWmDnwrpyiHsFX6Qx2iW5LOBUgNefOFeh2PjWPlNwN8TOn6+4eBU3J/gupw==} + '@typescript-eslint/visitor-keys@6.21.0': + resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} engines: {node: ^16.0.0 || >=18.0.0} '@typescript-eslint/visitor-keys@7.13.1': @@ -6250,6 +6815,18 @@ packages: peerDependencies: graphql: ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 + '@vanilla-extract/babel-plugin-debug-ids@1.0.6': + resolution: {integrity: sha512-C188vUEYmw41yxg3QooTs8r1IdbDQQ2mH7L5RkORBnHx74QlmsNfqVmKwAVTgrlYt8JoRaWMtPfGm/Ql0BNQrA==} + + '@vanilla-extract/css@1.15.5': + resolution: {integrity: sha512-N1nQebRWnXvlcmu9fXKVUs145EVwmWtMD95bpiEKtvehHDpUhmO1l2bauS7FGYKbi3dU1IurJbGpQhBclTr1ng==} + + '@vanilla-extract/integration@6.5.0': + resolution: {integrity: sha512-E2YcfO8vA+vs+ua+gpvy1HRqvgWbI+MTlUpxA8FvatOvybuNcWAY0CKwQ/Gpj7rswYKtC6C7+xw33emM6/ImdQ==} + + '@vanilla-extract/private@1.0.6': + resolution: {integrity: sha512-ytsG/JLweEjw7DBuZ/0JCN4WAQgM9erfSTdS1NQY778hFQSZ6cfCDEZZ0sgVm4k54uNz6ImKB33AYvSR//fjxw==} + '@vercel/nft@0.26.4': resolution: {integrity: sha512-j4jCOOXke2t8cHZCIxu1dzKLHLcFmYzC3yqAK6MfZznOL1QIJKd0xcFsXK3zcqzU7ScsE2zWkiMMNHGMHgp+FA==} engines: {node: '>=16'} @@ -6299,26 +6876,59 @@ packages: vite: ^5.0.0 vue: ^3.2.25 - '@vitest/coverage-v8@1.6.0': - resolution: {integrity: sha512-KvapcbMY/8GYIG0rlwwOKCVNRc0OL20rrhFkg/CHNzncV03TE2XWvO5w9uZYoxNiMEBacAJt3unSOiZ7svePew==} + '@vitest/browser@2.0.5': + resolution: {integrity: sha512-VbOYtu/6R3d7ASZREcrJmRY/sQuRFO9wMVsEDqfYbWiJRh2fDNi8CL1Csn7Ux31pOcPmmM5QvzFCMpiojvVh8g==} + peerDependencies: + playwright: '*' + safaridriver: '*' + vitest: 2.0.5 + webdriverio: '*' + peerDependenciesMeta: + playwright: + optional: true + safaridriver: + optional: true + webdriverio: + optional: true + + '@vitest/coverage-v8@2.0.5': + resolution: {integrity: sha512-qeFcySCg5FLO2bHHSa0tAZAOnAUbp4L6/A5JDuj9+bt53JREl8hpLjLHEWF0e/gWc8INVpJaqA7+Ene2rclpZg==} peerDependencies: - vitest: 1.6.0 + vitest: 2.0.5 '@vitest/expect@1.6.0': resolution: {integrity: sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==} + '@vitest/expect@2.0.5': + resolution: {integrity: sha512-yHZtwuP7JZivj65Gxoi8upUN2OzHTi3zVfjwdpu2WrvCZPLwsJ2Ey5ILIPccoW23dd/zQBlJ4/dhi7DWNyXCpA==} + + '@vitest/pretty-format@2.0.5': + resolution: {integrity: sha512-h8k+1oWHfwTkyTkb9egzwNMfJAEx4veaPSnMeKbVSjp4euqGSbQlm5+6VHwTr7u4FJslVVsUG5nopCaAYdOmSQ==} + '@vitest/runner@1.6.0': resolution: {integrity: sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg==} + '@vitest/runner@2.0.5': + resolution: {integrity: sha512-TfRfZa6Bkk9ky4tW0z20WKXFEwwvWhRY+84CnSEtq4+3ZvDlJyY32oNTJtM7AW9ihW90tX/1Q78cb6FjoAs+ig==} + '@vitest/snapshot@1.6.0': resolution: {integrity: sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==} + '@vitest/snapshot@2.0.5': + resolution: {integrity: sha512-SgCPUeDFLaM0mIUHfaArq8fD2WbaXG/zVXjRupthYfYGzc8ztbFbu6dUNOblBG7XLMR1kEhS/DNnfCZ2IhdDew==} + '@vitest/spy@1.6.0': resolution: {integrity: sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw==} + '@vitest/spy@2.0.5': + resolution: {integrity: sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA==} + '@vitest/utils@1.6.0': resolution: {integrity: sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==} + '@vitest/utils@2.0.5': + resolution: {integrity: sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ==} + '@volar/language-core@2.2.0-alpha.10': resolution: {integrity: sha512-njVJLtpu0zMvDaEk7K5q4BRpOgbyEUljU++un9TfJoJNhxG0z/hWwpwgTRImO42EKvwIxF3XUzeMk+qatAFy7Q==} @@ -6363,12 +6973,23 @@ packages: '@vue/devtools-core@7.3.3': resolution: {integrity: sha512-i6Bwkx4OwfY0QVHjAdsivhlzZ2HMj7fbNRYJsWspQ+dkA1f3nTzycPqZmVUsm2TGkbQlhTMhCAdDoP97JKoc+g==} + '@vue/devtools-core@7.4.4': + resolution: {integrity: sha512-DLxgA3DfeADkRzhAfm3G2Rw/cWxub64SdP5b+s5dwL30+whOGj+QNhmyFpwZ8ZTrHDFRIPj0RqNzJ8IRR1pz7w==} + peerDependencies: + vue: ^3.0.0 + '@vue/devtools-kit@7.3.3': resolution: {integrity: sha512-m+dFI57BrzKYPKq73mt4CJ5GWld5OLBseLHPHGVP7CaILNY9o1gWVJWAJeF8XtQ9LTiMxZSaK6NcBsFuxAhD0g==} + '@vue/devtools-kit@7.4.4': + resolution: {integrity: sha512-awK/4NfsUG0nQ7qnTM37m7ZkEUMREyPh8taFCX+uQYps/MTFEum0AD05VeGDRMXwWvMmGIcWX9xp8ZiBddY0jw==} + '@vue/devtools-shared@7.3.4': resolution: {integrity: sha512-5S5cHh7oWLZdboujnLteR3rT8UGfKHfA34aGLyFRB/B5TqBxmeLW1Rq32xW6TCDEy4isoYsYHGwJVp6DQcpiDA==} + '@vue/devtools-shared@7.4.5': + resolution: {integrity: sha512-2XgUOkL/7QDmyYI9J7cm+rz/qBhcGv+W5+i1fhwdQ0HQ1RowhdK66F0QBuJSz/5k12opJY8eN6m03/XZMs7imQ==} + '@vue/language-core@2.0.14': resolution: {integrity: sha512-3q8mHSNcGTR7sfp2X6jZdcb4yt8AjBXAfKk0qkZIh7GAJxOnoZ10h5HToZglw4ToFvAnq+xu/Z2FFbglh9Icag==} peerDependencies: @@ -6415,14 +7036,65 @@ packages: '@web3-storage/multipart-parser@1.0.0': resolution: {integrity: sha512-BEO6al7BYqcnfX15W2cnGR+Q566ACXAT9UQykORCWW80lmkpWsnEob6zJS1ZVBKsSJC8+7vJkHwlp+lXG1UCdw==} - '@xmldom/xmldom@0.7.13': - resolution: {integrity: sha512-lm2GW5PkosIzccsaZIz7tp8cPADSIlIHWDFTR1N0SzfinhhYgeIQjFMz4rYzanCScr3DqQLeomUDArp6MWKm+g==} - engines: {node: '>=10.0.0'} + '@webassemblyjs/ast@1.12.1': + resolution: {integrity: sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==} - '@xmldom/xmldom@0.8.10': - resolution: {integrity: sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==} + '@webassemblyjs/floating-point-hex-parser@1.11.6': + resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} + + '@webassemblyjs/helper-api-error@1.11.6': + resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} + + '@webassemblyjs/helper-buffer@1.12.1': + resolution: {integrity: sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==} + + '@webassemblyjs/helper-numbers@1.11.6': + resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} + + '@webassemblyjs/helper-wasm-bytecode@1.11.6': + resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} + + '@webassemblyjs/helper-wasm-section@1.12.1': + resolution: {integrity: sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==} + + '@webassemblyjs/ieee754@1.11.6': + resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} + + '@webassemblyjs/leb128@1.11.6': + resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} + + '@webassemblyjs/utf8@1.11.6': + resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} + + '@webassemblyjs/wasm-edit@1.12.1': + resolution: {integrity: sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==} + + '@webassemblyjs/wasm-gen@1.12.1': + resolution: {integrity: sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==} + + '@webassemblyjs/wasm-opt@1.12.1': + resolution: {integrity: sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==} + + '@webassemblyjs/wasm-parser@1.12.1': + resolution: {integrity: sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==} + + '@webassemblyjs/wast-printer@1.12.1': + resolution: {integrity: sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==} + + '@xmldom/xmldom@0.7.13': + resolution: {integrity: sha512-lm2GW5PkosIzccsaZIz7tp8cPADSIlIHWDFTR1N0SzfinhhYgeIQjFMz4rYzanCScr3DqQLeomUDArp6MWKm+g==} engines: {node: '>=10.0.0'} + '@xmldom/xmldom@0.8.10': + resolution: {integrity: sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==} + engines: {node: '>=10.0.0'} + + '@xtuc/ieee754@1.2.0': + resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + + '@xtuc/long@4.2.2': + resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + '@yarnpkg/fslib@2.10.3': resolution: {integrity: sha512-41H+Ga78xT9sHvWLlFOZLIhtU6mTGZ20pZ29EiZa97vnxdohJD2AF42rCoAoWfqUz486xY6fhjMH+DYEM9r14A==} engines: {node: '>=12 <14 || 14.2 - 14.9 || >14.10.0'} @@ -6517,6 +7189,11 @@ packages: ajv: optional: true + ajv-keywords@3.5.2: + resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + peerDependencies: + ajv: ^6.9.1 + ajv-keywords@5.1.0: resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} peerDependencies: @@ -6528,12 +7205,13 @@ packages: ajv@8.11.0: resolution: {integrity: sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==} - ajv@8.12.0: - resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} - ajv@8.16.0: resolution: {integrity: sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==} + algoliasearch@5.4.1: + resolution: {integrity: sha512-8LpK9JOiZQMUVXGrvieMhgG9rhNXD5TTycBCXMV/KShHFPklMkeHVo+HmFOH3lnQFi74M0Qhs/RXu+dfomCMWQ==} + engines: {node: '>= 14.0.0'} + anser@1.4.10: resolution: {integrity: sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==} @@ -6563,9 +7241,6 @@ packages: resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} engines: {node: '>=12'} - ansi-sequence-parser@1.1.1: - resolution: {integrity: sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg==} - ansi-styles@3.2.1: resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} engines: {node: '>=4'} @@ -6598,9 +7273,6 @@ packages: aproba@2.0.0: resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} - arch@2.2.0: - resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==} - archiver-utils@5.0.2: resolution: {integrity: sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==} engines: {node: '>= 14'} @@ -6617,9 +7289,6 @@ packages: engines: {node: '>=10'} deprecated: This package is no longer supported. - arg@1.0.0: - resolution: {integrity: sha512-Wk7TEzl1KqvTGs/uyhmHO/3XLd3t1UeU4IstvPXVzGPM522cTjqjNZ99esCkcL52sjqjo8e8CTBcWhkxvGzoAw==} - arg@5.0.2: resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} @@ -6700,6 +7369,10 @@ packages: assertion-error@1.1.0: resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + ast-kit@0.12.1: resolution: {integrity: sha512-O+33g7x6irsESUcd47KdfWUrS2F6aGp9KeVJFGj0YjIznfXpBxVGjA0w+y/1OKqX4mFOfmZ9Xpf1ixPT4n9xxw==} engines: {node: '>=16.14.0'} @@ -6858,6 +7531,10 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + basic-auth@2.0.1: + resolution: {integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==} + engines: {node: '>= 0.8'} + before-after-hook@2.2.3: resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==} @@ -6873,6 +7550,9 @@ packages: resolution: {integrity: sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==} engines: {node: '>=0.6'} + big.js@5.2.2: + resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} + binary-extensions@2.2.0: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} engines: {node: '>=8'} @@ -6934,6 +7614,9 @@ packages: browser-assert@1.2.1: resolution: {integrity: sha512-nfulgvOR6S4gt9UKCeGJOuSGBPGiFT6oQ/2UBnvTY/5aQ1PnksW72fhZkM30DzoRRv2WpwZf1vHHEr3mtuXIWQ==} + browserify-zlib@0.1.4: + resolution: {integrity: sha512-19OEpq7vWgsH6WkvkBJQDFvJS1uPcbFOQ4v9CU839dO+ZZXUZO6XpE6hNCqvlIIj+4fZvRiJ6DsAQ382GwiyTQ==} + browserslist@4.23.0: resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} @@ -7024,10 +7707,22 @@ packages: magicast: optional: true + c12@1.11.2: + resolution: {integrity: sha512-oBs8a4uvSDO9dm8b7OCFW7+dgtVrwmwnrVXYzLm43ta7ep2jCn/0MhoUFygIWtxhyy6+/MG7/agvpY0U1Iemew==} + peerDependencies: + magicast: ^0.3.4 + peerDependenciesMeta: + magicast: + optional: true + cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} + cacache@17.1.4: + resolution: {integrity: sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + cacache@18.0.2: resolution: {integrity: sha512-r3NU8h/P+4lVUHfeRw1dtgQYar3DZMm4/cm2bZgOvrFC/su7budSOeqh52VJIC4U4iG1WWwV6vRW0znqBvxNuw==} engines: {node: ^16.14.0 || >=18.0.0} @@ -7096,9 +7791,9 @@ packages: resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} engines: {node: '>=4'} - chalk@2.3.0: - resolution: {integrity: sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==} - engines: {node: '>=4'} + chai@5.1.1: + resolution: {integrity: sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==} + engines: {node: '>=12'} chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} @@ -7137,6 +7832,10 @@ packages: check-error@1.0.3: resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + check-error@2.1.1: + resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} + engines: {node: '>= 16'} + chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} @@ -7153,6 +7852,10 @@ packages: engines: {node: '>=12.13.0'} hasBin: true + chrome-trace-event@1.0.4: + resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} + engines: {node: '>=6.0'} + ci-info@2.0.0: resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} @@ -7212,10 +7915,6 @@ packages: client-only@0.0.1: resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} - clipboardy@1.2.2: - resolution: {integrity: sha512-16KrBOV7bHmHdxcQiCvfUFYVFyEah4FI8vYT1Fr7CGSA4G+xBWMEfUEQJS1hxeHGtI9ju1Bzs9uXSbj5HZKArw==} - engines: {node: '>=4'} - clipboardy@4.0.0: resolution: {integrity: sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w==} engines: {node: '>=18'} @@ -7263,6 +7962,9 @@ packages: codemirror@6.0.1: resolution: {integrity: sha512-J8j+nZ+CdWmIeFIGXEFbFPtpiYacFMDR8GlHK3IyHQJMCaVRfGx9NT+Hxivv1ckLWPvNdZqndbr/7lVhrf/Svg==} + collapse-white-space@2.1.0: + resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==} + color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} @@ -7350,9 +8052,6 @@ packages: resolution: {integrity: sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==} engines: {node: '>= 0.8.0'} - compute-scroll-into-view@3.0.3: - resolution: {integrity: sha512-nadqwNxghAGTamwIqQSG433W6OADZx2vCo3UXHNrzTRHK/htu+7+L0zhjEoaeaQVNAi3YgqWDv8+tzf0hRfR+A==} - computeds@0.0.1: resolution: {integrity: sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==} @@ -7427,9 +8126,6 @@ packages: resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} engines: {node: '>= 0.10'} - cose-base@1.0.3: - resolution: {integrity: sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==} - cosmiconfig@5.2.1: resolution: {integrity: sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==} engines: {node: '>=4'} @@ -7581,154 +8277,6 @@ packages: typescript: optional: true - cytoscape-cose-bilkent@4.1.0: - resolution: {integrity: sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==} - peerDependencies: - cytoscape: ^3.2.0 - - cytoscape@3.29.0: - resolution: {integrity: sha512-ADqhlrCKhhQF8s/s3hTpvVAIyWwsfgFI/hD2vhAXc2ndncJFVZaq3/uBkDIhf4RrNwPw93vUarW36x6rFbUk0Q==} - engines: {node: '>=0.10'} - - d3-array@2.12.1: - resolution: {integrity: sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==} - - d3-array@3.2.4: - resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} - engines: {node: '>=12'} - - d3-axis@3.0.0: - resolution: {integrity: sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==} - engines: {node: '>=12'} - - d3-brush@3.0.0: - resolution: {integrity: sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==} - engines: {node: '>=12'} - - d3-chord@3.0.1: - resolution: {integrity: sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==} - engines: {node: '>=12'} - - d3-color@3.1.0: - resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} - engines: {node: '>=12'} - - d3-contour@4.0.2: - resolution: {integrity: sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==} - engines: {node: '>=12'} - - d3-delaunay@6.0.4: - resolution: {integrity: sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==} - engines: {node: '>=12'} - - d3-dispatch@3.0.1: - resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==} - engines: {node: '>=12'} - - d3-drag@3.0.0: - resolution: {integrity: sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==} - engines: {node: '>=12'} - - d3-dsv@3.0.1: - resolution: {integrity: sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==} - engines: {node: '>=12'} - hasBin: true - - d3-ease@3.0.1: - resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} - engines: {node: '>=12'} - - d3-fetch@3.0.1: - resolution: {integrity: sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==} - engines: {node: '>=12'} - - d3-force@3.0.0: - resolution: {integrity: sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==} - engines: {node: '>=12'} - - d3-format@3.1.0: - resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==} - engines: {node: '>=12'} - - d3-geo@3.1.0: - resolution: {integrity: sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA==} - engines: {node: '>=12'} - - d3-hierarchy@3.1.2: - resolution: {integrity: sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==} - engines: {node: '>=12'} - - d3-interpolate@3.0.1: - resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} - engines: {node: '>=12'} - - d3-path@1.0.9: - resolution: {integrity: sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==} - - d3-path@3.1.0: - resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} - engines: {node: '>=12'} - - d3-polygon@3.0.1: - resolution: {integrity: sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==} - engines: {node: '>=12'} - - d3-quadtree@3.0.1: - resolution: {integrity: sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==} - engines: {node: '>=12'} - - d3-random@3.0.1: - resolution: {integrity: sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==} - engines: {node: '>=12'} - - d3-sankey@0.12.3: - resolution: {integrity: sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==} - - d3-scale-chromatic@3.0.0: - resolution: {integrity: sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==} - engines: {node: '>=12'} - - d3-scale@4.0.2: - resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} - engines: {node: '>=12'} - - d3-selection@3.0.0: - resolution: {integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==} - engines: {node: '>=12'} - - d3-shape@1.3.7: - resolution: {integrity: sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==} - - d3-shape@3.2.0: - resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} - engines: {node: '>=12'} - - d3-time-format@4.1.0: - resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} - engines: {node: '>=12'} - - d3-time@3.1.0: - resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} - engines: {node: '>=12'} - - d3-timer@3.0.1: - resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} - engines: {node: '>=12'} - - d3-transition@3.0.1: - resolution: {integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==} - engines: {node: '>=12'} - peerDependencies: - d3-selection: 2 - 3 - - d3-zoom@3.0.0: - resolution: {integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==} - engines: {node: '>=12'} - - d3@7.8.5: - resolution: {integrity: sha512-JgoahDG51ncUfJu6wX/1vWQEqOflgXyl4MaHqlcSruTez7yhaRKR9i8VjjcQGeS2en/jnFivXuaIMnseMMt0XA==} - engines: {node: '>=12'} - d@1.0.2: resolution: {integrity: sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==} engines: {node: '>=0.12'} @@ -7736,9 +8284,6 @@ packages: dag-map@1.0.2: resolution: {integrity: sha512-+LSAiGFwQ9dRnRdOeaj7g47ZFJcOUPukAP8J3A3fuZ1g9Y44BG+P1sgApjLXTQPOzC4+7S9Wr8kXsfpINM4jpw==} - dagre-d3-es@7.0.10: - resolution: {integrity: sha512-qTCQmEhcynucuaZgY5/+ti3X/rnszKZhEQH/ZdWdtP1tA/y3VoHJzcVrO9pjjJCNpigfscAtoUB5ONcd2wNn0A==} - damerau-levenshtein@1.0.8: resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} @@ -7857,10 +8402,22 @@ packages: dedent-js@1.0.1: resolution: {integrity: sha512-OUepMozQULMLUmhxS95Vudo0jb0UchLimi3+pQ2plj61Fcy8axbP9hbiD4Sz6DPqn6XG3kfmziVfQ1rSys5AJQ==} + dedent@1.5.3: + resolution: {integrity: sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==} + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true + deep-eql@4.1.3: resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} engines: {node: '>=6'} + deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} + engines: {node: '>=6'} + deep-extend@0.6.0: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} engines: {node: '>=4.0.0'} @@ -7868,6 +8425,9 @@ packages: deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + deep-object-diff@1.1.9: + resolution: {integrity: sha512-Rn+RuwkmkDwCi2/oXOFS9Gsr5lJZu/yTGpK7wAaAIE75CC+LCGEZHpY6VQJa/RoJcrmaA/docWJZvYohlNkWPA==} + deepmerge@4.2.2: resolution: {integrity: sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==} engines: {node: '>=0.10.0'} @@ -7926,9 +8486,6 @@ packages: resolution: {integrity: sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==} engines: {node: '>=10'} - delaunator@5.0.0: - resolution: {integrity: sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==} - delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} @@ -8001,6 +8558,10 @@ packages: resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} engines: {node: '>=0.3.1'} + diff@7.0.0: + resolution: {integrity: sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==} + engines: {node: '>=0.3.1'} + difflib@0.2.4: resolution: {integrity: sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==} @@ -8035,9 +8596,6 @@ packages: resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} engines: {node: '>= 4'} - dompurify@3.1.0: - resolution: {integrity: sha512-yoU4rhgPKCo+p5UrWWWNKiIq+ToGqmVVhk0PmMYBK4kRsR3/qhemNFL8f6CFmBd4gMwm3F4T7HBoydP5uY07fA==} - domutils@3.1.0: resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} @@ -8159,21 +8717,26 @@ packages: duplexer@0.1.2: resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} + duplexify@3.7.1: + resolution: {integrity: sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==} + eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - effect@3.4.8: - resolution: {integrity: sha512-qOQNrSSN3ITuAtARtN2Ldq6E5f42splY9VV18LqpKOXMwQCCEWkXdns4by3D2CJnDXQD2KCE0iGcRR2KowiQIA==} + effect-log@0.32.0: + resolution: {integrity: sha512-zlh4S+zBkHeDhiV5IAAXwecqxASVJk9tYNJUb12EuJqgtRGGyhrXYNn8zz5Gk/w7PmnNLTl9Vb6bQo2BFn+J/Q==} + peerDependencies: + effect: ^3.7.0 + + effect@3.7.2: + resolution: {integrity: sha512-pV7l1+LSZFvVObj4zuy4nYiBaC7qZOfrKV6s/Ef4p3KueiQwZFgamazklwyZ+x7Nyj2etRDFvHE/xkThTfQD1w==} electron-to-chromium@1.4.746: resolution: {integrity: sha512-jeWaIta2rIG2FzHaYIhSuVWqC6KJYo7oSBX4Jv7g+aVujKztfvdpf+n6MGwZdC5hQXbax4nntykLH2juIQrfPg==} - elkjs@0.9.3: - resolution: {integrity: sha512-f/ZeWvW/BCXbhGEf1Ujp29EASo/lk1FDnETgNKwJrsVvGZhUWCZyg3xLJjAsxfOmt8KjswHmI5EwCQcPMpOYhQ==} - elysia@0.8.17: resolution: {integrity: sha512-hqKHKUxbvlDHnobudtna5nBoGiZ4oa0xdnhynLAJF3+6gTYHAcQ/8/IyxUx5Az5Uy0zTuNiv7m2bIFu7xeMiWg==} peerDependencies: @@ -8197,6 +8760,10 @@ packages: emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + emojis-list@3.0.0: + resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} + engines: {node: '>= 4'} + encodeurl@1.0.2: resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} engines: {node: '>= 0.8'} @@ -8211,6 +8778,10 @@ packages: resolution: {integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==} engines: {node: '>=10.13.0'} + enhanced-resolve@5.17.1: + resolution: {integrity: sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==} + engines: {node: '>=10.13.0'} + enquirer@2.4.1: resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} engines: {node: '>=8.6'} @@ -8314,6 +8885,12 @@ packages: esbuild: '>=0.12' solid-js: '>= 1.0' + esbuild-plugins-node-modules-polyfill@1.6.6: + resolution: {integrity: sha512-0wDvliv65SCaaGtmoITnmXqqiUzU+ggFupnOgkEo2B9cQ+CUt58ql2+EY6dYoEsoqiHRu2NuTrFUJGMJEgMmLw==} + engines: {node: '>=14.0.0'} + peerDependencies: + esbuild: '>=0.14.0 ^0.23.0' + esbuild-register@3.5.0: resolution: {integrity: sha512-+4G/XmakeBAsvJuDugJvtyF1x+XJT4FMocynNpxrvEBViirpfUn2PgNpCHedfWhF4WokNsO/OvMKrmJOIJsI5A==} peerDependencies: @@ -8324,6 +8901,11 @@ packages: engines: {node: '>=12'} hasBin: true + esbuild@0.17.6: + resolution: {integrity: sha512-TKFRp9TxrJDdRWfSsSERKEovm6v30iHnrjlcGhLBOtReE28Yp1VSBRfO3GTaOFMoxsNerx4TjrhzSuma9ha83Q==} + engines: {node: '>=12'} + hasBin: true + esbuild@0.18.20: resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} engines: {node: '>=12'} @@ -8461,6 +9043,10 @@ packages: peerDependencies: eslint: '>6.6.0' + eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + eslint-scope@7.2.2: resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -8498,6 +9084,10 @@ packages: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} engines: {node: '>=4.0'} + estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + estraverse@5.3.0: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} @@ -8505,15 +9095,30 @@ packages: estree-util-attach-comments@2.1.1: resolution: {integrity: sha512-+5Ba/xGGS6mnwFbXIuQiDPTbuTxuMCooq3arVv7gPZtYpjp+VXH/NkHAP35OOefPhNG/UGqU3vt/LTABwcHX0w==} + estree-util-attach-comments@3.0.0: + resolution: {integrity: sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==} + estree-util-build-jsx@2.2.2: resolution: {integrity: sha512-m56vOXcOBuaF+Igpb9OPAy7f9w9OIkb5yhjsZuaPm7HoGi4oTOQi0h2+yZ+AtKklYFZ+rPC4n0wYCJCEU1ONqg==} + estree-util-build-jsx@3.0.1: + resolution: {integrity: sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==} + + estree-util-is-identifier-name@1.1.0: + resolution: {integrity: sha512-OVJZ3fGGt9By77Ix9NhaRbzfbDV/2rx9EP7YIDJTmsZSEc5kYn2vWcNccYyahJL2uAQZK2a5Or2i0wtIKTPoRQ==} + estree-util-is-identifier-name@2.1.0: resolution: {integrity: sha512-bEN9VHRyXAUOjkKVQVvArFym08BTWB0aJPppZZr0UNyAqWsLaVfAqP7hbaTJjzHifmB5ebnR8Wm7r7yGN/HonQ==} + estree-util-is-identifier-name@3.0.0: + resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} + estree-util-to-js@1.2.0: resolution: {integrity: sha512-IzU74r1PK5IMMGZXUVZbmiu4A1uhiPgW5hm1GjcOfr4ZzHaMPpLNJjR7HjXiIOzi25nZDrgFTobHTkV5Q6ITjA==} + estree-util-to-js@2.0.0: + resolution: {integrity: sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==} + estree-util-value-to-estree@1.3.0: resolution: {integrity: sha512-Y+ughcF9jSUJvncXwqRageavjrNPAI+1M/L3BI3PyLp1nmgYTGUXU6t5z1Y7OWuThoDdhPME07bQU+d5LxdJqw==} engines: {node: '>=12.0.0'} @@ -8521,6 +9126,9 @@ packages: estree-util-visit@1.2.1: resolution: {integrity: sha512-xbgqcrkIVbIG+lI/gzbvd9SGTJL4zqJKBFttUl5pP27KhAjtMKbX/mQXJ7qgyXpMgVy/zvpm0xoQQaGL8OloOw==} + estree-util-visit@2.0.0: + resolution: {integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==} + estree-walker@0.6.1: resolution: {integrity: sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==} @@ -8538,6 +9146,10 @@ packages: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} + eval@0.1.8: + resolution: {integrity: sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==} + engines: {node: '>= 0.8'} + event-emitter@0.3.5: resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==} @@ -8558,10 +9170,6 @@ packages: exec-async@2.2.0: resolution: {integrity: sha512-87OpwcEiMia/DeiKFzaQNBNFeN3XkkpYIh9FyOqq5mS2oKv3CBE67PXoEKcr6nodWdXNogTiQ0jE2NGuoffXPw==} - execa@0.8.0: - resolution: {integrity: sha512-zDWS+Rb1E8BlqqhALSt9kUhss8Qq4nN3iof3gsOdyINksElaPyNBtKUMTR62qhvgVWR0CqCX7sdnKe4MnUbFEA==} - engines: {node: '>=4'} - execa@1.0.0: resolution: {integrity: sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==} engines: {node: '>=6'} @@ -8749,8 +9357,8 @@ packages: resolution: {integrity: sha512-cB507r5T3D55DfclY01GLkninZLfU7HXV/mhVRTnTRm5k2u+fY7Fof2dBkr80p5t7G7dlA/G5dI87QiMdPpMCQ==} engines: {node: '>=18'} - fast-check@3.19.0: - resolution: {integrity: sha512-CO2JX/8/PT9bDGO1iXa5h5ey1skaKI1dvecERyhH4pp3PGjwd3KIjMAXEg79Ps9nclsdt4oPbfqiAnLU0EwrAQ==} + fast-check@3.22.0: + resolution: {integrity: sha512-8HKz3qXqnHYp/VCNn2qfjHdAdcI8zcSqOyX64GOMukp7SL2bfzfeDKjSd+UyECtejccaZv3LcvZTm9YDD22iCQ==} engines: {node: '>=8.0.0'} fast-content-type-parse@1.1.0: @@ -8807,6 +9415,9 @@ packages: fastq@1.17.1: resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + fault@2.0.1: + resolution: {integrity: sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==} + fb-watchman@2.0.2: resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} @@ -8868,8 +9479,8 @@ packages: resolution: {integrity: sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==} engines: {node: '>=6'} - find-my-way-ts@0.1.4: - resolution: {integrity: sha512-naNl2YZ8m9LlYtPZathQBjXQQ8069uYBFq8We6w9AEGddJErVh0JZw8jd/C/2W9Ib3BjTnu+YN0/rR+ytWxNdw==} + find-my-way-ts@0.1.5: + resolution: {integrity: sha512-4GOTMrpGQVzsCH2ruUn2vmwzV/02zF4q+ybhCIrw/Rkt3L8KWcycdC6aJMctJzwN4fXD4SD5F/4B9Sksh5rE0A==} find-my-way@8.1.0: resolution: {integrity: sha512-41QwjCGcVTODUmLLqTMeoHeiozbMXYMAE1CKFiDyi9zVZ2Vjh0yz3MF0WQZoIb+cmzP/XlbFjlF2NtJmvZHznA==} @@ -8904,8 +9515,8 @@ packages: resolution: {integrity: sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==} engines: {node: '>=8'} - flexsearch@0.7.31: - resolution: {integrity: sha512-XGozTsMPYkm+6b5QL3Z9wQcJjNYxp0CYn3U1gO7dwD6PAqU1SVWZxI9CCg3z+ml3YfqdPnrBehaBrnH2AGKbNA==} + flexsearch@0.7.43: + resolution: {integrity: sha512-c5o/+Um8aqCSOXGcZoqZOm+NqtVwNsvVpWv6lfmSclU954O3wvQKxxK8zj74fPaSJbXpSLTs4PRhh+wnoCXnKg==} flow-enums-runtime@0.0.6: resolution: {integrity: sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==} @@ -8914,9 +9525,6 @@ packages: resolution: {integrity: sha512-PUeG8GQLmrv49vEcFcag7mriJvVs7Yyegnv1DGskvcokhP8UyqWsLV0KoTQ1iAW3ePVUIGUc3MFfBaXwz9MmIg==} engines: {node: '>=0.4.0'} - focus-visible@5.2.0: - resolution: {integrity: sha512-Rwix9pBtC1Nuy5wysTmKy+UjbDJpIfg8eHjw0rjZ1mX4GNLz1Bmd16uDpI3Gk1i70Fgcs8Csg2lPm8HULFg9DQ==} - follow-redirects@1.15.6: resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} engines: {node: '>=4.0'} @@ -8948,6 +9556,10 @@ packages: resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} engines: {node: '>= 6'} + format@0.2.2: + resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} + engines: {node: '>=0.4.x'} + formdata-node@4.4.1: resolution: {integrity: sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==} engines: {node: '>= 12.20'} @@ -8963,6 +9575,20 @@ packages: fraction.js@4.3.7: resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + framer-motion@11.5.4: + resolution: {integrity: sha512-E+tb3/G6SO69POkdJT+3EpdMuhmtCh9EWuK4I1DnIC23L7tFPrl8vxP+LSovwaw6uUr73rUbpb4FgK011wbRJQ==} + peerDependencies: + '@emotion/is-prop-valid': '*' + react: ^18.0.0 + react-dom: ^18.0.0 + peerDependenciesMeta: + '@emotion/is-prop-valid': + optional: true + react: + optional: true + react-dom: + optional: true + framework-utils@1.1.0: resolution: {integrity: sha512-KAfqli5PwpFJ8o3psRNs8svpMGyCSAe8nmGcjQ0zZBWN2H6dZDnq+ABp3N3hdUmFeMrLtjOCTXD4yplUJIWceg==} @@ -8977,6 +9603,10 @@ packages: fs-constants@1.0.0: resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + fs-extra@10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + fs-extra@11.2.0: resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} engines: {node: '>=14.14'} @@ -9042,6 +9672,9 @@ packages: peerDependencies: next: '>=13.2.0 <15.0.0-0' + generic-names@4.0.0: + resolution: {integrity: sha512-ySFolZQfw9FoDb3ed9d80Cm9f0+r7qj+HJkWjeD9RBfpxEVTlVhol+gvaQB/78WbwYfbnNh8nWHHBSlg072y6A==} + gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} @@ -9078,13 +9711,13 @@ packages: resolution: {integrity: sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==} engines: {node: '>=4'} + get-port@5.1.1: + resolution: {integrity: sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==} + engines: {node: '>=8'} + get-source@2.0.12: resolution: {integrity: sha512-X5+4+iD+HoSeEED+uwrQ07BOQr0kEDFMVqqpBuI+RaZBpBpHCuXxo70bjar6f0b0u/DQJsJ7ssurpP0V60Az+w==} - get-stream@3.0.0: - resolution: {integrity: sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==} - engines: {node: '>=4'} - get-stream@4.1.0: resolution: {integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==} engines: {node: '>=6'} @@ -9119,9 +9752,6 @@ packages: git-up@7.0.0: resolution: {integrity: sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==} - git-url-parse@13.1.0: - resolution: {integrity: sha512-5FvPJP/70WkIprlUZ33bm4UAaFdjcLkJLpWft1BeZKqwR0uhhNGoKwlUaPtVb4LxCSQ++erHapRak9kWGj+FCA==} - git-url-parse@14.0.0: resolution: {integrity: sha512-NnLweV+2A4nCvn4U/m2AoYu0pPKlsmhK9cknG7IMwsjFY1S2jxM+mAhsDxyxfCIGfGaD+dozsyX4b6vkYc83yQ==} @@ -9147,9 +9777,8 @@ packages: engines: {node: '>=16 || 14 >=14.17'} hasBin: true - glob@10.3.12: - resolution: {integrity: sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==} - engines: {node: '>=16 || 14 >=14.17'} + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} hasBin: true glob@6.0.4: @@ -9244,6 +9873,10 @@ packages: resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} engines: {node: '>=6.0'} + gunzip-maybe@1.4.2: + resolution: {integrity: sha512-4haO1M4mLO91PW57BMsDFf75UmwoRX0GkdD+Faw+Lr+r/OZrOCS0pIBwOL1xCKQqnQzbNFGgK2V2CpBUPeFNTw==} + hasBin: true + gzip-size@6.0.0: resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==} engines: {node: '>=10'} @@ -9269,10 +9902,6 @@ packages: has-bigints@1.0.2: resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} - has-flag@2.0.0: - resolution: {integrity: sha512-P+1n3MnwjR/Epg9BBo1KT8qbye2g2Ou4sFumihwt6I4tsUX7jnLcX4BTOSKg/B1ZrIYMN9FcEnG4x5a7NB8Eng==} - engines: {node: '>=0.10.0'} - has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} @@ -9299,10 +9928,6 @@ packages: has-unicode@2.0.1: resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} - hash-obj@4.0.0: - resolution: {integrity: sha512-FwO1BUVWkyHasWDW4S8o0ssQXjvyghLV2rfVhnN36b2bbcj45eGiuzdn9XOvOpjV3TKQD7Gm2BWNXdE9V4KKYg==} - engines: {node: '>=12'} - hash-sum@2.0.0: resolution: {integrity: sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==} @@ -9313,12 +9938,6 @@ packages: hast-util-embedded@3.0.0: resolution: {integrity: sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA==} - hast-util-from-dom@5.0.0: - resolution: {integrity: sha512-d6235voAp/XR3Hh5uy7aGLbM3S4KamdW0WEgOaU1YoewnuYw4HXb5eRtv9g65m/RFGEfUY1Mw4UqCc5Y8L4Stg==} - - hast-util-from-html-isomorphic@2.0.0: - resolution: {integrity: sha512-zJfpXq44yff2hmE0XmwEOzdWin5xwH+QIhMLOScpX91e/NSGPsAzNCvLQDIEPyO2TXi+lBmU6hjLIhV8MwP2kw==} - hast-util-from-html@2.0.1: resolution: {integrity: sha512-RXQBLMl9kjKVNkJTIO6bZyb2n+cUH8LFaSSzo82jiLT6Tfc+Pt7VQCS+/h3YwG4jaNE2TA2sdJisGWR+aJrp0g==} @@ -9349,9 +9968,18 @@ packages: hast-util-to-estree@2.3.3: resolution: {integrity: sha512-ihhPIUPxN0v0w6M5+IiAZZrn0LH2uZomeWwhn7uP7avZC6TE7lIiEh2yBMPr5+zi1aUCXq6VoYRgs2Bw9xmycQ==} + hast-util-to-estree@3.1.0: + resolution: {integrity: sha512-lfX5g6hqVh9kjS/B9E2gSkvHH4SZNiQFiqWS0x9fENzEl+8W12RqdRxX6d/Cwxi30tPQs3bIO+aolQJNp1bIyw==} + hast-util-to-html@9.0.1: resolution: {integrity: sha512-hZOofyZANbyWo+9RP75xIDV/gq+OUKx+T46IlwERnKmfpwp81XBFbT9mi26ws+SJchA4RVUQwIBJpqEOBhMzEQ==} + hast-util-to-html@9.0.2: + resolution: {integrity: sha512-RP5wNpj5nm1Z8cloDv4Sl4RS8jH5HYa0v93YB6Wb4poEzgMo/dAAL0KcT4974dCjcNG5pkLqTImeFHHCwwfY3g==} + + hast-util-to-jsx-runtime@2.3.0: + resolution: {integrity: sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==} + hast-util-to-parse5@8.0.0: resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==} @@ -9393,6 +10021,9 @@ packages: resolution: {integrity: sha512-cnN7bQUm65UWOy6cbGcCcZ3rpwW8Q/j4OP5aWRhEry4Z2t2aR1cjrbp0BS+KiBN0smvP1caBgAuxutvyvJILzQ==} engines: {node: '>=8'} + highlight-words-core@1.2.2: + resolution: {integrity: sha512-BXUKIkUuh6cmmxzi5OIbUJxrG8OAk2MqoL1DtO3Wo9D2faJg2ph5ntyuQeLqaHJmzER6H5tllCDA9ZnNe9BVGg==} + highlight.js@11.9.0: resolution: {integrity: sha512-fJ7cW7fQGCYAkgv4CPfwFHrfd/cLS4Hau96JuJ+ZTOWhjnhoeN1ub1tFmALm/+lW5z4WCAuAV9bm05AP0mS6Gw==} engines: {node: '>=12.0.0'} @@ -9420,6 +10051,10 @@ packages: resolution: {integrity: sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw==} engines: {node: '>=10'} + hosted-git-info@6.1.1: + resolution: {integrity: sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hosted-git-info@7.0.1: resolution: {integrity: sha512-+K84LB1DYwMHoHSgaOY/Jfhw3ucPmSET5v98Ke/HdNSw4a0UktWzyW1mjhjpuxxTqOOsfWT/7iVshHmVZ4IpOA==} engines: {node: ^16.14.0 || >=18.0.0} @@ -9510,6 +10145,12 @@ packages: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} + icss-utils@5.1.0: + resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} @@ -9572,6 +10213,9 @@ packages: inline-style-parser@0.1.1: resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} + inline-style-parser@0.2.4: + resolution: {integrity: sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==} + inline-style-prefixer@6.0.4: resolution: {integrity: sha512-FwXmZC2zbeeS7NzGjJ6pAiqRhXR0ugUShSNb6GApMl6da0/XGc4MOJsoWAywia52EEWbXNSy0pzkwz/+Y+swSg==} @@ -9583,16 +10227,6 @@ packages: resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} engines: {node: '>= 0.4'} - internmap@1.0.1: - resolution: {integrity: sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==} - - internmap@2.0.3: - resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} - engines: {node: '>=12'} - - intersection-observer@0.12.2: - resolution: {integrity: sha512-7m1vEcPCxXYI8HqnL8CKI6siDyD+eIWSwgB3DZA+ZTogxk9I4CDnj4wilt9x/+/QbHI4YG5YZNmC6458/e9Ktg==} - invariant@2.2.4: resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} @@ -9682,6 +10316,9 @@ packages: is-decimal@2.0.1: resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + is-deflate@1.0.0: + resolution: {integrity: sha512-YDoFpuZWu1VRXlsnlYMzKyVRITXj7Ej/V9gXQ2/pAe7X1J7M/RNOqaIYi6qUn+B7nGyB9pDXrv02dsB58d2ZAQ==} + is-directory@0.3.1: resolution: {integrity: sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==} engines: {node: '>=0.10.0'} @@ -9731,6 +10368,10 @@ packages: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} + is-gzip@1.0.0: + resolution: {integrity: sha512-rcfALRIb1YewtnksfRIHGcIY93QnK8BIQ/2c9yDYcG/Y6+vRoJuTWBmmSEbyLLYtXm7q35pHOHbZFQBaLrhlWQ==} + engines: {node: '>=0.10.0'} + is-hexadecimal@2.0.1: resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} @@ -9788,10 +10429,6 @@ packages: resolution: {integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==} engines: {node: '>=0.10.0'} - is-obj@3.0.0: - resolution: {integrity: sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ==} - engines: {node: '>=12'} - is-path-cwd@2.2.0: resolution: {integrity: sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==} engines: {node: '>=6'} @@ -9941,6 +10578,10 @@ packages: isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + isbot@4.4.0: + resolution: {integrity: sha512-8ZvOWUA68kyJO4hHJdWjyreq7TYNWTS9y15IzeqVdKxR9pPr3P/3r9AHcoIv9M0Rllkao5qWz2v1lmcyKIVCzQ==} + engines: {node: '>=18'} + isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} @@ -9963,8 +10604,8 @@ packages: resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} engines: {node: '>=10'} - istanbul-lib-source-maps@5.0.4: - resolution: {integrity: sha512-wHOoEsNJTVltaJp8eVkm8w+GVkVNHT2YDYo53YdzQEL2gWm1hBX5cGFR9hQJtuGLebidVX7et3+dmDZrmclduw==} + istanbul-lib-source-maps@5.0.6: + resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} engines: {node: '>=10'} istanbul-reports@3.1.7: @@ -9978,6 +10619,12 @@ packages: resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} engines: {node: '>=14'} + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + javascript-stringify@2.1.0: + resolution: {integrity: sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg==} + jest-environment-node@29.7.0: resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -10002,6 +10649,10 @@ packages: resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-worker@27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} + jest-worker@29.7.0: resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -10096,6 +10747,11 @@ packages: engines: {node: '>=4'} hasBin: true + jsesc@3.0.2: + resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} + engines: {node: '>=6'} + hasBin: true + json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} @@ -10109,6 +10765,10 @@ packages: json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + json-parse-even-better-errors@3.0.2: + resolution: {integrity: sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + json-schema-deref-sync@0.13.0: resolution: {integrity: sha512-YBOEogm5w9Op337yb6pAT6ZXDqlxAsQCanM3grid8lMWNxRJO/zWEJi3ZzqDL8boWfwhTFym5EFrNgWwpqcBRg==} engines: {node: '>=6.0.0'} @@ -10134,9 +10794,6 @@ packages: engines: {node: '>=6'} hasBin: true - jsonc-parser@3.2.0: - resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} - jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} @@ -10158,10 +10815,6 @@ packages: just-clone@6.2.0: resolution: {integrity: sha512-1IynUYEc/HAwxhi3WDpIpxJbZpMCvvrrmZVqvj9EhpvbH8lls7HhdhiByjL7DkAaWlLIzpC0Xc/VPvy/UxLNjA==} - katex@0.16.10: - resolution: {integrity: sha512-ZiqaC04tp2O5utMsl2TEZTXxa6WSC4yo0fv5ML++D3QZv/vx2Mct0mTlRx3O+uUkjfuAgOkzsCmq5MiUEsDDdA==} - hasBin: true - keycode@2.2.1: resolution: {integrity: sha512-Rdgz9Hl9Iv4QKi8b0OlCRQEzp4AgVxyCtz5S/+VIHezDmrDhkp2N2TqBWOLz0/gbeREXOOiI9/4b8BY9uw2vFg==} @@ -10171,9 +10824,6 @@ packages: keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - khroma@2.0.0: - resolution: {integrity: sha512-2J8rDNlQWbtiNYThZRvmMv5yt44ZakX+Tz5ZIp/mN1pt4snn+m030Va5Z4v8xA0cQFDXBwO/8i42xL4QPsVk3g==} - kind-of@6.0.3: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} @@ -10209,11 +10859,8 @@ packages: launch-editor@2.8.0: resolution: {integrity: sha512-vJranOAJrI/llyWGRQqiDM+adrw+k83fvmmx3+nV47g3+36xM15jE+zyZ6Ffel02+xSvuM0b2GDRosXZkbb6wA==} - launch-editor@2.8.1: - resolution: {integrity: sha512-elBx2l/tp9z99X5H/qev8uyDywVh0VXAwEbjk8kJhnc5grOFkGh7aW6q55me9xnYbss261XtnUrysZ+XvGbhQA==} - - layout-base@1.0.2: - resolution: {integrity: sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==} + launch-editor@2.9.1: + resolution: {integrity: sha512-Gcnl4Bd+hRO9P9icCP/RVVT2o8SFlPXofuCxvA2SaZuH45whSvf5p8x5oih5ftLiVhEI4sp5xDY+R+b3zJBh5w==} lazystream@1.0.1: resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} @@ -10444,6 +11091,18 @@ packages: resolution: {integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==} engines: {node: '>=6'} + loader-runner@4.3.0: + resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} + engines: {node: '>=6.11.5'} + + loader-utils@2.0.4: + resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} + engines: {node: '>=8.9.0'} + + loader-utils@3.3.1: + resolution: {integrity: sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==} + engines: {node: '>= 12.13.0'} + local-pkg@0.4.3: resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} engines: {node: '>=14'} @@ -10467,8 +11126,8 @@ packages: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} - lodash-es@4.17.21: - resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} lodash.castarray@4.4.0: resolution: {integrity: sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==} @@ -10479,9 +11138,6 @@ packages: lodash.defaults@4.2.0: resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} - lodash.get@4.4.2: - resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} - lodash.isarguments@3.1.0: resolution: {integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==} @@ -10542,6 +11198,9 @@ packages: loupe@2.3.7: resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + loupe@3.1.1: + resolution: {integrity: sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==} + lower-case@2.0.2: resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} @@ -10556,6 +11215,9 @@ packages: resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} engines: {node: 14 || >=16.14} + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + lru-cache@4.1.5: resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} @@ -10566,6 +11228,10 @@ packages: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} + lru-cache@7.18.3: + resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} + engines: {node: '>=12'} + lru-queue@0.1.0: resolution: {integrity: sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==} @@ -10597,6 +11263,9 @@ packages: magicast@0.3.4: resolution: {integrity: sha512-TyDF/Pn36bBji9rWKHlZe+PZb6Mx5V8IHCSxk7X4aljM4e/vyDvZZYwHewdVaqiA0nb3ghfHU/6AUpDxWoER2Q==} + magicast@0.3.5: + resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} + make-dir@2.1.0: resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} engines: {node: '>=6'} @@ -10631,6 +11300,10 @@ packages: resolution: {integrity: sha512-WWC0ZuMzCyDHYCasEGs4IPvLyTGftYwh6wIEOULOF0HXcqZlhwRzrK0w2VUlxWA98xnvb/jszw4ZSkJ6ADpM6Q==} engines: {node: '>=0.10.0'} + markdown-extensions@2.0.0: + resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==} + engines: {node: '>=16'} + markdown-it-task-lists@2.1.1: resolution: {integrity: sha512-TxFAc76Jnhb2OUu+n3yz9RMu4CwGfaT788br6HhEDlvWfdeJcLUsxk1Hgw2yJio0OXsxv7pyIPmvECY7bMbluA==} @@ -10644,9 +11317,6 @@ packages: marky@1.2.5: resolution: {integrity: sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q==} - match-sorter@6.3.1: - resolution: {integrity: sha512-mxybbo3pPNuA+ZuCUhm5bwNkXrJTbsk5VWbR5wiwz/GC6LIiegBGn2w3O08UG/jdbYLinw51fSQ5xNU1U3MgBw==} - md5-file@3.2.3: resolution: {integrity: sha512-3Tkp1piAHaworfcCgH0jKbTvj1jWWFgbvh2cXaNCgHwyTCBxxvD1Y04rmfpvdPm1P4oXMOpm6+2H7sr7v9v8Fw==} engines: {node: '>=0.10'} @@ -10667,9 +11337,6 @@ packages: mdast-util-definitions@6.0.0: resolution: {integrity: sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ==} - mdast-util-find-and-replace@2.2.2: - resolution: {integrity: sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw==} - mdast-util-find-and-replace@3.0.1: resolution: {integrity: sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==} @@ -10679,57 +11346,51 @@ packages: mdast-util-from-markdown@2.0.0: resolution: {integrity: sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==} - mdast-util-gfm-autolink-literal@1.0.3: - resolution: {integrity: sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA==} + mdast-util-frontmatter@1.0.1: + resolution: {integrity: sha512-JjA2OjxRqAa8wEG8hloD0uTU0kdn8kbtOWpPP94NBkfAlbxn4S8gCGf/9DwFtEeGPXrDcNXdiDjVaRdUFqYokw==} mdast-util-gfm-autolink-literal@2.0.0: resolution: {integrity: sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg==} - mdast-util-gfm-footnote@1.0.2: - resolution: {integrity: sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ==} - mdast-util-gfm-footnote@2.0.0: resolution: {integrity: sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==} - mdast-util-gfm-strikethrough@1.0.3: - resolution: {integrity: sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ==} - mdast-util-gfm-strikethrough@2.0.0: resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} - mdast-util-gfm-table@1.0.7: - resolution: {integrity: sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg==} - mdast-util-gfm-table@2.0.0: resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} - mdast-util-gfm-task-list-item@1.0.2: - resolution: {integrity: sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ==} - mdast-util-gfm-task-list-item@2.0.0: resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} - mdast-util-gfm@2.0.2: - resolution: {integrity: sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg==} - mdast-util-gfm@3.0.0: resolution: {integrity: sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==} - mdast-util-math@2.0.2: - resolution: {integrity: sha512-8gmkKVp9v6+Tgjtq6SYx9kGPpTf6FVYRa53/DLh479aldR9AyP48qeVOgNZ5X7QUK7nOy4yw7vg6mbiGcs9jWQ==} - mdast-util-mdx-expression@1.3.2: resolution: {integrity: sha512-xIPmR5ReJDu/DHH1OoIT1HkuybIfRGYRywC+gJtI7qHjCJp/M9jrmBEJW22O8lskDWm562BX2W8TiAwRTb0rKA==} + mdast-util-mdx-expression@2.0.0: + resolution: {integrity: sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw==} + mdast-util-mdx-jsx@2.1.4: resolution: {integrity: sha512-DtMn9CmVhVzZx3f+optVDF8yFgQVt7FghCRNdlIaS3X5Bnym3hZwPbg/XW86vdpKjlc1PVj26SpnLGeJBXD3JA==} + mdast-util-mdx-jsx@3.1.3: + resolution: {integrity: sha512-bfOjvNt+1AcbPLTFMFWY149nJz0OjmewJs3LQQ5pIyVGxP4CdOqNVJL6kTaM5c68p8q82Xv3nCyFfUnuEcH3UQ==} + mdast-util-mdx@2.0.1: resolution: {integrity: sha512-38w5y+r8nyKlGvNjSEqWrhG0w5PmnRA+wnBvm+ulYCct7nsGYhFVb0lljS9bQav4psDAS1eGkP2LMVcZBi/aqw==} + mdast-util-mdx@3.0.0: + resolution: {integrity: sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==} + mdast-util-mdxjs-esm@1.3.1: resolution: {integrity: sha512-SXqglS0HrEvSdUEfoXFtcg7DRl7S2cwOXc7jkuusG472Mmjag34DUDeOJUZtl+BVnyeO1frIgVpHlNRWc2gk/w==} + mdast-util-mdxjs-esm@2.0.1: + resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} + mdast-util-phrasing@3.0.1: resolution: {integrity: sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==} @@ -10763,6 +11424,12 @@ packages: mdurl@2.0.0: resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} + mdx-annotations@0.1.4: + resolution: {integrity: sha512-SUYBUXP1qbgr0nRFFnUBg4HxxTbYyl5rE38fLTaIm0naPK+EhmKa0wRlUdgTMlMBj5gdCMwP1n7+L47JIHHWUQ==} + + media-query-parser@2.0.2: + resolution: {integrity: sha512-1N4qp+jE0pL5Xv4uEcwVUhIkwdUO3S/9gML90nqKA7v7FcOS5vUtatfzok9S9U1EJU8dHWlcv95WLnKmmxZI9w==} + media-typer@0.3.0: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} @@ -10770,6 +11437,9 @@ packages: memoirist@0.1.10: resolution: {integrity: sha512-k2ARHDrSzqeQAWrgvE2NgNj7p5c1LkeFI1VizklJWDXAOTgq7m8mtl0v6W1mVawFNe3DH0hb4BdA91y3vwbqvw==} + memoize-one@4.0.3: + resolution: {integrity: sha512-QmpUu4KqDmX0plH4u+tf0riMc1KHE1+lw95cMrLlXQAFOx/xnBtwhZ52XJxd9X2O6kwKBqX32kmhbhlobD0cuw==} + memoize-one@5.2.1: resolution: {integrity: sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==} @@ -10800,9 +11470,6 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} - mermaid@10.9.0: - resolution: {integrity: sha512-swZju0hFox/B/qoLKK0rOxxgh8Cf7rJSfAUc1u8fezVihYMvrJAS45GzAxTVf4Q+xn9uMgitBcmWk7nWGXOs/g==} - methods@1.1.2: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} engines: {node: '>= 0.6'} @@ -10871,66 +11538,60 @@ packages: micromark-core-commonmark@2.0.0: resolution: {integrity: sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==} - micromark-extension-gfm-autolink-literal@1.0.5: - resolution: {integrity: sha512-z3wJSLrDf8kRDOh2qBtoTRD53vJ+CWIyo7uyZuxf/JAbNJjiHsOpG1y5wxk8drtv3ETAHutCu6N3thkOOgueWg==} + micromark-extension-frontmatter@1.1.1: + resolution: {integrity: sha512-m2UH9a7n3W8VAH9JO9y01APpPKmNNNs71P0RbknEmYSaZU5Ghogv38BYO94AI5Xw6OYfxZRdHZZ2nYjs/Z+SZQ==} micromark-extension-gfm-autolink-literal@2.0.0: resolution: {integrity: sha512-rTHfnpt/Q7dEAK1Y5ii0W8bhfJlVJFnJMHIPisfPK3gpVNuOP0VnRl96+YJ3RYWV/P4gFeQoGKNlT3RhuvpqAg==} - micromark-extension-gfm-footnote@1.1.2: - resolution: {integrity: sha512-Yxn7z7SxgyGWRNa4wzf8AhYYWNrwl5q1Z8ii+CSTTIqVkmGZF1CElX2JI8g5yGoM3GAman9/PVCUFUSJ0kB/8Q==} - micromark-extension-gfm-footnote@2.0.0: resolution: {integrity: sha512-6Rzu0CYRKDv3BfLAUnZsSlzx3ak6HAoI85KTiijuKIz5UxZxbUI+pD6oHgw+6UtQuiRwnGRhzMmPRv4smcz0fg==} - micromark-extension-gfm-strikethrough@1.0.7: - resolution: {integrity: sha512-sX0FawVE1o3abGk3vRjOH50L5TTLr3b5XMqnP9YDRb34M0v5OoZhG+OHFz1OffZ9dlwgpTBKaT4XW/AsUVnSDw==} - micromark-extension-gfm-strikethrough@2.0.0: resolution: {integrity: sha512-c3BR1ClMp5fxxmwP6AoOY2fXO9U8uFMKs4ADD66ahLTNcwzSCyRVU4k7LPV5Nxo/VJiR4TdzxRQY2v3qIUceCw==} - micromark-extension-gfm-table@1.0.7: - resolution: {integrity: sha512-3ZORTHtcSnMQEKtAOsBQ9/oHp9096pI/UvdPtN7ehKvrmZZ2+bbWhi0ln+I9drmwXMt5boocn6OlwQzNXeVeqw==} - micromark-extension-gfm-table@2.0.0: resolution: {integrity: sha512-PoHlhypg1ItIucOaHmKE8fbin3vTLpDOUg8KAr8gRCF1MOZI9Nquq2i/44wFvviM4WuxJzc3demT8Y3dkfvYrw==} - micromark-extension-gfm-tagfilter@1.0.2: - resolution: {integrity: sha512-5XWB9GbAUSHTn8VPU8/1DBXMuKYT5uOgEjJb8gN3mW0PNW5OPHpSdojoqf+iq1xo7vWzw/P8bAHY0n6ijpXF7g==} - micromark-extension-gfm-tagfilter@2.0.0: resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} - micromark-extension-gfm-task-list-item@1.0.5: - resolution: {integrity: sha512-RMFXl2uQ0pNQy6Lun2YBYT9g9INXtWJULgbt01D/x8/6yJ2qpKyzdZD3pi6UIkzF++Da49xAelVKUeUMqd5eIQ==} - micromark-extension-gfm-task-list-item@2.0.1: resolution: {integrity: sha512-cY5PzGcnULaN5O7T+cOzfMoHjBW7j+T9D2sucA5d/KbsBTPcYdebm9zUd9zzdgJGCwahV+/W78Z3nbulBYVbTw==} - micromark-extension-gfm@2.0.3: - resolution: {integrity: sha512-vb9OoHqrhCmbRidQv/2+Bc6pkP0FrtlhurxZofvOEy5o8RtuuvTq+RQ1Vw5ZDNrVraQZu3HixESqbG+0iKk/MQ==} - micromark-extension-gfm@3.0.0: resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} - micromark-extension-math@2.1.2: - resolution: {integrity: sha512-es0CcOV89VNS9wFmyn+wyFTKweXGW4CEvdaAca6SWRWPyYCbBisnjaHLjWO4Nszuiud84jCpkHsqAJoa768Pvg==} - micromark-extension-mdx-expression@1.0.8: resolution: {integrity: sha512-zZpeQtc5wfWKdzDsHRBY003H2Smg+PUi2REhqgIhdzAa5xonhP03FcXxqFSerFiNUr5AWmHpaNPQTBVOS4lrXw==} + micromark-extension-mdx-expression@3.0.0: + resolution: {integrity: sha512-sI0nwhUDz97xyzqJAbHQhp5TfaxEvZZZ2JDqUo+7NvyIYG6BZ5CPPqj2ogUoPJlmXHBnyZUzISg9+oUmU6tUjQ==} + micromark-extension-mdx-jsx@1.0.5: resolution: {integrity: sha512-gPH+9ZdmDflbu19Xkb8+gheqEDqkSpdCEubQyxuz/Hn8DOXiXvrXeikOoBA71+e8Pfi0/UYmU3wW3H58kr7akA==} + micromark-extension-mdx-jsx@3.0.1: + resolution: {integrity: sha512-vNuFb9czP8QCtAQcEJn0UJQJZA8Dk6DXKBqx+bg/w0WGuSxDxNr7hErW89tHUY31dUW4NqEOWwmEUNhjTFmHkg==} + micromark-extension-mdx-md@1.0.1: resolution: {integrity: sha512-7MSuj2S7xjOQXAjjkbjBsHkMtb+mDGVW6uI2dBL9snOBCbZmoNgDAeZ0nSn9j3T42UE/g2xVNMn18PJxZvkBEA==} + micromark-extension-mdx-md@2.0.0: + resolution: {integrity: sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==} + micromark-extension-mdxjs-esm@1.0.5: resolution: {integrity: sha512-xNRBw4aoURcyz/S69B19WnZAkWJMxHMT5hE36GtDAyhoyn/8TuAeqjFJQlwk+MKQsUD7b3l7kFX+vlfVWgcX1w==} + micromark-extension-mdxjs-esm@3.0.0: + resolution: {integrity: sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==} + micromark-extension-mdxjs@1.0.1: resolution: {integrity: sha512-7YA7hF6i5eKOfFUzZ+0z6avRG52GpWR8DL+kN47y3f2KhxbBZMhmxe7auOeaTBrW2DenbbZTf1ea9tA2hDpC2Q==} + micromark-extension-mdxjs@3.0.0: + resolution: {integrity: sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==} + micromark-factory-destination@1.1.0: resolution: {integrity: sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==} @@ -10946,6 +11607,9 @@ packages: micromark-factory-mdx-expression@1.0.9: resolution: {integrity: sha512-jGIWzSmNfdnkJq05c7b0+Wv0Kfz3NJ3N4cBjnbO4zjXIlxJr+f8lk+5ZmwFvqdAbUy2q6B5rCY//g0QAAaXDWA==} + micromark-factory-mdx-expression@2.0.2: + resolution: {integrity: sha512-5E5I2pFzJyg2CtemqAbcyCktpHXuJbABnsb32wX2U8IQKhhVFBqkcZR5LRm1WVoFqa4kTueZK4abep7wdo9nrw==} + micromark-factory-space@1.1.0: resolution: {integrity: sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==} @@ -11009,6 +11673,9 @@ packages: micromark-util-events-to-acorn@1.2.3: resolution: {integrity: sha512-ij4X7Wuc4fED6UoLWkmo0xJQhsktfNh1J0m8g4PbIMPlx+ek/4YdW5mvbye8z/aZvAPUoxgXHrwVlXAPKMRp1w==} + micromark-util-events-to-acorn@2.0.2: + resolution: {integrity: sha512-Fk+xmBrOv9QZnEDguL9OI9/NQQp6Hz4FuQ4YmCb/5V7+9eAh1s6AYSvL20kHkD67YIg7EpE54TiSlcsf3vyZgA==} + micromark-util-html-tag-name@1.2.0: resolution: {integrity: sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==} @@ -11129,6 +11796,10 @@ packages: resolution: {integrity: sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==} engines: {node: '>=10'} + minimatch@9.0.3: + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} + minimatch@9.0.4: resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} engines: {node: '>=16 || 14 >=14.17'} @@ -11140,6 +11811,10 @@ packages: minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + minipass-collect@1.0.2: + resolution: {integrity: sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==} + engines: {node: '>= 8'} + minipass-collect@2.0.1: resolution: {integrity: sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==} engines: {node: '>=16 || 14 >=14.17'} @@ -11172,6 +11847,10 @@ packages: resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} engines: {node: '>=16 || 14 >=14.17'} + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + minizlib@2.1.2: resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} engines: {node: '>= 8'} @@ -11213,6 +11892,13 @@ packages: mnemonist@0.39.6: resolution: {integrity: sha512-A/0v5Z59y63US00cRSLiloEIw3t5G+MiKz4BhX21FI+YBJXBOGW0ohFxTxO08dsOYlzxo87T7vGfZKYp2bcAWA==} + modern-ahocorasick@1.0.1: + resolution: {integrity: sha512-yoe+JbhTClckZ67b2itRtistFKf8yPYelHLc7e5xAwtNAXxM6wJTUx2C7QeVSJFDzKT7bCIFyBVybPMKvmB9AA==} + + morgan@1.10.0: + resolution: {integrity: sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==} + engines: {node: '>= 0.8.0'} + mri@1.2.0: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} engines: {node: '>=4'} @@ -11244,11 +11930,24 @@ packages: typescript: optional: true + msw@2.4.2: + resolution: {integrity: sha512-GImSQGhn19czhVpxPdiUDK8CMZ6jbBcvOhzfJd8KFErjEER2wDKWs1UYaetJs2GSNlAqt6heZYm7g3eLatTcog==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + graphql: '>= 16.8.x' + typescript: '>= 4.8.x' + peerDependenciesMeta: + graphql: + optional: true + typescript: + optional: true + muggle-string@0.4.1: resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} - multipasta@0.2.2: - resolution: {integrity: sha512-KKGdmXIJUmt9BV45LsbUdMnju8eCNSyF9KpbyqK2E3wQXjpPQOg52/Hc+nsmBacmEkNxLVT5h1y3ZgEXB4prXg==} + multipasta@0.2.5: + resolution: {integrity: sha512-c8eMDb1WwZcE02WVjHoOmUVk7fnKU/RmUcosHACglrWAuPQsEJv+E8430sXj6jNc1jHw0zrS16aCjQh4BcEb4A==} mustache@4.2.0: resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} @@ -11317,20 +12016,6 @@ packages: nodemailer: optional: true - next-mdx-remote@4.4.1: - resolution: {integrity: sha512-1BvyXaIou6xy3XoNF4yaMZUCb6vD2GTAa5ciOa6WoO+gAUTYsb1K4rI/HSC2ogAWLrb/7VSV52skz07vOzmqIQ==} - engines: {node: '>=14', npm: '>=7'} - peerDependencies: - react: '>=16.x <=18.x' - react-dom: '>=16.x <=18.x' - - next-seo@6.1.0: - resolution: {integrity: sha512-iMBpFoJsR5zWhguHJvsoBDxDSmdYTHtnVPB1ij+CD0NReQCP78ZxxbdL9qkKIf4oEuZEqZkrjAQLB0bkII7RYA==} - peerDependencies: - next: ^8.1.1-canary.54 || >=9.0.0 - react: '>=16.0.0' - react-dom: '>=16.0.0' - next-sitemap@4.2.3: resolution: {integrity: sha512-vjdCxeDuWDzldhCnyFCQipw5bfpl4HmZA7uoo3GAaYGjGgfL4Cxb1CiztPuWGmS+auYs7/8OekRS8C2cjdAsjQ==} engines: {node: '>=14.18'} @@ -11338,13 +12023,6 @@ packages: peerDependencies: next: '*' - next-themes@0.2.1: - resolution: {integrity: sha512-B+AKNfYNIzh0vqQQKqQItTS8evEouKD7H5Hj3kmuPERwddR2TxvDSFZuTj6T7Jfn1oyeUyJMydPl1Bkxkh0W7A==} - peerDependencies: - next: '*' - react: '*' - react-dom: '*' - next-themes@0.3.0: resolution: {integrity: sha512-/QHIrsYpd6Kfk7xakK4svpDI5mmXP0gfvCoJdGpZQ2TOrQZmsW0QxjaiLn8wbIKjtm4BTSqLoix4lxYYOnLJ/w==} peerDependencies: @@ -11354,8 +12032,15 @@ packages: next-tick@1.1.0: resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} - next@14.2.3: - resolution: {integrity: sha512-dowFkFTR8v79NPJO4QsBUtxv0g9BrS/phluVpMAt2ku7H+cbcBJlopXjkWlwxrk/xGqMemr7JkGPGemPrLLX7A==} + next-view-transitions@0.3.0: + resolution: {integrity: sha512-EfMG4sQR48Q40apCl0rWqTvpDNk4TcdlFjcsGd2ZOBJMNlwfuB8lnwhOL5A0kKWnZwXlMgDPFXY7qwoOY+NhtQ==} + peerDependencies: + next: ^14.0.0 + react: ^18.2.0 + react-dom: ^18.2.0 + + next@14.2.11: + resolution: {integrity: sha512-8MDFqHBhdmR2wdfaWc8+lW3A/hppFe1ggQ9vgIu/g2/2QEMYJrPoQP6b+VNk56gIug/bStysAmrpUKtj3XN8Bw==} engines: {node: '>=18.17.0'} hasBin: true peerDependencies: @@ -11372,22 +12057,6 @@ packages: sass: optional: true - nextra-theme-docs@2.13.4: - resolution: {integrity: sha512-2XOoMfwBCTYBt8ds4ZHftt9Wyf2XsykiNo02eir/XEYB+sGeUoE77kzqfidjEOKCSzOHYbK9BDMcg2+B/2vYRw==} - peerDependencies: - next: '>=9.5.3' - nextra: 2.13.4 - react: '>=16.13.1' - react-dom: '>=16.13.1' - - nextra@2.13.4: - resolution: {integrity: sha512-7of2rSBxuUa3+lbMmZwG9cqgftcoNOVQLTT6Rxf3EhBR9t1EI7b43dted8YoqSNaigdE3j1CoyNkX8N/ZzlEpw==} - engines: {node: '>=16'} - peerDependencies: - next: '>=9.5.3' - react: '>=16.13.1' - react-dom: '>=16.13.1' - nice-try@1.0.5: resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} @@ -11469,9 +12138,6 @@ packages: resolution: {integrity: sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw==} engines: {node: '>=0.12.0'} - non-layered-tidy-tree-layout@2.0.2: - resolution: {integrity: sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw==} - nopt@5.0.0: resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} engines: {node: '>=6'} @@ -11480,6 +12146,10 @@ packages: normalize-package-data@2.5.0: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + normalize-package-data@5.0.0: + resolution: {integrity: sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} @@ -11505,10 +12175,22 @@ packages: resolution: {integrity: sha512-gZLxXdjEzE/+mOstGDqR6b0EkhJ+kM6fxM6vUuckuctuVPh80Q6pw/rSZj9s4Gex9GxWtIicO1pc8DB9KZWudw==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + npm-install-checks@6.3.0: + resolution: {integrity: sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + npm-normalize-package-bin@2.0.0: resolution: {integrity: sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + npm-normalize-package-bin@3.0.1: + resolution: {integrity: sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + npm-package-arg@10.1.0: + resolution: {integrity: sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + npm-package-arg@11.0.2: resolution: {integrity: sha512-IGN0IAwmhDJwy13Wc8k+4PEbTPhpJnMtfR53ZbOyjkvmEcLS4nCwp6mvMWjS5sUjeiW3mpx6cHmuhKEu9XmcQw==} engines: {node: ^16.14.0 || >=18.0.0} @@ -11521,6 +12203,10 @@ packages: engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} hasBin: true + npm-pick-manifest@8.0.2: + resolution: {integrity: sha512-1dKY+86/AIiq1tkKVD3l0WI+Gd3vkknVGAggsFeBkTvbhMQ1OND/LKkYv4JtXPKUJ8bOTCyLiqEg2P6QNdK+Gg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + npm-registry-fetch@17.1.0: resolution: {integrity: sha512-5+bKQRH0J1xG1uZ1zMNvxW0VEyoNWgJpY9UDuluPFLKDfJ9u2JmmjmTJV1srBGQOROfdBMiVvnH2Zvpbm+xkVA==} engines: {node: ^16.14.0 || >=18.0.0} @@ -11537,8 +12223,8 @@ packages: resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - npm-to-yarn@2.2.1: - resolution: {integrity: sha512-O/j/ROyX0KGLG7O6Ieut/seQ0oiTpHF2tXAcFbpdTLQFiaNtkyTXXocM1fwpaa60dg1qpWj0nHlbNhx6qwuENQ==} + npm-to-yarn@3.0.0: + resolution: {integrity: sha512-76YnmsbfrYp0tMsWxM0RNX0Vs+x8JxpJGu6B/jDn4lW8+laiTcKmKi9MeMh4UikO4RkJ1oqURoDy9bXJmMXS6A==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} npmlog@5.0.1: @@ -11674,6 +12360,9 @@ packages: resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} engines: {node: '>=12'} + oniguruma-to-js@0.4.0: + resolution: {integrity: sha512-GwNFPQygkpDjO9MOr54Rqi01dGS+h9VAS//Qxz9lTN5B09CxqiIc7rydvdV+Ex2Z8Vk+zqfHH7hU6ePn8uf+Mg==} + open@10.1.0: resolution: {integrity: sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==} engines: {node: '>=18'} @@ -11743,6 +12432,9 @@ packages: outdent@0.5.0: resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} + outdent@0.8.0: + resolution: {integrity: sha512-KiOAIsdpUTcAXuykya5fnVVT+/5uS0Q1mrkRHcF89tpieSmY33O/tmc54CqwA+bfhbtEfZUNLHaPUiB9X3jt1A==} + outvariant@1.4.2: resolution: {integrity: sha512-Ou3dJ6bA/UJ5GVHxah4LnqDwZRwAmWxrG3wtrHrbGnP4RnLCtA64A4F+ae7Y8ww660JaddSoArUR5HjipWSHAQ==} @@ -11805,10 +12497,16 @@ packages: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} + package-json-from-dist@1.0.0: + resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} + package-json@8.1.1: resolution: {integrity: sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==} engines: {node: '>=14.16'} + pako@0.2.9: + resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==} + parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} @@ -11836,13 +12534,14 @@ packages: parse-latin@5.0.1: resolution: {integrity: sha512-b/K8ExXaWC9t34kKeDV8kGXBkXZ1HCSAZRYE7HR14eA1GlXX5L8iWhs8USJNhQU9q5ci413jCKF0gOyovvyRBg==} + parse-ms@2.1.0: + resolution: {integrity: sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==} + engines: {node: '>=6'} + parse-ms@3.0.0: resolution: {integrity: sha512-Tpb8Z7r7XbbtBTrM9UhpkzzaMrqA2VXMT3YChzYltwV3P3pM6t8wl7TvpMnSTosz1aQAdVib7kdoys7vYOPerw==} engines: {node: '>=12'} - parse-numeric-range@1.3.0: - resolution: {integrity: sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==} - parse-path@7.0.0: resolution: {integrity: sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==} @@ -11900,6 +12599,10 @@ packages: resolution: {integrity: sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==} engines: {node: '>=16 || 14 >=14.17'} + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + path-to-regexp@0.1.7: resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} @@ -11920,6 +12623,13 @@ packages: pathval@1.1.1: resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + pathval@2.0.0: + resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} + engines: {node: '>= 14.16'} + + peek-stream@1.1.3: + resolution: {integrity: sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA==} + perfect-debounce@1.0.0: resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} @@ -11944,6 +12654,11 @@ packages: resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} engines: {node: '>=12'} + pidtree@0.6.0: + resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} + engines: {node: '>=0.10'} + hasBin: true + pify@2.3.0: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} engines: {node: '>=0.10.0'} @@ -12029,6 +12744,12 @@ packages: peerDependencies: postcss: ^8.4.31 + postcss-discard-duplicates@5.1.0: + resolution: {integrity: sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + postcss-discard-duplicates@6.0.3: resolution: {integrity: sha512-+JA0DCvc5XvFAxwx6f/e68gQu/7Z9ud584VLmcgto28eB8FqSFZwtrLwB5Kcp70eIoWP/HXqz4wpo8rD8gpsTw==} engines: {node: ^14 || ^16 || >=18.0} @@ -12137,6 +12858,35 @@ packages: peerDependencies: postcss: ^8.4.31 + postcss-modules-extract-imports@3.1.0: + resolution: {integrity: sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-local-by-default@4.0.5: + resolution: {integrity: sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-scope@3.2.0: + resolution: {integrity: sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-values@4.0.0: + resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules@6.0.0: + resolution: {integrity: sha512-7DGfnlyi/ju82BRzTIjWS5C4Tafmzl3R79YP/PASiocj+aa6yYphHhhKUOEoXQToId5rgyFgJ88+ccOUydjBXQ==} + peerDependencies: + postcss: ^8.0.0 + postcss-nested@6.0.1: resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} engines: {node: '>=12.0'} @@ -12364,6 +13114,10 @@ packages: pretty-format@3.8.0: resolution: {integrity: sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==} + pretty-ms@7.0.1: + resolution: {integrity: sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==} + engines: {node: '>=10'} + pretty-ms@8.0.0: resolution: {integrity: sha512-ASJqOugUF1bbzI35STMBUpZqdfYKlJugy6JBziGi2EE+AL5JPJGSzvpeVXojxrr0ViUYoToUjb5kjSEGf7Y83Q==} engines: {node: '>=14.16'} @@ -12375,6 +13129,10 @@ packages: resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==} engines: {node: '>=6'} + proc-log@3.0.0: + resolution: {integrity: sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + proc-log@4.2.0: resolution: {integrity: sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -12393,6 +13151,14 @@ packages: resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} engines: {node: '>=0.4.0'} + promise-inflight@1.0.1: + resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} + peerDependencies: + bluebird: '*' + peerDependenciesMeta: + bluebird: + optional: true + promise-retry@2.0.1: resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} engines: {node: '>=10'} @@ -12487,14 +13253,23 @@ packages: pseudomap@1.0.2: resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} + psl@1.9.0: + resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} + publint@0.2.7: resolution: {integrity: sha512-tLU4ee3110BxWfAmCZggJmCUnYWgPTr0QLnx08sqpLYa8JHRiOudd+CgzdpfU5x5eOaW2WMkpmOrFshRFYK7Mw==} engines: {node: '>=16'} hasBin: true + pump@2.0.1: + resolution: {integrity: sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==} + pump@3.0.0: resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + pumpify@1.5.1: + resolution: {integrity: sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==} + punycode.js@2.3.1: resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} engines: {node: '>=6'} @@ -12530,6 +13305,9 @@ packages: engines: {node: '>=0.4.x'} deprecated: The querystring API is considered Legacy. new code should use the URLSearchParams API instead. + querystringify@2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -12602,6 +13380,11 @@ packages: peerDependencies: react: '>=17.0.0' + react-highlight-words@0.20.0: + resolution: {integrity: sha512-asCxy+jCehDVhusNmCBoxDf2mm1AJ//D+EzDx1m5K7EqsMBIHdZ5G4LdwbSEXqZq1Ros0G0UySWmAtntSph7XA==} + peerDependencies: + react: ^0.14.0 || ^15.0.0 || ^16.0.0-0 || ^17.0.0-0 || ^18.0.0-0 + react-image-crop@11.0.5: resolution: {integrity: sha512-A/Y/kspOzki1zDL/bSgwWIY1X3CQ9F1QwpdnncWLBVAktnKfAZDIQnWmjXzuzEjZHDMsBlArytIcPBVi6DNklg==} peerDependencies: @@ -12722,6 +13505,19 @@ packages: '@types/react': optional: true + react-router-dom@6.26.2: + resolution: {integrity: sha512-z7YkaEW0Dy35T3/QKPYB1LjMK2R1fxnHO8kWpUMTBdfVzZrWOiY9a7CtN8HqdWtDUWd5FY6Dl8HFsqVwH4uOtQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: '>=16.8' + react-dom: '>=16.8' + + react-router@6.26.2: + resolution: {integrity: sha512-tvN1iuT03kHgOFnLPfLJ8V95eijteveqdOSk+srqfePtQvqCExB8eHOYnlilbOcyJyKnYkr1vJvf7YqotAJu1A==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: '>=16.8' + react-selecto@1.26.3: resolution: {integrity: sha512-Ubik7kWSnZyQEBNro+1k38hZaI1tJarE+5aD/qsqCOA1uUBSjgKVBy3EWRzGIbdmVex7DcxznFZLec/6KZNvwQ==} @@ -12777,9 +13573,6 @@ packages: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} - reading-time@1.5.0: - resolution: {integrity: sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==} - readline@1.3.0: resolution: {integrity: sha512-k2d6ACCkiNYz222Fs/iNze30rRJ1iIicW7JuX/7/cozvih6YCkFZH+J6mAFDVgv0dRBaAyr4jDqC95R2y4IADg==} @@ -12799,6 +13592,9 @@ packages: resolution: {integrity: sha512-Hx/BGIbwj+Des3+xy5uAtAbdCyqK9y9wbBcDFDYanLS9JnMqf7OeF87HQwUimE87OEc72mr6tkKUKMBBL+hF9Q==} engines: {node: '>= 4'} + recma-import-images@0.0.3: + resolution: {integrity: sha512-XoPDnUP8XVH13UrSfvdawq3gcZYoOVRoW2CtYHMR68hRejCAhLmgjjgPY/Xf1Ftkjj5ASD8wx9eVNjYTW2yWbw==} + recyclerlistview@4.2.0: resolution: {integrity: sha512-uuBCi0c+ggqHKwrzPX4Z/mJOzsBbjZEAwGGmlwpD/sD7raXixdAbdJ6BTcAmuWG50Cg4ru9p12M94Njwhr/27A==} peerDependencies: @@ -12837,6 +13633,9 @@ packages: regenerator-transform@0.15.2: resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} + regex@4.3.2: + resolution: {integrity: sha512-kK/AA3A9K6q2js89+VMymcboLOlF5lZRCYJv3gzszXFHBr6kO6qLGzbm+UIugBEV8SMMKCTR59txoY6ctRHYVw==} + regexp.prototype.flags@1.5.2: resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} engines: {node: '>= 0.4'} @@ -12863,21 +13662,12 @@ packages: rehype-format@5.0.0: resolution: {integrity: sha512-kM4II8krCHmUhxrlvzFSptvaWh280Fr7UGNJU5DCMuvmAwGCNmGfi9CvFAQK6JDjsNoRMWQStglK3zKJH685Wg==} - rehype-katex@7.0.0: - resolution: {integrity: sha512-h8FPkGE00r2XKU+/acgqwWUlyzve1IiOKwsEkg4pDL3k48PiE0Pt+/uLtVHDVkN1yA4iurZN6UES8ivHVEQV6Q==} - rehype-minify-whitespace@6.0.0: resolution: {integrity: sha512-i9It4YHR0Sf3GsnlR5jFUKXRr9oayvEk9GKQUkwZv6hs70OH9q3OCZrq9PpLvIGKt3W+JxBOxCidNVpH/6rWdA==} rehype-parse@9.0.0: resolution: {integrity: sha512-WG7nfvmWWkCR++KEkZevZb/uw41E8TsH4DsY9UxsTbIXCVGbAs4S+r8FrQ+OtH5EEQAs+5UxKC42VinkmpA1Yw==} - rehype-pretty-code@0.9.11: - resolution: {integrity: sha512-Eq90eCYXQJISktfRZ8PPtwc5SUyH6fJcxS8XOMnHPUQZBtC6RYo67gGlley9X2nR8vlniPj0/7oCDEYHKQa/oA==} - engines: {node: '>=16'} - peerDependencies: - shiki: '*' - rehype-raw@7.0.0: resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} @@ -12890,27 +13680,28 @@ packages: rehype@13.0.1: resolution: {integrity: sha512-AcSLS2mItY+0fYu9xKxOu1LhUZeBZZBx8//5HKzF+0XP+eP8+6a5MXn2+DW2kfXR6Dtp1FEXMVrjyKAcvcU8vg==} - remark-gfm@3.0.1: - resolution: {integrity: sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==} + remark-frontmatter@4.0.1: + resolution: {integrity: sha512-38fJrB0KnmD3E33a5jZC/5+gGAC2WKNiPw1/fdXJvijBlhA7RCsvJklrYJakS0HedninvaCYW8lQGf9C918GfA==} remark-gfm@4.0.0: resolution: {integrity: sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==} - remark-math@5.1.1: - resolution: {integrity: sha512-cE5T2R/xLVtfFI4cCePtiRn+e6jKMtFDR3P8V3qpv8wpKjwvHoBA4eJzvX+nVrnlNy0911bdGmuspCSwetfYHw==} + remark-mdx-frontmatter@1.1.1: + resolution: {integrity: sha512-7teX9DW4tI2WZkXS4DBxneYSY7NHiXl4AKdWDO9LXVweULlCT8OPWsOjLEnMIXViN1j+QcY8mfbq3k0EK6x3uA==} + engines: {node: '>=12.2.0'} remark-mdx@2.3.0: resolution: {integrity: sha512-g53hMkpM0I98MU266IzDFMrTD980gNF3BJnkyFcmN+dD873mQeD5rdMO3Y2X+x8umQfbSE0PcoEDl7ledSA+2g==} + remark-mdx@3.0.1: + resolution: {integrity: sha512-3Pz3yPQ5Rht2pM5R+0J2MrGoBSrzf+tJG94N+t/ilfdh8YLyyKYtidAYwTveB20BoHAcwIopOUqhcmh2F7hGYA==} + remark-parse@10.0.2: resolution: {integrity: sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==} remark-parse@11.0.0: resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} - remark-reading-time@2.0.1: - resolution: {integrity: sha512-fy4BKy9SRhtYbEHvp6AItbRTnrhiDGbqLQTSYVbQPGuRCncU1ubSsh9p/W5QZSxtYcUXv8KGL0xBgPLyNJA1xw==} - remark-rehype@10.1.0: resolution: {integrity: sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==} @@ -12924,8 +13715,11 @@ packages: remark-stringify@11.0.0: resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} - remove-accents@0.4.2: - resolution: {integrity: sha512-7pXIJqJOq5tFgG1A2Zxti3Ht8jJF337m4sowbuHsW30ZnkQFnDzy9qBNhgzX8ZLW4+UBcXiiR7SwR6pokHsxiA==} + remark-unwrap-images@4.0.0: + resolution: {integrity: sha512-Ilr5ZhrhZSvnjemy1rRuxlTC0I/39YyWDRiE9d5vF079APcwdYYzwcZL8RGehlCtQCiik8hWMyo4Xhz2Fq0JhA==} + + remark@15.0.1: + resolution: {integrity: sha512-Eht5w30ruCXgFmxVUSlNWQ9iiimq07URKeFS3hNc8cUWy1llX4KDWfyEDZRycMc+znsN9Ux5/tJ/BFdgdOwA3A==} remove-trailing-slash@0.1.1: resolution: {integrity: sha512-o4S4Qh6L2jpnCy83ysZDau+VORNvnFw07CKSAymkd6ICNVEPisMyzlc00KlvvicsxKck94SEwhDnMNdICzO+tA==} @@ -12938,6 +13732,9 @@ packages: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} + require-like@0.1.2: + resolution: {integrity: sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A==} + require-main-filename@2.0.0: resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} @@ -13044,9 +13841,6 @@ packages: deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true - robust-predicates@3.0.2: - resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} - rollup-plugin-dts@6.1.0: resolution: {integrity: sha512-ijSCPICkRMDKDLBK9torss07+8dl9UpY9z1N/zTeA1cIqdzMlpkV3MOOC7zukyvQfDyxa1s3Dl2+DeiP/G6DOw==} engines: {node: '>=16'} @@ -13110,9 +13904,6 @@ packages: run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - rw@1.3.3: - resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} - rxjs@7.8.1: resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} @@ -13159,16 +13950,20 @@ packages: scheduler@0.24.0-canary-efb381bbf-20230505: resolution: {integrity: sha512-ABvovCDe/k9IluqSh4/ISoq8tIJnW8euVAWYt5j/bg6dRnqwQwiGO1F/V4AyK96NGF/FB04FhOUDuWj8IKfABA==} + schema-utils@3.3.0: + resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} + engines: {node: '>= 10.13.0'} + schema-utils@4.2.0: resolution: {integrity: sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==} engines: {node: '>= 12.13.0'} - scroll-into-view-if-needed@3.1.0: - resolution: {integrity: sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==} - scule@1.3.0: resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==} + search-insights@2.17.2: + resolution: {integrity: sha512-zFNpOpUO+tY2D85KrxJ+aqwnIfdEGi06UH2+xEb+Bp9Mwznmauqc9djbnBibJO5mpfUPPa8st6Sx65+vbeO45g==} + section-matter@1.0.0: resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} engines: {node: '>=4'} @@ -13274,6 +14069,10 @@ packages: resolution: {integrity: sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==} engines: {node: '>=14.15.0'} + sharp@0.33.1: + resolution: {integrity: sha512-iAYUnOdTqqZDb3QjMneBKINTllCJDZ3em6WaWy7NPECM4aHncvqHRm0v0bN9nqJxMiwamv5KIdauJ6lUzKDpTQ==} + engines: {libvips: '>=8.15.0', node: ^18.17.0 || ^20.3.0 || >=21.0.0} + shebang-command@1.2.0: resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} engines: {node: '>=0.10.0'} @@ -13293,11 +14092,8 @@ packages: shell-quote@1.8.1: resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} - shiki@0.14.3: - resolution: {integrity: sha512-U3S/a+b0KS+UkTyMjoNojvTgrBHjgp7L6ovhFVZsXmBGnVdQ4K4U9oK0z63w538S91ATngv1vXigHCSWOwnr+g==} - - shiki@1.5.2: - resolution: {integrity: sha512-fpPbuSaatinmdGijE7VYUD3hxLozR3ZZ+iAx8Iy2X6REmJGyF5hQl94SgmiUNTospq346nXUVZx0035dyGvIVw==} + shiki@1.17.5: + resolution: {integrity: sha512-8i4+fbTlnJPUYkgBEZ92QKmK3Gr23n2YVwqwyz0e+VmXqKpJZuV6P/CY00gSGHDXXjXT5l0BLwsMfO2Pe52TLQ==} shikiji-core@0.9.19: resolution: {integrity: sha512-AFJu/vcNT21t0e6YrfadZ+9q86gvPum6iywRyt1OtIPjPFe25RQnYJyxHQPMLKCCWA992TPxmEmbNcOZCAJclw==} @@ -13324,12 +14120,18 @@ packages: simple-concat@1.0.1: resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + simple-functional-loader@1.2.1: + resolution: {integrity: sha512-GPDrxrQkE7ijm35QlfPFVp5hBHR6ZcaUq42TEDgf1U5iTL3IDLFvKAbHE/ODqpdfJJ7Xn4cr/slBn12jjNPkaQ==} + simple-get@4.0.1: resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} simple-git@3.25.0: resolution: {integrity: sha512-KIY5sBnzc4yEcJXW7Tdv4viEz8KyG+nU0hay+DWZasvdFOYKeUZ6Xc25LUHHjw0tinPT7O1eY6pzX7pRT1K8rw==} + simple-git@3.26.0: + resolution: {integrity: sha512-5tbkCSzuskR6uA7uA23yjasmA0RzugVo8QM2bpsnxkrgP13eisFT7TMS4a+xKEJvbmr4qf+l0WT3eKa9IxxUyw==} + simple-plist@1.3.1: resolution: {integrity: sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw==} @@ -13421,10 +14223,6 @@ packages: resolution: {integrity: sha512-J69LQ22xrQB1cIFJhPfgtLuI6BpWRiWu1Y3vSsIwK/eAScqJxd/+CJlUuHQRdX2C9NGFamq+KqNywGgaThwfHw==} hasBin: true - sort-keys@5.0.0: - resolution: {integrity: sha512-Pdz01AvCAottHTPQGzndktFNdbRA75BgOfeT1hH+AMnJFv8lynkPi42rfeEhpx1saTEI3YNMWxfqu0sFD1G8pw==} - engines: {node: '>=12'} - source-map-js@1.2.0: resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} engines: {node: '>=0.10.0'} @@ -13491,6 +14289,9 @@ packages: sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + sqids@0.3.0: + resolution: {integrity: sha512-lOQK1ucVg+W6n3FhRwwSeUijxe93b51Bfz5PMRMihVf1iVkl82ePQG7V5vwrhzB11v0NtsR25PSZRGiSomJaJw==} + ssri@10.0.5: resolution: {integrity: sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -13546,6 +14347,9 @@ packages: resolution: {integrity: sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==} engines: {node: '>= 0.10.0'} + stream-shift@1.0.3: + resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} + stream-slice@0.1.2: resolution: {integrity: sha512-QzQxpoacatkreL6jsxnVb7X5R/pGw9OUv2qWTYWnmLpg4NdN31snPy/f3TdQE1ZUXaThRvj1Zw4/OGg0ZkaLMA==} @@ -13566,6 +14370,9 @@ packages: resolution: {integrity: sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==} engines: {node: '>=4'} + string-hash@1.1.3: + resolution: {integrity: sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A==} + string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -13669,6 +14476,9 @@ packages: style-to-object@0.4.2: resolution: {integrity: sha512-1JGpfPB3lo42ZX8cuPrheZbfQ6kqPPnPHlKMyeRYtfKD+0jG+QsXgXN57O/dvJlzlB2elI6dGmrPnl5VPQFPaA==} + style-to-object@1.0.8: + resolution: {integrity: sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==} + styled-jsx@5.1.1: resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} engines: {node: '>= 12.0.0'} @@ -13691,9 +14501,6 @@ packages: styleq@0.1.3: resolution: {integrity: sha512-3ZUifmCDCQanjeej1f6kyl/BeP/Vae5EYkQ9iJfUm/QwZvlgnZzyflqAsAWYURdtea8Vkvswu2GrC57h3qffcA==} - stylis@4.3.0: - resolution: {integrity: sha512-E87pIogpwUsUwXw7dNyU4QDjdgVMy52m+XEOPEKUn161cCzWjjhPSQhByfd1CcNvrOLnXQ6OnnZDwnJrz/Z4YQ==} - sucrase@3.34.0: resolution: {integrity: sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==} engines: {node: '>=8'} @@ -13712,10 +14519,6 @@ packages: resolution: {integrity: sha512-8iGv75BYOa0xRJHK5vRLEjE2H/i4lulTjzpUXic3Eg8akftYjkmQDa8JARQ42rlczXyFR3IeRoeFCc7RxHsYZA==} engines: {node: '>=16'} - supports-color@4.5.0: - resolution: {integrity: sha512-ycQR/UbvI9xIlEdQT1TQqwoXtEldExbCEAJgRo5YXlmSKjv6ThHnP9/vwGa1gr19Gfw+LkFd7KqYMhzrRC5JYw==} - engines: {node: '>=4'} - supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} @@ -13830,6 +14633,9 @@ packages: resolution: {integrity: sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA==} engines: {node: '>=18'} + tabbable@6.2.0: + resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} + tailwind-merge@2.3.0: resolution: {integrity: sha512-vkYrLpIP+lgR0tQCG6AP7zZXCTLc1Lnv/CCRT3BqJ9CZ3ui2++GPaGb1x/ILsINIMSYqqvrpqjUFsMNLlW99EA==} @@ -13909,14 +14715,35 @@ packages: peerDependencies: solid-js: ^1.8 + terser-webpack-plugin@5.3.10: + resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + terser@5.19.2: resolution: {integrity: sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==} engines: {node: '>=10'} hasBin: true - test-exclude@6.0.0: - resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} - engines: {node: '>=8'} + terser@5.32.0: + resolution: {integrity: sha512-v3Gtw3IzpBJ0ugkxEX8U0W6+TnPKRRCWGh1jC/iM/e3Ki5+qvO1L1EAZ56bZasc64aXHwRHNIQEzm6//i5cemQ==} + engines: {node: '>=10'} + hasBin: true + + test-exclude@7.0.1: + resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==} + engines: {node: '>=18'} text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} @@ -13955,18 +14782,30 @@ packages: tinybench@2.8.0: resolution: {integrity: sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==} - tinyglobby@0.2.5: - resolution: {integrity: sha512-Dlqgt6h0QkoHttG53/WGADNh9QhcjCAIZMTERAVhdpmIBEejSuLI9ZmGKWzB7tweBjlk30+s/ofi4SLmBeTYhw==} + tinyglobby@0.2.6: + resolution: {integrity: sha512-NbBoFBpqfcgd1tCiO8Lkfdk+xrA7mlLR9zgvZcZWQQwU63XAfUePyd6wZBaU93Hqw347lHnwFzttAkemHzzz4g==} engines: {node: '>=12.0.0'} tinypool@0.8.4: resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==} engines: {node: '>=14.0.0'} + tinypool@1.0.1: + resolution: {integrity: sha512-URZYihUbRPcGv95En+sz6MfghfIc2OJ1sv/RmhWZLouPY0/8Vo80viwPvg3dlaS9fuq7fQMEfgRRK7BBZThBEA==} + engines: {node: ^18.0.0 || >=20.0.0} + + tinyrainbow@1.2.0: + resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==} + engines: {node: '>=14.0.0'} + tinyspy@2.2.1: resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} engines: {node: '>=14.0.0'} + tinyspy@3.0.0: + resolution: {integrity: sha512-q5nmENpTHgiPVd1cJDDc9cVoYN5x4vCvwT3FMilvKPKneCBZAxn2YWQjDF0UMcE9k0Cay1gBiDfTMU0g+mPMQA==} + engines: {node: '>=14.0.0'} + tippy.js@6.3.7: resolution: {integrity: sha512-E1d3oP2emgJ9dRQZdf3Kkn0qJgI6ZLpyS5z6ZkY1DF3kaQaBsGZsndEpHwx+eC+tYM41HaSNvNtLx8tU57FzTQ==} @@ -13981,14 +14820,6 @@ packages: peerDependencies: '@tiptap/core': ^2.0.3 - title@3.5.3: - resolution: {integrity: sha512-20JyowYglSEeCvZv3EZ0nZ046vLarO37prvV0mbtQV7C8DJPGgN967r8SJkqd3XK3K3lD3/Iyfp3avjfil8Q2Q==} - hasBin: true - - titleize@1.0.0: - resolution: {integrity: sha512-TARUb7z1pGvlLxgPk++7wJ6aycXF3GJ0sNSBTAsTuJrQG5QuZlkUQP+zl+nbjAh4gMX9yDw9ZYklMd7vAfJKEw==} - engines: {node: '>=0.10.0'} - titleize@3.0.0: resolution: {integrity: sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==} engines: {node: '>=12'} @@ -14025,10 +14856,17 @@ packages: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} + toml@3.0.0: + resolution: {integrity: sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==} + totalist@3.0.1: resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} engines: {node: '>=6'} + tough-cookie@4.1.4: + resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} + engines: {node: '>=6'} + tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} @@ -14082,6 +14920,10 @@ packages: tsconfig-paths@3.15.0: resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + tsconfig-paths@4.2.0: + resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} + engines: {node: '>=6'} + tslib@1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} @@ -14158,8 +15000,8 @@ packages: cpu: [arm64] os: [linux] - turbo-stream@2.1.0: - resolution: {integrity: sha512-muUMPf3BT7N6PeJJn91Wf+8oXEkwktNJZ9kBjIm0QzhFYPGJ7xqgQMblRQcscysb2v7VhY9AB+bOQbHaIUXyGA==} + turbo-stream@2.4.0: + resolution: {integrity: sha512-FHncC10WpBd2eOmGwpmQsWLDoK4cqsA/UT/GqNoaKOQnT8uzhtCbg3EoUDMvqpOSAI0S26mr0rkjzbOO6S3v1g==} turbo-windows-64@2.1.0: resolution: {integrity: sha512-iSobNud2MrJ1SZ1upVPlErT8xexsr0MQtKapdfq6z0M0rBnrDGEq5bUCSScWyGu+O4+glB4br9xkTAkGFqaxqQ==} @@ -14320,6 +15162,10 @@ packages: resolution: {integrity: sha512-JfjKqIauur3Q6biAtHJ564e3bWa8VvT+7cSiOJHFbX4Erv6CLGDpg8z+Fmg/1OI/47RA+GI2QZaF48SSaLvyBA==} engines: {node: '>=18.17'} + undici@6.19.8: + resolution: {integrity: sha512-U8uCCl2x9TK3WANvmBavymRzxbfFYG+tAu+fgx3zxQy3qdagQqBLwJVrdyO1TBfUXvfKveMKJZhpvUYoOjM+4g==} + engines: {node: '>=18.17'} + unenv-nightly@1.10.0-1717606461.a117952: resolution: {integrity: sha512-u3TfBX02WzbHTpaEfWEKwDijDSFAHcgXkayUZ+MVDrjhLFvgAJzFGTSTmwlEhwWi2exyRQey23ah9wELMM6etg==} @@ -14358,8 +15204,8 @@ packages: unified@10.1.2: resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==} - unified@11.0.4: - resolution: {integrity: sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==} + unified@11.0.5: + resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} unimport@3.11.1: resolution: {integrity: sha512-DuB1Uoq01LrrXTScxnwOoMSlTXxyKcULguFxbLrMDFcE/CO0ZWHpEiyhovN0mycPt7K6luAHe8laqvwvuoeUPg==} @@ -14387,6 +15233,9 @@ packages: resolution: {integrity: sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==} engines: {node: '>=12'} + unist-util-filter@5.0.1: + resolution: {integrity: sha512-pHx7D4Zt6+TsfwylH9+lYhBhzyhEnCXs/lbq/Hstxno5z4gVdyc2WEW0asfjGKPyG4pEKrnBv5hdkO6+aRnQJw==} + unist-util-find-after@5.0.0: resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==} @@ -14405,6 +15254,9 @@ packages: unist-util-position-from-estree@1.1.2: resolution: {integrity: sha512-poZa0eXpS+/XpoQwGwl79UUdea4ol2ZuCYguVaJS4qzIOMDzbqz8a3erUCOmubSZkaOuGamb3tX790iwOIROww==} + unist-util-position-from-estree@2.0.0: + resolution: {integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==} + unist-util-position@4.0.4: resolution: {integrity: sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==} @@ -14417,9 +15269,6 @@ packages: unist-util-remove-position@5.0.0: resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} - unist-util-remove@4.0.0: - resolution: {integrity: sha512-b4gokeGId57UVRX/eVKej5gXqGlc9+trkORhFJpu9raqZkZhU0zm8Doi05+HaiBsMEIJowL+2WtQ5ItjsngPXg==} - unist-util-stringify-position@3.0.3: resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==} @@ -14429,18 +15278,12 @@ packages: unist-util-visit-children@2.0.2: resolution: {integrity: sha512-+LWpMFqyUwLGpsQxpumsQ9o9DG2VGLFrpz+rpVXYIEdPy57GSy5HioC0g3bg/8WP9oCLlapQtklOzQ8uLS496Q==} - unist-util-visit-parents@4.1.1: - resolution: {integrity: sha512-1xAFJXAKpnnJl8G7K5KgU7FY55y3GcLIXqkzUj5QF/QVP7biUm0K0O2oqVkYsdjzJKifYeWn9+o6piAK2hGSHw==} - unist-util-visit-parents@5.1.3: resolution: {integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==} unist-util-visit-parents@6.0.1: resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} - unist-util-visit@3.1.0: - resolution: {integrity: sha512-Szoh+R/Ll68QWAyQyZZpQzZQm2UPbxibDvaY8Xc9SUtYgPsDzx5AWSk++UUt2hJuow8mvwR+rG+LQLw+KsuAKA==} - unist-util-visit@4.1.2: resolution: {integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==} @@ -14454,6 +15297,10 @@ packages: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} + universalify@0.2.0: + resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} + engines: {node: '>= 4.0.0'} + universalify@1.0.0: resolution: {integrity: sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==} engines: {node: '>= 10.0.0'} @@ -14556,6 +15403,9 @@ packages: url-join@4.0.0: resolution: {integrity: sha512-EGXjXJZhIHiQMK2pQukuFcL303nskqIRzWvPvV5O8miOfwoUb9G+a/Cld60kUyeaybEI94wvVClT10DtfeAExA==} + url-parse@1.5.10: + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + urlpattern-polyfill@8.0.2: resolution: {integrity: sha512-Qp95D4TPJl1kC9SKigDcqgyM2VDVO4RiJc2d4qe5GrYm+zbIQCWWKAFaJNQ4BhdFeDGwBmAxqJBwWSJDb9T3BQ==} @@ -14613,10 +15463,6 @@ packages: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} hasBin: true - uuid@9.0.0: - resolution: {integrity: sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==} - hasBin: true - uvu@0.5.6: resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==} engines: {node: '>=8'} @@ -14645,9 +15491,6 @@ packages: vfile-location@5.0.2: resolution: {integrity: sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==} - vfile-matter@3.0.1: - resolution: {integrity: sha512-CAAIDwnh6ZdtrqAuxdElUqQRQDQgbbIrYtDYI8gCjXS1qQ+1XdLoK8FIZWxJwn0/I+BkSSZpar3SOgjemQz4fg==} - vfile-message@3.1.4: resolution: {integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==} @@ -14674,6 +15517,11 @@ packages: engines: {node: ^18.0.0 || >=20.0.0} hasBin: true + vite-node@2.0.5: + resolution: {integrity: sha512-LdsW4pxj0Ot69FAoXZ1yTnA9bjGohr2yNBU7QKRxpz8ITSkhuDl6h3zS/tvgz4qrNjeRnvrWeXQ8ZF7Um4W00Q==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + vite-plugin-checker@0.6.4: resolution: {integrity: sha512-2zKHH5oxr+ye43nReRbC2fny1nyARwhxdm0uNYp/ERy4YvU9iZpNOsueoi/luXw5gnpqRSvjcEPxXbS153O2wA==} engines: {node: '>=14.16'} @@ -14750,8 +15598,8 @@ packages: peerDependencies: vite: ^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 - vite-plugin-vue-inspector@5.1.3: - resolution: {integrity: sha512-pMrseXIDP1Gb38mOevY+BvtNGNqiqmqa2pKB99lnLsADQww9w9xMbAfT4GB6RUoaOkSPrtlXqpq2Fq+Dj2AgFg==} + vite-plugin-vue-inspector@5.2.0: + resolution: {integrity: sha512-wWxyb9XAtaIvV/Lr7cqB1HIzmHZFVUJsTNm3yAxkS87dgh/Ky4qr2wDEWNxF23fdhVa3jQ8MZREpr4XyiuaRqA==} peerDependencies: vite: ^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 @@ -14827,6 +15675,31 @@ packages: jsdom: optional: true + vitest@2.0.5: + resolution: {integrity: sha512-8GUxONfauuIdeSl5f9GTgVEpg5BTOlplET4WEDaeY2QBiN8wSm68vxN/tb5z405OwppfoCavnwXafiaYBC/xOA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/node': ^18.0.0 || >=20.0.0 + '@vitest/browser': 2.0.5 + '@vitest/ui': 2.0.5 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + vlq@1.0.1: resolution: {integrity: sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==} @@ -14851,12 +15724,6 @@ packages: resolution: {integrity: sha512-60HTx5ID+fLRcgdHfmz0LDZAXYEV68fzwG0JWwEPBode9NuMYTIxuYXPg4ngO8i8+Ou0lM7y6GzaYWbiDL0drw==} hasBin: true - vscode-oniguruma@1.7.0: - resolution: {integrity: sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==} - - vscode-textmate@8.0.0: - resolution: {integrity: sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==} - vscode-uri@3.0.7: resolution: {integrity: sha512-eOpPHogvorZRobNqJGhapa0JdwaxpjVvyBp0QIUMRMSf8ZAlqOdEquKuRmw9Qwu0qXtJIWqFtMkmvJjUZmMjVA==} @@ -14930,6 +15797,10 @@ packages: warn-once@0.1.1: resolution: {integrity: sha512-VkQZJbO8zVImzYFteBXvBOZEl1qL175WH8VmZcxF2fZAoudNhNDvHi+doCaAEdU2l2vtcIwa2zn0QK5+I1HQ3Q==} + watchpack@2.4.2: + resolution: {integrity: sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==} + engines: {node: '>=10.13.0'} + wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} @@ -14947,9 +15818,6 @@ packages: resolution: {integrity: sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==} engines: {node: '>= 14'} - web-worker@1.2.0: - resolution: {integrity: sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA==} - webcrypto-core@1.7.9: resolution: {integrity: sha512-FE+a4PPkOmBbgNDIyRmcHhgXn+2ClRl3JzJdDu/P4+B8y81LqKe6RAsI9b3lAOHe1T1BMkSjsRHTYRikImZnVA==} @@ -14982,6 +15850,16 @@ packages: webpack-virtual-modules@0.6.2: resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} + webpack@5.94.0: + resolution: {integrity: sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + whatwg-fetch@3.6.20: resolution: {integrity: sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==} @@ -15048,8 +15926,8 @@ packages: engines: {node: ^16.13.0 || >=18.0.0} hasBin: true - why-is-node-running@2.2.2: - resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} engines: {node: '>=8'} hasBin: true @@ -15292,6 +16170,77 @@ snapshots: '@adobe/css-tools@4.4.0': {} + '@algolia/autocomplete-core@1.17.4(@algolia/client-search@5.4.1)(algoliasearch@5.4.1)(search-insights@2.17.2)': + dependencies: + '@algolia/autocomplete-plugin-algolia-insights': 1.17.4(@algolia/client-search@5.4.1)(algoliasearch@5.4.1)(search-insights@2.17.2) + '@algolia/autocomplete-shared': 1.17.4(@algolia/client-search@5.4.1)(algoliasearch@5.4.1) + transitivePeerDependencies: + - '@algolia/client-search' + - algoliasearch + - search-insights + + '@algolia/autocomplete-plugin-algolia-insights@1.17.4(@algolia/client-search@5.4.1)(algoliasearch@5.4.1)(search-insights@2.17.2)': + dependencies: + '@algolia/autocomplete-shared': 1.17.4(@algolia/client-search@5.4.1)(algoliasearch@5.4.1) + search-insights: 2.17.2 + transitivePeerDependencies: + - '@algolia/client-search' + - algoliasearch + + '@algolia/autocomplete-shared@1.17.4(@algolia/client-search@5.4.1)(algoliasearch@5.4.1)': + dependencies: + '@algolia/client-search': 5.4.1 + algoliasearch: 5.4.1 + + '@algolia/client-abtesting@5.4.1': + dependencies: + '@algolia/client-common': 5.4.1 + '@algolia/requester-browser-xhr': 5.4.1 + '@algolia/requester-fetch': 5.4.1 + '@algolia/requester-node-http': 5.4.1 + + '@algolia/client-analytics@5.4.1': + dependencies: + '@algolia/client-common': 5.4.1 + '@algolia/requester-browser-xhr': 5.4.1 + '@algolia/requester-fetch': 5.4.1 + '@algolia/requester-node-http': 5.4.1 + + '@algolia/client-common@5.4.1': {} + + '@algolia/client-personalization@5.4.1': + dependencies: + '@algolia/client-common': 5.4.1 + '@algolia/requester-browser-xhr': 5.4.1 + '@algolia/requester-fetch': 5.4.1 + '@algolia/requester-node-http': 5.4.1 + + '@algolia/client-search@5.4.1': + dependencies: + '@algolia/client-common': 5.4.1 + '@algolia/requester-browser-xhr': 5.4.1 + '@algolia/requester-fetch': 5.4.1 + '@algolia/requester-node-http': 5.4.1 + + '@algolia/recommend@5.4.1': + dependencies: + '@algolia/client-common': 5.4.1 + '@algolia/requester-browser-xhr': 5.4.1 + '@algolia/requester-fetch': 5.4.1 + '@algolia/requester-node-http': 5.4.1 + + '@algolia/requester-browser-xhr@5.4.1': + dependencies: + '@algolia/client-common': 5.4.1 + + '@algolia/requester-fetch@5.4.1': + dependencies: + '@algolia/client-common': 5.4.1 + + '@algolia/requester-node-http@5.4.1': + dependencies: + '@algolia/client-common': 5.4.1 + '@alloc/quick-lru@5.2.0': {} '@ampproject/remapping@2.3.0': @@ -15319,8 +16268,8 @@ snapshots: remark-parse: 11.0.0 remark-rehype: 11.1.0 remark-smartypants: 2.1.0 - shiki: 1.5.2 - unified: 11.0.4 + shiki: 1.17.5 + unified: 11.0.5 unist-util-remove-position: 5.0.0 unist-util-visit: 5.0.0 unist-util-visit-parents: 6.0.1 @@ -15328,9 +16277,9 @@ snapshots: transitivePeerDependencies: - supports-color - '@astrojs/node@8.2.5(astro@4.6.3(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2)(typescript@5.5.2))': + '@astrojs/node@8.2.5(astro@4.6.3(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0)(typescript@5.5.2))': dependencies: - astro: 4.6.3(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2)(typescript@5.5.2) + astro: 4.6.3(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0)(typescript@5.5.2) send: 0.18.0 server-destroy: 1.0.1 transitivePeerDependencies: @@ -15340,11 +16289,11 @@ snapshots: dependencies: prismjs: 1.29.0 - '@astrojs/react@3.3.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2))': + '@astrojs/react@3.3.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0))': dependencies: '@types/react': 18.3.3 '@types/react-dom': 18.3.0 - '@vitejs/plugin-react': 4.2.1(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2)) + '@vitejs/plugin-react': 4.2.1(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0)) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) ultrahtml: 1.5.3 @@ -15355,7 +16304,7 @@ snapshots: '@astrojs/telemetry@3.1.0': dependencies: ci-info: 4.0.0 - debug: 4.3.5 + debug: 4.3.6 dlv: 1.1.3 dset: 3.1.3 is-docker: 3.0.0 @@ -15389,7 +16338,7 @@ snapshots: '@babel/code-frame@7.24.6': dependencies: '@babel/highlight': 7.24.6 - picocolors: 1.0.0 + picocolors: 1.0.1 '@babel/compat-data@7.24.6': {} @@ -15422,11 +16371,11 @@ snapshots: '@babel/helper-annotate-as-pure@7.24.6': dependencies: - '@babel/types': 7.24.6 + '@babel/types': 7.25.6 '@babel/helper-builder-binary-assignment-operator-visitor@7.24.6': dependencies: - '@babel/types': 7.24.6 + '@babel/types': 7.25.6 '@babel/helper-compilation-targets@7.24.6': dependencies: @@ -15461,7 +16410,7 @@ snapshots: '@babel/core': 7.24.4 '@babel/helper-compilation-targets': 7.24.6 '@babel/helper-plugin-utils': 7.24.6 - debug: 4.3.5 + debug: 4.3.6 lodash.debounce: 4.0.8 resolve: 1.22.8 transitivePeerDependencies: @@ -15472,23 +16421,23 @@ snapshots: '@babel/helper-function-name@7.24.6': dependencies: '@babel/template': 7.24.6 - '@babel/types': 7.24.6 + '@babel/types': 7.25.6 '@babel/helper-hoist-variables@7.24.6': dependencies: - '@babel/types': 7.24.6 + '@babel/types': 7.25.6 '@babel/helper-member-expression-to-functions@7.24.6': dependencies: - '@babel/types': 7.24.6 + '@babel/types': 7.25.6 '@babel/helper-module-imports@7.18.6': dependencies: - '@babel/types': 7.24.6 + '@babel/types': 7.25.6 '@babel/helper-module-imports@7.24.6': dependencies: - '@babel/types': 7.24.6 + '@babel/types': 7.25.6 '@babel/helper-module-transforms@7.24.6(@babel/core@7.24.4)': dependencies: @@ -15501,7 +16450,7 @@ snapshots: '@babel/helper-optimise-call-expression@7.24.6': dependencies: - '@babel/types': 7.24.6 + '@babel/types': 7.25.6 '@babel/helper-plugin-utils@7.24.6': {} @@ -15521,27 +16470,31 @@ snapshots: '@babel/helper-simple-access@7.24.6': dependencies: - '@babel/types': 7.24.6 + '@babel/types': 7.25.6 '@babel/helper-skip-transparent-expression-wrappers@7.24.6': dependencies: - '@babel/types': 7.24.6 + '@babel/types': 7.25.6 '@babel/helper-split-export-declaration@7.24.6': dependencies: - '@babel/types': 7.24.6 + '@babel/types': 7.25.6 '@babel/helper-string-parser@7.24.6': {} + '@babel/helper-string-parser@7.24.8': {} + '@babel/helper-validator-identifier@7.24.6': {} + '@babel/helper-validator-identifier@7.24.7': {} + '@babel/helper-validator-option@7.24.6': {} '@babel/helper-wrap-function@7.24.6': dependencies: '@babel/helper-function-name': 7.24.6 '@babel/template': 7.24.6 - '@babel/types': 7.24.6 + '@babel/types': 7.25.6 '@babel/helpers@7.24.4': dependencies: @@ -15556,12 +16509,16 @@ snapshots: '@babel/helper-validator-identifier': 7.24.6 chalk: 2.4.2 js-tokens: 4.0.0 - picocolors: 1.0.0 + picocolors: 1.0.1 '@babel/parser@7.24.6': dependencies: '@babel/types': 7.24.6 + '@babel/parser@7.25.6': + dependencies: + '@babel/types': 7.25.6 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.24.6(@babel/core@7.24.4)': dependencies: '@babel/core': 7.24.4 @@ -15928,7 +16885,7 @@ snapshots: '@babel/helper-hoist-variables': 7.24.6 '@babel/helper-module-transforms': 7.24.6(@babel/core@7.24.4) '@babel/helper-plugin-utils': 7.24.6 - '@babel/helper-validator-identifier': 7.24.6 + '@babel/helper-validator-identifier': 7.24.7 '@babel/plugin-transform-modules-umd@7.24.6(@babel/core@7.24.4)': dependencies: @@ -16223,7 +17180,7 @@ snapshots: dependencies: '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.6 - '@babel/types': 7.24.6 + '@babel/types': 7.25.6 esutils: 2.0.3 '@babel/preset-react@7.24.6(@babel/core@7.24.4)': @@ -16278,7 +17235,7 @@ snapshots: '@babel/helper-split-export-declaration': 7.24.6 '@babel/parser': 7.24.6 '@babel/types': 7.24.6 - debug: 4.3.5 + debug: 4.3.6 globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -16289,14 +17246,18 @@ snapshots: '@babel/helper-validator-identifier': 7.24.6 to-fast-properties: 2.0.0 + '@babel/types@7.25.6': + dependencies: + '@babel/helper-string-parser': 7.24.8 + '@babel/helper-validator-identifier': 7.24.7 + to-fast-properties: 2.0.0 + '@bacons/text-decoder@0.0.0(react-native@0.74.1(@babel/core@7.24.4)(@babel/preset-env@7.24.6(@babel/core@7.24.4))(@types/react@18.3.3)(encoding@0.1.13)(react@18.3.1))': dependencies: react-native: 0.74.1(@babel/core@7.24.4)(@babel/preset-env@7.24.6(@babel/core@7.24.4))(@types/react@18.3.3)(encoding@0.1.13)(react@18.3.1) '@bcoe/v8-coverage@0.2.3': {} - '@braintree/sanitize-url@6.0.4': {} - '@bundled-es-modules/cookie@2.0.0': dependencies: cookie: 0.5.0 @@ -16305,6 +17266,11 @@ snapshots: dependencies: statuses: 2.0.1 + '@bundled-es-modules/tough-cookie@0.1.6': + dependencies: + '@types/tough-cookie': 4.0.5 + tough-cookie: 4.1.4 + '@cfcs/core@0.0.6': dependencies: '@egjs/component': 3.0.5 @@ -16323,7 +17289,7 @@ snapshots: outdent: 0.5.0 prettier: 2.8.8 resolve-from: 5.0.0 - semver: 7.6.2 + semver: 7.6.3 '@changesets/assemble-release-plan@6.0.0': dependencies: @@ -16332,7 +17298,7 @@ snapshots: '@changesets/get-dependents-graph': 2.0.0 '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 - semver: 7.6.2 + semver: 7.6.3 '@changesets/changelog-git@0.2.0': dependencies: @@ -16401,7 +17367,7 @@ snapshots: '@manypkg/get-packages': 1.1.3 chalk: 2.4.2 fs-extra: 7.0.1 - semver: 7.6.2 + semver: 7.6.3 '@changesets/get-github-info@0.6.0(encoding@0.1.13)': dependencies: @@ -16486,6 +17452,17 @@ snapshots: transitivePeerDependencies: - react + '@clerk/backend@1.11.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@clerk/shared': 2.7.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@clerk/types': 4.20.1 + cookie: 0.5.0 + snakecase-keys: 5.4.4 + tslib: 2.4.1 + transitivePeerDependencies: + - react + - react-dom + '@clerk/clerk-react@4.31.0(react@18.3.1)': dependencies: '@clerk/shared': 1.4.1(react@18.3.1) @@ -16493,6 +17470,14 @@ snapshots: react: 18.3.1 tslib: 2.4.1 + '@clerk/clerk-react@5.8.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@clerk/shared': 2.7.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@clerk/types': 4.20.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + tslib: 2.4.1 + '@clerk/clerk-sdk-node@4.13.15(react@18.3.1)': dependencies: '@clerk/backend': 0.38.7(react@18.3.1) @@ -16507,19 +17492,32 @@ snapshots: transitivePeerDependencies: - react - '@clerk/nextjs@4.30.0(next@14.2.3(@playwright/test@1.45.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@clerk/nextjs@4.30.0(next@14.2.11(@playwright/test@1.45.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@clerk/backend': 0.38.7(react@18.3.1) '@clerk/clerk-react': 4.31.0(react@18.3.1) '@clerk/clerk-sdk-node': 4.13.15(react@18.3.1) '@clerk/shared': 1.4.1(react@18.3.1) '@clerk/types': 3.64.0 - next: 14.2.3(@babel/core@7.24.4)(@playwright/test@1.45.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 14.2.11(@babel/core@7.24.4)(@playwright/test@1.45.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) path-to-regexp: 6.2.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) tslib: 2.4.1 + '@clerk/remix@4.2.25(@remix-run/react@2.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.2))(@remix-run/server-runtime@2.12.0(typescript@5.5.2))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@clerk/backend': 1.11.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@clerk/clerk-react': 5.8.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@clerk/shared': 2.7.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@clerk/types': 4.20.1 + '@remix-run/react': 2.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.2) + '@remix-run/server-runtime': 2.12.0(typescript@5.5.2) + cookie: 0.5.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + tslib: 2.4.1 + '@clerk/shared@1.4.1(react@18.3.1)': dependencies: glob-to-regexp: 0.4.1 @@ -16528,10 +17526,25 @@ snapshots: optionalDependencies: react: 18.3.1 + '@clerk/shared@2.7.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@clerk/types': 4.20.1 + glob-to-regexp: 0.4.1 + js-cookie: 3.0.5 + std-env: 3.7.0 + swr: 2.2.5(react@18.3.1) + optionalDependencies: + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + '@clerk/types@3.64.0': dependencies: csstype: 3.1.1 + '@clerk/types@4.20.1': + dependencies: + csstype: 3.1.1 + '@cloudflare/kv-asset-handler@0.3.1': dependencies: mime: 3.0.0 @@ -16665,37 +17678,41 @@ snapshots: '@discoveryjs/json-ext@0.5.7': {} - '@effect/platform-node-shared@0.8.20(@effect/platform@0.58.21(@effect/schema@0.68.18(effect@3.4.8))(effect@3.4.8))(effect@3.4.8)': + '@effect/platform-node-shared@0.13.2(@effect/platform@0.63.2(@effect/schema@0.72.2(effect@3.7.2))(effect@3.7.2))(effect@3.7.2)': dependencies: - '@effect/platform': 0.58.21(@effect/schema@0.68.18(effect@3.4.8))(effect@3.4.8) + '@effect/platform': 0.63.2(@effect/schema@0.72.2(effect@3.7.2))(effect@3.7.2) '@parcel/watcher': 2.4.1 - effect: 3.4.8 - multipasta: 0.2.2 + effect: 3.7.2 + multipasta: 0.2.5 - '@effect/platform-node@0.53.20(@effect/platform@0.58.21(@effect/schema@0.68.18(effect@3.4.8))(effect@3.4.8))(effect@3.4.8)': + '@effect/platform-node@0.58.2(@effect/platform@0.63.2(@effect/schema@0.72.2(effect@3.7.2))(effect@3.7.2))(effect@3.7.2)': dependencies: - '@effect/platform': 0.58.21(@effect/schema@0.68.18(effect@3.4.8))(effect@3.4.8) - '@effect/platform-node-shared': 0.8.20(@effect/platform@0.58.21(@effect/schema@0.68.18(effect@3.4.8))(effect@3.4.8))(effect@3.4.8) - effect: 3.4.8 + '@effect/platform': 0.63.2(@effect/schema@0.72.2(effect@3.7.2))(effect@3.7.2) + '@effect/platform-node-shared': 0.13.2(@effect/platform@0.63.2(@effect/schema@0.72.2(effect@3.7.2))(effect@3.7.2))(effect@3.7.2) + effect: 3.7.2 mime: 3.0.0 - undici: 6.19.2 - ws: 8.17.1 + undici: 6.19.8 + ws: 8.18.0 transitivePeerDependencies: - bufferutil - utf-8-validate - '@effect/platform@0.58.21(@effect/schema@0.68.18(effect@3.4.8))(effect@3.4.8)': + '@effect/platform@0.63.2(@effect/schema@0.72.2(effect@3.7.2))(effect@3.7.2)': dependencies: - '@effect/schema': 0.68.18(effect@3.4.8) - effect: 3.4.8 - find-my-way-ts: 0.1.4 - multipasta: 0.2.2 - path-browserify: 1.0.1 + '@effect/schema': 0.72.2(effect@3.7.2) + effect: 3.7.2 + find-my-way-ts: 0.1.5 + multipasta: 0.2.5 + + '@effect/schema@0.72.2(effect@3.7.2)': + dependencies: + effect: 3.7.2 + fast-check: 3.22.0 - '@effect/schema@0.68.18(effect@3.4.8)': + '@effect/vitest@0.9.2(effect@3.7.2)(vitest@2.0.5(@types/node@20.14.0)(@vitest/browser@2.0.5)(happy-dom@13.10.1)(lightningcss@1.24.1)(terser@5.32.0))': dependencies: - effect: 3.4.8 - fast-check: 3.19.0 + effect: 3.7.2 + vitest: 2.0.5(@types/node@20.14.0)(@vitest/browser@2.0.5(typescript@5.5.2)(vitest@2.0.5))(happy-dom@13.10.1)(lightningcss@1.24.1)(terser@5.32.0) '@egjs/agent@2.4.3': {} @@ -16715,6 +17732,13 @@ snapshots: dependencies: elysia: 0.8.17(openapi-types@12.1.3)(typescript@5.5.2) + '@emnapi/runtime@0.44.0': + dependencies: + tslib: 2.6.2 + optional: true + + '@emotion/hash@0.9.2': {} + '@esbuild-kit/core-utils@3.1.0': dependencies: esbuild: 0.17.19 @@ -16747,6 +17771,9 @@ snapshots: '@esbuild/android-arm64@0.17.19': optional: true + '@esbuild/android-arm64@0.17.6': + optional: true + '@esbuild/android-arm64@0.18.20': optional: true @@ -16762,6 +17789,9 @@ snapshots: '@esbuild/android-arm@0.17.19': optional: true + '@esbuild/android-arm@0.17.6': + optional: true + '@esbuild/android-arm@0.18.20': optional: true @@ -16777,6 +17807,9 @@ snapshots: '@esbuild/android-x64@0.17.19': optional: true + '@esbuild/android-x64@0.17.6': + optional: true + '@esbuild/android-x64@0.18.20': optional: true @@ -16792,6 +17825,9 @@ snapshots: '@esbuild/darwin-arm64@0.17.19': optional: true + '@esbuild/darwin-arm64@0.17.6': + optional: true + '@esbuild/darwin-arm64@0.18.20': optional: true @@ -16807,6 +17843,9 @@ snapshots: '@esbuild/darwin-x64@0.17.19': optional: true + '@esbuild/darwin-x64@0.17.6': + optional: true + '@esbuild/darwin-x64@0.18.20': optional: true @@ -16822,6 +17861,9 @@ snapshots: '@esbuild/freebsd-arm64@0.17.19': optional: true + '@esbuild/freebsd-arm64@0.17.6': + optional: true + '@esbuild/freebsd-arm64@0.18.20': optional: true @@ -16837,6 +17879,9 @@ snapshots: '@esbuild/freebsd-x64@0.17.19': optional: true + '@esbuild/freebsd-x64@0.17.6': + optional: true + '@esbuild/freebsd-x64@0.18.20': optional: true @@ -16852,6 +17897,9 @@ snapshots: '@esbuild/linux-arm64@0.17.19': optional: true + '@esbuild/linux-arm64@0.17.6': + optional: true + '@esbuild/linux-arm64@0.18.20': optional: true @@ -16867,6 +17915,9 @@ snapshots: '@esbuild/linux-arm@0.17.19': optional: true + '@esbuild/linux-arm@0.17.6': + optional: true + '@esbuild/linux-arm@0.18.20': optional: true @@ -16882,6 +17933,9 @@ snapshots: '@esbuild/linux-ia32@0.17.19': optional: true + '@esbuild/linux-ia32@0.17.6': + optional: true + '@esbuild/linux-ia32@0.18.20': optional: true @@ -16897,6 +17951,9 @@ snapshots: '@esbuild/linux-loong64@0.17.19': optional: true + '@esbuild/linux-loong64@0.17.6': + optional: true + '@esbuild/linux-loong64@0.18.20': optional: true @@ -16912,6 +17969,9 @@ snapshots: '@esbuild/linux-mips64el@0.17.19': optional: true + '@esbuild/linux-mips64el@0.17.6': + optional: true + '@esbuild/linux-mips64el@0.18.20': optional: true @@ -16927,6 +17987,9 @@ snapshots: '@esbuild/linux-ppc64@0.17.19': optional: true + '@esbuild/linux-ppc64@0.17.6': + optional: true + '@esbuild/linux-ppc64@0.18.20': optional: true @@ -16942,6 +18005,9 @@ snapshots: '@esbuild/linux-riscv64@0.17.19': optional: true + '@esbuild/linux-riscv64@0.17.6': + optional: true + '@esbuild/linux-riscv64@0.18.20': optional: true @@ -16957,6 +18023,9 @@ snapshots: '@esbuild/linux-s390x@0.17.19': optional: true + '@esbuild/linux-s390x@0.17.6': + optional: true + '@esbuild/linux-s390x@0.18.20': optional: true @@ -16972,6 +18041,9 @@ snapshots: '@esbuild/linux-x64@0.17.19': optional: true + '@esbuild/linux-x64@0.17.6': + optional: true + '@esbuild/linux-x64@0.18.20': optional: true @@ -16987,6 +18059,9 @@ snapshots: '@esbuild/netbsd-x64@0.17.19': optional: true + '@esbuild/netbsd-x64@0.17.6': + optional: true + '@esbuild/netbsd-x64@0.18.20': optional: true @@ -17002,6 +18077,9 @@ snapshots: '@esbuild/openbsd-x64@0.17.19': optional: true + '@esbuild/openbsd-x64@0.17.6': + optional: true + '@esbuild/openbsd-x64@0.18.20': optional: true @@ -17017,6 +18095,9 @@ snapshots: '@esbuild/sunos-x64@0.17.19': optional: true + '@esbuild/sunos-x64@0.17.6': + optional: true + '@esbuild/sunos-x64@0.18.20': optional: true @@ -17032,6 +18113,9 @@ snapshots: '@esbuild/win32-arm64@0.17.19': optional: true + '@esbuild/win32-arm64@0.17.6': + optional: true + '@esbuild/win32-arm64@0.18.20': optional: true @@ -17047,6 +18131,9 @@ snapshots: '@esbuild/win32-ia32@0.17.19': optional: true + '@esbuild/win32-ia32@0.17.6': + optional: true + '@esbuild/win32-ia32@0.18.20': optional: true @@ -17062,6 +18149,9 @@ snapshots: '@esbuild/win32-x64@0.17.19': optional: true + '@esbuild/win32-x64@0.17.6': + optional: true + '@esbuild/win32-x64@0.18.20': optional: true @@ -17084,10 +18174,10 @@ snapshots: '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 - debug: 4.3.5 + debug: 4.3.6 espree: 9.6.1 globals: 13.21.0 - ignore: 5.3.1 + ignore: 5.3.2 import-fresh: 3.3.0 js-yaml: 4.1.0 minimatch: 3.1.2 @@ -17133,7 +18223,7 @@ snapshots: chalk: 4.1.2 ci-info: 3.8.0 connect: 3.7.0 - debug: 4.3.5 + debug: 4.3.6 env-editor: 0.4.2 fast-glob: 3.3.2 find-yarn-workspace-root: 2.0.0 @@ -17168,7 +18258,7 @@ snapshots: resolve: 1.22.8 resolve-from: 5.0.0 resolve.exports: 2.0.2 - semver: 7.6.2 + semver: 7.6.3 send: 0.18.0 slugify: 1.6.6 source-map-support: 0.5.21 @@ -17203,12 +18293,12 @@ snapshots: '@expo/sdk-runtime-versions': 1.0.0 '@react-native/normalize-color': 2.1.0 chalk: 4.1.2 - debug: 4.3.5 + debug: 4.3.6 find-up: 5.0.0 getenv: 1.0.0 glob: 7.1.6 resolve-from: 5.0.0 - semver: 7.6.2 + semver: 7.6.3 slash: 3.0.0 slugify: 1.6.6 xcode: 3.0.1 @@ -17223,12 +18313,12 @@ snapshots: '@expo/plist': 0.1.3 '@expo/sdk-runtime-versions': 1.0.0 chalk: 4.1.2 - debug: 4.3.5 + debug: 4.3.6 find-up: 5.0.0 getenv: 1.0.0 glob: 7.1.6 resolve-from: 5.0.0 - semver: 7.6.2 + semver: 7.6.3 slash: 3.0.0 slugify: 1.6.6 xcode: 3.0.1 @@ -17266,7 +18356,7 @@ snapshots: glob: 7.1.6 require-from-string: 2.0.2 resolve-from: 5.0.0 - semver: 7.6.2 + semver: 7.6.3 slugify: 1.6.6 sucrase: 3.34.0 transitivePeerDependencies: @@ -17282,7 +18372,7 @@ snapshots: glob: 7.1.6 require-from-string: 2.0.2 resolve-from: 5.0.0 - semver: 7.6.2 + semver: 7.6.3 slugify: 1.6.6 sucrase: 3.34.0 transitivePeerDependencies: @@ -17309,7 +18399,7 @@ snapshots: '@expo/env@0.3.0': dependencies: chalk: 4.1.2 - debug: 4.3.5 + debug: 4.3.6 dotenv: 16.4.5 dotenv-expand: 11.0.6 getenv: 1.0.0 @@ -17320,7 +18410,7 @@ snapshots: dependencies: '@expo/spawn-async': 1.7.2 chalk: 4.1.2 - debug: 4.3.5 + debug: 4.3.6 find-up: 5.0.0 minimatch: 3.1.2 p-limit: 3.1.0 @@ -17338,7 +18428,7 @@ snapshots: node-fetch: 2.6.12(encoding@0.1.13) parse-png: 2.1.0 resolve-from: 5.0.0 - semver: 7.6.2 + semver: 7.6.3 tempy: 0.3.0 transitivePeerDependencies: - encoding @@ -17360,7 +18450,7 @@ snapshots: '@expo/json-file': 8.3.3 '@expo/spawn-async': 1.7.2 chalk: 4.1.2 - debug: 4.3.5 + debug: 4.3.6 find-yarn-workspace-root: 2.0.0 fs-extra: 9.1.0 getenv: 1.0.0 @@ -17410,11 +18500,11 @@ snapshots: '@expo/image-utils': 0.5.1(encoding@0.1.13) '@expo/json-file': 8.3.3 '@react-native/normalize-colors': 0.74.83 - debug: 4.3.5 + debug: 4.3.6 expo-modules-autolinking: 1.11.1 fs-extra: 9.1.0 resolve-from: 5.0.0 - semver: 7.6.2 + semver: 7.6.3 xml2js: 0.6.0 transitivePeerDependencies: - encoding @@ -17436,9 +18526,9 @@ snapshots: '@expo/server@0.4.2(typescript@5.5.2)': dependencies: - '@remix-run/node': 2.9.2(typescript@5.5.2) + '@remix-run/node': 2.12.0(typescript@5.5.2) abort-controller: 3.0.0 - debug: 4.3.5 + debug: 4.3.6 source-map-support: 0.5.21 transitivePeerDependencies: - supports-color @@ -17461,8 +18551,8 @@ snapshots: '@fastify/ajv-compiler@3.5.0': dependencies: - ajv: 8.12.0 - ajv-formats: 2.1.1(ajv@8.12.0) + ajv: 8.16.0 + ajv-formats: 2.1.1(ajv@8.16.0) fast-uri: 2.3.0 '@fastify/busboy@2.1.1': {} @@ -17486,17 +18576,17 @@ snapshots: '@floating-ui/core@1.6.1': dependencies: - '@floating-ui/utils': 0.2.2 + '@floating-ui/utils': 0.2.7 '@floating-ui/dom@1.6.3': dependencies: '@floating-ui/core': 1.6.1 - '@floating-ui/utils': 0.2.2 + '@floating-ui/utils': 0.2.4 '@floating-ui/dom@1.6.7': dependencies: '@floating-ui/core': 1.6.1 - '@floating-ui/utils': 0.2.4 + '@floating-ui/utils': 0.2.7 '@floating-ui/react-dom@2.0.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: @@ -17504,24 +18594,29 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@floating-ui/utils@0.2.2': {} + '@floating-ui/react-dom@2.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@floating-ui/dom': 1.6.7 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@floating-ui/react@0.26.23(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@floating-ui/react-dom': 2.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@floating-ui/utils': 0.2.7 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + tabbable: 6.2.0 '@floating-ui/utils@0.2.4': {} - '@floating-ui/vue@1.0.6(vue@3.4.25(typescript@5.5.2))': - dependencies: - '@floating-ui/dom': 1.6.3 - '@floating-ui/utils': 0.2.2 - vue-demi: 0.14.7(vue@3.4.25(typescript@5.5.2)) - transitivePeerDependencies: - - '@vue/composition-api' - - vue + '@floating-ui/utils@0.2.7': {} '@floating-ui/vue@1.1.1(vue@3.4.25(typescript@5.5.2))': dependencies: '@floating-ui/dom': 1.6.7 '@floating-ui/utils': 0.2.4 - vue-demi: 0.14.7(vue@3.4.25(typescript@5.5.2)) + vue-demi: 0.14.8(vue@3.4.25(typescript@5.5.2)) transitivePeerDependencies: - '@vue/composition-api' - vue @@ -17555,10 +18650,12 @@ snapshots: dependencies: '@hapi/hoek': 9.3.0 - '@headlessui/react@1.7.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@headlessui/react@2.1.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@tanstack/react-virtual': 3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - client-only: 0.0.1 + '@floating-ui/react': 0.26.23(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/focus': 3.18.2(react@18.3.1) + '@react-aria/interactions': 3.22.2(react@18.3.1) + '@tanstack/react-virtual': 3.10.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -17568,9 +18665,13 @@ snapshots: '@headlessui/vue@1.7.20(vue@3.4.25(typescript@5.5.2))': dependencies: - '@tanstack/vue-virtual': 3.4.0(vue@3.4.25(typescript@5.5.2)) + '@tanstack/vue-virtual': 3.8.2(vue@3.4.25(typescript@5.5.2)) vue: 3.4.25(typescript@5.5.2) + '@heroicons/react@2.1.5(react@18.3.1)': + dependencies: + react: 18.3.1 + '@hono/node-server@1.11.0': {} '@hono/zod-validator@0.2.1(hono@4.2.6)(zod@3.23.8)': @@ -17581,7 +18682,7 @@ snapshots: '@humanwhocodes/config-array@0.11.14': dependencies: '@humanwhocodes/object-schema': 2.0.3 - debug: 4.3.5 + debug: 4.3.6 minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -17604,6 +18705,81 @@ snapshots: transitivePeerDependencies: - supports-color + '@img/sharp-darwin-arm64@0.33.1': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.0.0 + optional: true + + '@img/sharp-darwin-x64@0.33.1': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.0.0 + optional: true + + '@img/sharp-libvips-darwin-arm64@1.0.0': + optional: true + + '@img/sharp-libvips-darwin-x64@1.0.0': + optional: true + + '@img/sharp-libvips-linux-arm64@1.0.0': + optional: true + + '@img/sharp-libvips-linux-arm@1.0.0': + optional: true + + '@img/sharp-libvips-linux-s390x@1.0.0': + optional: true + + '@img/sharp-libvips-linux-x64@1.0.0': + optional: true + + '@img/sharp-libvips-linuxmusl-arm64@1.0.0': + optional: true + + '@img/sharp-libvips-linuxmusl-x64@1.0.0': + optional: true + + '@img/sharp-linux-arm64@0.33.1': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.0.0 + optional: true + + '@img/sharp-linux-arm@0.33.1': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.0.0 + optional: true + + '@img/sharp-linux-s390x@0.33.1': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.0.0 + optional: true + + '@img/sharp-linux-x64@0.33.1': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.0.0 + optional: true + + '@img/sharp-linuxmusl-arm64@0.33.1': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.0.0 + optional: true + + '@img/sharp-linuxmusl-x64@0.33.1': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.0.0 + optional: true + + '@img/sharp-wasm32@0.33.1': + dependencies: + '@emnapi/runtime': 0.44.0 + optional: true + + '@img/sharp-win32-ia32@0.33.1': + optional: true + + '@img/sharp-win32-x64@0.33.1': + optional: true + '@inquirer/confirm@3.1.5': dependencies: '@inquirer/core': 8.0.1 @@ -17720,11 +18896,13 @@ snapshots: '@jridgewell/trace-mapping@0.3.9': dependencies: '@jridgewell/resolve-uri': 3.1.1 - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@jspm/core@2.0.1': {} '@kwsites/file-exists@1.1.1': dependencies: - debug: 4.3.5 + debug: 4.3.6 transitivePeerDependencies: - supports-color @@ -17805,7 +18983,7 @@ snapshots: '@libsql/isomorphic-ws@0.1.5': dependencies: '@types/ws': 8.5.10 - ws: 8.17.1 + ws: 8.18.0 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -17884,16 +19062,24 @@ snapshots: nopt: 5.0.0 npmlog: 5.0.1 rimraf: 3.0.2 - semver: 7.6.2 + semver: 7.6.3 tar: 6.2.1 transitivePeerDependencies: - encoding - supports-color + '@mdx-js/loader@3.0.1(webpack@5.94.0(esbuild@0.21.5))': + dependencies: + '@mdx-js/mdx': 3.0.1 + source-map: 0.7.4 + webpack: 5.94.0(esbuild@0.21.5) + transitivePeerDependencies: + - supports-color + '@mdx-js/mdx@2.3.0': dependencies: '@types/estree-jsx': 1.0.0 - '@types/mdx': 2.0.6 + '@types/mdx': 2.0.13 estree-util-build-jsx: 2.2.2 estree-util-is-identifier-name: 2.1.0 estree-util-to-js: 1.2.0 @@ -17912,9 +19098,37 @@ snapshots: transitivePeerDependencies: - supports-color - '@mdx-js/react@2.3.0(react@18.3.1)': + '@mdx-js/mdx@3.0.1': + dependencies: + '@types/estree': 1.0.5 + '@types/estree-jsx': 1.0.0 + '@types/hast': 3.0.4 + '@types/mdx': 2.0.13 + collapse-white-space: 2.1.0 + devlop: 1.1.0 + estree-util-build-jsx: 3.0.1 + estree-util-is-identifier-name: 3.0.0 + estree-util-to-js: 2.0.0 + estree-walker: 3.0.3 + hast-util-to-estree: 3.1.0 + hast-util-to-jsx-runtime: 2.3.0 + markdown-extensions: 2.0.0 + periscopic: 3.1.0 + remark-mdx: 3.0.1 + remark-parse: 11.0.0 + remark-rehype: 11.1.0 + source-map: 0.7.4 + unified: 11.0.5 + unist-util-position-from-estree: 2.0.0 + unist-util-stringify-position: 4.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.1 + transitivePeerDependencies: + - supports-color + + '@mdx-js/react@3.0.1(@types/react@18.3.3)(react@18.3.1)': dependencies: - '@types/mdx': 2.0.6 + '@types/mdx': 2.0.13 '@types/react': 18.3.3 react: 18.3.1 @@ -17929,52 +19143,14 @@ snapshots: outvariant: 1.4.2 strict-event-emitter: 0.5.1 - '@napi-rs/simple-git-android-arm-eabi@0.1.16': - optional: true - - '@napi-rs/simple-git-android-arm64@0.1.16': - optional: true - - '@napi-rs/simple-git-darwin-arm64@0.1.16': - optional: true - - '@napi-rs/simple-git-darwin-x64@0.1.16': - optional: true - - '@napi-rs/simple-git-linux-arm-gnueabihf@0.1.16': - optional: true - - '@napi-rs/simple-git-linux-arm64-gnu@0.1.16': - optional: true - - '@napi-rs/simple-git-linux-arm64-musl@0.1.16': - optional: true - - '@napi-rs/simple-git-linux-x64-gnu@0.1.16': - optional: true - - '@napi-rs/simple-git-linux-x64-musl@0.1.16': - optional: true - - '@napi-rs/simple-git-win32-arm64-msvc@0.1.16': - optional: true - - '@napi-rs/simple-git-win32-x64-msvc@0.1.16': - optional: true - - '@napi-rs/simple-git@0.1.16': - optionalDependencies: - '@napi-rs/simple-git-android-arm-eabi': 0.1.16 - '@napi-rs/simple-git-android-arm64': 0.1.16 - '@napi-rs/simple-git-darwin-arm64': 0.1.16 - '@napi-rs/simple-git-darwin-x64': 0.1.16 - '@napi-rs/simple-git-linux-arm-gnueabihf': 0.1.16 - '@napi-rs/simple-git-linux-arm64-gnu': 0.1.16 - '@napi-rs/simple-git-linux-arm64-musl': 0.1.16 - '@napi-rs/simple-git-linux-x64-gnu': 0.1.16 - '@napi-rs/simple-git-linux-x64-musl': 0.1.16 - '@napi-rs/simple-git-win32-arm64-msvc': 0.1.16 - '@napi-rs/simple-git-win32-x64-msvc': 0.1.16 + '@mswjs/interceptors@0.29.1': + dependencies: + '@open-draft/deferred-promise': 2.2.0 + '@open-draft/logger': 0.3.0 + '@open-draft/until': 2.1.0 + is-node-process: 1.2.0 + outvariant: 1.4.2 + strict-event-emitter: 0.5.1 '@neon-rs/load@0.0.4': {} @@ -17998,7 +19174,7 @@ snapshots: '@next/env@13.5.6': {} - '@next/env@14.2.3': {} + '@next/env@14.2.11': {} '@next/eslint-plugin-next@14.2.2': dependencies: @@ -18008,31 +19184,38 @@ snapshots: dependencies: glob: 10.3.10 - '@next/swc-darwin-arm64@14.2.3': + '@next/mdx@14.2.11(@mdx-js/loader@3.0.1(webpack@5.94.0(esbuild@0.21.5)))(@mdx-js/react@3.0.1(@types/react@18.3.3)(react@18.3.1))': + dependencies: + source-map: 0.7.4 + optionalDependencies: + '@mdx-js/loader': 3.0.1(webpack@5.94.0(esbuild@0.21.5)) + '@mdx-js/react': 3.0.1(@types/react@18.3.3)(react@18.3.1) + + '@next/swc-darwin-arm64@14.2.11': optional: true - '@next/swc-darwin-x64@14.2.3': + '@next/swc-darwin-x64@14.2.11': optional: true - '@next/swc-linux-arm64-gnu@14.2.3': + '@next/swc-linux-arm64-gnu@14.2.11': optional: true - '@next/swc-linux-arm64-musl@14.2.3': + '@next/swc-linux-arm64-musl@14.2.11': optional: true - '@next/swc-linux-x64-gnu@14.2.3': + '@next/swc-linux-x64-gnu@14.2.11': optional: true - '@next/swc-linux-x64-musl@14.2.3': + '@next/swc-linux-x64-musl@14.2.11': optional: true - '@next/swc-win32-arm64-msvc@14.2.3': + '@next/swc-win32-arm64-msvc@14.2.11': optional: true - '@next/swc-win32-ia32-msvc@14.2.3': + '@next/swc-win32-ia32-msvc@14.2.11': optional: true - '@next/swc-win32-x64-msvc@14.2.3': + '@next/swc-win32-x64-msvc@14.2.11': optional: true '@nodelib/fs.scandir@2.1.5': @@ -18052,47 +19235,76 @@ snapshots: agent-base: 7.1.1 http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.1 - lru-cache: 10.2.0 + lru-cache: 10.4.3 socks-proxy-agent: 8.0.3 transitivePeerDependencies: - supports-color '@npmcli/fs@3.1.0': dependencies: - semver: 7.6.2 + semver: 7.6.3 + + '@npmcli/git@4.1.0': + dependencies: + '@npmcli/promise-spawn': 6.0.2 + lru-cache: 7.18.3 + npm-pick-manifest: 8.0.2 + proc-log: 3.0.0 + promise-inflight: 1.0.1 + promise-retry: 2.0.1 + semver: 7.6.3 + which: 3.0.1 + transitivePeerDependencies: + - bluebird + + '@npmcli/package-json@4.0.1': + dependencies: + '@npmcli/git': 4.1.0 + glob: 10.4.5 + hosted-git-info: 6.1.1 + json-parse-even-better-errors: 3.0.2 + normalize-package-data: 5.0.0 + proc-log: 3.0.0 + semver: 7.6.3 + transitivePeerDependencies: + - bluebird + + '@npmcli/promise-spawn@6.0.2': + dependencies: + which: 3.0.1 '@npmcli/redact@2.0.0': {} '@nuxt/devalue@2.0.2': {} - '@nuxt/devtools-kit@1.3.7(magicast@0.3.4)(rollup@3.29.4)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2))': + '@nuxt/devtools-kit@1.3.7(magicast@0.3.4)(rollup@3.29.4)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0))': dependencies: - '@nuxt/kit': 3.12.2(magicast@0.3.4)(rollup@3.29.4) + '@nuxt/kit': 3.13.0(magicast@0.3.4)(rollup@3.29.4) '@nuxt/schema': 3.12.2(rollup@3.29.4) execa: 7.2.0 - vite: 5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2) + vite: 5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0) transitivePeerDependencies: - magicast - rollup - supports-color - '@nuxt/devtools-kit@1.3.7(magicast@0.3.4)(rollup@4.18.0)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2))': + '@nuxt/devtools-kit@1.3.7(magicast@0.3.4)(rollup@4.18.0)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0))': dependencies: - '@nuxt/kit': 3.12.2(magicast@0.3.4)(rollup@4.18.0) + '@nuxt/kit': 3.13.0(magicast@0.3.4)(rollup@4.18.0) '@nuxt/schema': 3.12.2(rollup@4.18.0) execa: 7.2.0 - vite: 5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2) + vite: 5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0) transitivePeerDependencies: - magicast - rollup - supports-color - '@nuxt/devtools-kit@1.4.1(magicast@0.3.4)(rollup@3.29.4)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2))': + '@nuxt/devtools-kit@1.4.2(magicast@0.3.5)(rollup@3.29.4)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0))': dependencies: - '@nuxt/kit': 3.13.0(magicast@0.3.4)(rollup@3.29.4) - '@nuxt/schema': 3.13.0(rollup@3.29.4) + '@nuxt/kit': 3.13.1(magicast@0.3.5)(rollup@3.29.4) + '@nuxt/schema': 3.13.1(rollup@3.29.4) execa: 7.2.0 - vite: 5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2) + vite: 5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0) transitivePeerDependencies: - magicast - rollup @@ -18109,28 +19321,28 @@ snapshots: pkg-types: 1.1.3 prompts: 2.4.2 rc9: 2.1.2 - semver: 7.6.2 + semver: 7.6.3 - '@nuxt/devtools-wizard@1.4.1': + '@nuxt/devtools-wizard@1.4.2': dependencies: consola: 3.2.3 - diff: 5.2.0 + diff: 7.0.0 execa: 7.2.0 global-directory: 4.0.1 - magicast: 0.3.4 + magicast: 0.3.5 pathe: 1.1.2 pkg-types: 1.2.0 prompts: 2.4.2 rc9: 2.1.2 semver: 7.6.3 - '@nuxt/devtools@1.3.7(rollup@3.29.4)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2))': + '@nuxt/devtools@1.3.7(rollup@3.29.4)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0))': dependencies: '@antfu/utils': 0.7.10 - '@nuxt/devtools-kit': 1.3.7(magicast@0.3.4)(rollup@3.29.4)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2)) + '@nuxt/devtools-kit': 1.3.7(magicast@0.3.4)(rollup@3.29.4)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0)) '@nuxt/devtools-wizard': 1.3.7 '@nuxt/kit': 3.12.2(magicast@0.3.4)(rollup@3.29.4) - '@vue/devtools-core': 7.3.3(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2)) + '@vue/devtools-core': 7.3.3(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0)) '@vue/devtools-kit': 7.3.3 birpc: 0.2.17 consola: 3.2.3 @@ -18155,13 +19367,13 @@ snapshots: pkg-types: 1.1.1 rc9: 2.1.2 scule: 1.3.0 - semver: 7.6.2 + semver: 7.6.3 simple-git: 3.25.0 sirv: 2.0.4 unimport: 3.7.2(rollup@3.29.4) - vite: 5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2) - vite-plugin-inspect: 0.8.4(@nuxt/kit@3.12.2(magicast@0.3.4)(rollup@3.29.4))(rollup@3.29.4)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2)) - vite-plugin-vue-inspector: 5.1.2(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2)) + vite: 5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0) + vite-plugin-inspect: 0.8.4(@nuxt/kit@3.12.2(magicast@0.3.4)(rollup@3.29.4))(rollup@3.29.4)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0)) + vite-plugin-vue-inspector: 5.1.2(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0)) which: 3.0.1 ws: 8.17.1 transitivePeerDependencies: @@ -18170,13 +19382,13 @@ snapshots: - supports-color - utf-8-validate - '@nuxt/devtools@1.3.7(rollup@4.18.0)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2))': + '@nuxt/devtools@1.3.7(rollup@4.18.0)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0))': dependencies: '@antfu/utils': 0.7.10 - '@nuxt/devtools-kit': 1.3.7(magicast@0.3.4)(rollup@4.18.0)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2)) + '@nuxt/devtools-kit': 1.3.7(magicast@0.3.4)(rollup@4.18.0)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0)) '@nuxt/devtools-wizard': 1.3.7 '@nuxt/kit': 3.12.2(magicast@0.3.4)(rollup@4.18.0) - '@vue/devtools-core': 7.3.3(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2)) + '@vue/devtools-core': 7.3.3(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0)) '@vue/devtools-kit': 7.3.3 birpc: 0.2.17 consola: 3.2.3 @@ -18201,13 +19413,13 @@ snapshots: pkg-types: 1.1.1 rc9: 2.1.2 scule: 1.3.0 - semver: 7.6.2 + semver: 7.6.3 simple-git: 3.25.0 sirv: 2.0.4 unimport: 3.7.2(rollup@4.18.0) - vite: 5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2) - vite-plugin-inspect: 0.8.4(@nuxt/kit@3.12.2(magicast@0.3.4)(rollup@4.18.0))(rollup@4.18.0)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2)) - vite-plugin-vue-inspector: 5.1.2(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2)) + vite: 5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0) + vite-plugin-inspect: 0.8.4(@nuxt/kit@3.12.2(magicast@0.3.4)(rollup@4.18.0))(rollup@4.18.0)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0)) + vite-plugin-vue-inspector: 5.1.2(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0)) which: 3.0.1 ws: 8.17.1 transitivePeerDependencies: @@ -18216,14 +19428,14 @@ snapshots: - supports-color - utf-8-validate - '@nuxt/devtools@1.4.1(rollup@3.29.4)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2))': + '@nuxt/devtools@1.4.2(rollup@3.29.4)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0))(vue@3.4.25(typescript@5.5.2))': dependencies: '@antfu/utils': 0.7.10 - '@nuxt/devtools-kit': 1.4.1(magicast@0.3.4)(rollup@3.29.4)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2)) - '@nuxt/devtools-wizard': 1.4.1 - '@nuxt/kit': 3.13.0(magicast@0.3.4)(rollup@3.29.4) - '@vue/devtools-core': 7.3.3(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2)) - '@vue/devtools-kit': 7.3.3 + '@nuxt/devtools-kit': 1.4.2(magicast@0.3.5)(rollup@3.29.4)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0)) + '@nuxt/devtools-wizard': 1.4.2 + '@nuxt/kit': 3.13.1(magicast@0.3.5)(rollup@3.29.4) + '@vue/devtools-core': 7.4.4(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0))(vue@3.4.25(typescript@5.5.2)) + '@vue/devtools-kit': 7.4.4 birpc: 0.2.17 consola: 3.2.3 cronstrue: 2.50.0 @@ -18236,9 +19448,9 @@ snapshots: hookable: 5.5.3 image-meta: 0.2.1 is-installed-globally: 1.0.0 - launch-editor: 2.8.1 + launch-editor: 2.9.1 local-pkg: 0.5.0 - magicast: 0.3.4 + magicast: 0.3.5 nypm: 0.3.11 ohash: 1.1.3 pathe: 1.1.2 @@ -18247,13 +19459,13 @@ snapshots: rc9: 2.1.2 scule: 1.3.0 semver: 7.6.3 - simple-git: 3.25.0 + simple-git: 3.26.0 sirv: 2.0.4 - tinyglobby: 0.2.5 + tinyglobby: 0.2.6 unimport: 3.11.1(rollup@3.29.4) - vite: 5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2) - vite-plugin-inspect: 0.8.7(@nuxt/kit@3.13.0(magicast@0.3.4)(rollup@3.29.4))(rollup@3.29.4)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2)) - vite-plugin-vue-inspector: 5.1.3(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2)) + vite: 5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0) + vite-plugin-inspect: 0.8.7(@nuxt/kit@3.13.1(magicast@0.3.5)(rollup@3.29.4))(rollup@3.29.4)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0)) + vite-plugin-vue-inspector: 5.2.0(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0)) which: 3.0.1 ws: 8.18.0 transitivePeerDependencies: @@ -18261,17 +19473,95 @@ snapshots: - rollup - supports-color - utf-8-validate + - vue + + '@nuxt/kit@3.11.2(magicast@0.3.4)(rollup@4.18.0)': + dependencies: + '@nuxt/schema': 3.11.2(rollup@4.18.0) + c12: 1.11.1(magicast@0.3.4) + consola: 3.2.3 + defu: 6.1.4 + globby: 14.0.1 + hash-sum: 2.0.0 + ignore: 5.3.2 + jiti: 1.21.6 + knitwork: 1.1.0 + mlly: 1.7.1 + pathe: 1.1.2 + pkg-types: 1.1.1 + scule: 1.3.0 + semver: 7.6.3 + ufo: 1.5.3 + unctx: 2.3.1 + unimport: 3.7.2(rollup@4.18.0) + untyped: 1.4.2 + transitivePeerDependencies: + - magicast + - rollup + - supports-color - '@nuxt/kit@3.11.2(magicast@0.3.4)(rollup@3.29.4)': + '@nuxt/kit@3.11.2(magicast@0.3.5)(rollup@3.29.4)': dependencies: '@nuxt/schema': 3.11.2(rollup@3.29.4) + c12: 1.11.1(magicast@0.3.5) + consola: 3.2.3 + defu: 6.1.4 + globby: 14.0.1 + hash-sum: 2.0.0 + ignore: 5.3.2 + jiti: 1.21.6 + knitwork: 1.1.0 + mlly: 1.7.1 + pathe: 1.1.2 + pkg-types: 1.1.1 + scule: 1.3.0 + semver: 7.6.3 + ufo: 1.5.3 + unctx: 2.3.1 + unimport: 3.7.2(rollup@3.29.4) + untyped: 1.4.2 + transitivePeerDependencies: + - magicast + - rollup + - supports-color + + '@nuxt/kit@3.11.2(magicast@0.3.5)(rollup@4.18.0)': + dependencies: + '@nuxt/schema': 3.11.2(rollup@4.18.0) + c12: 1.11.1(magicast@0.3.5) + consola: 3.2.3 + defu: 6.1.4 + globby: 14.0.1 + hash-sum: 2.0.0 + ignore: 5.3.2 + jiti: 1.21.6 + knitwork: 1.1.0 + mlly: 1.7.1 + pathe: 1.1.2 + pkg-types: 1.1.1 + scule: 1.3.0 + semver: 7.6.3 + ufo: 1.5.3 + unctx: 2.3.1 + unimport: 3.7.2(rollup@4.18.0) + untyped: 1.4.2 + transitivePeerDependencies: + - magicast + - rollup + - supports-color + + '@nuxt/kit@3.12.2(magicast@0.3.4)(rollup@3.29.4)': + dependencies: + '@nuxt/schema': 3.12.2(rollup@3.29.4) c12: 1.11.1(magicast@0.3.4) consola: 3.2.3 defu: 6.1.4 + destr: 2.0.3 globby: 14.0.1 hash-sum: 2.0.0 ignore: 5.3.1 jiti: 1.21.6 + klona: 2.0.6 knitwork: 1.1.0 mlly: 1.7.1 pathe: 1.1.2 @@ -18287,16 +19577,18 @@ snapshots: - rollup - supports-color - '@nuxt/kit@3.11.2(magicast@0.3.4)(rollup@4.18.0)': + '@nuxt/kit@3.12.2(magicast@0.3.4)(rollup@4.18.0)': dependencies: - '@nuxt/schema': 3.11.2(rollup@4.18.0) + '@nuxt/schema': 3.12.2(rollup@4.18.0) c12: 1.11.1(magicast@0.3.4) consola: 3.2.3 defu: 6.1.4 + destr: 2.0.3 globby: 14.0.1 hash-sum: 2.0.0 ignore: 5.3.1 jiti: 1.21.6 + klona: 2.0.6 knitwork: 1.1.0 mlly: 1.7.1 pathe: 1.1.2 @@ -18312,10 +19604,10 @@ snapshots: - rollup - supports-color - '@nuxt/kit@3.12.2(magicast@0.3.4)(rollup@3.29.4)': + '@nuxt/kit@3.12.2(magicast@0.3.5)(rollup@3.29.4)': dependencies: '@nuxt/schema': 3.12.2(rollup@3.29.4) - c12: 1.11.1(magicast@0.3.4) + c12: 1.11.1(magicast@0.3.5) consola: 3.2.3 defu: 6.1.4 destr: 2.0.3 @@ -18339,10 +19631,10 @@ snapshots: - rollup - supports-color - '@nuxt/kit@3.12.2(magicast@0.3.4)(rollup@4.18.0)': + '@nuxt/kit@3.12.2(magicast@0.3.5)(rollup@4.18.0)': dependencies: '@nuxt/schema': 3.12.2(rollup@4.18.0) - c12: 1.11.1(magicast@0.3.4) + c12: 1.11.1(magicast@0.3.5) consola: 3.2.3 defu: 6.1.4 destr: 2.0.3 @@ -18393,9 +19685,63 @@ snapshots: - rollup - supports-color - '@nuxt/module-builder@0.5.5(@nuxt/kit@3.12.2(magicast@0.3.4)(rollup@3.29.4))(nuxi@3.11.1)(typescript@5.5.2)': + '@nuxt/kit@3.13.0(magicast@0.3.4)(rollup@4.18.0)': dependencies: - '@nuxt/kit': 3.12.2(magicast@0.3.4)(rollup@3.29.4) + '@nuxt/schema': 3.13.0(rollup@4.18.0) + c12: 1.11.1(magicast@0.3.4) + consola: 3.2.3 + defu: 6.1.4 + destr: 2.0.3 + globby: 14.0.2 + hash-sum: 2.0.0 + ignore: 5.3.2 + jiti: 1.21.6 + klona: 2.0.6 + knitwork: 1.1.0 + mlly: 1.7.1 + pathe: 1.1.2 + pkg-types: 1.2.0 + scule: 1.3.0 + semver: 7.6.3 + ufo: 1.5.4 + unctx: 2.3.1 + unimport: 3.11.1(rollup@4.18.0) + untyped: 1.4.2 + transitivePeerDependencies: + - magicast + - rollup + - supports-color + + '@nuxt/kit@3.13.1(magicast@0.3.5)(rollup@3.29.4)': + dependencies: + '@nuxt/schema': 3.13.1(rollup@3.29.4) + c12: 1.11.2(magicast@0.3.5) + consola: 3.2.3 + defu: 6.1.4 + destr: 2.0.3 + globby: 14.0.2 + hash-sum: 2.0.0 + ignore: 5.3.2 + jiti: 1.21.6 + klona: 2.0.6 + knitwork: 1.1.0 + mlly: 1.7.1 + pathe: 1.1.2 + pkg-types: 1.2.0 + scule: 1.3.0 + semver: 7.6.3 + ufo: 1.5.4 + unctx: 2.3.1 + unimport: 3.11.1(rollup@3.29.4) + untyped: 1.4.2 + transitivePeerDependencies: + - magicast + - rollup + - supports-color + + '@nuxt/module-builder@0.5.5(@nuxt/kit@3.12.2(magicast@0.3.5)(rollup@3.29.4))(nuxi@3.11.1)(typescript@5.5.2)': + dependencies: + '@nuxt/kit': 3.12.2(magicast@0.3.5)(rollup@3.29.4) citty: 0.1.6 consola: 3.2.3 mlly: 1.7.1 @@ -18495,9 +19841,45 @@ snapshots: - rollup - supports-color - '@nuxt/telemetry@2.5.4(magicast@0.3.4)(rollup@3.29.4)': + '@nuxt/schema@3.13.0(rollup@4.18.0)': dependencies: - '@nuxt/kit': 3.12.2(magicast@0.3.4)(rollup@3.29.4) + compatx: 0.1.8 + consola: 3.2.3 + defu: 6.1.4 + hookable: 5.5.3 + pathe: 1.1.2 + pkg-types: 1.2.0 + scule: 1.3.0 + std-env: 3.7.0 + ufo: 1.5.4 + uncrypto: 0.1.3 + unimport: 3.11.1(rollup@4.18.0) + untyped: 1.4.2 + transitivePeerDependencies: + - rollup + - supports-color + + '@nuxt/schema@3.13.1(rollup@3.29.4)': + dependencies: + compatx: 0.1.8 + consola: 3.2.3 + defu: 6.1.4 + hookable: 5.5.3 + pathe: 1.1.2 + pkg-types: 1.2.0 + scule: 1.3.0 + std-env: 3.7.0 + ufo: 1.5.4 + uncrypto: 0.1.3 + unimport: 3.11.1(rollup@3.29.4) + untyped: 1.4.2 + transitivePeerDependencies: + - rollup + - supports-color + + '@nuxt/telemetry@2.5.4(magicast@0.3.4)(rollup@4.18.0)': + dependencies: + '@nuxt/kit': 3.12.2(magicast@0.3.4)(rollup@4.18.0) ci-info: 4.0.0 consola: 3.2.3 create-require: 1.1.1 @@ -18519,9 +19901,9 @@ snapshots: - rollup - supports-color - '@nuxt/telemetry@2.5.4(magicast@0.3.4)(rollup@4.18.0)': + '@nuxt/telemetry@2.5.4(magicast@0.3.5)(rollup@3.29.4)': dependencies: - '@nuxt/kit': 3.12.2(magicast@0.3.4)(rollup@4.18.0) + '@nuxt/kit': 3.12.2(magicast@0.3.5)(rollup@3.29.4) ci-info: 4.0.0 consola: 3.2.3 create-require: 1.1.1 @@ -18543,11 +19925,35 @@ snapshots: - rollup - supports-color - '@nuxt/test-utils@3.12.1(@playwright/test@1.45.0)(h3@1.11.1)(happy-dom@13.10.1)(magicast@0.3.4)(playwright-core@1.45.0)(rollup@3.29.4)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2))(vitest@1.6.0(@types/node@20.14.0)(happy-dom@13.10.1)(lightningcss@1.24.1)(terser@5.19.2))(vue-router@4.3.2(vue@3.4.25(typescript@5.5.2)))(vue@3.4.25(typescript@5.5.2))': + '@nuxt/telemetry@2.5.4(magicast@0.3.5)(rollup@4.18.0)': dependencies: - '@nuxt/kit': 3.12.2(magicast@0.3.4)(rollup@3.29.4) + '@nuxt/kit': 3.12.2(magicast@0.3.5)(rollup@4.18.0) + ci-info: 4.0.0 + consola: 3.2.3 + create-require: 1.1.1 + defu: 6.1.4 + destr: 2.0.3 + dotenv: 16.4.5 + git-url-parse: 14.0.0 + is-docker: 3.0.0 + jiti: 1.21.6 + mri: 1.2.0 + nanoid: 5.0.7 + ofetch: 1.3.4 + parse-git-config: 3.0.0 + pathe: 1.1.2 + rc9: 2.1.2 + std-env: 3.7.0 + transitivePeerDependencies: + - magicast + - rollup + - supports-color + + '@nuxt/test-utils@3.12.1(@playwright/test@1.45.0)(h3@1.11.1)(happy-dom@13.10.1)(magicast@0.3.5)(playwright-core@1.45.0)(rollup@3.29.4)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0))(vitest@1.6.0(@types/node@20.14.0)(@vitest/browser@2.0.5(typescript@5.5.2)(vitest@2.0.5))(happy-dom@13.10.1)(lightningcss@1.24.1)(terser@5.32.0))(vue-router@4.3.2(vue@3.4.25(typescript@5.5.2)))(vue@3.4.25(typescript@5.5.2))': + dependencies: + '@nuxt/kit': 3.12.2(magicast@0.3.5)(rollup@3.29.4) '@nuxt/schema': 3.12.2(rollup@3.29.4) - c12: 1.11.1(magicast@0.3.4) + c12: 1.11.1(magicast@0.3.5) consola: 3.2.3 defu: 6.1.4 destr: 2.0.3 @@ -18568,15 +19974,15 @@ snapshots: ufo: 1.5.3 unenv: 1.9.0 unplugin: 1.10.1 - vite: 5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2) - vitest-environment-nuxt: 1.0.0(@playwright/test@1.45.0)(h3@1.11.1)(happy-dom@13.10.1)(magicast@0.3.4)(playwright-core@1.45.0)(rollup@3.29.4)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2))(vitest@1.6.0(@types/node@20.14.0)(happy-dom@13.10.1)(lightningcss@1.24.1)(terser@5.19.2))(vue-router@4.3.2(vue@3.4.25(typescript@5.5.2)))(vue@3.4.25(typescript@5.5.2)) + vite: 5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0) + vitest-environment-nuxt: 1.0.0(@playwright/test@1.45.0)(h3@1.11.1)(happy-dom@13.10.1)(magicast@0.3.5)(playwright-core@1.45.0)(rollup@3.29.4)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0))(vitest@1.6.0(@types/node@20.14.0)(@vitest/browser@2.0.5(typescript@5.5.2)(vitest@2.0.5))(happy-dom@13.10.1)(lightningcss@1.24.1)(terser@5.32.0))(vue-router@4.3.2(vue@3.4.25(typescript@5.5.2)))(vue@3.4.25(typescript@5.5.2)) vue: 3.4.25(typescript@5.5.2) vue-router: 4.3.2(vue@3.4.25(typescript@5.5.2)) optionalDependencies: '@playwright/test': 1.45.0 happy-dom: 13.10.1 playwright-core: 1.45.0 - vitest: 1.6.0(@types/node@20.14.0)(happy-dom@13.10.1)(lightningcss@1.24.1)(terser@5.19.2) + vitest: 1.6.0(@types/node@20.14.0)(@vitest/browser@2.0.5(typescript@5.5.2)(vitest@2.0.5))(happy-dom@13.10.1)(lightningcss@1.24.1)(terser@5.32.0) transitivePeerDependencies: - magicast - rollup @@ -18584,12 +19990,70 @@ snapshots: '@nuxt/ui-templates@1.3.3': {} - '@nuxt/vite-builder@3.11.2(@types/node@20.14.0)(eslint@8.57.0)(lightningcss@1.24.1)(magicast@0.3.4)(optionator@0.9.3)(rollup@3.29.4)(terser@5.19.2)(typescript@5.5.2)(vue-tsc@2.0.14(typescript@5.5.2))(vue@3.4.25(typescript@5.5.2))': + '@nuxt/vite-builder@3.11.2(@types/node@20.14.0)(eslint@8.57.0)(lightningcss@1.24.1)(magicast@0.3.4)(optionator@0.9.3)(rollup@4.18.0)(terser@5.32.0)(typescript@5.5.2)(vue-tsc@2.0.14(typescript@5.5.2))(vue@3.4.25(typescript@5.5.2))': + dependencies: + '@nuxt/kit': 3.11.2(magicast@0.3.4)(rollup@4.18.0) + '@rollup/plugin-replace': 5.0.5(rollup@4.18.0) + '@vitejs/plugin-vue': 5.0.4(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0))(vue@3.4.25(typescript@5.5.2)) + '@vitejs/plugin-vue-jsx': 3.1.0(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0))(vue@3.4.25(typescript@5.5.2)) + autoprefixer: 10.4.19(postcss@8.4.38) + clear: 0.1.0 + consola: 3.2.3 + cssnano: 6.1.2(postcss@8.4.38) + defu: 6.1.4 + esbuild: 0.20.2 + escape-string-regexp: 5.0.0 + estree-walker: 3.0.3 + externality: 1.0.2 + fs-extra: 11.2.0 + get-port-please: 3.1.2 + h3: 1.11.1 + knitwork: 1.1.0 + magic-string: 0.30.10 + mlly: 1.7.1 + ohash: 1.1.3 + pathe: 1.1.2 + perfect-debounce: 1.0.0 + pkg-types: 1.1.1 + postcss: 8.4.38 + rollup-plugin-visualizer: 5.12.0(rollup@4.18.0) + std-env: 3.7.0 + strip-literal: 2.1.0 + ufo: 1.5.3 + unenv: 1.9.0 + unplugin: 1.10.1 + vite: 5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0) + vite-node: 1.6.0(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0) + vite-plugin-checker: 0.6.4(eslint@8.57.0)(optionator@0.9.3)(typescript@5.5.2)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0))(vue-tsc@2.0.14(typescript@5.5.2)) + vue: 3.4.25(typescript@5.5.2) + vue-bundle-renderer: 2.0.0 + transitivePeerDependencies: + - '@types/node' + - eslint + - less + - lightningcss + - magicast + - meow + - optionator + - rollup + - sass + - stylelint + - stylus + - sugarss + - supports-color + - terser + - typescript + - uWebSockets.js + - vls + - vti + - vue-tsc + + '@nuxt/vite-builder@3.11.2(@types/node@20.14.0)(eslint@8.57.0)(lightningcss@1.24.1)(magicast@0.3.5)(optionator@0.9.3)(rollup@3.29.4)(terser@5.32.0)(typescript@5.5.2)(vue-tsc@2.0.14(typescript@5.5.2))(vue@3.4.25(typescript@5.5.2))': dependencies: - '@nuxt/kit': 3.11.2(magicast@0.3.4)(rollup@3.29.4) + '@nuxt/kit': 3.11.2(magicast@0.3.5)(rollup@3.29.4) '@rollup/plugin-replace': 5.0.5(rollup@3.29.4) - '@vitejs/plugin-vue': 5.0.4(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2))(vue@3.4.25(typescript@5.5.2)) - '@vitejs/plugin-vue-jsx': 3.1.0(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2))(vue@3.4.25(typescript@5.5.2)) + '@vitejs/plugin-vue': 5.0.4(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0))(vue@3.4.25(typescript@5.5.2)) + '@vitejs/plugin-vue-jsx': 3.1.0(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0))(vue@3.4.25(typescript@5.5.2)) autoprefixer: 10.4.19(postcss@8.4.38) clear: 0.1.0 consola: 3.2.3 @@ -18616,9 +20080,9 @@ snapshots: ufo: 1.5.3 unenv: 1.9.0 unplugin: 1.10.1 - vite: 5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2) - vite-node: 1.6.0(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2) - vite-plugin-checker: 0.6.4(eslint@8.57.0)(optionator@0.9.3)(typescript@5.5.2)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2))(vue-tsc@2.0.14(typescript@5.5.2)) + vite: 5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0) + vite-node: 1.6.0(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0) + vite-plugin-checker: 0.6.4(eslint@8.57.0)(optionator@0.9.3)(typescript@5.5.2)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0))(vue-tsc@2.0.14(typescript@5.5.2)) vue: 3.4.25(typescript@5.5.2) vue-bundle-renderer: 2.0.0 transitivePeerDependencies: @@ -18642,12 +20106,12 @@ snapshots: - vti - vue-tsc - '@nuxt/vite-builder@3.11.2(@types/node@20.14.0)(eslint@8.57.0)(lightningcss@1.24.1)(magicast@0.3.4)(optionator@0.9.3)(rollup@4.18.0)(terser@5.19.2)(typescript@5.5.2)(vue-tsc@2.0.14(typescript@5.5.2))(vue@3.4.25(typescript@5.5.2))': + '@nuxt/vite-builder@3.11.2(@types/node@20.14.0)(eslint@8.57.0)(lightningcss@1.24.1)(magicast@0.3.5)(optionator@0.9.3)(rollup@4.18.0)(terser@5.32.0)(typescript@5.5.2)(vue-tsc@2.0.14(typescript@5.5.2))(vue@3.4.25(typescript@5.5.2))': dependencies: - '@nuxt/kit': 3.11.2(magicast@0.3.4)(rollup@4.18.0) + '@nuxt/kit': 3.11.2(magicast@0.3.5)(rollup@4.18.0) '@rollup/plugin-replace': 5.0.5(rollup@4.18.0) - '@vitejs/plugin-vue': 5.0.4(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2))(vue@3.4.25(typescript@5.5.2)) - '@vitejs/plugin-vue-jsx': 3.1.0(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2))(vue@3.4.25(typescript@5.5.2)) + '@vitejs/plugin-vue': 5.0.4(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0))(vue@3.4.25(typescript@5.5.2)) + '@vitejs/plugin-vue-jsx': 3.1.0(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0))(vue@3.4.25(typescript@5.5.2)) autoprefixer: 10.4.19(postcss@8.4.38) clear: 0.1.0 consola: 3.2.3 @@ -18674,9 +20138,9 @@ snapshots: ufo: 1.5.3 unenv: 1.9.0 unplugin: 1.10.1 - vite: 5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2) - vite-node: 1.6.0(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2) - vite-plugin-checker: 0.6.4(eslint@8.57.0)(optionator@0.9.3)(typescript@5.5.2)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2))(vue-tsc@2.0.14(typescript@5.5.2)) + vite: 5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0) + vite-node: 1.6.0(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0) + vite-plugin-checker: 0.6.4(eslint@8.57.0)(optionator@0.9.3)(typescript@5.5.2)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0))(vue-tsc@2.0.14(typescript@5.5.2)) vue: 3.4.25(typescript@5.5.2) vue-bundle-renderer: 2.0.0 transitivePeerDependencies: @@ -18889,24 +20353,6 @@ snapshots: dependencies: '@babel/runtime': 7.24.4 - '@radix-ui/react-accordion@1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@babel/runtime': 7.24.4 - '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-collapsible': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1) - '@radix-ui/react-context': 1.0.1(@types/react@18.3.3)(react@18.3.1) - '@radix-ui/react-direction': 1.0.1(@types/react@18.3.3)(react@18.3.1) - '@radix-ui/react-id': 1.0.1(@types/react@18.3.3)(react@18.3.1) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.3)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.3 - '@types/react-dom': 18.3.0 - '@radix-ui/react-arrow@1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.24.4 @@ -18917,23 +20363,6 @@ snapshots: '@types/react': 18.3.3 '@types/react-dom': 18.3.0 - '@radix-ui/react-collapsible@1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@babel/runtime': 7.24.4 - '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1) - '@radix-ui/react-context': 1.0.1(@types/react@18.3.3)(react@18.3.1) - '@radix-ui/react-id': 1.0.1(@types/react@18.3.3)(react@18.3.1) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.3)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.3)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.3 - '@types/react-dom': 18.3.0 - '@radix-ui/react-collection@1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.24.4 @@ -19354,6 +20783,37 @@ snapshots: dependencies: '@babel/runtime': 7.24.4 + '@react-aria/focus@3.18.2(react@18.3.1)': + dependencies: + '@react-aria/interactions': 3.22.2(react@18.3.1) + '@react-aria/utils': 3.25.2(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) + '@swc/helpers': 0.5.11 + clsx: 2.1.0 + react: 18.3.1 + + '@react-aria/interactions@3.22.2(react@18.3.1)': + dependencies: + '@react-aria/ssr': 3.9.5(react@18.3.1) + '@react-aria/utils': 3.25.2(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) + '@swc/helpers': 0.5.11 + react: 18.3.1 + + '@react-aria/ssr@3.9.5(react@18.3.1)': + dependencies: + '@swc/helpers': 0.5.11 + react: 18.3.1 + + '@react-aria/utils@3.25.2(react@18.3.1)': + dependencies: + '@react-aria/ssr': 3.9.5(react@18.3.1) + '@react-stately/utils': 3.10.3(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) + '@swc/helpers': 0.5.11 + clsx: 2.1.0 + react: 18.3.1 + '@react-native-community/cli-clean@13.6.6(encoding@0.1.13)': dependencies: '@react-native-community/cli-tools': 13.6.6(encoding@0.1.13) @@ -19395,7 +20855,7 @@ snapshots: hermes-profile-transformer: 0.0.6 node-stream-zip: 1.15.0 ora: 5.4.1 - semver: 7.6.2 + semver: 7.6.3 strip-ansi: 5.2.0 wcwidth: 1.0.1 yaml: 2.4.1 @@ -19466,7 +20926,7 @@ snapshots: node-fetch: 2.6.12(encoding@0.1.13) open: 6.4.0 ora: 5.4.1 - semver: 7.6.2 + semver: 7.6.3 shell-quote: 1.8.1 sudo-prompt: 9.2.1 transitivePeerDependencies: @@ -19494,7 +20954,7 @@ snapshots: fs-extra: 8.1.0 graceful-fs: 4.2.11 prompts: 2.4.2 - semver: 7.6.2 + semver: 7.6.3 transitivePeerDependencies: - bufferutil - encoding @@ -19691,35 +21151,153 @@ snapshots: react: 18.3.1 react-native: 0.74.1(@babel/core@7.24.4)(@babel/preset-env@7.24.6(@babel/core@7.24.4))(@types/react@18.3.3)(encoding@0.1.13)(react@18.3.1) - '@react-navigation/routers@6.1.9': + '@react-navigation/routers@6.1.9': + dependencies: + nanoid: 3.3.7 + + '@react-stately/utils@3.10.3(react@18.3.1)': + dependencies: + '@swc/helpers': 0.5.11 + react: 18.3.1 + + '@react-types/shared@3.24.1(react@18.3.1)': + dependencies: + react: 18.3.1 + + '@remirror/core-constants@2.0.2': {} + + '@remix-run/dev@2.12.0(@remix-run/react@2.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.2))(@remix-run/serve@2.12.0(typescript@5.5.2))(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0)(typescript@5.5.2)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0))(wrangler@3.62.0)': + dependencies: + '@babel/core': 7.24.4 + '@babel/generator': 7.24.4 + '@babel/parser': 7.25.6 + '@babel/plugin-syntax-decorators': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-syntax-jsx': 7.24.6(@babel/core@7.24.4) + '@babel/preset-typescript': 7.24.1(@babel/core@7.24.4) + '@babel/traverse': 7.24.1 + '@babel/types': 7.25.6 + '@mdx-js/mdx': 2.3.0 + '@npmcli/package-json': 4.0.1 + '@remix-run/node': 2.12.0(typescript@5.5.2) + '@remix-run/react': 2.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.2) + '@remix-run/router': 1.19.2 + '@remix-run/server-runtime': 2.12.0(typescript@5.5.2) + '@types/mdx': 2.0.13 + '@vanilla-extract/integration': 6.5.0(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0) + arg: 5.0.2 + cacache: 17.1.4 + chalk: 4.1.2 + chokidar: 3.6.0 + cross-spawn: 7.0.3 + dotenv: 16.4.5 + es-module-lexer: 1.5.0 + esbuild: 0.17.6 + esbuild-plugins-node-modules-polyfill: 1.6.6(esbuild@0.17.6) + execa: 5.1.1 + exit-hook: 2.2.1 + express: 4.19.2 + fs-extra: 10.1.0 + get-port: 5.1.1 + gunzip-maybe: 1.4.2 + jsesc: 3.0.2 + json5: 2.2.3 + lodash: 4.17.21 + lodash.debounce: 4.0.8 + minimatch: 9.0.4 + ora: 5.4.1 + picocolors: 1.0.1 + picomatch: 2.3.1 + pidtree: 0.6.0 + postcss: 8.4.38 + postcss-discard-duplicates: 5.1.0(postcss@8.4.38) + postcss-load-config: 4.0.1(postcss@8.4.38) + postcss-modules: 6.0.0(postcss@8.4.38) + prettier: 2.8.8 + pretty-ms: 7.0.1 + react-refresh: 0.14.2 + remark-frontmatter: 4.0.1 + remark-mdx-frontmatter: 1.1.1 + semver: 7.6.3 + set-cookie-parser: 2.6.0 + tar-fs: 2.1.1 + tsconfig-paths: 4.2.0 + ws: 7.5.9 + optionalDependencies: + '@remix-run/serve': 2.12.0(typescript@5.5.2) + typescript: 5.5.2 + vite: 5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0) + wrangler: 3.62.0(@cloudflare/workers-types@4.20240620.0) + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - bluebird + - bufferutil + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + - ts-node + - utf-8-validate + + '@remix-run/express@2.12.0(express@4.19.2)(typescript@5.5.2)': dependencies: - nanoid: 3.3.7 - - '@remirror/core-constants@2.0.2': {} + '@remix-run/node': 2.12.0(typescript@5.5.2) + express: 4.19.2 + optionalDependencies: + typescript: 5.5.2 - '@remix-run/node@2.9.2(typescript@5.5.2)': + '@remix-run/node@2.12.0(typescript@5.5.2)': dependencies: - '@remix-run/server-runtime': 2.9.2(typescript@5.5.2) + '@remix-run/server-runtime': 2.12.0(typescript@5.5.2) '@remix-run/web-fetch': 4.4.2 '@web3-storage/multipart-parser': 1.0.0 cookie-signature: 1.2.1 source-map-support: 0.5.21 stream-slice: 0.1.2 - undici: 6.19.2 + undici: 6.19.8 optionalDependencies: typescript: 5.5.2 - '@remix-run/router@1.16.1': {} + '@remix-run/react@2.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.2)': + dependencies: + '@remix-run/router': 1.19.2 + '@remix-run/server-runtime': 2.12.0(typescript@5.5.2) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-router: 6.26.2(react@18.3.1) + react-router-dom: 6.26.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + turbo-stream: 2.4.0 + optionalDependencies: + typescript: 5.5.2 + + '@remix-run/router@1.19.2': {} + + '@remix-run/serve@2.12.0(typescript@5.5.2)': + dependencies: + '@remix-run/express': 2.12.0(express@4.19.2)(typescript@5.5.2) + '@remix-run/node': 2.12.0(typescript@5.5.2) + chokidar: 3.6.0 + compression: 1.7.4 + express: 4.19.2 + get-port: 5.1.1 + morgan: 1.10.0 + source-map-support: 0.5.21 + transitivePeerDependencies: + - supports-color + - typescript - '@remix-run/server-runtime@2.9.2(typescript@5.5.2)': + '@remix-run/server-runtime@2.12.0(typescript@5.5.2)': dependencies: - '@remix-run/router': 1.16.1 + '@remix-run/router': 1.19.2 '@types/cookie': 0.6.0 '@web3-storage/multipart-parser': 1.0.0 cookie: 0.6.0 set-cookie-parser: 2.6.0 source-map: 0.7.4 - turbo-stream: 2.1.0 + turbo-stream: 2.4.0 optionalDependencies: typescript: 5.5.2 @@ -19806,7 +21384,7 @@ snapshots: dependencies: '@rollup/pluginutils': 5.1.0(rollup@4.18.0) estree-walker: 2.0.2 - magic-string: 0.30.10 + magic-string: 0.30.11 optionalDependencies: rollup: 4.18.0 @@ -19943,11 +21521,11 @@ snapshots: '@rushstack/eslint-patch@1.10.2': {} - '@scalar/api-client@2.0.15(@types/bun@1.1.5)(storybook@8.2.1(@babel/preset-env@7.24.6(@babel/core@7.24.4)))(tailwindcss@3.4.3)(typescript@5.5.2)(vitest@1.6.0(@types/node@20.14.0)(happy-dom@13.10.1)(lightningcss@1.24.1)(terser@5.19.2))': + '@scalar/api-client@2.0.15(@types/bun@1.1.5)(storybook@8.2.1(@babel/preset-env@7.24.6(@babel/core@7.24.4)))(tailwindcss@3.4.3)(typescript@5.5.2)(vitest@2.0.5(@types/node@20.14.0)(@vitest/browser@2.0.5(typescript@5.5.2)(vitest@2.0.5))(happy-dom@13.10.1)(lightningcss@1.24.1)(terser@5.32.0))': dependencies: '@headlessui/tailwindcss': 0.2.1(tailwindcss@3.4.3) '@headlessui/vue': 1.7.20(vue@3.4.25(typescript@5.5.2)) - '@scalar/components': 0.12.12(@types/bun@1.1.5)(storybook@8.2.1(@babel/preset-env@7.24.6(@babel/core@7.24.4)))(typescript@5.5.2)(vitest@1.6.0(@types/node@20.14.0)(happy-dom@13.10.1)(lightningcss@1.24.1)(terser@5.19.2)) + '@scalar/components': 0.12.12(@types/bun@1.1.5)(storybook@8.2.1(@babel/preset-env@7.24.6(@babel/core@7.24.4)))(typescript@5.5.2)(vitest@2.0.5(@types/node@20.14.0)(@vitest/browser@2.0.5(typescript@5.5.2)(vitest@2.0.5))(happy-dom@13.10.1)(lightningcss@1.24.1)(terser@5.32.0)) '@scalar/draggable': 0.1.3(typescript@5.5.2) '@scalar/oas-utils': 0.2.13(typescript@5.5.2) '@scalar/object-utils': 1.1.4(vue@3.4.25(typescript@5.5.2)) @@ -19980,9 +21558,9 @@ snapshots: - typescript - vitest - '@scalar/api-reference-react@0.3.37(@types/bun@1.1.5)(postcss@8.4.38)(storybook@8.2.1(@babel/preset-env@7.24.6(@babel/core@7.24.4)))(tailwindcss@3.4.3)(typescript@5.5.2)(vitest@1.6.0(@types/node@20.14.0)(happy-dom@13.10.1)(lightningcss@1.24.1)(terser@5.19.2))': + '@scalar/api-reference-react@0.3.37(@types/bun@1.1.5)(postcss@8.4.38)(storybook@8.2.1(@babel/preset-env@7.24.6(@babel/core@7.24.4)))(tailwindcss@3.4.3)(typescript@5.5.2)(vitest@2.0.5(@types/node@20.14.0)(@vitest/browser@2.0.5(typescript@5.5.2)(vitest@2.0.5))(happy-dom@13.10.1)(lightningcss@1.24.1)(terser@5.32.0))': dependencies: - '@scalar/api-reference': 1.24.39(@types/bun@1.1.5)(postcss@8.4.38)(storybook@8.2.1(@babel/preset-env@7.24.6(@babel/core@7.24.4)))(tailwindcss@3.4.3)(typescript@5.5.2)(vitest@1.6.0(@types/node@20.14.0)(happy-dom@13.10.1)(lightningcss@1.24.1)(terser@5.19.2)) + '@scalar/api-reference': 1.24.39(@types/bun@1.1.5)(postcss@8.4.38)(storybook@8.2.1(@babel/preset-env@7.24.6(@babel/core@7.24.4)))(tailwindcss@3.4.3)(typescript@5.5.2)(vitest@2.0.5(@types/node@20.14.0)(@vitest/browser@2.0.5(typescript@5.5.2)(vitest@2.0.5))(happy-dom@13.10.1)(lightningcss@1.24.1)(terser@5.32.0)) react: 18.3.1 transitivePeerDependencies: - '@jest/globals' @@ -19998,19 +21576,19 @@ snapshots: - typescript - vitest - '@scalar/api-reference@1.24.39(@types/bun@1.1.5)(postcss@8.4.38)(storybook@8.2.1(@babel/preset-env@7.24.6(@babel/core@7.24.4)))(tailwindcss@3.4.3)(typescript@5.5.2)(vitest@1.6.0(@types/node@20.14.0)(happy-dom@13.10.1)(lightningcss@1.24.1)(terser@5.19.2))': + '@scalar/api-reference@1.24.39(@types/bun@1.1.5)(postcss@8.4.38)(storybook@8.2.1(@babel/preset-env@7.24.6(@babel/core@7.24.4)))(tailwindcss@3.4.3)(typescript@5.5.2)(vitest@2.0.5(@types/node@20.14.0)(@vitest/browser@2.0.5(typescript@5.5.2)(vitest@2.0.5))(happy-dom@13.10.1)(lightningcss@1.24.1)(terser@5.32.0))': dependencies: - '@floating-ui/vue': 1.0.6(vue@3.4.25(typescript@5.5.2)) + '@floating-ui/vue': 1.1.1(vue@3.4.25(typescript@5.5.2)) '@headlessui/vue': 1.7.20(vue@3.4.25(typescript@5.5.2)) - '@scalar/api-client': 2.0.15(@types/bun@1.1.5)(storybook@8.2.1(@babel/preset-env@7.24.6(@babel/core@7.24.4)))(tailwindcss@3.4.3)(typescript@5.5.2)(vitest@1.6.0(@types/node@20.14.0)(happy-dom@13.10.1)(lightningcss@1.24.1)(terser@5.19.2)) - '@scalar/components': 0.12.12(@types/bun@1.1.5)(storybook@8.2.1(@babel/preset-env@7.24.6(@babel/core@7.24.4)))(typescript@5.5.2)(vitest@1.6.0(@types/node@20.14.0)(happy-dom@13.10.1)(lightningcss@1.24.1)(terser@5.19.2)) + '@scalar/api-client': 2.0.15(@types/bun@1.1.5)(storybook@8.2.1(@babel/preset-env@7.24.6(@babel/core@7.24.4)))(tailwindcss@3.4.3)(typescript@5.5.2)(vitest@2.0.5(@types/node@20.14.0)(@vitest/browser@2.0.5(typescript@5.5.2)(vitest@2.0.5))(happy-dom@13.10.1)(lightningcss@1.24.1)(terser@5.32.0)) + '@scalar/components': 0.12.12(@types/bun@1.1.5)(storybook@8.2.1(@babel/preset-env@7.24.6(@babel/core@7.24.4)))(typescript@5.5.2)(vitest@2.0.5(@types/node@20.14.0)(@vitest/browser@2.0.5(typescript@5.5.2)(vitest@2.0.5))(happy-dom@13.10.1)(lightningcss@1.24.1)(terser@5.32.0)) '@scalar/oas-utils': 0.2.13(typescript@5.5.2) '@scalar/openapi-parser': 0.7.2 '@scalar/snippetz': 0.1.6 '@scalar/themes': 0.9.13(typescript@5.5.2) '@scalar/use-toasts': 0.7.4(typescript@5.5.2) '@scalar/use-tooltip': 1.0.2(typescript@5.5.2) - '@unhead/schema': 1.9.7 + '@unhead/schema': 1.9.15 '@unhead/vue': 1.9.15(vue@3.4.25(typescript@5.5.2)) '@vueuse/core': 10.11.0(vue@3.4.25(typescript@5.5.2)) axios: 1.6.8 @@ -20019,8 +21597,8 @@ snapshots: httpsnippet-lite: 3.0.5 nanoid: 5.0.7 postcss-nested: 6.0.1(postcss@8.4.38) - unhead: 1.9.7 - unified: 11.0.4 + unhead: 1.9.15 + unified: 11.0.5 vue: 3.4.25(typescript@5.5.2) transitivePeerDependencies: - '@jest/globals' @@ -20052,18 +21630,18 @@ snapshots: remark-gfm: 4.0.0 remark-parse: 11.0.0 remark-rehype: 11.1.0 - unified: 11.0.4 + unified: 11.0.5 unist-util-visit: 5.0.0 transitivePeerDependencies: - supports-color - '@scalar/components@0.12.12(@types/bun@1.1.5)(storybook@8.2.1(@babel/preset-env@7.24.6(@babel/core@7.24.4)))(typescript@5.5.2)(vitest@1.6.0(@types/node@20.14.0)(happy-dom@13.10.1)(lightningcss@1.24.1)(terser@5.19.2))': + '@scalar/components@0.12.12(@types/bun@1.1.5)(storybook@8.2.1(@babel/preset-env@7.24.6(@babel/core@7.24.4)))(typescript@5.5.2)(vitest@2.0.5(@types/node@20.14.0)(@vitest/browser@2.0.5(typescript@5.5.2)(vitest@2.0.5))(happy-dom@13.10.1)(lightningcss@1.24.1)(terser@5.32.0))': dependencies: - '@floating-ui/utils': 0.2.2 - '@floating-ui/vue': 1.0.6(vue@3.4.25(typescript@5.5.2)) + '@floating-ui/utils': 0.2.4 + '@floating-ui/vue': 1.1.1(vue@3.4.25(typescript@5.5.2)) '@headlessui/vue': 1.7.20(vue@3.4.25(typescript@5.5.2)) '@scalar/code-highlight': 0.0.7 - '@storybook/test': 8.2.1(@types/bun@1.1.5)(storybook@8.2.1(@babel/preset-env@7.24.6(@babel/core@7.24.4)))(vitest@1.6.0(@types/node@20.14.0)(happy-dom@13.10.1)(lightningcss@1.24.1)(terser@5.19.2)) + '@storybook/test': 8.2.1(@types/bun@1.1.5)(storybook@8.2.1(@babel/preset-env@7.24.6(@babel/core@7.24.4)))(vitest@2.0.5(@types/node@20.14.0)(@vitest/browser@2.0.5(typescript@5.5.2)(vitest@2.0.5))(happy-dom@13.10.1)(lightningcss@1.24.1)(terser@5.32.0)) '@vueuse/core': 10.11.0(vue@3.4.25(typescript@5.5.2)) cva: 1.0.0-beta.1(typescript@5.5.2) nanoid: 5.0.7 @@ -20212,7 +21790,35 @@ snapshots: component-type: 1.2.2 join-component: 1.1.0 - '@shikijs/core@1.5.2': {} + '@shikijs/core@1.17.5': + dependencies: + '@shikijs/engine-javascript': 1.17.5 + '@shikijs/engine-oniguruma': 1.17.5 + '@shikijs/types': 1.17.5 + '@shikijs/vscode-textmate': 9.2.2 + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.2 + + '@shikijs/engine-javascript@1.17.5': + dependencies: + '@shikijs/types': 1.17.5 + oniguruma-to-js: 0.4.0 + + '@shikijs/engine-oniguruma@1.17.5': + dependencies: + '@shikijs/types': 1.17.5 + '@shikijs/vscode-textmate': 9.2.2 + + '@shikijs/transformers@1.17.5': + dependencies: + shiki: 1.17.5 + + '@shikijs/types@1.17.5': + dependencies: + '@shikijs/vscode-textmate': 9.2.2 + '@types/hast': 3.0.4 + + '@shikijs/vscode-textmate@9.2.2': {} '@shopify/flash-list@1.6.4(@babel/runtime@7.24.4)(react-native@0.74.1(@babel/core@7.24.4)(@babel/preset-env@7.24.6(@babel/core@7.24.4))(@types/react@18.3.3)(encoding@0.1.13)(react@18.3.1))(react@18.3.1)': dependencies: @@ -20236,6 +21842,15 @@ snapshots: '@sindresorhus/merge-streams@2.3.0': {} + '@sindresorhus/slugify@2.2.1': + dependencies: + '@sindresorhus/transliterate': 1.6.0 + escape-string-regexp: 5.0.0 + + '@sindresorhus/transliterate@1.6.0': + dependencies: + escape-string-regexp: 5.0.0 + '@sinonjs/commons@3.0.1': dependencies: type-detect: 4.0.8 @@ -20252,11 +21867,11 @@ snapshots: dependencies: solid-js: 1.8.16 - '@solidjs/start@0.6.1(@testing-library/jest-dom@6.4.8)(rollup@4.18.0)(solid-js@1.8.16)(vinxi@0.3.11(@types/node@20.14.0)(encoding@0.1.13)(ioredis@5.3.2)(lightningcss@1.24.1)(magicast@0.3.4)(terser@5.19.2))(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2))': + '@solidjs/start@0.6.1(@testing-library/jest-dom@6.4.8)(rollup@4.18.0)(solid-js@1.8.16)(vinxi@0.3.11(@types/node@20.14.0)(encoding@0.1.13)(ioredis@5.3.2)(lightningcss@1.24.1)(magicast@0.3.5)(terser@5.32.0))(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0))': dependencies: - '@vinxi/plugin-directives': 0.3.1(vinxi@0.3.11(@types/node@20.14.0)(encoding@0.1.13)(ioredis@5.3.2)(lightningcss@1.24.1)(magicast@0.3.4)(terser@5.19.2)) - '@vinxi/server-components': 0.3.3(vinxi@0.3.11(@types/node@20.14.0)(encoding@0.1.13)(ioredis@5.3.2)(lightningcss@1.24.1)(magicast@0.3.4)(terser@5.19.2)) - '@vinxi/server-functions': 0.3.2(vinxi@0.3.11(@types/node@20.14.0)(encoding@0.1.13)(ioredis@5.3.2)(lightningcss@1.24.1)(magicast@0.3.4)(terser@5.19.2)) + '@vinxi/plugin-directives': 0.3.1(vinxi@0.3.11(@types/node@20.14.0)(encoding@0.1.13)(ioredis@5.3.2)(lightningcss@1.24.1)(magicast@0.3.5)(terser@5.32.0)) + '@vinxi/server-components': 0.3.3(vinxi@0.3.11(@types/node@20.14.0)(encoding@0.1.13)(ioredis@5.3.2)(lightningcss@1.24.1)(magicast@0.3.5)(terser@5.32.0)) + '@vinxi/server-functions': 0.3.2(vinxi@0.3.11(@types/node@20.14.0)(encoding@0.1.13)(ioredis@5.3.2)(lightningcss@1.24.1)(magicast@0.3.5)(terser@5.32.0)) defu: 6.1.4 error-stack-parser: 2.1.4 html-to-image: 1.11.11 @@ -20266,8 +21881,8 @@ snapshots: shikiji: 0.9.19 source-map-js: 1.2.0 terracotta: 1.0.5(solid-js@1.8.16) - vite-plugin-inspect: 0.7.38(rollup@4.18.0)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2)) - vite-plugin-solid: 2.9.1(@testing-library/jest-dom@6.4.8)(solid-js@1.8.16)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2)) + vite-plugin-inspect: 0.7.38(rollup@4.18.0)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0)) + vite-plugin-solid: 2.9.1(@testing-library/jest-dom@6.4.8)(solid-js@1.8.16)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0)) transitivePeerDependencies: - '@nuxt/kit' - '@testing-library/jest-dom' @@ -20281,7 +21896,7 @@ snapshots: dependencies: '@babel/core': 7.24.4 '@babel/preset-env': 7.24.6(@babel/core@7.24.4) - '@babel/types': 7.24.6 + '@babel/types': 7.25.6 '@storybook/core': 8.2.1 '@storybook/csf': 0.1.11 '@types/cross-spawn': 6.0.6 @@ -20328,12 +21943,12 @@ snapshots: storybook: 8.2.1(@babel/preset-env@7.24.6(@babel/core@7.24.4)) util: 0.12.5 - '@storybook/test@8.2.1(@types/bun@1.1.5)(storybook@8.2.1(@babel/preset-env@7.24.6(@babel/core@7.24.4)))(vitest@1.6.0(@types/node@20.14.0)(happy-dom@13.10.1)(lightningcss@1.24.1)(terser@5.19.2))': + '@storybook/test@8.2.1(@types/bun@1.1.5)(storybook@8.2.1(@babel/preset-env@7.24.6(@babel/core@7.24.4)))(vitest@2.0.5(@types/node@20.14.0)(@vitest/browser@2.0.5(typescript@5.5.2)(vitest@2.0.5))(happy-dom@13.10.1)(lightningcss@1.24.1)(terser@5.32.0))': dependencies: '@storybook/csf': 0.1.11 '@storybook/instrumenter': 8.2.1(storybook@8.2.1(@babel/preset-env@7.24.6(@babel/core@7.24.4))) '@testing-library/dom': 10.1.0 - '@testing-library/jest-dom': 6.4.5(@types/bun@1.1.5)(vitest@1.6.0(@types/node@20.14.0)(happy-dom@13.10.1)(lightningcss@1.24.1)(terser@5.19.2)) + '@testing-library/jest-dom': 6.4.5(@types/bun@1.1.5)(vitest@2.0.5(@types/node@20.14.0)(@vitest/browser@2.0.5(typescript@5.5.2)(vitest@2.0.5))(happy-dom@13.10.1)(lightningcss@1.24.1)(terser@5.32.0)) '@testing-library/user-event': 14.5.2(@testing-library/dom@10.1.0) '@vitest/expect': 1.6.0 '@vitest/spy': 1.6.0 @@ -20346,14 +21961,14 @@ snapshots: - jest - vitest - '@sveltejs/adapter-auto@3.2.0(@sveltejs/kit@2.5.7(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.15)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2)))(svelte@4.2.15)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2)))': + '@sveltejs/adapter-auto@3.2.0(@sveltejs/kit@2.5.7(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.15)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0)))(svelte@4.2.15)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0)))': dependencies: - '@sveltejs/kit': 2.5.7(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.15)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2)))(svelte@4.2.15)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2)) + '@sveltejs/kit': 2.5.7(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.15)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0)))(svelte@4.2.15)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0)) import-meta-resolve: 4.0.0 - '@sveltejs/kit@2.5.7(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.15)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2)))(svelte@4.2.15)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2))': + '@sveltejs/kit@2.5.7(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.15)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0)))(svelte@4.2.15)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0))': dependencies: - '@sveltejs/vite-plugin-svelte': 3.1.0(svelte@4.2.15)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2)) + '@sveltejs/vite-plugin-svelte': 3.1.0(svelte@4.2.15)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0)) '@types/cookie': 0.6.0 cookie: 0.6.0 devalue: 5.0.0 @@ -20367,7 +21982,7 @@ snapshots: sirv: 2.0.4 svelte: 4.2.15 tiny-glob: 0.2.9 - vite: 5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2) + vite: 5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0) '@sveltejs/package@2.3.1(svelte@4.2.15)(typescript@5.5.2)': dependencies: @@ -20380,26 +21995,26 @@ snapshots: transitivePeerDependencies: - typescript - '@sveltejs/vite-plugin-svelte-inspector@2.1.0(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.15)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2)))(svelte@4.2.15)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2))': + '@sveltejs/vite-plugin-svelte-inspector@2.1.0(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.15)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0)))(svelte@4.2.15)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0))': dependencies: - '@sveltejs/vite-plugin-svelte': 3.1.0(svelte@4.2.15)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2)) - debug: 4.3.5 + '@sveltejs/vite-plugin-svelte': 3.1.0(svelte@4.2.15)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0)) + debug: 4.3.6 svelte: 4.2.15 - vite: 5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2) + vite: 5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0) transitivePeerDependencies: - supports-color - '@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.15)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2))': + '@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.15)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0))': dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 2.1.0(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.15)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2)))(svelte@4.2.15)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2)) + '@sveltejs/vite-plugin-svelte-inspector': 2.1.0(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.15)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0)))(svelte@4.2.15)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0)) debug: 4.3.5 deepmerge: 4.3.1 kleur: 4.1.5 magic-string: 0.30.10 svelte: 4.2.15 svelte-hmr: 0.16.0(svelte@4.2.15) - vite: 5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2) - vitefu: 0.2.5(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2)) + vite: 5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0) + vitefu: 0.2.5(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0)) transitivePeerDependencies: - supports-color @@ -20549,21 +22164,16 @@ snapshots: '@tanstack/query-core': 5.50.1 react: 18.3.1 - '@tanstack/react-virtual@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@tanstack/react-virtual@3.10.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@tanstack/virtual-core': 3.4.0 + '@tanstack/virtual-core': 3.10.7 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@tanstack/virtual-core@3.4.0': {} + '@tanstack/virtual-core@3.10.7': {} '@tanstack/virtual-core@3.8.2': {} - '@tanstack/vue-virtual@3.4.0(vue@3.4.25(typescript@5.5.2))': - dependencies: - '@tanstack/virtual-core': 3.4.0 - vue: 3.4.25(typescript@5.5.2) - '@tanstack/vue-virtual@3.8.2(vue@3.4.25(typescript@5.5.2))': dependencies: '@tanstack/virtual-core': 3.8.2 @@ -20591,7 +22201,7 @@ snapshots: lz-string: 1.5.0 pretty-format: 27.5.1 - '@testing-library/jest-dom@6.4.5(@types/bun@1.1.5)(vitest@1.6.0(@types/node@20.14.0)(happy-dom@13.10.1)(lightningcss@1.24.1)(terser@5.19.2))': + '@testing-library/jest-dom@6.4.5(@types/bun@1.1.5)(vitest@2.0.5(@types/node@20.14.0)(@vitest/browser@2.0.5(typescript@5.5.2)(vitest@2.0.5))(happy-dom@13.10.1)(lightningcss@1.24.1)(terser@5.32.0))': dependencies: '@adobe/css-tools': 4.4.0 '@babel/runtime': 7.24.4 @@ -20603,7 +22213,7 @@ snapshots: redent: 3.0.0 optionalDependencies: '@types/bun': 1.1.5 - vitest: 1.6.0(@types/node@20.14.0)(happy-dom@13.10.1)(lightningcss@1.24.1)(terser@5.19.2) + vitest: 2.0.5(@types/node@20.14.0)(@vitest/browser@2.0.5(typescript@5.5.2)(vitest@2.0.5))(happy-dom@13.10.1)(lightningcss@1.24.1)(terser@5.32.0) '@testing-library/jest-dom@6.4.8': dependencies: @@ -20630,18 +22240,9 @@ snapshots: dependencies: '@testing-library/dom': 10.1.0 - '@theguild/remark-mermaid@0.0.5(react@18.3.1)': + '@testing-library/user-event@14.5.2(@testing-library/dom@10.4.0)': dependencies: - mermaid: 10.9.0 - react: 18.3.1 - unist-util-visit: 5.0.0 - transitivePeerDependencies: - - supports-color - - '@theguild/remark-npm2yarn@0.2.1': - dependencies: - npm-to-yarn: 2.2.1 - unist-util-visit: 5.0.0 + '@testing-library/dom': 10.4.0 '@tiptap/core@2.3.2(@tiptap/pm@2.3.2)': dependencies: @@ -20868,16 +22469,16 @@ snapshots: '@types/babel__generator@7.6.4': dependencies: - '@babel/types': 7.24.6 + '@babel/types': 7.25.6 '@types/babel__template@7.4.1': dependencies: - '@babel/parser': 7.24.6 - '@babel/types': 7.24.6 + '@babel/parser': 7.25.6 + '@babel/types': 7.25.6 '@types/babel__traverse@7.20.1': dependencies: - '@babel/types': 7.24.6 + '@babel/types': 7.25.6 '@types/body-parser@1.19.5': dependencies: @@ -20913,14 +22514,6 @@ snapshots: dependencies: '@types/node': 20.14.0 - '@types/d3-scale-chromatic@3.0.3': {} - - '@types/d3-scale@4.0.8': - dependencies: - '@types/d3-time': 3.0.3 - - '@types/d3-time@3.0.3': {} - '@types/debug@4.1.8': dependencies: '@types/ms': 0.7.31 @@ -20989,14 +22582,10 @@ snapshots: dependencies: '@types/istanbul-lib-report': 3.0.3 - '@types/js-yaml@4.0.5': {} - '@types/json-schema@7.0.15': {} '@types/json5@0.0.29': {} - '@types/katex@0.16.2': {} - '@types/keygrip@1.0.6': {} '@types/linkify-it@3.0.5': {} @@ -21010,13 +22599,13 @@ snapshots: dependencies: '@types/unist': 2.0.7 - '@types/mdast@4.0.3': + '@types/mdast@4.0.4': dependencies: '@types/unist': 3.0.2 '@types/mdurl@1.0.5': {} - '@types/mdx@2.0.6': {} + '@types/mdx@2.0.13': {} '@types/micromatch@4.0.7': dependencies: @@ -21073,6 +22662,10 @@ snapshots: dependencies: '@types/react': 18.3.3 + '@types/react-highlight-words@0.20.0': + dependencies: + '@types/react': 18.3.3 + '@types/react@18.3.3': dependencies: '@types/prop-types': 15.7.5 @@ -21099,6 +22692,8 @@ snapshots: '@types/statuses@2.0.5': {} + '@types/tough-cookie@4.0.5': {} + '@types/unist@2.0.7': {} '@types/unist@3.0.2': {} @@ -21149,7 +22744,7 @@ snapshots: '@typescript-eslint/visitor-keys': 7.9.0 eslint: 8.57.0 graphemer: 1.4.0 - ignore: 5.3.1 + ignore: 5.3.2 natural-compare: 1.4.0 ts-api-utils: 1.3.0(typescript@5.5.2) optionalDependencies: @@ -21157,13 +22752,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@6.3.0(eslint@8.57.0)(typescript@5.5.2)': + '@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.2)': dependencies: - '@typescript-eslint/scope-manager': 6.3.0 - '@typescript-eslint/types': 6.3.0 - '@typescript-eslint/typescript-estree': 6.3.0(typescript@5.5.2) - '@typescript-eslint/visitor-keys': 6.3.0 - debug: 4.3.5 + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.5.2) + '@typescript-eslint/visitor-keys': 6.21.0 + debug: 4.3.6 eslint: 8.57.0 optionalDependencies: typescript: 5.5.2 @@ -21189,17 +22784,17 @@ snapshots: '@typescript-eslint/types': 7.9.0 '@typescript-eslint/typescript-estree': 7.9.0(typescript@5.5.2) '@typescript-eslint/visitor-keys': 7.9.0 - debug: 4.3.5 + debug: 4.3.6 eslint: 8.57.0 optionalDependencies: typescript: 5.5.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@6.3.0': + '@typescript-eslint/scope-manager@6.21.0': dependencies: - '@typescript-eslint/types': 6.3.0 - '@typescript-eslint/visitor-keys': 6.3.0 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/visitor-keys': 6.21.0 '@typescript-eslint/scope-manager@7.13.1': dependencies: @@ -21215,7 +22810,7 @@ snapshots: dependencies: '@typescript-eslint/typescript-estree': 7.13.1(typescript@5.5.2) '@typescript-eslint/utils': 7.13.1(eslint@8.57.0)(typescript@5.5.2) - debug: 4.3.5 + debug: 4.3.6 eslint: 8.57.0 ts-api-utils: 1.3.0(typescript@5.5.2) optionalDependencies: @@ -21227,7 +22822,7 @@ snapshots: dependencies: '@typescript-eslint/typescript-estree': 7.9.0(typescript@5.5.2) '@typescript-eslint/utils': 7.9.0(eslint@8.57.0)(typescript@5.5.2) - debug: 4.3.5 + debug: 4.3.6 eslint: 8.57.0 ts-api-utils: 1.3.0(typescript@5.5.2) optionalDependencies: @@ -21235,20 +22830,21 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/types@6.3.0': {} + '@typescript-eslint/types@6.21.0': {} '@typescript-eslint/types@7.13.1': {} '@typescript-eslint/types@7.9.0': {} - '@typescript-eslint/typescript-estree@6.3.0(typescript@5.5.2)': + '@typescript-eslint/typescript-estree@6.21.0(typescript@5.5.2)': dependencies: - '@typescript-eslint/types': 6.3.0 - '@typescript-eslint/visitor-keys': 6.3.0 - debug: 4.3.5 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/visitor-keys': 6.21.0 + debug: 4.3.6 globby: 11.1.0 is-glob: 4.0.3 - semver: 7.6.2 + minimatch: 9.0.3 + semver: 7.6.3 ts-api-utils: 1.3.0(typescript@5.5.2) optionalDependencies: typescript: 5.5.2 @@ -21259,11 +22855,11 @@ snapshots: dependencies: '@typescript-eslint/types': 7.13.1 '@typescript-eslint/visitor-keys': 7.13.1 - debug: 4.3.5 + debug: 4.3.6 globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.4 - semver: 7.6.2 + semver: 7.6.3 ts-api-utils: 1.3.0(typescript@5.5.2) optionalDependencies: typescript: 5.5.2 @@ -21274,11 +22870,11 @@ snapshots: dependencies: '@typescript-eslint/types': 7.9.0 '@typescript-eslint/visitor-keys': 7.9.0 - debug: 4.3.5 + debug: 4.3.6 globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.4 - semver: 7.6.2 + semver: 7.6.3 ts-api-utils: 1.3.0(typescript@5.5.2) optionalDependencies: typescript: 5.5.2 @@ -21307,9 +22903,9 @@ snapshots: - supports-color - typescript - '@typescript-eslint/visitor-keys@6.3.0': + '@typescript-eslint/visitor-keys@6.21.0': dependencies: - '@typescript-eslint/types': 6.3.0 + '@typescript-eslint/types': 6.21.0 eslint-visitor-keys: 3.4.3 '@typescript-eslint/visitor-keys@7.13.1': @@ -21391,12 +22987,63 @@ snapshots: graphql: 15.8.0 wonka: 4.0.15 + '@vanilla-extract/babel-plugin-debug-ids@1.0.6': + dependencies: + '@babel/core': 7.24.4 + transitivePeerDependencies: + - supports-color + + '@vanilla-extract/css@1.15.5': + dependencies: + '@emotion/hash': 0.9.2 + '@vanilla-extract/private': 1.0.6 + css-what: 6.1.0 + cssesc: 3.0.0 + csstype: 3.1.3 + dedent: 1.5.3 + deep-object-diff: 1.1.9 + deepmerge: 4.3.1 + lru-cache: 10.4.3 + media-query-parser: 2.0.2 + modern-ahocorasick: 1.0.1 + picocolors: 1.0.1 + transitivePeerDependencies: + - babel-plugin-macros + + '@vanilla-extract/integration@6.5.0(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0)': + dependencies: + '@babel/core': 7.24.4 + '@babel/plugin-syntax-typescript': 7.24.1(@babel/core@7.24.4) + '@vanilla-extract/babel-plugin-debug-ids': 1.0.6 + '@vanilla-extract/css': 1.15.5 + esbuild: 0.19.12 + eval: 0.1.8 + find-up: 5.0.0 + javascript-stringify: 2.1.0 + lodash: 4.17.21 + mlly: 1.7.1 + outdent: 0.8.0 + vite: 5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0) + vite-node: 1.6.0(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0) + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + + '@vanilla-extract/private@1.0.6': {} + '@vercel/nft@0.26.4(encoding@0.1.13)': dependencies: '@mapbox/node-pre-gyp': 1.0.11(encoding@0.1.13) '@rollup/pluginutils': 4.2.1 - acorn: 8.11.3 - acorn-import-attributes: 1.9.5(acorn@8.11.3) + acorn: 8.12.1 + acorn-import-attributes: 1.9.5(acorn@8.12.1) async-sema: 3.1.1 bindings: 1.5.0 estree-walker: 2.0.2 @@ -21431,90 +23078,107 @@ snapshots: transitivePeerDependencies: - uWebSockets.js - '@vinxi/plugin-directives@0.3.1(vinxi@0.3.11(@types/node@20.14.0)(encoding@0.1.13)(ioredis@5.3.2)(lightningcss@1.24.1)(magicast@0.3.4)(terser@5.19.2))': + '@vinxi/plugin-directives@0.3.1(vinxi@0.3.11(@types/node@20.14.0)(encoding@0.1.13)(ioredis@5.3.2)(lightningcss@1.24.1)(magicast@0.3.5)(terser@5.32.0))': dependencies: - '@babel/parser': 7.24.6 - acorn: 8.11.3 - acorn-jsx: 5.3.2(acorn@8.11.3) + '@babel/parser': 7.25.6 + acorn: 8.12.1 + acorn-jsx: 5.3.2(acorn@8.12.1) acorn-loose: 8.4.0 - acorn-typescript: 1.4.13(acorn@8.11.3) + acorn-typescript: 1.4.13(acorn@8.12.1) astring: 1.8.6 magicast: 0.2.10 recast: 0.23.4 tslib: 2.6.2 - vinxi: 0.3.11(@types/node@20.14.0)(encoding@0.1.13)(ioredis@5.3.2)(lightningcss@1.24.1)(magicast@0.3.4)(terser@5.19.2) + vinxi: 0.3.11(@types/node@20.14.0)(encoding@0.1.13)(ioredis@5.3.2)(lightningcss@1.24.1)(magicast@0.3.5)(terser@5.32.0) - '@vinxi/server-components@0.3.3(vinxi@0.3.11(@types/node@20.14.0)(encoding@0.1.13)(ioredis@5.3.2)(lightningcss@1.24.1)(magicast@0.3.4)(terser@5.19.2))': + '@vinxi/server-components@0.3.3(vinxi@0.3.11(@types/node@20.14.0)(encoding@0.1.13)(ioredis@5.3.2)(lightningcss@1.24.1)(magicast@0.3.5)(terser@5.32.0))': dependencies: - '@vinxi/plugin-directives': 0.3.1(vinxi@0.3.11(@types/node@20.14.0)(encoding@0.1.13)(ioredis@5.3.2)(lightningcss@1.24.1)(magicast@0.3.4)(terser@5.19.2)) - acorn: 8.11.3 + '@vinxi/plugin-directives': 0.3.1(vinxi@0.3.11(@types/node@20.14.0)(encoding@0.1.13)(ioredis@5.3.2)(lightningcss@1.24.1)(magicast@0.3.5)(terser@5.32.0)) + acorn: 8.12.1 acorn-loose: 8.4.0 - acorn-typescript: 1.4.13(acorn@8.11.3) + acorn-typescript: 1.4.13(acorn@8.12.1) astring: 1.8.6 magicast: 0.2.10 recast: 0.23.4 - vinxi: 0.3.11(@types/node@20.14.0)(encoding@0.1.13)(ioredis@5.3.2)(lightningcss@1.24.1)(magicast@0.3.4)(terser@5.19.2) + vinxi: 0.3.11(@types/node@20.14.0)(encoding@0.1.13)(ioredis@5.3.2)(lightningcss@1.24.1)(magicast@0.3.5)(terser@5.32.0) - '@vinxi/server-functions@0.3.2(vinxi@0.3.11(@types/node@20.14.0)(encoding@0.1.13)(ioredis@5.3.2)(lightningcss@1.24.1)(magicast@0.3.4)(terser@5.19.2))': + '@vinxi/server-functions@0.3.2(vinxi@0.3.11(@types/node@20.14.0)(encoding@0.1.13)(ioredis@5.3.2)(lightningcss@1.24.1)(magicast@0.3.5)(terser@5.32.0))': dependencies: - '@vinxi/plugin-directives': 0.3.1(vinxi@0.3.11(@types/node@20.14.0)(encoding@0.1.13)(ioredis@5.3.2)(lightningcss@1.24.1)(magicast@0.3.4)(terser@5.19.2)) - acorn: 8.11.3 + '@vinxi/plugin-directives': 0.3.1(vinxi@0.3.11(@types/node@20.14.0)(encoding@0.1.13)(ioredis@5.3.2)(lightningcss@1.24.1)(magicast@0.3.5)(terser@5.32.0)) + acorn: 8.12.1 acorn-loose: 8.4.0 - acorn-typescript: 1.4.13(acorn@8.11.3) + acorn-typescript: 1.4.13(acorn@8.12.1) astring: 1.8.6 magicast: 0.2.10 recast: 0.23.4 - vinxi: 0.3.11(@types/node@20.14.0)(encoding@0.1.13)(ioredis@5.3.2)(lightningcss@1.24.1)(magicast@0.3.4)(terser@5.19.2) + vinxi: 0.3.11(@types/node@20.14.0)(encoding@0.1.13)(ioredis@5.3.2)(lightningcss@1.24.1)(magicast@0.3.5)(terser@5.32.0) - '@vitejs/plugin-react-swc@3.6.0(@swc/helpers@0.5.11)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2))': + '@vitejs/plugin-react-swc@3.6.0(@swc/helpers@0.5.11)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0))': dependencies: '@swc/core': 1.5.29(@swc/helpers@0.5.11) - vite: 5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2) + vite: 5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0) transitivePeerDependencies: - '@swc/helpers' - '@vitejs/plugin-react@4.2.1(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2))': + '@vitejs/plugin-react@4.2.1(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0))': dependencies: '@babel/core': 7.24.4 '@babel/plugin-transform-react-jsx-self': 7.24.1(@babel/core@7.24.4) '@babel/plugin-transform-react-jsx-source': 7.24.1(@babel/core@7.24.4) '@types/babel__core': 7.20.5 react-refresh: 0.14.2 - vite: 5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2) + vite: 5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0) transitivePeerDependencies: - supports-color - '@vitejs/plugin-vue-jsx@3.1.0(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2))(vue@3.4.25(typescript@5.5.2))': + '@vitejs/plugin-vue-jsx@3.1.0(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0))(vue@3.4.25(typescript@5.5.2))': dependencies: '@babel/core': 7.24.4 '@babel/plugin-transform-typescript': 7.24.4(@babel/core@7.24.4) '@vue/babel-plugin-jsx': 1.1.5(@babel/core@7.24.4) - vite: 5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2) + vite: 5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0) vue: 3.4.25(typescript@5.5.2) transitivePeerDependencies: - supports-color - '@vitejs/plugin-vue@5.0.4(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2))(vue@3.4.25(typescript@5.5.2))': + '@vitejs/plugin-vue@5.0.4(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0))(vue@3.4.25(typescript@5.5.2))': dependencies: - vite: 5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2) + vite: 5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0) vue: 3.4.25(typescript@5.5.2) - '@vitest/coverage-v8@1.6.0(vitest@1.6.0(@types/node@20.14.0)(happy-dom@13.10.1)(lightningcss@1.24.1)(terser@5.19.2))': + '@vitest/browser@2.0.5(graphql@16.8.1)(playwright@1.45.0)(typescript@5.5.2)(vitest@2.0.5)': + dependencies: + '@testing-library/dom': 10.4.0 + '@testing-library/user-event': 14.5.2(@testing-library/dom@10.4.0) + '@vitest/utils': 2.0.5 + magic-string: 0.30.11 + msw: 2.4.2(graphql@16.8.1)(typescript@5.5.2) + sirv: 2.0.4 + vitest: 2.0.5(@types/node@20.14.0)(@vitest/browser@2.0.5(typescript@5.5.2)(vitest@2.0.5))(happy-dom@13.10.1)(lightningcss@1.24.1)(terser@5.32.0) + ws: 8.18.0 + optionalDependencies: + playwright: 1.45.0 + transitivePeerDependencies: + - bufferutil + - graphql + - typescript + - utf-8-validate + + '@vitest/coverage-v8@2.0.5(vitest@2.0.5(@types/node@20.14.0)(@vitest/browser@2.0.5)(happy-dom@13.10.1)(lightningcss@1.24.1)(terser@5.32.0))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 0.2.3 - debug: 4.3.5 + debug: 4.3.6 istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 - istanbul-lib-source-maps: 5.0.4 + istanbul-lib-source-maps: 5.0.6 istanbul-reports: 3.1.7 - magic-string: 0.30.10 + magic-string: 0.30.11 magicast: 0.3.4 - picocolors: 1.0.0 std-env: 3.7.0 - strip-literal: 2.1.0 - test-exclude: 6.0.0 - vitest: 1.6.0(@types/node@20.14.0)(happy-dom@13.10.1)(lightningcss@1.24.1)(terser@5.19.2) + test-exclude: 7.0.1 + tinyrainbow: 1.2.0 + vitest: 2.0.5(@types/node@20.14.0)(@vitest/browser@2.0.5(typescript@5.5.2)(vitest@2.0.5))(happy-dom@13.10.1)(lightningcss@1.24.1)(terser@5.32.0) transitivePeerDependencies: - supports-color @@ -21524,22 +23188,50 @@ snapshots: '@vitest/utils': 1.6.0 chai: 4.4.1 + '@vitest/expect@2.0.5': + dependencies: + '@vitest/spy': 2.0.5 + '@vitest/utils': 2.0.5 + chai: 5.1.1 + tinyrainbow: 1.2.0 + + '@vitest/pretty-format@2.0.5': + dependencies: + tinyrainbow: 1.2.0 + '@vitest/runner@1.6.0': dependencies: '@vitest/utils': 1.6.0 p-limit: 5.0.0 pathe: 1.1.2 + optional: true + + '@vitest/runner@2.0.5': + dependencies: + '@vitest/utils': 2.0.5 + pathe: 1.1.2 '@vitest/snapshot@1.6.0': dependencies: - magic-string: 0.30.10 + magic-string: 0.30.11 pathe: 1.1.2 pretty-format: 29.7.0 + optional: true + + '@vitest/snapshot@2.0.5': + dependencies: + '@vitest/pretty-format': 2.0.5 + magic-string: 0.30.11 + pathe: 1.1.2 '@vitest/spy@1.6.0': dependencies: tinyspy: 2.2.1 + '@vitest/spy@2.0.5': + dependencies: + tinyspy: 3.0.0 + '@vitest/utils@1.6.0': dependencies: diff-sequences: 29.6.3 @@ -21547,6 +23239,13 @@ snapshots: loupe: 2.3.7 pretty-format: 29.7.0 + '@vitest/utils@2.0.5': + dependencies: + '@vitest/pretty-format': 2.0.5 + estree-walker: 3.0.3 + loupe: 3.1.1 + tinyrainbow: 1.2.0 + '@volar/language-core@2.2.0-alpha.10': dependencies: '@volar/source-map': 2.2.0-alpha.10 @@ -21562,7 +23261,7 @@ snapshots: '@vue-macros/common@1.10.2(rollup@3.29.4)(vue@3.4.25(typescript@5.5.2))': dependencies: - '@babel/types': 7.24.6 + '@babel/types': 7.25.6 '@rollup/pluginutils': 5.1.0(rollup@3.29.4) '@vue/compiler-sfc': 3.4.25 ast-kit: 0.12.1 @@ -21575,7 +23274,7 @@ snapshots: '@vue-macros/common@1.10.2(rollup@4.18.0)(vue@3.4.25(typescript@5.5.2))': dependencies: - '@babel/types': 7.24.6 + '@babel/types': 7.25.6 '@rollup/pluginutils': 5.1.0(rollup@4.18.0) '@vue/compiler-sfc': 3.4.25 ast-kit: 0.12.1 @@ -21595,7 +23294,7 @@ snapshots: '@babel/plugin-syntax-jsx': 7.24.6(@babel/core@7.24.4) '@babel/template': 7.24.6 '@babel/traverse': 7.24.1 - '@babel/types': 7.24.6 + '@babel/types': 7.25.6 '@vue/babel-helper-vue-transform-on': 1.1.5 camelcase: 6.3.0 html-tags: 3.3.1 @@ -21605,7 +23304,7 @@ snapshots: '@vue/compiler-core@3.4.25': dependencies: - '@babel/parser': 7.24.6 + '@babel/parser': 7.25.6 '@vue/shared': 3.4.25 entities: 4.5.0 estree-walker: 2.0.2 @@ -21635,14 +23334,26 @@ snapshots: '@vue/devtools-api@6.6.1': {} - '@vue/devtools-core@7.3.3(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2))': + '@vue/devtools-core@7.3.3(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0))': dependencies: '@vue/devtools-kit': 7.3.3 '@vue/devtools-shared': 7.3.4 mitt: 3.0.1 nanoid: 3.3.7 pathe: 1.1.2 - vite-hot-client: 0.2.3(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2)) + vite-hot-client: 0.2.3(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0)) + transitivePeerDependencies: + - vite + + '@vue/devtools-core@7.4.4(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0))(vue@3.4.25(typescript@5.5.2))': + dependencies: + '@vue/devtools-kit': 7.4.4 + '@vue/devtools-shared': 7.4.5 + mitt: 3.0.1 + nanoid: 3.3.7 + pathe: 1.1.2 + vite-hot-client: 0.2.3(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0)) + vue: 3.4.25(typescript@5.5.2) transitivePeerDependencies: - vite @@ -21656,10 +23367,24 @@ snapshots: speakingurl: 14.0.1 superjson: 2.2.1 + '@vue/devtools-kit@7.4.4': + dependencies: + '@vue/devtools-shared': 7.4.5 + birpc: 0.2.17 + hookable: 5.5.3 + mitt: 3.0.1 + perfect-debounce: 1.0.0 + speakingurl: 14.0.1 + superjson: 2.2.1 + '@vue/devtools-shared@7.3.4': dependencies: rfdc: 1.4.1 + '@vue/devtools-shared@7.4.5': + dependencies: + rfdc: 1.4.1 + '@vue/language-core@2.0.14(typescript@5.5.2)': dependencies: '@volar/language-core': 2.2.0-alpha.10 @@ -21735,10 +23460,90 @@ snapshots: '@web3-storage/multipart-parser@1.0.0': {} + '@webassemblyjs/ast@1.12.1': + dependencies: + '@webassemblyjs/helper-numbers': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + + '@webassemblyjs/floating-point-hex-parser@1.11.6': {} + + '@webassemblyjs/helper-api-error@1.11.6': {} + + '@webassemblyjs/helper-buffer@1.12.1': {} + + '@webassemblyjs/helper-numbers@1.11.6': + dependencies: + '@webassemblyjs/floating-point-hex-parser': 1.11.6 + '@webassemblyjs/helper-api-error': 1.11.6 + '@xtuc/long': 4.2.2 + + '@webassemblyjs/helper-wasm-bytecode@1.11.6': {} + + '@webassemblyjs/helper-wasm-section@1.12.1': + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-buffer': 1.12.1 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/wasm-gen': 1.12.1 + + '@webassemblyjs/ieee754@1.11.6': + dependencies: + '@xtuc/ieee754': 1.2.0 + + '@webassemblyjs/leb128@1.11.6': + dependencies: + '@xtuc/long': 4.2.2 + + '@webassemblyjs/utf8@1.11.6': {} + + '@webassemblyjs/wasm-edit@1.12.1': + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-buffer': 1.12.1 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/helper-wasm-section': 1.12.1 + '@webassemblyjs/wasm-gen': 1.12.1 + '@webassemblyjs/wasm-opt': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 + '@webassemblyjs/wast-printer': 1.12.1 + + '@webassemblyjs/wasm-gen@1.12.1': + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/ieee754': 1.11.6 + '@webassemblyjs/leb128': 1.11.6 + '@webassemblyjs/utf8': 1.11.6 + + '@webassemblyjs/wasm-opt@1.12.1': + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-buffer': 1.12.1 + '@webassemblyjs/wasm-gen': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 + + '@webassemblyjs/wasm-parser@1.12.1': + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-api-error': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/ieee754': 1.11.6 + '@webassemblyjs/leb128': 1.11.6 + '@webassemblyjs/utf8': 1.11.6 + + '@webassemblyjs/wast-printer@1.12.1': + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@xtuc/long': 4.2.2 + '@xmldom/xmldom@0.7.13': {} '@xmldom/xmldom@0.8.10': {} + '@xtuc/ieee754@1.2.0': {} + + '@xtuc/long@4.2.2': {} + '@yarnpkg/fslib@2.10.3': dependencies: '@yarnpkg/libzip': 2.3.0 @@ -21765,21 +23570,21 @@ snapshots: mime-types: 2.1.35 negotiator: 0.6.3 - acorn-import-attributes@1.9.5(acorn@8.11.3): + acorn-import-attributes@1.9.5(acorn@8.12.1): dependencies: - acorn: 8.11.3 + acorn: 8.12.1 - acorn-jsx@5.3.2(acorn@8.11.3): + acorn-jsx@5.3.2(acorn@8.12.1): dependencies: - acorn: 8.11.3 + acorn: 8.12.1 acorn-loose@8.4.0: dependencies: - acorn: 8.11.3 + acorn: 8.12.1 - acorn-typescript@1.4.13(acorn@8.11.3): + acorn-typescript@1.4.13(acorn@8.12.1): dependencies: - acorn: 8.11.3 + acorn: 8.12.1 acorn-walk@8.3.2: {} @@ -21789,13 +23594,13 @@ snapshots: agent-base@6.0.2: dependencies: - debug: 4.3.5 + debug: 4.3.6 transitivePeerDependencies: - supports-color agent-base@7.1.1: dependencies: - debug: 4.3.5 + debug: 4.3.6 transitivePeerDependencies: - supports-color @@ -21808,21 +23613,21 @@ snapshots: optionalDependencies: ajv: 8.16.0 - ajv-formats@2.1.1(ajv@8.12.0): - optionalDependencies: - ajv: 8.12.0 - - ajv-formats@3.0.1(ajv@8.12.0): + ajv-formats@2.1.1(ajv@8.16.0): optionalDependencies: - ajv: 8.12.0 + ajv: 8.16.0 ajv-formats@3.0.1(ajv@8.16.0): optionalDependencies: ajv: 8.16.0 - ajv-keywords@5.1.0(ajv@8.12.0): + ajv-keywords@3.5.2(ajv@6.12.6): + dependencies: + ajv: 6.12.6 + + ajv-keywords@5.1.0(ajv@8.16.0): dependencies: - ajv: 8.12.0 + ajv: 8.16.0 fast-deep-equal: 3.1.3 ajv@6.12.6: @@ -21839,13 +23644,6 @@ snapshots: require-from-string: 2.0.2 uri-js: 4.4.1 - ajv@8.12.0: - dependencies: - fast-deep-equal: 3.1.3 - json-schema-traverse: 1.0.0 - require-from-string: 2.0.2 - uri-js: 4.4.1 - ajv@8.16.0: dependencies: fast-deep-equal: 3.1.3 @@ -21853,6 +23651,18 @@ snapshots: require-from-string: 2.0.2 uri-js: 4.4.1 + algoliasearch@5.4.1: + dependencies: + '@algolia/client-abtesting': 5.4.1 + '@algolia/client-analytics': 5.4.1 + '@algolia/client-common': 5.4.1 + '@algolia/client-personalization': 5.4.1 + '@algolia/client-search': 5.4.1 + '@algolia/recommend': 5.4.1 + '@algolia/requester-browser-xhr': 5.4.1 + '@algolia/requester-fetch': 5.4.1 + '@algolia/requester-node-http': 5.4.1 + anser@1.4.10: {} ansi-align@3.0.1: @@ -21877,8 +23687,6 @@ snapshots: ansi-regex@6.0.1: {} - ansi-sequence-parser@1.1.1: {} - ansi-styles@3.2.1: dependencies: color-convert: 1.9.3 @@ -21904,11 +23712,9 @@ snapshots: aproba@2.0.0: {} - arch@2.2.0: {} - archiver-utils@5.0.2: dependencies: - glob: 10.3.12 + glob: 10.4.5 graceful-fs: 4.2.11 is-stream: 2.0.1 lazystream: 1.0.1 @@ -21933,8 +23739,6 @@ snapshots: delegates: 1.0.0 readable-stream: 3.6.2 - arg@1.0.0: {} - arg@5.0.2: {} argparse@1.0.10: @@ -22052,14 +23856,16 @@ snapshots: assertion-error@1.1.0: {} + assertion-error@2.0.1: {} + ast-kit@0.12.1: dependencies: - '@babel/parser': 7.24.6 + '@babel/parser': 7.25.6 pathe: 1.1.2 ast-kit@0.9.5(rollup@3.29.4): dependencies: - '@babel/parser': 7.24.6 + '@babel/parser': 7.25.6 '@rollup/pluginutils': 5.1.0(rollup@3.29.4) pathe: 1.1.2 transitivePeerDependencies: @@ -22067,7 +23873,7 @@ snapshots: ast-kit@0.9.5(rollup@4.18.0): dependencies: - '@babel/parser': 7.24.6 + '@babel/parser': 7.25.6 '@rollup/pluginutils': 5.1.0(rollup@4.18.0) pathe: 1.1.2 transitivePeerDependencies: @@ -22085,14 +23891,14 @@ snapshots: ast-walker-scope@0.5.0(rollup@3.29.4): dependencies: - '@babel/parser': 7.24.6 + '@babel/parser': 7.25.6 ast-kit: 0.9.5(rollup@3.29.4) transitivePeerDependencies: - rollup ast-walker-scope@0.5.0(rollup@4.18.0): dependencies: - '@babel/parser': 7.24.6 + '@babel/parser': 7.25.6 ast-kit: 0.9.5(rollup@4.18.0) transitivePeerDependencies: - rollup @@ -22101,7 +23907,7 @@ snapshots: astring@1.8.6: {} - astro@4.6.3(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2)(typescript@5.5.2): + astro@4.6.3(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0)(typescript@5.5.2): dependencies: '@astrojs/compiler': 2.7.1 '@astrojs/internal-helpers': 0.4.0 @@ -22115,7 +23921,7 @@ snapshots: '@babel/types': 7.24.6 '@types/babel__core': 7.20.5 '@types/cookie': 0.5.4 - acorn: 8.11.3 + acorn: 8.12.1 aria-query: 5.3.0 axobject-query: 4.0.0 boxen: 7.1.1 @@ -22154,14 +23960,14 @@ snapshots: rehype: 13.0.1 resolve: 1.22.8 semver: 7.6.2 - shiki: 1.5.2 + shiki: 1.17.5 string-width: 7.1.0 strip-ansi: 7.1.0 tsconfck: 3.0.3(typescript@5.5.2) unist-util-visit: 5.0.0 vfile: 6.0.1 - vite: 5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2) - vitefu: 0.2.5(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2)) + vite: 5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0) + vitefu: 0.2.5(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0)) which-pm: 2.1.1 yargs-parser: 21.1.1 zod: 3.23.8 @@ -22197,7 +24003,7 @@ snapshots: caniuse-lite: 1.0.30001612 fraction.js: 4.3.7 normalize-range: 0.1.2 - picocolors: 1.0.0 + picocolors: 1.0.1 postcss: 8.4.38 postcss-value-parser: 4.2.0 @@ -22209,7 +24015,7 @@ snapshots: dependencies: '@fastify/error': 3.4.1 archy: 1.0.0 - debug: 4.3.5 + debug: 4.3.6 fastq: 1.17.1 transitivePeerDependencies: - supports-color @@ -22243,7 +24049,7 @@ snapshots: '@babel/core': 7.24.4 '@babel/helper-module-imports': 7.18.6 '@babel/plugin-syntax-jsx': 7.24.6(@babel/core@7.24.4) - '@babel/types': 7.24.6 + '@babel/types': 7.25.6 html-entities: 2.3.3 validate-html-nesting: 1.2.2 @@ -22277,7 +24083,7 @@ snapshots: dependencies: '@babel/core': 7.24.4 core-js: 3.37.1 - debug: 4.3.5 + debug: 4.3.6 lodash.mergewith: 4.6.2 prettier: 2.8.8 strip-indent: 3.0.0 @@ -22342,6 +24148,10 @@ snapshots: base64-js@1.5.1: {} + basic-auth@2.0.1: + dependencies: + safe-buffer: 5.1.2 + before-after-hook@2.2.3: {} better-opn@3.0.2: @@ -22354,6 +24164,8 @@ snapshots: big-integer@1.6.51: {} + big.js@5.2.2: {} + binary-extensions@2.2.0: {} bindings@1.5.0: @@ -22441,6 +24253,10 @@ snapshots: browser-assert@1.2.1: {} + browserify-zlib@0.1.4: + dependencies: + pako: 0.2.9 + browserslist@4.23.0: dependencies: caniuse-lite: 1.0.30001612 @@ -22483,7 +24299,7 @@ snapshots: builtins@5.0.1: dependencies: - semver: 7.6.2 + semver: 7.6.3 bun-types@1.1.14: dependencies: @@ -22551,13 +24367,62 @@ snapshots: optionalDependencies: magicast: 0.3.4 + c12@1.11.1(magicast@0.3.5): + dependencies: + chokidar: 3.6.0 + confbox: 0.1.7 + defu: 6.1.4 + dotenv: 16.4.5 + giget: 1.2.3 + jiti: 1.21.6 + mlly: 1.7.1 + ohash: 1.1.3 + pathe: 1.1.2 + perfect-debounce: 1.0.0 + pkg-types: 1.1.1 + rc9: 2.1.2 + optionalDependencies: + magicast: 0.3.5 + + c12@1.11.2(magicast@0.3.5): + dependencies: + chokidar: 3.6.0 + confbox: 0.1.7 + defu: 6.1.4 + dotenv: 16.4.5 + giget: 1.2.3 + jiti: 1.21.6 + mlly: 1.7.1 + ohash: 1.1.3 + pathe: 1.1.2 + perfect-debounce: 1.0.0 + pkg-types: 1.2.0 + rc9: 2.1.2 + optionalDependencies: + magicast: 0.3.5 + cac@6.7.14: {} + cacache@17.1.4: + dependencies: + '@npmcli/fs': 3.1.0 + fs-minipass: 3.0.3 + glob: 10.4.5 + lru-cache: 7.18.3 + minipass: 7.1.2 + minipass-collect: 1.0.2 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + p-map: 4.0.0 + ssri: 10.0.5 + tar: 6.2.1 + unique-filename: 3.0.0 + cacache@18.0.2: dependencies: '@npmcli/fs': 3.1.0 fs-minipass: 3.0.3 - glob: 10.3.12 + glob: 10.4.5 lru-cache: 10.2.0 minipass: 7.0.4 minipass-collect: 2.0.1 @@ -22625,7 +24490,7 @@ snapshots: capnp-ts@0.7.0: dependencies: - debug: 4.3.5 + debug: 4.3.6 tslib: 2.6.2 transitivePeerDependencies: - supports-color @@ -22642,11 +24507,13 @@ snapshots: pathval: 1.1.1 type-detect: 4.0.8 - chalk@2.3.0: + chai@5.1.1: dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 4.5.0 + assertion-error: 2.0.1 + check-error: 2.1.1 + deep-eql: 5.0.2 + loupe: 3.1.1 + pathval: 2.0.0 chalk@2.4.2: dependencies: @@ -22682,6 +24549,8 @@ snapshots: dependencies: get-func-name: 2.0.2 + check-error@2.1.1: {} + chokidar@3.6.0: dependencies: anymatch: 3.1.3 @@ -22694,8 +24563,7 @@ snapshots: optionalDependencies: fsevents: 2.3.3 - chownr@1.1.4: - optional: true + chownr@1.1.4: {} chownr@2.0.0: {} @@ -22708,6 +24576,8 @@ snapshots: transitivePeerDependencies: - supports-color + chrome-trace-event@1.0.4: {} + ci-info@2.0.0: {} ci-info@3.8.0: {} @@ -22758,11 +24628,6 @@ snapshots: client-only@0.0.1: {} - clipboardy@1.2.2: - dependencies: - arch: 2.2.0 - execa: 0.8.0 - clipboardy@4.0.0: dependencies: execa: 8.0.1 @@ -22809,7 +24674,7 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.4.15 '@types/estree': 1.0.5 - acorn: 8.11.3 + acorn: 8.12.1 estree-walker: 3.0.3 periscopic: 3.1.0 @@ -22825,6 +24690,8 @@ snapshots: transitivePeerDependencies: - '@lezer/common' + collapse-white-space@2.1.0: {} + color-convert@1.9.3: dependencies: color-name: 1.1.3 @@ -22905,8 +24772,6 @@ snapshots: transitivePeerDependencies: - supports-color - compute-scroll-into-view@3.0.3: {} - computeds@0.0.1: {} concat-map@0.0.1: {} @@ -22978,10 +24843,6 @@ snapshots: object-assign: 4.1.1 vary: 1.1.2 - cose-base@1.0.3: - dependencies: - layout-base: 1.0.2 - cosmiconfig@5.2.1: dependencies: import-fresh: 2.0.0 @@ -23154,180 +25015,6 @@ snapshots: optionalDependencies: typescript: 5.5.2 - cytoscape-cose-bilkent@4.1.0(cytoscape@3.29.0): - dependencies: - cose-base: 1.0.3 - cytoscape: 3.29.0 - - cytoscape@3.29.0: {} - - d3-array@2.12.1: - dependencies: - internmap: 1.0.1 - - d3-array@3.2.4: - dependencies: - internmap: 2.0.3 - - d3-axis@3.0.0: {} - - d3-brush@3.0.0: - dependencies: - d3-dispatch: 3.0.1 - d3-drag: 3.0.0 - d3-interpolate: 3.0.1 - d3-selection: 3.0.0 - d3-transition: 3.0.1(d3-selection@3.0.0) - - d3-chord@3.0.1: - dependencies: - d3-path: 3.1.0 - - d3-color@3.1.0: {} - - d3-contour@4.0.2: - dependencies: - d3-array: 3.2.4 - - d3-delaunay@6.0.4: - dependencies: - delaunator: 5.0.0 - - d3-dispatch@3.0.1: {} - - d3-drag@3.0.0: - dependencies: - d3-dispatch: 3.0.1 - d3-selection: 3.0.0 - - d3-dsv@3.0.1: - dependencies: - commander: 7.2.0 - iconv-lite: 0.6.3 - rw: 1.3.3 - - d3-ease@3.0.1: {} - - d3-fetch@3.0.1: - dependencies: - d3-dsv: 3.0.1 - - d3-force@3.0.0: - dependencies: - d3-dispatch: 3.0.1 - d3-quadtree: 3.0.1 - d3-timer: 3.0.1 - - d3-format@3.1.0: {} - - d3-geo@3.1.0: - dependencies: - d3-array: 3.2.4 - - d3-hierarchy@3.1.2: {} - - d3-interpolate@3.0.1: - dependencies: - d3-color: 3.1.0 - - d3-path@1.0.9: {} - - d3-path@3.1.0: {} - - d3-polygon@3.0.1: {} - - d3-quadtree@3.0.1: {} - - d3-random@3.0.1: {} - - d3-sankey@0.12.3: - dependencies: - d3-array: 2.12.1 - d3-shape: 1.3.7 - - d3-scale-chromatic@3.0.0: - dependencies: - d3-color: 3.1.0 - d3-interpolate: 3.0.1 - - d3-scale@4.0.2: - dependencies: - d3-array: 3.2.4 - d3-format: 3.1.0 - d3-interpolate: 3.0.1 - d3-time: 3.1.0 - d3-time-format: 4.1.0 - - d3-selection@3.0.0: {} - - d3-shape@1.3.7: - dependencies: - d3-path: 1.0.9 - - d3-shape@3.2.0: - dependencies: - d3-path: 3.1.0 - - d3-time-format@4.1.0: - dependencies: - d3-time: 3.1.0 - - d3-time@3.1.0: - dependencies: - d3-array: 3.2.4 - - d3-timer@3.0.1: {} - - d3-transition@3.0.1(d3-selection@3.0.0): - dependencies: - d3-color: 3.1.0 - d3-dispatch: 3.0.1 - d3-ease: 3.0.1 - d3-interpolate: 3.0.1 - d3-selection: 3.0.0 - d3-timer: 3.0.1 - - d3-zoom@3.0.0: - dependencies: - d3-dispatch: 3.0.1 - d3-drag: 3.0.0 - d3-interpolate: 3.0.1 - d3-selection: 3.0.0 - d3-transition: 3.0.1(d3-selection@3.0.0) - - d3@7.8.5: - dependencies: - d3-array: 3.2.4 - d3-axis: 3.0.0 - d3-brush: 3.0.0 - d3-chord: 3.0.1 - d3-color: 3.1.0 - d3-contour: 4.0.2 - d3-delaunay: 6.0.4 - d3-dispatch: 3.0.1 - d3-drag: 3.0.0 - d3-dsv: 3.0.1 - d3-ease: 3.0.1 - d3-fetch: 3.0.1 - d3-force: 3.0.0 - d3-format: 3.1.0 - d3-geo: 3.1.0 - d3-hierarchy: 3.1.2 - d3-interpolate: 3.0.1 - d3-path: 3.1.0 - d3-polygon: 3.0.1 - d3-quadtree: 3.0.1 - d3-random: 3.0.1 - d3-scale: 4.0.2 - d3-scale-chromatic: 3.0.0 - d3-selection: 3.0.0 - d3-shape: 3.2.0 - d3-time: 3.1.0 - d3-time-format: 4.1.0 - d3-timer: 3.0.1 - d3-transition: 3.0.1(d3-selection@3.0.0) - d3-zoom: 3.0.0 - d@1.0.2: dependencies: es5-ext: 0.10.64 @@ -23335,11 +25022,6 @@ snapshots: dag-map@1.0.2: {} - dagre-d3-es@7.0.10: - dependencies: - d3: 7.8.5 - lodash-es: 4.17.21 - damerau-levenshtein@1.0.8: {} data-uri-to-buffer@2.0.2: {} @@ -23422,14 +25104,20 @@ snapshots: dedent-js@1.0.1: {} + dedent@1.5.3: {} + deep-eql@4.1.3: dependencies: type-detect: 4.0.8 + deep-eql@5.0.2: {} + deep-extend@0.6.0: {} deep-is@0.1.4: {} + deep-object-diff@1.1.9: {} + deepmerge@4.2.2: {} deepmerge@4.3.1: {} @@ -23493,10 +25181,6 @@ snapshots: rimraf: 3.0.2 slash: 3.0.0 - delaunator@5.0.0: - dependencies: - robust-predicates: 3.0.2 - delayed-stream@1.0.0: {} delegates@1.0.0: {} @@ -23541,6 +25225,8 @@ snapshots: diff@5.2.0: {} + diff@7.0.0: {} + difflib@0.2.4: dependencies: heap: 0.2.7 @@ -23575,8 +25261,6 @@ snapshots: dependencies: domelementtype: 2.3.0 - dompurify@3.1.0: {} - domutils@3.1.0: dependencies: dom-serializer: 2.0.0 @@ -23640,16 +25324,25 @@ snapshots: duplexer@0.1.2: {} + duplexify@3.7.1: + dependencies: + end-of-stream: 1.4.4 + inherits: 2.0.4 + readable-stream: 2.3.8 + stream-shift: 1.0.3 + eastasianwidth@0.2.0: {} ee-first@1.1.1: {} - effect@3.4.8: {} + effect-log@0.32.0(effect@3.7.2): + dependencies: + effect: 3.7.2 + + effect@3.7.2: {} electron-to-chromium@1.4.746: {} - elkjs@0.9.3: {} - elysia@0.8.17(openapi-types@12.1.3)(typescript@5.5.2): dependencies: cookie: 0.6.0 @@ -23667,6 +25360,8 @@ snapshots: emoji-regex@9.2.2: {} + emojis-list@3.0.0: {} + encodeurl@1.0.2: {} encoding@0.1.13: @@ -23683,6 +25378,11 @@ snapshots: graceful-fs: 4.2.11 tapable: 2.2.1 + enhanced-resolve@5.17.1: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + enquirer@2.4.1: dependencies: ansi-colors: 4.1.3 @@ -23850,16 +25550,23 @@ snapshots: transitivePeerDependencies: - supports-color + esbuild-plugins-node-modules-polyfill@1.6.6(esbuild@0.17.6): + dependencies: + '@jspm/core': 2.0.1 + esbuild: 0.17.6 + local-pkg: 0.5.0 + resolve.exports: 2.0.2 + esbuild-register@3.5.0(esbuild@0.19.12): dependencies: - debug: 4.3.5 + debug: 4.3.6 esbuild: 0.19.12 transitivePeerDependencies: - supports-color esbuild-register@3.5.0(esbuild@0.21.5): dependencies: - debug: 4.3.5 + debug: 4.3.6 esbuild: 0.21.5 transitivePeerDependencies: - supports-color @@ -23889,6 +25596,31 @@ snapshots: '@esbuild/win32-ia32': 0.17.19 '@esbuild/win32-x64': 0.17.19 + esbuild@0.17.6: + optionalDependencies: + '@esbuild/android-arm': 0.17.6 + '@esbuild/android-arm64': 0.17.6 + '@esbuild/android-x64': 0.17.6 + '@esbuild/darwin-arm64': 0.17.6 + '@esbuild/darwin-x64': 0.17.6 + '@esbuild/freebsd-arm64': 0.17.6 + '@esbuild/freebsd-x64': 0.17.6 + '@esbuild/linux-arm': 0.17.6 + '@esbuild/linux-arm64': 0.17.6 + '@esbuild/linux-ia32': 0.17.6 + '@esbuild/linux-loong64': 0.17.6 + '@esbuild/linux-mips64el': 0.17.6 + '@esbuild/linux-ppc64': 0.17.6 + '@esbuild/linux-riscv64': 0.17.6 + '@esbuild/linux-s390x': 0.17.6 + '@esbuild/linux-x64': 0.17.6 + '@esbuild/netbsd-x64': 0.17.6 + '@esbuild/openbsd-x64': 0.17.6 + '@esbuild/sunos-x64': 0.17.6 + '@esbuild/win32-arm64': 0.17.6 + '@esbuild/win32-ia32': 0.17.6 + '@esbuild/win32-x64': 0.17.6 + esbuild@0.18.20: optionalDependencies: '@esbuild/android-arm': 0.18.20 @@ -24007,17 +25739,17 @@ snapshots: eslint-compat-utils@0.5.0(eslint@8.57.0): dependencies: eslint: 8.57.0 - semver: 7.6.2 + semver: 7.6.3 eslint-config-next@14.2.2(eslint@8.57.0)(typescript@5.5.2): dependencies: '@next/eslint-plugin-next': 14.2.2 '@rushstack/eslint-patch': 1.10.2 - '@typescript-eslint/parser': 6.3.0(eslint@8.57.0)(typescript@5.5.2) + '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.5.2) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.3.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.13.1(eslint@8.57.0)(typescript@5.5.2))(eslint@8.57.0) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) eslint-plugin-jsx-a11y: 6.8.0(eslint@8.57.0) eslint-plugin-react: 7.34.1(eslint@8.57.0) eslint-plugin-react-hooks: 4.6.0(eslint@8.57.0) @@ -24040,13 +25772,13 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.3.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0): + eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0): dependencies: - debug: 4.3.5 + debug: 4.3.6 enhanced-resolve: 5.15.0 eslint: 8.57.0 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.3.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.3.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.13.1(eslint@8.57.0)(typescript@5.5.2))(eslint@8.57.0) + eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) fast-glob: 3.3.2 get-tsconfig: 4.7.3 is-core-module: 2.13.1 @@ -24057,14 +25789,14 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-module-utils@2.8.0(@typescript-eslint/parser@6.3.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.3.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0): + eslint-module-utils@2.8.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 6.3.0(eslint@8.57.0)(typescript@5.5.2) + '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.5.2) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.3.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0) transitivePeerDependencies: - supports-color @@ -24078,6 +25810,33 @@ snapshots: transitivePeerDependencies: - supports-color + eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): + dependencies: + array-includes: 3.1.8 + array.prototype.findlastindex: 1.2.5 + array.prototype.flat: 1.3.2 + array.prototype.flatmap: 1.3.2 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 8.57.0 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) + hasown: 2.0.2 + is-core-module: 2.13.1 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.fromentries: 2.0.8 + object.groupby: 1.0.3 + object.values: 1.2.0 + semver: 6.3.1 + tsconfig-paths: 3.15.0 + optionalDependencies: + '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.5.2) + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.13.1(eslint@8.57.0)(typescript@5.5.2))(eslint@8.57.0): dependencies: array-includes: 3.1.8 @@ -24177,6 +25936,11 @@ snapshots: dotenv: 16.0.3 eslint: 8.57.0 + eslint-scope@5.1.1: + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + eslint-scope@7.2.2: dependencies: esrecurse: 4.3.0 @@ -24197,7 +25961,7 @@ snapshots: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 - debug: 4.3.5 + debug: 4.3.6 doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 @@ -24211,7 +25975,7 @@ snapshots: glob-parent: 6.0.2 globals: 13.21.0 graphemer: 1.4.0 - ignore: 5.3.1 + ignore: 5.3.2 imurmurhash: 0.1.4 is-glob: 4.0.3 is-path-inside: 3.0.3 @@ -24238,8 +26002,8 @@ snapshots: espree@9.6.1: dependencies: - acorn: 8.11.3 - acorn-jsx: 5.3.2(acorn@8.11.3) + acorn: 8.12.1 + acorn-jsx: 5.3.2(acorn@8.12.1) eslint-visitor-keys: 3.4.3 esprima@4.0.1: {} @@ -24252,26 +26016,49 @@ snapshots: dependencies: estraverse: 5.3.0 + estraverse@4.3.0: {} + estraverse@5.3.0: {} estree-util-attach-comments@2.1.1: dependencies: '@types/estree': 1.0.5 + estree-util-attach-comments@3.0.0: + dependencies: + '@types/estree': 1.0.5 + estree-util-build-jsx@2.2.2: dependencies: '@types/estree-jsx': 1.0.0 estree-util-is-identifier-name: 2.1.0 estree-walker: 3.0.3 + estree-util-build-jsx@3.0.1: + dependencies: + '@types/estree-jsx': 1.0.0 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + estree-walker: 3.0.3 + + estree-util-is-identifier-name@1.1.0: {} + estree-util-is-identifier-name@2.1.0: {} + estree-util-is-identifier-name@3.0.0: {} + estree-util-to-js@1.2.0: dependencies: '@types/estree-jsx': 1.0.0 astring: 1.8.6 source-map: 0.7.4 + estree-util-to-js@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.0 + astring: 1.8.6 + source-map: 0.7.4 + estree-util-value-to-estree@1.3.0: dependencies: is-plain-obj: 3.0.0 @@ -24281,6 +26068,11 @@ snapshots: '@types/estree-jsx': 1.0.0 '@types/unist': 2.0.7 + estree-util-visit@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.0 + '@types/unist': 3.0.2 + estree-walker@0.6.1: {} estree-walker@2.0.2: {} @@ -24293,6 +26085,11 @@ snapshots: etag@1.8.1: {} + eval@0.1.8: + dependencies: + '@types/node': 20.14.0 + require-like: 0.1.2 + event-emitter@0.3.5: dependencies: d: 1.0.2 @@ -24308,16 +26105,6 @@ snapshots: exec-async@2.2.0: {} - execa@0.8.0: - dependencies: - cross-spawn: 5.1.0 - get-stream: 3.0.0 - is-stream: 1.1.0 - npm-run-path: 2.0.2 - p-finally: 1.0.0 - signal-exit: 3.0.7 - strip-eof: 1.0.0 - execa@1.0.0: dependencies: cross-spawn: 6.0.5 @@ -24412,7 +26199,7 @@ snapshots: expo-dev-menu: 5.0.14(expo@51.0.9(@babel/core@7.24.4)(@babel/preset-env@7.24.6(@babel/core@7.24.4))(encoding@0.1.13)) expo-manifests: 0.14.3(expo@51.0.9(@babel/core@7.24.4)(@babel/preset-env@7.24.6(@babel/core@7.24.4))(encoding@0.1.13)) resolve-from: 5.0.0 - semver: 7.6.2 + semver: 7.6.3 transitivePeerDependencies: - supports-color @@ -24424,7 +26211,7 @@ snapshots: dependencies: expo: 51.0.9(@babel/core@7.24.4)(@babel/preset-env@7.24.6(@babel/core@7.24.4))(encoding@0.1.13) expo-dev-menu-interface: 1.8.3(expo@51.0.9(@babel/core@7.24.4)(@babel/preset-env@7.24.6(@babel/core@7.24.4))(encoding@0.1.13)) - semver: 7.6.2 + semver: 7.6.3 expo-document-picker@12.0.1(expo@51.0.9(@babel/core@7.24.4)(@babel/preset-env@7.24.6(@babel/core@7.24.4))(encoding@0.1.13)): dependencies: @@ -24625,7 +26412,7 @@ snapshots: fake-indexeddb@5.0.2: {} - fast-check@3.19.0: + fast-check@3.22.0: dependencies: pure-rand: 6.1.0 @@ -24650,8 +26437,8 @@ snapshots: fast-json-stringify@5.14.1: dependencies: '@fastify/merge-json-schemas': 0.1.1 - ajv: 8.12.0 - ajv-formats: 3.0.1(ajv@8.12.0) + ajv: 8.16.0 + ajv-formats: 3.0.1(ajv@8.16.0) fast-deep-equal: 3.1.3 fast-uri: 2.3.0 json-schema-ref-resolver: 1.0.1 @@ -24702,6 +26489,10 @@ snapshots: dependencies: reusify: 1.0.4 + fault@2.0.1: + dependencies: + format: 0.2.2 + fb-watchman@2.0.2: dependencies: bser: 2.1.1 @@ -24787,9 +26578,7 @@ snapshots: make-dir: 2.1.0 pkg-dir: 3.0.0 - find-my-way-ts@0.1.4: - dependencies: - fast-querystring: 1.1.2 + find-my-way-ts@0.1.5: {} find-my-way@8.1.0: dependencies: @@ -24829,14 +26618,12 @@ snapshots: flattie@1.1.1: {} - flexsearch@0.7.31: {} + flexsearch@0.7.43: {} flow-enums-runtime@0.0.6: {} flow-parser@0.237.1: {} - focus-visible@5.2.0: {} - follow-redirects@1.15.6: {} fontfaceobserver@2.3.0: {} @@ -24864,6 +26651,8 @@ snapshots: combined-stream: 1.0.8 mime-types: 2.1.35 + format@0.2.2: {} + formdata-node@4.4.1: dependencies: node-domexception: 1.0.0 @@ -24877,14 +26666,26 @@ snapshots: fraction.js@4.3.7: {} + framer-motion@11.5.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + tslib: 2.6.2 + optionalDependencies: + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + framework-utils@1.1.0: {} freeport-async@2.0.0: {} fresh@0.5.2: {} - fs-constants@1.0.0: - optional: true + fs-constants@1.0.0: {} + + fs-extra@10.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.0 fs-extra@11.2.0: dependencies: @@ -24924,7 +26725,7 @@ snapshots: fs-minipass@3.0.3: dependencies: - minipass: 7.0.4 + minipass: 7.1.2 fs.realpath@1.0.0: {} @@ -24959,9 +26760,13 @@ snapshots: strip-ansi: 6.0.1 wide-align: 1.1.5 - geist@1.3.0(next@14.2.3(@playwright/test@1.45.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)): + geist@1.3.0(next@14.2.11(@playwright/test@1.45.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)): + dependencies: + next: 14.2.11(@babel/core@7.24.4)(@playwright/test@1.45.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + + generic-names@4.0.0: dependencies: - next: 14.2.3(@babel/core@7.24.4)(@playwright/test@1.45.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + loader-utils: 3.3.1 gensync@1.0.0-beta.2: {} @@ -24992,13 +26797,13 @@ snapshots: get-port@3.2.0: {} + get-port@5.1.1: {} + get-source@2.0.12: dependencies: data-uri-to-buffer: 2.0.2 source-map: 0.6.1 - get-stream@3.0.0: {} - get-stream@4.1.0: dependencies: pump: 3.0.0 @@ -25037,10 +26842,6 @@ snapshots: is-ssh: 1.4.0 parse-url: 8.1.0 - git-url-parse@13.1.0: - dependencies: - git-up: 7.0.0 - git-url-parse@14.0.0: dependencies: git-up: 7.0.0 @@ -25068,13 +26869,14 @@ snapshots: minipass: 7.0.4 path-scurry: 1.10.2 - glob@10.3.12: + glob@10.4.5: dependencies: foreground-child: 3.1.1 - jackspeak: 2.3.6 + jackspeak: 3.4.3 minimatch: 9.0.4 - minipass: 7.0.4 - path-scurry: 1.10.2 + minipass: 7.1.2 + package-json-from-dist: 1.0.0 + path-scurry: 1.11.1 glob@6.0.4: dependencies: @@ -25132,7 +26934,7 @@ snapshots: array-union: 2.1.0 dir-glob: 3.0.1 fast-glob: 3.3.2 - ignore: 5.3.1 + ignore: 5.3.2 merge2: 1.4.1 slash: 3.0.0 @@ -25140,7 +26942,7 @@ snapshots: dependencies: dir-glob: 3.0.1 fast-glob: 3.3.2 - ignore: 5.3.1 + ignore: 5.3.2 merge2: 1.4.1 slash: 4.0.0 @@ -25148,7 +26950,7 @@ snapshots: dependencies: '@sindresorhus/merge-streams': 2.3.0 fast-glob: 3.3.2 - ignore: 5.3.1 + ignore: 5.3.2 path-type: 5.0.0 slash: 5.1.0 unicorn-magic: 0.1.0 @@ -25206,6 +27008,15 @@ snapshots: section-matter: 1.0.0 strip-bom-string: 1.0.0 + gunzip-maybe@1.4.2: + dependencies: + browserify-zlib: 0.1.4 + is-deflate: 1.0.0 + is-gzip: 1.0.0 + peek-stream: 1.1.3 + pumpify: 1.5.1 + through2: 2.0.5 + gzip-size@6.0.0: dependencies: duplexer: 0.1.2 @@ -25244,8 +27055,6 @@ snapshots: has-bigints@1.0.2: {} - has-flag@2.0.0: {} - has-flag@3.0.0: {} has-flag@4.0.0: {} @@ -25264,12 +27073,6 @@ snapshots: has-unicode@2.0.1: {} - hash-obj@4.0.0: - dependencies: - is-obj: 3.0.0 - sort-keys: 5.0.0 - type-fest: 1.4.0 - hash-sum@2.0.0: {} hasown@2.0.2: @@ -25281,19 +27084,6 @@ snapshots: '@types/hast': 3.0.4 hast-util-is-element: 3.0.0 - hast-util-from-dom@5.0.0: - dependencies: - '@types/hast': 3.0.4 - hastscript: 8.0.0 - web-namespaces: 2.0.1 - - hast-util-from-html-isomorphic@2.0.0: - dependencies: - '@types/hast': 3.0.4 - hast-util-from-dom: 5.0.0 - hast-util-from-html: 2.0.1 - unist-util-remove-position: 5.0.0 - hast-util-from-html@2.0.1: dependencies: '@types/hast': 3.0.4 @@ -25380,6 +27170,27 @@ snapshots: transitivePeerDependencies: - supports-color + hast-util-to-estree@3.1.0: + dependencies: + '@types/estree': 1.0.5 + '@types/estree-jsx': 1.0.0 + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + devlop: 1.1.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.1.3 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 6.2.0 + space-separated-tokens: 2.0.2 + style-to-object: 0.4.2 + unist-util-position: 5.0.0 + zwitch: 2.0.4 + transitivePeerDependencies: + - supports-color + hast-util-to-html@9.0.1: dependencies: '@types/hast': 3.0.4 @@ -25395,6 +27206,40 @@ snapshots: stringify-entities: 4.0.3 zwitch: 2.0.4 + hast-util-to-html@9.0.2: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.2 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.1.0 + property-information: 6.2.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.3 + zwitch: 2.0.4 + + hast-util-to-jsx-runtime@2.3.0: + dependencies: + '@types/estree': 1.0.5 + '@types/hast': 3.0.4 + '@types/unist': 3.0.2 + comma-separated-tokens: 2.0.3 + devlop: 1.1.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.1.3 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 6.2.0 + space-separated-tokens: 2.0.2 + style-to-object: 1.0.8 + unist-util-position: 5.0.0 + vfile-message: 4.0.2 + transitivePeerDependencies: + - supports-color + hast-util-to-parse5@8.0.0: dependencies: '@types/hast': 3.0.4 @@ -25448,6 +27293,8 @@ snapshots: dependencies: source-map: 0.7.4 + highlight-words-core@1.2.2: {} + highlight.js@11.9.0: {} highlightjs-curl@1.3.0: {} @@ -25468,9 +27315,13 @@ snapshots: dependencies: lru-cache: 6.0.0 + hosted-git-info@6.1.1: + dependencies: + lru-cache: 7.18.3 + hosted-git-info@7.0.1: dependencies: - lru-cache: 10.2.0 + lru-cache: 10.4.3 html-entities@2.3.3: {} @@ -25499,7 +27350,7 @@ snapshots: http-proxy-agent@7.0.2: dependencies: agent-base: 7.1.1 - debug: 4.3.5 + debug: 4.3.6 transitivePeerDependencies: - supports-color @@ -25521,14 +27372,14 @@ snapshots: https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.3.5 + debug: 4.3.6 transitivePeerDependencies: - supports-color https-proxy-agent@7.0.1: dependencies: agent-base: 7.1.1 - debug: 4.3.5 + debug: 4.3.6 transitivePeerDependencies: - supports-color @@ -25557,6 +27408,11 @@ snapshots: iconv-lite@0.6.3: dependencies: safer-buffer: 2.1.2 + optional: true + + icss-utils@5.1.0(postcss@8.4.38): + dependencies: + postcss: 8.4.38 ieee754@1.2.1: {} @@ -25605,6 +27461,8 @@ snapshots: inline-style-parser@0.1.1: {} + inline-style-parser@0.2.4: {} + inline-style-prefixer@6.0.4: dependencies: css-in-js-utils: 3.1.0 @@ -25621,12 +27479,6 @@ snapshots: hasown: 2.0.2 side-channel: 1.0.6 - internmap@1.0.1: {} - - internmap@2.0.3: {} - - intersection-observer@0.12.2: {} - invariant@2.2.4: dependencies: loose-envify: 1.4.0 @@ -25635,7 +27487,7 @@ snapshots: dependencies: '@ioredis/commands': 1.2.0 cluster-key-slot: 1.1.2 - debug: 4.3.5 + debug: 4.3.6 denque: 2.1.0 lodash.defaults: 4.2.0 lodash.isarguments: 3.1.0 @@ -25717,6 +27569,8 @@ snapshots: is-decimal@2.0.1: {} + is-deflate@1.0.0: {} + is-directory@0.3.1: {} is-docker@2.2.1: {} @@ -25749,6 +27603,8 @@ snapshots: dependencies: is-extglob: 2.1.1 + is-gzip@1.0.0: {} + is-hexadecimal@2.0.1: {} is-inside-container@1.0.0: @@ -25791,8 +27647,6 @@ snapshots: is-obj@1.0.1: {} - is-obj@3.0.0: {} - is-path-cwd@2.2.0: {} is-path-inside@3.0.3: {} @@ -25905,6 +27759,8 @@ snapshots: isarray@2.0.5: {} + isbot@4.4.0: {} + isexe@2.0.0: {} isexe@3.1.1: {} @@ -25922,10 +27778,10 @@ snapshots: make-dir: 4.0.0 supports-color: 7.2.0 - istanbul-lib-source-maps@5.0.4: + istanbul-lib-source-maps@5.0.6: dependencies: '@jridgewell/trace-mapping': 0.3.25 - debug: 4.3.5 + debug: 4.3.6 istanbul-lib-coverage: 3.2.2 transitivePeerDependencies: - supports-color @@ -25949,6 +27805,14 @@ snapshots: optionalDependencies: '@pkgjs/parseargs': 0.11.0 + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + javascript-stringify@2.1.0: {} + jest-environment-node@29.7.0: dependencies: '@jest/environment': 29.7.0 @@ -25996,6 +27860,12 @@ snapshots: leven: 3.1.0 pretty-format: 29.7.0 + jest-worker@27.5.1: + dependencies: + '@types/node': 20.14.0 + merge-stream: 2.0.0 + supports-color: 8.1.1 + jest-worker@29.7.0: dependencies: '@types/node': 20.14.0 @@ -26054,7 +27924,7 @@ snapshots: jscodeshift@0.14.0(@babel/preset-env@7.24.6(@babel/core@7.24.4)): dependencies: '@babel/core': 7.24.4 - '@babel/parser': 7.24.6 + '@babel/parser': 7.25.6 '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.24.4) '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.24.4) '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.24.4) @@ -26079,7 +27949,7 @@ snapshots: jscodeshift@0.15.2(@babel/preset-env@7.24.6(@babel/core@7.24.4)): dependencies: '@babel/core': 7.24.4 - '@babel/parser': 7.24.6 + '@babel/parser': 7.25.6 '@babel/plugin-transform-class-properties': 7.24.6(@babel/core@7.24.4) '@babel/plugin-transform-modules-commonjs': 7.24.6(@babel/core@7.24.4) '@babel/plugin-transform-nullish-coalescing-operator': 7.24.6(@babel/core@7.24.4) @@ -26107,6 +27977,8 @@ snapshots: jsesc@2.5.2: {} + jsesc@3.0.2: {} + json-buffer@3.0.1: {} json-diff@0.9.0: @@ -26119,6 +27991,8 @@ snapshots: json-parse-even-better-errors@2.3.1: {} + json-parse-even-better-errors@3.0.2: {} + json-schema-deref-sync@0.13.0: dependencies: clone: 2.1.2 @@ -26146,8 +28020,6 @@ snapshots: json5@2.2.3: {} - jsonc-parser@3.2.0: {} - jsonfile@4.0.0: optionalDependencies: graceful-fs: 4.2.11 @@ -26171,10 +28043,6 @@ snapshots: just-clone@6.2.0: {} - katex@0.16.10: - dependencies: - commander: 8.3.0 - keycode@2.2.1: {} keycon@1.4.0: @@ -26188,8 +28056,6 @@ snapshots: dependencies: json-buffer: 3.0.1 - khroma@2.0.0: {} - kind-of@6.0.3: {} kleur@3.0.3: {} @@ -26212,16 +28078,14 @@ snapshots: launch-editor@2.8.0: dependencies: - picocolors: 1.0.0 + picocolors: 1.0.1 shell-quote: 1.8.1 - launch-editor@2.8.1: + launch-editor@2.9.1: dependencies: - picocolors: 1.0.0 + picocolors: 1.0.1 shell-quote: 1.8.1 - layout-base@1.0.2: {} - lazystream@1.0.1: dependencies: readable-stream: 2.3.8 @@ -26429,6 +28293,16 @@ snapshots: pify: 4.0.1 strip-bom: 3.0.0 + loader-runner@4.3.0: {} + + loader-utils@2.0.4: + dependencies: + big.js: 5.2.2 + emojis-list: 3.0.0 + json5: 2.2.3 + + loader-utils@3.3.1: {} + local-pkg@0.4.3: {} local-pkg@0.5.0: @@ -26451,7 +28325,7 @@ snapshots: dependencies: p-locate: 5.0.0 - lodash-es@4.17.21: {} + lodash.camelcase@4.3.0: {} lodash.castarray@4.4.0: {} @@ -26459,8 +28333,6 @@ snapshots: lodash.defaults@4.2.0: {} - lodash.get@4.4.2: {} - lodash.isarguments@3.1.0: {} lodash.isplainobject@4.0.6: {} @@ -26516,6 +28388,10 @@ snapshots: dependencies: get-func-name: 2.0.2 + loupe@3.1.1: + dependencies: + get-func-name: 2.0.2 + lower-case@2.0.2: dependencies: tslib: 2.6.2 @@ -26530,6 +28406,8 @@ snapshots: lru-cache@10.2.0: {} + lru-cache@10.4.3: {} + lru-cache@4.1.5: dependencies: pseudomap: 1.0.2 @@ -26543,6 +28421,8 @@ snapshots: dependencies: yallist: 4.0.0 + lru-cache@7.18.3: {} + lru-queue@0.1.0: dependencies: es5-ext: 0.10.64 @@ -26555,7 +28435,7 @@ snapshots: magic-string-ast@0.3.0: dependencies: - magic-string: 0.30.10 + magic-string: 0.30.11 magic-string@0.25.9: dependencies: @@ -26571,14 +28451,20 @@ snapshots: magicast@0.2.10: dependencies: - '@babel/parser': 7.24.6 - '@babel/types': 7.24.6 + '@babel/parser': 7.25.6 + '@babel/types': 7.25.6 recast: 0.23.4 magicast@0.3.4: dependencies: - '@babel/parser': 7.24.6 - '@babel/types': 7.24.6 + '@babel/parser': 7.25.6 + '@babel/types': 7.25.6 + source-map-js: 1.2.0 + + magicast@0.3.5: + dependencies: + '@babel/parser': 7.25.6 + '@babel/types': 7.25.6 source-map-js: 1.2.0 make-dir@2.1.0: @@ -26592,7 +28478,7 @@ snapshots: make-dir@4.0.0: dependencies: - semver: 7.6.2 + semver: 7.6.3 make-fetch-happen@13.0.0: dependencies: @@ -26600,7 +28486,7 @@ snapshots: cacache: 18.0.2 http-cache-semantics: 4.1.1 is-lambda: 1.0.1 - minipass: 7.0.4 + minipass: 7.1.2 minipass-fetch: 3.0.4 minipass-flush: 1.0.5 minipass-pipeline: 1.2.4 @@ -26622,6 +28508,8 @@ snapshots: markdown-extensions@1.1.1: {} + markdown-extensions@2.0.0: {} + markdown-it-task-lists@2.1.1: {} markdown-it@14.1.0: @@ -26637,11 +28525,6 @@ snapshots: marky@1.2.5: {} - match-sorter@6.3.1: - dependencies: - '@babel/runtime': 7.24.4 - remove-accents: 0.4.2 - md5-file@3.2.3: dependencies: buffer-alloc: 1.2.0 @@ -26668,20 +28551,13 @@ snapshots: mdast-util-definitions@6.0.0: dependencies: - '@types/mdast': 4.0.3 + '@types/mdast': 4.0.4 '@types/unist': 3.0.2 unist-util-visit: 5.0.0 - mdast-util-find-and-replace@2.2.2: - dependencies: - '@types/mdast': 3.0.12 - escape-string-regexp: 5.0.0 - unist-util-is: 5.2.1 - unist-util-visit-parents: 5.1.3 - mdast-util-find-and-replace@3.0.1: dependencies: - '@types/mdast': 4.0.3 + '@types/mdast': 4.0.4 escape-string-regexp: 5.0.0 unist-util-is: 6.0.0 unist-util-visit-parents: 6.0.1 @@ -26705,7 +28581,7 @@ snapshots: mdast-util-from-markdown@2.0.0: dependencies: - '@types/mdast': 4.0.3 + '@types/mdast': 4.0.4 '@types/unist': 3.0.2 decode-named-character-reference: 1.0.2 devlop: 1.1.0 @@ -26720,30 +28596,23 @@ snapshots: transitivePeerDependencies: - supports-color - mdast-util-gfm-autolink-literal@1.0.3: + mdast-util-frontmatter@1.0.1: dependencies: '@types/mdast': 3.0.12 - ccount: 2.0.1 - mdast-util-find-and-replace: 2.2.2 - micromark-util-character: 1.2.0 + mdast-util-to-markdown: 1.5.0 + micromark-extension-frontmatter: 1.1.1 mdast-util-gfm-autolink-literal@2.0.0: dependencies: - '@types/mdast': 4.0.3 + '@types/mdast': 4.0.4 ccount: 2.0.1 devlop: 1.1.0 mdast-util-find-and-replace: 3.0.1 micromark-util-character: 2.1.0 - mdast-util-gfm-footnote@1.0.2: - dependencies: - '@types/mdast': 3.0.12 - mdast-util-to-markdown: 1.5.0 - micromark-util-normalize-identifier: 1.1.0 - mdast-util-gfm-footnote@2.0.0: dependencies: - '@types/mdast': 4.0.3 + '@types/mdast': 4.0.4 devlop: 1.1.0 mdast-util-from-markdown: 2.0.0 mdast-util-to-markdown: 2.1.0 @@ -26751,31 +28620,17 @@ snapshots: transitivePeerDependencies: - supports-color - mdast-util-gfm-strikethrough@1.0.3: - dependencies: - '@types/mdast': 3.0.12 - mdast-util-to-markdown: 1.5.0 - mdast-util-gfm-strikethrough@2.0.0: dependencies: - '@types/mdast': 4.0.3 + '@types/mdast': 4.0.4 mdast-util-from-markdown: 2.0.0 mdast-util-to-markdown: 2.1.0 transitivePeerDependencies: - supports-color - mdast-util-gfm-table@1.0.7: - dependencies: - '@types/mdast': 3.0.12 - markdown-table: 3.0.3 - mdast-util-from-markdown: 1.3.1 - mdast-util-to-markdown: 1.5.0 - transitivePeerDependencies: - - supports-color - mdast-util-gfm-table@2.0.0: dependencies: - '@types/mdast': 4.0.3 + '@types/mdast': 4.0.4 devlop: 1.1.0 markdown-table: 3.0.3 mdast-util-from-markdown: 2.0.0 @@ -26783,32 +28638,15 @@ snapshots: transitivePeerDependencies: - supports-color - mdast-util-gfm-task-list-item@1.0.2: - dependencies: - '@types/mdast': 3.0.12 - mdast-util-to-markdown: 1.5.0 - mdast-util-gfm-task-list-item@2.0.0: dependencies: - '@types/mdast': 4.0.3 + '@types/mdast': 4.0.4 devlop: 1.1.0 mdast-util-from-markdown: 2.0.0 mdast-util-to-markdown: 2.1.0 transitivePeerDependencies: - supports-color - mdast-util-gfm@2.0.2: - dependencies: - mdast-util-from-markdown: 1.3.1 - mdast-util-gfm-autolink-literal: 1.0.3 - mdast-util-gfm-footnote: 1.0.2 - mdast-util-gfm-strikethrough: 1.0.3 - mdast-util-gfm-table: 1.0.7 - mdast-util-gfm-task-list-item: 1.0.2 - mdast-util-to-markdown: 1.5.0 - transitivePeerDependencies: - - supports-color - mdast-util-gfm@3.0.0: dependencies: mdast-util-from-markdown: 2.0.0 @@ -26821,12 +28659,6 @@ snapshots: transitivePeerDependencies: - supports-color - mdast-util-math@2.0.2: - dependencies: - '@types/mdast': 3.0.12 - longest-streak: 3.1.0 - mdast-util-to-markdown: 1.5.0 - mdast-util-mdx-expression@1.3.2: dependencies: '@types/estree-jsx': 1.0.0 @@ -26837,6 +28669,17 @@ snapshots: transitivePeerDependencies: - supports-color + mdast-util-mdx-expression@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.0 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + mdast-util-mdx-jsx@2.1.4: dependencies: '@types/estree-jsx': 1.0.0 @@ -26854,6 +28697,23 @@ snapshots: transitivePeerDependencies: - supports-color + mdast-util-mdx-jsx@3.1.3: + dependencies: + '@types/estree-jsx': 1.0.0 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@types/unist': 3.0.2 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + parse-entities: 4.0.1 + stringify-entities: 4.0.3 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.2 + transitivePeerDependencies: + - supports-color + mdast-util-mdx@2.0.1: dependencies: mdast-util-from-markdown: 1.3.1 @@ -26864,6 +28724,16 @@ snapshots: transitivePeerDependencies: - supports-color + mdast-util-mdx@3.0.0: + dependencies: + mdast-util-from-markdown: 2.0.0 + mdast-util-mdx-expression: 2.0.0 + mdast-util-mdx-jsx: 3.1.3 + mdast-util-mdxjs-esm: 2.0.1 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + mdast-util-mdxjs-esm@1.3.1: dependencies: '@types/estree-jsx': 1.0.0 @@ -26874,6 +28744,17 @@ snapshots: transitivePeerDependencies: - supports-color + mdast-util-mdxjs-esm@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.0 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + mdast-util-phrasing@3.0.1: dependencies: '@types/mdast': 3.0.12 @@ -26881,7 +28762,7 @@ snapshots: mdast-util-phrasing@4.1.0: dependencies: - '@types/mdast': 4.0.3 + '@types/mdast': 4.0.4 unist-util-is: 6.0.0 mdast-util-to-hast@12.3.0: @@ -26898,7 +28779,7 @@ snapshots: mdast-util-to-hast@13.1.0: dependencies: '@types/hast': 3.0.4 - '@types/mdast': 4.0.3 + '@types/mdast': 4.0.4 '@ungap/structured-clone': 1.2.0 devlop: 1.1.0 micromark-util-sanitize-uri: 2.0.0 @@ -26920,7 +28801,7 @@ snapshots: mdast-util-to-markdown@2.1.0: dependencies: - '@types/mdast': 4.0.3 + '@types/mdast': 4.0.4 '@types/unist': 3.0.2 longest-streak: 3.1.0 mdast-util-phrasing: 4.1.0 @@ -26935,7 +28816,7 @@ snapshots: mdast-util-to-string@4.0.0: dependencies: - '@types/mdast': 4.0.3 + '@types/mdast': 4.0.4 mdn-data@2.0.28: {} @@ -26943,10 +28824,22 @@ snapshots: mdurl@2.0.0: {} + mdx-annotations@0.1.4: + dependencies: + acorn: 8.12.1 + estree-util-visit: 1.2.1 + unist-util-visit: 4.1.2 + + media-query-parser@2.0.2: + dependencies: + '@babel/runtime': 7.24.4 + media-typer@0.3.0: {} memoirist@0.1.10: {} + memoize-one@4.0.3: {} + memoize-one@5.2.1: {} memoize-one@6.0.0: {} @@ -26988,31 +28881,6 @@ snapshots: merge2@1.4.1: {} - mermaid@10.9.0: - dependencies: - '@braintree/sanitize-url': 6.0.4 - '@types/d3-scale': 4.0.8 - '@types/d3-scale-chromatic': 3.0.3 - cytoscape: 3.29.0 - cytoscape-cose-bilkent: 4.1.0(cytoscape@3.29.0) - d3: 7.8.5 - d3-sankey: 0.12.3 - dagre-d3-es: 7.0.10 - dayjs: 1.11.9 - dompurify: 3.1.0 - elkjs: 0.9.3 - katex: 0.16.10 - khroma: 2.0.0 - lodash-es: 4.17.21 - mdast-util-from-markdown: 1.3.1 - non-layered-tidy-tree-layout: 2.0.2 - stylis: 4.3.0 - ts-dedent: 2.2.0 - uuid: 9.0.0 - web-worker: 1.2.0 - transitivePeerDependencies: - - supports-color - methods@1.1.2: {} metro-babel-transformer@0.80.9: @@ -27115,8 +28983,8 @@ snapshots: dependencies: '@babel/core': 7.24.4 '@babel/generator': 7.24.4 - '@babel/parser': 7.24.6 - '@babel/types': 7.24.6 + '@babel/parser': 7.25.6 + '@babel/types': 7.25.6 metro: 0.80.9(encoding@0.1.13) metro-babel-transformer: 0.80.9 metro-cache: 0.80.9 @@ -27136,10 +29004,10 @@ snapshots: '@babel/code-frame': 7.24.6 '@babel/core': 7.24.4 '@babel/generator': 7.24.4 - '@babel/parser': 7.24.6 + '@babel/parser': 7.25.6 '@babel/template': 7.24.6 '@babel/traverse': 7.24.1 - '@babel/types': 7.24.6 + '@babel/types': 7.25.6 accepts: 1.3.8 chalk: 4.1.2 ci-info: 2.0.0 @@ -27220,10 +29088,10 @@ snapshots: micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 - micromark-extension-gfm-autolink-literal@1.0.5: + micromark-extension-frontmatter@1.1.1: dependencies: + fault: 2.0.1 micromark-util-character: 1.2.0 - micromark-util-sanitize-uri: 1.2.0 micromark-util-symbol: 1.1.0 micromark-util-types: 1.1.0 @@ -27234,17 +29102,6 @@ snapshots: micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 - micromark-extension-gfm-footnote@1.1.2: - dependencies: - micromark-core-commonmark: 1.1.0 - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-normalize-identifier: 1.1.0 - micromark-util-sanitize-uri: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 - micromark-extension-gfm-footnote@2.0.0: dependencies: devlop: 1.1.0 @@ -27256,15 +29113,6 @@ snapshots: micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 - micromark-extension-gfm-strikethrough@1.0.7: - dependencies: - micromark-util-chunked: 1.1.0 - micromark-util-classify-character: 1.1.0 - micromark-util-resolve-all: 1.1.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 - micromark-extension-gfm-strikethrough@2.0.0: dependencies: devlop: 1.1.0 @@ -27274,14 +29122,6 @@ snapshots: micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 - micromark-extension-gfm-table@1.0.7: - dependencies: - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 - micromark-extension-gfm-table@2.0.0: dependencies: devlop: 1.1.0 @@ -27290,22 +29130,10 @@ snapshots: micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 - micromark-extension-gfm-tagfilter@1.0.2: - dependencies: - micromark-util-types: 1.1.0 - micromark-extension-gfm-tagfilter@2.0.0: dependencies: micromark-util-types: 2.0.0 - micromark-extension-gfm-task-list-item@1.0.5: - dependencies: - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 - micromark-extension-gfm-task-list-item@2.0.1: dependencies: devlop: 1.1.0 @@ -27314,17 +29142,6 @@ snapshots: micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 - micromark-extension-gfm@2.0.3: - dependencies: - micromark-extension-gfm-autolink-literal: 1.0.5 - micromark-extension-gfm-footnote: 1.1.2 - micromark-extension-gfm-strikethrough: 1.0.7 - micromark-extension-gfm-table: 1.0.7 - micromark-extension-gfm-tagfilter: 1.0.2 - micromark-extension-gfm-task-list-item: 1.0.5 - micromark-util-combine-extensions: 1.1.0 - micromark-util-types: 1.1.0 - micromark-extension-gfm@3.0.0: dependencies: micromark-extension-gfm-autolink-literal: 2.0.0 @@ -27336,16 +29153,6 @@ snapshots: micromark-util-combine-extensions: 2.0.0 micromark-util-types: 2.0.0 - micromark-extension-math@2.1.2: - dependencies: - '@types/katex': 0.16.2 - katex: 0.16.10 - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 - micromark-extension-mdx-expression@1.0.8: dependencies: '@types/estree': 1.0.5 @@ -27357,6 +29164,17 @@ snapshots: micromark-util-types: 1.1.0 uvu: 0.5.6 + micromark-extension-mdx-expression@3.0.0: + dependencies: + '@types/estree': 1.0.5 + devlop: 1.1.0 + micromark-factory-mdx-expression: 2.0.2 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-events-to-acorn: 2.0.2 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + micromark-extension-mdx-jsx@1.0.5: dependencies: '@types/acorn': 4.0.6 @@ -27370,10 +29188,28 @@ snapshots: uvu: 0.5.6 vfile-message: 3.1.4 + micromark-extension-mdx-jsx@3.0.1: + dependencies: + '@types/acorn': 4.0.6 + '@types/estree': 1.0.5 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + micromark-factory-mdx-expression: 2.0.2 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-events-to-acorn: 2.0.2 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + vfile-message: 4.0.2 + micromark-extension-mdx-md@1.0.1: dependencies: micromark-util-types: 1.1.0 + micromark-extension-mdx-md@2.0.0: + dependencies: + micromark-util-types: 2.0.0 + micromark-extension-mdxjs-esm@1.0.5: dependencies: '@types/estree': 1.0.5 @@ -27386,10 +29222,22 @@ snapshots: uvu: 0.5.6 vfile-message: 3.1.4 + micromark-extension-mdxjs-esm@3.0.0: + dependencies: + '@types/estree': 1.0.5 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-events-to-acorn: 2.0.2 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + unist-util-position-from-estree: 2.0.0 + vfile-message: 4.0.2 + micromark-extension-mdxjs@1.0.1: dependencies: - acorn: 8.11.3 - acorn-jsx: 5.3.2(acorn@8.11.3) + acorn: 8.12.1 + acorn-jsx: 5.3.2(acorn@8.12.1) micromark-extension-mdx-expression: 1.0.8 micromark-extension-mdx-jsx: 1.0.5 micromark-extension-mdx-md: 1.0.1 @@ -27397,6 +29245,17 @@ snapshots: micromark-util-combine-extensions: 1.1.0 micromark-util-types: 1.1.0 + micromark-extension-mdxjs@3.0.0: + dependencies: + acorn: 8.12.1 + acorn-jsx: 5.3.2(acorn@8.12.1) + micromark-extension-mdx-expression: 3.0.0 + micromark-extension-mdx-jsx: 3.0.1 + 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 + micromark-factory-destination@1.1.0: dependencies: micromark-util-character: 1.2.0 @@ -27434,6 +29293,18 @@ snapshots: uvu: 0.5.6 vfile-message: 3.1.4 + micromark-factory-mdx-expression@2.0.2: + dependencies: + '@types/estree': 1.0.5 + devlop: 1.1.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-events-to-acorn: 2.0.2 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + unist-util-position-from-estree: 2.0.0 + vfile-message: 4.0.2 + micromark-factory-space@1.1.0: dependencies: micromark-util-character: 1.2.0 @@ -27549,6 +29420,17 @@ snapshots: uvu: 0.5.6 vfile-message: 3.1.4 + micromark-util-events-to-acorn@2.0.2: + dependencies: + '@types/acorn': 4.0.6 + '@types/estree': 1.0.5 + '@types/unist': 3.0.2 + devlop: 1.1.0 + estree-util-visit: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + vfile-message: 4.0.2 + micromark-util-html-tag-name@1.2.0: {} micromark-util-html-tag-name@2.0.0: {} @@ -27606,7 +29488,7 @@ snapshots: micromark@3.2.0: dependencies: '@types/debug': 4.1.8 - debug: 4.3.5 + debug: 4.3.6 decode-named-character-reference: 1.0.2 micromark-core-commonmark: 1.1.0 micromark-factory-space: 1.1.0 @@ -27628,7 +29510,7 @@ snapshots: micromark@4.0.0: dependencies: '@types/debug': 4.1.8 - debug: 4.3.5 + debug: 4.3.6 decode-named-character-reference: 1.0.2 devlop: 1.1.0 micromark-core-commonmark: 2.0.0 @@ -27681,7 +29563,7 @@ snapshots: miniflare@3.20240620.0: dependencies: '@cspotcode/source-map-support': 0.8.1 - acorn: 8.11.3 + acorn: 8.12.1 acorn-walk: 8.3.2 capnp-ts: 0.7.0 exit-hook: 2.2.1 @@ -27709,6 +29591,10 @@ snapshots: dependencies: brace-expansion: 2.0.1 + minimatch@9.0.3: + dependencies: + brace-expansion: 2.0.1 + minimatch@9.0.4: dependencies: brace-expansion: 2.0.1 @@ -27721,13 +29607,17 @@ snapshots: minimist@1.2.8: {} + minipass-collect@1.0.2: + dependencies: + minipass: 3.3.6 + minipass-collect@2.0.1: dependencies: - minipass: 7.0.4 + minipass: 7.1.2 minipass-fetch@3.0.4: dependencies: - minipass: 7.0.4 + minipass: 7.1.2 minipass-sized: 1.0.3 minizlib: 2.1.2 optionalDependencies: @@ -27753,6 +29643,8 @@ snapshots: minipass@7.0.4: {} + minipass@7.1.2: {} + minizlib@2.1.2: dependencies: minipass: 3.3.6 @@ -27762,8 +29654,7 @@ snapshots: mixme@0.5.9: {} - mkdirp-classic@0.5.3: - optional: true + mkdirp-classic@0.5.3: {} mkdirp@0.5.6: dependencies: @@ -27791,7 +29682,7 @@ snapshots: mlly@1.7.1: dependencies: - acorn: 8.11.3 + acorn: 8.12.1 pathe: 1.1.2 pkg-types: 1.1.1 ufo: 1.5.3 @@ -27800,6 +29691,18 @@ snapshots: dependencies: obliterator: 2.0.4 + modern-ahocorasick@1.0.1: {} + + morgan@1.10.0: + dependencies: + basic-auth: 2.0.1 + debug: 2.6.9 + depd: 2.0.0 + on-finished: 2.3.0 + on-headers: 1.0.2 + transitivePeerDependencies: + - supports-color + mri@1.2.0: {} mrmime@1.0.1: {} @@ -27834,9 +29737,31 @@ snapshots: optionalDependencies: typescript: 5.5.2 + msw@2.4.2(graphql@16.8.1)(typescript@5.5.2): + dependencies: + '@bundled-es-modules/cookie': 2.0.0 + '@bundled-es-modules/statuses': 1.0.1 + '@bundled-es-modules/tough-cookie': 0.1.6 + '@inquirer/confirm': 3.1.5 + '@mswjs/interceptors': 0.29.1 + '@open-draft/until': 2.1.0 + '@types/cookie': 0.6.0 + '@types/statuses': 2.0.5 + chalk: 4.1.2 + headers-polyfill: 4.0.3 + is-node-process: 1.2.0 + outvariant: 1.4.2 + path-to-regexp: 6.2.1 + strict-event-emitter: 0.5.1 + type-fest: 4.16.0 + yargs: 17.7.2 + optionalDependencies: + graphql: 16.8.1 + typescript: 5.5.2 + muggle-string@0.4.1: {} - multipasta@0.2.2: {} + multipasta@0.2.5: {} mustache@4.2.0: {} @@ -27886,53 +29811,36 @@ snapshots: nested-error-stacks@2.0.1: {} - next-auth@5.0.0-beta.19(next@14.2.3(@playwright/test@1.45.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1): + next-auth@5.0.0-beta.19(next@14.2.11(@playwright/test@1.45.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1): dependencies: '@auth/core': 0.32.0 - next: 14.2.3(@babel/core@7.24.4)(@playwright/test@1.45.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - - next-mdx-remote@4.4.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@mdx-js/mdx': 2.3.0 - '@mdx-js/react': 2.3.0(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - vfile: 5.3.7 - vfile-matter: 3.0.1 - transitivePeerDependencies: - - supports-color - - next-seo@6.1.0(next@14.2.3(@babel/core@7.24.4)(@playwright/test@1.45.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - next: 14.2.3(@babel/core@7.24.4)(@playwright/test@1.45.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 14.2.11(@babel/core@7.24.4)(@playwright/test@1.45.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - next-sitemap@4.2.3(next@14.2.3(@babel/core@7.24.4)(@playwright/test@1.45.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)): + next-sitemap@4.2.3(next@14.2.11(@babel/core@7.24.4)(@playwright/test@1.45.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)): dependencies: '@corex/deepmerge': 4.0.43 '@next/env': 13.5.6 fast-glob: 3.3.2 minimist: 1.2.8 - next: 14.2.3(@babel/core@7.24.4)(@playwright/test@1.45.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 14.2.11(@babel/core@7.24.4)(@playwright/test@1.45.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - next-themes@0.2.1(next@14.2.3(@babel/core@7.24.4)(@playwright/test@1.45.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + next-themes@0.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - next: 14.2.3(@babel/core@7.24.4)(@playwright/test@1.45.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - next-themes@0.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + next-tick@1.1.0: {} + + next-view-transitions@0.3.0(next@14.2.11(@babel/core@7.24.4)(@playwright/test@1.45.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: + next: 14.2.11(@babel/core@7.24.4)(@playwright/test@1.45.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - next-tick@1.1.0: {} - - next@14.2.3(@babel/core@7.24.4)(@playwright/test@1.45.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + next@14.2.11(@babel/core@7.24.4)(@playwright/test@1.45.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@next/env': 14.2.3 + '@next/env': 14.2.11 '@swc/helpers': 0.5.5 busboy: 1.6.0 caniuse-lite: 1.0.30001612 @@ -27942,77 +29850,113 @@ snapshots: react-dom: 18.3.1(react@18.3.1) styled-jsx: 5.1.1(@babel/core@7.24.4)(react@18.3.1) optionalDependencies: - '@next/swc-darwin-arm64': 14.2.3 - '@next/swc-darwin-x64': 14.2.3 - '@next/swc-linux-arm64-gnu': 14.2.3 - '@next/swc-linux-arm64-musl': 14.2.3 - '@next/swc-linux-x64-gnu': 14.2.3 - '@next/swc-linux-x64-musl': 14.2.3 - '@next/swc-win32-arm64-msvc': 14.2.3 - '@next/swc-win32-ia32-msvc': 14.2.3 - '@next/swc-win32-x64-msvc': 14.2.3 + '@next/swc-darwin-arm64': 14.2.11 + '@next/swc-darwin-x64': 14.2.11 + '@next/swc-linux-arm64-gnu': 14.2.11 + '@next/swc-linux-arm64-musl': 14.2.11 + '@next/swc-linux-x64-gnu': 14.2.11 + '@next/swc-linux-x64-musl': 14.2.11 + '@next/swc-win32-arm64-msvc': 14.2.11 + '@next/swc-win32-ia32-msvc': 14.2.11 + '@next/swc-win32-x64-msvc': 14.2.11 '@playwright/test': 1.45.0 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros - nextra-theme-docs@2.13.4(next@14.2.3(@babel/core@7.24.4)(@playwright/test@1.45.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(nextra@2.13.4(next@14.2.3(@babel/core@7.24.4)(@playwright/test@1.45.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@headlessui/react': 1.7.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@popperjs/core': 2.11.8 - clsx: 2.1.0 - escape-string-regexp: 5.0.0 - flexsearch: 0.7.31 - focus-visible: 5.2.0 - git-url-parse: 13.1.0 - intersection-observer: 0.12.2 - match-sorter: 6.3.1 - next: 14.2.3(@babel/core@7.24.4)(@playwright/test@1.45.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - next-seo: 6.1.0(next@14.2.3(@babel/core@7.24.4)(@playwright/test@1.45.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - next-themes: 0.2.1(next@14.2.3(@babel/core@7.24.4)(@playwright/test@1.45.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - nextra: 2.13.4(next@14.2.3(@babel/core@7.24.4)(@playwright/test@1.45.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - scroll-into-view-if-needed: 3.1.0 - zod: 3.23.8 + nice-try@1.0.5: {} - nextra@2.13.4(next@14.2.3(@babel/core@7.24.4)(@playwright/test@1.45.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + nitropack@2.9.6(encoding@0.1.13)(magicast@0.3.4): dependencies: - '@headlessui/react': 1.7.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@mdx-js/mdx': 2.3.0 - '@mdx-js/react': 2.3.0(react@18.3.1) - '@napi-rs/simple-git': 0.1.16 - '@theguild/remark-mermaid': 0.0.5(react@18.3.1) - '@theguild/remark-npm2yarn': 0.2.1 - clsx: 2.1.0 - github-slugger: 2.0.0 - graceful-fs: 4.2.11 - gray-matter: 4.0.3 - katex: 0.16.10 - lodash.get: 4.4.2 - next: 14.2.3(@babel/core@7.24.4)(@playwright/test@1.45.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - next-mdx-remote: 4.4.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - p-limit: 3.1.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - rehype-katex: 7.0.0 - rehype-pretty-code: 0.9.11(shiki@0.14.3) - rehype-raw: 7.0.0 - remark-gfm: 3.0.1 - remark-math: 5.1.1 - remark-reading-time: 2.0.1 - shiki: 0.14.3 - slash: 3.0.0 - title: 3.5.3 - unist-util-remove: 4.0.0 - unist-util-visit: 5.0.0 - zod: 3.23.8 + '@cloudflare/kv-asset-handler': 0.3.1 + '@netlify/functions': 2.6.0 + '@rollup/plugin-alias': 5.1.0(rollup@4.18.0) + '@rollup/plugin-commonjs': 25.0.7(rollup@4.18.0) + '@rollup/plugin-inject': 5.0.5(rollup@4.18.0) + '@rollup/plugin-json': 6.1.0(rollup@4.18.0) + '@rollup/plugin-node-resolve': 15.2.3(rollup@4.18.0) + '@rollup/plugin-replace': 5.0.5(rollup@4.18.0) + '@rollup/plugin-terser': 0.4.4(rollup@4.18.0) + '@rollup/pluginutils': 5.1.0(rollup@4.18.0) + '@types/http-proxy': 1.17.14 + '@vercel/nft': 0.26.4(encoding@0.1.13) + archiver: 7.0.1 + c12: 1.11.1(magicast@0.3.4) + chalk: 5.3.0 + chokidar: 3.6.0 + citty: 0.1.6 + consola: 3.2.3 + cookie-es: 1.1.0 + croner: 8.0.2 + crossws: 0.2.4 + db0: 0.1.4 + defu: 6.1.4 + destr: 2.0.3 + dot-prop: 8.0.2 + esbuild: 0.20.2 + escape-string-regexp: 5.0.0 + etag: 1.8.1 + fs-extra: 11.2.0 + globby: 14.0.1 + gzip-size: 7.0.0 + h3: 1.11.1 + hookable: 5.5.3 + httpxy: 0.1.5 + ioredis: 5.3.2 + is-primitive: 3.0.1 + jiti: 1.21.6 + klona: 2.0.6 + knitwork: 1.1.0 + listhen: 1.7.2 + magic-string: 0.30.10 + mime: 4.0.1 + mlly: 1.7.1 + mri: 1.2.0 + node-fetch-native: 1.6.4 + ofetch: 1.3.4 + ohash: 1.1.3 + openapi-typescript: 6.7.5 + pathe: 1.1.2 + perfect-debounce: 1.0.0 + pkg-types: 1.1.1 + pretty-bytes: 6.1.1 + radix3: 1.1.2 + rollup: 4.18.0 + rollup-plugin-visualizer: 5.12.0(rollup@4.18.0) + scule: 1.3.0 + semver: 7.6.3 + serve-placeholder: 2.0.1 + serve-static: 1.15.0 + std-env: 3.7.0 + ufo: 1.5.3 + uncrypto: 0.1.3 + unctx: 2.3.1 + unenv: 1.9.0 + unimport: 3.7.2(rollup@4.18.0) + unstorage: 1.10.2(ioredis@5.3.2) + unwasm: 0.3.9 transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@libsql/client' + - '@netlify/blobs' + - '@planetscale/database' + - '@upstash/redis' + - '@vercel/kv' + - better-sqlite3 + - drizzle-orm + - encoding + - idb-keyval + - magicast - supports-color + - uWebSockets.js - nice-try@1.0.5: {} - - nitropack@2.9.6(encoding@0.1.13)(magicast@0.3.4): + nitropack@2.9.6(encoding@0.1.13)(magicast@0.3.5): dependencies: '@cloudflare/kv-asset-handler': 0.3.1 '@netlify/functions': 2.6.0 @@ -28027,7 +29971,7 @@ snapshots: '@types/http-proxy': 1.17.14 '@vercel/nft': 0.26.4(encoding@0.1.13) archiver: 7.0.1 - c12: 1.11.1(magicast@0.3.4) + c12: 1.11.1(magicast@0.3.5) chalk: 5.3.0 chokidar: 3.6.0 citty: 0.1.6 @@ -28070,7 +30014,7 @@ snapshots: rollup: 4.18.0 rollup-plugin-visualizer: 5.12.0(rollup@4.18.0) scule: 1.3.0 - semver: 7.6.2 + semver: 7.6.3 serve-placeholder: 2.0.1 serve-static: 1.15.0 std-env: 3.7.0 @@ -28115,7 +30059,7 @@ snapshots: node-abi@3.60.0: dependencies: - semver: 7.6.2 + semver: 7.6.3 optional: true node-abort-controller@3.1.1: {} @@ -28157,8 +30101,6 @@ snapshots: node-stream-zip@1.15.0: {} - non-layered-tidy-tree-layout@2.0.2: {} - nopt@5.0.0: dependencies: abbrev: 1.1.1 @@ -28170,6 +30112,13 @@ snapshots: semver: 5.7.2 validate-npm-package-license: 3.0.4 + normalize-package-data@5.0.0: + dependencies: + hosted-git-info: 6.1.1 + is-core-module: 2.13.1 + semver: 7.6.3 + validate-npm-package-license: 3.0.4 + normalize-path@3.0.0: {} normalize-range@0.1.2: {} @@ -28217,13 +30166,26 @@ snapshots: dependencies: npm-normalize-package-bin: 2.0.0 + npm-install-checks@6.3.0: + dependencies: + semver: 7.6.3 + npm-normalize-package-bin@2.0.0: {} + npm-normalize-package-bin@3.0.1: {} + + npm-package-arg@10.1.0: + dependencies: + hosted-git-info: 6.1.1 + proc-log: 3.0.0 + semver: 7.6.3 + validate-npm-package-name: 5.0.0 + npm-package-arg@11.0.2: dependencies: hosted-git-info: 7.0.1 proc-log: 4.2.0 - semver: 7.6.2 + semver: 7.6.3 validate-npm-package-name: 5.0.0 npm-package-arg@7.0.0: @@ -28240,6 +30202,13 @@ snapshots: npm-bundled: 2.0.1 npm-normalize-package-bin: 2.0.0 + npm-pick-manifest@8.0.2: + dependencies: + npm-install-checks: 6.3.0 + npm-normalize-package-bin: 3.0.1 + npm-package-arg: 10.1.0 + semver: 7.6.3 + npm-registry-fetch@17.1.0: dependencies: '@npmcli/redact': 2.0.0 @@ -28265,7 +30234,7 @@ snapshots: dependencies: path-key: 4.0.0 - npm-to-yarn@2.2.1: {} + npm-to-yarn@3.0.0: {} npmlog@5.0.1: dependencies: @@ -28284,15 +30253,15 @@ snapshots: optionalDependencies: fsevents: 2.3.3 - nuxt@3.11.2(@parcel/watcher@2.4.1)(@types/node@20.14.0)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.3.2)(lightningcss@1.24.1)(magicast@0.3.4)(optionator@0.9.3)(rollup@3.29.4)(terser@5.19.2)(typescript@5.5.2)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2))(vue-tsc@2.0.14(typescript@5.5.2)): + nuxt@3.11.2(@parcel/watcher@2.4.1)(@types/node@20.14.0)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.3.2)(lightningcss@1.24.1)(magicast@0.3.4)(optionator@0.9.3)(rollup@4.18.0)(terser@5.32.0)(typescript@5.5.2)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0))(vue-tsc@2.0.14(typescript@5.5.2)): dependencies: '@nuxt/devalue': 2.0.2 - '@nuxt/devtools': 1.3.7(rollup@3.29.4)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2)) - '@nuxt/kit': 3.11.2(magicast@0.3.4)(rollup@3.29.4) - '@nuxt/schema': 3.11.2(rollup@3.29.4) - '@nuxt/telemetry': 2.5.4(magicast@0.3.4)(rollup@3.29.4) + '@nuxt/devtools': 1.3.7(rollup@4.18.0)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0)) + '@nuxt/kit': 3.11.2(magicast@0.3.4)(rollup@4.18.0) + '@nuxt/schema': 3.11.2(rollup@4.18.0) + '@nuxt/telemetry': 2.5.4(magicast@0.3.4)(rollup@4.18.0) '@nuxt/ui-templates': 1.3.3 - '@nuxt/vite-builder': 3.11.2(@types/node@20.14.0)(eslint@8.57.0)(lightningcss@1.24.1)(magicast@0.3.4)(optionator@0.9.3)(rollup@3.29.4)(terser@5.19.2)(typescript@5.5.2)(vue-tsc@2.0.14(typescript@5.5.2))(vue@3.4.25(typescript@5.5.2)) + '@nuxt/vite-builder': 3.11.2(@types/node@20.14.0)(eslint@8.57.0)(lightningcss@1.24.1)(magicast@0.3.4)(optionator@0.9.3)(rollup@4.18.0)(terser@5.32.0)(typescript@5.5.2)(vue-tsc@2.0.14(typescript@5.5.2))(vue@3.4.25(typescript@5.5.2)) '@unhead/dom': 1.9.7 '@unhead/ssr': 1.9.7 '@unhead/vue': 1.9.7(vue@3.4.25(typescript@5.5.2)) @@ -28333,6 +30302,108 @@ snapshots: uncrypto: 0.1.3 unctx: 2.3.1 unenv: 1.9.0 + unimport: 3.7.2(rollup@4.18.0) + unplugin: 1.10.1 + unplugin-vue-router: 0.7.0(rollup@4.18.0)(vue-router@4.3.2(vue@3.4.25(typescript@5.5.2)))(vue@3.4.25(typescript@5.5.2)) + unstorage: 1.10.2(ioredis@5.3.2) + untyped: 1.4.2 + vue: 3.4.25(typescript@5.5.2) + vue-bundle-renderer: 2.0.0 + vue-devtools-stub: 0.1.0 + vue-router: 4.3.2(vue@3.4.25(typescript@5.5.2)) + optionalDependencies: + '@parcel/watcher': 2.4.1 + '@types/node': 20.14.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@libsql/client' + - '@netlify/blobs' + - '@planetscale/database' + - '@upstash/redis' + - '@vercel/kv' + - better-sqlite3 + - bufferutil + - drizzle-orm + - encoding + - eslint + - idb-keyval + - ioredis + - less + - lightningcss + - magicast + - meow + - optionator + - rollup + - sass + - stylelint + - stylus + - sugarss + - supports-color + - terser + - typescript + - uWebSockets.js + - utf-8-validate + - vite + - vls + - vti + - vue-tsc + - xml2js + + nuxt@3.11.2(@parcel/watcher@2.4.1)(@types/node@20.14.0)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.3.2)(lightningcss@1.24.1)(magicast@0.3.5)(optionator@0.9.3)(rollup@3.29.4)(terser@5.32.0)(typescript@5.5.2)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0))(vue-tsc@2.0.14(typescript@5.5.2)): + dependencies: + '@nuxt/devalue': 2.0.2 + '@nuxt/devtools': 1.3.7(rollup@3.29.4)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0)) + '@nuxt/kit': 3.11.2(magicast@0.3.5)(rollup@3.29.4) + '@nuxt/schema': 3.11.2(rollup@3.29.4) + '@nuxt/telemetry': 2.5.4(magicast@0.3.5)(rollup@3.29.4) + '@nuxt/ui-templates': 1.3.3 + '@nuxt/vite-builder': 3.11.2(@types/node@20.14.0)(eslint@8.57.0)(lightningcss@1.24.1)(magicast@0.3.5)(optionator@0.9.3)(rollup@3.29.4)(terser@5.32.0)(typescript@5.5.2)(vue-tsc@2.0.14(typescript@5.5.2))(vue@3.4.25(typescript@5.5.2)) + '@unhead/dom': 1.9.7 + '@unhead/ssr': 1.9.7 + '@unhead/vue': 1.9.7(vue@3.4.25(typescript@5.5.2)) + '@vue/shared': 3.4.25 + acorn: 8.11.3 + c12: 1.11.1(magicast@0.3.5) + chokidar: 3.6.0 + cookie-es: 1.1.0 + defu: 6.1.4 + destr: 2.0.3 + devalue: 4.3.2 + esbuild: 0.20.2 + escape-string-regexp: 5.0.0 + estree-walker: 3.0.3 + fs-extra: 11.2.0 + globby: 14.0.1 + h3: 1.11.1 + hookable: 5.5.3 + jiti: 1.21.6 + klona: 2.0.6 + knitwork: 1.1.0 + magic-string: 0.30.10 + mlly: 1.7.1 + nitropack: 2.9.6(encoding@0.1.13)(magicast@0.3.5) + nuxi: 3.11.1 + nypm: 0.3.8 + ofetch: 1.3.4 + ohash: 1.1.3 + pathe: 1.1.2 + perfect-debounce: 1.0.0 + pkg-types: 1.1.1 + radix3: 1.1.2 + scule: 1.3.0 + std-env: 3.7.0 + strip-literal: 2.1.0 + ufo: 1.5.3 + ultrahtml: 1.5.3 + uncrypto: 0.1.3 + unctx: 2.3.1 + unenv: 1.9.0 unimport: 3.7.2(rollup@3.29.4) unplugin: 1.10.1 unplugin-vue-router: 0.7.0(rollup@3.29.4)(vue-router@4.3.2(vue@3.4.25(typescript@5.5.2)))(vue@3.4.25(typescript@5.5.2)) @@ -28386,21 +30457,21 @@ snapshots: - vue-tsc - xml2js - nuxt@3.11.2(@parcel/watcher@2.4.1)(@types/node@20.14.0)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.3.2)(lightningcss@1.24.1)(magicast@0.3.4)(optionator@0.9.3)(rollup@4.18.0)(terser@5.19.2)(typescript@5.5.2)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2))(vue-tsc@2.0.14(typescript@5.5.2)): + nuxt@3.11.2(@parcel/watcher@2.4.1)(@types/node@20.14.0)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.3.2)(lightningcss@1.24.1)(magicast@0.3.5)(optionator@0.9.3)(rollup@4.18.0)(terser@5.32.0)(typescript@5.5.2)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0))(vue-tsc@2.0.14(typescript@5.5.2)): dependencies: '@nuxt/devalue': 2.0.2 - '@nuxt/devtools': 1.3.7(rollup@4.18.0)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2)) - '@nuxt/kit': 3.11.2(magicast@0.3.4)(rollup@4.18.0) + '@nuxt/devtools': 1.3.7(rollup@4.18.0)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0)) + '@nuxt/kit': 3.11.2(magicast@0.3.5)(rollup@4.18.0) '@nuxt/schema': 3.11.2(rollup@4.18.0) - '@nuxt/telemetry': 2.5.4(magicast@0.3.4)(rollup@4.18.0) + '@nuxt/telemetry': 2.5.4(magicast@0.3.5)(rollup@4.18.0) '@nuxt/ui-templates': 1.3.3 - '@nuxt/vite-builder': 3.11.2(@types/node@20.14.0)(eslint@8.57.0)(lightningcss@1.24.1)(magicast@0.3.4)(optionator@0.9.3)(rollup@4.18.0)(terser@5.19.2)(typescript@5.5.2)(vue-tsc@2.0.14(typescript@5.5.2))(vue@3.4.25(typescript@5.5.2)) + '@nuxt/vite-builder': 3.11.2(@types/node@20.14.0)(eslint@8.57.0)(lightningcss@1.24.1)(magicast@0.3.5)(optionator@0.9.3)(rollup@4.18.0)(terser@5.32.0)(typescript@5.5.2)(vue-tsc@2.0.14(typescript@5.5.2))(vue@3.4.25(typescript@5.5.2)) '@unhead/dom': 1.9.7 '@unhead/ssr': 1.9.7 '@unhead/vue': 1.9.7(vue@3.4.25(typescript@5.5.2)) '@vue/shared': 3.4.25 acorn: 8.11.3 - c12: 1.11.1(magicast@0.3.4) + c12: 1.11.1(magicast@0.3.5) chokidar: 3.6.0 cookie-es: 1.1.0 defu: 6.1.4 @@ -28418,7 +30489,7 @@ snapshots: knitwork: 1.1.0 magic-string: 0.30.10 mlly: 1.7.1 - nitropack: 2.9.6(encoding@0.1.13)(magicast@0.3.4) + nitropack: 2.9.6(encoding@0.1.13)(magicast@0.3.5) nuxi: 3.11.1 nypm: 0.3.8 ofetch: 1.3.4 @@ -28511,7 +30582,7 @@ snapshots: consola: 3.2.3 execa: 8.0.1 pathe: 1.1.2 - pkg-types: 1.1.3 + pkg-types: 1.2.0 ufo: 1.5.4 oauth4webapi@2.10.4: {} @@ -28607,6 +30678,10 @@ snapshots: dependencies: mimic-fn: 4.0.0 + oniguruma-to-js@0.4.0: + dependencies: + regex: 4.3.2 + open@10.1.0: dependencies: default-browser: 5.2.1 @@ -28717,6 +30792,8 @@ snapshots: outdent@0.5.0: {} + outdent@0.8.0: {} + outvariant@1.4.2: {} overlap-area@1.1.0: @@ -28770,12 +30847,16 @@ snapshots: p-try@2.2.0: {} + package-json-from-dist@1.0.0: {} + package-json@8.1.1: dependencies: got: 12.6.1 registry-auth-token: 5.0.2 registry-url: 6.0.1 - semver: 7.6.2 + semver: 7.6.3 + + pako@0.2.9: {} parent-module@1.0.1: dependencies: @@ -28817,9 +30898,9 @@ snapshots: unist-util-modify-children: 3.1.1 unist-util-visit-children: 2.0.2 - parse-ms@3.0.0: {} + parse-ms@2.1.0: {} - parse-numeric-range@1.3.0: {} + parse-ms@3.0.0: {} parse-path@7.0.0: dependencies: @@ -28868,7 +30949,12 @@ snapshots: path-scurry@1.10.2: dependencies: lru-cache: 10.2.0 - minipass: 7.0.4 + minipass: 7.1.2 + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 path-to-regexp@0.1.7: {} @@ -28882,6 +30968,14 @@ snapshots: pathval@1.1.1: {} + pathval@2.0.0: {} + + peek-stream@1.1.3: + dependencies: + buffer-from: 1.1.2 + duplexify: 3.7.1 + through2: 2.0.5 + perfect-debounce@1.0.0: {} periscopic@3.1.0: @@ -28900,6 +30994,8 @@ snapshots: picomatch@4.0.2: {} + pidtree@0.6.0: {} + pify@2.3.0: {} pify@4.0.1: {} @@ -28995,6 +31091,10 @@ snapshots: dependencies: postcss: 8.4.38 + postcss-discard-duplicates@5.1.0(postcss@8.4.38): + dependencies: + postcss: 8.4.38 + postcss-discard-duplicates@6.0.3(postcss@8.4.38): dependencies: postcss: 8.4.38 @@ -29086,6 +31186,39 @@ snapshots: postcss: 8.4.38 postcss-selector-parser: 6.0.16 + postcss-modules-extract-imports@3.1.0(postcss@8.4.38): + dependencies: + postcss: 8.4.38 + + postcss-modules-local-by-default@4.0.5(postcss@8.4.38): + dependencies: + icss-utils: 5.1.0(postcss@8.4.38) + postcss: 8.4.38 + postcss-selector-parser: 6.0.16 + postcss-value-parser: 4.2.0 + + postcss-modules-scope@3.2.0(postcss@8.4.38): + dependencies: + postcss: 8.4.38 + postcss-selector-parser: 6.0.16 + + postcss-modules-values@4.0.0(postcss@8.4.38): + dependencies: + icss-utils: 5.1.0(postcss@8.4.38) + postcss: 8.4.38 + + postcss-modules@6.0.0(postcss@8.4.38): + dependencies: + generic-names: 4.0.0 + icss-utils: 5.1.0(postcss@8.4.38) + lodash.camelcase: 4.3.0 + postcss: 8.4.38 + postcss-modules-extract-imports: 3.1.0(postcss@8.4.38) + postcss-modules-local-by-default: 4.0.5(postcss@8.4.38) + postcss-modules-scope: 3.2.0(postcss@8.4.38) + postcss-modules-values: 4.0.0(postcss@8.4.38) + string-hash: 1.1.3 + postcss-nested@6.0.1(postcss@8.4.38): dependencies: postcss: 8.4.38 @@ -29187,7 +31320,7 @@ snapshots: postcss@8.4.31: dependencies: nanoid: 3.3.7 - picocolors: 1.0.0 + picocolors: 1.0.1 source-map-js: 1.2.0 postcss@8.4.38: @@ -29263,6 +31396,10 @@ snapshots: pretty-format@3.8.0: {} + pretty-ms@7.0.1: + dependencies: + parse-ms: 2.1.0 + pretty-ms@8.0.0: dependencies: parse-ms: 3.0.0 @@ -29271,6 +31408,8 @@ snapshots: prismjs@1.29.0: {} + proc-log@3.0.0: {} + proc-log@4.2.0: {} process-nextick-args@2.0.1: {} @@ -29281,6 +31420,8 @@ snapshots: progress@2.0.3: {} + promise-inflight@1.0.1: {} + promise-retry@2.0.1: dependencies: err-code: 2.0.3 @@ -29422,17 +31563,30 @@ snapshots: pseudomap@1.0.2: {} + psl@1.9.0: {} + publint@0.2.7: dependencies: npm-packlist: 5.1.3 picocolors: 1.0.0 sade: 1.8.1 + pump@2.0.1: + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + pump@3.0.0: dependencies: end-of-stream: 1.4.4 once: 1.4.0 + pumpify@1.5.1: + dependencies: + duplexify: 3.7.1 + inherits: 2.0.4 + pump: 2.0.1 + punycode.js@2.3.1: {} punycode@2.3.0: {} @@ -29460,6 +31614,8 @@ snapshots: querystring@0.2.1: {} + querystringify@2.2.0: {} + queue-microtask@1.2.3: {} queue-tick@1.0.1: {} @@ -29550,6 +31706,13 @@ snapshots: dependencies: react: 18.3.1 + react-highlight-words@0.20.0(react@18.3.1): + dependencies: + highlight-words-core: 1.2.2 + memoize-one: 4.0.3 + prop-types: 15.8.1 + react: 18.3.1 + react-image-crop@11.0.5(react@18.3.1): dependencies: react: 18.3.1 @@ -29755,6 +31918,18 @@ snapshots: optionalDependencies: '@types/react': 18.3.3 + react-router-dom@6.26.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@remix-run/router': 1.19.2 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-router: 6.26.2(react@18.3.1) + + react-router@6.26.2(react@18.3.1): + dependencies: + '@remix-run/router': 1.19.2 + react: 18.3.1 + react-selecto@1.26.3: dependencies: selecto: 1.26.3 @@ -29834,8 +32009,6 @@ snapshots: dependencies: picomatch: 2.3.1 - reading-time@1.5.0: {} - readline@1.3.0: {} real-require@0.2.0: {} @@ -29863,6 +32036,11 @@ snapshots: tiny-invariant: 1.3.3 tslib: 2.6.2 + recma-import-images@0.0.3: + dependencies: + '@sindresorhus/slugify': 2.2.1 + estree-util-visit: 1.2.1 + recyclerlistview@4.2.0(react-native@0.74.1(@babel/core@7.24.4)(@babel/preset-env@7.24.6(@babel/core@7.24.4))(@types/react@18.3.3)(encoding@0.1.13)(react@18.3.1))(react@18.3.1): dependencies: lodash.debounce: 4.0.8 @@ -29906,6 +32084,8 @@ snapshots: dependencies: '@babel/runtime': 7.24.4 + regex@4.3.2: {} + regexp.prototype.flags@1.5.2: dependencies: call-bind: 1.0.7 @@ -29954,16 +32134,6 @@ snapshots: rehype-minify-whitespace: 6.0.0 unist-util-visit-parents: 6.0.1 - rehype-katex@7.0.0: - dependencies: - '@types/hast': 3.0.4 - '@types/katex': 0.16.2 - hast-util-from-html-isomorphic: 2.0.0 - hast-util-to-text: 4.0.2 - katex: 0.16.10 - unist-util-visit-parents: 6.0.1 - vfile: 6.0.1 - rehype-minify-whitespace@6.0.0: dependencies: '@types/hast': 3.0.4 @@ -29976,14 +32146,7 @@ snapshots: dependencies: '@types/hast': 3.0.4 hast-util-from-html: 2.0.1 - unified: 11.0.4 - - rehype-pretty-code@0.9.11(shiki@0.14.3): - dependencies: - '@types/hast': 2.3.5 - hash-obj: 4.0.0 - parse-numeric-range: 1.3.0 - shiki: 0.14.3 + unified: 11.0.5 rehype-raw@7.0.0: dependencies: @@ -30000,41 +32163,39 @@ snapshots: dependencies: '@types/hast': 3.0.4 hast-util-to-html: 9.0.1 - unified: 11.0.4 + unified: 11.0.5 rehype@13.0.1: dependencies: '@types/hast': 3.0.4 rehype-parse: 9.0.0 rehype-stringify: 10.0.0 - unified: 11.0.4 + unified: 11.0.5 - remark-gfm@3.0.1: + remark-frontmatter@4.0.1: dependencies: '@types/mdast': 3.0.12 - mdast-util-gfm: 2.0.2 - micromark-extension-gfm: 2.0.3 + mdast-util-frontmatter: 1.0.1 + micromark-extension-frontmatter: 1.1.1 unified: 10.1.2 - transitivePeerDependencies: - - supports-color remark-gfm@4.0.0: dependencies: - '@types/mdast': 4.0.3 + '@types/mdast': 4.0.4 mdast-util-gfm: 3.0.0 micromark-extension-gfm: 3.0.0 remark-parse: 11.0.0 remark-stringify: 11.0.0 - unified: 11.0.4 + unified: 11.0.5 transitivePeerDependencies: - supports-color - remark-math@5.1.1: + remark-mdx-frontmatter@1.1.1: dependencies: - '@types/mdast': 3.0.12 - mdast-util-math: 2.0.2 - micromark-extension-math: 2.1.2 - unified: 10.1.2 + estree-util-is-identifier-name: 1.1.0 + estree-util-value-to-estree: 1.3.0 + js-yaml: 4.1.0 + toml: 3.0.0 remark-mdx@2.3.0: dependencies: @@ -30043,6 +32204,13 @@ snapshots: transitivePeerDependencies: - supports-color + remark-mdx@3.0.1: + dependencies: + mdast-util-mdx: 3.0.0 + micromark-extension-mdxjs: 3.0.0 + transitivePeerDependencies: + - supports-color + remark-parse@10.0.2: dependencies: '@types/mdast': 3.0.12 @@ -30053,19 +32221,12 @@ snapshots: remark-parse@11.0.0: dependencies: - '@types/mdast': 4.0.3 + '@types/mdast': 4.0.4 mdast-util-from-markdown: 2.0.0 micromark-util-types: 2.0.0 - unified: 11.0.4 - transitivePeerDependencies: - - supports-color - - remark-reading-time@2.0.1: - dependencies: - estree-util-is-identifier-name: 2.1.0 - estree-util-value-to-estree: 1.3.0 - reading-time: 1.5.0 - unist-util-visit: 3.1.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color remark-rehype@10.1.0: dependencies: @@ -30077,9 +32238,9 @@ snapshots: remark-rehype@11.1.0: dependencies: '@types/hast': 3.0.4 - '@types/mdast': 4.0.3 + '@types/mdast': 4.0.4 mdast-util-to-hast: 13.1.0 - unified: 11.0.4 + unified: 11.0.5 vfile: 6.0.1 remark-smartypants@2.1.0: @@ -30090,11 +32251,24 @@ snapshots: remark-stringify@11.0.0: dependencies: - '@types/mdast': 4.0.3 + '@types/mdast': 4.0.4 mdast-util-to-markdown: 2.1.0 - unified: 11.0.4 + unified: 11.0.5 + + remark-unwrap-images@4.0.0: + dependencies: + '@types/mdast': 4.0.4 + hast-util-whitespace: 3.0.0 + unist-util-visit: 5.0.0 - remove-accents@0.4.2: {} + remark@15.0.1: + dependencies: + '@types/mdast': 4.0.4 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color remove-trailing-slash@0.1.1: {} @@ -30102,6 +32276,8 @@ snapshots: require-from-string@2.0.2: {} + require-like@0.1.2: {} + require-main-filename@2.0.0: {} requireg@0.2.2: @@ -30211,8 +32387,6 @@ snapshots: dependencies: glob: 7.2.3 - robust-predicates@3.0.2: {} - rollup-plugin-dts@6.1.0(rollup@3.29.4)(typescript@5.5.2): dependencies: magic-string: 0.30.10 @@ -30313,8 +32487,6 @@ snapshots: dependencies: queue-microtask: 1.2.3 - rw@1.3.3: {} - rxjs@7.8.1: dependencies: tslib: 2.6.2 @@ -30368,19 +32540,23 @@ snapshots: dependencies: loose-envify: 1.4.0 - schema-utils@4.2.0: + schema-utils@3.3.0: dependencies: '@types/json-schema': 7.0.15 - ajv: 8.12.0 - ajv-formats: 2.1.1(ajv@8.12.0) - ajv-keywords: 5.1.0(ajv@8.12.0) + ajv: 6.12.6 + ajv-keywords: 3.5.2(ajv@6.12.6) - scroll-into-view-if-needed@3.1.0: + schema-utils@4.2.0: dependencies: - compute-scroll-into-view: 3.0.3 + '@types/json-schema': 7.0.15 + ajv: 8.16.0 + ajv-formats: 2.1.1(ajv@8.16.0) + ajv-keywords: 5.1.0(ajv@8.16.0) scule@1.3.0: {} + search-insights@2.17.2: {} + section-matter@1.0.0: dependencies: extend-shallow: 2.0.1 @@ -30506,12 +32682,38 @@ snapshots: detect-libc: 2.0.2 node-addon-api: 6.1.0 prebuild-install: 7.1.2 - semver: 7.6.2 + semver: 7.6.3 simple-get: 4.0.1 tar-fs: 3.0.5 tunnel-agent: 0.6.0 optional: true + sharp@0.33.1: + dependencies: + color: 4.2.3 + detect-libc: 2.0.2 + semver: 7.6.3 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.33.1 + '@img/sharp-darwin-x64': 0.33.1 + '@img/sharp-libvips-darwin-arm64': 1.0.0 + '@img/sharp-libvips-darwin-x64': 1.0.0 + '@img/sharp-libvips-linux-arm': 1.0.0 + '@img/sharp-libvips-linux-arm64': 1.0.0 + '@img/sharp-libvips-linux-s390x': 1.0.0 + '@img/sharp-libvips-linux-x64': 1.0.0 + '@img/sharp-libvips-linuxmusl-arm64': 1.0.0 + '@img/sharp-libvips-linuxmusl-x64': 1.0.0 + '@img/sharp-linux-arm': 0.33.1 + '@img/sharp-linux-arm64': 0.33.1 + '@img/sharp-linux-s390x': 0.33.1 + '@img/sharp-linux-x64': 0.33.1 + '@img/sharp-linuxmusl-arm64': 0.33.1 + '@img/sharp-linuxmusl-x64': 0.33.1 + '@img/sharp-wasm32': 0.33.1 + '@img/sharp-win32-ia32': 0.33.1 + '@img/sharp-win32-x64': 0.33.1 + shebang-command@1.2.0: dependencies: shebang-regex: 1.0.0 @@ -30526,16 +32728,14 @@ snapshots: shell-quote@1.8.1: {} - shiki@0.14.3: + shiki@1.17.5: dependencies: - ansi-sequence-parser: 1.1.1 - jsonc-parser: 3.2.0 - vscode-oniguruma: 1.7.0 - vscode-textmate: 8.0.0 - - shiki@1.5.2: - dependencies: - '@shikijs/core': 1.5.2 + '@shikijs/core': 1.17.5 + '@shikijs/engine-javascript': 1.17.5 + '@shikijs/engine-oniguruma': 1.17.5 + '@shikijs/types': 1.17.5 + '@shikijs/vscode-textmate': 9.2.2 + '@types/hast': 3.0.4 shikiji-core@0.9.19: {} @@ -30559,6 +32759,10 @@ snapshots: simple-concat@1.0.1: optional: true + simple-functional-loader@1.2.1: + dependencies: + loader-utils: 2.0.4 + simple-get@4.0.1: dependencies: decompress-response: 6.0.0 @@ -30570,7 +32774,15 @@ snapshots: dependencies: '@kwsites/file-exists': 1.1.1 '@kwsites/promise-deferred': 1.1.1 - debug: 4.3.5 + debug: 4.3.6 + transitivePeerDependencies: + - supports-color + + simple-git@3.26.0: + dependencies: + '@kwsites/file-exists': 1.1.1 + '@kwsites/promise-deferred': 1.1.1 + debug: 4.3.6 transitivePeerDependencies: - supports-color @@ -30638,7 +32850,7 @@ snapshots: socks-proxy-agent@8.0.3: dependencies: agent-base: 7.1.1 - debug: 4.3.5 + debug: 4.3.6 socks: 2.7.1 transitivePeerDependencies: - supports-color @@ -30658,7 +32870,7 @@ snapshots: dependencies: '@babel/generator': 7.24.4 '@babel/helper-module-imports': 7.24.6 - '@babel/types': 7.24.6 + '@babel/types': 7.25.6 solid-js: 1.8.16 solid-use@0.8.0(solid-js@1.8.16): @@ -30681,10 +32893,6 @@ snapshots: minimist: 1.2.8 sander: 0.5.1 - sort-keys@5.0.0: - dependencies: - is-plain-obj: 4.1.0 - source-map-js@1.2.0: {} source-map-support@0.5.21: @@ -30739,9 +32947,11 @@ snapshots: sprintf-js@1.0.3: {} + sqids@0.3.0: {} + ssri@10.0.5: dependencies: - minipass: 7.0.4 + minipass: 7.1.2 stack-utils@2.0.6: dependencies: @@ -30779,7 +32989,7 @@ snapshots: storybook@8.2.1(@babel/preset-env@7.24.6(@babel/core@7.24.4)): dependencies: '@babel/core': 7.24.4 - '@babel/types': 7.24.6 + '@babel/types': 7.25.6 '@storybook/codemod': 8.2.1 '@storybook/core': 8.2.1 '@types/semver': 7.5.8 @@ -30814,6 +33024,8 @@ snapshots: stream-buffers@2.2.0: {} + stream-shift@1.0.3: {} + stream-slice@0.1.2: {} stream-transform@2.1.3: @@ -30833,6 +33045,8 @@ snapshots: strict-uri-encode@2.0.0: {} + string-hash@1.1.3: {} + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -30954,6 +33168,10 @@ snapshots: dependencies: inline-style-parser: 0.1.1 + style-to-object@1.0.8: + dependencies: + inline-style-parser: 0.2.4 + styled-jsx@5.1.1(@babel/core@7.24.4)(react@18.3.1): dependencies: client-only: 0.0.1 @@ -30969,8 +33187,6 @@ snapshots: styleq@0.1.3: {} - stylis@4.3.0: {} - sucrase@3.34.0: dependencies: '@jridgewell/gen-mapping': 0.3.5 @@ -30991,10 +33207,6 @@ snapshots: dependencies: copy-anything: 3.0.5 - supports-color@4.5.0: - dependencies: - has-flag: 2.0.0 - supports-color@5.5.0: dependencies: has-flag: 3.0.0 @@ -31079,7 +33291,7 @@ snapshots: '@jridgewell/sourcemap-codec': 1.4.15 '@jridgewell/trace-mapping': 0.3.25 '@types/estree': 1.0.5 - acorn: 8.11.3 + acorn: 8.12.1 aria-query: 5.3.0 axobject-query: 4.0.0 code-red: 1.0.4 @@ -31100,7 +33312,7 @@ snapshots: css-tree: 2.3.1 css-what: 6.1.0 csso: 5.0.5 - picocolors: 1.0.0 + picocolors: 1.0.1 swr@2.2.0(react@18.3.1): dependencies: @@ -31115,6 +33327,8 @@ snapshots: system-architecture@0.1.0: {} + tabbable@6.2.0: {} + tailwind-merge@2.3.0: dependencies: '@babel/runtime': 7.24.4 @@ -31160,7 +33374,6 @@ snapshots: mkdirp-classic: 0.5.3 pump: 3.0.0 tar-stream: 2.2.0 - optional: true tar-fs@3.0.5: dependencies: @@ -31178,7 +33391,6 @@ snapshots: fs-constants: 1.0.0 inherits: 2.0.4 readable-stream: 3.6.2 - optional: true tar-stream@3.1.7: dependencies: @@ -31238,18 +33450,36 @@ snapshots: solid-js: 1.8.16 solid-use: 0.8.0(solid-js@1.8.16) + terser-webpack-plugin@5.3.10(esbuild@0.21.5)(webpack@5.94.0(esbuild@0.21.5)): + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + jest-worker: 27.5.1 + schema-utils: 3.3.0 + serialize-javascript: 6.0.1 + terser: 5.32.0 + webpack: 5.94.0(esbuild@0.21.5) + optionalDependencies: + esbuild: 0.21.5 + terser@5.19.2: dependencies: '@jridgewell/source-map': 0.3.5 - acorn: 8.11.3 + acorn: 8.12.1 + commander: 2.20.3 + source-map-support: 0.5.21 + + terser@5.32.0: + dependencies: + '@jridgewell/source-map': 0.3.5 + acorn: 8.12.1 commander: 2.20.3 source-map-support: 0.5.21 - test-exclude@6.0.0: + test-exclude@7.0.1: dependencies: '@istanbuljs/schema': 0.1.3 - glob: 7.2.3 - minimatch: 3.1.2 + glob: 10.4.5 + minimatch: 9.0.4 text-table@0.2.0: {} @@ -31290,15 +33520,22 @@ snapshots: tinybench@2.8.0: {} - tinyglobby@0.2.5: + tinyglobby@0.2.6: dependencies: fdir: 6.3.0(picomatch@4.0.2) picomatch: 4.0.2 - tinypool@0.8.4: {} + tinypool@0.8.4: + optional: true + + tinypool@1.0.1: {} + + tinyrainbow@1.2.0: {} tinyspy@2.2.1: {} + tinyspy@3.0.0: {} + tippy.js@6.3.7: dependencies: '@popperjs/core': 2.11.8 @@ -31315,15 +33552,6 @@ snapshots: markdown-it-task-lists: 2.1.1 prosemirror-markdown: 1.12.0 - title@3.5.3: - dependencies: - arg: 1.0.0 - chalk: 2.3.0 - clipboardy: 1.2.2 - titleize: 1.0.0 - - titleize@1.0.0: {} - titleize@3.0.0: {} tmp@0.0.33: @@ -31352,8 +33580,17 @@ snapshots: toidentifier@1.0.1: {} + toml@3.0.0: {} + totalist@3.0.1: {} + tough-cookie@4.1.4: + dependencies: + psl: 1.9.0 + punycode: 2.3.0 + universalify: 0.2.0 + url-parse: 1.5.10 + tr46@0.0.3: {} tr46@1.0.1: @@ -31395,6 +33632,12 @@ snapshots: minimist: 1.2.8 strip-bom: 3.0.0 + tsconfig-paths@4.2.0: + dependencies: + json5: 2.2.3 + minimist: 1.2.8 + strip-bom: 3.0.0 + tslib@1.14.1: {} tslib@2.4.0: {} @@ -31480,7 +33723,7 @@ snapshots: turbo-linux-arm64@2.1.0: optional: true - turbo-stream@2.1.0: {} + turbo-stream@2.4.0: {} turbo-windows-64@2.1.0: optional: true @@ -31641,7 +33884,7 @@ snapshots: unctx@2.3.1: dependencies: - acorn: 8.11.3 + acorn: 8.12.1 estree-walker: 3.0.3 magic-string: 0.30.10 unplugin: 1.10.1 @@ -31656,6 +33899,8 @@ snapshots: undici@6.19.2: {} + undici@6.19.8: {} + unenv-nightly@1.10.0-1717606461.a117952: dependencies: consola: 3.2.3 @@ -31712,7 +33957,7 @@ snapshots: trough: 2.1.0 vfile: 5.3.7 - unified@11.0.4: + unified@11.0.5: dependencies: '@types/unist': 3.0.2 bail: 2.0.2 @@ -31740,10 +33985,28 @@ snapshots: transitivePeerDependencies: - rollup + unimport@3.11.1(rollup@4.18.0): + dependencies: + '@rollup/pluginutils': 5.1.0(rollup@4.18.0) + acorn: 8.12.1 + escape-string-regexp: 5.0.0 + estree-walker: 3.0.3 + fast-glob: 3.3.2 + local-pkg: 0.5.0 + magic-string: 0.30.11 + mlly: 1.7.1 + pathe: 1.1.2 + pkg-types: 1.2.0 + scule: 1.3.0 + strip-literal: 2.1.0 + unplugin: 1.12.2 + transitivePeerDependencies: + - rollup + unimport@3.7.2(rollup@3.29.4): dependencies: '@rollup/pluginutils': 5.1.0(rollup@3.29.4) - acorn: 8.11.3 + acorn: 8.12.1 escape-string-regexp: 5.0.0 estree-walker: 3.0.3 fast-glob: 3.3.2 @@ -31761,7 +34024,7 @@ snapshots: unimport@3.7.2(rollup@4.18.0): dependencies: '@rollup/pluginutils': 5.1.0(rollup@4.18.0) - acorn: 8.11.3 + acorn: 8.12.1 escape-string-regexp: 5.0.0 estree-walker: 3.0.3 fast-glob: 3.3.2 @@ -31796,6 +34059,12 @@ snapshots: dependencies: crypto-random-string: 4.0.0 + unist-util-filter@5.0.1: + dependencies: + '@types/unist': 3.0.2 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + unist-util-find-after@5.0.0: dependencies: '@types/unist': 3.0.2 @@ -31820,6 +34089,10 @@ snapshots: dependencies: '@types/unist': 2.0.7 + unist-util-position-from-estree@2.0.0: + dependencies: + '@types/unist': 3.0.2 + unist-util-position@4.0.4: dependencies: '@types/unist': 2.0.7 @@ -31838,12 +34111,6 @@ snapshots: '@types/unist': 3.0.2 unist-util-visit: 5.0.0 - unist-util-remove@4.0.0: - dependencies: - '@types/unist': 3.0.2 - unist-util-is: 6.0.0 - unist-util-visit-parents: 6.0.1 - unist-util-stringify-position@3.0.3: dependencies: '@types/unist': 2.0.7 @@ -31856,11 +34123,6 @@ snapshots: dependencies: '@types/unist': 2.0.7 - unist-util-visit-parents@4.1.1: - dependencies: - '@types/unist': 2.0.7 - unist-util-is: 5.2.1 - unist-util-visit-parents@5.1.3: dependencies: '@types/unist': 2.0.7 @@ -31871,12 +34133,6 @@ snapshots: '@types/unist': 3.0.2 unist-util-is: 6.0.0 - unist-util-visit@3.1.0: - dependencies: - '@types/unist': 2.0.7 - unist-util-is: 5.2.1 - unist-util-visit-parents: 4.1.1 - unist-util-visit@4.1.2: dependencies: '@types/unist': 2.0.7 @@ -31893,6 +34149,8 @@ snapshots: universalify@0.1.2: {} + universalify@0.2.0: {} + universalify@1.0.0: {} universalify@2.0.0: {} @@ -31943,7 +34201,7 @@ snapshots: unplugin@1.10.1: dependencies: - acorn: 8.11.3 + acorn: 8.12.1 chokidar: 3.6.0 webpack-sources: 3.2.3 webpack-virtual-modules: 0.6.1 @@ -31995,7 +34253,7 @@ snapshots: unwasm@0.3.9: dependencies: knitwork: 1.1.0 - magic-string: 0.30.10 + magic-string: 0.30.11 mlly: 1.7.1 pathe: 1.1.2 pkg-types: 1.1.3 @@ -32005,7 +34263,7 @@ snapshots: dependencies: browserslist: 4.23.0 escalade: 3.1.1 - picocolors: 1.0.0 + picocolors: 1.0.1 uqr@0.1.2: {} @@ -32015,6 +34273,11 @@ snapshots: url-join@4.0.0: {} + url-parse@1.5.10: + dependencies: + querystringify: 2.2.0 + requires-port: 1.0.0 + urlpattern-polyfill@8.0.2: {} use-callback-ref@1.3.2(@types/react@18.3.3)(react@18.3.1): @@ -32060,8 +34323,6 @@ snapshots: uuid@8.3.2: {} - uuid@9.0.0: {} - uvu@0.5.6: dependencies: dequal: 2.0.3 @@ -32093,12 +34354,6 @@ snapshots: '@types/unist': 3.0.2 vfile: 6.0.1 - vfile-matter@3.0.1: - dependencies: - '@types/js-yaml': 4.0.5 - is-buffer: 2.0.5 - js-yaml: 4.1.0 - vfile-message@3.1.4: dependencies: '@types/unist': 2.0.7 @@ -32122,7 +34377,7 @@ snapshots: unist-util-stringify-position: 4.0.0 vfile-message: 4.0.2 - vinxi@0.3.11(@types/node@20.14.0)(encoding@0.1.13)(ioredis@5.3.2)(lightningcss@1.24.1)(magicast@0.3.4)(terser@5.19.2): + vinxi@0.3.11(@types/node@20.14.0)(encoding@0.1.13)(ioredis@5.3.2)(lightningcss@1.24.1)(magicast@0.3.5)(terser@5.32.0): dependencies: '@babel/core': 7.24.4 '@babel/plugin-syntax-jsx': 7.24.6(@babel/core@7.24.4) @@ -32144,7 +34399,7 @@ snapshots: hookable: 5.5.3 http-proxy: 1.18.1 micromatch: 4.0.5 - nitropack: 2.9.6(encoding@0.1.13)(magicast@0.3.4) + nitropack: 2.9.6(encoding@0.1.13)(magicast@0.3.5) node-fetch-native: 1.6.4 path-to-regexp: 6.2.1 pathe: 1.1.2 @@ -32156,7 +34411,7 @@ snapshots: unctx: 2.3.1 unenv: 1.9.0 unstorage: 1.10.2(ioredis@5.3.2) - vite: 5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2) + vite: 5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0) zod: 3.23.8 transitivePeerDependencies: - '@azure/app-configuration' @@ -32189,17 +34444,34 @@ snapshots: - uWebSockets.js - xml2js - vite-hot-client@0.2.3(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2)): + vite-hot-client@0.2.3(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0)): dependencies: - vite: 5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2) + vite: 5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0) - vite-node@1.6.0(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2): + vite-node@1.6.0(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0): dependencies: cac: 6.7.14 - debug: 4.3.5 + debug: 4.3.6 pathe: 1.1.2 - picocolors: 1.0.0 - vite: 5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2) + picocolors: 1.0.1 + vite: 5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + + vite-node@2.0.5(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0): + dependencies: + cac: 6.7.14 + debug: 4.3.6 + pathe: 1.1.2 + tinyrainbow: 1.2.0 + vite: 5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0) transitivePeerDependencies: - '@types/node' - less @@ -32210,7 +34482,7 @@ snapshots: - supports-color - terser - vite-plugin-checker@0.6.4(eslint@8.57.0)(optionator@0.9.3)(typescript@5.5.2)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2))(vue-tsc@2.0.14(typescript@5.5.2)): + vite-plugin-checker@0.6.4(eslint@8.57.0)(optionator@0.9.3)(typescript@5.5.2)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0))(vue-tsc@2.0.14(typescript@5.5.2)): dependencies: '@babel/code-frame': 7.24.6 ansi-escapes: 4.3.2 @@ -32220,10 +34492,10 @@ snapshots: fast-glob: 3.3.2 fs-extra: 11.2.0 npm-run-path: 4.0.1 - semver: 7.6.2 + semver: 7.6.3 strip-ansi: 6.0.1 tiny-invariant: 1.3.1 - vite: 5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2) + vite: 5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0) vscode-languageclient: 7.0.0 vscode-languageserver: 7.0.0 vscode-languageserver-textdocument: 1.0.8 @@ -32234,58 +34506,58 @@ snapshots: typescript: 5.5.2 vue-tsc: 2.0.14(typescript@5.5.2) - vite-plugin-inspect@0.7.38(rollup@4.18.0)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2)): + vite-plugin-inspect@0.7.38(rollup@4.18.0)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0)): dependencies: '@antfu/utils': 0.7.10 '@rollup/pluginutils': 5.1.0(rollup@4.18.0) - debug: 4.3.5 + debug: 4.3.6 error-stack-parser-es: 0.1.4 fs-extra: 11.2.0 open: 9.1.0 - picocolors: 1.0.0 + picocolors: 1.0.1 sirv: 2.0.4 - vite: 5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2) + vite: 5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0) transitivePeerDependencies: - rollup - supports-color - vite-plugin-inspect@0.8.4(@nuxt/kit@3.12.2(magicast@0.3.4)(rollup@3.29.4))(rollup@3.29.4)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2)): + vite-plugin-inspect@0.8.4(@nuxt/kit@3.12.2(magicast@0.3.4)(rollup@3.29.4))(rollup@3.29.4)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0)): dependencies: '@antfu/utils': 0.7.10 '@rollup/pluginutils': 5.1.0(rollup@3.29.4) - debug: 4.3.5 + debug: 4.3.6 error-stack-parser-es: 0.1.4 fs-extra: 11.2.0 open: 10.1.0 perfect-debounce: 1.0.0 - picocolors: 1.0.0 + picocolors: 1.0.1 sirv: 2.0.4 - vite: 5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2) + vite: 5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0) optionalDependencies: '@nuxt/kit': 3.12.2(magicast@0.3.4)(rollup@3.29.4) transitivePeerDependencies: - rollup - supports-color - vite-plugin-inspect@0.8.4(@nuxt/kit@3.12.2(magicast@0.3.4)(rollup@4.18.0))(rollup@4.18.0)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2)): + vite-plugin-inspect@0.8.4(@nuxt/kit@3.12.2(magicast@0.3.4)(rollup@4.18.0))(rollup@4.18.0)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0)): dependencies: '@antfu/utils': 0.7.10 '@rollup/pluginutils': 5.1.0(rollup@4.18.0) - debug: 4.3.5 + debug: 4.3.6 error-stack-parser-es: 0.1.4 fs-extra: 11.2.0 open: 10.1.0 perfect-debounce: 1.0.0 - picocolors: 1.0.0 + picocolors: 1.0.1 sirv: 2.0.4 - vite: 5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2) + vite: 5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0) optionalDependencies: '@nuxt/kit': 3.12.2(magicast@0.3.4)(rollup@4.18.0) transitivePeerDependencies: - rollup - supports-color - vite-plugin-inspect@0.8.7(@nuxt/kit@3.13.0(magicast@0.3.4)(rollup@3.29.4))(rollup@3.29.4)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2)): + vite-plugin-inspect@0.8.7(@nuxt/kit@3.13.1(magicast@0.3.5)(rollup@3.29.4))(rollup@3.29.4)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0)): dependencies: '@antfu/utils': 0.7.10 '@rollup/pluginutils': 5.1.0(rollup@3.29.4) @@ -32296,14 +34568,14 @@ snapshots: perfect-debounce: 1.0.0 picocolors: 1.0.1 sirv: 2.0.4 - vite: 5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2) + vite: 5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0) optionalDependencies: - '@nuxt/kit': 3.13.0(magicast@0.3.4)(rollup@3.29.4) + '@nuxt/kit': 3.13.1(magicast@0.3.5)(rollup@3.29.4) transitivePeerDependencies: - rollup - supports-color - vite-plugin-solid@2.9.1(@testing-library/jest-dom@6.4.8)(solid-js@1.8.16)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2)): + vite-plugin-solid@2.9.1(@testing-library/jest-dom@6.4.8)(solid-js@1.8.16)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0)): dependencies: '@babel/core': 7.24.4 '@types/babel__core': 7.20.5 @@ -32311,14 +34583,14 @@ snapshots: merge-anything: 5.1.7 solid-js: 1.8.16 solid-refresh: 0.6.3(solid-js@1.8.16) - vite: 5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2) - vitefu: 0.2.5(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2)) + vite: 5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0) + vitefu: 0.2.5(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0)) optionalDependencies: '@testing-library/jest-dom': 6.4.8 transitivePeerDependencies: - supports-color - vite-plugin-vue-inspector@5.1.2(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2)): + vite-plugin-vue-inspector@5.1.2(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0)): dependencies: '@babel/core': 7.24.4 '@babel/plugin-proposal-decorators': 7.24.1(@babel/core@7.24.4) @@ -32328,12 +34600,12 @@ snapshots: '@vue/babel-plugin-jsx': 1.1.5(@babel/core@7.24.4) '@vue/compiler-dom': 3.4.25 kolorist: 1.8.0 - magic-string: 0.30.10 - vite: 5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2) + magic-string: 0.30.11 + vite: 5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0) transitivePeerDependencies: - supports-color - vite-plugin-vue-inspector@5.1.3(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2)): + vite-plugin-vue-inspector@5.2.0(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0)): dependencies: '@babel/core': 7.24.4 '@babel/plugin-proposal-decorators': 7.24.1(@babel/core@7.24.4) @@ -32343,23 +34615,23 @@ snapshots: '@vue/babel-plugin-jsx': 1.1.5(@babel/core@7.24.4) '@vue/compiler-dom': 3.4.25 kolorist: 1.8.0 - magic-string: 0.30.10 - vite: 5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2) + magic-string: 0.30.11 + vite: 5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0) transitivePeerDependencies: - supports-color - vite-tsconfig-paths@4.3.2(typescript@5.5.2)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2)): + vite-tsconfig-paths@4.3.2(typescript@5.5.2)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0)): dependencies: - debug: 4.3.5 + debug: 4.3.6 globrex: 0.1.2 tsconfck: 3.0.3(typescript@5.5.2) optionalDependencies: - vite: 5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2) + vite: 5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0) transitivePeerDependencies: - supports-color - typescript - vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2): + vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0): dependencies: esbuild: 0.21.5 postcss: 8.4.38 @@ -32368,15 +34640,15 @@ snapshots: '@types/node': 20.14.0 fsevents: 2.3.3 lightningcss: 1.24.1 - terser: 5.19.2 + terser: 5.32.0 - vitefu@0.2.5(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2)): + vitefu@0.2.5(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0)): optionalDependencies: - vite: 5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2) + vite: 5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0) - vitest-environment-nuxt@1.0.0(@playwright/test@1.45.0)(h3@1.11.1)(happy-dom@13.10.1)(magicast@0.3.4)(playwright-core@1.45.0)(rollup@3.29.4)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2))(vitest@1.6.0(@types/node@20.14.0)(happy-dom@13.10.1)(lightningcss@1.24.1)(terser@5.19.2))(vue-router@4.3.2(vue@3.4.25(typescript@5.5.2)))(vue@3.4.25(typescript@5.5.2)): + vitest-environment-nuxt@1.0.0(@playwright/test@1.45.0)(h3@1.11.1)(happy-dom@13.10.1)(magicast@0.3.5)(playwright-core@1.45.0)(rollup@3.29.4)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0))(vitest@1.6.0(@types/node@20.14.0)(@vitest/browser@2.0.5(typescript@5.5.2)(vitest@2.0.5))(happy-dom@13.10.1)(lightningcss@1.24.1)(terser@5.32.0))(vue-router@4.3.2(vue@3.4.25(typescript@5.5.2)))(vue@3.4.25(typescript@5.5.2)): dependencies: - '@nuxt/test-utils': 3.12.1(@playwright/test@1.45.0)(h3@1.11.1)(happy-dom@13.10.1)(magicast@0.3.4)(playwright-core@1.45.0)(rollup@3.29.4)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2))(vitest@1.6.0(@types/node@20.14.0)(happy-dom@13.10.1)(lightningcss@1.24.1)(terser@5.19.2))(vue-router@4.3.2(vue@3.4.25(typescript@5.5.2)))(vue@3.4.25(typescript@5.5.2)) + '@nuxt/test-utils': 3.12.1(@playwright/test@1.45.0)(h3@1.11.1)(happy-dom@13.10.1)(magicast@0.3.5)(playwright-core@1.45.0)(rollup@3.29.4)(vite@5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0))(vitest@1.6.0(@types/node@20.14.0)(@vitest/browser@2.0.5(typescript@5.5.2)(vitest@2.0.5))(happy-dom@13.10.1)(lightningcss@1.24.1)(terser@5.32.0))(vue-router@4.3.2(vue@3.4.25(typescript@5.5.2)))(vue@3.4.25(typescript@5.5.2)) transitivePeerDependencies: - '@cucumber/cucumber' - '@jest/globals' @@ -32396,7 +34668,7 @@ snapshots: - vue - vue-router - vitest@1.6.0(@types/node@20.14.0)(happy-dom@13.10.1)(lightningcss@1.24.1)(terser@5.19.2): + vitest@1.6.0(@types/node@20.14.0)(@vitest/browser@2.0.5(typescript@5.5.2)(vitest@2.0.5))(happy-dom@13.10.1)(lightningcss@1.24.1)(terser@5.32.0): dependencies: '@vitest/expect': 1.6.0 '@vitest/runner': 1.6.0 @@ -32405,21 +34677,57 @@ snapshots: '@vitest/utils': 1.6.0 acorn-walk: 8.3.2 chai: 4.4.1 - debug: 4.3.5 + debug: 4.3.6 execa: 8.0.1 local-pkg: 0.5.0 - magic-string: 0.30.10 + magic-string: 0.30.11 pathe: 1.1.2 - picocolors: 1.0.0 + picocolors: 1.0.1 std-env: 3.7.0 strip-literal: 2.1.0 tinybench: 2.8.0 tinypool: 0.8.4 - vite: 5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2) - vite-node: 1.6.0(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.19.2) - why-is-node-running: 2.2.2 + vite: 5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0) + vite-node: 1.6.0(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 20.14.0 + '@vitest/browser': 2.0.5(graphql@16.8.1)(playwright@1.45.0)(typescript@5.5.2)(vitest@2.0.5) + happy-dom: 13.10.1 + transitivePeerDependencies: + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + optional: true + + vitest@2.0.5(@types/node@20.14.0)(@vitest/browser@2.0.5(typescript@5.5.2)(vitest@2.0.5))(happy-dom@13.10.1)(lightningcss@1.24.1)(terser@5.32.0): + dependencies: + '@ampproject/remapping': 2.3.0 + '@vitest/expect': 2.0.5 + '@vitest/pretty-format': 2.0.5 + '@vitest/runner': 2.0.5 + '@vitest/snapshot': 2.0.5 + '@vitest/spy': 2.0.5 + '@vitest/utils': 2.0.5 + chai: 5.1.1 + debug: 4.3.6 + execa: 8.0.1 + magic-string: 0.30.11 + pathe: 1.1.2 + std-env: 3.7.0 + tinybench: 2.8.0 + tinypool: 1.0.1 + tinyrainbow: 1.2.0 + vite: 5.3.1(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0) + vite-node: 2.0.5(@types/node@20.14.0)(lightningcss@1.24.1)(terser@5.32.0) + why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 20.14.0 + '@vitest/browser': 2.0.5(graphql@16.8.1)(playwright@1.45.0)(typescript@5.5.2)(vitest@2.0.5) happy-dom: 13.10.1 transitivePeerDependencies: - less @@ -32437,7 +34745,7 @@ snapshots: vscode-languageclient@7.0.0: dependencies: minimatch: 3.1.2 - semver: 7.6.2 + semver: 7.6.3 vscode-languageserver-protocol: 3.16.0 vscode-languageserver-protocol@3.16.0: @@ -32453,10 +34761,6 @@ snapshots: dependencies: vscode-languageserver-protocol: 3.16.0 - vscode-oniguruma@1.7.0: {} - - vscode-textmate@8.0.0: {} - vscode-uri@3.0.7: {} vue-bundle-renderer@2.0.0: @@ -32522,6 +34826,11 @@ snapshots: warn-once@0.1.1: {} + watchpack@2.4.2: + dependencies: + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + wcwidth@1.0.1: dependencies: defaults: 1.0.4 @@ -32538,8 +34847,6 @@ snapshots: web-streams-polyfill@4.0.0-beta.3: {} - web-worker@1.2.0: {} - webcrypto-core@1.7.9: dependencies: '@peculiar/asn1-schema': 2.3.8 @@ -32559,7 +34866,7 @@ snapshots: webpack-bundle-analyzer@4.10.1: dependencies: '@discoveryjs/json-ext': 0.5.7 - acorn: 8.11.3 + acorn: 8.12.1 acorn-walk: 8.3.2 commander: 7.2.0 debounce: 1.2.1 @@ -32568,7 +34875,7 @@ snapshots: html-escaper: 2.0.2 is-plain-object: 5.0.0 opener: 1.5.2 - picocolors: 1.0.0 + picocolors: 1.0.1 sirv: 2.0.4 ws: 7.5.9 transitivePeerDependencies: @@ -32581,6 +34888,36 @@ snapshots: webpack-virtual-modules@0.6.2: {} + webpack@5.94.0(esbuild@0.21.5): + dependencies: + '@types/estree': 1.0.5 + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/wasm-edit': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 + acorn: 8.12.1 + acorn-import-attributes: 1.9.5(acorn@8.12.1) + browserslist: 4.23.0 + chrome-trace-event: 1.0.4 + enhanced-resolve: 5.17.1 + es-module-lexer: 1.5.0 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.0 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 3.3.0 + tapable: 2.2.1 + terser-webpack-plugin: 5.3.10(esbuild@0.21.5)(webpack@5.94.0(esbuild@0.21.5)) + watchpack: 2.4.2 + webpack-sources: 3.2.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + whatwg-fetch@3.6.20: {} whatwg-mimetype@3.0.0: {} @@ -32670,7 +35007,7 @@ snapshots: dependencies: isexe: 3.1.1 - why-is-node-running@2.2.2: + why-is-node-running@2.3.0: dependencies: siginfo: 2.0.0 stackback: 0.0.2 diff --git a/tooling/eslint-config/base.js b/tooling/eslint-config/base.js index 785d6b671b..d87f7057c9 100644 --- a/tooling/eslint-config/base.js +++ b/tooling/eslint-config/base.js @@ -20,6 +20,7 @@ const config = { }, plugins: ["@typescript-eslint", "import"], rules: { + "@typescript-eslint/array-type": "off", "@typescript-eslint/no-explicit-any": "off", "@typescript-eslint/consistent-type-definitions": "off", "@typescript-eslint/method-signature-style": ["error", "property"], diff --git a/turbo.json b/turbo.json index fc5e90197c..c1d57eba03 100644 --- a/turbo.json +++ b/turbo.json @@ -5,9 +5,11 @@ "globalEnv": [ "CUSTOM_INFRA_URL", "UPLOADTHING_URL", - "UPLOADTHING_SECRET", - "UPLOADTHING_TEST_SECRET", - "EXPO_PUBLIC_SERVER_ORIGIN" + "UPLOADTHING_TOKEN", + "UPLOADTHING_TEST_TOKEN", + "EXPO_PUBLIC_SERVER_ORIGIN", + "UPLOADTHING_API_URL", + "UPLOADTHING_INGEST_URL" ], "globalPassThroughEnv": [ "VERCEL_URL", @@ -30,7 +32,8 @@ }, "dev": { "cache": false, - "persistent": true + "persistent": true, + "interactive": true }, "clean": { "cache": false