From 1333071a3a2d324679327bfdd4e872f8fd3521c6 Mon Sep 17 00:00:00 2001 From: Nathan Rajlich Date: Wed, 28 Feb 2024 09:22:05 -0800 Subject: [PATCH] Remix Vite plugin support (#11031) Adds support for Remix apps which use the new Remix Vite plugin. * The vanilla Remix + Vite template deploys correctly out-of-the-box, however only a single Node.js function will be used, and a warning will be printed saying to configure the `vercelPreset()` Preset. * When used in conjunction with the `vercelPreset()` Preset (https://github.com/vercel/remix/pull/81), allows for the application to utilize Vercel-specific features, like per-route `export const config` configuration, including multi-runtime (Node.js / Edge runtimes) within the same app. ## To test this today 1. Generate a Remix + Vite project from the template: ``` npx create-remix@latest --template remix-run/remix/templates/vite ``` 1. Install `@vercel/remix`: ``` npm i --save-dev @vercel/remix ``` 1. **(Before Remix v2.8.0 is released)** - Update the `@remix-run/dev` dependency to use the "pre" tag which contains [a bug fix](https://github.com/remix-run/remix/pull/8864): ``` npm i --save--dev @remix-run/dev@pre @remix-run/serve@pre ``` 1. Configure the `vercelPreset()` in the `vite.config.ts` file: ```diff --- a/vite.config.ts +++ b/vite.config.ts @@ -1,10 +1,11 @@ import { vitePlugin as remix } from "@remix-run/dev"; import { installGlobals } from "@remix-run/node"; import { defineConfig } from "vite"; +import { vercelPreset } from "@vercel/remix/vite"; import tsconfigPaths from "vite-tsconfig-paths"; installGlobals(); export default defineConfig({ - plugins: [remix(), tsconfigPaths()], + plugins: [remix({ presets: [vercelPreset()] }), tsconfigPaths()], }); ``` 1. Create a new Vercel Project in the dashboard, and ensure the Vercel preset is set to "Remix" in the Project Settings. The autodetection will work correctly once this PR is merged, but for now it gets incorrectly detected as "Vite" preset. * **Hint**: You can create a new empty Project by running the `vercel link` command. Screenshot 2024-02-27 at 10 37 11 1. Deploy to Vercel, setting the `VERCEL_CLI_VERSION` environment variable to use the changes in this PR: ``` vercel deploy -b VERCEL_CLI_VERSION=https://vercel-git-tootallnate-zero-1217-research-remix-v-next-vite.vercel.sh/tarballs/vercel.tgz ``` --- .changeset/metal-tips-decide.md | 5 + .changeset/sour-cameras-eat.md | 6 + .eslintignore | 2 +- .prettierignore | 1 + packages/frameworks/src/frameworks.ts | 7 +- packages/frameworks/src/types.ts | 4 +- .../frameworks/test/frameworks.unit.test.ts | 2 +- packages/fs-detectors/src/detect-framework.ts | 8 +- .../test/unit.framework-detector.test.ts | 41 +- packages/remix/package.json | 4 +- packages/remix/src/build-legacy.ts | 814 ++ packages/remix/src/build-vite.ts | 477 + packages/remix/src/build.ts | 819 +- packages/remix/src/utils.ts | 15 +- .../00-pnpm/.gitignore | 0 .../00-pnpm/node_modules/.modules.yaml | 0 .../debug@4.3.4/node_modules/debug/LICENSE | 0 .../debug@4.3.4/node_modules/debug/README.md | 0 .../node_modules/debug/package.json | 0 .../node_modules/debug/src/browser.js | 0 .../node_modules/debug/src/common.js | 0 .../node_modules/debug/src/index.js | 0 .../node_modules/debug/src/node.js | 0 .../.pnpm/debug@4.3.4/node_modules/ms | 0 .../00-pnpm/node_modules/.pnpm/lock.yaml | 0 .../.pnpm/ms@2.1.2/node_modules/ms/index.js | 0 .../.pnpm/ms@2.1.2/node_modules/ms/license.md | 0 .../ms@2.1.2/node_modules/ms/package.json | 0 .../.pnpm/ms@2.1.2/node_modules/ms/readme.md | 0 .../node_modules/.pnpm/node_modules/ms | 0 .../00-pnpm/node_modules/debug | 0 .../00-pnpm/package.json | 0 .../00-pnpm/pnpm-lock.yaml | 0 .../01-remix-basics/.gitignore | 0 .../01-remix-basics/README.md | 0 .../01-remix-basics/app/b.server.ts | 0 .../01-remix-basics/app/entry.client.tsx | 0 .../01-remix-basics/app/entry.server.tsx | 0 .../01-remix-basics/app/root.tsx | 0 .../01-remix-basics/app/routes/__pathless.tsx | 0 .../01-remix-basics/app/routes/b.tsx | 0 .../01-remix-basics/app/routes/edge.tsx | 0 .../01-remix-basics/app/routes/index.tsx | 0 .../01-remix-basics/app/routes/instanceof.tsx | 0 .../app/routes/nested/another.tsx | 0 .../app/routes/nested/index.tsx | 0 .../app/routes/nested2/__pathless.tsx | 0 .../01-remix-basics/app/routes/projects.tsx | 0 .../app/routes/projects/edge.tsx | 0 .../app/routes/projects/node.tsx | 0 .../app/routes/set-cookie-edge.tsx | 0 .../app/routes/set-cookie-node.tsx | 0 .../01-remix-basics/app/routes/tex[t.t]xt.tsx | 0 .../01-remix-basics/package.json | 0 .../01-remix-basics/probes.json | 0 .../01-remix-basics/public/favicon.ico | Bin .../01-remix-basics/remix.config.js | 0 .../01-remix-basics/remix.env.d.ts | 0 .../01-remix-basics/tsconfig.json | 0 .../01-remix-basics/yarn.lock | 0 .../02-remix-basics-mjs/.gitignore | 0 .../02-remix-basics-mjs/README.md | 0 .../02-remix-basics-mjs/app/entry.client.tsx | 0 .../02-remix-basics-mjs/app/entry.server.tsx | 0 .../02-remix-basics-mjs/app/root.tsx | 0 .../02-remix-basics-mjs/app/routes/edge.tsx | 0 .../02-remix-basics-mjs/app/routes/index.tsx | 0 .../app/routes/load-context.tsx | 0 .../02-remix-basics-mjs/package.json | 0 .../02-remix-basics-mjs/probes.json | 0 .../02-remix-basics-mjs/public/favicon.ico | Bin .../02-remix-basics-mjs/remix.config.mjs | 0 .../02-remix-basics-mjs/remix.env.d.ts | 0 .../02-remix-basics-mjs/server.ts | 0 .../02-remix-basics-mjs/tsconfig.json | 0 .../02-remix-basics-mjs/yarn.lock | 0 .../03-with-pnpm/.gitignore | 0 .../03-with-pnpm/README.md | 0 .../03-with-pnpm/app/entry.client.tsx | 0 .../03-with-pnpm/app/entry.server.tsx | 0 .../03-with-pnpm/app/root.tsx | 0 .../03-with-pnpm/app/routes/$.tsx | 0 .../03-with-pnpm/app/routes/b.tsx | 0 .../03-with-pnpm/app/routes/edge.tsx | 0 .../03-with-pnpm/app/routes/index.tsx | 0 .../app/routes/nested/another.tsx | 0 .../03-with-pnpm/app/routes/nested/index.tsx | 0 .../03-with-pnpm/app/routes/sub/$.tsx | 0 .../03-with-pnpm/package.json | 0 .../03-with-pnpm/pnpm-lock.yaml | 0 .../03-with-pnpm/probes.json | 0 .../03-with-pnpm/public/favicon.ico | Bin .../03-with-pnpm/remix.config.js | 0 .../03-with-pnpm/remix.env.d.ts | 0 .../03-with-pnpm/tsconfig.json | 0 .../04-with-npm9-linked/.gitignore | 0 .../04-with-npm9-linked/.npmrc | 0 .../04-with-npm9-linked/README.md | 0 .../04-with-npm9-linked/app/entry.client.tsx | 0 .../04-with-npm9-linked/app/entry.server.tsx | 0 .../04-with-npm9-linked/app/root.tsx | 0 .../04-with-npm9-linked/app/routes/b.tsx | 0 .../04-with-npm9-linked/app/routes/edge.tsx | 0 .../04-with-npm9-linked/app/routes/index.tsx | 0 .../app/routes/nested/another.tsx | 0 .../app/routes/nested/index.tsx | 0 .../04-with-npm9-linked/package-lock.json | 0 .../04-with-npm9-linked/package.json | 0 .../04-with-npm9-linked/probes.json | 0 .../04-with-npm9-linked/public/favicon.ico | Bin .../04-with-npm9-linked/remix.config.js | 0 .../04-with-npm9-linked/remix.env.d.ts | 0 .../04-with-npm9-linked/tsconfig.json | 0 .../04-with-npm9-linked/vercel.json | 0 .../05-root-only/.gitignore | 0 .../05-root-only/app/entry.client.jsx | 0 .../05-root-only/app/entry.server.jsx | 0 .../05-root-only/app/root.jsx | 0 .../05-root-only/package-lock.json | 0 .../05-root-only/package.json | 0 .../05-root-only/probes.json | 0 .../05-root-only/remix.config.js | 0 .../06-v2-routing/.gitignore | 0 .../06-v2-routing/app/root.jsx | 0 .../06-v2-routing/app/routes/_index.jsx | 0 .../06-v2-routing/app/routes/admin.(lol).tsx | 0 .../06-v2-routing/app/routes/foo.jsx | 0 .../06-v2-routing/app/routes/fuzz.buzz-2.jsx | 0 .../06-v2-routing/app/routes/fuzz.buzz.jsx | 0 .../06-v2-routing/app/routes/nested/route.jsx | 0 .../06-v2-routing/package-lock.json | 0 .../06-v2-routing/package.json | 0 .../06-v2-routing/probes.json | 0 .../06-v2-routing/remix.config.js | 0 .../07-turborepo/.gitignore | 0 .../apps/remix-app/app/entry.client.tsx | 0 .../apps/remix-app/app/entry.server.tsx | 0 .../07-turborepo/apps/remix-app/app/root.tsx | 0 .../apps/remix-app/app/routes/index.tsx | 0 .../07-turborepo/apps/remix-app/package.json | 0 .../apps/remix-app/public/favicon.ico | Bin .../apps/remix-app/remix.config.js | 0 .../apps/remix-app/remix.env.d.ts | 0 .../07-turborepo/apps/remix-app/server.js | 0 .../07-turborepo/apps/remix-app/tsconfig.json | 0 .../07-turborepo/package.json | 0 .../07-turborepo/packages/ui/package.json | 0 .../07-turborepo/packages/ui/src/Button.tsx | 0 .../07-turborepo/packages/ui/src/index.tsx | 0 .../07-turborepo/packages/ui/tsconfig.json | 0 .../07-turborepo/probes.json | 0 .../07-turborepo/turbo.json | 0 .../07-turborepo/vercel.json | 0 .../07-turborepo/yarn.lock | 0 .../08-no-entry-yarn/app/root.tsx | 0 .../08-no-entry-yarn/app/routes/index.tsx | 0 .../08-no-entry-yarn/package.json | 0 .../08-no-entry-yarn/probes.json | 0 .../08-no-entry-yarn/public/favicon.ico | Bin .../08-no-entry-yarn/remix.config.js | 0 .../08-no-entry-yarn/remix.env.d.ts | 0 .../08-no-entry-yarn/server.js | 0 .../08-no-entry-yarn/tsconfig.json | 0 .../08-no-entry-yarn/yarn.lock | 0 .../09-no-entry-pnpm/app/root.tsx | 0 .../09-no-entry-pnpm/app/routes/index.tsx | 0 .../09-no-entry-pnpm/package.json | 0 .../09-no-entry-pnpm/pnpm-lock.yaml | 0 .../09-no-entry-pnpm/probes.json | 0 .../09-no-entry-pnpm/public/favicon.ico | Bin .../09-no-entry-pnpm/remix.config.js | 0 .../09-no-entry-pnpm/remix.env.d.ts | 0 .../09-no-entry-pnpm/server.js | 0 .../09-no-entry-pnpm/tsconfig.json | 0 .../10-hydrogen-2/.gitignore | 0 .../10-hydrogen-2/.graphqlrc.yml | 0 .../10-hydrogen-2/README.md | 0 .../10-hydrogen-2/app/components/Aside.tsx | 0 .../10-hydrogen-2/app/components/Cart.tsx | 0 .../10-hydrogen-2/app/components/Footer.tsx | 0 .../10-hydrogen-2/app/components/Header.tsx | 0 .../10-hydrogen-2/app/components/Layout.tsx | 0 .../10-hydrogen-2/app/components/Search.tsx | 0 .../10-hydrogen-2/app/entry.client.tsx | 0 .../10-hydrogen-2/app/entry.server.tsx | 0 .../10-hydrogen-2/app/root.tsx | 0 .../10-hydrogen-2/app/routes/$.tsx | 0 .../10-hydrogen-2/app/routes/[robots.txt].tsx | 0 .../app/routes/[sitemap.xml].tsx | 0 .../10-hydrogen-2/app/routes/_index.tsx | 0 .../10-hydrogen-2/app/routes/account.$.tsx | 0 .../app/routes/account.addresses.tsx | 0 .../app/routes/account.orders.$id.tsx | 0 .../app/routes/account.orders._index.tsx | 0 .../app/routes/account.profile.tsx | 0 .../10-hydrogen-2/app/routes/account.tsx | 0 ...account_.activate.$id.$activationToken.tsx | 0 .../app/routes/account_.login.tsx | 0 .../app/routes/account_.logout.tsx | 0 .../app/routes/account_.recover.tsx | 0 .../app/routes/account_.register.tsx | 0 .../routes/account_.reset.$id.$resetToken.tsx | 0 .../app/routes/api.predictive-search.tsx | 0 .../blogs.$blogHandle.$articleHandle.tsx | 0 .../app/routes/blogs.$blogHandle._index.tsx | 0 .../10-hydrogen-2/app/routes/blogs._index.tsx | 0 .../10-hydrogen-2/app/routes/cart.tsx | 0 .../app/routes/collections.$handle.tsx | 0 .../app/routes/collections._index.tsx | 0 .../app/routes/pages.$handle.tsx | 0 .../app/routes/policies.$handle.tsx | 0 .../app/routes/policies._index.tsx | 0 .../app/routes/products.$handle.tsx | 0 .../10-hydrogen-2/app/routes/search.tsx | 0 .../10-hydrogen-2/app/styles/app.css | 0 .../10-hydrogen-2/app/styles/reset.css | 0 .../10-hydrogen-2/app/utils.ts | 0 .../10-hydrogen-2/package.json | 0 .../10-hydrogen-2/pnpm-lock.yaml | 0 .../10-hydrogen-2/probes.json | 0 .../10-hydrogen-2/public/favicon.svg | 0 .../10-hydrogen-2/remix.config.js | 0 .../10-hydrogen-2/remix.env.d.ts | 0 .../10-hydrogen-2/server.ts | 0 .../storefrontapi.generated.d.ts | 0 .../10-hydrogen-2/tsconfig.json | 0 .../11-hydrogen-2-js/.gitignore | 0 .../11-hydrogen-2-js/.graphqlrc.yml | 0 .../11-hydrogen-2-js/README.md | 0 .../11-hydrogen-2-js/app/components/Aside.jsx | 0 .../11-hydrogen-2-js/app/components/Cart.jsx | 0 .../app/components/Footer.jsx | 0 .../app/components/Header.jsx | 0 .../app/components/Layout.jsx | 0 .../app/components/Search.jsx | 0 .../11-hydrogen-2-js/app/entry.client.jsx | 0 .../11-hydrogen-2-js/app/entry.server.jsx | 0 .../11-hydrogen-2-js/app/root.jsx | 0 .../11-hydrogen-2-js/app/routes/$.jsx | 0 .../app/routes/[robots.txt].jsx | 0 .../app/routes/[sitemap.xml].jsx | 0 .../11-hydrogen-2-js/app/routes/_index.jsx | 0 .../11-hydrogen-2-js/app/routes/account.$.jsx | 0 .../app/routes/account.addresses.jsx | 0 .../11-hydrogen-2-js/app/routes/account.jsx | 0 .../app/routes/account.orders.$id.jsx | 0 .../app/routes/account.orders._index.jsx | 0 .../app/routes/account.profile.jsx | 0 ...account_.activate.$id.$activationToken.jsx | 0 .../app/routes/account_.login.jsx | 0 .../app/routes/account_.logout.jsx | 0 .../app/routes/account_.recover.jsx | 0 .../app/routes/account_.register.jsx | 0 .../routes/account_.reset.$id.$resetToken.jsx | 0 .../app/routes/api.predictive-search.jsx | 0 .../blogs.$blogHandle.$articleHandle.jsx | 0 .../app/routes/blogs.$blogHandle._index.jsx | 0 .../app/routes/blogs._index.jsx | 0 .../11-hydrogen-2-js/app/routes/cart.jsx | 0 .../app/routes/collections.$handle.jsx | 0 .../app/routes/collections._index.jsx | 0 .../app/routes/pages.$handle.jsx | 0 .../app/routes/policies.$handle.jsx | 0 .../app/routes/policies._index.jsx | 0 .../app/routes/products.$handle.jsx | 0 .../11-hydrogen-2-js/app/routes/search.jsx | 0 .../11-hydrogen-2-js/app/styles/app.css | 0 .../11-hydrogen-2-js/app/styles/reset.css | 0 .../11-hydrogen-2-js/app/utils.js | 0 .../11-hydrogen-2-js/jsconfig.json | 0 .../11-hydrogen-2-js/package.json | 0 .../11-hydrogen-2-js/pnpm-lock.yaml | 0 .../11-hydrogen-2-js/probes.json | 0 .../11-hydrogen-2-js/public/favicon.svg | 0 .../11-hydrogen-2-js/remix.config.js | 0 .../11-hydrogen-2-js/server.js | 0 .../12-remix-v2/.gitignore | 0 .../12-remix-v2/README.md | 0 .../12-remix-v2/app/root.tsx | 0 .../12-remix-v2/app/routes/_index.tsx | 0 .../12-remix-v2/app/routes/edge.tsx | 0 .../12-remix-v2/package.json | 0 .../12-remix-v2/pnpm-lock.yaml | 0 .../12-remix-v2/probes.json | 0 .../12-remix-v2/public/favicon.ico | Bin .../12-remix-v2/public/remix.svg | 0 .../12-remix-v2/remix.config.js | 0 .../12-remix-v2/remix.env.d.ts | 0 .../12-remix-v2/tsconfig.json | 0 .../13-remix-v2-public-path/.gitignore | 0 .../common/private.txt | 0 .../13-remix-v2-public-path/misc/private.txt | 0 .../13-remix-v2-public-path/probes.json | 0 .../13-remix-v2-public-path/site/app/root.tsx | 0 .../site/app/routes/_index.tsx | 0 .../site/app/routes/blog.$slug.tsx | 0 .../site/app/routes/edge.tsx | 0 .../site/package-lock.json | 0 .../13-remix-v2-public-path/site/package.json | 0 .../site/public/favicon.ico | Bin .../site/public/hello.txt | 0 .../site/remix.config.js | 0 .../site/remix.env.d.ts | 0 .../13-remix-v2-public-path/tsconfig.json | 0 .../13-remix-v2-public-path/vercel.json | 0 .../14-node-linker-hoisted/.gitignore | 0 .../14-node-linker-hoisted/.npmrc | 0 .../14-node-linker-hoisted/.prettierignore | 0 .../14-node-linker-hoisted/.prettierrc | 0 .../apps/remix/.eslintrc.commit.js | 0 .../apps/remix/.eslintrc.js | 0 .../apps/remix/.gitignore | 0 .../apps/remix/app/root.tsx | 0 .../apps/remix/app/routes/_index.tsx | 0 .../apps/remix/package.json | 0 .../apps/remix/public/favicon.ico | Bin .../apps/remix/remix.config.js | 0 .../apps/remix/remix.env.d.ts | 0 .../apps/remix/tsconfig.json | 0 .../apps/remix/vercel.json | 0 .../14-node-linker-hoisted/package.json | 0 .../14-node-linker-hoisted/pnpm-lock.yaml | 0 .../pnpm-workspace.yaml | 0 .../14-node-linker-hoisted/probes.json | 0 .../14-node-linker-hoisted/tsconfig.json | 0 .../14-node-linker-hoisted/turbo.json | 0 .../14-node-linker-hoisted/vercel.json | 0 .../fixtures-vite/01-no-preset/.eslintrc.cjs | 83 + .../fixtures-vite/01-no-preset/.gitignore | 5 + .../test/fixtures-vite/01-no-preset/README.md | 36 + .../fixtures-vite/01-no-preset/app/root.tsx | 25 + .../01-no-preset/app/routes/_index.tsx | 41 + .../test/fixtures-vite/01-no-preset/env.d.ts | 2 + .../fixtures-vite/01-no-preset/package.json | 39 + .../fixtures-vite/01-no-preset/probes.json | 14 + .../01-no-preset/public/favicon.ico | Bin 0 -> 16958 bytes .../fixtures-vite/01-no-preset/tsconfig.json | 24 + .../fixtures-vite/01-no-preset/vercel.json | 3 + .../fixtures-vite/01-no-preset/vite.config.ts | 7 + .../.eslintrc.cjs | 83 + .../.gitignore | 7 + .../02-interactive-remix-routing-v2/LICENSE | 21 + .../02-interactive-remix-routing-v2/README.md | 7 + .../components/Breadcrumbs/Breadcrumbs.tsx | 43 + .../app/components/Breadcrumbs/index.tsx | 3 + .../app/components/Header/Header.tsx | 47 + .../app/components/Header/index.tsx | 3 + .../app/components/RemixLogo/RemixLogo.tsx | 40 + .../app/components/RemixLogo/index.tsx | 3 + .../app/components/Sidebar/Sidebar.tsx | 18 + .../TreeStructure/NodeIcon/NodeIcon.tsx | 31 + .../Sidebar/TreeStructure/NodeIcon/index.tsx | 3 + .../Sidebar/TreeStructure/TreeStructure.tsx | 41 + .../Sidebar/TreeStructure/index.tsx | 3 + .../app/components/Sidebar/index.tsx | 3 + .../ChevronRightIcon/ChevronRightIcon.tsx | 21 + .../icons/ChevronRightIcon/index.tsx | 3 + .../icons/FolderIcon/FolderIcon.tsx | 25 + .../app/components/icons/FolderIcon/index.tsx | 3 + .../icons/GithubIcon/GithubIcon.tsx | 23 + .../app/components/icons/GithubIcon/index.tsx | 3 + .../components/icons/MoonIcon/MoonIcon.tsx | 23 + .../app/components/icons/MoonIcon/index.tsx | 3 + .../app/components/icons/SunIcon/SunIcon.tsx | 16 + .../app/components/icons/SunIcon/index.tsx | 3 + .../wrappers/LayoutWrapper/LayoutWrapper.tsx | 15 + .../wrappers/LayoutWrapper/index.tsx | 3 + .../wrappers/RouteWrapper/RouteWrapper.tsx | 15 + .../wrappers/RouteWrapper/index.tsx | 3 + .../data/routes/basicRoutes/basicRoutes.tsx | 13 + .../app/data/routes/basicRoutes/index.tsx | 3 + .../routes/dotDelimeters/dotDelimeters.tsx | 29 + .../app/data/routes/dotDelimeters/index.tsx | 3 + .../dynamicSegments/dynamicSegments.tsx | 23 + .../app/data/routes/dynamicSegments/index.tsx | 3 + .../folderOrganization/folderOrganization.tsx | 10 + .../data/routes/folderOrganization/index.tsx | 3 + .../app/data/routes/index.tsx | 3 + .../app/data/routes/nestedRoutes/index.tsx | 3 + .../data/routes/nestedRoutes/nestedRoutes.tsx | 24 + .../app/data/routes/nestedWOlayout/index.tsx | 3 + .../routes/nestedWOlayout/nestedWOlayout.tsx | 31 + .../data/routes/optionalSegments/index.tsx | 3 + .../optionalSegments/optionalSegments.tsx | 29 + .../app/data/routes/pathlessRoutes/index.tsx | 3 + .../routes/pathlessRoutes/pathlessRoutes.tsx | 14 + .../app/data/routes/routes.tsx | 26 + .../data/routes/specialCharacters/index.tsx | 3 + .../specialCharacters/specialCharacters.tsx | 36 + .../app/data/routes/splatRoutes/index.tsx | 3 + .../data/routes/splatRoutes/splatRoutes.tsx | 10 + .../app/root.tsx | 79 + .../app/routes/[[so-weird]].tsx | 17 + .../app/routes/[sitemap2.xml].tsx | 17 + .../app/routes/_auth.login.tsx | 18 + .../app/routes/_auth.register.tsx | 18 + .../app/routes/_auth.tsx | 13 + .../app/routes/_index.tsx | 18 + .../app/routes/about.tsx | 18 + .../app/routes/actors.$actorName.tsx | 22 + .../app/routes/actors._index.tsx | 17 + .../app/routes/actors.trending.tsx | 20 + .../app/routes/actors.tsx | 15 + .../app/routes/actors_.favourites.tsx | 20 + .../app/routes/concerts.salt-lake-city.tsx | 22 + .../app/routes/concerts.san-diego.tsx | 20 + .../app/routes/concerts.trending.tsx | 20 + .../app/routes/dolla-bills-[$].tsx | 17 + .../app/routes/files.$.tsx | 17 + .../app/routes/movies.$movieName.tsx | 19 + .../app/routes/movies.trending.tsx | 17 + .../routes/products.($lang).$productId.tsx | 17 + .../app/routes/products.($lang)._index.tsx | 18 + .../routes/products.($lang).categories.tsx | 19 + .../app/routes/sitemap[.]xml.tsx | 17 + .../app/routes/weird-url.[_index].tsx | 17 + .../app/styles.css | 51 + .../app/tailwind.css | 897 ++ .../app/types/tree/index.tsx | 1 + .../app/types/tree/tree.tsx | 7 + .../app/utils/generateMeta/generateMeta.tsx | 47 + .../app/utils/generateMeta/index.tsx | 3 + .../02-interactive-remix-routing-v2/env.d.ts | 2 + .../package-lock.json | 10990 ++++++++++++++++ .../package.json | 43 + .../probes.json | 121 + .../public/favicon.ico | Bin 0 -> 16958 bytes .../public/og.png | Bin 0 -> 23822 bytes .../tailwind.config.js | 9 + .../tsconfig.json | 23 + .../vercel.json | 3 + .../vite.config.ts | 13 + .../remix/test/integration-legacy.test.ts | 27 + ...ation.test.ts => integration-vite.test.ts} | 2 +- .../remix/test/unit.ensure-resolvable.test.ts | 2 +- packages/remix/test/unit.find-config.test.ts | 2 +- pnpm-lock.yaml | 3 + utils/build-builder.mjs | 24 +- 438 files changed, 15220 insertions(+), 839 deletions(-) create mode 100644 .changeset/metal-tips-decide.md create mode 100644 .changeset/sour-cameras-eat.md create mode 100644 packages/remix/src/build-legacy.ts create mode 100644 packages/remix/src/build-vite.ts rename packages/remix/test/{fixtures => fixtures-legacy}/00-pnpm/.gitignore (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/00-pnpm/node_modules/.modules.yaml (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/00-pnpm/node_modules/.pnpm/debug@4.3.4/node_modules/debug/LICENSE (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/00-pnpm/node_modules/.pnpm/debug@4.3.4/node_modules/debug/README.md (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/00-pnpm/node_modules/.pnpm/debug@4.3.4/node_modules/debug/package.json (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/00-pnpm/node_modules/.pnpm/debug@4.3.4/node_modules/debug/src/browser.js (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/00-pnpm/node_modules/.pnpm/debug@4.3.4/node_modules/debug/src/common.js (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/00-pnpm/node_modules/.pnpm/debug@4.3.4/node_modules/debug/src/index.js (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/00-pnpm/node_modules/.pnpm/debug@4.3.4/node_modules/debug/src/node.js (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/00-pnpm/node_modules/.pnpm/debug@4.3.4/node_modules/ms (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/00-pnpm/node_modules/.pnpm/lock.yaml (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/00-pnpm/node_modules/.pnpm/ms@2.1.2/node_modules/ms/index.js (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/00-pnpm/node_modules/.pnpm/ms@2.1.2/node_modules/ms/license.md (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/00-pnpm/node_modules/.pnpm/ms@2.1.2/node_modules/ms/package.json (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/00-pnpm/node_modules/.pnpm/ms@2.1.2/node_modules/ms/readme.md (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/00-pnpm/node_modules/.pnpm/node_modules/ms (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/00-pnpm/node_modules/debug (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/00-pnpm/package.json (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/00-pnpm/pnpm-lock.yaml (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/01-remix-basics/.gitignore (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/01-remix-basics/README.md (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/01-remix-basics/app/b.server.ts (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/01-remix-basics/app/entry.client.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/01-remix-basics/app/entry.server.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/01-remix-basics/app/root.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/01-remix-basics/app/routes/__pathless.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/01-remix-basics/app/routes/b.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/01-remix-basics/app/routes/edge.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/01-remix-basics/app/routes/index.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/01-remix-basics/app/routes/instanceof.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/01-remix-basics/app/routes/nested/another.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/01-remix-basics/app/routes/nested/index.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/01-remix-basics/app/routes/nested2/__pathless.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/01-remix-basics/app/routes/projects.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/01-remix-basics/app/routes/projects/edge.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/01-remix-basics/app/routes/projects/node.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/01-remix-basics/app/routes/set-cookie-edge.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/01-remix-basics/app/routes/set-cookie-node.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/01-remix-basics/app/routes/tex[t.t]xt.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/01-remix-basics/package.json (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/01-remix-basics/probes.json (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/01-remix-basics/public/favicon.ico (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/01-remix-basics/remix.config.js (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/01-remix-basics/remix.env.d.ts (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/01-remix-basics/tsconfig.json (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/01-remix-basics/yarn.lock (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/02-remix-basics-mjs/.gitignore (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/02-remix-basics-mjs/README.md (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/02-remix-basics-mjs/app/entry.client.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/02-remix-basics-mjs/app/entry.server.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/02-remix-basics-mjs/app/root.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/02-remix-basics-mjs/app/routes/edge.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/02-remix-basics-mjs/app/routes/index.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/02-remix-basics-mjs/app/routes/load-context.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/02-remix-basics-mjs/package.json (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/02-remix-basics-mjs/probes.json (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/02-remix-basics-mjs/public/favicon.ico (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/02-remix-basics-mjs/remix.config.mjs (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/02-remix-basics-mjs/remix.env.d.ts (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/02-remix-basics-mjs/server.ts (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/02-remix-basics-mjs/tsconfig.json (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/02-remix-basics-mjs/yarn.lock (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/03-with-pnpm/.gitignore (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/03-with-pnpm/README.md (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/03-with-pnpm/app/entry.client.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/03-with-pnpm/app/entry.server.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/03-with-pnpm/app/root.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/03-with-pnpm/app/routes/$.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/03-with-pnpm/app/routes/b.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/03-with-pnpm/app/routes/edge.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/03-with-pnpm/app/routes/index.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/03-with-pnpm/app/routes/nested/another.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/03-with-pnpm/app/routes/nested/index.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/03-with-pnpm/app/routes/sub/$.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/03-with-pnpm/package.json (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/03-with-pnpm/pnpm-lock.yaml (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/03-with-pnpm/probes.json (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/03-with-pnpm/public/favicon.ico (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/03-with-pnpm/remix.config.js (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/03-with-pnpm/remix.env.d.ts (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/03-with-pnpm/tsconfig.json (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/04-with-npm9-linked/.gitignore (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/04-with-npm9-linked/.npmrc (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/04-with-npm9-linked/README.md (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/04-with-npm9-linked/app/entry.client.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/04-with-npm9-linked/app/entry.server.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/04-with-npm9-linked/app/root.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/04-with-npm9-linked/app/routes/b.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/04-with-npm9-linked/app/routes/edge.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/04-with-npm9-linked/app/routes/index.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/04-with-npm9-linked/app/routes/nested/another.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/04-with-npm9-linked/app/routes/nested/index.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/04-with-npm9-linked/package-lock.json (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/04-with-npm9-linked/package.json (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/04-with-npm9-linked/probes.json (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/04-with-npm9-linked/public/favicon.ico (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/04-with-npm9-linked/remix.config.js (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/04-with-npm9-linked/remix.env.d.ts (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/04-with-npm9-linked/tsconfig.json (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/04-with-npm9-linked/vercel.json (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/05-root-only/.gitignore (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/05-root-only/app/entry.client.jsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/05-root-only/app/entry.server.jsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/05-root-only/app/root.jsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/05-root-only/package-lock.json (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/05-root-only/package.json (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/05-root-only/probes.json (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/05-root-only/remix.config.js (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/06-v2-routing/.gitignore (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/06-v2-routing/app/root.jsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/06-v2-routing/app/routes/_index.jsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/06-v2-routing/app/routes/admin.(lol).tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/06-v2-routing/app/routes/foo.jsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/06-v2-routing/app/routes/fuzz.buzz-2.jsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/06-v2-routing/app/routes/fuzz.buzz.jsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/06-v2-routing/app/routes/nested/route.jsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/06-v2-routing/package-lock.json (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/06-v2-routing/package.json (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/06-v2-routing/probes.json (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/06-v2-routing/remix.config.js (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/07-turborepo/.gitignore (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/07-turborepo/apps/remix-app/app/entry.client.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/07-turborepo/apps/remix-app/app/entry.server.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/07-turborepo/apps/remix-app/app/root.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/07-turborepo/apps/remix-app/app/routes/index.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/07-turborepo/apps/remix-app/package.json (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/07-turborepo/apps/remix-app/public/favicon.ico (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/07-turborepo/apps/remix-app/remix.config.js (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/07-turborepo/apps/remix-app/remix.env.d.ts (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/07-turborepo/apps/remix-app/server.js (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/07-turborepo/apps/remix-app/tsconfig.json (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/07-turborepo/package.json (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/07-turborepo/packages/ui/package.json (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/07-turborepo/packages/ui/src/Button.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/07-turborepo/packages/ui/src/index.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/07-turborepo/packages/ui/tsconfig.json (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/07-turborepo/probes.json (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/07-turborepo/turbo.json (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/07-turborepo/vercel.json (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/07-turborepo/yarn.lock (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/08-no-entry-yarn/app/root.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/08-no-entry-yarn/app/routes/index.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/08-no-entry-yarn/package.json (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/08-no-entry-yarn/probes.json (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/08-no-entry-yarn/public/favicon.ico (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/08-no-entry-yarn/remix.config.js (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/08-no-entry-yarn/remix.env.d.ts (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/08-no-entry-yarn/server.js (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/08-no-entry-yarn/tsconfig.json (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/08-no-entry-yarn/yarn.lock (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/09-no-entry-pnpm/app/root.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/09-no-entry-pnpm/app/routes/index.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/09-no-entry-pnpm/package.json (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/09-no-entry-pnpm/pnpm-lock.yaml (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/09-no-entry-pnpm/probes.json (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/09-no-entry-pnpm/public/favicon.ico (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/09-no-entry-pnpm/remix.config.js (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/09-no-entry-pnpm/remix.env.d.ts (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/09-no-entry-pnpm/server.js (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/09-no-entry-pnpm/tsconfig.json (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/10-hydrogen-2/.gitignore (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/10-hydrogen-2/.graphqlrc.yml (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/10-hydrogen-2/README.md (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/10-hydrogen-2/app/components/Aside.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/10-hydrogen-2/app/components/Cart.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/10-hydrogen-2/app/components/Footer.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/10-hydrogen-2/app/components/Header.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/10-hydrogen-2/app/components/Layout.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/10-hydrogen-2/app/components/Search.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/10-hydrogen-2/app/entry.client.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/10-hydrogen-2/app/entry.server.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/10-hydrogen-2/app/root.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/10-hydrogen-2/app/routes/$.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/10-hydrogen-2/app/routes/[robots.txt].tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/10-hydrogen-2/app/routes/[sitemap.xml].tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/10-hydrogen-2/app/routes/_index.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/10-hydrogen-2/app/routes/account.$.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/10-hydrogen-2/app/routes/account.addresses.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/10-hydrogen-2/app/routes/account.orders.$id.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/10-hydrogen-2/app/routes/account.orders._index.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/10-hydrogen-2/app/routes/account.profile.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/10-hydrogen-2/app/routes/account.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/10-hydrogen-2/app/routes/account_.activate.$id.$activationToken.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/10-hydrogen-2/app/routes/account_.login.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/10-hydrogen-2/app/routes/account_.logout.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/10-hydrogen-2/app/routes/account_.recover.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/10-hydrogen-2/app/routes/account_.register.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/10-hydrogen-2/app/routes/account_.reset.$id.$resetToken.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/10-hydrogen-2/app/routes/api.predictive-search.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/10-hydrogen-2/app/routes/blogs.$blogHandle.$articleHandle.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/10-hydrogen-2/app/routes/blogs.$blogHandle._index.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/10-hydrogen-2/app/routes/blogs._index.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/10-hydrogen-2/app/routes/cart.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/10-hydrogen-2/app/routes/collections.$handle.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/10-hydrogen-2/app/routes/collections._index.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/10-hydrogen-2/app/routes/pages.$handle.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/10-hydrogen-2/app/routes/policies.$handle.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/10-hydrogen-2/app/routes/policies._index.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/10-hydrogen-2/app/routes/products.$handle.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/10-hydrogen-2/app/routes/search.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/10-hydrogen-2/app/styles/app.css (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/10-hydrogen-2/app/styles/reset.css (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/10-hydrogen-2/app/utils.ts (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/10-hydrogen-2/package.json (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/10-hydrogen-2/pnpm-lock.yaml (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/10-hydrogen-2/probes.json (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/10-hydrogen-2/public/favicon.svg (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/10-hydrogen-2/remix.config.js (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/10-hydrogen-2/remix.env.d.ts (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/10-hydrogen-2/server.ts (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/10-hydrogen-2/storefrontapi.generated.d.ts (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/10-hydrogen-2/tsconfig.json (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/11-hydrogen-2-js/.gitignore (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/11-hydrogen-2-js/.graphqlrc.yml (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/11-hydrogen-2-js/README.md (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/11-hydrogen-2-js/app/components/Aside.jsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/11-hydrogen-2-js/app/components/Cart.jsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/11-hydrogen-2-js/app/components/Footer.jsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/11-hydrogen-2-js/app/components/Header.jsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/11-hydrogen-2-js/app/components/Layout.jsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/11-hydrogen-2-js/app/components/Search.jsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/11-hydrogen-2-js/app/entry.client.jsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/11-hydrogen-2-js/app/entry.server.jsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/11-hydrogen-2-js/app/root.jsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/11-hydrogen-2-js/app/routes/$.jsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/11-hydrogen-2-js/app/routes/[robots.txt].jsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/11-hydrogen-2-js/app/routes/[sitemap.xml].jsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/11-hydrogen-2-js/app/routes/_index.jsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/11-hydrogen-2-js/app/routes/account.$.jsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/11-hydrogen-2-js/app/routes/account.addresses.jsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/11-hydrogen-2-js/app/routes/account.jsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/11-hydrogen-2-js/app/routes/account.orders.$id.jsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/11-hydrogen-2-js/app/routes/account.orders._index.jsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/11-hydrogen-2-js/app/routes/account.profile.jsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/11-hydrogen-2-js/app/routes/account_.activate.$id.$activationToken.jsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/11-hydrogen-2-js/app/routes/account_.login.jsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/11-hydrogen-2-js/app/routes/account_.logout.jsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/11-hydrogen-2-js/app/routes/account_.recover.jsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/11-hydrogen-2-js/app/routes/account_.register.jsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/11-hydrogen-2-js/app/routes/account_.reset.$id.$resetToken.jsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/11-hydrogen-2-js/app/routes/api.predictive-search.jsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/11-hydrogen-2-js/app/routes/blogs.$blogHandle.$articleHandle.jsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/11-hydrogen-2-js/app/routes/blogs.$blogHandle._index.jsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/11-hydrogen-2-js/app/routes/blogs._index.jsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/11-hydrogen-2-js/app/routes/cart.jsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/11-hydrogen-2-js/app/routes/collections.$handle.jsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/11-hydrogen-2-js/app/routes/collections._index.jsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/11-hydrogen-2-js/app/routes/pages.$handle.jsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/11-hydrogen-2-js/app/routes/policies.$handle.jsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/11-hydrogen-2-js/app/routes/policies._index.jsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/11-hydrogen-2-js/app/routes/products.$handle.jsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/11-hydrogen-2-js/app/routes/search.jsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/11-hydrogen-2-js/app/styles/app.css (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/11-hydrogen-2-js/app/styles/reset.css (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/11-hydrogen-2-js/app/utils.js (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/11-hydrogen-2-js/jsconfig.json (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/11-hydrogen-2-js/package.json (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/11-hydrogen-2-js/pnpm-lock.yaml (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/11-hydrogen-2-js/probes.json (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/11-hydrogen-2-js/public/favicon.svg (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/11-hydrogen-2-js/remix.config.js (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/11-hydrogen-2-js/server.js (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/12-remix-v2/.gitignore (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/12-remix-v2/README.md (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/12-remix-v2/app/root.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/12-remix-v2/app/routes/_index.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/12-remix-v2/app/routes/edge.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/12-remix-v2/package.json (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/12-remix-v2/pnpm-lock.yaml (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/12-remix-v2/probes.json (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/12-remix-v2/public/favicon.ico (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/12-remix-v2/public/remix.svg (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/12-remix-v2/remix.config.js (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/12-remix-v2/remix.env.d.ts (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/12-remix-v2/tsconfig.json (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/13-remix-v2-public-path/.gitignore (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/13-remix-v2-public-path/common/private.txt (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/13-remix-v2-public-path/misc/private.txt (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/13-remix-v2-public-path/probes.json (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/13-remix-v2-public-path/site/app/root.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/13-remix-v2-public-path/site/app/routes/_index.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/13-remix-v2-public-path/site/app/routes/blog.$slug.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/13-remix-v2-public-path/site/app/routes/edge.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/13-remix-v2-public-path/site/package-lock.json (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/13-remix-v2-public-path/site/package.json (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/13-remix-v2-public-path/site/public/favicon.ico (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/13-remix-v2-public-path/site/public/hello.txt (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/13-remix-v2-public-path/site/remix.config.js (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/13-remix-v2-public-path/site/remix.env.d.ts (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/13-remix-v2-public-path/tsconfig.json (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/13-remix-v2-public-path/vercel.json (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/14-node-linker-hoisted/.gitignore (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/14-node-linker-hoisted/.npmrc (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/14-node-linker-hoisted/.prettierignore (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/14-node-linker-hoisted/.prettierrc (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/14-node-linker-hoisted/apps/remix/.eslintrc.commit.js (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/14-node-linker-hoisted/apps/remix/.eslintrc.js (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/14-node-linker-hoisted/apps/remix/.gitignore (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/14-node-linker-hoisted/apps/remix/app/root.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/14-node-linker-hoisted/apps/remix/app/routes/_index.tsx (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/14-node-linker-hoisted/apps/remix/package.json (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/14-node-linker-hoisted/apps/remix/public/favicon.ico (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/14-node-linker-hoisted/apps/remix/remix.config.js (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/14-node-linker-hoisted/apps/remix/remix.env.d.ts (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/14-node-linker-hoisted/apps/remix/tsconfig.json (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/14-node-linker-hoisted/apps/remix/vercel.json (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/14-node-linker-hoisted/package.json (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/14-node-linker-hoisted/pnpm-lock.yaml (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/14-node-linker-hoisted/pnpm-workspace.yaml (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/14-node-linker-hoisted/probes.json (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/14-node-linker-hoisted/tsconfig.json (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/14-node-linker-hoisted/turbo.json (100%) rename packages/remix/test/{fixtures => fixtures-legacy}/14-node-linker-hoisted/vercel.json (100%) create mode 100644 packages/remix/test/fixtures-vite/01-no-preset/.eslintrc.cjs create mode 100644 packages/remix/test/fixtures-vite/01-no-preset/.gitignore create mode 100644 packages/remix/test/fixtures-vite/01-no-preset/README.md create mode 100644 packages/remix/test/fixtures-vite/01-no-preset/app/root.tsx create mode 100644 packages/remix/test/fixtures-vite/01-no-preset/app/routes/_index.tsx create mode 100644 packages/remix/test/fixtures-vite/01-no-preset/env.d.ts create mode 100644 packages/remix/test/fixtures-vite/01-no-preset/package.json create mode 100644 packages/remix/test/fixtures-vite/01-no-preset/probes.json create mode 100644 packages/remix/test/fixtures-vite/01-no-preset/public/favicon.ico create mode 100644 packages/remix/test/fixtures-vite/01-no-preset/tsconfig.json create mode 100644 packages/remix/test/fixtures-vite/01-no-preset/vercel.json create mode 100644 packages/remix/test/fixtures-vite/01-no-preset/vite.config.ts create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/.eslintrc.cjs create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/.gitignore create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/LICENSE create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/README.md create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/Breadcrumbs/Breadcrumbs.tsx create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/Breadcrumbs/index.tsx create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/Header/Header.tsx create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/Header/index.tsx create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/RemixLogo/RemixLogo.tsx create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/RemixLogo/index.tsx create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/Sidebar/Sidebar.tsx create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/Sidebar/TreeStructure/NodeIcon/NodeIcon.tsx create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/Sidebar/TreeStructure/NodeIcon/index.tsx create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/Sidebar/TreeStructure/TreeStructure.tsx create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/Sidebar/TreeStructure/index.tsx create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/Sidebar/index.tsx create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/icons/ChevronRightIcon/ChevronRightIcon.tsx create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/icons/ChevronRightIcon/index.tsx create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/icons/FolderIcon/FolderIcon.tsx create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/icons/FolderIcon/index.tsx create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/icons/GithubIcon/GithubIcon.tsx create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/icons/GithubIcon/index.tsx create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/icons/MoonIcon/MoonIcon.tsx create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/icons/MoonIcon/index.tsx create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/icons/SunIcon/SunIcon.tsx create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/icons/SunIcon/index.tsx create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/wrappers/LayoutWrapper/LayoutWrapper.tsx create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/wrappers/LayoutWrapper/index.tsx create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/wrappers/RouteWrapper/RouteWrapper.tsx create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/wrappers/RouteWrapper/index.tsx create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/basicRoutes/basicRoutes.tsx create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/basicRoutes/index.tsx create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/dotDelimeters/dotDelimeters.tsx create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/dotDelimeters/index.tsx create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/dynamicSegments/dynamicSegments.tsx create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/dynamicSegments/index.tsx create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/folderOrganization/folderOrganization.tsx create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/folderOrganization/index.tsx create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/index.tsx create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/nestedRoutes/index.tsx create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/nestedRoutes/nestedRoutes.tsx create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/nestedWOlayout/index.tsx create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/nestedWOlayout/nestedWOlayout.tsx create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/optionalSegments/index.tsx create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/optionalSegments/optionalSegments.tsx create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/pathlessRoutes/index.tsx create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/pathlessRoutes/pathlessRoutes.tsx create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/routes.tsx create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/specialCharacters/index.tsx create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/specialCharacters/specialCharacters.tsx create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/splatRoutes/index.tsx create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/splatRoutes/splatRoutes.tsx create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/root.tsx create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/[[so-weird]].tsx create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/[sitemap2.xml].tsx create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/_auth.login.tsx create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/_auth.register.tsx create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/_auth.tsx create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/_index.tsx create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/about.tsx create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/actors.$actorName.tsx create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/actors._index.tsx create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/actors.trending.tsx create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/actors.tsx create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/actors_.favourites.tsx create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/concerts.salt-lake-city.tsx create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/concerts.san-diego.tsx create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/concerts.trending.tsx create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/dolla-bills-[$].tsx create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/files.$.tsx create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/movies.$movieName.tsx create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/movies.trending.tsx create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/products.($lang).$productId.tsx create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/products.($lang)._index.tsx create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/products.($lang).categories.tsx create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/sitemap[.]xml.tsx create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/weird-url.[_index].tsx create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/styles.css create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/tailwind.css create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/types/tree/index.tsx create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/types/tree/tree.tsx create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/utils/generateMeta/generateMeta.tsx create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/utils/generateMeta/index.tsx create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/env.d.ts create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/package-lock.json create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/package.json create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/probes.json create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/public/favicon.ico create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/public/og.png create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/tailwind.config.js create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/tsconfig.json create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/vercel.json create mode 100644 packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/vite.config.ts create mode 100644 packages/remix/test/integration-legacy.test.ts rename packages/remix/test/{integration.test.ts => integration-vite.test.ts} (93%) diff --git a/.changeset/metal-tips-decide.md b/.changeset/metal-tips-decide.md new file mode 100644 index 000000000..9601b0d8a --- /dev/null +++ b/.changeset/metal-tips-decide.md @@ -0,0 +1,5 @@ +--- +'@vercel/remix-builder': minor +--- + +Remix Vite plugin support diff --git a/.changeset/sour-cameras-eat.md b/.changeset/sour-cameras-eat.md new file mode 100644 index 000000000..384e746cb --- /dev/null +++ b/.changeset/sour-cameras-eat.md @@ -0,0 +1,6 @@ +--- +'@vercel/frameworks': major +'@vercel/fs-detectors': minor +--- + +Make "remix" framework preset supersede "vite" diff --git a/.eslintignore b/.eslintignore index e8f425f2a..fcd8af2e9 100644 --- a/.eslintignore +++ b/.eslintignore @@ -38,7 +38,7 @@ packages/static-build/test/cache-fixtures packages/redwood/test/fixtures # remix -packages/remix/test/fixtures +packages/remix/test/fixtures-* # gatsby-plugin-vercel-analytics packages/gatsby-plugin-vercel-analytics diff --git a/.prettierignore b/.prettierignore index 16b1285b0..82b390fa3 100644 --- a/.prettierignore +++ b/.prettierignore @@ -29,6 +29,7 @@ turbo-cache-key.json packages/*/dist packages/*/node_modules packages/**/test/fixtures +packages/**/test/fixtures-* packages/**/test/dev/fixtures packages/**/test/build-fixtures packages/**/test/cache-fixtures diff --git a/packages/frameworks/src/frameworks.ts b/packages/frameworks/src/frameworks.ts index c83ee7753..0f38649d9 100644 --- a/packages/frameworks/src/frameworks.ts +++ b/packages/frameworks/src/frameworks.ts @@ -202,11 +202,14 @@ export const frameworks = [ description: 'A new Remix app — the result of running `npx create-remix`.', website: 'https://remix.run', sort: 6, - supersedes: 'hydrogen', + supersedes: ['hydrogen', 'vite'], useRuntime: { src: 'package.json', use: '@vercel/remix-builder' }, ignoreRuntimes: ['@vercel/node'], detectors: { some: [ + { + matchPackage: '@remix-run/dev', + }, { path: 'remix.config.js', }, @@ -1734,7 +1737,7 @@ export const frameworks = [ tagline: 'React framework for headless commerce', description: 'React framework for headless commerce', website: 'https://hydrogen.shopify.dev', - supersedes: 'vite', + supersedes: ['vite'], useRuntime: { src: 'package.json', use: '@vercel/hydrogen' }, envPrefix: 'PUBLIC_', detectors: { diff --git a/packages/frameworks/src/types.ts b/packages/frameworks/src/types.ts index 1e2059a4d..81296ad5d 100644 --- a/packages/frameworks/src/types.ts +++ b/packages/frameworks/src/types.ts @@ -220,7 +220,7 @@ export interface Framework { */ defaultVersion?: string; /** - * Slug of another framework preset in which this framework supersedes. + * Array of slugs for other framework presets which this framework supersedes. */ - supersedes?: string; + supersedes?: string[]; } diff --git a/packages/frameworks/test/frameworks.unit.test.ts b/packages/frameworks/test/frameworks.unit.test.ts index ae1ff1e37..f85a9d916 100644 --- a/packages/frameworks/test/frameworks.unit.test.ts +++ b/packages/frameworks/test/frameworks.unit.test.ts @@ -199,7 +199,7 @@ const Schema = { dependency: { type: 'string' }, cachePattern: { type: 'string' }, defaultVersion: { type: 'string' }, - supersedes: { type: 'string' }, + supersedes: { type: 'array', items: { type: 'string' } }, }, }, }; diff --git a/packages/fs-detectors/src/detect-framework.ts b/packages/fs-detectors/src/detect-framework.ts index c48111d6d..4f32bfe1e 100644 --- a/packages/fs-detectors/src/detect-framework.ts +++ b/packages/fs-detectors/src/detect-framework.ts @@ -143,7 +143,9 @@ function removeSupersededFramework( const framework = matches[index]; if (framework) { if (framework.supersedes) { - removeSupersededFramework(matches, framework.supersedes); + for (const slug of framework.supersedes) { + removeSupersededFramework(matches, slug); + } } matches.splice(index, 1); } @@ -154,7 +156,9 @@ export function removeSupersededFrameworks( ) { for (const match of matches.slice()) { if (match?.supersedes) { - removeSupersededFramework(matches, match.supersedes); + for (const slug of match.supersedes) { + removeSupersededFramework(matches, slug); + } } } } diff --git a/packages/fs-detectors/test/unit.framework-detector.test.ts b/packages/fs-detectors/test/unit.framework-detector.test.ts index ffada143c..4e0837d69 100644 --- a/packages/fs-detectors/test/unit.framework-detector.test.ts +++ b/packages/fs-detectors/test/unit.framework-detector.test.ts @@ -166,12 +166,12 @@ describe('removeSupersededFrameworks()', () => { const matches = [ { slug: 'storybook' }, { slug: 'vite' }, - { slug: 'hydrogen', supersedes: 'vite' }, + { slug: 'hydrogen', supersedes: ['vite'] }, ]; removeSupersededFrameworks(matches); expect(matches).toEqual([ { slug: 'storybook' }, - { slug: 'hydrogen', supersedes: 'vite' }, + { slug: 'hydrogen', supersedes: ['vite'] }, ]); }); @@ -179,13 +179,13 @@ describe('removeSupersededFrameworks()', () => { const matches = [ { slug: 'storybook' }, { slug: 'vite' }, - { slug: 'hydrogen', supersedes: 'vite' }, - { slug: 'remix', supersedes: 'hydrogen' }, + { slug: 'hydrogen', supersedes: ['vite'] }, + { slug: 'remix', supersedes: ['hydrogen'] }, ]; removeSupersededFrameworks(matches); expect(matches).toEqual([ { slug: 'storybook' }, - { slug: 'remix', supersedes: 'hydrogen' }, + { slug: 'remix', supersedes: ['hydrogen'] }, ]); }); }); @@ -442,6 +442,20 @@ describe('detectFramework()', () => { expect(await detectFramework({ fs, frameworkList })).toBe('storybook'); }); + + it('Should detect Remix + Vite as `remix`', async () => { + const fs = new VirtualFilesystem({ + 'vite.config.ts': '', + 'package.json': JSON.stringify({ + dependencies: { + '@remix-run/dev': 'latest', + vite: 'latest', + }, + }), + }); + + expect(await detectFramework({ fs, frameworkList })).toBe('remix'); + }); }); describe('detectFrameworks()', () => { @@ -497,6 +511,23 @@ describe('detectFrameworks()', () => { expect(slugs).toEqual(['nextjs', 'storybook']); }); + it('Should detect Remix + Vite as `remix`', async () => { + const fs = new VirtualFilesystem({ + 'vite.config.ts': '', + 'package.json': JSON.stringify({ + dependencies: { + '@remix-run/dev': 'latest', + vite: 'latest', + }, + }), + }); + + const slugs = (await detectFrameworks({ fs, frameworkList })).map( + f => f.slug + ); + expect(slugs).toEqual(['remix']); + }); + it('Should detect "hydrogen" template as `hydrogen`', async () => { const fs = new LocalFileSystemDetector(join(EXAMPLES_DIR, 'hydrogen')); diff --git a/packages/remix/package.json b/packages/remix/package.json index 27b625959..477e39aa8 100644 --- a/packages/remix/package.json +++ b/packages/remix/package.json @@ -4,6 +4,7 @@ "license": "Apache-2.0", "main": "./dist/index.js", "homepage": "https://vercel.com/docs", + "sideEffects": false, "repository": { "type": "git", "url": "https://github.com/vercel/vercel.git", @@ -13,7 +14,7 @@ "build": "node ../../utils/build-builder.mjs", "test": "jest --reporters=default --reporters=jest-junit --env node --verbose --bail --runInBand", "test-unit": "pnpm test test/unit.*test.*", - "test-e2e": "pnpm test test/integration.test.ts", + "test-e2e": "pnpm test test/integration-*.test.ts", "type-check": "tsc --noEmit" }, "files": [ @@ -21,6 +22,7 @@ "defaults" ], "dependencies": { + "@vercel/error-utils": "2.0.2", "@vercel/nft": "0.26.4", "@vercel/static-config": "3.0.0", "ts-morph": "12.0.0" diff --git a/packages/remix/src/build-legacy.ts b/packages/remix/src/build-legacy.ts new file mode 100644 index 000000000..7a7475b16 --- /dev/null +++ b/packages/remix/src/build-legacy.ts @@ -0,0 +1,814 @@ +import { Project } from 'ts-morph'; +import { readFileSync, promises as fs, existsSync } from 'fs'; +import { basename, dirname, extname, join, posix, relative, sep } from 'path'; +import { + debug, + download, + execCommand, + FileBlob, + FileFsRef, + getEnvForPackageManager, + getNodeVersion, + getSpawnOptions, + glob, + EdgeFunction, + NodejsLambda, + rename, + runNpmInstall, + runPackageJsonScript, + scanParentDirs, +} from '@vercel/build-utils'; +import { getConfig } from '@vercel/static-config'; +import { nodeFileTrace } from '@vercel/nft'; +import type { + BuildV2, + Files, + NodeVersion, + PackageJson, + BuildResultV2Typical, +} from '@vercel/build-utils'; +import type { ConfigRoute } from '@remix-run/dev/dist/config/routes'; +import type { BaseFunctionConfig } from '@vercel/static-config'; +import { + calculateRouteConfigHash, + findConfig, + getPathFromRoute, + getRegExpFromPath, + getResolvedRouteConfig, + isLayoutRoute, + ResolvedRouteConfig, + ResolvedNodeRouteConfig, + ResolvedEdgeRouteConfig, + findEntry, + chdirAndReadConfig, + resolveSemverMinMax, + ensureResolvable, + isESM, +} from './utils'; +import { patchHydrogenServer } from './hydrogen'; + +interface ServerBundle { + serverBuildPath: string; + routes: string[]; +} + +const remixBuilderPkg = JSON.parse( + readFileSync(join(__dirname, '../package.json'), 'utf8') +); +const remixRunDevForkVersion = + remixBuilderPkg.devDependencies['@remix-run/dev']; + +const DEFAULTS_PATH = join(__dirname, '../defaults'); + +const edgeServerSrcPromise = fs.readFile( + join(DEFAULTS_PATH, 'server-edge.mjs'), + 'utf-8' +); +const nodeServerSrcPromise = fs.readFile( + join(DEFAULTS_PATH, 'server-node.mjs'), + 'utf-8' +); + +// Minimum supported version of the `@vercel/remix` package +const VERCEL_REMIX_MIN_VERSION = '1.10.0'; + +// Minimum supported version of the `@vercel/remix-run-dev` forked compiler +const REMIX_RUN_DEV_MIN_VERSION = '1.15.0'; + +// Maximum version of `@vercel/remix-run-dev` fork +// (and also `@vercel/remix` since they get published at the same time) +const REMIX_RUN_DEV_MAX_VERSION = remixRunDevForkVersion.slice( + remixRunDevForkVersion.lastIndexOf('@') + 1 +); + +export const build: BuildV2 = async ({ + entrypoint, + files, + workPath, + repoRootPath, + config, + meta = {}, +}) => { + const { installCommand, buildCommand } = config; + + await download(files, workPath, meta); + + const mountpoint = dirname(entrypoint); + const entrypointFsDirname = join(workPath, mountpoint); + + // Run "Install Command" + const nodeVersion = await getNodeVersion( + entrypointFsDirname, + undefined, + config, + meta + ); + + const { cliType, packageJsonPath, lockfileVersion, lockfilePath } = + await scanParentDirs(entrypointFsDirname); + + if (!packageJsonPath) { + throw new Error('Failed to locate `package.json` file in your project'); + } + + const [lockfileRaw, pkgRaw] = await Promise.all([ + lockfilePath ? fs.readFile(lockfilePath) : null, + fs.readFile(packageJsonPath, 'utf8'), + ]); + const pkg = JSON.parse(pkgRaw); + + const spawnOpts = getSpawnOptions(meta, nodeVersion); + if (!spawnOpts.env) { + spawnOpts.env = {}; + } + + spawnOpts.env = getEnvForPackageManager({ + cliType, + lockfileVersion, + nodeVersion, + env: spawnOpts.env, + }); + + if (typeof installCommand === 'string') { + if (installCommand.trim()) { + console.log(`Running "install" command: \`${installCommand}\`...`); + await execCommand(installCommand, { + ...spawnOpts, + cwd: entrypointFsDirname, + }); + } else { + console.log(`Skipping "install" command...`); + } + } else { + await runNpmInstall(entrypointFsDirname, [], spawnOpts, meta, nodeVersion); + } + + const isHydrogen2 = Boolean( + pkg.dependencies?.['@shopify/remix-oxygen'] || + pkg.devDependencies?.['@shopify/remix-oxygen'] + ); + + // Determine the version of Remix based on the `@remix-run/dev` + // package version. + const remixRunDevPath = await ensureResolvable( + entrypointFsDirname, + repoRootPath, + '@remix-run/dev' + ); + const remixRunDevPkg = JSON.parse( + readFileSync(join(remixRunDevPath, 'package.json'), 'utf8') + ); + const remixVersion = remixRunDevPkg.version; + + const remixConfig = await chdirAndReadConfig( + remixRunDevPath, + entrypointFsDirname, + packageJsonPath + ); + const { serverEntryPoint, appDirectory } = remixConfig; + const remixRoutes = Object.values(remixConfig.routes); + + let depsModified = false; + + const remixRunDevPkgVersion: string | undefined = + pkg.dependencies?.['@remix-run/dev'] || + pkg.devDependencies?.['@remix-run/dev']; + + const serverBundlesMap = new Map(); + const resolvedConfigsMap = new Map(); + + // Read the `export const config` (if any) for each route + const project = new Project(); + const staticConfigsMap = new Map(); + for (const route of remixRoutes) { + const routePath = join(remixConfig.appDirectory, route.file); + let staticConfig = getConfig(project, routePath); + if (staticConfig && isHydrogen2) { + console.log( + 'WARN: `export const config` is currently not supported for Hydrogen v2 apps' + ); + staticConfig = null; + } + staticConfigsMap.set(route, staticConfig); + } + + for (const route of remixRoutes) { + const config = getResolvedRouteConfig( + route, + remixConfig.routes, + staticConfigsMap, + isHydrogen2 + ); + resolvedConfigsMap.set(route, config); + } + + // Figure out which routes belong to which server bundles + // based on having common static config properties + for (const route of remixRoutes) { + if (isLayoutRoute(route.id, remixRoutes)) continue; + + const config = resolvedConfigsMap.get(route); + if (!config) { + throw new Error(`Expected resolved config for "${route.id}"`); + } + const hash = calculateRouteConfigHash(config); + + let routesForHash = serverBundlesMap.get(hash); + if (!Array.isArray(routesForHash)) { + routesForHash = []; + serverBundlesMap.set(hash, routesForHash); + } + + routesForHash.push(route); + } + + let serverBundles: ServerBundle[] = Array.from( + serverBundlesMap.entries() + ).map(([hash, routes]) => { + const runtime = resolvedConfigsMap.get(routes[0])?.runtime ?? 'nodejs'; + return { + serverBuildPath: isHydrogen2 + ? relative(entrypointFsDirname, remixConfig.serverBuildPath) + : `${relative( + entrypointFsDirname, + dirname(remixConfig.serverBuildPath) + )}/build-${runtime}-${hash}.js`, + routes: routes.map(r => r.id), + }; + }); + + // If the project is *not* relying on split configurations, then set + // the `serverBuildPath` to the default Remix path, since the forked + // Remix compiler will not be used + if (!isHydrogen2 && serverBundles.length === 1) { + // `serverBuildTarget` and `serverBuildPath` are undefined with + // our remix config modifications, so use the default build path + serverBundles[0].serverBuildPath = 'build/index.js'; + } + + // If the project is relying on split configurations, then override + // the official `@remix-run/dev` package with the Vercel fork, + // which supports the `serverBundles` config + if ( + serverBundles.length > 1 && + !isHydrogen2 && + remixRunDevPkg.name !== '@vercel/remix-run-dev' && + !remixRunDevPkgVersion?.startsWith('https:') + ) { + const remixDevForkVersion = resolveSemverMinMax( + REMIX_RUN_DEV_MIN_VERSION, + REMIX_RUN_DEV_MAX_VERSION, + remixVersion + ); + // Remove `@remix-run/dev`, add `@vercel/remix-run-dev` + if (pkg.devDependencies['@remix-run/dev']) { + delete pkg.devDependencies['@remix-run/dev']; + pkg.devDependencies['@vercel/remix-run-dev'] = remixDevForkVersion; + } else { + delete pkg.dependencies['@remix-run/dev']; + pkg.dependencies['@vercel/remix-run-dev'] = remixDevForkVersion; + } + depsModified = true; + } + + // `app/entry.server.tsx` and `app/entry.client.tsx` are optional in Remix, + // so if either of those files are missing then add our own versions. + const userEntryServerFile = findEntry(appDirectory, 'entry.server'); + if (!userEntryServerFile) { + await fs.copyFile( + join(DEFAULTS_PATH, 'entry.server.jsx'), + join(appDirectory, 'entry.server.jsx') + ); + if (!pkg.dependencies['@vercel/remix']) { + // Dependency version resolution logic + // 1. Users app is on 1.9.0 -> we install the 1.10.0 (minimum) version of `@vercel/remix`. + // 2. Users app is on 1.11.0 (a version greater than 1.10.0 and less than the known max + // published version) -> we install the (matching) 1.11.0 version of `@vercel/remix`. + // 3. Users app is on something greater than our latest version of the fork -> we install + // the latest known published version of `@vercel/remix`. + const vercelRemixVersion = resolveSemverMinMax( + VERCEL_REMIX_MIN_VERSION, + REMIX_RUN_DEV_MAX_VERSION, + remixVersion + ); + pkg.dependencies['@vercel/remix'] = vercelRemixVersion; + depsModified = true; + } + } + + if (depsModified) { + await fs.writeFile(packageJsonPath, JSON.stringify(pkg, null, 2) + '\n'); + + // Bypass `--frozen-lockfile` enforcement by removing + // env vars that are considered to be CI + const nonCiEnv = { ...spawnOpts.env }; + delete nonCiEnv.CI; + delete nonCiEnv.VERCEL; + delete nonCiEnv.NOW_BUILDER; + + // Purposefully not passing `meta` here to avoid + // the optimization that prevents `npm install` + // from running a second time + await runNpmInstall( + entrypointFsDirname, + [], + { + ...spawnOpts, + env: nonCiEnv, + }, + undefined, + nodeVersion + ); + } + + const userEntryClientFile = findEntry( + remixConfig.appDirectory, + 'entry.client' + ); + if (!userEntryClientFile) { + await fs.copyFile( + join(DEFAULTS_PATH, 'entry.client.react.jsx'), + join(appDirectory, 'entry.client.jsx') + ); + } + + let remixConfigWrapped = false; + let serverEntryPointAbs: string | undefined; + let originalServerEntryPoint: string | undefined; + const remixConfigPath = findConfig(entrypointFsDirname, 'remix.config'); + const renamedRemixConfigPath = remixConfigPath + ? `${remixConfigPath}.original${extname(remixConfigPath)}` + : undefined; + + try { + // We need to patch the `remix.config.js` file to force some values necessary + // for a build that works on either Node.js or the Edge runtime + if (!isHydrogen2 && remixConfigPath && renamedRemixConfigPath) { + await fs.rename(remixConfigPath, renamedRemixConfigPath); + + let patchedConfig: string; + // Figure out if the `remix.config` file is using ESM syntax + if (isESM(renamedRemixConfigPath)) { + patchedConfig = `import config from './${basename( + renamedRemixConfigPath + )}'; +config.serverBuildTarget = undefined; +config.serverModuleFormat = '${pkg.type === 'module' ? 'esm' : 'cjs'}'; +config.serverPlatform = 'node'; +config.serverBuildPath = undefined; +config.serverBundles = ${JSON.stringify(serverBundles)}; +export default config;`; + } else { + patchedConfig = `const config = require('./${basename( + renamedRemixConfigPath + )}'); +config.serverBuildTarget = undefined; +config.serverModuleFormat = '${pkg.type === 'module' ? 'esm' : 'cjs'}'; +config.serverPlatform = 'node'; +config.serverBuildPath = undefined; +config.serverBundles = ${JSON.stringify(serverBundles)}; +module.exports = config;`; + } + await fs.writeFile(remixConfigPath, patchedConfig); + remixConfigWrapped = true; + } + + // For Hydrogen v2, patch the `server.ts` file to be Vercel-compatible + if (isHydrogen2) { + if (remixConfig.serverEntryPoint) { + serverEntryPointAbs = join( + entrypointFsDirname, + remixConfig.serverEntryPoint + ); + originalServerEntryPoint = await fs.readFile( + serverEntryPointAbs, + 'utf8' + ); + const patchedServerEntryPoint = patchHydrogenServer( + project, + serverEntryPointAbs + ); + if (patchedServerEntryPoint) { + debug( + `Patched Hydrogen server file: ${remixConfig.serverEntryPoint}` + ); + await fs.writeFile(serverEntryPointAbs, patchedServerEntryPoint); + } + } else { + console.log('WARN: No "server" field found in Remix config'); + } + } + + // Make `remix build` output production mode + spawnOpts.env.NODE_ENV = 'production'; + + // Run "Build Command" + if (buildCommand) { + debug(`Executing build command "${buildCommand}"`); + await execCommand(buildCommand, { + ...spawnOpts, + cwd: entrypointFsDirname, + }); + } else { + if (hasScript('vercel-build', pkg)) { + debug(`Executing "yarn vercel-build"`); + await runPackageJsonScript( + entrypointFsDirname, + 'vercel-build', + spawnOpts + ); + } else if (hasScript('build', pkg)) { + debug(`Executing "yarn build"`); + await runPackageJsonScript(entrypointFsDirname, 'build', spawnOpts); + } else { + await execCommand('remix build', { + ...spawnOpts, + cwd: entrypointFsDirname, + }); + } + } + } finally { + const cleanupOps: Promise[] = []; + // Clean up our patched `remix.config.js` to be polite + if (remixConfigWrapped && remixConfigPath && renamedRemixConfigPath) { + cleanupOps.push( + fs + .rename(renamedRemixConfigPath, remixConfigPath) + .then(() => debug(`Restored original "${remixConfigPath}" file`)) + ); + } + // Restore original server entrypoint if it was modified (for Hydrogen v2) + if (serverEntryPointAbs && originalServerEntryPoint) { + cleanupOps.push( + fs + .writeFile(serverEntryPointAbs, originalServerEntryPoint) + .then(() => debug(`Restored original "${serverEntryPointAbs}" file`)) + ); + } + // Restore original `package.json` file and lockfile + if (depsModified) { + cleanupOps.push( + fs + .writeFile(packageJsonPath, pkgRaw) + .then(() => debug(`Restored original "${packageJsonPath}" file`)) + ); + if (lockfilePath && lockfileRaw) { + cleanupOps.push( + fs + .writeFile(lockfilePath, lockfileRaw) + .then(() => debug(`Restored original "${lockfilePath}" file`)) + ); + } + } + await Promise.all(cleanupOps); + } + + // This needs to happen before we run NFT to create the Node/Edge functions + await Promise.all([ + ensureResolvable( + entrypointFsDirname, + repoRootPath, + '@remix-run/server-runtime' + ), + !isHydrogen2 + ? ensureResolvable(entrypointFsDirname, repoRootPath, '@remix-run/node') + : null, + ]); + + const staticDir = join(entrypointFsDirname, 'public'); + + // Do a sanity check to ensure that the server bundles `serverBuildPath` was actually created. + // If it was not, then that usually means the Vercel forked Remix compiler was not used and + // thus only a singular server bundle was produced. + const serverBundlesRespected = existsSync( + join(entrypointFsDirname, serverBundles[0].serverBuildPath) + ); + if (!serverBundlesRespected) { + console.warn( + 'WARN: `serverBundles` configuration failed. Falling back to a singular server bundle.' + ); + serverBundles = [ + { + serverBuildPath: 'build/index.js', + routes: serverBundles.flatMap(b => b.routes), + }, + ]; + } + + const [staticFiles, buildAssets, ...functions] = await Promise.all([ + glob('**', staticDir), + glob('**', remixConfig.assetsBuildDirectory), + ...serverBundles.map(bundle => { + const firstRoute = remixConfig.routes[bundle.routes[0]]; + const config = resolvedConfigsMap.get(firstRoute) ?? { + runtime: 'nodejs', + }; + const serverBuildPath = join(entrypointFsDirname, bundle.serverBuildPath); + + if (config.runtime === 'edge') { + return createRenderEdgeFunction( + entrypointFsDirname, + repoRootPath, + serverBuildPath, + serverEntryPoint, + remixVersion, + config + ); + } + + return createRenderNodeFunction( + nodeVersion, + entrypointFsDirname, + repoRootPath, + serverBuildPath, + serverEntryPoint, + remixVersion, + config + ); + }), + ]); + + const transformedBuildAssets = rename(buildAssets, name => { + return posix.join('./', remixConfig.publicPath, name); + }); + + const output: BuildResultV2Typical['output'] = { + ...staticFiles, + ...transformedBuildAssets, + }; + const routes: any[] = [ + { + src: `^/${remixConfig.publicPath.replace(/^\/|\/$/g, '')}/(.*)$`, + headers: { 'cache-control': 'public, max-age=31536000, immutable' }, + continue: true, + }, + { + handle: 'filesystem', + }, + ]; + + for (const route of remixRoutes) { + // Layout routes don't get a function / route added + if (isLayoutRoute(route.id, remixRoutes)) continue; + + const { path, rePath } = getPathFromRoute(route, remixConfig.routes); + + // If the route is a pathless layout route (at the root level) + // and doesn't have any sub-routes, then a function should not be created. + if (!path) { + continue; + } + + const funcIndex = serverBundles.findIndex(bundle => { + return bundle.routes.includes(route.id); + }); + const func = functions[funcIndex]; + + if (!func) { + throw new Error(`Could not determine server bundle for "${route.id}"`); + } + + output[path] = func; + + // If this is a dynamic route then add a Vercel route + const re = getRegExpFromPath(rePath); + if (re) { + routes.push({ + src: re.source, + dest: path, + }); + } + } + + // Add a 404 path for not found pages to be server-side rendered by Remix. + // Use an edge function bundle if one was generated, otherwise use Node.js. + if (!output['404']) { + const edgeFunctionIndex = Array.from(serverBundlesMap.values()).findIndex( + routes => { + const runtime = resolvedConfigsMap.get(routes[0])?.runtime; + return runtime === 'edge'; + } + ); + const func = + edgeFunctionIndex !== -1 ? functions[edgeFunctionIndex] : functions[0]; + output['404'] = func; + } + routes.push({ + src: '/(.*)', + dest: '/404', + }); + + return { routes, output, framework: { version: remixVersion } }; +}; + +function hasScript(scriptName: string, pkg: PackageJson | null) { + const scripts = (pkg && pkg.scripts) || {}; + return typeof scripts[scriptName] === 'string'; +} + +async function createRenderNodeFunction( + nodeVersion: NodeVersion, + entrypointDir: string, + rootDir: string, + serverBuildPath: string, + serverEntryPoint: string | undefined, + remixVersion: string, + config: ResolvedNodeRouteConfig +): Promise { + const files: Files = {}; + + let handler = relative(rootDir, serverBuildPath); + let handlerPath = join(rootDir, handler); + if (!serverEntryPoint) { + const baseServerBuildPath = basename(serverBuildPath, '.js'); + handler = join(dirname(handler), `server-${baseServerBuildPath}.mjs`); + handlerPath = join(rootDir, handler); + + // Copy the `server-node.mjs` file into the "build" directory + const nodeServerSrc = await nodeServerSrcPromise; + await writeEntrypointFile( + handlerPath, + nodeServerSrc.replace( + '@remix-run/dev/server-build', + `./${baseServerBuildPath}.js` + ), + rootDir + ); + } + + // Trace the handler with `@vercel/nft` + const trace = await nodeFileTrace([handlerPath], { + base: rootDir, + processCwd: entrypointDir, + }); + + for (const warning of trace.warnings) { + debug(`Warning from trace: ${warning.message}`); + } + + for (const file of trace.fileList) { + files[file] = await FileFsRef.fromFsPath({ fsPath: join(rootDir, file) }); + } + + const fn = new NodejsLambda({ + files, + handler, + runtime: nodeVersion.runtime, + shouldAddHelpers: false, + shouldAddSourcemapSupport: false, + operationType: 'SSR', + supportsResponseStreaming: true, + regions: config.regions, + memory: config.memory, + maxDuration: config.maxDuration, + framework: { + slug: 'remix', + version: remixVersion, + }, + }); + + return fn; +} + +async function createRenderEdgeFunction( + entrypointDir: string, + rootDir: string, + serverBuildPath: string, + serverEntryPoint: string | undefined, + remixVersion: string, + config: ResolvedEdgeRouteConfig +): Promise { + const files: Files = {}; + + let handler = relative(rootDir, serverBuildPath); + let handlerPath = join(rootDir, handler); + if (!serverEntryPoint) { + const baseServerBuildPath = basename(serverBuildPath, '.js'); + handler = join(dirname(handler), `server-${baseServerBuildPath}.mjs`); + handlerPath = join(rootDir, handler); + + // Copy the `server-edge.mjs` file into the "build" directory + const edgeServerSrc = await edgeServerSrcPromise; + await writeEntrypointFile( + handlerPath, + edgeServerSrc.replace( + '@remix-run/dev/server-build', + `./${baseServerBuildPath}.js` + ), + rootDir + ); + } + + let remixRunVercelPkgJson: string | undefined; + + // Trace the handler with `@vercel/nft` + const trace = await nodeFileTrace([handlerPath], { + base: rootDir, + processCwd: entrypointDir, + conditions: ['edge-light', 'browser', 'module', 'import', 'require'], + async readFile(fsPath) { + let source: Buffer | string; + try { + source = await fs.readFile(fsPath); + } catch (err: any) { + if (err.code === 'ENOENT' || err.code === 'EISDIR') { + return null; + } + throw err; + } + if (basename(fsPath) === 'package.json') { + // For Edge Functions, patch "main" field to prefer "browser" or "module" + const pkgJson = JSON.parse(source.toString()); + + // When `@remix-run/vercel` is detected, we need to modify the `package.json` + // to include the "browser" field so that the proper Edge entrypoint file + // is used. This is a temporary stop gap until this PR is merged: + // https://github.com/remix-run/remix/pull/5537 + if (pkgJson.name === '@remix-run/vercel') { + pkgJson.browser = 'dist/edge.js'; + pkgJson.dependencies['@remix-run/server-runtime'] = + pkgJson.dependencies['@remix-run/node']; + + if (!remixRunVercelPkgJson) { + remixRunVercelPkgJson = JSON.stringify(pkgJson, null, 2) + '\n'; + + // Copy in the edge entrypoint so that NFT can properly resolve it + const vercelEdgeEntrypointPath = join( + DEFAULTS_PATH, + 'vercel-edge-entrypoint.js' + ); + const vercelEdgeEntrypointDest = join( + dirname(fsPath), + 'dist/edge.js' + ); + await fs.copyFile( + vercelEdgeEntrypointPath, + vercelEdgeEntrypointDest + ); + } + } + + for (const prop of ['browser', 'module']) { + const val = pkgJson[prop]; + if (typeof val === 'string') { + pkgJson.main = val; + + // Return the modified `package.json` to nft + source = JSON.stringify(pkgJson); + break; + } + } + } + return source; + }, + }); + + for (const warning of trace.warnings) { + debug(`Warning from trace: ${warning.message}`); + } + + for (const file of trace.fileList) { + if ( + remixRunVercelPkgJson && + file.endsWith(`@remix-run${sep}vercel${sep}package.json`) + ) { + // Use the modified `@remix-run/vercel` package.json which contains "browser" field + files[file] = new FileBlob({ data: remixRunVercelPkgJson }); + } else { + files[file] = await FileFsRef.fromFsPath({ fsPath: join(rootDir, file) }); + } + } + + const fn = new EdgeFunction({ + files, + deploymentTarget: 'v8-worker', + entrypoint: handler, + regions: config.regions, + framework: { + slug: 'remix', + version: remixVersion, + }, + }); + + return fn; +} + +async function writeEntrypointFile( + path: string, + data: string, + rootDir: string +) { + try { + await fs.writeFile(path, data); + } catch (err: any) { + if (err.code === 'ENOENT') { + throw new Error( + `The "${relative( + rootDir, + dirname(path) + )}" directory does not exist. Please contact support at https://vercel.com/help.` + ); + } + throw err; + } +} diff --git a/packages/remix/src/build-vite.ts b/packages/remix/src/build-vite.ts new file mode 100644 index 000000000..0040d5ffe --- /dev/null +++ b/packages/remix/src/build-vite.ts @@ -0,0 +1,477 @@ +import { readFileSync, promises as fs, statSync, existsSync } from 'fs'; +import { basename, dirname, join, relative, sep } from 'path'; +import { isErrnoException } from '@vercel/error-utils'; +import { nodeFileTrace } from '@vercel/nft'; +import { + BuildResultV2Typical, + debug, + execCommand, + getEnvForPackageManager, + getNodeVersion, + getSpawnOptions, + glob, + runNpmInstall, + runPackageJsonScript, + scanParentDirs, + FileBlob, + FileFsRef, + EdgeFunction, + NodejsLambda, +} from '@vercel/build-utils'; +import { + ensureResolvable, + getPathFromRoute, + getRegExpFromPath, + hasScript, +} from './utils'; +import type { BuildV2, Files, NodeVersion } from '@vercel/build-utils'; + +const DEFAULTS_PATH = join(__dirname, '../defaults'); + +const edgeServerSrcPromise = fs.readFile( + join(DEFAULTS_PATH, 'server-edge.mjs'), + 'utf-8' +); +const nodeServerSrcPromise = fs.readFile( + join(DEFAULTS_PATH, 'server-node.mjs'), + 'utf-8' +); + +interface RemixBuildResult { + buildManifest: { + serverBundles?: Record< + string, + { id: string; file: string; config: Record } + >; + routeIdToServerBundleId?: Record; + routes: Record< + string, + { + id: string; + file: string; + path?: string; + index?: boolean; + parentId?: string; + config: Record; + } + >; + }; + remixConfig: { + buildDirectory: string; + }; + viteConfig?: { + build?: { + assetsDir: string; + }; + }; +} + +export const build: BuildV2 = async ({ + entrypoint, + workPath, + repoRootPath, + config, + meta = {}, +}) => { + const { installCommand, buildCommand } = config; + const mountpoint = dirname(entrypoint); + const entrypointFsDirname = join(workPath, mountpoint); + + // Run "Install Command" + const nodeVersion = await getNodeVersion( + entrypointFsDirname, + undefined, + config, + meta + ); + + const { cliType, lockfileVersion, packageJson } = await scanParentDirs( + entrypointFsDirname, + true + ); + + const spawnOpts = getSpawnOptions(meta, nodeVersion); + if (!spawnOpts.env) { + spawnOpts.env = {}; + } + + spawnOpts.env = getEnvForPackageManager({ + cliType, + lockfileVersion, + nodeVersion, + env: spawnOpts.env, + }); + + if (typeof installCommand === 'string') { + if (installCommand.trim()) { + console.log(`Running "install" command: \`${installCommand}\`...`); + await execCommand(installCommand, { + ...spawnOpts, + cwd: entrypointFsDirname, + }); + } else { + console.log(`Skipping "install" command...`); + } + } else { + await runNpmInstall(entrypointFsDirname, [], spawnOpts, meta, nodeVersion); + } + + // Determine the version of Remix based on the `@remix-run/dev` + // package version. + const remixRunDevPath = await ensureResolvable( + entrypointFsDirname, + repoRootPath, + '@remix-run/dev' + ); + const remixRunDevPkg = JSON.parse( + readFileSync(join(remixRunDevPath, 'package.json'), 'utf8') + ); + const remixVersion = remixRunDevPkg.version; + + // Make `remix build` output production mode + spawnOpts.env.NODE_ENV = 'production'; + + // Run "Build Command" + if (buildCommand) { + debug(`Executing build command "${buildCommand}"`); + await execCommand(buildCommand, { + ...spawnOpts, + cwd: entrypointFsDirname, + }); + } else { + if (hasScript('vercel-build', packageJson)) { + debug(`Executing "vercel-build" script`); + await runPackageJsonScript( + entrypointFsDirname, + 'vercel-build', + spawnOpts + ); + } else if (hasScript('build', packageJson)) { + debug(`Executing "build" script`); + await runPackageJsonScript(entrypointFsDirname, 'build', spawnOpts); + } else { + await execCommand('remix build', { + ...spawnOpts, + cwd: entrypointFsDirname, + }); + } + } + + // This needs to happen before we run NFT to create the Node/Edge functions + // TODO: maybe remove this? + await Promise.all([ + ensureResolvable( + entrypointFsDirname, + repoRootPath, + '@remix-run/server-runtime' + ), + ensureResolvable(entrypointFsDirname, repoRootPath, '@remix-run/node'), + ]); + + const remixBuildResultPath = join( + entrypointFsDirname, + '.vercel/remix-build-result.json' + ); + let remixBuildResult: RemixBuildResult | undefined; + try { + const remixBuildResultContents = readFileSync(remixBuildResultPath, 'utf8'); + remixBuildResult = JSON.parse(remixBuildResultContents); + } catch (err: unknown) { + if (!isErrnoException(err) || err.code !== 'ENOENT') { + throw err; + } + // The project has not configured the `vercelPreset()` + // Preset in the "vite.config" file. Attempt to check + // for the default build output directory. + const buildDirectory = join(entrypointFsDirname, 'build'); + if (statSync(buildDirectory).isDirectory()) { + console.warn('WARN: The `vercelPreset()` Preset was not detected.'); + remixBuildResult = { + buildManifest: { + routes: { + root: { + path: '', + id: 'root', + file: 'app/root.tsx', + config: {}, + }, + 'routes/_index': { + file: 'app/routes/_index.tsx', + id: 'routes/_index', + index: true, + parentId: 'root', + config: {}, + }, + }, + }, + remixConfig: { + buildDirectory, + }, + }; + // Detect if a server build exists (won't be the case when `ssr: false`) + const serverPath = 'build/server/index.js'; + if (existsSync(join(entrypointFsDirname, serverPath))) { + remixBuildResult.buildManifest.routeIdToServerBundleId = { + 'routes/_index': '', + }; + remixBuildResult.buildManifest.serverBundles = { + '': { + id: '', + file: serverPath, + config: {}, + }, + }; + } + } + } + + if (!remixBuildResult) { + throw new Error( + 'Could not determine build output directory. Please configure the `vercelPreset()` Preset from the `@vercel/remix` npm package' + ); + } + + const { buildManifest, remixConfig, viteConfig } = remixBuildResult; + + const staticDir = join(remixConfig.buildDirectory, 'client'); + const serverBundles = Object.values(buildManifest.serverBundles ?? {}); + + const [staticFiles, ...functions] = await Promise.all([ + glob('**', staticDir), + ...serverBundles.map(bundle => { + if (bundle.config.runtime === 'edge') { + return createRenderEdgeFunction( + entrypointFsDirname, + repoRootPath, + join(entrypointFsDirname, bundle.file), + undefined, + remixVersion, + bundle.config + ); + } + + return createRenderNodeFunction( + nodeVersion, + entrypointFsDirname, + repoRootPath, + join(entrypointFsDirname, bundle.file), + undefined, + remixVersion, + bundle.config + ); + }), + ]); + + const functionsMap = new Map(); + for (let i = 0; i < serverBundles.length; i++) { + functionsMap.set(serverBundles[i].id, functions[i]); + } + + const output: BuildResultV2Typical['output'] = staticFiles; + const assetsDir = viteConfig?.build?.assetsDir || 'assets'; + const routes: any[] = [ + { + src: `^/${assetsDir}/(.*)$`, + headers: { 'cache-control': 'public, max-age=31536000, immutable' }, + continue: true, + }, + { + handle: 'filesystem', + }, + ]; + + for (const [id, functionId] of Object.entries( + buildManifest.routeIdToServerBundleId ?? {} + )) { + const route = buildManifest.routes[id]; + const { path, rePath } = getPathFromRoute(route, buildManifest.routes); + + // If the route is a pathless layout route (at the root level) + // and doesn't have any sub-routes, then a function should not be created. + if (!path) { + continue; + } + + const func = functionsMap.get(functionId); + if (!func) { + throw new Error(`Could not determine server bundle for "${id}"`); + } + + output[path] = func; + + // If this is a dynamic route then add a Vercel route + const re = getRegExpFromPath(rePath); + if (re) { + routes.push({ + src: re.source, + dest: path, + }); + } + } + + // For the 404 case, invoke the Function (or serve the static file + // for `ssr: false` mode) at the `/` path. Remix will serve its 404 route. + routes.push({ + src: '/(.*)', + dest: '/', + }); + + return { routes, output, framework: { version: remixVersion } }; +}; + +async function createRenderNodeFunction( + nodeVersion: NodeVersion, + entrypointDir: string, + rootDir: string, + serverBuildPath: string, + serverEntryPoint: string | undefined, + remixVersion: string, + config: /*TODO: ResolvedNodeRouteConfig*/ any +): Promise { + const files: Files = {}; + + let handler = relative(rootDir, serverBuildPath); + let handlerPath = join(rootDir, handler); + if (!serverEntryPoint) { + const baseServerBuildPath = basename(serverBuildPath, '.js'); + handler = join(dirname(handler), `server-${baseServerBuildPath}.mjs`); + handlerPath = join(rootDir, handler); + + // Copy the `server-node.mjs` file into the "build" directory + const nodeServerSrc = await nodeServerSrcPromise; + await fs.writeFile( + handlerPath, + nodeServerSrc.replace( + '@remix-run/dev/server-build', + `./${baseServerBuildPath}.js` + ) + ); + } + + // Trace the handler with `@vercel/nft` + const trace = await nodeFileTrace([handlerPath], { + base: rootDir, + processCwd: entrypointDir, + }); + + for (const warning of trace.warnings) { + debug(`Warning from trace: ${warning.message}`); + } + + for (const file of trace.fileList) { + files[file] = await FileFsRef.fromFsPath({ fsPath: join(rootDir, file) }); + } + + const fn = new NodejsLambda({ + files, + handler, + runtime: nodeVersion.runtime, + shouldAddHelpers: false, + shouldAddSourcemapSupport: false, + operationType: 'SSR', + supportsResponseStreaming: true, + regions: config.regions, + memory: config.memory, + maxDuration: config.maxDuration, + framework: { + slug: 'remix', + version: remixVersion, + }, + }); + + return fn; +} + +async function createRenderEdgeFunction( + entrypointDir: string, + rootDir: string, + serverBuildPath: string, + serverEntryPoint: string | undefined, + remixVersion: string, + config: /* TODO: ResolvedEdgeRouteConfig*/ any +): Promise { + const files: Files = {}; + + let handler = relative(rootDir, serverBuildPath); + let handlerPath = join(rootDir, handler); + if (!serverEntryPoint) { + const baseServerBuildPath = basename(serverBuildPath, '.js'); + handler = join(dirname(handler), `server-${baseServerBuildPath}.mjs`); + handlerPath = join(rootDir, handler); + + // Copy the `server-edge.mjs` file into the "build" directory + const edgeServerSrc = await edgeServerSrcPromise; + await fs.writeFile( + handlerPath, + edgeServerSrc.replace( + '@remix-run/dev/server-build', + `./${baseServerBuildPath}.js` + ) + ); + } + + let remixRunVercelPkgJson: string | undefined; + + // Trace the handler with `@vercel/nft` + const trace = await nodeFileTrace([handlerPath], { + base: rootDir, + processCwd: entrypointDir, + conditions: ['edge-light', 'browser', 'module', 'import', 'require'], + async readFile(fsPath) { + let source: Buffer | string; + try { + source = await fs.readFile(fsPath); + } catch (err: any) { + if (err.code === 'ENOENT' || err.code === 'EISDIR') { + return null; + } + throw err; + } + if (basename(fsPath) === 'package.json') { + // For Edge Functions, patch "main" field to prefer "browser" or "module" + const pkgJson = JSON.parse(source.toString()); + + for (const prop of ['browser', 'module']) { + const val = pkgJson[prop]; + if (typeof val === 'string') { + pkgJson.main = val; + + // Return the modified `package.json` to nft + source = JSON.stringify(pkgJson); + break; + } + } + } + return source; + }, + }); + + for (const warning of trace.warnings) { + debug(`Warning from trace: ${warning.message}`); + } + + for (const file of trace.fileList) { + if ( + remixRunVercelPkgJson && + file.endsWith(`@remix-run${sep}vercel${sep}package.json`) + ) { + // Use the modified `@remix-run/vercel` package.json which contains "browser" field + files[file] = new FileBlob({ data: remixRunVercelPkgJson }); + } else { + files[file] = await FileFsRef.fromFsPath({ fsPath: join(rootDir, file) }); + } + } + + const fn = new EdgeFunction({ + files, + deploymentTarget: 'v8-worker', + entrypoint: handler, + regions: config.regions, + framework: { + slug: 'remix', + version: remixVersion, + }, + }); + + return fn; +} diff --git a/packages/remix/src/build.ts b/packages/remix/src/build.ts index 7a7475b16..f415c3ac0 100644 --- a/packages/remix/src/build.ts +++ b/packages/remix/src/build.ts @@ -1,814 +1,9 @@ -import { Project } from 'ts-morph'; -import { readFileSync, promises as fs, existsSync } from 'fs'; -import { basename, dirname, extname, join, posix, relative, sep } from 'path'; -import { - debug, - download, - execCommand, - FileBlob, - FileFsRef, - getEnvForPackageManager, - getNodeVersion, - getSpawnOptions, - glob, - EdgeFunction, - NodejsLambda, - rename, - runNpmInstall, - runPackageJsonScript, - scanParentDirs, -} from '@vercel/build-utils'; -import { getConfig } from '@vercel/static-config'; -import { nodeFileTrace } from '@vercel/nft'; -import type { - BuildV2, - Files, - NodeVersion, - PackageJson, - BuildResultV2Typical, -} from '@vercel/build-utils'; -import type { ConfigRoute } from '@remix-run/dev/dist/config/routes'; -import type { BaseFunctionConfig } from '@vercel/static-config'; -import { - calculateRouteConfigHash, - findConfig, - getPathFromRoute, - getRegExpFromPath, - getResolvedRouteConfig, - isLayoutRoute, - ResolvedRouteConfig, - ResolvedNodeRouteConfig, - ResolvedEdgeRouteConfig, - findEntry, - chdirAndReadConfig, - resolveSemverMinMax, - ensureResolvable, - isESM, -} from './utils'; -import { patchHydrogenServer } from './hydrogen'; +import { build as buildVite } from './build-vite'; +import { build as buildLegacy } from './build-legacy'; +import { findConfig } from './utils'; +import type { BuildV2 } from '@vercel/build-utils'; -interface ServerBundle { - serverBuildPath: string; - routes: string[]; -} - -const remixBuilderPkg = JSON.parse( - readFileSync(join(__dirname, '../package.json'), 'utf8') -); -const remixRunDevForkVersion = - remixBuilderPkg.devDependencies['@remix-run/dev']; - -const DEFAULTS_PATH = join(__dirname, '../defaults'); - -const edgeServerSrcPromise = fs.readFile( - join(DEFAULTS_PATH, 'server-edge.mjs'), - 'utf-8' -); -const nodeServerSrcPromise = fs.readFile( - join(DEFAULTS_PATH, 'server-node.mjs'), - 'utf-8' -); - -// Minimum supported version of the `@vercel/remix` package -const VERCEL_REMIX_MIN_VERSION = '1.10.0'; - -// Minimum supported version of the `@vercel/remix-run-dev` forked compiler -const REMIX_RUN_DEV_MIN_VERSION = '1.15.0'; - -// Maximum version of `@vercel/remix-run-dev` fork -// (and also `@vercel/remix` since they get published at the same time) -const REMIX_RUN_DEV_MAX_VERSION = remixRunDevForkVersion.slice( - remixRunDevForkVersion.lastIndexOf('@') + 1 -); - -export const build: BuildV2 = async ({ - entrypoint, - files, - workPath, - repoRootPath, - config, - meta = {}, -}) => { - const { installCommand, buildCommand } = config; - - await download(files, workPath, meta); - - const mountpoint = dirname(entrypoint); - const entrypointFsDirname = join(workPath, mountpoint); - - // Run "Install Command" - const nodeVersion = await getNodeVersion( - entrypointFsDirname, - undefined, - config, - meta - ); - - const { cliType, packageJsonPath, lockfileVersion, lockfilePath } = - await scanParentDirs(entrypointFsDirname); - - if (!packageJsonPath) { - throw new Error('Failed to locate `package.json` file in your project'); - } - - const [lockfileRaw, pkgRaw] = await Promise.all([ - lockfilePath ? fs.readFile(lockfilePath) : null, - fs.readFile(packageJsonPath, 'utf8'), - ]); - const pkg = JSON.parse(pkgRaw); - - const spawnOpts = getSpawnOptions(meta, nodeVersion); - if (!spawnOpts.env) { - spawnOpts.env = {}; - } - - spawnOpts.env = getEnvForPackageManager({ - cliType, - lockfileVersion, - nodeVersion, - env: spawnOpts.env, - }); - - if (typeof installCommand === 'string') { - if (installCommand.trim()) { - console.log(`Running "install" command: \`${installCommand}\`...`); - await execCommand(installCommand, { - ...spawnOpts, - cwd: entrypointFsDirname, - }); - } else { - console.log(`Skipping "install" command...`); - } - } else { - await runNpmInstall(entrypointFsDirname, [], spawnOpts, meta, nodeVersion); - } - - const isHydrogen2 = Boolean( - pkg.dependencies?.['@shopify/remix-oxygen'] || - pkg.devDependencies?.['@shopify/remix-oxygen'] - ); - - // Determine the version of Remix based on the `@remix-run/dev` - // package version. - const remixRunDevPath = await ensureResolvable( - entrypointFsDirname, - repoRootPath, - '@remix-run/dev' - ); - const remixRunDevPkg = JSON.parse( - readFileSync(join(remixRunDevPath, 'package.json'), 'utf8') - ); - const remixVersion = remixRunDevPkg.version; - - const remixConfig = await chdirAndReadConfig( - remixRunDevPath, - entrypointFsDirname, - packageJsonPath - ); - const { serverEntryPoint, appDirectory } = remixConfig; - const remixRoutes = Object.values(remixConfig.routes); - - let depsModified = false; - - const remixRunDevPkgVersion: string | undefined = - pkg.dependencies?.['@remix-run/dev'] || - pkg.devDependencies?.['@remix-run/dev']; - - const serverBundlesMap = new Map(); - const resolvedConfigsMap = new Map(); - - // Read the `export const config` (if any) for each route - const project = new Project(); - const staticConfigsMap = new Map(); - for (const route of remixRoutes) { - const routePath = join(remixConfig.appDirectory, route.file); - let staticConfig = getConfig(project, routePath); - if (staticConfig && isHydrogen2) { - console.log( - 'WARN: `export const config` is currently not supported for Hydrogen v2 apps' - ); - staticConfig = null; - } - staticConfigsMap.set(route, staticConfig); - } - - for (const route of remixRoutes) { - const config = getResolvedRouteConfig( - route, - remixConfig.routes, - staticConfigsMap, - isHydrogen2 - ); - resolvedConfigsMap.set(route, config); - } - - // Figure out which routes belong to which server bundles - // based on having common static config properties - for (const route of remixRoutes) { - if (isLayoutRoute(route.id, remixRoutes)) continue; - - const config = resolvedConfigsMap.get(route); - if (!config) { - throw new Error(`Expected resolved config for "${route.id}"`); - } - const hash = calculateRouteConfigHash(config); - - let routesForHash = serverBundlesMap.get(hash); - if (!Array.isArray(routesForHash)) { - routesForHash = []; - serverBundlesMap.set(hash, routesForHash); - } - - routesForHash.push(route); - } - - let serverBundles: ServerBundle[] = Array.from( - serverBundlesMap.entries() - ).map(([hash, routes]) => { - const runtime = resolvedConfigsMap.get(routes[0])?.runtime ?? 'nodejs'; - return { - serverBuildPath: isHydrogen2 - ? relative(entrypointFsDirname, remixConfig.serverBuildPath) - : `${relative( - entrypointFsDirname, - dirname(remixConfig.serverBuildPath) - )}/build-${runtime}-${hash}.js`, - routes: routes.map(r => r.id), - }; - }); - - // If the project is *not* relying on split configurations, then set - // the `serverBuildPath` to the default Remix path, since the forked - // Remix compiler will not be used - if (!isHydrogen2 && serverBundles.length === 1) { - // `serverBuildTarget` and `serverBuildPath` are undefined with - // our remix config modifications, so use the default build path - serverBundles[0].serverBuildPath = 'build/index.js'; - } - - // If the project is relying on split configurations, then override - // the official `@remix-run/dev` package with the Vercel fork, - // which supports the `serverBundles` config - if ( - serverBundles.length > 1 && - !isHydrogen2 && - remixRunDevPkg.name !== '@vercel/remix-run-dev' && - !remixRunDevPkgVersion?.startsWith('https:') - ) { - const remixDevForkVersion = resolveSemverMinMax( - REMIX_RUN_DEV_MIN_VERSION, - REMIX_RUN_DEV_MAX_VERSION, - remixVersion - ); - // Remove `@remix-run/dev`, add `@vercel/remix-run-dev` - if (pkg.devDependencies['@remix-run/dev']) { - delete pkg.devDependencies['@remix-run/dev']; - pkg.devDependencies['@vercel/remix-run-dev'] = remixDevForkVersion; - } else { - delete pkg.dependencies['@remix-run/dev']; - pkg.dependencies['@vercel/remix-run-dev'] = remixDevForkVersion; - } - depsModified = true; - } - - // `app/entry.server.tsx` and `app/entry.client.tsx` are optional in Remix, - // so if either of those files are missing then add our own versions. - const userEntryServerFile = findEntry(appDirectory, 'entry.server'); - if (!userEntryServerFile) { - await fs.copyFile( - join(DEFAULTS_PATH, 'entry.server.jsx'), - join(appDirectory, 'entry.server.jsx') - ); - if (!pkg.dependencies['@vercel/remix']) { - // Dependency version resolution logic - // 1. Users app is on 1.9.0 -> we install the 1.10.0 (minimum) version of `@vercel/remix`. - // 2. Users app is on 1.11.0 (a version greater than 1.10.0 and less than the known max - // published version) -> we install the (matching) 1.11.0 version of `@vercel/remix`. - // 3. Users app is on something greater than our latest version of the fork -> we install - // the latest known published version of `@vercel/remix`. - const vercelRemixVersion = resolveSemverMinMax( - VERCEL_REMIX_MIN_VERSION, - REMIX_RUN_DEV_MAX_VERSION, - remixVersion - ); - pkg.dependencies['@vercel/remix'] = vercelRemixVersion; - depsModified = true; - } - } - - if (depsModified) { - await fs.writeFile(packageJsonPath, JSON.stringify(pkg, null, 2) + '\n'); - - // Bypass `--frozen-lockfile` enforcement by removing - // env vars that are considered to be CI - const nonCiEnv = { ...spawnOpts.env }; - delete nonCiEnv.CI; - delete nonCiEnv.VERCEL; - delete nonCiEnv.NOW_BUILDER; - - // Purposefully not passing `meta` here to avoid - // the optimization that prevents `npm install` - // from running a second time - await runNpmInstall( - entrypointFsDirname, - [], - { - ...spawnOpts, - env: nonCiEnv, - }, - undefined, - nodeVersion - ); - } - - const userEntryClientFile = findEntry( - remixConfig.appDirectory, - 'entry.client' - ); - if (!userEntryClientFile) { - await fs.copyFile( - join(DEFAULTS_PATH, 'entry.client.react.jsx'), - join(appDirectory, 'entry.client.jsx') - ); - } - - let remixConfigWrapped = false; - let serverEntryPointAbs: string | undefined; - let originalServerEntryPoint: string | undefined; - const remixConfigPath = findConfig(entrypointFsDirname, 'remix.config'); - const renamedRemixConfigPath = remixConfigPath - ? `${remixConfigPath}.original${extname(remixConfigPath)}` - : undefined; - - try { - // We need to patch the `remix.config.js` file to force some values necessary - // for a build that works on either Node.js or the Edge runtime - if (!isHydrogen2 && remixConfigPath && renamedRemixConfigPath) { - await fs.rename(remixConfigPath, renamedRemixConfigPath); - - let patchedConfig: string; - // Figure out if the `remix.config` file is using ESM syntax - if (isESM(renamedRemixConfigPath)) { - patchedConfig = `import config from './${basename( - renamedRemixConfigPath - )}'; -config.serverBuildTarget = undefined; -config.serverModuleFormat = '${pkg.type === 'module' ? 'esm' : 'cjs'}'; -config.serverPlatform = 'node'; -config.serverBuildPath = undefined; -config.serverBundles = ${JSON.stringify(serverBundles)}; -export default config;`; - } else { - patchedConfig = `const config = require('./${basename( - renamedRemixConfigPath - )}'); -config.serverBuildTarget = undefined; -config.serverModuleFormat = '${pkg.type === 'module' ? 'esm' : 'cjs'}'; -config.serverPlatform = 'node'; -config.serverBuildPath = undefined; -config.serverBundles = ${JSON.stringify(serverBundles)}; -module.exports = config;`; - } - await fs.writeFile(remixConfigPath, patchedConfig); - remixConfigWrapped = true; - } - - // For Hydrogen v2, patch the `server.ts` file to be Vercel-compatible - if (isHydrogen2) { - if (remixConfig.serverEntryPoint) { - serverEntryPointAbs = join( - entrypointFsDirname, - remixConfig.serverEntryPoint - ); - originalServerEntryPoint = await fs.readFile( - serverEntryPointAbs, - 'utf8' - ); - const patchedServerEntryPoint = patchHydrogenServer( - project, - serverEntryPointAbs - ); - if (patchedServerEntryPoint) { - debug( - `Patched Hydrogen server file: ${remixConfig.serverEntryPoint}` - ); - await fs.writeFile(serverEntryPointAbs, patchedServerEntryPoint); - } - } else { - console.log('WARN: No "server" field found in Remix config'); - } - } - - // Make `remix build` output production mode - spawnOpts.env.NODE_ENV = 'production'; - - // Run "Build Command" - if (buildCommand) { - debug(`Executing build command "${buildCommand}"`); - await execCommand(buildCommand, { - ...spawnOpts, - cwd: entrypointFsDirname, - }); - } else { - if (hasScript('vercel-build', pkg)) { - debug(`Executing "yarn vercel-build"`); - await runPackageJsonScript( - entrypointFsDirname, - 'vercel-build', - spawnOpts - ); - } else if (hasScript('build', pkg)) { - debug(`Executing "yarn build"`); - await runPackageJsonScript(entrypointFsDirname, 'build', spawnOpts); - } else { - await execCommand('remix build', { - ...spawnOpts, - cwd: entrypointFsDirname, - }); - } - } - } finally { - const cleanupOps: Promise[] = []; - // Clean up our patched `remix.config.js` to be polite - if (remixConfigWrapped && remixConfigPath && renamedRemixConfigPath) { - cleanupOps.push( - fs - .rename(renamedRemixConfigPath, remixConfigPath) - .then(() => debug(`Restored original "${remixConfigPath}" file`)) - ); - } - // Restore original server entrypoint if it was modified (for Hydrogen v2) - if (serverEntryPointAbs && originalServerEntryPoint) { - cleanupOps.push( - fs - .writeFile(serverEntryPointAbs, originalServerEntryPoint) - .then(() => debug(`Restored original "${serverEntryPointAbs}" file`)) - ); - } - // Restore original `package.json` file and lockfile - if (depsModified) { - cleanupOps.push( - fs - .writeFile(packageJsonPath, pkgRaw) - .then(() => debug(`Restored original "${packageJsonPath}" file`)) - ); - if (lockfilePath && lockfileRaw) { - cleanupOps.push( - fs - .writeFile(lockfilePath, lockfileRaw) - .then(() => debug(`Restored original "${lockfilePath}" file`)) - ); - } - } - await Promise.all(cleanupOps); - } - - // This needs to happen before we run NFT to create the Node/Edge functions - await Promise.all([ - ensureResolvable( - entrypointFsDirname, - repoRootPath, - '@remix-run/server-runtime' - ), - !isHydrogen2 - ? ensureResolvable(entrypointFsDirname, repoRootPath, '@remix-run/node') - : null, - ]); - - const staticDir = join(entrypointFsDirname, 'public'); - - // Do a sanity check to ensure that the server bundles `serverBuildPath` was actually created. - // If it was not, then that usually means the Vercel forked Remix compiler was not used and - // thus only a singular server bundle was produced. - const serverBundlesRespected = existsSync( - join(entrypointFsDirname, serverBundles[0].serverBuildPath) - ); - if (!serverBundlesRespected) { - console.warn( - 'WARN: `serverBundles` configuration failed. Falling back to a singular server bundle.' - ); - serverBundles = [ - { - serverBuildPath: 'build/index.js', - routes: serverBundles.flatMap(b => b.routes), - }, - ]; - } - - const [staticFiles, buildAssets, ...functions] = await Promise.all([ - glob('**', staticDir), - glob('**', remixConfig.assetsBuildDirectory), - ...serverBundles.map(bundle => { - const firstRoute = remixConfig.routes[bundle.routes[0]]; - const config = resolvedConfigsMap.get(firstRoute) ?? { - runtime: 'nodejs', - }; - const serverBuildPath = join(entrypointFsDirname, bundle.serverBuildPath); - - if (config.runtime === 'edge') { - return createRenderEdgeFunction( - entrypointFsDirname, - repoRootPath, - serverBuildPath, - serverEntryPoint, - remixVersion, - config - ); - } - - return createRenderNodeFunction( - nodeVersion, - entrypointFsDirname, - repoRootPath, - serverBuildPath, - serverEntryPoint, - remixVersion, - config - ); - }), - ]); - - const transformedBuildAssets = rename(buildAssets, name => { - return posix.join('./', remixConfig.publicPath, name); - }); - - const output: BuildResultV2Typical['output'] = { - ...staticFiles, - ...transformedBuildAssets, - }; - const routes: any[] = [ - { - src: `^/${remixConfig.publicPath.replace(/^\/|\/$/g, '')}/(.*)$`, - headers: { 'cache-control': 'public, max-age=31536000, immutable' }, - continue: true, - }, - { - handle: 'filesystem', - }, - ]; - - for (const route of remixRoutes) { - // Layout routes don't get a function / route added - if (isLayoutRoute(route.id, remixRoutes)) continue; - - const { path, rePath } = getPathFromRoute(route, remixConfig.routes); - - // If the route is a pathless layout route (at the root level) - // and doesn't have any sub-routes, then a function should not be created. - if (!path) { - continue; - } - - const funcIndex = serverBundles.findIndex(bundle => { - return bundle.routes.includes(route.id); - }); - const func = functions[funcIndex]; - - if (!func) { - throw new Error(`Could not determine server bundle for "${route.id}"`); - } - - output[path] = func; - - // If this is a dynamic route then add a Vercel route - const re = getRegExpFromPath(rePath); - if (re) { - routes.push({ - src: re.source, - dest: path, - }); - } - } - - // Add a 404 path for not found pages to be server-side rendered by Remix. - // Use an edge function bundle if one was generated, otherwise use Node.js. - if (!output['404']) { - const edgeFunctionIndex = Array.from(serverBundlesMap.values()).findIndex( - routes => { - const runtime = resolvedConfigsMap.get(routes[0])?.runtime; - return runtime === 'edge'; - } - ); - const func = - edgeFunctionIndex !== -1 ? functions[edgeFunctionIndex] : functions[0]; - output['404'] = func; - } - routes.push({ - src: '/(.*)', - dest: '/404', - }); - - return { routes, output, framework: { version: remixVersion } }; +export const build: BuildV2 = opts => { + const isLegacy = findConfig(opts.workPath, 'remix.config'); + return isLegacy ? buildLegacy(opts) : buildVite(opts); }; - -function hasScript(scriptName: string, pkg: PackageJson | null) { - const scripts = (pkg && pkg.scripts) || {}; - return typeof scripts[scriptName] === 'string'; -} - -async function createRenderNodeFunction( - nodeVersion: NodeVersion, - entrypointDir: string, - rootDir: string, - serverBuildPath: string, - serverEntryPoint: string | undefined, - remixVersion: string, - config: ResolvedNodeRouteConfig -): Promise { - const files: Files = {}; - - let handler = relative(rootDir, serverBuildPath); - let handlerPath = join(rootDir, handler); - if (!serverEntryPoint) { - const baseServerBuildPath = basename(serverBuildPath, '.js'); - handler = join(dirname(handler), `server-${baseServerBuildPath}.mjs`); - handlerPath = join(rootDir, handler); - - // Copy the `server-node.mjs` file into the "build" directory - const nodeServerSrc = await nodeServerSrcPromise; - await writeEntrypointFile( - handlerPath, - nodeServerSrc.replace( - '@remix-run/dev/server-build', - `./${baseServerBuildPath}.js` - ), - rootDir - ); - } - - // Trace the handler with `@vercel/nft` - const trace = await nodeFileTrace([handlerPath], { - base: rootDir, - processCwd: entrypointDir, - }); - - for (const warning of trace.warnings) { - debug(`Warning from trace: ${warning.message}`); - } - - for (const file of trace.fileList) { - files[file] = await FileFsRef.fromFsPath({ fsPath: join(rootDir, file) }); - } - - const fn = new NodejsLambda({ - files, - handler, - runtime: nodeVersion.runtime, - shouldAddHelpers: false, - shouldAddSourcemapSupport: false, - operationType: 'SSR', - supportsResponseStreaming: true, - regions: config.regions, - memory: config.memory, - maxDuration: config.maxDuration, - framework: { - slug: 'remix', - version: remixVersion, - }, - }); - - return fn; -} - -async function createRenderEdgeFunction( - entrypointDir: string, - rootDir: string, - serverBuildPath: string, - serverEntryPoint: string | undefined, - remixVersion: string, - config: ResolvedEdgeRouteConfig -): Promise { - const files: Files = {}; - - let handler = relative(rootDir, serverBuildPath); - let handlerPath = join(rootDir, handler); - if (!serverEntryPoint) { - const baseServerBuildPath = basename(serverBuildPath, '.js'); - handler = join(dirname(handler), `server-${baseServerBuildPath}.mjs`); - handlerPath = join(rootDir, handler); - - // Copy the `server-edge.mjs` file into the "build" directory - const edgeServerSrc = await edgeServerSrcPromise; - await writeEntrypointFile( - handlerPath, - edgeServerSrc.replace( - '@remix-run/dev/server-build', - `./${baseServerBuildPath}.js` - ), - rootDir - ); - } - - let remixRunVercelPkgJson: string | undefined; - - // Trace the handler with `@vercel/nft` - const trace = await nodeFileTrace([handlerPath], { - base: rootDir, - processCwd: entrypointDir, - conditions: ['edge-light', 'browser', 'module', 'import', 'require'], - async readFile(fsPath) { - let source: Buffer | string; - try { - source = await fs.readFile(fsPath); - } catch (err: any) { - if (err.code === 'ENOENT' || err.code === 'EISDIR') { - return null; - } - throw err; - } - if (basename(fsPath) === 'package.json') { - // For Edge Functions, patch "main" field to prefer "browser" or "module" - const pkgJson = JSON.parse(source.toString()); - - // When `@remix-run/vercel` is detected, we need to modify the `package.json` - // to include the "browser" field so that the proper Edge entrypoint file - // is used. This is a temporary stop gap until this PR is merged: - // https://github.com/remix-run/remix/pull/5537 - if (pkgJson.name === '@remix-run/vercel') { - pkgJson.browser = 'dist/edge.js'; - pkgJson.dependencies['@remix-run/server-runtime'] = - pkgJson.dependencies['@remix-run/node']; - - if (!remixRunVercelPkgJson) { - remixRunVercelPkgJson = JSON.stringify(pkgJson, null, 2) + '\n'; - - // Copy in the edge entrypoint so that NFT can properly resolve it - const vercelEdgeEntrypointPath = join( - DEFAULTS_PATH, - 'vercel-edge-entrypoint.js' - ); - const vercelEdgeEntrypointDest = join( - dirname(fsPath), - 'dist/edge.js' - ); - await fs.copyFile( - vercelEdgeEntrypointPath, - vercelEdgeEntrypointDest - ); - } - } - - for (const prop of ['browser', 'module']) { - const val = pkgJson[prop]; - if (typeof val === 'string') { - pkgJson.main = val; - - // Return the modified `package.json` to nft - source = JSON.stringify(pkgJson); - break; - } - } - } - return source; - }, - }); - - for (const warning of trace.warnings) { - debug(`Warning from trace: ${warning.message}`); - } - - for (const file of trace.fileList) { - if ( - remixRunVercelPkgJson && - file.endsWith(`@remix-run${sep}vercel${sep}package.json`) - ) { - // Use the modified `@remix-run/vercel` package.json which contains "browser" field - files[file] = new FileBlob({ data: remixRunVercelPkgJson }); - } else { - files[file] = await FileFsRef.fromFsPath({ fsPath: join(rootDir, file) }); - } - } - - const fn = new EdgeFunction({ - files, - deploymentTarget: 'v8-worker', - entrypoint: handler, - regions: config.regions, - framework: { - slug: 'remix', - version: remixVersion, - }, - }); - - return fn; -} - -async function writeEntrypointFile( - path: string, - data: string, - rootDir: string -) { - try { - await fs.writeFile(path, data); - } catch (err: any) { - if (err.code === 'ENOENT') { - throw new Error( - `The "${relative( - rootDir, - dirname(path) - )}" directory does not exist. Please contact support at https://vercel.com/help.` - ); - } - throw err; - } -} diff --git a/packages/remix/src/utils.ts b/packages/remix/src/utils.ts index ede033b13..0187f0b31 100644 --- a/packages/remix/src/utils.ts +++ b/packages/remix/src/utils.ts @@ -2,7 +2,7 @@ import semver from 'semver'; import { existsSync, promises as fs } from 'fs'; import { basename, dirname, join, relative, resolve, sep } from 'path'; import { pathToRegexp, Key } from 'path-to-regexp'; -import { debug } from '@vercel/build-utils'; +import { debug, type PackageJson } from '@vercel/build-utils'; import { walkParentDirs } from '@vercel/build-utils'; import { createRequire } from 'module'; import type { @@ -58,8 +58,12 @@ export function findEntry(dir: string, basename: string): string | undefined { const configExts = ['.js', '.cjs', '.mjs']; -export function findConfig(dir: string, basename: string): string | undefined { - for (const ext of configExts) { +export function findConfig( + dir: string, + basename: string, + exts = configExts +): string | undefined { + for (const ext of exts) { const name = basename + ext; const file = join(dir, name); if (existsSync(file)) return file; @@ -369,3 +373,8 @@ export function isESM(path: string): boolean { } return isESM; } + +export function hasScript(scriptName: string, pkg?: PackageJson) { + const scripts = pkg?.scripts || {}; + return typeof scripts[scriptName] === 'string'; +} diff --git a/packages/remix/test/fixtures/00-pnpm/.gitignore b/packages/remix/test/fixtures-legacy/00-pnpm/.gitignore similarity index 100% rename from packages/remix/test/fixtures/00-pnpm/.gitignore rename to packages/remix/test/fixtures-legacy/00-pnpm/.gitignore diff --git a/packages/remix/test/fixtures/00-pnpm/node_modules/.modules.yaml b/packages/remix/test/fixtures-legacy/00-pnpm/node_modules/.modules.yaml similarity index 100% rename from packages/remix/test/fixtures/00-pnpm/node_modules/.modules.yaml rename to packages/remix/test/fixtures-legacy/00-pnpm/node_modules/.modules.yaml diff --git a/packages/remix/test/fixtures/00-pnpm/node_modules/.pnpm/debug@4.3.4/node_modules/debug/LICENSE b/packages/remix/test/fixtures-legacy/00-pnpm/node_modules/.pnpm/debug@4.3.4/node_modules/debug/LICENSE similarity index 100% rename from packages/remix/test/fixtures/00-pnpm/node_modules/.pnpm/debug@4.3.4/node_modules/debug/LICENSE rename to packages/remix/test/fixtures-legacy/00-pnpm/node_modules/.pnpm/debug@4.3.4/node_modules/debug/LICENSE diff --git a/packages/remix/test/fixtures/00-pnpm/node_modules/.pnpm/debug@4.3.4/node_modules/debug/README.md b/packages/remix/test/fixtures-legacy/00-pnpm/node_modules/.pnpm/debug@4.3.4/node_modules/debug/README.md similarity index 100% rename from packages/remix/test/fixtures/00-pnpm/node_modules/.pnpm/debug@4.3.4/node_modules/debug/README.md rename to packages/remix/test/fixtures-legacy/00-pnpm/node_modules/.pnpm/debug@4.3.4/node_modules/debug/README.md diff --git a/packages/remix/test/fixtures/00-pnpm/node_modules/.pnpm/debug@4.3.4/node_modules/debug/package.json b/packages/remix/test/fixtures-legacy/00-pnpm/node_modules/.pnpm/debug@4.3.4/node_modules/debug/package.json similarity index 100% rename from packages/remix/test/fixtures/00-pnpm/node_modules/.pnpm/debug@4.3.4/node_modules/debug/package.json rename to packages/remix/test/fixtures-legacy/00-pnpm/node_modules/.pnpm/debug@4.3.4/node_modules/debug/package.json diff --git a/packages/remix/test/fixtures/00-pnpm/node_modules/.pnpm/debug@4.3.4/node_modules/debug/src/browser.js b/packages/remix/test/fixtures-legacy/00-pnpm/node_modules/.pnpm/debug@4.3.4/node_modules/debug/src/browser.js similarity index 100% rename from packages/remix/test/fixtures/00-pnpm/node_modules/.pnpm/debug@4.3.4/node_modules/debug/src/browser.js rename to packages/remix/test/fixtures-legacy/00-pnpm/node_modules/.pnpm/debug@4.3.4/node_modules/debug/src/browser.js diff --git a/packages/remix/test/fixtures/00-pnpm/node_modules/.pnpm/debug@4.3.4/node_modules/debug/src/common.js b/packages/remix/test/fixtures-legacy/00-pnpm/node_modules/.pnpm/debug@4.3.4/node_modules/debug/src/common.js similarity index 100% rename from packages/remix/test/fixtures/00-pnpm/node_modules/.pnpm/debug@4.3.4/node_modules/debug/src/common.js rename to packages/remix/test/fixtures-legacy/00-pnpm/node_modules/.pnpm/debug@4.3.4/node_modules/debug/src/common.js diff --git a/packages/remix/test/fixtures/00-pnpm/node_modules/.pnpm/debug@4.3.4/node_modules/debug/src/index.js b/packages/remix/test/fixtures-legacy/00-pnpm/node_modules/.pnpm/debug@4.3.4/node_modules/debug/src/index.js similarity index 100% rename from packages/remix/test/fixtures/00-pnpm/node_modules/.pnpm/debug@4.3.4/node_modules/debug/src/index.js rename to packages/remix/test/fixtures-legacy/00-pnpm/node_modules/.pnpm/debug@4.3.4/node_modules/debug/src/index.js diff --git a/packages/remix/test/fixtures/00-pnpm/node_modules/.pnpm/debug@4.3.4/node_modules/debug/src/node.js b/packages/remix/test/fixtures-legacy/00-pnpm/node_modules/.pnpm/debug@4.3.4/node_modules/debug/src/node.js similarity index 100% rename from packages/remix/test/fixtures/00-pnpm/node_modules/.pnpm/debug@4.3.4/node_modules/debug/src/node.js rename to packages/remix/test/fixtures-legacy/00-pnpm/node_modules/.pnpm/debug@4.3.4/node_modules/debug/src/node.js diff --git a/packages/remix/test/fixtures/00-pnpm/node_modules/.pnpm/debug@4.3.4/node_modules/ms b/packages/remix/test/fixtures-legacy/00-pnpm/node_modules/.pnpm/debug@4.3.4/node_modules/ms similarity index 100% rename from packages/remix/test/fixtures/00-pnpm/node_modules/.pnpm/debug@4.3.4/node_modules/ms rename to packages/remix/test/fixtures-legacy/00-pnpm/node_modules/.pnpm/debug@4.3.4/node_modules/ms diff --git a/packages/remix/test/fixtures/00-pnpm/node_modules/.pnpm/lock.yaml b/packages/remix/test/fixtures-legacy/00-pnpm/node_modules/.pnpm/lock.yaml similarity index 100% rename from packages/remix/test/fixtures/00-pnpm/node_modules/.pnpm/lock.yaml rename to packages/remix/test/fixtures-legacy/00-pnpm/node_modules/.pnpm/lock.yaml diff --git a/packages/remix/test/fixtures/00-pnpm/node_modules/.pnpm/ms@2.1.2/node_modules/ms/index.js b/packages/remix/test/fixtures-legacy/00-pnpm/node_modules/.pnpm/ms@2.1.2/node_modules/ms/index.js similarity index 100% rename from packages/remix/test/fixtures/00-pnpm/node_modules/.pnpm/ms@2.1.2/node_modules/ms/index.js rename to packages/remix/test/fixtures-legacy/00-pnpm/node_modules/.pnpm/ms@2.1.2/node_modules/ms/index.js diff --git a/packages/remix/test/fixtures/00-pnpm/node_modules/.pnpm/ms@2.1.2/node_modules/ms/license.md b/packages/remix/test/fixtures-legacy/00-pnpm/node_modules/.pnpm/ms@2.1.2/node_modules/ms/license.md similarity index 100% rename from packages/remix/test/fixtures/00-pnpm/node_modules/.pnpm/ms@2.1.2/node_modules/ms/license.md rename to packages/remix/test/fixtures-legacy/00-pnpm/node_modules/.pnpm/ms@2.1.2/node_modules/ms/license.md diff --git a/packages/remix/test/fixtures/00-pnpm/node_modules/.pnpm/ms@2.1.2/node_modules/ms/package.json b/packages/remix/test/fixtures-legacy/00-pnpm/node_modules/.pnpm/ms@2.1.2/node_modules/ms/package.json similarity index 100% rename from packages/remix/test/fixtures/00-pnpm/node_modules/.pnpm/ms@2.1.2/node_modules/ms/package.json rename to packages/remix/test/fixtures-legacy/00-pnpm/node_modules/.pnpm/ms@2.1.2/node_modules/ms/package.json diff --git a/packages/remix/test/fixtures/00-pnpm/node_modules/.pnpm/ms@2.1.2/node_modules/ms/readme.md b/packages/remix/test/fixtures-legacy/00-pnpm/node_modules/.pnpm/ms@2.1.2/node_modules/ms/readme.md similarity index 100% rename from packages/remix/test/fixtures/00-pnpm/node_modules/.pnpm/ms@2.1.2/node_modules/ms/readme.md rename to packages/remix/test/fixtures-legacy/00-pnpm/node_modules/.pnpm/ms@2.1.2/node_modules/ms/readme.md diff --git a/packages/remix/test/fixtures/00-pnpm/node_modules/.pnpm/node_modules/ms b/packages/remix/test/fixtures-legacy/00-pnpm/node_modules/.pnpm/node_modules/ms similarity index 100% rename from packages/remix/test/fixtures/00-pnpm/node_modules/.pnpm/node_modules/ms rename to packages/remix/test/fixtures-legacy/00-pnpm/node_modules/.pnpm/node_modules/ms diff --git a/packages/remix/test/fixtures/00-pnpm/node_modules/debug b/packages/remix/test/fixtures-legacy/00-pnpm/node_modules/debug similarity index 100% rename from packages/remix/test/fixtures/00-pnpm/node_modules/debug rename to packages/remix/test/fixtures-legacy/00-pnpm/node_modules/debug diff --git a/packages/remix/test/fixtures/00-pnpm/package.json b/packages/remix/test/fixtures-legacy/00-pnpm/package.json similarity index 100% rename from packages/remix/test/fixtures/00-pnpm/package.json rename to packages/remix/test/fixtures-legacy/00-pnpm/package.json diff --git a/packages/remix/test/fixtures/00-pnpm/pnpm-lock.yaml b/packages/remix/test/fixtures-legacy/00-pnpm/pnpm-lock.yaml similarity index 100% rename from packages/remix/test/fixtures/00-pnpm/pnpm-lock.yaml rename to packages/remix/test/fixtures-legacy/00-pnpm/pnpm-lock.yaml diff --git a/packages/remix/test/fixtures/01-remix-basics/.gitignore b/packages/remix/test/fixtures-legacy/01-remix-basics/.gitignore similarity index 100% rename from packages/remix/test/fixtures/01-remix-basics/.gitignore rename to packages/remix/test/fixtures-legacy/01-remix-basics/.gitignore diff --git a/packages/remix/test/fixtures/01-remix-basics/README.md b/packages/remix/test/fixtures-legacy/01-remix-basics/README.md similarity index 100% rename from packages/remix/test/fixtures/01-remix-basics/README.md rename to packages/remix/test/fixtures-legacy/01-remix-basics/README.md diff --git a/packages/remix/test/fixtures/01-remix-basics/app/b.server.ts b/packages/remix/test/fixtures-legacy/01-remix-basics/app/b.server.ts similarity index 100% rename from packages/remix/test/fixtures/01-remix-basics/app/b.server.ts rename to packages/remix/test/fixtures-legacy/01-remix-basics/app/b.server.ts diff --git a/packages/remix/test/fixtures/01-remix-basics/app/entry.client.tsx b/packages/remix/test/fixtures-legacy/01-remix-basics/app/entry.client.tsx similarity index 100% rename from packages/remix/test/fixtures/01-remix-basics/app/entry.client.tsx rename to packages/remix/test/fixtures-legacy/01-remix-basics/app/entry.client.tsx diff --git a/packages/remix/test/fixtures/01-remix-basics/app/entry.server.tsx b/packages/remix/test/fixtures-legacy/01-remix-basics/app/entry.server.tsx similarity index 100% rename from packages/remix/test/fixtures/01-remix-basics/app/entry.server.tsx rename to packages/remix/test/fixtures-legacy/01-remix-basics/app/entry.server.tsx diff --git a/packages/remix/test/fixtures/01-remix-basics/app/root.tsx b/packages/remix/test/fixtures-legacy/01-remix-basics/app/root.tsx similarity index 100% rename from packages/remix/test/fixtures/01-remix-basics/app/root.tsx rename to packages/remix/test/fixtures-legacy/01-remix-basics/app/root.tsx diff --git a/packages/remix/test/fixtures/01-remix-basics/app/routes/__pathless.tsx b/packages/remix/test/fixtures-legacy/01-remix-basics/app/routes/__pathless.tsx similarity index 100% rename from packages/remix/test/fixtures/01-remix-basics/app/routes/__pathless.tsx rename to packages/remix/test/fixtures-legacy/01-remix-basics/app/routes/__pathless.tsx diff --git a/packages/remix/test/fixtures/01-remix-basics/app/routes/b.tsx b/packages/remix/test/fixtures-legacy/01-remix-basics/app/routes/b.tsx similarity index 100% rename from packages/remix/test/fixtures/01-remix-basics/app/routes/b.tsx rename to packages/remix/test/fixtures-legacy/01-remix-basics/app/routes/b.tsx diff --git a/packages/remix/test/fixtures/01-remix-basics/app/routes/edge.tsx b/packages/remix/test/fixtures-legacy/01-remix-basics/app/routes/edge.tsx similarity index 100% rename from packages/remix/test/fixtures/01-remix-basics/app/routes/edge.tsx rename to packages/remix/test/fixtures-legacy/01-remix-basics/app/routes/edge.tsx diff --git a/packages/remix/test/fixtures/01-remix-basics/app/routes/index.tsx b/packages/remix/test/fixtures-legacy/01-remix-basics/app/routes/index.tsx similarity index 100% rename from packages/remix/test/fixtures/01-remix-basics/app/routes/index.tsx rename to packages/remix/test/fixtures-legacy/01-remix-basics/app/routes/index.tsx diff --git a/packages/remix/test/fixtures/01-remix-basics/app/routes/instanceof.tsx b/packages/remix/test/fixtures-legacy/01-remix-basics/app/routes/instanceof.tsx similarity index 100% rename from packages/remix/test/fixtures/01-remix-basics/app/routes/instanceof.tsx rename to packages/remix/test/fixtures-legacy/01-remix-basics/app/routes/instanceof.tsx diff --git a/packages/remix/test/fixtures/01-remix-basics/app/routes/nested/another.tsx b/packages/remix/test/fixtures-legacy/01-remix-basics/app/routes/nested/another.tsx similarity index 100% rename from packages/remix/test/fixtures/01-remix-basics/app/routes/nested/another.tsx rename to packages/remix/test/fixtures-legacy/01-remix-basics/app/routes/nested/another.tsx diff --git a/packages/remix/test/fixtures/01-remix-basics/app/routes/nested/index.tsx b/packages/remix/test/fixtures-legacy/01-remix-basics/app/routes/nested/index.tsx similarity index 100% rename from packages/remix/test/fixtures/01-remix-basics/app/routes/nested/index.tsx rename to packages/remix/test/fixtures-legacy/01-remix-basics/app/routes/nested/index.tsx diff --git a/packages/remix/test/fixtures/01-remix-basics/app/routes/nested2/__pathless.tsx b/packages/remix/test/fixtures-legacy/01-remix-basics/app/routes/nested2/__pathless.tsx similarity index 100% rename from packages/remix/test/fixtures/01-remix-basics/app/routes/nested2/__pathless.tsx rename to packages/remix/test/fixtures-legacy/01-remix-basics/app/routes/nested2/__pathless.tsx diff --git a/packages/remix/test/fixtures/01-remix-basics/app/routes/projects.tsx b/packages/remix/test/fixtures-legacy/01-remix-basics/app/routes/projects.tsx similarity index 100% rename from packages/remix/test/fixtures/01-remix-basics/app/routes/projects.tsx rename to packages/remix/test/fixtures-legacy/01-remix-basics/app/routes/projects.tsx diff --git a/packages/remix/test/fixtures/01-remix-basics/app/routes/projects/edge.tsx b/packages/remix/test/fixtures-legacy/01-remix-basics/app/routes/projects/edge.tsx similarity index 100% rename from packages/remix/test/fixtures/01-remix-basics/app/routes/projects/edge.tsx rename to packages/remix/test/fixtures-legacy/01-remix-basics/app/routes/projects/edge.tsx diff --git a/packages/remix/test/fixtures/01-remix-basics/app/routes/projects/node.tsx b/packages/remix/test/fixtures-legacy/01-remix-basics/app/routes/projects/node.tsx similarity index 100% rename from packages/remix/test/fixtures/01-remix-basics/app/routes/projects/node.tsx rename to packages/remix/test/fixtures-legacy/01-remix-basics/app/routes/projects/node.tsx diff --git a/packages/remix/test/fixtures/01-remix-basics/app/routes/set-cookie-edge.tsx b/packages/remix/test/fixtures-legacy/01-remix-basics/app/routes/set-cookie-edge.tsx similarity index 100% rename from packages/remix/test/fixtures/01-remix-basics/app/routes/set-cookie-edge.tsx rename to packages/remix/test/fixtures-legacy/01-remix-basics/app/routes/set-cookie-edge.tsx diff --git a/packages/remix/test/fixtures/01-remix-basics/app/routes/set-cookie-node.tsx b/packages/remix/test/fixtures-legacy/01-remix-basics/app/routes/set-cookie-node.tsx similarity index 100% rename from packages/remix/test/fixtures/01-remix-basics/app/routes/set-cookie-node.tsx rename to packages/remix/test/fixtures-legacy/01-remix-basics/app/routes/set-cookie-node.tsx diff --git a/packages/remix/test/fixtures/01-remix-basics/app/routes/tex[t.t]xt.tsx b/packages/remix/test/fixtures-legacy/01-remix-basics/app/routes/tex[t.t]xt.tsx similarity index 100% rename from packages/remix/test/fixtures/01-remix-basics/app/routes/tex[t.t]xt.tsx rename to packages/remix/test/fixtures-legacy/01-remix-basics/app/routes/tex[t.t]xt.tsx diff --git a/packages/remix/test/fixtures/01-remix-basics/package.json b/packages/remix/test/fixtures-legacy/01-remix-basics/package.json similarity index 100% rename from packages/remix/test/fixtures/01-remix-basics/package.json rename to packages/remix/test/fixtures-legacy/01-remix-basics/package.json diff --git a/packages/remix/test/fixtures/01-remix-basics/probes.json b/packages/remix/test/fixtures-legacy/01-remix-basics/probes.json similarity index 100% rename from packages/remix/test/fixtures/01-remix-basics/probes.json rename to packages/remix/test/fixtures-legacy/01-remix-basics/probes.json diff --git a/packages/remix/test/fixtures/01-remix-basics/public/favicon.ico b/packages/remix/test/fixtures-legacy/01-remix-basics/public/favicon.ico similarity index 100% rename from packages/remix/test/fixtures/01-remix-basics/public/favicon.ico rename to packages/remix/test/fixtures-legacy/01-remix-basics/public/favicon.ico diff --git a/packages/remix/test/fixtures/01-remix-basics/remix.config.js b/packages/remix/test/fixtures-legacy/01-remix-basics/remix.config.js similarity index 100% rename from packages/remix/test/fixtures/01-remix-basics/remix.config.js rename to packages/remix/test/fixtures-legacy/01-remix-basics/remix.config.js diff --git a/packages/remix/test/fixtures/01-remix-basics/remix.env.d.ts b/packages/remix/test/fixtures-legacy/01-remix-basics/remix.env.d.ts similarity index 100% rename from packages/remix/test/fixtures/01-remix-basics/remix.env.d.ts rename to packages/remix/test/fixtures-legacy/01-remix-basics/remix.env.d.ts diff --git a/packages/remix/test/fixtures/01-remix-basics/tsconfig.json b/packages/remix/test/fixtures-legacy/01-remix-basics/tsconfig.json similarity index 100% rename from packages/remix/test/fixtures/01-remix-basics/tsconfig.json rename to packages/remix/test/fixtures-legacy/01-remix-basics/tsconfig.json diff --git a/packages/remix/test/fixtures/01-remix-basics/yarn.lock b/packages/remix/test/fixtures-legacy/01-remix-basics/yarn.lock similarity index 100% rename from packages/remix/test/fixtures/01-remix-basics/yarn.lock rename to packages/remix/test/fixtures-legacy/01-remix-basics/yarn.lock diff --git a/packages/remix/test/fixtures/02-remix-basics-mjs/.gitignore b/packages/remix/test/fixtures-legacy/02-remix-basics-mjs/.gitignore similarity index 100% rename from packages/remix/test/fixtures/02-remix-basics-mjs/.gitignore rename to packages/remix/test/fixtures-legacy/02-remix-basics-mjs/.gitignore diff --git a/packages/remix/test/fixtures/02-remix-basics-mjs/README.md b/packages/remix/test/fixtures-legacy/02-remix-basics-mjs/README.md similarity index 100% rename from packages/remix/test/fixtures/02-remix-basics-mjs/README.md rename to packages/remix/test/fixtures-legacy/02-remix-basics-mjs/README.md diff --git a/packages/remix/test/fixtures/02-remix-basics-mjs/app/entry.client.tsx b/packages/remix/test/fixtures-legacy/02-remix-basics-mjs/app/entry.client.tsx similarity index 100% rename from packages/remix/test/fixtures/02-remix-basics-mjs/app/entry.client.tsx rename to packages/remix/test/fixtures-legacy/02-remix-basics-mjs/app/entry.client.tsx diff --git a/packages/remix/test/fixtures/02-remix-basics-mjs/app/entry.server.tsx b/packages/remix/test/fixtures-legacy/02-remix-basics-mjs/app/entry.server.tsx similarity index 100% rename from packages/remix/test/fixtures/02-remix-basics-mjs/app/entry.server.tsx rename to packages/remix/test/fixtures-legacy/02-remix-basics-mjs/app/entry.server.tsx diff --git a/packages/remix/test/fixtures/02-remix-basics-mjs/app/root.tsx b/packages/remix/test/fixtures-legacy/02-remix-basics-mjs/app/root.tsx similarity index 100% rename from packages/remix/test/fixtures/02-remix-basics-mjs/app/root.tsx rename to packages/remix/test/fixtures-legacy/02-remix-basics-mjs/app/root.tsx diff --git a/packages/remix/test/fixtures/02-remix-basics-mjs/app/routes/edge.tsx b/packages/remix/test/fixtures-legacy/02-remix-basics-mjs/app/routes/edge.tsx similarity index 100% rename from packages/remix/test/fixtures/02-remix-basics-mjs/app/routes/edge.tsx rename to packages/remix/test/fixtures-legacy/02-remix-basics-mjs/app/routes/edge.tsx diff --git a/packages/remix/test/fixtures/02-remix-basics-mjs/app/routes/index.tsx b/packages/remix/test/fixtures-legacy/02-remix-basics-mjs/app/routes/index.tsx similarity index 100% rename from packages/remix/test/fixtures/02-remix-basics-mjs/app/routes/index.tsx rename to packages/remix/test/fixtures-legacy/02-remix-basics-mjs/app/routes/index.tsx diff --git a/packages/remix/test/fixtures/02-remix-basics-mjs/app/routes/load-context.tsx b/packages/remix/test/fixtures-legacy/02-remix-basics-mjs/app/routes/load-context.tsx similarity index 100% rename from packages/remix/test/fixtures/02-remix-basics-mjs/app/routes/load-context.tsx rename to packages/remix/test/fixtures-legacy/02-remix-basics-mjs/app/routes/load-context.tsx diff --git a/packages/remix/test/fixtures/02-remix-basics-mjs/package.json b/packages/remix/test/fixtures-legacy/02-remix-basics-mjs/package.json similarity index 100% rename from packages/remix/test/fixtures/02-remix-basics-mjs/package.json rename to packages/remix/test/fixtures-legacy/02-remix-basics-mjs/package.json diff --git a/packages/remix/test/fixtures/02-remix-basics-mjs/probes.json b/packages/remix/test/fixtures-legacy/02-remix-basics-mjs/probes.json similarity index 100% rename from packages/remix/test/fixtures/02-remix-basics-mjs/probes.json rename to packages/remix/test/fixtures-legacy/02-remix-basics-mjs/probes.json diff --git a/packages/remix/test/fixtures/02-remix-basics-mjs/public/favicon.ico b/packages/remix/test/fixtures-legacy/02-remix-basics-mjs/public/favicon.ico similarity index 100% rename from packages/remix/test/fixtures/02-remix-basics-mjs/public/favicon.ico rename to packages/remix/test/fixtures-legacy/02-remix-basics-mjs/public/favicon.ico diff --git a/packages/remix/test/fixtures/02-remix-basics-mjs/remix.config.mjs b/packages/remix/test/fixtures-legacy/02-remix-basics-mjs/remix.config.mjs similarity index 100% rename from packages/remix/test/fixtures/02-remix-basics-mjs/remix.config.mjs rename to packages/remix/test/fixtures-legacy/02-remix-basics-mjs/remix.config.mjs diff --git a/packages/remix/test/fixtures/02-remix-basics-mjs/remix.env.d.ts b/packages/remix/test/fixtures-legacy/02-remix-basics-mjs/remix.env.d.ts similarity index 100% rename from packages/remix/test/fixtures/02-remix-basics-mjs/remix.env.d.ts rename to packages/remix/test/fixtures-legacy/02-remix-basics-mjs/remix.env.d.ts diff --git a/packages/remix/test/fixtures/02-remix-basics-mjs/server.ts b/packages/remix/test/fixtures-legacy/02-remix-basics-mjs/server.ts similarity index 100% rename from packages/remix/test/fixtures/02-remix-basics-mjs/server.ts rename to packages/remix/test/fixtures-legacy/02-remix-basics-mjs/server.ts diff --git a/packages/remix/test/fixtures/02-remix-basics-mjs/tsconfig.json b/packages/remix/test/fixtures-legacy/02-remix-basics-mjs/tsconfig.json similarity index 100% rename from packages/remix/test/fixtures/02-remix-basics-mjs/tsconfig.json rename to packages/remix/test/fixtures-legacy/02-remix-basics-mjs/tsconfig.json diff --git a/packages/remix/test/fixtures/02-remix-basics-mjs/yarn.lock b/packages/remix/test/fixtures-legacy/02-remix-basics-mjs/yarn.lock similarity index 100% rename from packages/remix/test/fixtures/02-remix-basics-mjs/yarn.lock rename to packages/remix/test/fixtures-legacy/02-remix-basics-mjs/yarn.lock diff --git a/packages/remix/test/fixtures/03-with-pnpm/.gitignore b/packages/remix/test/fixtures-legacy/03-with-pnpm/.gitignore similarity index 100% rename from packages/remix/test/fixtures/03-with-pnpm/.gitignore rename to packages/remix/test/fixtures-legacy/03-with-pnpm/.gitignore diff --git a/packages/remix/test/fixtures/03-with-pnpm/README.md b/packages/remix/test/fixtures-legacy/03-with-pnpm/README.md similarity index 100% rename from packages/remix/test/fixtures/03-with-pnpm/README.md rename to packages/remix/test/fixtures-legacy/03-with-pnpm/README.md diff --git a/packages/remix/test/fixtures/03-with-pnpm/app/entry.client.tsx b/packages/remix/test/fixtures-legacy/03-with-pnpm/app/entry.client.tsx similarity index 100% rename from packages/remix/test/fixtures/03-with-pnpm/app/entry.client.tsx rename to packages/remix/test/fixtures-legacy/03-with-pnpm/app/entry.client.tsx diff --git a/packages/remix/test/fixtures/03-with-pnpm/app/entry.server.tsx b/packages/remix/test/fixtures-legacy/03-with-pnpm/app/entry.server.tsx similarity index 100% rename from packages/remix/test/fixtures/03-with-pnpm/app/entry.server.tsx rename to packages/remix/test/fixtures-legacy/03-with-pnpm/app/entry.server.tsx diff --git a/packages/remix/test/fixtures/03-with-pnpm/app/root.tsx b/packages/remix/test/fixtures-legacy/03-with-pnpm/app/root.tsx similarity index 100% rename from packages/remix/test/fixtures/03-with-pnpm/app/root.tsx rename to packages/remix/test/fixtures-legacy/03-with-pnpm/app/root.tsx diff --git a/packages/remix/test/fixtures/03-with-pnpm/app/routes/$.tsx b/packages/remix/test/fixtures-legacy/03-with-pnpm/app/routes/$.tsx similarity index 100% rename from packages/remix/test/fixtures/03-with-pnpm/app/routes/$.tsx rename to packages/remix/test/fixtures-legacy/03-with-pnpm/app/routes/$.tsx diff --git a/packages/remix/test/fixtures/03-with-pnpm/app/routes/b.tsx b/packages/remix/test/fixtures-legacy/03-with-pnpm/app/routes/b.tsx similarity index 100% rename from packages/remix/test/fixtures/03-with-pnpm/app/routes/b.tsx rename to packages/remix/test/fixtures-legacy/03-with-pnpm/app/routes/b.tsx diff --git a/packages/remix/test/fixtures/03-with-pnpm/app/routes/edge.tsx b/packages/remix/test/fixtures-legacy/03-with-pnpm/app/routes/edge.tsx similarity index 100% rename from packages/remix/test/fixtures/03-with-pnpm/app/routes/edge.tsx rename to packages/remix/test/fixtures-legacy/03-with-pnpm/app/routes/edge.tsx diff --git a/packages/remix/test/fixtures/03-with-pnpm/app/routes/index.tsx b/packages/remix/test/fixtures-legacy/03-with-pnpm/app/routes/index.tsx similarity index 100% rename from packages/remix/test/fixtures/03-with-pnpm/app/routes/index.tsx rename to packages/remix/test/fixtures-legacy/03-with-pnpm/app/routes/index.tsx diff --git a/packages/remix/test/fixtures/03-with-pnpm/app/routes/nested/another.tsx b/packages/remix/test/fixtures-legacy/03-with-pnpm/app/routes/nested/another.tsx similarity index 100% rename from packages/remix/test/fixtures/03-with-pnpm/app/routes/nested/another.tsx rename to packages/remix/test/fixtures-legacy/03-with-pnpm/app/routes/nested/another.tsx diff --git a/packages/remix/test/fixtures/03-with-pnpm/app/routes/nested/index.tsx b/packages/remix/test/fixtures-legacy/03-with-pnpm/app/routes/nested/index.tsx similarity index 100% rename from packages/remix/test/fixtures/03-with-pnpm/app/routes/nested/index.tsx rename to packages/remix/test/fixtures-legacy/03-with-pnpm/app/routes/nested/index.tsx diff --git a/packages/remix/test/fixtures/03-with-pnpm/app/routes/sub/$.tsx b/packages/remix/test/fixtures-legacy/03-with-pnpm/app/routes/sub/$.tsx similarity index 100% rename from packages/remix/test/fixtures/03-with-pnpm/app/routes/sub/$.tsx rename to packages/remix/test/fixtures-legacy/03-with-pnpm/app/routes/sub/$.tsx diff --git a/packages/remix/test/fixtures/03-with-pnpm/package.json b/packages/remix/test/fixtures-legacy/03-with-pnpm/package.json similarity index 100% rename from packages/remix/test/fixtures/03-with-pnpm/package.json rename to packages/remix/test/fixtures-legacy/03-with-pnpm/package.json diff --git a/packages/remix/test/fixtures/03-with-pnpm/pnpm-lock.yaml b/packages/remix/test/fixtures-legacy/03-with-pnpm/pnpm-lock.yaml similarity index 100% rename from packages/remix/test/fixtures/03-with-pnpm/pnpm-lock.yaml rename to packages/remix/test/fixtures-legacy/03-with-pnpm/pnpm-lock.yaml diff --git a/packages/remix/test/fixtures/03-with-pnpm/probes.json b/packages/remix/test/fixtures-legacy/03-with-pnpm/probes.json similarity index 100% rename from packages/remix/test/fixtures/03-with-pnpm/probes.json rename to packages/remix/test/fixtures-legacy/03-with-pnpm/probes.json diff --git a/packages/remix/test/fixtures/03-with-pnpm/public/favicon.ico b/packages/remix/test/fixtures-legacy/03-with-pnpm/public/favicon.ico similarity index 100% rename from packages/remix/test/fixtures/03-with-pnpm/public/favicon.ico rename to packages/remix/test/fixtures-legacy/03-with-pnpm/public/favicon.ico diff --git a/packages/remix/test/fixtures/03-with-pnpm/remix.config.js b/packages/remix/test/fixtures-legacy/03-with-pnpm/remix.config.js similarity index 100% rename from packages/remix/test/fixtures/03-with-pnpm/remix.config.js rename to packages/remix/test/fixtures-legacy/03-with-pnpm/remix.config.js diff --git a/packages/remix/test/fixtures/03-with-pnpm/remix.env.d.ts b/packages/remix/test/fixtures-legacy/03-with-pnpm/remix.env.d.ts similarity index 100% rename from packages/remix/test/fixtures/03-with-pnpm/remix.env.d.ts rename to packages/remix/test/fixtures-legacy/03-with-pnpm/remix.env.d.ts diff --git a/packages/remix/test/fixtures/03-with-pnpm/tsconfig.json b/packages/remix/test/fixtures-legacy/03-with-pnpm/tsconfig.json similarity index 100% rename from packages/remix/test/fixtures/03-with-pnpm/tsconfig.json rename to packages/remix/test/fixtures-legacy/03-with-pnpm/tsconfig.json diff --git a/packages/remix/test/fixtures/04-with-npm9-linked/.gitignore b/packages/remix/test/fixtures-legacy/04-with-npm9-linked/.gitignore similarity index 100% rename from packages/remix/test/fixtures/04-with-npm9-linked/.gitignore rename to packages/remix/test/fixtures-legacy/04-with-npm9-linked/.gitignore diff --git a/packages/remix/test/fixtures/04-with-npm9-linked/.npmrc b/packages/remix/test/fixtures-legacy/04-with-npm9-linked/.npmrc similarity index 100% rename from packages/remix/test/fixtures/04-with-npm9-linked/.npmrc rename to packages/remix/test/fixtures-legacy/04-with-npm9-linked/.npmrc diff --git a/packages/remix/test/fixtures/04-with-npm9-linked/README.md b/packages/remix/test/fixtures-legacy/04-with-npm9-linked/README.md similarity index 100% rename from packages/remix/test/fixtures/04-with-npm9-linked/README.md rename to packages/remix/test/fixtures-legacy/04-with-npm9-linked/README.md diff --git a/packages/remix/test/fixtures/04-with-npm9-linked/app/entry.client.tsx b/packages/remix/test/fixtures-legacy/04-with-npm9-linked/app/entry.client.tsx similarity index 100% rename from packages/remix/test/fixtures/04-with-npm9-linked/app/entry.client.tsx rename to packages/remix/test/fixtures-legacy/04-with-npm9-linked/app/entry.client.tsx diff --git a/packages/remix/test/fixtures/04-with-npm9-linked/app/entry.server.tsx b/packages/remix/test/fixtures-legacy/04-with-npm9-linked/app/entry.server.tsx similarity index 100% rename from packages/remix/test/fixtures/04-with-npm9-linked/app/entry.server.tsx rename to packages/remix/test/fixtures-legacy/04-with-npm9-linked/app/entry.server.tsx diff --git a/packages/remix/test/fixtures/04-with-npm9-linked/app/root.tsx b/packages/remix/test/fixtures-legacy/04-with-npm9-linked/app/root.tsx similarity index 100% rename from packages/remix/test/fixtures/04-with-npm9-linked/app/root.tsx rename to packages/remix/test/fixtures-legacy/04-with-npm9-linked/app/root.tsx diff --git a/packages/remix/test/fixtures/04-with-npm9-linked/app/routes/b.tsx b/packages/remix/test/fixtures-legacy/04-with-npm9-linked/app/routes/b.tsx similarity index 100% rename from packages/remix/test/fixtures/04-with-npm9-linked/app/routes/b.tsx rename to packages/remix/test/fixtures-legacy/04-with-npm9-linked/app/routes/b.tsx diff --git a/packages/remix/test/fixtures/04-with-npm9-linked/app/routes/edge.tsx b/packages/remix/test/fixtures-legacy/04-with-npm9-linked/app/routes/edge.tsx similarity index 100% rename from packages/remix/test/fixtures/04-with-npm9-linked/app/routes/edge.tsx rename to packages/remix/test/fixtures-legacy/04-with-npm9-linked/app/routes/edge.tsx diff --git a/packages/remix/test/fixtures/04-with-npm9-linked/app/routes/index.tsx b/packages/remix/test/fixtures-legacy/04-with-npm9-linked/app/routes/index.tsx similarity index 100% rename from packages/remix/test/fixtures/04-with-npm9-linked/app/routes/index.tsx rename to packages/remix/test/fixtures-legacy/04-with-npm9-linked/app/routes/index.tsx diff --git a/packages/remix/test/fixtures/04-with-npm9-linked/app/routes/nested/another.tsx b/packages/remix/test/fixtures-legacy/04-with-npm9-linked/app/routes/nested/another.tsx similarity index 100% rename from packages/remix/test/fixtures/04-with-npm9-linked/app/routes/nested/another.tsx rename to packages/remix/test/fixtures-legacy/04-with-npm9-linked/app/routes/nested/another.tsx diff --git a/packages/remix/test/fixtures/04-with-npm9-linked/app/routes/nested/index.tsx b/packages/remix/test/fixtures-legacy/04-with-npm9-linked/app/routes/nested/index.tsx similarity index 100% rename from packages/remix/test/fixtures/04-with-npm9-linked/app/routes/nested/index.tsx rename to packages/remix/test/fixtures-legacy/04-with-npm9-linked/app/routes/nested/index.tsx diff --git a/packages/remix/test/fixtures/04-with-npm9-linked/package-lock.json b/packages/remix/test/fixtures-legacy/04-with-npm9-linked/package-lock.json similarity index 100% rename from packages/remix/test/fixtures/04-with-npm9-linked/package-lock.json rename to packages/remix/test/fixtures-legacy/04-with-npm9-linked/package-lock.json diff --git a/packages/remix/test/fixtures/04-with-npm9-linked/package.json b/packages/remix/test/fixtures-legacy/04-with-npm9-linked/package.json similarity index 100% rename from packages/remix/test/fixtures/04-with-npm9-linked/package.json rename to packages/remix/test/fixtures-legacy/04-with-npm9-linked/package.json diff --git a/packages/remix/test/fixtures/04-with-npm9-linked/probes.json b/packages/remix/test/fixtures-legacy/04-with-npm9-linked/probes.json similarity index 100% rename from packages/remix/test/fixtures/04-with-npm9-linked/probes.json rename to packages/remix/test/fixtures-legacy/04-with-npm9-linked/probes.json diff --git a/packages/remix/test/fixtures/04-with-npm9-linked/public/favicon.ico b/packages/remix/test/fixtures-legacy/04-with-npm9-linked/public/favicon.ico similarity index 100% rename from packages/remix/test/fixtures/04-with-npm9-linked/public/favicon.ico rename to packages/remix/test/fixtures-legacy/04-with-npm9-linked/public/favicon.ico diff --git a/packages/remix/test/fixtures/04-with-npm9-linked/remix.config.js b/packages/remix/test/fixtures-legacy/04-with-npm9-linked/remix.config.js similarity index 100% rename from packages/remix/test/fixtures/04-with-npm9-linked/remix.config.js rename to packages/remix/test/fixtures-legacy/04-with-npm9-linked/remix.config.js diff --git a/packages/remix/test/fixtures/04-with-npm9-linked/remix.env.d.ts b/packages/remix/test/fixtures-legacy/04-with-npm9-linked/remix.env.d.ts similarity index 100% rename from packages/remix/test/fixtures/04-with-npm9-linked/remix.env.d.ts rename to packages/remix/test/fixtures-legacy/04-with-npm9-linked/remix.env.d.ts diff --git a/packages/remix/test/fixtures/04-with-npm9-linked/tsconfig.json b/packages/remix/test/fixtures-legacy/04-with-npm9-linked/tsconfig.json similarity index 100% rename from packages/remix/test/fixtures/04-with-npm9-linked/tsconfig.json rename to packages/remix/test/fixtures-legacy/04-with-npm9-linked/tsconfig.json diff --git a/packages/remix/test/fixtures/04-with-npm9-linked/vercel.json b/packages/remix/test/fixtures-legacy/04-with-npm9-linked/vercel.json similarity index 100% rename from packages/remix/test/fixtures/04-with-npm9-linked/vercel.json rename to packages/remix/test/fixtures-legacy/04-with-npm9-linked/vercel.json diff --git a/packages/remix/test/fixtures/05-root-only/.gitignore b/packages/remix/test/fixtures-legacy/05-root-only/.gitignore similarity index 100% rename from packages/remix/test/fixtures/05-root-only/.gitignore rename to packages/remix/test/fixtures-legacy/05-root-only/.gitignore diff --git a/packages/remix/test/fixtures/05-root-only/app/entry.client.jsx b/packages/remix/test/fixtures-legacy/05-root-only/app/entry.client.jsx similarity index 100% rename from packages/remix/test/fixtures/05-root-only/app/entry.client.jsx rename to packages/remix/test/fixtures-legacy/05-root-only/app/entry.client.jsx diff --git a/packages/remix/test/fixtures/05-root-only/app/entry.server.jsx b/packages/remix/test/fixtures-legacy/05-root-only/app/entry.server.jsx similarity index 100% rename from packages/remix/test/fixtures/05-root-only/app/entry.server.jsx rename to packages/remix/test/fixtures-legacy/05-root-only/app/entry.server.jsx diff --git a/packages/remix/test/fixtures/05-root-only/app/root.jsx b/packages/remix/test/fixtures-legacy/05-root-only/app/root.jsx similarity index 100% rename from packages/remix/test/fixtures/05-root-only/app/root.jsx rename to packages/remix/test/fixtures-legacy/05-root-only/app/root.jsx diff --git a/packages/remix/test/fixtures/05-root-only/package-lock.json b/packages/remix/test/fixtures-legacy/05-root-only/package-lock.json similarity index 100% rename from packages/remix/test/fixtures/05-root-only/package-lock.json rename to packages/remix/test/fixtures-legacy/05-root-only/package-lock.json diff --git a/packages/remix/test/fixtures/05-root-only/package.json b/packages/remix/test/fixtures-legacy/05-root-only/package.json similarity index 100% rename from packages/remix/test/fixtures/05-root-only/package.json rename to packages/remix/test/fixtures-legacy/05-root-only/package.json diff --git a/packages/remix/test/fixtures/05-root-only/probes.json b/packages/remix/test/fixtures-legacy/05-root-only/probes.json similarity index 100% rename from packages/remix/test/fixtures/05-root-only/probes.json rename to packages/remix/test/fixtures-legacy/05-root-only/probes.json diff --git a/packages/remix/test/fixtures/05-root-only/remix.config.js b/packages/remix/test/fixtures-legacy/05-root-only/remix.config.js similarity index 100% rename from packages/remix/test/fixtures/05-root-only/remix.config.js rename to packages/remix/test/fixtures-legacy/05-root-only/remix.config.js diff --git a/packages/remix/test/fixtures/06-v2-routing/.gitignore b/packages/remix/test/fixtures-legacy/06-v2-routing/.gitignore similarity index 100% rename from packages/remix/test/fixtures/06-v2-routing/.gitignore rename to packages/remix/test/fixtures-legacy/06-v2-routing/.gitignore diff --git a/packages/remix/test/fixtures/06-v2-routing/app/root.jsx b/packages/remix/test/fixtures-legacy/06-v2-routing/app/root.jsx similarity index 100% rename from packages/remix/test/fixtures/06-v2-routing/app/root.jsx rename to packages/remix/test/fixtures-legacy/06-v2-routing/app/root.jsx diff --git a/packages/remix/test/fixtures/06-v2-routing/app/routes/_index.jsx b/packages/remix/test/fixtures-legacy/06-v2-routing/app/routes/_index.jsx similarity index 100% rename from packages/remix/test/fixtures/06-v2-routing/app/routes/_index.jsx rename to packages/remix/test/fixtures-legacy/06-v2-routing/app/routes/_index.jsx diff --git a/packages/remix/test/fixtures/06-v2-routing/app/routes/admin.(lol).tsx b/packages/remix/test/fixtures-legacy/06-v2-routing/app/routes/admin.(lol).tsx similarity index 100% rename from packages/remix/test/fixtures/06-v2-routing/app/routes/admin.(lol).tsx rename to packages/remix/test/fixtures-legacy/06-v2-routing/app/routes/admin.(lol).tsx diff --git a/packages/remix/test/fixtures/06-v2-routing/app/routes/foo.jsx b/packages/remix/test/fixtures-legacy/06-v2-routing/app/routes/foo.jsx similarity index 100% rename from packages/remix/test/fixtures/06-v2-routing/app/routes/foo.jsx rename to packages/remix/test/fixtures-legacy/06-v2-routing/app/routes/foo.jsx diff --git a/packages/remix/test/fixtures/06-v2-routing/app/routes/fuzz.buzz-2.jsx b/packages/remix/test/fixtures-legacy/06-v2-routing/app/routes/fuzz.buzz-2.jsx similarity index 100% rename from packages/remix/test/fixtures/06-v2-routing/app/routes/fuzz.buzz-2.jsx rename to packages/remix/test/fixtures-legacy/06-v2-routing/app/routes/fuzz.buzz-2.jsx diff --git a/packages/remix/test/fixtures/06-v2-routing/app/routes/fuzz.buzz.jsx b/packages/remix/test/fixtures-legacy/06-v2-routing/app/routes/fuzz.buzz.jsx similarity index 100% rename from packages/remix/test/fixtures/06-v2-routing/app/routes/fuzz.buzz.jsx rename to packages/remix/test/fixtures-legacy/06-v2-routing/app/routes/fuzz.buzz.jsx diff --git a/packages/remix/test/fixtures/06-v2-routing/app/routes/nested/route.jsx b/packages/remix/test/fixtures-legacy/06-v2-routing/app/routes/nested/route.jsx similarity index 100% rename from packages/remix/test/fixtures/06-v2-routing/app/routes/nested/route.jsx rename to packages/remix/test/fixtures-legacy/06-v2-routing/app/routes/nested/route.jsx diff --git a/packages/remix/test/fixtures/06-v2-routing/package-lock.json b/packages/remix/test/fixtures-legacy/06-v2-routing/package-lock.json similarity index 100% rename from packages/remix/test/fixtures/06-v2-routing/package-lock.json rename to packages/remix/test/fixtures-legacy/06-v2-routing/package-lock.json diff --git a/packages/remix/test/fixtures/06-v2-routing/package.json b/packages/remix/test/fixtures-legacy/06-v2-routing/package.json similarity index 100% rename from packages/remix/test/fixtures/06-v2-routing/package.json rename to packages/remix/test/fixtures-legacy/06-v2-routing/package.json diff --git a/packages/remix/test/fixtures/06-v2-routing/probes.json b/packages/remix/test/fixtures-legacy/06-v2-routing/probes.json similarity index 100% rename from packages/remix/test/fixtures/06-v2-routing/probes.json rename to packages/remix/test/fixtures-legacy/06-v2-routing/probes.json diff --git a/packages/remix/test/fixtures/06-v2-routing/remix.config.js b/packages/remix/test/fixtures-legacy/06-v2-routing/remix.config.js similarity index 100% rename from packages/remix/test/fixtures/06-v2-routing/remix.config.js rename to packages/remix/test/fixtures-legacy/06-v2-routing/remix.config.js diff --git a/packages/remix/test/fixtures/07-turborepo/.gitignore b/packages/remix/test/fixtures-legacy/07-turborepo/.gitignore similarity index 100% rename from packages/remix/test/fixtures/07-turborepo/.gitignore rename to packages/remix/test/fixtures-legacy/07-turborepo/.gitignore diff --git a/packages/remix/test/fixtures/07-turborepo/apps/remix-app/app/entry.client.tsx b/packages/remix/test/fixtures-legacy/07-turborepo/apps/remix-app/app/entry.client.tsx similarity index 100% rename from packages/remix/test/fixtures/07-turborepo/apps/remix-app/app/entry.client.tsx rename to packages/remix/test/fixtures-legacy/07-turborepo/apps/remix-app/app/entry.client.tsx diff --git a/packages/remix/test/fixtures/07-turborepo/apps/remix-app/app/entry.server.tsx b/packages/remix/test/fixtures-legacy/07-turborepo/apps/remix-app/app/entry.server.tsx similarity index 100% rename from packages/remix/test/fixtures/07-turborepo/apps/remix-app/app/entry.server.tsx rename to packages/remix/test/fixtures-legacy/07-turborepo/apps/remix-app/app/entry.server.tsx diff --git a/packages/remix/test/fixtures/07-turborepo/apps/remix-app/app/root.tsx b/packages/remix/test/fixtures-legacy/07-turborepo/apps/remix-app/app/root.tsx similarity index 100% rename from packages/remix/test/fixtures/07-turborepo/apps/remix-app/app/root.tsx rename to packages/remix/test/fixtures-legacy/07-turborepo/apps/remix-app/app/root.tsx diff --git a/packages/remix/test/fixtures/07-turborepo/apps/remix-app/app/routes/index.tsx b/packages/remix/test/fixtures-legacy/07-turborepo/apps/remix-app/app/routes/index.tsx similarity index 100% rename from packages/remix/test/fixtures/07-turborepo/apps/remix-app/app/routes/index.tsx rename to packages/remix/test/fixtures-legacy/07-turborepo/apps/remix-app/app/routes/index.tsx diff --git a/packages/remix/test/fixtures/07-turborepo/apps/remix-app/package.json b/packages/remix/test/fixtures-legacy/07-turborepo/apps/remix-app/package.json similarity index 100% rename from packages/remix/test/fixtures/07-turborepo/apps/remix-app/package.json rename to packages/remix/test/fixtures-legacy/07-turborepo/apps/remix-app/package.json diff --git a/packages/remix/test/fixtures/07-turborepo/apps/remix-app/public/favicon.ico b/packages/remix/test/fixtures-legacy/07-turborepo/apps/remix-app/public/favicon.ico similarity index 100% rename from packages/remix/test/fixtures/07-turborepo/apps/remix-app/public/favicon.ico rename to packages/remix/test/fixtures-legacy/07-turborepo/apps/remix-app/public/favicon.ico diff --git a/packages/remix/test/fixtures/07-turborepo/apps/remix-app/remix.config.js b/packages/remix/test/fixtures-legacy/07-turborepo/apps/remix-app/remix.config.js similarity index 100% rename from packages/remix/test/fixtures/07-turborepo/apps/remix-app/remix.config.js rename to packages/remix/test/fixtures-legacy/07-turborepo/apps/remix-app/remix.config.js diff --git a/packages/remix/test/fixtures/07-turborepo/apps/remix-app/remix.env.d.ts b/packages/remix/test/fixtures-legacy/07-turborepo/apps/remix-app/remix.env.d.ts similarity index 100% rename from packages/remix/test/fixtures/07-turborepo/apps/remix-app/remix.env.d.ts rename to packages/remix/test/fixtures-legacy/07-turborepo/apps/remix-app/remix.env.d.ts diff --git a/packages/remix/test/fixtures/07-turborepo/apps/remix-app/server.js b/packages/remix/test/fixtures-legacy/07-turborepo/apps/remix-app/server.js similarity index 100% rename from packages/remix/test/fixtures/07-turborepo/apps/remix-app/server.js rename to packages/remix/test/fixtures-legacy/07-turborepo/apps/remix-app/server.js diff --git a/packages/remix/test/fixtures/07-turborepo/apps/remix-app/tsconfig.json b/packages/remix/test/fixtures-legacy/07-turborepo/apps/remix-app/tsconfig.json similarity index 100% rename from packages/remix/test/fixtures/07-turborepo/apps/remix-app/tsconfig.json rename to packages/remix/test/fixtures-legacy/07-turborepo/apps/remix-app/tsconfig.json diff --git a/packages/remix/test/fixtures/07-turborepo/package.json b/packages/remix/test/fixtures-legacy/07-turborepo/package.json similarity index 100% rename from packages/remix/test/fixtures/07-turborepo/package.json rename to packages/remix/test/fixtures-legacy/07-turborepo/package.json diff --git a/packages/remix/test/fixtures/07-turborepo/packages/ui/package.json b/packages/remix/test/fixtures-legacy/07-turborepo/packages/ui/package.json similarity index 100% rename from packages/remix/test/fixtures/07-turborepo/packages/ui/package.json rename to packages/remix/test/fixtures-legacy/07-turborepo/packages/ui/package.json diff --git a/packages/remix/test/fixtures/07-turborepo/packages/ui/src/Button.tsx b/packages/remix/test/fixtures-legacy/07-turborepo/packages/ui/src/Button.tsx similarity index 100% rename from packages/remix/test/fixtures/07-turborepo/packages/ui/src/Button.tsx rename to packages/remix/test/fixtures-legacy/07-turborepo/packages/ui/src/Button.tsx diff --git a/packages/remix/test/fixtures/07-turborepo/packages/ui/src/index.tsx b/packages/remix/test/fixtures-legacy/07-turborepo/packages/ui/src/index.tsx similarity index 100% rename from packages/remix/test/fixtures/07-turborepo/packages/ui/src/index.tsx rename to packages/remix/test/fixtures-legacy/07-turborepo/packages/ui/src/index.tsx diff --git a/packages/remix/test/fixtures/07-turborepo/packages/ui/tsconfig.json b/packages/remix/test/fixtures-legacy/07-turborepo/packages/ui/tsconfig.json similarity index 100% rename from packages/remix/test/fixtures/07-turborepo/packages/ui/tsconfig.json rename to packages/remix/test/fixtures-legacy/07-turborepo/packages/ui/tsconfig.json diff --git a/packages/remix/test/fixtures/07-turborepo/probes.json b/packages/remix/test/fixtures-legacy/07-turborepo/probes.json similarity index 100% rename from packages/remix/test/fixtures/07-turborepo/probes.json rename to packages/remix/test/fixtures-legacy/07-turborepo/probes.json diff --git a/packages/remix/test/fixtures/07-turborepo/turbo.json b/packages/remix/test/fixtures-legacy/07-turborepo/turbo.json similarity index 100% rename from packages/remix/test/fixtures/07-turborepo/turbo.json rename to packages/remix/test/fixtures-legacy/07-turborepo/turbo.json diff --git a/packages/remix/test/fixtures/07-turborepo/vercel.json b/packages/remix/test/fixtures-legacy/07-turborepo/vercel.json similarity index 100% rename from packages/remix/test/fixtures/07-turborepo/vercel.json rename to packages/remix/test/fixtures-legacy/07-turborepo/vercel.json diff --git a/packages/remix/test/fixtures/07-turborepo/yarn.lock b/packages/remix/test/fixtures-legacy/07-turborepo/yarn.lock similarity index 100% rename from packages/remix/test/fixtures/07-turborepo/yarn.lock rename to packages/remix/test/fixtures-legacy/07-turborepo/yarn.lock diff --git a/packages/remix/test/fixtures/08-no-entry-yarn/app/root.tsx b/packages/remix/test/fixtures-legacy/08-no-entry-yarn/app/root.tsx similarity index 100% rename from packages/remix/test/fixtures/08-no-entry-yarn/app/root.tsx rename to packages/remix/test/fixtures-legacy/08-no-entry-yarn/app/root.tsx diff --git a/packages/remix/test/fixtures/08-no-entry-yarn/app/routes/index.tsx b/packages/remix/test/fixtures-legacy/08-no-entry-yarn/app/routes/index.tsx similarity index 100% rename from packages/remix/test/fixtures/08-no-entry-yarn/app/routes/index.tsx rename to packages/remix/test/fixtures-legacy/08-no-entry-yarn/app/routes/index.tsx diff --git a/packages/remix/test/fixtures/08-no-entry-yarn/package.json b/packages/remix/test/fixtures-legacy/08-no-entry-yarn/package.json similarity index 100% rename from packages/remix/test/fixtures/08-no-entry-yarn/package.json rename to packages/remix/test/fixtures-legacy/08-no-entry-yarn/package.json diff --git a/packages/remix/test/fixtures/08-no-entry-yarn/probes.json b/packages/remix/test/fixtures-legacy/08-no-entry-yarn/probes.json similarity index 100% rename from packages/remix/test/fixtures/08-no-entry-yarn/probes.json rename to packages/remix/test/fixtures-legacy/08-no-entry-yarn/probes.json diff --git a/packages/remix/test/fixtures/08-no-entry-yarn/public/favicon.ico b/packages/remix/test/fixtures-legacy/08-no-entry-yarn/public/favicon.ico similarity index 100% rename from packages/remix/test/fixtures/08-no-entry-yarn/public/favicon.ico rename to packages/remix/test/fixtures-legacy/08-no-entry-yarn/public/favicon.ico diff --git a/packages/remix/test/fixtures/08-no-entry-yarn/remix.config.js b/packages/remix/test/fixtures-legacy/08-no-entry-yarn/remix.config.js similarity index 100% rename from packages/remix/test/fixtures/08-no-entry-yarn/remix.config.js rename to packages/remix/test/fixtures-legacy/08-no-entry-yarn/remix.config.js diff --git a/packages/remix/test/fixtures/08-no-entry-yarn/remix.env.d.ts b/packages/remix/test/fixtures-legacy/08-no-entry-yarn/remix.env.d.ts similarity index 100% rename from packages/remix/test/fixtures/08-no-entry-yarn/remix.env.d.ts rename to packages/remix/test/fixtures-legacy/08-no-entry-yarn/remix.env.d.ts diff --git a/packages/remix/test/fixtures/08-no-entry-yarn/server.js b/packages/remix/test/fixtures-legacy/08-no-entry-yarn/server.js similarity index 100% rename from packages/remix/test/fixtures/08-no-entry-yarn/server.js rename to packages/remix/test/fixtures-legacy/08-no-entry-yarn/server.js diff --git a/packages/remix/test/fixtures/08-no-entry-yarn/tsconfig.json b/packages/remix/test/fixtures-legacy/08-no-entry-yarn/tsconfig.json similarity index 100% rename from packages/remix/test/fixtures/08-no-entry-yarn/tsconfig.json rename to packages/remix/test/fixtures-legacy/08-no-entry-yarn/tsconfig.json diff --git a/packages/remix/test/fixtures/08-no-entry-yarn/yarn.lock b/packages/remix/test/fixtures-legacy/08-no-entry-yarn/yarn.lock similarity index 100% rename from packages/remix/test/fixtures/08-no-entry-yarn/yarn.lock rename to packages/remix/test/fixtures-legacy/08-no-entry-yarn/yarn.lock diff --git a/packages/remix/test/fixtures/09-no-entry-pnpm/app/root.tsx b/packages/remix/test/fixtures-legacy/09-no-entry-pnpm/app/root.tsx similarity index 100% rename from packages/remix/test/fixtures/09-no-entry-pnpm/app/root.tsx rename to packages/remix/test/fixtures-legacy/09-no-entry-pnpm/app/root.tsx diff --git a/packages/remix/test/fixtures/09-no-entry-pnpm/app/routes/index.tsx b/packages/remix/test/fixtures-legacy/09-no-entry-pnpm/app/routes/index.tsx similarity index 100% rename from packages/remix/test/fixtures/09-no-entry-pnpm/app/routes/index.tsx rename to packages/remix/test/fixtures-legacy/09-no-entry-pnpm/app/routes/index.tsx diff --git a/packages/remix/test/fixtures/09-no-entry-pnpm/package.json b/packages/remix/test/fixtures-legacy/09-no-entry-pnpm/package.json similarity index 100% rename from packages/remix/test/fixtures/09-no-entry-pnpm/package.json rename to packages/remix/test/fixtures-legacy/09-no-entry-pnpm/package.json diff --git a/packages/remix/test/fixtures/09-no-entry-pnpm/pnpm-lock.yaml b/packages/remix/test/fixtures-legacy/09-no-entry-pnpm/pnpm-lock.yaml similarity index 100% rename from packages/remix/test/fixtures/09-no-entry-pnpm/pnpm-lock.yaml rename to packages/remix/test/fixtures-legacy/09-no-entry-pnpm/pnpm-lock.yaml diff --git a/packages/remix/test/fixtures/09-no-entry-pnpm/probes.json b/packages/remix/test/fixtures-legacy/09-no-entry-pnpm/probes.json similarity index 100% rename from packages/remix/test/fixtures/09-no-entry-pnpm/probes.json rename to packages/remix/test/fixtures-legacy/09-no-entry-pnpm/probes.json diff --git a/packages/remix/test/fixtures/09-no-entry-pnpm/public/favicon.ico b/packages/remix/test/fixtures-legacy/09-no-entry-pnpm/public/favicon.ico similarity index 100% rename from packages/remix/test/fixtures/09-no-entry-pnpm/public/favicon.ico rename to packages/remix/test/fixtures-legacy/09-no-entry-pnpm/public/favicon.ico diff --git a/packages/remix/test/fixtures/09-no-entry-pnpm/remix.config.js b/packages/remix/test/fixtures-legacy/09-no-entry-pnpm/remix.config.js similarity index 100% rename from packages/remix/test/fixtures/09-no-entry-pnpm/remix.config.js rename to packages/remix/test/fixtures-legacy/09-no-entry-pnpm/remix.config.js diff --git a/packages/remix/test/fixtures/09-no-entry-pnpm/remix.env.d.ts b/packages/remix/test/fixtures-legacy/09-no-entry-pnpm/remix.env.d.ts similarity index 100% rename from packages/remix/test/fixtures/09-no-entry-pnpm/remix.env.d.ts rename to packages/remix/test/fixtures-legacy/09-no-entry-pnpm/remix.env.d.ts diff --git a/packages/remix/test/fixtures/09-no-entry-pnpm/server.js b/packages/remix/test/fixtures-legacy/09-no-entry-pnpm/server.js similarity index 100% rename from packages/remix/test/fixtures/09-no-entry-pnpm/server.js rename to packages/remix/test/fixtures-legacy/09-no-entry-pnpm/server.js diff --git a/packages/remix/test/fixtures/09-no-entry-pnpm/tsconfig.json b/packages/remix/test/fixtures-legacy/09-no-entry-pnpm/tsconfig.json similarity index 100% rename from packages/remix/test/fixtures/09-no-entry-pnpm/tsconfig.json rename to packages/remix/test/fixtures-legacy/09-no-entry-pnpm/tsconfig.json diff --git a/packages/remix/test/fixtures/10-hydrogen-2/.gitignore b/packages/remix/test/fixtures-legacy/10-hydrogen-2/.gitignore similarity index 100% rename from packages/remix/test/fixtures/10-hydrogen-2/.gitignore rename to packages/remix/test/fixtures-legacy/10-hydrogen-2/.gitignore diff --git a/packages/remix/test/fixtures/10-hydrogen-2/.graphqlrc.yml b/packages/remix/test/fixtures-legacy/10-hydrogen-2/.graphqlrc.yml similarity index 100% rename from packages/remix/test/fixtures/10-hydrogen-2/.graphqlrc.yml rename to packages/remix/test/fixtures-legacy/10-hydrogen-2/.graphqlrc.yml diff --git a/packages/remix/test/fixtures/10-hydrogen-2/README.md b/packages/remix/test/fixtures-legacy/10-hydrogen-2/README.md similarity index 100% rename from packages/remix/test/fixtures/10-hydrogen-2/README.md rename to packages/remix/test/fixtures-legacy/10-hydrogen-2/README.md diff --git a/packages/remix/test/fixtures/10-hydrogen-2/app/components/Aside.tsx b/packages/remix/test/fixtures-legacy/10-hydrogen-2/app/components/Aside.tsx similarity index 100% rename from packages/remix/test/fixtures/10-hydrogen-2/app/components/Aside.tsx rename to packages/remix/test/fixtures-legacy/10-hydrogen-2/app/components/Aside.tsx diff --git a/packages/remix/test/fixtures/10-hydrogen-2/app/components/Cart.tsx b/packages/remix/test/fixtures-legacy/10-hydrogen-2/app/components/Cart.tsx similarity index 100% rename from packages/remix/test/fixtures/10-hydrogen-2/app/components/Cart.tsx rename to packages/remix/test/fixtures-legacy/10-hydrogen-2/app/components/Cart.tsx diff --git a/packages/remix/test/fixtures/10-hydrogen-2/app/components/Footer.tsx b/packages/remix/test/fixtures-legacy/10-hydrogen-2/app/components/Footer.tsx similarity index 100% rename from packages/remix/test/fixtures/10-hydrogen-2/app/components/Footer.tsx rename to packages/remix/test/fixtures-legacy/10-hydrogen-2/app/components/Footer.tsx diff --git a/packages/remix/test/fixtures/10-hydrogen-2/app/components/Header.tsx b/packages/remix/test/fixtures-legacy/10-hydrogen-2/app/components/Header.tsx similarity index 100% rename from packages/remix/test/fixtures/10-hydrogen-2/app/components/Header.tsx rename to packages/remix/test/fixtures-legacy/10-hydrogen-2/app/components/Header.tsx diff --git a/packages/remix/test/fixtures/10-hydrogen-2/app/components/Layout.tsx b/packages/remix/test/fixtures-legacy/10-hydrogen-2/app/components/Layout.tsx similarity index 100% rename from packages/remix/test/fixtures/10-hydrogen-2/app/components/Layout.tsx rename to packages/remix/test/fixtures-legacy/10-hydrogen-2/app/components/Layout.tsx diff --git a/packages/remix/test/fixtures/10-hydrogen-2/app/components/Search.tsx b/packages/remix/test/fixtures-legacy/10-hydrogen-2/app/components/Search.tsx similarity index 100% rename from packages/remix/test/fixtures/10-hydrogen-2/app/components/Search.tsx rename to packages/remix/test/fixtures-legacy/10-hydrogen-2/app/components/Search.tsx diff --git a/packages/remix/test/fixtures/10-hydrogen-2/app/entry.client.tsx b/packages/remix/test/fixtures-legacy/10-hydrogen-2/app/entry.client.tsx similarity index 100% rename from packages/remix/test/fixtures/10-hydrogen-2/app/entry.client.tsx rename to packages/remix/test/fixtures-legacy/10-hydrogen-2/app/entry.client.tsx diff --git a/packages/remix/test/fixtures/10-hydrogen-2/app/entry.server.tsx b/packages/remix/test/fixtures-legacy/10-hydrogen-2/app/entry.server.tsx similarity index 100% rename from packages/remix/test/fixtures/10-hydrogen-2/app/entry.server.tsx rename to packages/remix/test/fixtures-legacy/10-hydrogen-2/app/entry.server.tsx diff --git a/packages/remix/test/fixtures/10-hydrogen-2/app/root.tsx b/packages/remix/test/fixtures-legacy/10-hydrogen-2/app/root.tsx similarity index 100% rename from packages/remix/test/fixtures/10-hydrogen-2/app/root.tsx rename to packages/remix/test/fixtures-legacy/10-hydrogen-2/app/root.tsx diff --git a/packages/remix/test/fixtures/10-hydrogen-2/app/routes/$.tsx b/packages/remix/test/fixtures-legacy/10-hydrogen-2/app/routes/$.tsx similarity index 100% rename from packages/remix/test/fixtures/10-hydrogen-2/app/routes/$.tsx rename to packages/remix/test/fixtures-legacy/10-hydrogen-2/app/routes/$.tsx diff --git a/packages/remix/test/fixtures/10-hydrogen-2/app/routes/[robots.txt].tsx b/packages/remix/test/fixtures-legacy/10-hydrogen-2/app/routes/[robots.txt].tsx similarity index 100% rename from packages/remix/test/fixtures/10-hydrogen-2/app/routes/[robots.txt].tsx rename to packages/remix/test/fixtures-legacy/10-hydrogen-2/app/routes/[robots.txt].tsx diff --git a/packages/remix/test/fixtures/10-hydrogen-2/app/routes/[sitemap.xml].tsx b/packages/remix/test/fixtures-legacy/10-hydrogen-2/app/routes/[sitemap.xml].tsx similarity index 100% rename from packages/remix/test/fixtures/10-hydrogen-2/app/routes/[sitemap.xml].tsx rename to packages/remix/test/fixtures-legacy/10-hydrogen-2/app/routes/[sitemap.xml].tsx diff --git a/packages/remix/test/fixtures/10-hydrogen-2/app/routes/_index.tsx b/packages/remix/test/fixtures-legacy/10-hydrogen-2/app/routes/_index.tsx similarity index 100% rename from packages/remix/test/fixtures/10-hydrogen-2/app/routes/_index.tsx rename to packages/remix/test/fixtures-legacy/10-hydrogen-2/app/routes/_index.tsx diff --git a/packages/remix/test/fixtures/10-hydrogen-2/app/routes/account.$.tsx b/packages/remix/test/fixtures-legacy/10-hydrogen-2/app/routes/account.$.tsx similarity index 100% rename from packages/remix/test/fixtures/10-hydrogen-2/app/routes/account.$.tsx rename to packages/remix/test/fixtures-legacy/10-hydrogen-2/app/routes/account.$.tsx diff --git a/packages/remix/test/fixtures/10-hydrogen-2/app/routes/account.addresses.tsx b/packages/remix/test/fixtures-legacy/10-hydrogen-2/app/routes/account.addresses.tsx similarity index 100% rename from packages/remix/test/fixtures/10-hydrogen-2/app/routes/account.addresses.tsx rename to packages/remix/test/fixtures-legacy/10-hydrogen-2/app/routes/account.addresses.tsx diff --git a/packages/remix/test/fixtures/10-hydrogen-2/app/routes/account.orders.$id.tsx b/packages/remix/test/fixtures-legacy/10-hydrogen-2/app/routes/account.orders.$id.tsx similarity index 100% rename from packages/remix/test/fixtures/10-hydrogen-2/app/routes/account.orders.$id.tsx rename to packages/remix/test/fixtures-legacy/10-hydrogen-2/app/routes/account.orders.$id.tsx diff --git a/packages/remix/test/fixtures/10-hydrogen-2/app/routes/account.orders._index.tsx b/packages/remix/test/fixtures-legacy/10-hydrogen-2/app/routes/account.orders._index.tsx similarity index 100% rename from packages/remix/test/fixtures/10-hydrogen-2/app/routes/account.orders._index.tsx rename to packages/remix/test/fixtures-legacy/10-hydrogen-2/app/routes/account.orders._index.tsx diff --git a/packages/remix/test/fixtures/10-hydrogen-2/app/routes/account.profile.tsx b/packages/remix/test/fixtures-legacy/10-hydrogen-2/app/routes/account.profile.tsx similarity index 100% rename from packages/remix/test/fixtures/10-hydrogen-2/app/routes/account.profile.tsx rename to packages/remix/test/fixtures-legacy/10-hydrogen-2/app/routes/account.profile.tsx diff --git a/packages/remix/test/fixtures/10-hydrogen-2/app/routes/account.tsx b/packages/remix/test/fixtures-legacy/10-hydrogen-2/app/routes/account.tsx similarity index 100% rename from packages/remix/test/fixtures/10-hydrogen-2/app/routes/account.tsx rename to packages/remix/test/fixtures-legacy/10-hydrogen-2/app/routes/account.tsx diff --git a/packages/remix/test/fixtures/10-hydrogen-2/app/routes/account_.activate.$id.$activationToken.tsx b/packages/remix/test/fixtures-legacy/10-hydrogen-2/app/routes/account_.activate.$id.$activationToken.tsx similarity index 100% rename from packages/remix/test/fixtures/10-hydrogen-2/app/routes/account_.activate.$id.$activationToken.tsx rename to packages/remix/test/fixtures-legacy/10-hydrogen-2/app/routes/account_.activate.$id.$activationToken.tsx diff --git a/packages/remix/test/fixtures/10-hydrogen-2/app/routes/account_.login.tsx b/packages/remix/test/fixtures-legacy/10-hydrogen-2/app/routes/account_.login.tsx similarity index 100% rename from packages/remix/test/fixtures/10-hydrogen-2/app/routes/account_.login.tsx rename to packages/remix/test/fixtures-legacy/10-hydrogen-2/app/routes/account_.login.tsx diff --git a/packages/remix/test/fixtures/10-hydrogen-2/app/routes/account_.logout.tsx b/packages/remix/test/fixtures-legacy/10-hydrogen-2/app/routes/account_.logout.tsx similarity index 100% rename from packages/remix/test/fixtures/10-hydrogen-2/app/routes/account_.logout.tsx rename to packages/remix/test/fixtures-legacy/10-hydrogen-2/app/routes/account_.logout.tsx diff --git a/packages/remix/test/fixtures/10-hydrogen-2/app/routes/account_.recover.tsx b/packages/remix/test/fixtures-legacy/10-hydrogen-2/app/routes/account_.recover.tsx similarity index 100% rename from packages/remix/test/fixtures/10-hydrogen-2/app/routes/account_.recover.tsx rename to packages/remix/test/fixtures-legacy/10-hydrogen-2/app/routes/account_.recover.tsx diff --git a/packages/remix/test/fixtures/10-hydrogen-2/app/routes/account_.register.tsx b/packages/remix/test/fixtures-legacy/10-hydrogen-2/app/routes/account_.register.tsx similarity index 100% rename from packages/remix/test/fixtures/10-hydrogen-2/app/routes/account_.register.tsx rename to packages/remix/test/fixtures-legacy/10-hydrogen-2/app/routes/account_.register.tsx diff --git a/packages/remix/test/fixtures/10-hydrogen-2/app/routes/account_.reset.$id.$resetToken.tsx b/packages/remix/test/fixtures-legacy/10-hydrogen-2/app/routes/account_.reset.$id.$resetToken.tsx similarity index 100% rename from packages/remix/test/fixtures/10-hydrogen-2/app/routes/account_.reset.$id.$resetToken.tsx rename to packages/remix/test/fixtures-legacy/10-hydrogen-2/app/routes/account_.reset.$id.$resetToken.tsx diff --git a/packages/remix/test/fixtures/10-hydrogen-2/app/routes/api.predictive-search.tsx b/packages/remix/test/fixtures-legacy/10-hydrogen-2/app/routes/api.predictive-search.tsx similarity index 100% rename from packages/remix/test/fixtures/10-hydrogen-2/app/routes/api.predictive-search.tsx rename to packages/remix/test/fixtures-legacy/10-hydrogen-2/app/routes/api.predictive-search.tsx diff --git a/packages/remix/test/fixtures/10-hydrogen-2/app/routes/blogs.$blogHandle.$articleHandle.tsx b/packages/remix/test/fixtures-legacy/10-hydrogen-2/app/routes/blogs.$blogHandle.$articleHandle.tsx similarity index 100% rename from packages/remix/test/fixtures/10-hydrogen-2/app/routes/blogs.$blogHandle.$articleHandle.tsx rename to packages/remix/test/fixtures-legacy/10-hydrogen-2/app/routes/blogs.$blogHandle.$articleHandle.tsx diff --git a/packages/remix/test/fixtures/10-hydrogen-2/app/routes/blogs.$blogHandle._index.tsx b/packages/remix/test/fixtures-legacy/10-hydrogen-2/app/routes/blogs.$blogHandle._index.tsx similarity index 100% rename from packages/remix/test/fixtures/10-hydrogen-2/app/routes/blogs.$blogHandle._index.tsx rename to packages/remix/test/fixtures-legacy/10-hydrogen-2/app/routes/blogs.$blogHandle._index.tsx diff --git a/packages/remix/test/fixtures/10-hydrogen-2/app/routes/blogs._index.tsx b/packages/remix/test/fixtures-legacy/10-hydrogen-2/app/routes/blogs._index.tsx similarity index 100% rename from packages/remix/test/fixtures/10-hydrogen-2/app/routes/blogs._index.tsx rename to packages/remix/test/fixtures-legacy/10-hydrogen-2/app/routes/blogs._index.tsx diff --git a/packages/remix/test/fixtures/10-hydrogen-2/app/routes/cart.tsx b/packages/remix/test/fixtures-legacy/10-hydrogen-2/app/routes/cart.tsx similarity index 100% rename from packages/remix/test/fixtures/10-hydrogen-2/app/routes/cart.tsx rename to packages/remix/test/fixtures-legacy/10-hydrogen-2/app/routes/cart.tsx diff --git a/packages/remix/test/fixtures/10-hydrogen-2/app/routes/collections.$handle.tsx b/packages/remix/test/fixtures-legacy/10-hydrogen-2/app/routes/collections.$handle.tsx similarity index 100% rename from packages/remix/test/fixtures/10-hydrogen-2/app/routes/collections.$handle.tsx rename to packages/remix/test/fixtures-legacy/10-hydrogen-2/app/routes/collections.$handle.tsx diff --git a/packages/remix/test/fixtures/10-hydrogen-2/app/routes/collections._index.tsx b/packages/remix/test/fixtures-legacy/10-hydrogen-2/app/routes/collections._index.tsx similarity index 100% rename from packages/remix/test/fixtures/10-hydrogen-2/app/routes/collections._index.tsx rename to packages/remix/test/fixtures-legacy/10-hydrogen-2/app/routes/collections._index.tsx diff --git a/packages/remix/test/fixtures/10-hydrogen-2/app/routes/pages.$handle.tsx b/packages/remix/test/fixtures-legacy/10-hydrogen-2/app/routes/pages.$handle.tsx similarity index 100% rename from packages/remix/test/fixtures/10-hydrogen-2/app/routes/pages.$handle.tsx rename to packages/remix/test/fixtures-legacy/10-hydrogen-2/app/routes/pages.$handle.tsx diff --git a/packages/remix/test/fixtures/10-hydrogen-2/app/routes/policies.$handle.tsx b/packages/remix/test/fixtures-legacy/10-hydrogen-2/app/routes/policies.$handle.tsx similarity index 100% rename from packages/remix/test/fixtures/10-hydrogen-2/app/routes/policies.$handle.tsx rename to packages/remix/test/fixtures-legacy/10-hydrogen-2/app/routes/policies.$handle.tsx diff --git a/packages/remix/test/fixtures/10-hydrogen-2/app/routes/policies._index.tsx b/packages/remix/test/fixtures-legacy/10-hydrogen-2/app/routes/policies._index.tsx similarity index 100% rename from packages/remix/test/fixtures/10-hydrogen-2/app/routes/policies._index.tsx rename to packages/remix/test/fixtures-legacy/10-hydrogen-2/app/routes/policies._index.tsx diff --git a/packages/remix/test/fixtures/10-hydrogen-2/app/routes/products.$handle.tsx b/packages/remix/test/fixtures-legacy/10-hydrogen-2/app/routes/products.$handle.tsx similarity index 100% rename from packages/remix/test/fixtures/10-hydrogen-2/app/routes/products.$handle.tsx rename to packages/remix/test/fixtures-legacy/10-hydrogen-2/app/routes/products.$handle.tsx diff --git a/packages/remix/test/fixtures/10-hydrogen-2/app/routes/search.tsx b/packages/remix/test/fixtures-legacy/10-hydrogen-2/app/routes/search.tsx similarity index 100% rename from packages/remix/test/fixtures/10-hydrogen-2/app/routes/search.tsx rename to packages/remix/test/fixtures-legacy/10-hydrogen-2/app/routes/search.tsx diff --git a/packages/remix/test/fixtures/10-hydrogen-2/app/styles/app.css b/packages/remix/test/fixtures-legacy/10-hydrogen-2/app/styles/app.css similarity index 100% rename from packages/remix/test/fixtures/10-hydrogen-2/app/styles/app.css rename to packages/remix/test/fixtures-legacy/10-hydrogen-2/app/styles/app.css diff --git a/packages/remix/test/fixtures/10-hydrogen-2/app/styles/reset.css b/packages/remix/test/fixtures-legacy/10-hydrogen-2/app/styles/reset.css similarity index 100% rename from packages/remix/test/fixtures/10-hydrogen-2/app/styles/reset.css rename to packages/remix/test/fixtures-legacy/10-hydrogen-2/app/styles/reset.css diff --git a/packages/remix/test/fixtures/10-hydrogen-2/app/utils.ts b/packages/remix/test/fixtures-legacy/10-hydrogen-2/app/utils.ts similarity index 100% rename from packages/remix/test/fixtures/10-hydrogen-2/app/utils.ts rename to packages/remix/test/fixtures-legacy/10-hydrogen-2/app/utils.ts diff --git a/packages/remix/test/fixtures/10-hydrogen-2/package.json b/packages/remix/test/fixtures-legacy/10-hydrogen-2/package.json similarity index 100% rename from packages/remix/test/fixtures/10-hydrogen-2/package.json rename to packages/remix/test/fixtures-legacy/10-hydrogen-2/package.json diff --git a/packages/remix/test/fixtures/10-hydrogen-2/pnpm-lock.yaml b/packages/remix/test/fixtures-legacy/10-hydrogen-2/pnpm-lock.yaml similarity index 100% rename from packages/remix/test/fixtures/10-hydrogen-2/pnpm-lock.yaml rename to packages/remix/test/fixtures-legacy/10-hydrogen-2/pnpm-lock.yaml diff --git a/packages/remix/test/fixtures/10-hydrogen-2/probes.json b/packages/remix/test/fixtures-legacy/10-hydrogen-2/probes.json similarity index 100% rename from packages/remix/test/fixtures/10-hydrogen-2/probes.json rename to packages/remix/test/fixtures-legacy/10-hydrogen-2/probes.json diff --git a/packages/remix/test/fixtures/10-hydrogen-2/public/favicon.svg b/packages/remix/test/fixtures-legacy/10-hydrogen-2/public/favicon.svg similarity index 100% rename from packages/remix/test/fixtures/10-hydrogen-2/public/favicon.svg rename to packages/remix/test/fixtures-legacy/10-hydrogen-2/public/favicon.svg diff --git a/packages/remix/test/fixtures/10-hydrogen-2/remix.config.js b/packages/remix/test/fixtures-legacy/10-hydrogen-2/remix.config.js similarity index 100% rename from packages/remix/test/fixtures/10-hydrogen-2/remix.config.js rename to packages/remix/test/fixtures-legacy/10-hydrogen-2/remix.config.js diff --git a/packages/remix/test/fixtures/10-hydrogen-2/remix.env.d.ts b/packages/remix/test/fixtures-legacy/10-hydrogen-2/remix.env.d.ts similarity index 100% rename from packages/remix/test/fixtures/10-hydrogen-2/remix.env.d.ts rename to packages/remix/test/fixtures-legacy/10-hydrogen-2/remix.env.d.ts diff --git a/packages/remix/test/fixtures/10-hydrogen-2/server.ts b/packages/remix/test/fixtures-legacy/10-hydrogen-2/server.ts similarity index 100% rename from packages/remix/test/fixtures/10-hydrogen-2/server.ts rename to packages/remix/test/fixtures-legacy/10-hydrogen-2/server.ts diff --git a/packages/remix/test/fixtures/10-hydrogen-2/storefrontapi.generated.d.ts b/packages/remix/test/fixtures-legacy/10-hydrogen-2/storefrontapi.generated.d.ts similarity index 100% rename from packages/remix/test/fixtures/10-hydrogen-2/storefrontapi.generated.d.ts rename to packages/remix/test/fixtures-legacy/10-hydrogen-2/storefrontapi.generated.d.ts diff --git a/packages/remix/test/fixtures/10-hydrogen-2/tsconfig.json b/packages/remix/test/fixtures-legacy/10-hydrogen-2/tsconfig.json similarity index 100% rename from packages/remix/test/fixtures/10-hydrogen-2/tsconfig.json rename to packages/remix/test/fixtures-legacy/10-hydrogen-2/tsconfig.json diff --git a/packages/remix/test/fixtures/11-hydrogen-2-js/.gitignore b/packages/remix/test/fixtures-legacy/11-hydrogen-2-js/.gitignore similarity index 100% rename from packages/remix/test/fixtures/11-hydrogen-2-js/.gitignore rename to packages/remix/test/fixtures-legacy/11-hydrogen-2-js/.gitignore diff --git a/packages/remix/test/fixtures/11-hydrogen-2-js/.graphqlrc.yml b/packages/remix/test/fixtures-legacy/11-hydrogen-2-js/.graphqlrc.yml similarity index 100% rename from packages/remix/test/fixtures/11-hydrogen-2-js/.graphqlrc.yml rename to packages/remix/test/fixtures-legacy/11-hydrogen-2-js/.graphqlrc.yml diff --git a/packages/remix/test/fixtures/11-hydrogen-2-js/README.md b/packages/remix/test/fixtures-legacy/11-hydrogen-2-js/README.md similarity index 100% rename from packages/remix/test/fixtures/11-hydrogen-2-js/README.md rename to packages/remix/test/fixtures-legacy/11-hydrogen-2-js/README.md diff --git a/packages/remix/test/fixtures/11-hydrogen-2-js/app/components/Aside.jsx b/packages/remix/test/fixtures-legacy/11-hydrogen-2-js/app/components/Aside.jsx similarity index 100% rename from packages/remix/test/fixtures/11-hydrogen-2-js/app/components/Aside.jsx rename to packages/remix/test/fixtures-legacy/11-hydrogen-2-js/app/components/Aside.jsx diff --git a/packages/remix/test/fixtures/11-hydrogen-2-js/app/components/Cart.jsx b/packages/remix/test/fixtures-legacy/11-hydrogen-2-js/app/components/Cart.jsx similarity index 100% rename from packages/remix/test/fixtures/11-hydrogen-2-js/app/components/Cart.jsx rename to packages/remix/test/fixtures-legacy/11-hydrogen-2-js/app/components/Cart.jsx diff --git a/packages/remix/test/fixtures/11-hydrogen-2-js/app/components/Footer.jsx b/packages/remix/test/fixtures-legacy/11-hydrogen-2-js/app/components/Footer.jsx similarity index 100% rename from packages/remix/test/fixtures/11-hydrogen-2-js/app/components/Footer.jsx rename to packages/remix/test/fixtures-legacy/11-hydrogen-2-js/app/components/Footer.jsx diff --git a/packages/remix/test/fixtures/11-hydrogen-2-js/app/components/Header.jsx b/packages/remix/test/fixtures-legacy/11-hydrogen-2-js/app/components/Header.jsx similarity index 100% rename from packages/remix/test/fixtures/11-hydrogen-2-js/app/components/Header.jsx rename to packages/remix/test/fixtures-legacy/11-hydrogen-2-js/app/components/Header.jsx diff --git a/packages/remix/test/fixtures/11-hydrogen-2-js/app/components/Layout.jsx b/packages/remix/test/fixtures-legacy/11-hydrogen-2-js/app/components/Layout.jsx similarity index 100% rename from packages/remix/test/fixtures/11-hydrogen-2-js/app/components/Layout.jsx rename to packages/remix/test/fixtures-legacy/11-hydrogen-2-js/app/components/Layout.jsx diff --git a/packages/remix/test/fixtures/11-hydrogen-2-js/app/components/Search.jsx b/packages/remix/test/fixtures-legacy/11-hydrogen-2-js/app/components/Search.jsx similarity index 100% rename from packages/remix/test/fixtures/11-hydrogen-2-js/app/components/Search.jsx rename to packages/remix/test/fixtures-legacy/11-hydrogen-2-js/app/components/Search.jsx diff --git a/packages/remix/test/fixtures/11-hydrogen-2-js/app/entry.client.jsx b/packages/remix/test/fixtures-legacy/11-hydrogen-2-js/app/entry.client.jsx similarity index 100% rename from packages/remix/test/fixtures/11-hydrogen-2-js/app/entry.client.jsx rename to packages/remix/test/fixtures-legacy/11-hydrogen-2-js/app/entry.client.jsx diff --git a/packages/remix/test/fixtures/11-hydrogen-2-js/app/entry.server.jsx b/packages/remix/test/fixtures-legacy/11-hydrogen-2-js/app/entry.server.jsx similarity index 100% rename from packages/remix/test/fixtures/11-hydrogen-2-js/app/entry.server.jsx rename to packages/remix/test/fixtures-legacy/11-hydrogen-2-js/app/entry.server.jsx diff --git a/packages/remix/test/fixtures/11-hydrogen-2-js/app/root.jsx b/packages/remix/test/fixtures-legacy/11-hydrogen-2-js/app/root.jsx similarity index 100% rename from packages/remix/test/fixtures/11-hydrogen-2-js/app/root.jsx rename to packages/remix/test/fixtures-legacy/11-hydrogen-2-js/app/root.jsx diff --git a/packages/remix/test/fixtures/11-hydrogen-2-js/app/routes/$.jsx b/packages/remix/test/fixtures-legacy/11-hydrogen-2-js/app/routes/$.jsx similarity index 100% rename from packages/remix/test/fixtures/11-hydrogen-2-js/app/routes/$.jsx rename to packages/remix/test/fixtures-legacy/11-hydrogen-2-js/app/routes/$.jsx diff --git a/packages/remix/test/fixtures/11-hydrogen-2-js/app/routes/[robots.txt].jsx b/packages/remix/test/fixtures-legacy/11-hydrogen-2-js/app/routes/[robots.txt].jsx similarity index 100% rename from packages/remix/test/fixtures/11-hydrogen-2-js/app/routes/[robots.txt].jsx rename to packages/remix/test/fixtures-legacy/11-hydrogen-2-js/app/routes/[robots.txt].jsx diff --git a/packages/remix/test/fixtures/11-hydrogen-2-js/app/routes/[sitemap.xml].jsx b/packages/remix/test/fixtures-legacy/11-hydrogen-2-js/app/routes/[sitemap.xml].jsx similarity index 100% rename from packages/remix/test/fixtures/11-hydrogen-2-js/app/routes/[sitemap.xml].jsx rename to packages/remix/test/fixtures-legacy/11-hydrogen-2-js/app/routes/[sitemap.xml].jsx diff --git a/packages/remix/test/fixtures/11-hydrogen-2-js/app/routes/_index.jsx b/packages/remix/test/fixtures-legacy/11-hydrogen-2-js/app/routes/_index.jsx similarity index 100% rename from packages/remix/test/fixtures/11-hydrogen-2-js/app/routes/_index.jsx rename to packages/remix/test/fixtures-legacy/11-hydrogen-2-js/app/routes/_index.jsx diff --git a/packages/remix/test/fixtures/11-hydrogen-2-js/app/routes/account.$.jsx b/packages/remix/test/fixtures-legacy/11-hydrogen-2-js/app/routes/account.$.jsx similarity index 100% rename from packages/remix/test/fixtures/11-hydrogen-2-js/app/routes/account.$.jsx rename to packages/remix/test/fixtures-legacy/11-hydrogen-2-js/app/routes/account.$.jsx diff --git a/packages/remix/test/fixtures/11-hydrogen-2-js/app/routes/account.addresses.jsx b/packages/remix/test/fixtures-legacy/11-hydrogen-2-js/app/routes/account.addresses.jsx similarity index 100% rename from packages/remix/test/fixtures/11-hydrogen-2-js/app/routes/account.addresses.jsx rename to packages/remix/test/fixtures-legacy/11-hydrogen-2-js/app/routes/account.addresses.jsx diff --git a/packages/remix/test/fixtures/11-hydrogen-2-js/app/routes/account.jsx b/packages/remix/test/fixtures-legacy/11-hydrogen-2-js/app/routes/account.jsx similarity index 100% rename from packages/remix/test/fixtures/11-hydrogen-2-js/app/routes/account.jsx rename to packages/remix/test/fixtures-legacy/11-hydrogen-2-js/app/routes/account.jsx diff --git a/packages/remix/test/fixtures/11-hydrogen-2-js/app/routes/account.orders.$id.jsx b/packages/remix/test/fixtures-legacy/11-hydrogen-2-js/app/routes/account.orders.$id.jsx similarity index 100% rename from packages/remix/test/fixtures/11-hydrogen-2-js/app/routes/account.orders.$id.jsx rename to packages/remix/test/fixtures-legacy/11-hydrogen-2-js/app/routes/account.orders.$id.jsx diff --git a/packages/remix/test/fixtures/11-hydrogen-2-js/app/routes/account.orders._index.jsx b/packages/remix/test/fixtures-legacy/11-hydrogen-2-js/app/routes/account.orders._index.jsx similarity index 100% rename from packages/remix/test/fixtures/11-hydrogen-2-js/app/routes/account.orders._index.jsx rename to packages/remix/test/fixtures-legacy/11-hydrogen-2-js/app/routes/account.orders._index.jsx diff --git a/packages/remix/test/fixtures/11-hydrogen-2-js/app/routes/account.profile.jsx b/packages/remix/test/fixtures-legacy/11-hydrogen-2-js/app/routes/account.profile.jsx similarity index 100% rename from packages/remix/test/fixtures/11-hydrogen-2-js/app/routes/account.profile.jsx rename to packages/remix/test/fixtures-legacy/11-hydrogen-2-js/app/routes/account.profile.jsx diff --git a/packages/remix/test/fixtures/11-hydrogen-2-js/app/routes/account_.activate.$id.$activationToken.jsx b/packages/remix/test/fixtures-legacy/11-hydrogen-2-js/app/routes/account_.activate.$id.$activationToken.jsx similarity index 100% rename from packages/remix/test/fixtures/11-hydrogen-2-js/app/routes/account_.activate.$id.$activationToken.jsx rename to packages/remix/test/fixtures-legacy/11-hydrogen-2-js/app/routes/account_.activate.$id.$activationToken.jsx diff --git a/packages/remix/test/fixtures/11-hydrogen-2-js/app/routes/account_.login.jsx b/packages/remix/test/fixtures-legacy/11-hydrogen-2-js/app/routes/account_.login.jsx similarity index 100% rename from packages/remix/test/fixtures/11-hydrogen-2-js/app/routes/account_.login.jsx rename to packages/remix/test/fixtures-legacy/11-hydrogen-2-js/app/routes/account_.login.jsx diff --git a/packages/remix/test/fixtures/11-hydrogen-2-js/app/routes/account_.logout.jsx b/packages/remix/test/fixtures-legacy/11-hydrogen-2-js/app/routes/account_.logout.jsx similarity index 100% rename from packages/remix/test/fixtures/11-hydrogen-2-js/app/routes/account_.logout.jsx rename to packages/remix/test/fixtures-legacy/11-hydrogen-2-js/app/routes/account_.logout.jsx diff --git a/packages/remix/test/fixtures/11-hydrogen-2-js/app/routes/account_.recover.jsx b/packages/remix/test/fixtures-legacy/11-hydrogen-2-js/app/routes/account_.recover.jsx similarity index 100% rename from packages/remix/test/fixtures/11-hydrogen-2-js/app/routes/account_.recover.jsx rename to packages/remix/test/fixtures-legacy/11-hydrogen-2-js/app/routes/account_.recover.jsx diff --git a/packages/remix/test/fixtures/11-hydrogen-2-js/app/routes/account_.register.jsx b/packages/remix/test/fixtures-legacy/11-hydrogen-2-js/app/routes/account_.register.jsx similarity index 100% rename from packages/remix/test/fixtures/11-hydrogen-2-js/app/routes/account_.register.jsx rename to packages/remix/test/fixtures-legacy/11-hydrogen-2-js/app/routes/account_.register.jsx diff --git a/packages/remix/test/fixtures/11-hydrogen-2-js/app/routes/account_.reset.$id.$resetToken.jsx b/packages/remix/test/fixtures-legacy/11-hydrogen-2-js/app/routes/account_.reset.$id.$resetToken.jsx similarity index 100% rename from packages/remix/test/fixtures/11-hydrogen-2-js/app/routes/account_.reset.$id.$resetToken.jsx rename to packages/remix/test/fixtures-legacy/11-hydrogen-2-js/app/routes/account_.reset.$id.$resetToken.jsx diff --git a/packages/remix/test/fixtures/11-hydrogen-2-js/app/routes/api.predictive-search.jsx b/packages/remix/test/fixtures-legacy/11-hydrogen-2-js/app/routes/api.predictive-search.jsx similarity index 100% rename from packages/remix/test/fixtures/11-hydrogen-2-js/app/routes/api.predictive-search.jsx rename to packages/remix/test/fixtures-legacy/11-hydrogen-2-js/app/routes/api.predictive-search.jsx diff --git a/packages/remix/test/fixtures/11-hydrogen-2-js/app/routes/blogs.$blogHandle.$articleHandle.jsx b/packages/remix/test/fixtures-legacy/11-hydrogen-2-js/app/routes/blogs.$blogHandle.$articleHandle.jsx similarity index 100% rename from packages/remix/test/fixtures/11-hydrogen-2-js/app/routes/blogs.$blogHandle.$articleHandle.jsx rename to packages/remix/test/fixtures-legacy/11-hydrogen-2-js/app/routes/blogs.$blogHandle.$articleHandle.jsx diff --git a/packages/remix/test/fixtures/11-hydrogen-2-js/app/routes/blogs.$blogHandle._index.jsx b/packages/remix/test/fixtures-legacy/11-hydrogen-2-js/app/routes/blogs.$blogHandle._index.jsx similarity index 100% rename from packages/remix/test/fixtures/11-hydrogen-2-js/app/routes/blogs.$blogHandle._index.jsx rename to packages/remix/test/fixtures-legacy/11-hydrogen-2-js/app/routes/blogs.$blogHandle._index.jsx diff --git a/packages/remix/test/fixtures/11-hydrogen-2-js/app/routes/blogs._index.jsx b/packages/remix/test/fixtures-legacy/11-hydrogen-2-js/app/routes/blogs._index.jsx similarity index 100% rename from packages/remix/test/fixtures/11-hydrogen-2-js/app/routes/blogs._index.jsx rename to packages/remix/test/fixtures-legacy/11-hydrogen-2-js/app/routes/blogs._index.jsx diff --git a/packages/remix/test/fixtures/11-hydrogen-2-js/app/routes/cart.jsx b/packages/remix/test/fixtures-legacy/11-hydrogen-2-js/app/routes/cart.jsx similarity index 100% rename from packages/remix/test/fixtures/11-hydrogen-2-js/app/routes/cart.jsx rename to packages/remix/test/fixtures-legacy/11-hydrogen-2-js/app/routes/cart.jsx diff --git a/packages/remix/test/fixtures/11-hydrogen-2-js/app/routes/collections.$handle.jsx b/packages/remix/test/fixtures-legacy/11-hydrogen-2-js/app/routes/collections.$handle.jsx similarity index 100% rename from packages/remix/test/fixtures/11-hydrogen-2-js/app/routes/collections.$handle.jsx rename to packages/remix/test/fixtures-legacy/11-hydrogen-2-js/app/routes/collections.$handle.jsx diff --git a/packages/remix/test/fixtures/11-hydrogen-2-js/app/routes/collections._index.jsx b/packages/remix/test/fixtures-legacy/11-hydrogen-2-js/app/routes/collections._index.jsx similarity index 100% rename from packages/remix/test/fixtures/11-hydrogen-2-js/app/routes/collections._index.jsx rename to packages/remix/test/fixtures-legacy/11-hydrogen-2-js/app/routes/collections._index.jsx diff --git a/packages/remix/test/fixtures/11-hydrogen-2-js/app/routes/pages.$handle.jsx b/packages/remix/test/fixtures-legacy/11-hydrogen-2-js/app/routes/pages.$handle.jsx similarity index 100% rename from packages/remix/test/fixtures/11-hydrogen-2-js/app/routes/pages.$handle.jsx rename to packages/remix/test/fixtures-legacy/11-hydrogen-2-js/app/routes/pages.$handle.jsx diff --git a/packages/remix/test/fixtures/11-hydrogen-2-js/app/routes/policies.$handle.jsx b/packages/remix/test/fixtures-legacy/11-hydrogen-2-js/app/routes/policies.$handle.jsx similarity index 100% rename from packages/remix/test/fixtures/11-hydrogen-2-js/app/routes/policies.$handle.jsx rename to packages/remix/test/fixtures-legacy/11-hydrogen-2-js/app/routes/policies.$handle.jsx diff --git a/packages/remix/test/fixtures/11-hydrogen-2-js/app/routes/policies._index.jsx b/packages/remix/test/fixtures-legacy/11-hydrogen-2-js/app/routes/policies._index.jsx similarity index 100% rename from packages/remix/test/fixtures/11-hydrogen-2-js/app/routes/policies._index.jsx rename to packages/remix/test/fixtures-legacy/11-hydrogen-2-js/app/routes/policies._index.jsx diff --git a/packages/remix/test/fixtures/11-hydrogen-2-js/app/routes/products.$handle.jsx b/packages/remix/test/fixtures-legacy/11-hydrogen-2-js/app/routes/products.$handle.jsx similarity index 100% rename from packages/remix/test/fixtures/11-hydrogen-2-js/app/routes/products.$handle.jsx rename to packages/remix/test/fixtures-legacy/11-hydrogen-2-js/app/routes/products.$handle.jsx diff --git a/packages/remix/test/fixtures/11-hydrogen-2-js/app/routes/search.jsx b/packages/remix/test/fixtures-legacy/11-hydrogen-2-js/app/routes/search.jsx similarity index 100% rename from packages/remix/test/fixtures/11-hydrogen-2-js/app/routes/search.jsx rename to packages/remix/test/fixtures-legacy/11-hydrogen-2-js/app/routes/search.jsx diff --git a/packages/remix/test/fixtures/11-hydrogen-2-js/app/styles/app.css b/packages/remix/test/fixtures-legacy/11-hydrogen-2-js/app/styles/app.css similarity index 100% rename from packages/remix/test/fixtures/11-hydrogen-2-js/app/styles/app.css rename to packages/remix/test/fixtures-legacy/11-hydrogen-2-js/app/styles/app.css diff --git a/packages/remix/test/fixtures/11-hydrogen-2-js/app/styles/reset.css b/packages/remix/test/fixtures-legacy/11-hydrogen-2-js/app/styles/reset.css similarity index 100% rename from packages/remix/test/fixtures/11-hydrogen-2-js/app/styles/reset.css rename to packages/remix/test/fixtures-legacy/11-hydrogen-2-js/app/styles/reset.css diff --git a/packages/remix/test/fixtures/11-hydrogen-2-js/app/utils.js b/packages/remix/test/fixtures-legacy/11-hydrogen-2-js/app/utils.js similarity index 100% rename from packages/remix/test/fixtures/11-hydrogen-2-js/app/utils.js rename to packages/remix/test/fixtures-legacy/11-hydrogen-2-js/app/utils.js diff --git a/packages/remix/test/fixtures/11-hydrogen-2-js/jsconfig.json b/packages/remix/test/fixtures-legacy/11-hydrogen-2-js/jsconfig.json similarity index 100% rename from packages/remix/test/fixtures/11-hydrogen-2-js/jsconfig.json rename to packages/remix/test/fixtures-legacy/11-hydrogen-2-js/jsconfig.json diff --git a/packages/remix/test/fixtures/11-hydrogen-2-js/package.json b/packages/remix/test/fixtures-legacy/11-hydrogen-2-js/package.json similarity index 100% rename from packages/remix/test/fixtures/11-hydrogen-2-js/package.json rename to packages/remix/test/fixtures-legacy/11-hydrogen-2-js/package.json diff --git a/packages/remix/test/fixtures/11-hydrogen-2-js/pnpm-lock.yaml b/packages/remix/test/fixtures-legacy/11-hydrogen-2-js/pnpm-lock.yaml similarity index 100% rename from packages/remix/test/fixtures/11-hydrogen-2-js/pnpm-lock.yaml rename to packages/remix/test/fixtures-legacy/11-hydrogen-2-js/pnpm-lock.yaml diff --git a/packages/remix/test/fixtures/11-hydrogen-2-js/probes.json b/packages/remix/test/fixtures-legacy/11-hydrogen-2-js/probes.json similarity index 100% rename from packages/remix/test/fixtures/11-hydrogen-2-js/probes.json rename to packages/remix/test/fixtures-legacy/11-hydrogen-2-js/probes.json diff --git a/packages/remix/test/fixtures/11-hydrogen-2-js/public/favicon.svg b/packages/remix/test/fixtures-legacy/11-hydrogen-2-js/public/favicon.svg similarity index 100% rename from packages/remix/test/fixtures/11-hydrogen-2-js/public/favicon.svg rename to packages/remix/test/fixtures-legacy/11-hydrogen-2-js/public/favicon.svg diff --git a/packages/remix/test/fixtures/11-hydrogen-2-js/remix.config.js b/packages/remix/test/fixtures-legacy/11-hydrogen-2-js/remix.config.js similarity index 100% rename from packages/remix/test/fixtures/11-hydrogen-2-js/remix.config.js rename to packages/remix/test/fixtures-legacy/11-hydrogen-2-js/remix.config.js diff --git a/packages/remix/test/fixtures/11-hydrogen-2-js/server.js b/packages/remix/test/fixtures-legacy/11-hydrogen-2-js/server.js similarity index 100% rename from packages/remix/test/fixtures/11-hydrogen-2-js/server.js rename to packages/remix/test/fixtures-legacy/11-hydrogen-2-js/server.js diff --git a/packages/remix/test/fixtures/12-remix-v2/.gitignore b/packages/remix/test/fixtures-legacy/12-remix-v2/.gitignore similarity index 100% rename from packages/remix/test/fixtures/12-remix-v2/.gitignore rename to packages/remix/test/fixtures-legacy/12-remix-v2/.gitignore diff --git a/packages/remix/test/fixtures/12-remix-v2/README.md b/packages/remix/test/fixtures-legacy/12-remix-v2/README.md similarity index 100% rename from packages/remix/test/fixtures/12-remix-v2/README.md rename to packages/remix/test/fixtures-legacy/12-remix-v2/README.md diff --git a/packages/remix/test/fixtures/12-remix-v2/app/root.tsx b/packages/remix/test/fixtures-legacy/12-remix-v2/app/root.tsx similarity index 100% rename from packages/remix/test/fixtures/12-remix-v2/app/root.tsx rename to packages/remix/test/fixtures-legacy/12-remix-v2/app/root.tsx diff --git a/packages/remix/test/fixtures/12-remix-v2/app/routes/_index.tsx b/packages/remix/test/fixtures-legacy/12-remix-v2/app/routes/_index.tsx similarity index 100% rename from packages/remix/test/fixtures/12-remix-v2/app/routes/_index.tsx rename to packages/remix/test/fixtures-legacy/12-remix-v2/app/routes/_index.tsx diff --git a/packages/remix/test/fixtures/12-remix-v2/app/routes/edge.tsx b/packages/remix/test/fixtures-legacy/12-remix-v2/app/routes/edge.tsx similarity index 100% rename from packages/remix/test/fixtures/12-remix-v2/app/routes/edge.tsx rename to packages/remix/test/fixtures-legacy/12-remix-v2/app/routes/edge.tsx diff --git a/packages/remix/test/fixtures/12-remix-v2/package.json b/packages/remix/test/fixtures-legacy/12-remix-v2/package.json similarity index 100% rename from packages/remix/test/fixtures/12-remix-v2/package.json rename to packages/remix/test/fixtures-legacy/12-remix-v2/package.json diff --git a/packages/remix/test/fixtures/12-remix-v2/pnpm-lock.yaml b/packages/remix/test/fixtures-legacy/12-remix-v2/pnpm-lock.yaml similarity index 100% rename from packages/remix/test/fixtures/12-remix-v2/pnpm-lock.yaml rename to packages/remix/test/fixtures-legacy/12-remix-v2/pnpm-lock.yaml diff --git a/packages/remix/test/fixtures/12-remix-v2/probes.json b/packages/remix/test/fixtures-legacy/12-remix-v2/probes.json similarity index 100% rename from packages/remix/test/fixtures/12-remix-v2/probes.json rename to packages/remix/test/fixtures-legacy/12-remix-v2/probes.json diff --git a/packages/remix/test/fixtures/12-remix-v2/public/favicon.ico b/packages/remix/test/fixtures-legacy/12-remix-v2/public/favicon.ico similarity index 100% rename from packages/remix/test/fixtures/12-remix-v2/public/favicon.ico rename to packages/remix/test/fixtures-legacy/12-remix-v2/public/favicon.ico diff --git a/packages/remix/test/fixtures/12-remix-v2/public/remix.svg b/packages/remix/test/fixtures-legacy/12-remix-v2/public/remix.svg similarity index 100% rename from packages/remix/test/fixtures/12-remix-v2/public/remix.svg rename to packages/remix/test/fixtures-legacy/12-remix-v2/public/remix.svg diff --git a/packages/remix/test/fixtures/12-remix-v2/remix.config.js b/packages/remix/test/fixtures-legacy/12-remix-v2/remix.config.js similarity index 100% rename from packages/remix/test/fixtures/12-remix-v2/remix.config.js rename to packages/remix/test/fixtures-legacy/12-remix-v2/remix.config.js diff --git a/packages/remix/test/fixtures/12-remix-v2/remix.env.d.ts b/packages/remix/test/fixtures-legacy/12-remix-v2/remix.env.d.ts similarity index 100% rename from packages/remix/test/fixtures/12-remix-v2/remix.env.d.ts rename to packages/remix/test/fixtures-legacy/12-remix-v2/remix.env.d.ts diff --git a/packages/remix/test/fixtures/12-remix-v2/tsconfig.json b/packages/remix/test/fixtures-legacy/12-remix-v2/tsconfig.json similarity index 100% rename from packages/remix/test/fixtures/12-remix-v2/tsconfig.json rename to packages/remix/test/fixtures-legacy/12-remix-v2/tsconfig.json diff --git a/packages/remix/test/fixtures/13-remix-v2-public-path/.gitignore b/packages/remix/test/fixtures-legacy/13-remix-v2-public-path/.gitignore similarity index 100% rename from packages/remix/test/fixtures/13-remix-v2-public-path/.gitignore rename to packages/remix/test/fixtures-legacy/13-remix-v2-public-path/.gitignore diff --git a/packages/remix/test/fixtures/13-remix-v2-public-path/common/private.txt b/packages/remix/test/fixtures-legacy/13-remix-v2-public-path/common/private.txt similarity index 100% rename from packages/remix/test/fixtures/13-remix-v2-public-path/common/private.txt rename to packages/remix/test/fixtures-legacy/13-remix-v2-public-path/common/private.txt diff --git a/packages/remix/test/fixtures/13-remix-v2-public-path/misc/private.txt b/packages/remix/test/fixtures-legacy/13-remix-v2-public-path/misc/private.txt similarity index 100% rename from packages/remix/test/fixtures/13-remix-v2-public-path/misc/private.txt rename to packages/remix/test/fixtures-legacy/13-remix-v2-public-path/misc/private.txt diff --git a/packages/remix/test/fixtures/13-remix-v2-public-path/probes.json b/packages/remix/test/fixtures-legacy/13-remix-v2-public-path/probes.json similarity index 100% rename from packages/remix/test/fixtures/13-remix-v2-public-path/probes.json rename to packages/remix/test/fixtures-legacy/13-remix-v2-public-path/probes.json diff --git a/packages/remix/test/fixtures/13-remix-v2-public-path/site/app/root.tsx b/packages/remix/test/fixtures-legacy/13-remix-v2-public-path/site/app/root.tsx similarity index 100% rename from packages/remix/test/fixtures/13-remix-v2-public-path/site/app/root.tsx rename to packages/remix/test/fixtures-legacy/13-remix-v2-public-path/site/app/root.tsx diff --git a/packages/remix/test/fixtures/13-remix-v2-public-path/site/app/routes/_index.tsx b/packages/remix/test/fixtures-legacy/13-remix-v2-public-path/site/app/routes/_index.tsx similarity index 100% rename from packages/remix/test/fixtures/13-remix-v2-public-path/site/app/routes/_index.tsx rename to packages/remix/test/fixtures-legacy/13-remix-v2-public-path/site/app/routes/_index.tsx diff --git a/packages/remix/test/fixtures/13-remix-v2-public-path/site/app/routes/blog.$slug.tsx b/packages/remix/test/fixtures-legacy/13-remix-v2-public-path/site/app/routes/blog.$slug.tsx similarity index 100% rename from packages/remix/test/fixtures/13-remix-v2-public-path/site/app/routes/blog.$slug.tsx rename to packages/remix/test/fixtures-legacy/13-remix-v2-public-path/site/app/routes/blog.$slug.tsx diff --git a/packages/remix/test/fixtures/13-remix-v2-public-path/site/app/routes/edge.tsx b/packages/remix/test/fixtures-legacy/13-remix-v2-public-path/site/app/routes/edge.tsx similarity index 100% rename from packages/remix/test/fixtures/13-remix-v2-public-path/site/app/routes/edge.tsx rename to packages/remix/test/fixtures-legacy/13-remix-v2-public-path/site/app/routes/edge.tsx diff --git a/packages/remix/test/fixtures/13-remix-v2-public-path/site/package-lock.json b/packages/remix/test/fixtures-legacy/13-remix-v2-public-path/site/package-lock.json similarity index 100% rename from packages/remix/test/fixtures/13-remix-v2-public-path/site/package-lock.json rename to packages/remix/test/fixtures-legacy/13-remix-v2-public-path/site/package-lock.json diff --git a/packages/remix/test/fixtures/13-remix-v2-public-path/site/package.json b/packages/remix/test/fixtures-legacy/13-remix-v2-public-path/site/package.json similarity index 100% rename from packages/remix/test/fixtures/13-remix-v2-public-path/site/package.json rename to packages/remix/test/fixtures-legacy/13-remix-v2-public-path/site/package.json diff --git a/packages/remix/test/fixtures/13-remix-v2-public-path/site/public/favicon.ico b/packages/remix/test/fixtures-legacy/13-remix-v2-public-path/site/public/favicon.ico similarity index 100% rename from packages/remix/test/fixtures/13-remix-v2-public-path/site/public/favicon.ico rename to packages/remix/test/fixtures-legacy/13-remix-v2-public-path/site/public/favicon.ico diff --git a/packages/remix/test/fixtures/13-remix-v2-public-path/site/public/hello.txt b/packages/remix/test/fixtures-legacy/13-remix-v2-public-path/site/public/hello.txt similarity index 100% rename from packages/remix/test/fixtures/13-remix-v2-public-path/site/public/hello.txt rename to packages/remix/test/fixtures-legacy/13-remix-v2-public-path/site/public/hello.txt diff --git a/packages/remix/test/fixtures/13-remix-v2-public-path/site/remix.config.js b/packages/remix/test/fixtures-legacy/13-remix-v2-public-path/site/remix.config.js similarity index 100% rename from packages/remix/test/fixtures/13-remix-v2-public-path/site/remix.config.js rename to packages/remix/test/fixtures-legacy/13-remix-v2-public-path/site/remix.config.js diff --git a/packages/remix/test/fixtures/13-remix-v2-public-path/site/remix.env.d.ts b/packages/remix/test/fixtures-legacy/13-remix-v2-public-path/site/remix.env.d.ts similarity index 100% rename from packages/remix/test/fixtures/13-remix-v2-public-path/site/remix.env.d.ts rename to packages/remix/test/fixtures-legacy/13-remix-v2-public-path/site/remix.env.d.ts diff --git a/packages/remix/test/fixtures/13-remix-v2-public-path/tsconfig.json b/packages/remix/test/fixtures-legacy/13-remix-v2-public-path/tsconfig.json similarity index 100% rename from packages/remix/test/fixtures/13-remix-v2-public-path/tsconfig.json rename to packages/remix/test/fixtures-legacy/13-remix-v2-public-path/tsconfig.json diff --git a/packages/remix/test/fixtures/13-remix-v2-public-path/vercel.json b/packages/remix/test/fixtures-legacy/13-remix-v2-public-path/vercel.json similarity index 100% rename from packages/remix/test/fixtures/13-remix-v2-public-path/vercel.json rename to packages/remix/test/fixtures-legacy/13-remix-v2-public-path/vercel.json diff --git a/packages/remix/test/fixtures/14-node-linker-hoisted/.gitignore b/packages/remix/test/fixtures-legacy/14-node-linker-hoisted/.gitignore similarity index 100% rename from packages/remix/test/fixtures/14-node-linker-hoisted/.gitignore rename to packages/remix/test/fixtures-legacy/14-node-linker-hoisted/.gitignore diff --git a/packages/remix/test/fixtures/14-node-linker-hoisted/.npmrc b/packages/remix/test/fixtures-legacy/14-node-linker-hoisted/.npmrc similarity index 100% rename from packages/remix/test/fixtures/14-node-linker-hoisted/.npmrc rename to packages/remix/test/fixtures-legacy/14-node-linker-hoisted/.npmrc diff --git a/packages/remix/test/fixtures/14-node-linker-hoisted/.prettierignore b/packages/remix/test/fixtures-legacy/14-node-linker-hoisted/.prettierignore similarity index 100% rename from packages/remix/test/fixtures/14-node-linker-hoisted/.prettierignore rename to packages/remix/test/fixtures-legacy/14-node-linker-hoisted/.prettierignore diff --git a/packages/remix/test/fixtures/14-node-linker-hoisted/.prettierrc b/packages/remix/test/fixtures-legacy/14-node-linker-hoisted/.prettierrc similarity index 100% rename from packages/remix/test/fixtures/14-node-linker-hoisted/.prettierrc rename to packages/remix/test/fixtures-legacy/14-node-linker-hoisted/.prettierrc diff --git a/packages/remix/test/fixtures/14-node-linker-hoisted/apps/remix/.eslintrc.commit.js b/packages/remix/test/fixtures-legacy/14-node-linker-hoisted/apps/remix/.eslintrc.commit.js similarity index 100% rename from packages/remix/test/fixtures/14-node-linker-hoisted/apps/remix/.eslintrc.commit.js rename to packages/remix/test/fixtures-legacy/14-node-linker-hoisted/apps/remix/.eslintrc.commit.js diff --git a/packages/remix/test/fixtures/14-node-linker-hoisted/apps/remix/.eslintrc.js b/packages/remix/test/fixtures-legacy/14-node-linker-hoisted/apps/remix/.eslintrc.js similarity index 100% rename from packages/remix/test/fixtures/14-node-linker-hoisted/apps/remix/.eslintrc.js rename to packages/remix/test/fixtures-legacy/14-node-linker-hoisted/apps/remix/.eslintrc.js diff --git a/packages/remix/test/fixtures/14-node-linker-hoisted/apps/remix/.gitignore b/packages/remix/test/fixtures-legacy/14-node-linker-hoisted/apps/remix/.gitignore similarity index 100% rename from packages/remix/test/fixtures/14-node-linker-hoisted/apps/remix/.gitignore rename to packages/remix/test/fixtures-legacy/14-node-linker-hoisted/apps/remix/.gitignore diff --git a/packages/remix/test/fixtures/14-node-linker-hoisted/apps/remix/app/root.tsx b/packages/remix/test/fixtures-legacy/14-node-linker-hoisted/apps/remix/app/root.tsx similarity index 100% rename from packages/remix/test/fixtures/14-node-linker-hoisted/apps/remix/app/root.tsx rename to packages/remix/test/fixtures-legacy/14-node-linker-hoisted/apps/remix/app/root.tsx diff --git a/packages/remix/test/fixtures/14-node-linker-hoisted/apps/remix/app/routes/_index.tsx b/packages/remix/test/fixtures-legacy/14-node-linker-hoisted/apps/remix/app/routes/_index.tsx similarity index 100% rename from packages/remix/test/fixtures/14-node-linker-hoisted/apps/remix/app/routes/_index.tsx rename to packages/remix/test/fixtures-legacy/14-node-linker-hoisted/apps/remix/app/routes/_index.tsx diff --git a/packages/remix/test/fixtures/14-node-linker-hoisted/apps/remix/package.json b/packages/remix/test/fixtures-legacy/14-node-linker-hoisted/apps/remix/package.json similarity index 100% rename from packages/remix/test/fixtures/14-node-linker-hoisted/apps/remix/package.json rename to packages/remix/test/fixtures-legacy/14-node-linker-hoisted/apps/remix/package.json diff --git a/packages/remix/test/fixtures/14-node-linker-hoisted/apps/remix/public/favicon.ico b/packages/remix/test/fixtures-legacy/14-node-linker-hoisted/apps/remix/public/favicon.ico similarity index 100% rename from packages/remix/test/fixtures/14-node-linker-hoisted/apps/remix/public/favicon.ico rename to packages/remix/test/fixtures-legacy/14-node-linker-hoisted/apps/remix/public/favicon.ico diff --git a/packages/remix/test/fixtures/14-node-linker-hoisted/apps/remix/remix.config.js b/packages/remix/test/fixtures-legacy/14-node-linker-hoisted/apps/remix/remix.config.js similarity index 100% rename from packages/remix/test/fixtures/14-node-linker-hoisted/apps/remix/remix.config.js rename to packages/remix/test/fixtures-legacy/14-node-linker-hoisted/apps/remix/remix.config.js diff --git a/packages/remix/test/fixtures/14-node-linker-hoisted/apps/remix/remix.env.d.ts b/packages/remix/test/fixtures-legacy/14-node-linker-hoisted/apps/remix/remix.env.d.ts similarity index 100% rename from packages/remix/test/fixtures/14-node-linker-hoisted/apps/remix/remix.env.d.ts rename to packages/remix/test/fixtures-legacy/14-node-linker-hoisted/apps/remix/remix.env.d.ts diff --git a/packages/remix/test/fixtures/14-node-linker-hoisted/apps/remix/tsconfig.json b/packages/remix/test/fixtures-legacy/14-node-linker-hoisted/apps/remix/tsconfig.json similarity index 100% rename from packages/remix/test/fixtures/14-node-linker-hoisted/apps/remix/tsconfig.json rename to packages/remix/test/fixtures-legacy/14-node-linker-hoisted/apps/remix/tsconfig.json diff --git a/packages/remix/test/fixtures/14-node-linker-hoisted/apps/remix/vercel.json b/packages/remix/test/fixtures-legacy/14-node-linker-hoisted/apps/remix/vercel.json similarity index 100% rename from packages/remix/test/fixtures/14-node-linker-hoisted/apps/remix/vercel.json rename to packages/remix/test/fixtures-legacy/14-node-linker-hoisted/apps/remix/vercel.json diff --git a/packages/remix/test/fixtures/14-node-linker-hoisted/package.json b/packages/remix/test/fixtures-legacy/14-node-linker-hoisted/package.json similarity index 100% rename from packages/remix/test/fixtures/14-node-linker-hoisted/package.json rename to packages/remix/test/fixtures-legacy/14-node-linker-hoisted/package.json diff --git a/packages/remix/test/fixtures/14-node-linker-hoisted/pnpm-lock.yaml b/packages/remix/test/fixtures-legacy/14-node-linker-hoisted/pnpm-lock.yaml similarity index 100% rename from packages/remix/test/fixtures/14-node-linker-hoisted/pnpm-lock.yaml rename to packages/remix/test/fixtures-legacy/14-node-linker-hoisted/pnpm-lock.yaml diff --git a/packages/remix/test/fixtures/14-node-linker-hoisted/pnpm-workspace.yaml b/packages/remix/test/fixtures-legacy/14-node-linker-hoisted/pnpm-workspace.yaml similarity index 100% rename from packages/remix/test/fixtures/14-node-linker-hoisted/pnpm-workspace.yaml rename to packages/remix/test/fixtures-legacy/14-node-linker-hoisted/pnpm-workspace.yaml diff --git a/packages/remix/test/fixtures/14-node-linker-hoisted/probes.json b/packages/remix/test/fixtures-legacy/14-node-linker-hoisted/probes.json similarity index 100% rename from packages/remix/test/fixtures/14-node-linker-hoisted/probes.json rename to packages/remix/test/fixtures-legacy/14-node-linker-hoisted/probes.json diff --git a/packages/remix/test/fixtures/14-node-linker-hoisted/tsconfig.json b/packages/remix/test/fixtures-legacy/14-node-linker-hoisted/tsconfig.json similarity index 100% rename from packages/remix/test/fixtures/14-node-linker-hoisted/tsconfig.json rename to packages/remix/test/fixtures-legacy/14-node-linker-hoisted/tsconfig.json diff --git a/packages/remix/test/fixtures/14-node-linker-hoisted/turbo.json b/packages/remix/test/fixtures-legacy/14-node-linker-hoisted/turbo.json similarity index 100% rename from packages/remix/test/fixtures/14-node-linker-hoisted/turbo.json rename to packages/remix/test/fixtures-legacy/14-node-linker-hoisted/turbo.json diff --git a/packages/remix/test/fixtures/14-node-linker-hoisted/vercel.json b/packages/remix/test/fixtures-legacy/14-node-linker-hoisted/vercel.json similarity index 100% rename from packages/remix/test/fixtures/14-node-linker-hoisted/vercel.json rename to packages/remix/test/fixtures-legacy/14-node-linker-hoisted/vercel.json diff --git a/packages/remix/test/fixtures-vite/01-no-preset/.eslintrc.cjs b/packages/remix/test/fixtures-vite/01-no-preset/.eslintrc.cjs new file mode 100644 index 000000000..8f2bbcd8a --- /dev/null +++ b/packages/remix/test/fixtures-vite/01-no-preset/.eslintrc.cjs @@ -0,0 +1,83 @@ +/** + * This is intended to be a basic starting point for linting in your app. + * It relies on recommended configs out of the box for simplicity, but you can + * and should modify this configuration to best suit your team's needs. + */ + +/** @type {import('eslint').Linter.Config} */ +module.exports = { + root: true, + parserOptions: { + ecmaVersion: "latest", + sourceType: "module", + ecmaFeatures: { + jsx: true, + }, + }, + env: { + browser: true, + commonjs: true, + es6: true, + }, + + // Base config + extends: ["eslint:recommended"], + + overrides: [ + // React + { + files: ["**/*.{js,jsx,ts,tsx}"], + plugins: ["react", "jsx-a11y"], + extends: [ + "plugin:react/recommended", + "plugin:react/jsx-runtime", + "plugin:react-hooks/recommended", + "plugin:jsx-a11y/recommended", + ], + settings: { + react: { + version: "detect", + }, + formComponents: ["Form"], + linkComponents: [ + { name: "Link", linkAttribute: "to" }, + { name: "NavLink", linkAttribute: "to" }, + ], + "import/resolver": { + typescript: {}, + }, + }, + }, + + // Typescript + { + files: ["**/*.{ts,tsx}"], + plugins: ["@typescript-eslint", "import"], + parser: "@typescript-eslint/parser", + settings: { + "import/internal-regex": "^~/", + "import/resolver": { + node: { + extensions: [".ts", ".tsx"], + }, + typescript: { + alwaysTryTypes: true, + }, + }, + }, + extends: [ + "plugin:@typescript-eslint/recommended", + "plugin:import/recommended", + "plugin:import/typescript", + ], + }, + + // Node + { + files: [".eslintrc.js"], + env: { + node: true, + }, + }, + ], +}; diff --git a/packages/remix/test/fixtures-vite/01-no-preset/.gitignore b/packages/remix/test/fixtures-vite/01-no-preset/.gitignore new file mode 100644 index 000000000..80ec311f4 --- /dev/null +++ b/packages/remix/test/fixtures-vite/01-no-preset/.gitignore @@ -0,0 +1,5 @@ +node_modules + +/.cache +/build +.env diff --git a/packages/remix/test/fixtures-vite/01-no-preset/README.md b/packages/remix/test/fixtures-vite/01-no-preset/README.md new file mode 100644 index 000000000..c05e097d9 --- /dev/null +++ b/packages/remix/test/fixtures-vite/01-no-preset/README.md @@ -0,0 +1,36 @@ +# Welcome to Remix + Vite! + +📖 See the [Remix docs](https://remix.run/docs) and the [Remix Vite docs](https://remix.run/docs/en/main/future/vite) for details on supported features. + +## Development + +Run the Vite dev server: + +```shellscript +npm run dev +``` + +## Deployment + +First, build your app for production: + +```sh +npm run build +``` + +Then run the app in production mode: + +```sh +npm start +``` + +Now you'll need to pick a host to deploy it to. + +### DIY + +If you're familiar with deploying Node applications, the built-in Remix app server is production-ready. + +Make sure to deploy the output of `npm run build` + +- `build/server` +- `build/client` diff --git a/packages/remix/test/fixtures-vite/01-no-preset/app/root.tsx b/packages/remix/test/fixtures-vite/01-no-preset/app/root.tsx new file mode 100644 index 000000000..e31409ca3 --- /dev/null +++ b/packages/remix/test/fixtures-vite/01-no-preset/app/root.tsx @@ -0,0 +1,25 @@ +import { + Links, + Meta, + Outlet, + Scripts, + ScrollRestoration, +} from "@remix-run/react"; + +export default function App() { + return ( + + + + + + + + + + + + + + ); +} diff --git a/packages/remix/test/fixtures-vite/01-no-preset/app/routes/_index.tsx b/packages/remix/test/fixtures-vite/01-no-preset/app/routes/_index.tsx new file mode 100644 index 000000000..534736923 --- /dev/null +++ b/packages/remix/test/fixtures-vite/01-no-preset/app/routes/_index.tsx @@ -0,0 +1,41 @@ +import type { MetaFunction } from "@remix-run/node"; + +export const meta: MetaFunction = () => { + return [ + { title: "New Remix App" }, + { name: "description", content: "Welcome to Remix!" }, + ]; +}; + +export default function Index() { + return ( + + ); +} diff --git a/packages/remix/test/fixtures-vite/01-no-preset/env.d.ts b/packages/remix/test/fixtures-vite/01-no-preset/env.d.ts new file mode 100644 index 000000000..78ed2345c --- /dev/null +++ b/packages/remix/test/fixtures-vite/01-no-preset/env.d.ts @@ -0,0 +1,2 @@ +/// +/// diff --git a/packages/remix/test/fixtures-vite/01-no-preset/package.json b/packages/remix/test/fixtures-vite/01-no-preset/package.json new file mode 100644 index 000000000..5a3e160c8 --- /dev/null +++ b/packages/remix/test/fixtures-vite/01-no-preset/package.json @@ -0,0 +1,39 @@ +{ + "name": "01-no-preset", + "private": true, + "sideEffects": false, + "type": "module", + "scripts": { + "build": "remix vite:build", + "dev": "remix vite:dev", + "lint": "eslint --ignore-path .gitignore --cache --cache-location ./node_modules/.cache/eslint .", + "start": "remix-serve ./build/server/index.js", + "typecheck": "tsc" + }, + "dependencies": { + "@remix-run/node": "^2.7.1", + "@remix-run/react": "^2.7.1", + "@remix-run/serve": "^2.7.1", + "isbot": "^4.1.0", + "react": "^18.2.0", + "react-dom": "^18.2.0" + }, + "devDependencies": { + "@remix-run/dev": "^2.7.1", + "@types/react": "^18.2.20", + "@types/react-dom": "^18.2.7", + "@typescript-eslint/eslint-plugin": "^6.7.4", + "eslint": "^8.38.0", + "eslint-import-resolver-typescript": "^3.6.1", + "eslint-plugin-import": "^2.28.1", + "eslint-plugin-jsx-a11y": "^6.7.1", + "eslint-plugin-react": "^7.33.2", + "eslint-plugin-react-hooks": "^4.6.0", + "typescript": "^5.1.6", + "vite": "^5.1.0", + "vite-tsconfig-paths": "^4.2.1" + }, + "engines": { + "node": ">=18.0.0" + } +} \ No newline at end of file diff --git a/packages/remix/test/fixtures-vite/01-no-preset/probes.json b/packages/remix/test/fixtures-vite/01-no-preset/probes.json new file mode 100644 index 000000000..611c7f7d5 --- /dev/null +++ b/packages/remix/test/fixtures-vite/01-no-preset/probes.json @@ -0,0 +1,14 @@ +{ + "probes": [ + { + "path": "/", + "mustContain": "Welcome to Remix", + "logMustContain": "WARN: The `vercelPreset()` Preset was not detected." + }, + { + "path": "/does-not-exist", + "status": 404, + "mustContain": "Not Found" + } + ] +} diff --git a/packages/remix/test/fixtures-vite/01-no-preset/public/favicon.ico b/packages/remix/test/fixtures-vite/01-no-preset/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..8830cf6821b354114848e6354889b8ecf6d2bc61 GIT binary patch literal 16958 zcmeI3+jCXb9mnJN2h^uNlXH@jlam{_a8F3W{T}Wih>9YJpaf7TUbu)A5fv|h7OMfR zR;q$lr&D!wv|c)`wcw1?>4QT1(&|jdsrI2h`Rn)dTW5t$8pz=s3_5L?#oBxAowe8R z_WfPfN?F+@`q$D@rvC?(W!uWieppskmQ~YG*>*L?{img@tWpnYXZslxeh#TSUS3{q z1Ju6JcfQSbQuORq69@YK(X-3c9vC2c2a2z~zw=F=50@pm0PUiCAm!bAT?2jpM`(^b zC|2&Ngngt^<>oCv#?P(AZ`5_84x#QBPulix)TpkIAUp=(KgGo4CVS~Sxt zVoR4>r5g9%bDh7hi0|v$={zr>CHd`?-l4^Ld(Z9PNz9piFY+llUw_x4ou7Vf-q%$g z)&)J4>6Ft~RZ(uV>dJD|`nxI1^x{X@Z5S<=vf;V3w_(*O-7}W<=e$=}CB9_R;)m9)d7`d_xx+nl^Bg|%ew=?uoKO8w zeQU7h;~8s!@9-k>7Cx}1SDQ7m(&miH zs8!l*wOJ!GHbdh)pD--&W3+w`9YJ=;m^FtMY=`mTq8pyV!-@L6smwp3(q?G>=_4v^ zn(ikLue7!y70#2uhqUVpb7fp!=xu2{aM^1P^pts#+feZv8d~)2sf`sjXLQCEj;pdI z%~f`JOO;*KnziMv^i_6+?mL?^wrE_&=IT9o1i!}Sd4Sx4O@w~1bi1)8(sXvYR-1?7~Zr<=SJ1Cw!i~yfi=4h6o3O~(-Sb2Ilwq%g$+V` z>(C&N1!FV5rWF&iwt8~b)=jIn4b!XbrWrZgIHTISrdHcpjjx=TwJXI7_%Ks4oFLl9 zNT;!%!P4~xH85njXdfqgnIxIFOOKW`W$fxU%{{5wZkVF^G=JB$oUNU5dQSL&ZnR1s z*ckJ$R`eCUJsWL>j6*+|2S1TL_J|Fl&kt=~XZF=+=iT0Xq1*KU-NuH%NAQff$LJp3 zU_*a;@7I0K{mqwux87~vwsp<}@P>KNDb}3U+6$rcZ114|QTMUSk+rhPA(b{$>pQTc zIQri{+U>GMzsCy0Mo4BfWXJlkk;RhfpWpAB{=Rtr*d1MNC+H3Oi5+3D$gUI&AjV-1 z=0ZOox+bGyHe=yk-yu%=+{~&46C$ut^ZN+ysx$NH}*F43)3bKkMsxGyIl#>7Yb8W zO{}&LUO8Ow{7>!bvSq?X{15&Y|4}0w2=o_^0ZzYgB+4HhZ4>s*mW&?RQ6&AY|CPcx z$*LjftNS|H)ePYnIKNg{ck*|y7EJ&Co0ho0K`!{ENPkASeKy-JWE}dF_%}j)Z5a&q zXAI2gPu6`s-@baW=*+keiE$ALIs5G6_X_6kgKK8n3jH2-H9`6bo)Qn1 zZ2x)xPt1=`9V|bE4*;j9$X20+xQCc$rEK|9OwH-O+Q*k`ZNw}K##SkY z3u}aCV%V|j@!gL5(*5fuWo>JFjeU9Qqk`$bdwH8(qZovE2tA7WUpoCE=VKm^eZ|vZ z(k<+j*mGJVah>8CkAsMD6#I$RtF;#57Wi`c_^k5?+KCmX$;Ky2*6|Q^bJ8+s%2MB}OH-g$Ev^ zO3uqfGjuN%CZiu<`aCuKCh{kK!dDZ+CcwgIeU2dsDfz+V>V3BDb~)~ zO!2l!_)m;ZepR~sL+-~sHS7;5ZB|~uUM&&5vDda2b z)CW8S6GI*oF><|ZeY5D^+Mcsri)!tmrM33qvwI4r9o@(GlW!u2R>>sB|E#%W`c*@5 z|0iA|`{6aA7D4Q?vc1{vT-#yytn07`H!QIO^1+X7?zG3%y0gPdIPUJ#s*DNAwd}m1_IMN1^T&be~+E z_z%1W^9~dl|Me9U6+3oNyuMDkF*z_;dOG(Baa*yq;TRiw{EO~O_S6>e*L(+Cdu(TM z@o%xTCV%hi&p)x3_inIF!b|W4|AF5p?y1j)cr9RG@v%QVaN8&LaorC-kJz_ExfVHB za!mtuee#Vb?dh&bwrfGHYAiX&&|v$}U*UBM;#F!N=x>x|G5s0zOa9{(`=k4v^6iK3 z8d&=O@xhDs{;v7JQ%eO;!Bt`&*MH&d zp^K#dkq;jnJz%%bsqwlaKA5?fy zS5JDbO#BgSAdi8NM zDo2SifX6^Z;vn>cBh-?~r_n9qYvP|3ihrnqq6deS-#>l#dV4mX|G%L8|EL;$U+w69 z;rTK3FW$ewUfH|R-Z;3;jvpfiDm?Fvyu9PeR>wi|E8>&j2Z@2h`U}|$>2d`BPV3pz#ViIzH8v6pP^L-p!GbLv<;(p>}_6u&E6XO5- zJ8JEvJ1)0>{iSd|kOQn#?0rTYL=KSmgMHCf$Qbm;7|8d(goD&T-~oCDuZf57iP#_Y zmxaoOSjQsm*^u+m$L9AMqwi=6bpdiAY6k3akjGN{xOZ`_J<~Puyzpi7yhhKrLmXV; z@ftONPy;Uw1F#{_fyGbk04yLE01v=i_5`RqQP+SUH0nb=O?l!J)qCSTdsbmjFJrTm zx4^ef@qt{B+TV_OHOhtR?XT}1Etm(f21;#qyyW6FpnM+S7*M1iME?9fe8d-`Q#InN z?^y{C_|8bxgUE@!o+Z72C)BrS&5D`gb-X8kq*1G7Uld-z19V}HY~mK#!o9MC-*#^+ znEsdc-|jj0+%cgBMy(cEkq4IQ1D*b;17Lyp>Utnsz%LRTfjQKL*vo(yJxwtw^)l|! z7jhIDdtLB}mpkOIG&4@F+9cYkS5r%%jz}I0R#F4oBMf-|Jmmk* zk^OEzF%}%5{a~kGYbFjV1n>HKC+a`;&-n*v_kD2DPP~n5(QE3C;30L<32GB*qV2z$ zWR1Kh=^1-q)P37WS6YWKlUSDe=eD^u_CV+P)q!3^{=$#b^auGS7m8zFfFS<>(e~)TG z&uwWhSoetoe!1^%)O}=6{SUcw-UQmw+i8lokRASPsbT=H|4D|( zk^P7>TUEFho!3qXSWn$m2{lHXw zD>eN6-;wwq9(?@f^F4L2Ny5_6!d~iiA^s~(|B*lbZir-$&%)l>%Q(36yOIAu|326K ztmBWz|MLA{Kj(H_{w2gd*nZ6a@ma(w==~EHIscEk|C=NGJa%Ruh4_+~f|%rt{I5v* zIX@F?|KJID56-ivb+PLo(9hn_CdK{irOcL15>JNQFY112^$+}JPyI{uQ~$&E*=ri; z`d^fH?4f=8vKHT4!p9O*fX(brB75Y9?e>T9=X#Fc@V#%@5^)~#zu5I(=>LQA-EGTS zecy*#6gG+8lapch#Hh%vl(+}J;Q!hC1OKoo;#h3#V%5Js)tQ)|>pTT@1ojd+F9Gey zg`B)zm`|Mo%tH31s4=<+`Pu|B3orXwNyIcNN>;fBkIj^X8P}RXhF= zXQK1u5RLN7k#_Q(KznJrALtMM13!vhfr025ar?@-%{l|uWt@NEd<$~n>RQL{ z+o;->n)+~0tt(u|o_9h!T`%M8%)w2awpV9b*xz9Pl-daUJm3y-HT%xg`^mFd6LBeL z!0~s;zEr)Bn9x)I(wx`;JVwvRcc^io2XX(Nn3vr3dgbrr@YJ?K3w18P*52^ieBCQP z=Up1V$N2~5ppJHRTeY8QfM(7Yv&RG7oWJAyv?c3g(29)P)u;_o&w|&)HGDIinXT~p z3;S|e$=&Tek9Wn!`cdY+d-w@o`37}x{(hl>ykB|%9yB$CGdIcl7Z?d&lJ%}QHck77 zJPR%C+s2w1_Dl_pxu6$Zi!`HmoD-%7OD@7%lKLL^Ixd9VlRSW*o&$^iQ2z+}hTgH) z#91TO#+jH<`w4L}XWOt(`gqM*uTUcky`O(mEyU|4dJoy6*UZJ7%*}ajuos%~>&P2j zk23f5<@GeV?(?`l=ih+D8t`d72xrUjv0wsg;%s1@*2p?TQ;n2$pV7h?_T%sL>iL@w zZ{lmc<|B7!e&o!zs6RW+u8+aDyUdG>ZS(v&rT$QVymB7sEC@VsK1dg^3F@K90-wYB zX!we79qx`(6LA>F$~{{xE8-3Wzyfe`+Lsce(?uj{k@lb97YTJt#>l*Z&LyKX@zjmu?UJC9w~;|NsB{%7G}y*uNDBxirfC EKbET!0{{R3 literal 0 HcmV?d00001 diff --git a/packages/remix/test/fixtures-vite/01-no-preset/tsconfig.json b/packages/remix/test/fixtures-vite/01-no-preset/tsconfig.json new file mode 100644 index 000000000..77291a910 --- /dev/null +++ b/packages/remix/test/fixtures-vite/01-no-preset/tsconfig.json @@ -0,0 +1,24 @@ +{ + "include": ["env.d.ts", "**/*.ts", "**/*.tsx"], + "compilerOptions": { + "lib": ["DOM", "DOM.Iterable", "ES2022"], + "isolatedModules": true, + "esModuleInterop": true, + "jsx": "react-jsx", + "module": "ESNext", + "moduleResolution": "Bundler", + "resolveJsonModule": true, + "target": "ES2022", + "strict": true, + "allowJs": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "baseUrl": ".", + "paths": { + "~/*": ["./app/*"] + }, + + // Vite takes care of building everything, not tsc. + "noEmit": true + } +} diff --git a/packages/remix/test/fixtures-vite/01-no-preset/vercel.json b/packages/remix/test/fixtures-vite/01-no-preset/vercel.json new file mode 100644 index 000000000..724d0678a --- /dev/null +++ b/packages/remix/test/fixtures-vite/01-no-preset/vercel.json @@ -0,0 +1,3 @@ +{ + "framework": "remix" +} diff --git a/packages/remix/test/fixtures-vite/01-no-preset/vite.config.ts b/packages/remix/test/fixtures-vite/01-no-preset/vite.config.ts new file mode 100644 index 000000000..a1fcb5a7b --- /dev/null +++ b/packages/remix/test/fixtures-vite/01-no-preset/vite.config.ts @@ -0,0 +1,7 @@ +import { vitePlugin as remix } from "@remix-run/dev"; +import { defineConfig } from "vite"; +import tsconfigPaths from "vite-tsconfig-paths"; + +export default defineConfig({ + plugins: [remix(), tsconfigPaths()], +}); diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/.eslintrc.cjs b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/.eslintrc.cjs new file mode 100644 index 000000000..8f2bbcd8a --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/.eslintrc.cjs @@ -0,0 +1,83 @@ +/** + * This is intended to be a basic starting point for linting in your app. + * It relies on recommended configs out of the box for simplicity, but you can + * and should modify this configuration to best suit your team's needs. + */ + +/** @type {import('eslint').Linter.Config} */ +module.exports = { + root: true, + parserOptions: { + ecmaVersion: "latest", + sourceType: "module", + ecmaFeatures: { + jsx: true, + }, + }, + env: { + browser: true, + commonjs: true, + es6: true, + }, + + // Base config + extends: ["eslint:recommended"], + + overrides: [ + // React + { + files: ["**/*.{js,jsx,ts,tsx}"], + plugins: ["react", "jsx-a11y"], + extends: [ + "plugin:react/recommended", + "plugin:react/jsx-runtime", + "plugin:react-hooks/recommended", + "plugin:jsx-a11y/recommended", + ], + settings: { + react: { + version: "detect", + }, + formComponents: ["Form"], + linkComponents: [ + { name: "Link", linkAttribute: "to" }, + { name: "NavLink", linkAttribute: "to" }, + ], + "import/resolver": { + typescript: {}, + }, + }, + }, + + // Typescript + { + files: ["**/*.{ts,tsx}"], + plugins: ["@typescript-eslint", "import"], + parser: "@typescript-eslint/parser", + settings: { + "import/internal-regex": "^~/", + "import/resolver": { + node: { + extensions: [".ts", ".tsx"], + }, + typescript: { + alwaysTryTypes: true, + }, + }, + }, + extends: [ + "plugin:@typescript-eslint/recommended", + "plugin:import/recommended", + "plugin:import/typescript", + ], + }, + + // Node + { + files: [".eslintrc.js"], + env: { + node: true, + }, + }, + ], +}; diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/.gitignore b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/.gitignore new file mode 100644 index 000000000..82fa43a7b --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/.gitignore @@ -0,0 +1,7 @@ +node_modules + +/.cache +/public/build +/build +.env +.vercel diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/LICENSE b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/LICENSE new file mode 100644 index 000000000..f19f3815a --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 Dilum Sanjaya + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/README.md b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/README.md new file mode 100644 index 000000000..6945d005c --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/README.md @@ -0,0 +1,7 @@ +# Interactive Remix Routing V2 (WIP) + + +Interactive app to demonstrate how Remix-run routing verson 2 works ! + +You can find the [V1 interactive app here](https://github.com/dilums/interactive-remix-routing) + diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/Breadcrumbs/Breadcrumbs.tsx b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/Breadcrumbs/Breadcrumbs.tsx new file mode 100644 index 000000000..9082c0075 --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/Breadcrumbs/Breadcrumbs.tsx @@ -0,0 +1,43 @@ +import type { RouteMatch } from "@remix-run/react"; +import { useMemo } from "react"; +import ChevronRightIcon from "~/components/icons/ChevronRightIcon"; + +type Props = { + matches: RouteMatch[]; +}; + +export type LinksArray = { + label: string; + link: string; + key: string; +}[]; + +export type HandleCustom = { + links: LinksArray; +}; + +export default function Breadcrumbs({ matches }: Props) { + const linkArray = useMemo(() => { + return matches + .filter((i) => i.handle && Array.isArray(i.handle.links)) + .map((i) => i?.handle?.links) + .reduce((acc, cur) => [...acc, ...cur], []); + }, [matches]); + + if (!linkArray.length) { + return null; + } + + return ( +
+ {linkArray.map(({ label, link, key }, index) => ( +
+
{label}
+ {index !== linkArray.length - 1 && ( + + )} +
+ ))} +
+ ); +} diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/Breadcrumbs/index.tsx b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/Breadcrumbs/index.tsx new file mode 100644 index 000000000..0b98b6dc8 --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/Breadcrumbs/index.tsx @@ -0,0 +1,3 @@ +import Breadcrumbs from './Breadcrumbs'; + +export default Breadcrumbs; \ No newline at end of file diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/Header/Header.tsx b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/Header/Header.tsx new file mode 100644 index 000000000..462efb683 --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/Header/Header.tsx @@ -0,0 +1,47 @@ +import { Link } from "@remix-run/react"; +import GithubIcon from "~/components/icons/GithubIcon"; +import MoonIcon from "~/components/icons/MoonIcon"; +import SunIcon from "~/components/icons/SunIcon"; +import RemixLogo from "~/components/RemixLogo"; + +type Props = { + toggleDarkMode: () => void; + isDarkMode: boolean; +}; + +export default function Header({ toggleDarkMode, isDarkMode }: Props) { + return ( +
+ + +
+ Routing +
+ +
+ + Version 1 Demo + + + + + +
+
+ ); +} diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/Header/index.tsx b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/Header/index.tsx new file mode 100644 index 000000000..0db1c6b6b --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/Header/index.tsx @@ -0,0 +1,3 @@ +import Header from './Header'; + +export default Header; \ No newline at end of file diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/RemixLogo/RemixLogo.tsx b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/RemixLogo/RemixLogo.tsx new file mode 100644 index 000000000..ff28a21db --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/RemixLogo/RemixLogo.tsx @@ -0,0 +1,40 @@ +type IconProps = { + className?: string; +}; +export default function RemixLogo({ className = "h-7" }: IconProps) { + return ( + + + + + + + + + ); +} diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/RemixLogo/index.tsx b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/RemixLogo/index.tsx new file mode 100644 index 000000000..0d8563fe3 --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/RemixLogo/index.tsx @@ -0,0 +1,3 @@ +import RemixLogo from './RemixLogo'; + +export default RemixLogo; \ No newline at end of file diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/Sidebar/Sidebar.tsx b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/Sidebar/Sidebar.tsx new file mode 100644 index 000000000..50c51bb58 --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/Sidebar/Sidebar.tsx @@ -0,0 +1,18 @@ +import TreeStructure from "~/components/Sidebar/TreeStructure"; +import routes from "~/data/routes"; + +export default function Sidebar() { + return ( +
+ {routes.map(({ title, tree }) => ( +
+
{title}
+ +
+ ))} +
+ ); +} diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/Sidebar/TreeStructure/NodeIcon/NodeIcon.tsx b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/Sidebar/TreeStructure/NodeIcon/NodeIcon.tsx new file mode 100644 index 000000000..616863b8a --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/Sidebar/TreeStructure/NodeIcon/NodeIcon.tsx @@ -0,0 +1,31 @@ +import FolderIcon from "~/components/icons/FolderIcon"; +import type { TreeNodeType } from "~/types/tree"; + +type Props = { + nodeType: TreeNodeType; +}; + +export default function NodeIcon({ nodeType }: Props) { + if (nodeType === "f") { + return ( +
+ +
+ ); + } + if (nodeType === "l") { + return ( +
+ L +
+ ); + } + if (nodeType === "r") { + return ( +
+ R +
+ ); + } + return null; +} diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/Sidebar/TreeStructure/NodeIcon/index.tsx b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/Sidebar/TreeStructure/NodeIcon/index.tsx new file mode 100644 index 000000000..61d42ca85 --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/Sidebar/TreeStructure/NodeIcon/index.tsx @@ -0,0 +1,3 @@ +import NodeIcon from './NodeIcon'; + +export default NodeIcon; \ No newline at end of file diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/Sidebar/TreeStructure/TreeStructure.tsx b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/Sidebar/TreeStructure/TreeStructure.tsx new file mode 100644 index 000000000..ade111bd0 --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/Sidebar/TreeStructure/TreeStructure.tsx @@ -0,0 +1,41 @@ +import NodeIcon from "~/components/Sidebar/TreeStructure/NodeIcon"; +import { NavLink } from "@remix-run/react"; +import type { TreeNode } from "~/types/tree"; + +type Props = { node: TreeNode; isLastChild?: boolean }; + +export default function TreeStructure({ node, isLastChild = true }: Props) { + return ( +
+ {isLastChild ? ( +
+ ) : ( +
+ )} + +
+
+
+ +
+ {node.type === "r" ? ( + + {node.name} + + ) : ( + <>{node.name} + )} +
+
+
+ + {node.children.map((child, index) => ( + + ))} +
+ ); +} diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/Sidebar/TreeStructure/index.tsx b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/Sidebar/TreeStructure/index.tsx new file mode 100644 index 000000000..2d9912f84 --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/Sidebar/TreeStructure/index.tsx @@ -0,0 +1,3 @@ +import TreeStructure from './TreeStructure'; + +export default TreeStructure; \ No newline at end of file diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/Sidebar/index.tsx b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/Sidebar/index.tsx new file mode 100644 index 000000000..4dce3e055 --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/Sidebar/index.tsx @@ -0,0 +1,3 @@ +import Sidebar from './Sidebar'; + +export default Sidebar; \ No newline at end of file diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/icons/ChevronRightIcon/ChevronRightIcon.tsx b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/icons/ChevronRightIcon/ChevronRightIcon.tsx new file mode 100644 index 000000000..405c0cc99 --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/icons/ChevronRightIcon/ChevronRightIcon.tsx @@ -0,0 +1,21 @@ +type IconProps = { + className?: string; + strokeWidth?: number; +}; +export default function ChevronRightIcon({ + className = "w-6 h-6", + strokeWidth = 2.5, +}: IconProps) { + return ( + + + + ); +} diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/icons/ChevronRightIcon/index.tsx b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/icons/ChevronRightIcon/index.tsx new file mode 100644 index 000000000..ac5ea6a19 --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/icons/ChevronRightIcon/index.tsx @@ -0,0 +1,3 @@ +import ChevronRightIcon from './ChevronRightIcon'; + +export default ChevronRightIcon; \ No newline at end of file diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/icons/FolderIcon/FolderIcon.tsx b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/icons/FolderIcon/FolderIcon.tsx new file mode 100644 index 000000000..b1354443b --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/icons/FolderIcon/FolderIcon.tsx @@ -0,0 +1,25 @@ +type IconProps = { + className?: string; + strokeWidth?: number; +}; +export default function FolderIcon({ + className = "w-6 h-6", + strokeWidth = 1.5, +}: IconProps) { + return ( + + + + ); +} diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/icons/FolderIcon/index.tsx b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/icons/FolderIcon/index.tsx new file mode 100644 index 000000000..13c64a41d --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/icons/FolderIcon/index.tsx @@ -0,0 +1,3 @@ +import FolderIcon from './FolderIcon'; + +export default FolderIcon; \ No newline at end of file diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/icons/GithubIcon/GithubIcon.tsx b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/icons/GithubIcon/GithubIcon.tsx new file mode 100644 index 000000000..285b7b5ce --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/icons/GithubIcon/GithubIcon.tsx @@ -0,0 +1,23 @@ +type IconProps = { + className?: string; + strokeWidth?: number; +}; +export default function GithubIcon({ + className = "w-6 h-6", + strokeWidth = 1.5, +}: IconProps) { + return ( + + + + ); +} diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/icons/GithubIcon/index.tsx b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/icons/GithubIcon/index.tsx new file mode 100644 index 000000000..933cb3dd9 --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/icons/GithubIcon/index.tsx @@ -0,0 +1,3 @@ +import GithubIcon from './GithubIcon'; + +export default GithubIcon; \ No newline at end of file diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/icons/MoonIcon/MoonIcon.tsx b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/icons/MoonIcon/MoonIcon.tsx new file mode 100644 index 000000000..019e1ee58 --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/icons/MoonIcon/MoonIcon.tsx @@ -0,0 +1,23 @@ +type IconProps = { + className?: string; + strokeWidth?: number; +}; +export default function MoonIcon({ + className = "w-6 h-6", + strokeWidth = 1.5, +}: IconProps) { + return ( + + + + ); +} diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/icons/MoonIcon/index.tsx b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/icons/MoonIcon/index.tsx new file mode 100644 index 000000000..cf238a03c --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/icons/MoonIcon/index.tsx @@ -0,0 +1,3 @@ +import MoonIcon from './MoonIcon'; + +export default MoonIcon; \ No newline at end of file diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/icons/SunIcon/SunIcon.tsx b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/icons/SunIcon/SunIcon.tsx new file mode 100644 index 000000000..c73d2b45f --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/icons/SunIcon/SunIcon.tsx @@ -0,0 +1,16 @@ +type IconProps = { + className?: string; + strokeWidth?: number; +}; +export default function SunIcon({ className = "w-6 h-6" }: IconProps) { + return ( + + + + ); +} diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/icons/SunIcon/index.tsx b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/icons/SunIcon/index.tsx new file mode 100644 index 000000000..c5bfad8d4 --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/icons/SunIcon/index.tsx @@ -0,0 +1,3 @@ +import SunIcon from './SunIcon'; + +export default SunIcon; \ No newline at end of file diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/wrappers/LayoutWrapper/LayoutWrapper.tsx b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/wrappers/LayoutWrapper/LayoutWrapper.tsx new file mode 100644 index 000000000..72a156142 --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/wrappers/LayoutWrapper/LayoutWrapper.tsx @@ -0,0 +1,15 @@ +type Props = { + filePath: string; + children?: React.ReactNode; +}; + +export default function LayoutWrapper({ filePath, children }: Props) { + return ( +
+
+ {filePath} +
+ {children} +
+ ); +} diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/wrappers/LayoutWrapper/index.tsx b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/wrappers/LayoutWrapper/index.tsx new file mode 100644 index 000000000..83d7c63e0 --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/wrappers/LayoutWrapper/index.tsx @@ -0,0 +1,3 @@ +import LayoutWrapper from './LayoutWrapper'; + +export default LayoutWrapper; \ No newline at end of file diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/wrappers/RouteWrapper/RouteWrapper.tsx b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/wrappers/RouteWrapper/RouteWrapper.tsx new file mode 100644 index 000000000..350ea41e0 --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/wrappers/RouteWrapper/RouteWrapper.tsx @@ -0,0 +1,15 @@ +type Props = { + filePath: string; + children?: React.ReactNode; +}; + +export default function RouteWrapper({ filePath, children }: Props) { + return ( +
+
+ {filePath} +
+ {children} +
+ ); +} diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/wrappers/RouteWrapper/index.tsx b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/wrappers/RouteWrapper/index.tsx new file mode 100644 index 000000000..6acdfa974 --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/components/wrappers/RouteWrapper/index.tsx @@ -0,0 +1,3 @@ +import RouteWrapper from './RouteWrapper'; + +export default RouteWrapper; \ No newline at end of file diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/basicRoutes/basicRoutes.tsx b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/basicRoutes/basicRoutes.tsx new file mode 100644 index 000000000..d0c46a406 --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/basicRoutes/basicRoutes.tsx @@ -0,0 +1,13 @@ +import type { TreeNode } from "~/types/tree"; + +const basicRoutes: TreeNode = { + name: "routes", + type: "f", + path: "", + children: [ + { name: "_index.tsx", type: "r", path: "/", children: [] }, + { name: "about.tsx", type: "r", path: "/about", children: [] }, + ], +}; + +export default basicRoutes; diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/basicRoutes/index.tsx b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/basicRoutes/index.tsx new file mode 100644 index 000000000..170cc0ba6 --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/basicRoutes/index.tsx @@ -0,0 +1,3 @@ +import basicRoutes from './basicRoutes'; + +export default basicRoutes; \ No newline at end of file diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/dotDelimeters/dotDelimeters.tsx b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/dotDelimeters/dotDelimeters.tsx new file mode 100644 index 000000000..4912f379a --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/dotDelimeters/dotDelimeters.tsx @@ -0,0 +1,29 @@ +import type { TreeNode } from "~/types/tree"; + +const dotDelimeters: TreeNode = { + name: "routes", + type: "f", + path: "", + children: [ + { + name: "concerts.trending.tsx", + type: "r", + path: "/concerts/trending", + children: [], + }, + { + name: "concerts.salt-lake-city.tsx", + type: "r", + path: "concerts/salt-lake-city", + children: [], + }, + { + name: "concerts.san-diego.tsx", + type: "r", + path: "concerts/san-diego", + children: [], + }, + ], +}; + +export default dotDelimeters; diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/dotDelimeters/index.tsx b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/dotDelimeters/index.tsx new file mode 100644 index 000000000..b592d5356 --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/dotDelimeters/index.tsx @@ -0,0 +1,3 @@ +import dotDelimeters from './dotDelimeters'; + +export default dotDelimeters; \ No newline at end of file diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/dynamicSegments/dynamicSegments.tsx b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/dynamicSegments/dynamicSegments.tsx new file mode 100644 index 000000000..8006616dc --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/dynamicSegments/dynamicSegments.tsx @@ -0,0 +1,23 @@ +import type { TreeNode } from "~/types/tree"; + +const dynamicSegments: TreeNode = { + name: "routes", + type: "f", + path: "", + children: [ + { + name: "movies.$movieName.tsx", + type: "r", + path: "movies/avatar", + children: [], + }, + { + name: "movies.trending.tsx", + type: "r", + path: "movies/trending", + children: [], + }, + ], +}; + +export default dynamicSegments; diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/dynamicSegments/index.tsx b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/dynamicSegments/index.tsx new file mode 100644 index 000000000..ec5dd7294 --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/dynamicSegments/index.tsx @@ -0,0 +1,3 @@ +import dynamicSegments from './dynamicSegments'; + +export default dynamicSegments; \ No newline at end of file diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/folderOrganization/folderOrganization.tsx b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/folderOrganization/folderOrganization.tsx new file mode 100644 index 000000000..30e01bd10 --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/folderOrganization/folderOrganization.tsx @@ -0,0 +1,10 @@ +import type { TreeNode } from "~/types/tree"; + +const folderOrganization: TreeNode = { + name: "routes", + type: "f", + path: "", + children: [], +}; + +export default folderOrganization; diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/folderOrganization/index.tsx b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/folderOrganization/index.tsx new file mode 100644 index 000000000..872adaef1 --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/folderOrganization/index.tsx @@ -0,0 +1,3 @@ +import folderOrganization from './folderOrganization'; + +export default folderOrganization; \ No newline at end of file diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/index.tsx b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/index.tsx new file mode 100644 index 000000000..d9265cdae --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/index.tsx @@ -0,0 +1,3 @@ +import routes from './routes'; + +export default routes; \ No newline at end of file diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/nestedRoutes/index.tsx b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/nestedRoutes/index.tsx new file mode 100644 index 000000000..3e0af820f --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/nestedRoutes/index.tsx @@ -0,0 +1,3 @@ +import nestedRoutes from './nestedRoutes'; + +export default nestedRoutes; \ No newline at end of file diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/nestedRoutes/nestedRoutes.tsx b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/nestedRoutes/nestedRoutes.tsx new file mode 100644 index 000000000..658965fdf --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/nestedRoutes/nestedRoutes.tsx @@ -0,0 +1,24 @@ +import type { TreeNode } from "~/types/tree"; + +const nestedRoutes: TreeNode = { + name: "routes", + type: "f", + path: "", + children: [ + { name: "actors._index.tsx", type: "r", path: "/actors", children: [] }, + { + name: "actors.$actorName.tsx", + type: "r", + path: "/actors/morgan-freeman", + children: [], + }, + { + name: "actors.trending.tsx", + type: "r", + path: "/actors/trending", + children: [], + }, + { name: "actors.tsx", type: "l", path: "l", children: [] }, + ], +}; +export default nestedRoutes; diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/nestedWOlayout/index.tsx b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/nestedWOlayout/index.tsx new file mode 100644 index 000000000..f636cafe1 --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/nestedWOlayout/index.tsx @@ -0,0 +1,3 @@ +import nestedWOlayout from './nestedWOlayout'; + +export default nestedWOlayout; \ No newline at end of file diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/nestedWOlayout/nestedWOlayout.tsx b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/nestedWOlayout/nestedWOlayout.tsx new file mode 100644 index 000000000..70e97fb29 --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/nestedWOlayout/nestedWOlayout.tsx @@ -0,0 +1,31 @@ +import type { TreeNode } from "~/types/tree"; + +const nestedWOlayout: TreeNode = { + name: "routes", + type: "f", + path: "", + children: [ + { name: "actors._index.tsx", type: "r", path: "/actors", children: [] }, + { + name: "actors.$actorName.tsx", + type: "r", + path: "/actors/morgan-freeman", + children: [], + }, + { + name: "actors.trending.tsx", + type: "r", + path: "/actors/trending", + children: [], + }, + { name: "actors.tsx", type: "l", path: "", children: [] }, + { + name: "actors_.favourites.tsx", + type: "r", + path: "actors/favourites", + children: [], + }, + ], +}; + +export default nestedWOlayout; diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/optionalSegments/index.tsx b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/optionalSegments/index.tsx new file mode 100644 index 000000000..2bcf55896 --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/optionalSegments/index.tsx @@ -0,0 +1,3 @@ +import optionalSegments from './optionalSegments'; + +export default optionalSegments; \ No newline at end of file diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/optionalSegments/optionalSegments.tsx b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/optionalSegments/optionalSegments.tsx new file mode 100644 index 000000000..0227eea0b --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/optionalSegments/optionalSegments.tsx @@ -0,0 +1,29 @@ +import type { TreeNode } from "~/types/tree"; + +const optionalSegments: TreeNode = { + name: "routes", + type: "f", + path: "", + children: [ + { + name: "products.($lang)._index.tsx", + type: "r", + path: "/products/fr", + children: [], + }, + { + name: "products.($lang).$productId.tsx", + type: "r", + path: "/products/en/american-flag-speedo", + children: [], + }, + { + name: "products.($lang).categories.tsx", + type: "r", + path: "/products/fr/categories", + children: [], + }, + ], +}; + +export default optionalSegments; diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/pathlessRoutes/index.tsx b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/pathlessRoutes/index.tsx new file mode 100644 index 000000000..931f20fba --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/pathlessRoutes/index.tsx @@ -0,0 +1,3 @@ +import pathlessRoutes from './pathlessRoutes'; + +export default pathlessRoutes; \ No newline at end of file diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/pathlessRoutes/pathlessRoutes.tsx b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/pathlessRoutes/pathlessRoutes.tsx new file mode 100644 index 000000000..8ddcf9c11 --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/pathlessRoutes/pathlessRoutes.tsx @@ -0,0 +1,14 @@ +import type { TreeNode } from "~/types/tree"; + +const pathlessRoutes: TreeNode = { + name: "routes", + type: "f", + path: "", + children: [ + { name: "_auth.login.tsx", type: "r", path: "/login", children: [] }, + { name: "_auth.register.tsx", type: "r", path: "/register", children: [] }, + { name: "_auth.tsx", type: "l", path: "", children: [] }, + ], +}; + +export default pathlessRoutes; diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/routes.tsx b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/routes.tsx new file mode 100644 index 000000000..d22e99b8e --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/routes.tsx @@ -0,0 +1,26 @@ +import type { TreeNode } from "~/types/tree"; +import basicRoutes from "./basicRoutes"; +import dotDelimeters from "./dotDelimeters"; +import dynamicSegments from "./dynamicSegments"; +import folderOrganization from "./folderOrganization"; +import nestedRoutes from "./nestedRoutes"; +import nestedWOlayout from "./nestedWOlayout"; +import optionalSegments from "./optionalSegments"; +import pathlessRoutes from "./pathlessRoutes"; +import specialCharacters from "./specialCharacters"; +import splatRoutes from "./splatRoutes"; + +const routes: { title: string; tree: TreeNode }[] = [ + { title: "Basic Routes", tree: basicRoutes }, + { title: "Dot Delimeters", tree: dotDelimeters }, + { title: "Dynamic Segments", tree: dynamicSegments }, + { title: "Nested Routes", tree: nestedRoutes }, + { title: "Nested Without Layout", tree: nestedWOlayout }, + { title: "Pathless Routes", tree: pathlessRoutes }, + { title: "Optional Segments", tree: optionalSegments }, + { title: "Splat Routes", tree: splatRoutes }, + { title: "Special Characters", tree: specialCharacters }, + { title: "Folder Orgnanization", tree: folderOrganization }, +]; + +export default routes; diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/specialCharacters/index.tsx b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/specialCharacters/index.tsx new file mode 100644 index 000000000..28b2e0260 --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/specialCharacters/index.tsx @@ -0,0 +1,3 @@ +import specialCharacters from './specialCharacters'; + +export default specialCharacters; \ No newline at end of file diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/specialCharacters/specialCharacters.tsx b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/specialCharacters/specialCharacters.tsx new file mode 100644 index 000000000..888df27eb --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/specialCharacters/specialCharacters.tsx @@ -0,0 +1,36 @@ +import type { TreeNode } from "~/types/tree"; + +const specialCharacters: TreeNode = { + name: "routes", + type: "f", + path: "", + children: [ + { + name: "sitemap[.]xml.tsx", + type: "r", + path: "/sitemap.xml", + children: [], + }, + { + name: "[sitemap2.xml].tsx", + type: "r", + path: "/sitemap2.xml", + children: [], + }, + { + name: "weird-url.[_index].tsx", + type: "r", + path: "/weird-url/_index", + children: [], + }, + { + name: "dolla-bills-[$].tsx", + type: "r", + path: "/dolla-bills-$", + children: [], + }, + { name: "[[so-weird]].tsx", type: "r", path: "/[so-weird]", children: [] }, + ], +}; + +export default specialCharacters; diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/splatRoutes/index.tsx b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/splatRoutes/index.tsx new file mode 100644 index 000000000..0a2c185bb --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/splatRoutes/index.tsx @@ -0,0 +1,3 @@ +import splatRoutes from './splatRoutes'; + +export default splatRoutes; \ No newline at end of file diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/splatRoutes/splatRoutes.tsx b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/splatRoutes/splatRoutes.tsx new file mode 100644 index 000000000..285b71f1e --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/data/routes/splatRoutes/splatRoutes.tsx @@ -0,0 +1,10 @@ +import type { TreeNode } from "~/types/tree"; + +const splatRoutes: TreeNode = { + name: "routes", + type: "f", + path: "", + children: [{ name: "files.$.tsx", type: "r", path: "/files", children: [] }], +}; + +export default splatRoutes; diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/root.tsx b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/root.tsx new file mode 100644 index 000000000..20f4ad6e7 --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/root.tsx @@ -0,0 +1,79 @@ +import type { LinksFunction, MetaFunction } from "@remix-run/node"; +import { + Links, + Meta, + Outlet, + Scripts, + ScrollRestoration, + useMatches, +} from "@remix-run/react"; +import tailwind from "~/tailwind.css?url"; +import styles from "~/styles.css?url"; +import Sidebar from "~/components/Sidebar"; +import Header from "~/components/Header"; +import Breadcrumbs from "~/components/Breadcrumbs"; +import LayoutWrapper from "~/components/wrappers/LayoutWrapper"; +import { useCallback, useMemo, useState } from "react"; + +export const meta: MetaFunction = () => { + return [ + { title: "Remix Routing V2" }, + { + property: "og:title", + content: "Home Page", + }, + { + name: "description", + content: "App to visualize remix routing version 2", + }, + ]; +}; + +export const links: LinksFunction = () => [ + { rel: "stylesheet", href: tailwind }, + { rel: "stylesheet", href: styles }, +]; + +export default function App() { + const matches = useMatches(); + const [isDarkMode, setIsDarkMode] = useState(true); + + const themeProps = useMemo(() => { + if (isDarkMode) { + return { className: "dark" }; + } + return {}; + }, [isDarkMode]); + + const toggleDarkMode = useCallback(() => { + setIsDarkMode((current) => !current); + }, []); + + return ( + + + + + + + + +
+ +
+
+ +
+ + + +
+
+
+ + + + + + ); +} diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/[[so-weird]].tsx b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/[[so-weird]].tsx new file mode 100644 index 000000000..53cc4eccf --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/[[so-weird]].tsx @@ -0,0 +1,17 @@ +import RouteWrapper from "~/components/wrappers/RouteWrapper"; +import generateMeta from "~/utils/generateMeta"; +import type { HandleCustom } from "~/components/Breadcrumbs/Breadcrumbs"; + +export const config = { + group: "special" +}; + +export const handle: HandleCustom = { + links: [{ label: "[so-weird]", link: "/", key: "so-weird" }], +}; +export const meta = generateMeta("So Weird"); +const filePath = "routes/[[so-weird]].tsx"; + +export default function SpecialCharPage() { + return SpecialChar Page; +} diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/[sitemap2.xml].tsx b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/[sitemap2.xml].tsx new file mode 100644 index 000000000..9bfcbbb88 --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/[sitemap2.xml].tsx @@ -0,0 +1,17 @@ +import RouteWrapper from "~/components/wrappers/RouteWrapper"; +import generateMeta from "~/utils/generateMeta"; +import type { HandleCustom } from "~/components/Breadcrumbs/Breadcrumbs"; + +export const config = { + group: "special" +}; + +export const handle: HandleCustom = { + links: [{ label: "Sitemap 2", link: "/sitemap2.xml", key: "Sitemap-2" }], +}; +export const meta = generateMeta("Sitemap 2"); +const filePath = "routes/[sitemap2.xml].tsx"; + +export default function SpecialCharPage() { + return SpecialChar Page; +} diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/_auth.login.tsx b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/_auth.login.tsx new file mode 100644 index 000000000..f4544fd53 --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/_auth.login.tsx @@ -0,0 +1,18 @@ +import RouteWrapper from "~/components/wrappers/RouteWrapper"; +import generateMeta from "~/utils/generateMeta"; +import type { HandleCustom } from "~/components/Breadcrumbs/Breadcrumbs"; + +export const config = { + group: "auth" +}; + +export const handle: HandleCustom = { + links: [{ label: "Login", link: "/login", key: "login" }], +}; +export const meta = generateMeta("Login"); + +const filePath = "routes/_auth.login.tsx"; + +export default function authLoginPage() { + return authLogin Page; +} diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/_auth.register.tsx b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/_auth.register.tsx new file mode 100644 index 000000000..2e86ea2d1 --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/_auth.register.tsx @@ -0,0 +1,18 @@ +import RouteWrapper from "~/components/wrappers/RouteWrapper"; +import generateMeta from "~/utils/generateMeta"; +import type { HandleCustom } from "~/components/Breadcrumbs/Breadcrumbs"; + +export const config = { + group: "auth" +}; + +export const handle: HandleCustom = { + links: [{ label: "Register", link: "/register", key: "register" }], +}; +export const meta = generateMeta("Register"); + +const filePath = "routes/_auth.register.tsx"; + +export default function authRegisterPage() { + return authRegister Page; +} diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/_auth.tsx b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/_auth.tsx new file mode 100644 index 000000000..e8b2e7217 --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/_auth.tsx @@ -0,0 +1,13 @@ +import { Outlet } from "@remix-run/react"; +import LayoutWrapper from "~/components/wrappers/LayoutWrapper"; + +const filePath = "routes/_auth.tsx"; + +export default function authLayout() { + return ( + + + + ); +} + \ No newline at end of file diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/_index.tsx b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/_index.tsx new file mode 100644 index 000000000..c277a7ff0 --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/_index.tsx @@ -0,0 +1,18 @@ +import RouteWrapper from "~/components/wrappers/RouteWrapper"; +import generateMeta from "~/utils/generateMeta"; +import type { HandleCustom } from "~/components/Breadcrumbs/Breadcrumbs"; + +export const config = { + group: "basic" +}; + +export const handle: HandleCustom = { + links: [{ label: "Home", link: "/", key: "home" }], +}; +export const meta = generateMeta("Home"); + +const filePath = "routes/index.tsx"; + +export default function HomePage() { + return Home Page; +} diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/about.tsx b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/about.tsx new file mode 100644 index 000000000..f79c349eb --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/about.tsx @@ -0,0 +1,18 @@ +import RouteWrapper from "~/components/wrappers/RouteWrapper"; +import generateMeta from "~/utils/generateMeta"; +import type { HandleCustom } from "~/components/Breadcrumbs/Breadcrumbs"; + +export const config = { + group: "basic" +}; + +export const handle: HandleCustom = { + links: [{ label: "About", link: "/about", key: "about" }], +}; +export const meta = generateMeta("About"); + +const filePath = "routes/about.tsx"; + +export default function AboutPage() { + return About Page; +} diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/actors.$actorName.tsx b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/actors.$actorName.tsx new file mode 100644 index 000000000..807fe1b15 --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/actors.$actorName.tsx @@ -0,0 +1,22 @@ +import RouteWrapper from "~/components/wrappers/RouteWrapper"; +import generateMeta from "~/utils/generateMeta"; +import type { HandleCustom } from "~/components/Breadcrumbs/Breadcrumbs"; + +export const config = { + group: "actors" +}; + +export const handle: HandleCustom = { + links: [ + { label: "Actors", link: "", key: "actor-root" }, + { label: "Profile", link: "", key: "profile" }, + ], +}; +export const meta = generateMeta("Actor Profile"); +const filePath = "routes/actors.$actorName.tsx"; + +export default function ActorsCommonActornamePage() { + return ( + ActorsCommonActorname Page + ); +} diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/actors._index.tsx b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/actors._index.tsx new file mode 100644 index 000000000..acf7ca044 --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/actors._index.tsx @@ -0,0 +1,17 @@ +import RouteWrapper from "~/components/wrappers/RouteWrapper"; +import generateMeta from "~/utils/generateMeta"; +import type { HandleCustom } from "~/components/Breadcrumbs/Breadcrumbs"; + +export const config = { + group: "actors" +}; + +export const handle: HandleCustom = { + links: [{ label: "Actors", link: "", key: "actors" }], +}; +export const meta = generateMeta("Actors"); +const filePath = "routes/actors._index.tsx"; + +export default function ActorsindexPage() { + return Actorsindex Page; +} diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/actors.trending.tsx b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/actors.trending.tsx new file mode 100644 index 000000000..3ec052ab9 --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/actors.trending.tsx @@ -0,0 +1,20 @@ +import RouteWrapper from "~/components/wrappers/RouteWrapper"; +import generateMeta from "~/utils/generateMeta"; +import type { HandleCustom } from "~/components/Breadcrumbs/Breadcrumbs"; + +export const config = { + group: "actors" +}; + +export const handle: HandleCustom = { + links: [ + { label: "Actors", link: "", key: "actors" }, + { label: "Trending", link: "", key: "trending" }, + ], +}; +export const meta = generateMeta("Trending Actors"); +const filePath = "routes/actors.trending.tsx"; + +export default function ActorsTrendingPage() { + return ActorsTrending Page; +} diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/actors.tsx b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/actors.tsx new file mode 100644 index 000000000..9e9fc4104 --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/actors.tsx @@ -0,0 +1,15 @@ +import { Outlet } from "@remix-run/react"; +import LayoutWrapper from "~/components/wrappers/LayoutWrapper"; + +export const config = { runtime: 'edge' }; + +const filePath = "routes/actors.tsx"; + +export default function ActorsLayout() { + return ( + + + + ); +} + \ No newline at end of file diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/actors_.favourites.tsx b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/actors_.favourites.tsx new file mode 100644 index 000000000..1aea7f1da --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/actors_.favourites.tsx @@ -0,0 +1,20 @@ +import RouteWrapper from "~/components/wrappers/RouteWrapper"; +import generateMeta from "~/utils/generateMeta"; +import type { HandleCustom } from "~/components/Breadcrumbs/Breadcrumbs"; + +export const config = { + group: "actors" +}; + +export const handle: HandleCustom = { + links: [ + { label: "Actors", link: "", key: "actors-root" }, + { label: "Favourites", link: "", key: "favourites" }, + ], +}; +export const meta = generateMeta("Favourite Actors"); +const filePath = "routes/actors_.favourites.tsx"; + +export default function ActorsFavouritesPage() { + return ActorsFavourites Page; +} diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/concerts.salt-lake-city.tsx b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/concerts.salt-lake-city.tsx new file mode 100644 index 000000000..8b1dd7dd1 --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/concerts.salt-lake-city.tsx @@ -0,0 +1,22 @@ +import RouteWrapper from "~/components/wrappers/RouteWrapper"; +import generateMeta from "~/utils/generateMeta"; +import type { HandleCustom } from "~/components/Breadcrumbs/Breadcrumbs"; + +export const config = { + group: "concerts" +}; + +export const handle: HandleCustom = { + links: [ + { label: "Concerts", link: "", key: "concerts" }, + { label: "Salt Lake City", link: "", key: "salt-lake-city" }, + ], +}; +export const meta = generateMeta("Concerts in Salt Lake city"); // TODO: get from params +const filePath = "routes/concerts.salt-lake-city.tsx"; + +export default function ConcertsSaltLakeCityPage() { + return ( + ConcertsSaltLakeCity Page + ); +} diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/concerts.san-diego.tsx b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/concerts.san-diego.tsx new file mode 100644 index 000000000..7970c940a --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/concerts.san-diego.tsx @@ -0,0 +1,20 @@ +import RouteWrapper from "~/components/wrappers/RouteWrapper"; +import generateMeta from "~/utils/generateMeta"; +import type { HandleCustom } from "~/components/Breadcrumbs/Breadcrumbs"; + +export const config = { + group: "concerts" +}; + +export const handle: HandleCustom = { + links: [ + { label: "Concerts", link: "", key: "concerts" }, + { label: "San Diego", link: "", key: "san-diego" }, + ], +}; +export const meta = generateMeta("Concerts in San Diego"); +const filePath = "routes/concerts.san-diego.tsx"; + +export default function ConcertsSanDiegoPage() { + return ConcertsSanDiego Page; +} diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/concerts.trending.tsx b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/concerts.trending.tsx new file mode 100644 index 000000000..749b27d70 --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/concerts.trending.tsx @@ -0,0 +1,20 @@ +import RouteWrapper from "~/components/wrappers/RouteWrapper"; +import generateMeta from "~/utils/generateMeta"; +import type { HandleCustom } from "~/components/Breadcrumbs/Breadcrumbs"; + +export const config = { + group: "concerts" +}; + +export const handle: HandleCustom = { + links: [ + { label: "Concerts", link: "", key: "concerts" }, + { label: "Trending", link: "", key: "trending" }, + ], +}; +export const meta = generateMeta("Trending Concerts"); +const filePath = "routes/concerts.trending.tsx"; + +export default function ConcertsTrendingPage() { + return ConcertsTrending Page; +} diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/dolla-bills-[$].tsx b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/dolla-bills-[$].tsx new file mode 100644 index 000000000..9c4ba1e05 --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/dolla-bills-[$].tsx @@ -0,0 +1,17 @@ +import RouteWrapper from "~/components/wrappers/RouteWrapper"; +import generateMeta from "~/utils/generateMeta"; +import type { HandleCustom } from "~/components/Breadcrumbs/Breadcrumbs"; + +export const config = { + group: "special" +}; + +export const handle: HandleCustom = { + links: [{ label: "Doll Bills", link: "", key: "" }], +}; +export const meta = generateMeta("Dolla"); +const filePath = "routes/dolla-bills-[$].tsx "; + +export default function SpecialCharPage() { + return SpecialChar Page; +} diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/files.$.tsx b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/files.$.tsx new file mode 100644 index 000000000..87b10462b --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/files.$.tsx @@ -0,0 +1,17 @@ +import RouteWrapper from "~/components/wrappers/RouteWrapper"; +import generateMeta from "~/utils/generateMeta"; +import type { HandleCustom } from "~/components/Breadcrumbs/Breadcrumbs"; + +export const config = { + group: "basic" +}; + +export const handle: HandleCustom = { + links: [{ label: "Files", link: "", key: "files" }], +}; +export const meta = generateMeta("Files"); +const filePath = "routes/files.$.tsx"; + +export default function FilesGenericPage() { + return Files Generic Page; +} diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/movies.$movieName.tsx b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/movies.$movieName.tsx new file mode 100644 index 000000000..afa817939 --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/movies.$movieName.tsx @@ -0,0 +1,19 @@ +import RouteWrapper from "~/components/wrappers/RouteWrapper"; +import generateMeta from "~/utils/generateMeta"; +import type { HandleCustom } from "~/components/Breadcrumbs/Breadcrumbs"; + +export const config = { + group: "movies" +}; + +export const handle: HandleCustom = { + links: [{ label: "Movies", link: "", key: "movies" }], +}; +export const meta = generateMeta("Movies"); +const filePath = "routes/movies.$movieName.tsx"; + +export default function MoviesCommonMovienamePage() { + return ( + MoviesCommonMoviename Page + ); +} diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/movies.trending.tsx b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/movies.trending.tsx new file mode 100644 index 000000000..b70126ab6 --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/movies.trending.tsx @@ -0,0 +1,17 @@ +import RouteWrapper from "~/components/wrappers/RouteWrapper"; +import generateMeta from "~/utils/generateMeta"; +import type { HandleCustom } from "~/components/Breadcrumbs/Breadcrumbs"; + +export const config = { + group: "movies" +}; + +export const handle: HandleCustom = { + links: [{ label: "Trending", link: "", key: "trending" }], +}; +export const meta = generateMeta("Trending Movies"); +const filePath = "routes/movies.trending.tsx"; + +export default function MoviesTrendingPage() { + return MoviesTrending Page; +} diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/products.($lang).$productId.tsx b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/products.($lang).$productId.tsx new file mode 100644 index 000000000..bc801fc68 --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/products.($lang).$productId.tsx @@ -0,0 +1,17 @@ +import RouteWrapper from "~/components/wrappers/RouteWrapper"; +import generateMeta from "~/utils/generateMeta"; +import type { HandleCustom } from "~/components/Breadcrumbs/Breadcrumbs"; + +export const config = { + group: "products" +}; + +export const handle: HandleCustom = { + links: [{ label: "Products", link: "", key: "products" }], +}; +export const meta = generateMeta("Products"); +const filePath = "routes/products.($lang).$productId.tsx"; + +export default function ProductPage() { + return ProductPage; +} diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/products.($lang)._index.tsx b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/products.($lang)._index.tsx new file mode 100644 index 000000000..617203f2a --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/products.($lang)._index.tsx @@ -0,0 +1,18 @@ +import RouteWrapper from "~/components/wrappers/RouteWrapper"; +import generateMeta from "~/utils/generateMeta"; +import type { HandleCustom } from "~/components/Breadcrumbs/Breadcrumbs"; + +export const config = { + group: "products", + runtime: 'edge', +}; + +export const handle: HandleCustom = { + links: [{ label: "Products", link: "", key: "products" }], +}; +export const meta = generateMeta("Products"); +const filePath = "routes/products.($lang)._index.tsx"; + +export default function ProductsPage() { + return ProductsPage; +} diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/products.($lang).categories.tsx b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/products.($lang).categories.tsx new file mode 100644 index 000000000..411597cba --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/products.($lang).categories.tsx @@ -0,0 +1,19 @@ +import RouteWrapper from "~/components/wrappers/RouteWrapper"; +import generateMeta from "~/utils/generateMeta"; +import type { HandleCustom } from "~/components/Breadcrumbs/Breadcrumbs"; + +export const config = { + group: "products" +}; + +export const handle: HandleCustom = { + links: [{ label: "Categories", link: "", key: "categories" }], +}; +export const meta = generateMeta("Categories"); +const filePath = "routes/products.($lang).categories.tsx"; + +export default function ProductCategoriesPage() { + return ( + Product Categories Page + ); +} diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/sitemap[.]xml.tsx b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/sitemap[.]xml.tsx new file mode 100644 index 000000000..1aab74455 --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/sitemap[.]xml.tsx @@ -0,0 +1,17 @@ +import RouteWrapper from "~/components/wrappers/RouteWrapper"; +import generateMeta from "~/utils/generateMeta"; +import type { HandleCustom } from "~/components/Breadcrumbs/Breadcrumbs"; + +export const config = { + group: "special" +}; + +export const handle: HandleCustom = { + links: [{ label: "Sitemap", link: "", key: "sitemap" }], +}; +export const meta = generateMeta("Sitemap"); +const filePath = "routes/sitemap[.]xml.tsx "; + +export default function SpecialCharPage() { + return SpecialChar Page; +} diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/weird-url.[_index].tsx b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/weird-url.[_index].tsx new file mode 100644 index 000000000..2edc90a60 --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/routes/weird-url.[_index].tsx @@ -0,0 +1,17 @@ +import RouteWrapper from "~/components/wrappers/RouteWrapper"; +import generateMeta from "~/utils/generateMeta"; +import type { HandleCustom } from "~/components/Breadcrumbs/Breadcrumbs"; + +export const config = { + group: "special" +}; + +export const handle: HandleCustom = { + links: [{ label: "Weird URL", link: "", key: "weird" }], +}; +export const meta = generateMeta("Weird"); +const filePath = "routes/weird-url.[_index].tsx "; + +export default function SpecialCharPage() { + return SpecialChar Page; +} diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/styles.css b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/styles.css new file mode 100644 index 000000000..3ce587c8b --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/styles.css @@ -0,0 +1,51 @@ +.vertical-line{ + position: absolute; + left: -9px; + top: -10px; + bottom: 0px; + width: 2px; + border-left: 2px solid #51516c; +} +.normal{ + bottom: 0px; +} + +.last-child{ + height: 20px; +} + +.horizontal-line{ + position: absolute; + top: 0; + left: -9px; + height: 20px; + width: 13px; + border-bottom: 2px solid #51516c; + border-left: 2px solid #51516c; + border-bottom-left-radius: 8px; +} + + + +.animated-bg { + background-color: #f3f4f6; + animation-name: flash; + animation-duration: 2s; + } + +.dark .animated-bg { + background-color: #27272a; + animation-name: flash-dark; + animation-duration: 2s; + } + + + @keyframes flash { + 0% {background-color:#3568f5} + 100% {background-color:#f3f4f6} + } + @keyframes flash-dark { + 0% {background-color:#3568f5} + 100% {background-color:#27272a} + } + \ No newline at end of file diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/tailwind.css b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/tailwind.css new file mode 100644 index 000000000..02d220964 --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/tailwind.css @@ -0,0 +1,897 @@ +/* +! tailwindcss v3.3.1 | MIT License | https://tailwindcss.com +*/ + +/* +1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4) +2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116) +*/ + +*, +::before, +::after { + box-sizing: border-box; + /* 1 */ + border-width: 0; + /* 2 */ + border-style: solid; + /* 2 */ + border-color: #e5e7eb; + /* 2 */ +} + +::before, +::after { + --tw-content: ''; +} + +/* +1. Use a consistent sensible line-height in all browsers. +2. Prevent adjustments of font size after orientation changes in iOS. +3. Use a more readable tab size. +4. Use the user's configured `sans` font-family by default. +5. Use the user's configured `sans` font-feature-settings by default. +6. Use the user's configured `sans` font-variation-settings by default. +*/ + +html { + line-height: 1.5; + /* 1 */ + -webkit-text-size-adjust: 100%; + /* 2 */ + -moz-tab-size: 4; + /* 3 */ + -o-tab-size: 4; + tab-size: 4; + /* 3 */ + font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + /* 4 */ + font-feature-settings: normal; + /* 5 */ + font-variation-settings: normal; + /* 6 */ +} + +/* +1. Remove the margin in all browsers. +2. Inherit line-height from `html` so users can set them as a class directly on the `html` element. +*/ + +body { + margin: 0; + /* 1 */ + line-height: inherit; + /* 2 */ +} + +/* +1. Add the correct height in Firefox. +2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655) +3. Ensure horizontal rules are visible by default. +*/ + +hr { + height: 0; + /* 1 */ + color: inherit; + /* 2 */ + border-top-width: 1px; + /* 3 */ +} + +/* +Add the correct text decoration in Chrome, Edge, and Safari. +*/ + +abbr:where([title]) { + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; +} + +/* +Remove the default font size and weight for headings. +*/ + +h1, +h2, +h3, +h4, +h5, +h6 { + font-size: inherit; + font-weight: inherit; +} + +/* +Reset links to optimize for opt-in styling instead of opt-out. +*/ + +a { + color: inherit; + text-decoration: inherit; +} + +/* +Add the correct font weight in Edge and Safari. +*/ + +b, +strong { + font-weight: bolder; +} + +/* +1. Use the user's configured `mono` font family by default. +2. Correct the odd `em` font sizing in all browsers. +*/ + +code, +kbd, +samp, +pre { + font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + /* 1 */ + font-size: 1em; + /* 2 */ +} + +/* +Add the correct font size in all browsers. +*/ + +small { + font-size: 80%; +} + +/* +Prevent `sub` and `sup` elements from affecting the line height in all browsers. +*/ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +/* +1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297) +2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016) +3. Remove gaps between table borders by default. +*/ + +table { + text-indent: 0; + /* 1 */ + border-color: inherit; + /* 2 */ + border-collapse: collapse; + /* 3 */ +} + +/* +1. Change the font styles in all browsers. +2. Remove the margin in Firefox and Safari. +3. Remove default padding in all browsers. +*/ + +button, +input, +optgroup, +select, +textarea { + font-family: inherit; + /* 1 */ + font-size: 100%; + /* 1 */ + font-weight: inherit; + /* 1 */ + line-height: inherit; + /* 1 */ + color: inherit; + /* 1 */ + margin: 0; + /* 2 */ + padding: 0; + /* 3 */ +} + +/* +Remove the inheritance of text transform in Edge and Firefox. +*/ + +button, +select { + text-transform: none; +} + +/* +1. Correct the inability to style clickable types in iOS and Safari. +2. Remove default button styles. +*/ + +button, +[type='button'], +[type='reset'], +[type='submit'] { + -webkit-appearance: button; + /* 1 */ + background-color: transparent; + /* 2 */ + background-image: none; + /* 2 */ +} + +/* +Use the modern Firefox focus style for all focusable elements. +*/ + +:-moz-focusring { + outline: auto; +} + +/* +Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737) +*/ + +:-moz-ui-invalid { + box-shadow: none; +} + +/* +Add the correct vertical alignment in Chrome and Firefox. +*/ + +progress { + vertical-align: baseline; +} + +/* +Correct the cursor style of increment and decrement buttons in Safari. +*/ + +::-webkit-inner-spin-button, +::-webkit-outer-spin-button { + height: auto; +} + +/* +1. Correct the odd appearance in Chrome and Safari. +2. Correct the outline style in Safari. +*/ + +[type='search'] { + -webkit-appearance: textfield; + /* 1 */ + outline-offset: -2px; + /* 2 */ +} + +/* +Remove the inner padding in Chrome and Safari on macOS. +*/ + +::-webkit-search-decoration { + -webkit-appearance: none; +} + +/* +1. Correct the inability to style clickable types in iOS and Safari. +2. Change font properties to `inherit` in Safari. +*/ + +::-webkit-file-upload-button { + -webkit-appearance: button; + /* 1 */ + font: inherit; + /* 2 */ +} + +/* +Add the correct display in Chrome and Safari. +*/ + +summary { + display: list-item; +} + +/* +Removes the default spacing and border for appropriate elements. +*/ + +blockquote, +dl, +dd, +h1, +h2, +h3, +h4, +h5, +h6, +hr, +figure, +p, +pre { + margin: 0; +} + +fieldset { + margin: 0; + padding: 0; +} + +legend { + padding: 0; +} + +ol, +ul, +menu { + list-style: none; + margin: 0; + padding: 0; +} + +/* +Prevent resizing textareas horizontally by default. +*/ + +textarea { + resize: vertical; +} + +/* +1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300) +2. Set the default placeholder color to the user's configured gray 400 color. +*/ + +input::-moz-placeholder, textarea::-moz-placeholder { + opacity: 1; + /* 1 */ + color: #9ca3af; + /* 2 */ +} + +input::placeholder, +textarea::placeholder { + opacity: 1; + /* 1 */ + color: #9ca3af; + /* 2 */ +} + +/* +Set the default cursor for buttons. +*/ + +button, +[role="button"] { + cursor: pointer; +} + +/* +Make sure disabled buttons don't get the pointer cursor. +*/ + +:disabled { + cursor: default; +} + +/* +1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14) +2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210) + This can trigger a poorly considered lint error in some tools but is included by design. +*/ + +img, +svg, +video, +canvas, +audio, +iframe, +embed, +object { + display: block; + /* 1 */ + vertical-align: middle; + /* 2 */ +} + +/* +Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14) +*/ + +img, +video { + max-width: 100%; + height: auto; +} + +/* Make elements with the HTML hidden attribute stay hidden by default */ + +[hidden] { + display: none; +} + +*, ::before, ::after { + --tw-border-spacing-x: 0; + --tw-border-spacing-y: 0; + --tw-translate-x: 0; + --tw-translate-y: 0; + --tw-rotate: 0; + --tw-skew-x: 0; + --tw-skew-y: 0; + --tw-scale-x: 1; + --tw-scale-y: 1; + --tw-pan-x: ; + --tw-pan-y: ; + --tw-pinch-zoom: ; + --tw-scroll-snap-strictness: proximity; + --tw-ordinal: ; + --tw-slashed-zero: ; + --tw-numeric-figure: ; + --tw-numeric-spacing: ; + --tw-numeric-fraction: ; + --tw-ring-inset: ; + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: rgb(59 130 246 / 0.5); + --tw-ring-offset-shadow: 0 0 #0000; + --tw-ring-shadow: 0 0 #0000; + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + --tw-blur: ; + --tw-brightness: ; + --tw-contrast: ; + --tw-grayscale: ; + --tw-hue-rotate: ; + --tw-invert: ; + --tw-saturate: ; + --tw-sepia: ; + --tw-drop-shadow: ; + --tw-backdrop-blur: ; + --tw-backdrop-brightness: ; + --tw-backdrop-contrast: ; + --tw-backdrop-grayscale: ; + --tw-backdrop-hue-rotate: ; + --tw-backdrop-invert: ; + --tw-backdrop-opacity: ; + --tw-backdrop-saturate: ; + --tw-backdrop-sepia: ; +} + +::backdrop { + --tw-border-spacing-x: 0; + --tw-border-spacing-y: 0; + --tw-translate-x: 0; + --tw-translate-y: 0; + --tw-rotate: 0; + --tw-skew-x: 0; + --tw-skew-y: 0; + --tw-scale-x: 1; + --tw-scale-y: 1; + --tw-pan-x: ; + --tw-pan-y: ; + --tw-pinch-zoom: ; + --tw-scroll-snap-strictness: proximity; + --tw-ordinal: ; + --tw-slashed-zero: ; + --tw-numeric-figure: ; + --tw-numeric-spacing: ; + --tw-numeric-fraction: ; + --tw-ring-inset: ; + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: rgb(59 130 246 / 0.5); + --tw-ring-offset-shadow: 0 0 #0000; + --tw-ring-shadow: 0 0 #0000; + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + --tw-blur: ; + --tw-brightness: ; + --tw-contrast: ; + --tw-grayscale: ; + --tw-hue-rotate: ; + --tw-invert: ; + --tw-saturate: ; + --tw-sepia: ; + --tw-drop-shadow: ; + --tw-backdrop-blur: ; + --tw-backdrop-brightness: ; + --tw-backdrop-contrast: ; + --tw-backdrop-grayscale: ; + --tw-backdrop-hue-rotate: ; + --tw-backdrop-invert: ; + --tw-backdrop-opacity: ; + --tw-backdrop-saturate: ; + --tw-backdrop-sepia: ; +} + +.fixed { + position: fixed; +} + +.absolute { + position: absolute; +} + +.relative { + position: relative; +} + +.inset-x-0 { + left: 0px; + right: 0px; +} + +.-top-3 { + top: -0.75rem; +} + +.bottom-0 { + bottom: 0px; +} + +.left-0 { + left: 0px; +} + +.left-3 { + left: 0.75rem; +} + +.top-0 { + top: 0px; +} + +.top-14 { + top: 3.5rem; +} + +.mx-auto { + margin-left: auto; + margin-right: auto; +} + +.mb-4 { + margin-bottom: 1rem; +} + +.ml-1 { + margin-left: 0.25rem; +} + +.ml-1\.5 { + margin-left: 0.375rem; +} + +.ml-6 { + margin-left: 1.5rem; +} + +.mt-4 { + margin-top: 1rem; +} + +.mt-8 { + margin-top: 2rem; +} + +.flex { + display: flex; +} + +.inline-flex { + display: inline-flex; +} + +.grid { + display: grid; +} + +.h-14 { + height: 3.5rem; +} + +.h-4 { + height: 1rem; +} + +.h-5 { + height: 1.25rem; +} + +.h-6 { + height: 1.5rem; +} + +.h-7 { + height: 1.75rem; +} + +.h-8 { + height: 2rem; +} + +.min-h-\[96px\] { + min-height: 96px; +} + +.w-4 { + width: 1rem; +} + +.w-5 { + width: 1.25rem; +} + +.w-6 { + width: 1.5rem; +} + +.w-8 { + width: 2rem; +} + +.max-w-3xl { + max-width: 48rem; +} + +.place-items-center { + place-items: center; +} + +.items-end { + align-items: flex-end; +} + +.items-center { + align-items: center; +} + +.justify-between { + justify-content: space-between; +} + +.space-x-1 > :not([hidden]) ~ :not([hidden]) { + --tw-space-x-reverse: 0; + margin-right: calc(0.25rem * var(--tw-space-x-reverse)); + margin-left: calc(0.25rem * calc(1 - var(--tw-space-x-reverse))); +} + +.space-x-3 > :not([hidden]) ~ :not([hidden]) { + --tw-space-x-reverse: 0; + margin-right: calc(0.75rem * var(--tw-space-x-reverse)); + margin-left: calc(0.75rem * calc(1 - var(--tw-space-x-reverse))); +} + +.overflow-y-auto { + overflow-y: auto; +} + +.overflow-x-hidden { + overflow-x: hidden; +} + +.rounded-full { + border-radius: 9999px; +} + +.rounded-md { + border-radius: 0.375rem; +} + +.border { + border-width: 1px; +} + +.border-b { + border-bottom-width: 1px; +} + +.border-gray-300 { + --tw-border-opacity: 1; + border-color: rgb(209 213 219 / var(--tw-border-opacity)); +} + +.border-b-gray-400\/25 { + border-bottom-color: rgb(156 163 175 / 0.25); +} + +.bg-gray-200 { + --tw-bg-opacity: 1; + background-color: rgb(229 231 235 / var(--tw-bg-opacity)); +} + +.bg-gray-300 { + --tw-bg-opacity: 1; + background-color: rgb(209 213 219 / var(--tw-bg-opacity)); +} + +.bg-green-200 { + --tw-bg-opacity: 1; + background-color: rgb(187 247 208 / var(--tw-bg-opacity)); +} + +.bg-indigo-200 { + --tw-bg-opacity: 1; + background-color: rgb(199 210 254 / var(--tw-bg-opacity)); +} + +.bg-white { + --tw-bg-opacity: 1; + background-color: rgb(255 255 255 / var(--tw-bg-opacity)); +} + +.p-6 { + padding: 1.5rem; +} + +.px-1 { + padding-left: 0.25rem; + padding-right: 0.25rem; +} + +.px-1\.5 { + padding-left: 0.375rem; + padding-right: 0.375rem; +} + +.px-3 { + padding-left: 0.75rem; + padding-right: 0.75rem; +} + +.px-4 { + padding-left: 1rem; + padding-right: 1rem; +} + +.py-0 { + padding-top: 0px; + padding-bottom: 0px; +} + +.py-0\.5 { + padding-top: 0.125rem; + padding-bottom: 0.125rem; +} + +.py-1 { + padding-top: 0.25rem; + padding-bottom: 0.25rem; +} + +.py-1\.5 { + padding-top: 0.375rem; + padding-bottom: 0.375rem; +} + +.py-2 { + padding-top: 0.5rem; + padding-bottom: 0.5rem; +} + +.pb-4 { + padding-bottom: 1rem; +} + +.pb-8 { + padding-bottom: 2rem; +} + +.pl-4 { + padding-left: 1rem; +} + +.pt-20 { + padding-top: 5rem; +} + +.pt-8 { + padding-top: 2rem; +} + +.text-sm { + font-size: 0.875rem; + line-height: 1.25rem; +} + +.text-xs { + font-size: 0.75rem; + line-height: 1rem; +} + +.font-semibold { + font-weight: 600; +} + +.tracking-wide { + letter-spacing: 0.025em; +} + +.text-black\/80 { + color: rgb(0 0 0 / 0.8); +} + +.text-green-900 { + --tw-text-opacity: 1; + color: rgb(20 83 45 / var(--tw-text-opacity)); +} + +.text-indigo-900 { + --tw-text-opacity: 1; + color: rgb(49 46 129 / var(--tw-text-opacity)); +} + +.text-yellow-800 { + --tw-text-opacity: 1; + color: rgb(133 77 14 / var(--tw-text-opacity)); +} + +.filter { + filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); +} + +:is(.dark .dark\:border-zinc-400) { + --tw-border-opacity: 1; + border-color: rgb(161 161 170 / var(--tw-border-opacity)); +} + +:is(.dark .dark\:border-b-zinc-600\/25) { + border-bottom-color: rgb(82 82 91 / 0.25); +} + +:is(.dark .dark\:bg-green-900) { + --tw-bg-opacity: 1; + background-color: rgb(20 83 45 / var(--tw-bg-opacity)); +} + +:is(.dark .dark\:bg-indigo-900) { + --tw-bg-opacity: 1; + background-color: rgb(49 46 129 / var(--tw-bg-opacity)); +} + +:is(.dark .dark\:bg-zinc-700) { + --tw-bg-opacity: 1; + background-color: rgb(63 63 70 / var(--tw-bg-opacity)); +} + +:is(.dark .dark\:bg-zinc-800) { + --tw-bg-opacity: 1; + background-color: rgb(39 39 42 / var(--tw-bg-opacity)); +} + +:is(.dark .dark\:bg-zinc-900) { + --tw-bg-opacity: 1; + background-color: rgb(24 24 27 / var(--tw-bg-opacity)); +} + +:is(.dark .dark\:text-green-200) { + --tw-text-opacity: 1; + color: rgb(187 247 208 / var(--tw-text-opacity)); +} + +:is(.dark .dark\:text-indigo-200) { + --tw-text-opacity: 1; + color: rgb(199 210 254 / var(--tw-text-opacity)); +} + +:is(.dark .dark\:text-yellow-400) { + --tw-text-opacity: 1; + color: rgb(250 204 21 / var(--tw-text-opacity)); +} + +:is(.dark .dark\:text-zinc-200) { + --tw-text-opacity: 1; + color: rgb(228 228 231 / var(--tw-text-opacity)); +} \ No newline at end of file diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/types/tree/index.tsx b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/types/tree/index.tsx new file mode 100644 index 000000000..8f2111195 --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/types/tree/index.tsx @@ -0,0 +1 @@ +export * from "./tree"; diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/types/tree/tree.tsx b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/types/tree/tree.tsx new file mode 100644 index 000000000..54e79c248 --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/types/tree/tree.tsx @@ -0,0 +1,7 @@ +export type TreeNodeType = "f" | "r" | "l"; +export interface TreeNode { + name: string; + type: TreeNodeType; + path: string; + children: TreeNode[]; +} diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/utils/generateMeta/generateMeta.tsx b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/utils/generateMeta/generateMeta.tsx new file mode 100644 index 000000000..b933c4bcd --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/utils/generateMeta/generateMeta.tsx @@ -0,0 +1,47 @@ +import type { MetaFunction } from "@remix-run/node"; + +const generateMeta = (title: string): MetaFunction => { + return () => { + return [ + { title: `${title} | Remix Routing V2` }, + { + property: "og:title", + content: `${title} | Remix Routing V2`, + }, + + { + property: "og:type", + content: "website", + }, + { + property: "og:description", + content: "App to visualize remix routing version 2", + }, + { + property: "og:image", + content: "/og.png", + }, + { + property: "twitter:domain", + content: "interactive-remix-routing-v2.netlify.app", + }, + { + name: "description", + content: "App to visualize remix routing version 2", + }, + { + name: "twitter:image", + content: "/og.png", + }, + { + name: "twitter:title", + content: `${title} | Remix Routing V2`, + }, + { + name: "twitter:description", + content: "App to visualize remix routing version 2", + }, + ]; + }; +}; +export default generateMeta; diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/utils/generateMeta/index.tsx b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/utils/generateMeta/index.tsx new file mode 100644 index 000000000..e0879d79b --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/app/utils/generateMeta/index.tsx @@ -0,0 +1,3 @@ +import generateMeta from './generateMeta'; + +export default generateMeta; \ No newline at end of file diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/env.d.ts b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/env.d.ts new file mode 100644 index 000000000..78ed2345c --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/env.d.ts @@ -0,0 +1,2 @@ +/// +/// diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/package-lock.json b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/package-lock.json new file mode 100644 index 000000000..79ec00e04 --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/package-lock.json @@ -0,0 +1,10990 @@ +{ + "name": "interactive-remix-routing-v2", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "interactive-remix-routing-v2", + "version": "0.1.0", + "license": "MIT", + "dependencies": { + "@remix-run/node": "2.7.2", + "@remix-run/react": "2.7.2", + "@remix-run/serve": "2.7.2", + "@vercel/remix": "2.7.2-preset.1", + "isbot": "4.4.0", + "react": "^18.2.0", + "react-dom": "^18.2.0" + }, + "devDependencies": { + "@remix-run/dev": "https://remix-e7asp269z.vercel.sh/remix-dev.tgz", + "@types/react": "^18.2.57", + "@types/react-dom": "^18.2.19", + "@typescript-eslint/eslint-plugin": "^6.21.0", + "eslint": "^8.56.0", + "eslint-import-resolver-typescript": "^3.6.1", + "eslint-plugin-import": "^2.29.1", + "eslint-plugin-jsx-a11y": "^6.8.0", + "eslint-plugin-react": "^7.33.2", + "eslint-plugin-react-hooks": "^4.6.0", + "typescript": "^5.3.3", + "vite": "^5.1.3", + "vite-tsconfig-paths": "^4.3.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", + "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.9.tgz", + "integrity": "sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.23.9", + "@babel/parser": "^7.23.9", + "@babel/template": "^7.23.9", + "@babel/traverse": "^7.23.9", + "@babel/types": "^7.23.9", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", + "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.23.6", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator/node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.23.10", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.10.tgz", + "integrity": "sha512-2XpP2XhkXzgxecPNEEK8Vz8Asj9aRxt08oKOqtiZoqV2UGZ5T+EkyP9sXQ9nwMxBIG34a7jmasVqoMop7VdPUw==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-member-expression-to-functions": "^7.23.0", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", + "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", + "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", + "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-optimise-call-expression": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", + "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.9.tgz", + "integrity": "sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ==", + "dev": true, + "dependencies": { + "@babel/template": "^7.23.9", + "@babel/traverse": "^7.23.9", + "@babel/types": "^7.23.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.9.tgz", + "integrity": "sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-decorators": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.23.3.tgz", + "integrity": "sha512-cf7Niq4/+/juY67E0PbgH0TDhLQ5J7zS8C/Q5FFx+DWyrRa9sUQdTXkjqKu8zGvuqr7vw1muKiukseihU+PJDA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", + "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz", + "integrity": "sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz", + "integrity": "sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.23.6.tgz", + "integrity": "sha512-6cBG5mBvUu4VUD04OHKnYzbuHNP8huDsD3EDqqpIpsswTDoqHCjLoHb6+QgsV1WsT2nipRqCPgxD3LXnEO7XfA==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.23.6", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-typescript": "^7.23.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.23.3.tgz", + "integrity": "sha512-17oIGVlqz6CchO9RFYn5U6ZpWRZIngayYCtrPRSgANSwC2V1Jb+iP74nVxzzXJte8b8BYxrL1yY96xfhTBrNNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", + "@babel/plugin-syntax-jsx": "^7.23.3", + "@babel/plugin-transform-modules-commonjs": "^7.23.3", + "@babel/plugin-transform-typescript": "^7.23.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.9.tgz", + "integrity": "sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==", + "dev": true, + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.23.9.tgz", + "integrity": "sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.23.9", + "@babel/types": "^7.23.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.9.tgz", + "integrity": "sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.9", + "@babel/types": "^7.23.9", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.9.tgz", + "integrity": "sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@emotion/hash": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", + "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==", + "dev": true + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", + "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.17.6", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.6.tgz", + "integrity": "sha512-bSC9YVUjADDy1gae8RrioINU6e1lCkg3VGVwm0QQ2E1CWcC4gnMce9+B6RpxuSsrsXsk1yojn7sp1fnG8erE2g==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.17.6", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.6.tgz", + "integrity": "sha512-YnYSCceN/dUzUr5kdtUzB+wZprCafuD89Hs0Aqv9QSdwhYQybhXTaSTcrl6X/aWThn1a/j0eEpUBGOE7269REg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.17.6", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.6.tgz", + "integrity": "sha512-MVcYcgSO7pfu/x34uX9u2QIZHmXAB7dEiLQC5bBl5Ryqtpj9lT2sg3gNDEsrPEmimSJW2FXIaxqSQ501YLDsZQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.17.6", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.6.tgz", + "integrity": "sha512-bsDRvlbKMQMt6Wl08nHtFz++yoZHsyTOxnjfB2Q95gato+Yi4WnRl13oC2/PJJA9yLCoRv9gqT/EYX0/zDsyMA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.17.6", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.6.tgz", + "integrity": "sha512-xh2A5oPrYRfMFz74QXIQTQo8uA+hYzGWJFoeTE8EvoZGHb+idyV4ATaukaUvnnxJiauhs/fPx3vYhU4wiGfosg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.17.6", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.6.tgz", + "integrity": "sha512-EnUwjRc1inT4ccZh4pB3v1cIhohE2S4YXlt1OvI7sw/+pD+dIE4smwekZlEPIwY6PhU6oDWwITrQQm5S2/iZgg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.17.6", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.6.tgz", + "integrity": "sha512-Uh3HLWGzH6FwpviUcLMKPCbZUAFzv67Wj5MTwK6jn89b576SR2IbEp+tqUHTr8DIl0iDmBAf51MVaP7pw6PY5Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.17.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.6.tgz", + "integrity": "sha512-7YdGiurNt7lqO0Bf/U9/arrPWPqdPqcV6JCZda4LZgEn+PTQ5SMEI4MGR52Bfn3+d6bNEGcWFzlIxiQdS48YUw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.17.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.6.tgz", + "integrity": "sha512-bUR58IFOMJX523aDVozswnlp5yry7+0cRLCXDsxnUeQYJik1DukMY+apBsLOZJblpH+K7ox7YrKrHmJoWqVR9w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.17.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.6.tgz", + "integrity": "sha512-ujp8uoQCM9FRcbDfkqECoARsLnLfCUhKARTP56TFPog8ie9JG83D5GVKjQ6yVrEVdMie1djH86fm98eY3quQkQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.17.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.6.tgz", + "integrity": "sha512-y2NX1+X/Nt+izj9bLoiaYB9YXT/LoaQFYvCkVD77G/4F+/yuVXYCWz4SE9yr5CBMbOxOfBcy/xFL4LlOeNlzYQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.17.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.6.tgz", + "integrity": "sha512-09AXKB1HDOzXD+j3FdXCiL/MWmZP0Ex9eR8DLMBVcHorrWJxWmY8Nms2Nm41iRM64WVx7bA/JVHMv081iP2kUA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.17.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.6.tgz", + "integrity": "sha512-AmLhMzkM8JuqTIOhxnX4ubh0XWJIznEynRnZAVdA2mMKE6FAfwT2TWKTwdqMG+qEaeyDPtfNoZRpJbD4ZBv0Tg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.17.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.6.tgz", + "integrity": "sha512-Y4Ri62PfavhLQhFbqucysHOmRamlTVK10zPWlqjNbj2XMea+BOs4w6ASKwQwAiqf9ZqcY9Ab7NOU4wIgpxwoSQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.17.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.6.tgz", + "integrity": "sha512-SPUiz4fDbnNEm3JSdUW8pBJ/vkop3M1YwZAVwvdwlFLoJwKEZ9L98l3tzeyMzq27CyepDQ3Qgoba44StgbiN5Q==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.17.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.6.tgz", + "integrity": "sha512-a3yHLmOodHrzuNgdpB7peFGPx1iJ2x6m+uDvhP2CKdr2CwOaqEFMeSqYAHU7hG+RjCq8r2NFujcd/YsEsFgTGw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.17.6", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.6.tgz", + "integrity": "sha512-EanJqcU/4uZIBreTrnbnre2DXgXSa+Gjap7ifRfllpmyAU7YMvaXmljdArptTHmjrkkKm9BK6GH5D5Yo+p6y5A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.17.6", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.6.tgz", + "integrity": "sha512-xaxeSunhQRsTNGFanoOkkLtnmMn5QbA0qBhNet/XLVsc+OVkpIWPHcr3zTW2gxVU5YOHFbIHR9ODuaUdNza2Vw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.17.6", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.6.tgz", + "integrity": "sha512-gnMnMPg5pfMkZvhHee21KbKdc6W3GR8/JuE0Da1kjwpK6oiFU3nqfHuVPgUX2rsOx9N2SadSQTIYV1CIjYG+xw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.17.6", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.6.tgz", + "integrity": "sha512-G95n7vP1UnGJPsVdKXllAJPtqjMvFYbN20e8RK8LVLhlTiSOH1sd7+Gt7rm70xiG+I5tM58nYgwWrLs6I1jHqg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.17.6", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.6.tgz", + "integrity": "sha512-96yEFzLhq5bv9jJo5JhTs1gI+1cKQ83cUpyxHuGqXVwQtY5Eq54ZEsKs8veKtiKwlrNimtckHEkj4mRh4pPjsg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.17.6", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.6.tgz", + "integrity": "sha512-n6d8MOyUrNp6G4VSpRcgjs5xj4A91svJSaiwLIDWVWEsZtpN5FA9NlBbZHDmAJc2e8e6SF4tkBD3HAvPF+7igA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", + "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", + "dev": true + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.22", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz", + "integrity": "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@jspm/core": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@jspm/core/-/core-2.0.1.tgz", + "integrity": "sha512-Lg3PnLp0QXpxwLIAuuJboLeRaIhrgJjeuh797QADg3xz8wGLugQOS5DpsE8A6i6Adgzf+bacllkKZG3J0tGfDw==", + "dev": true + }, + "node_modules/@mdx-js/mdx": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-2.3.0.tgz", + "integrity": "sha512-jLuwRlz8DQfQNiUCJR50Y09CGPq3fLtmtUQfVrj79E0JWu3dvsVcxVIcfhR5h0iXu+/z++zDrYeiJqifRynJkA==", + "dev": true, + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/mdx": "^2.0.0", + "estree-util-build-jsx": "^2.0.0", + "estree-util-is-identifier-name": "^2.0.0", + "estree-util-to-js": "^1.1.0", + "estree-walker": "^3.0.0", + "hast-util-to-estree": "^2.0.0", + "markdown-extensions": "^1.0.0", + "periscopic": "^3.0.0", + "remark-mdx": "^2.0.0", + "remark-parse": "^10.0.0", + "remark-rehype": "^10.0.0", + "unified": "^10.0.0", + "unist-util-position-from-estree": "^1.0.0", + "unist-util-stringify-position": "^3.0.0", + "unist-util-visit": "^4.0.0", + "vfile": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@npmcli/fs": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", + "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==", + "dev": true, + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/git": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-4.1.0.tgz", + "integrity": "sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==", + "dev": true, + "dependencies": { + "@npmcli/promise-spawn": "^6.0.0", + "lru-cache": "^7.4.4", + "npm-pick-manifest": "^8.0.0", + "proc-log": "^3.0.0", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/git/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@npmcli/package-json": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-4.0.1.tgz", + "integrity": "sha512-lRCEGdHZomFsURroh522YvA/2cVb9oPIJrjHanCJZkiasz1BzcnLr3tBJhlV7S86MBJBuAQ33is2D60YitZL2Q==", + "dev": true, + "dependencies": { + "@npmcli/git": "^4.1.0", + "glob": "^10.2.2", + "hosted-git-info": "^6.1.1", + "json-parse-even-better-errors": "^3.0.0", + "normalize-package-data": "^5.0.0", + "proc-log": "^3.0.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/promise-spawn": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-6.0.2.tgz", + "integrity": "sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==", + "dev": true, + "dependencies": { + "which": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@remix-run/dev": { + "version": "2.7.2", + "resolved": "https://remix-e7asp269z.vercel.sh/remix-dev.tgz", + "integrity": "sha512-YMLV5tupFYZ0VfDp/XqHO3q7tQOE8tDBtXrKP0z8xKwpjlY1cFQ3duxUSHNmn+es2ly6TrJOhtwp5a24N/EP7w==", + "dev": true, + "dependencies": { + "@babel/core": "^7.21.8", + "@babel/generator": "^7.21.5", + "@babel/parser": "^7.21.8", + "@babel/plugin-syntax-decorators": "^7.22.10", + "@babel/plugin-syntax-jsx": "^7.21.4", + "@babel/preset-typescript": "^7.21.5", + "@babel/traverse": "^7.23.2", + "@babel/types": "^7.22.5", + "@mdx-js/mdx": "^2.3.0", + "@npmcli/package-json": "^4.0.1", + "@remix-run/node": "2.7.2", + "@remix-run/router": "1.15.1", + "@remix-run/server-runtime": "2.7.2", + "@types/mdx": "^2.0.5", + "@vanilla-extract/integration": "^6.2.0", + "arg": "^5.0.1", + "cacache": "^17.1.3", + "chalk": "^4.1.2", + "chokidar": "^3.5.1", + "cross-spawn": "^7.0.3", + "dotenv": "^16.0.0", + "es-module-lexer": "^1.3.1", + "esbuild": "0.17.6", + "esbuild-plugins-node-modules-polyfill": "^1.6.0", + "execa": "5.1.1", + "exit-hook": "2.2.1", + "express": "^4.17.1", + "fs-extra": "^10.0.0", + "get-port": "^5.1.1", + "gunzip-maybe": "^1.4.2", + "jsesc": "3.0.2", + "json5": "^2.2.2", + "lodash": "^4.17.21", + "lodash.debounce": "^4.0.8", + "minimatch": "^9.0.0", + "ora": "^5.4.1", + "picocolors": "^1.0.0", + "picomatch": "^2.3.1", + "pidtree": "^0.6.0", + "postcss": "^8.4.19", + "postcss-discard-duplicates": "^5.1.0", + "postcss-load-config": "^4.0.1", + "postcss-modules": "^6.0.0", + "prettier": "^2.7.1", + "pretty-ms": "^7.0.1", + "react-refresh": "^0.14.0", + "remark-frontmatter": "4.0.1", + "remark-mdx-frontmatter": "^1.0.1", + "semver": "^7.3.7", + "set-cookie-parser": "^2.6.0", + "tar-fs": "^2.1.1", + "tsconfig-paths": "^4.0.0", + "ws": "^7.4.5" + }, + "bin": { + "remix": "dist/cli.js" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "@remix-run/serve": "^2.7.2", + "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 + } + } + }, + "node_modules/@remix-run/express": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/@remix-run/express/-/express-2.7.2.tgz", + "integrity": "sha512-wknBXniMr7sUvu0D+iOkxK1IenSM0nfZJai1RgNP0Qs12jrKQA5I1dZuiJdKFfLnhvJLbl/BJ6q40TJ4kqNTPg==", + "dependencies": { + "@remix-run/node": "2.7.2" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "express": "^4.17.1", + "typescript": "^5.1.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@remix-run/node": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/@remix-run/node/-/node-2.7.2.tgz", + "integrity": "sha512-smIWI9kNGDnY361WlDOTwxPfUw/KHcS7PCLjHlM/omx3ETD1Y2dc4Rt82LSJt0qsPSPA72ZOww08NoX+YGBvyQ==", + "dependencies": { + "@remix-run/server-runtime": "2.7.2", + "@remix-run/web-fetch": "^4.4.2", + "@remix-run/web-file": "^3.1.0", + "@remix-run/web-stream": "^1.1.0", + "@web3-storage/multipart-parser": "^1.0.0", + "cookie-signature": "^1.1.0", + "source-map-support": "^0.5.21", + "stream-slice": "^0.1.2" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "typescript": "^5.1.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@remix-run/react": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/@remix-run/react/-/react-2.7.2.tgz", + "integrity": "sha512-Q/gsxJVEYYvkYM/immVFP4rBnGSzEFNJLRt6plO5knAy6NV1NNptsEnvh4GoTVQdTKdVw7wkJW26/YpnHzHiDA==", + "dependencies": { + "@remix-run/router": "1.15.1", + "@remix-run/server-runtime": "2.7.2", + "react-router": "6.22.1", + "react-router-dom": "6.22.1" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0", + "typescript": "^5.1.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@remix-run/router": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.15.1.tgz", + "integrity": "sha512-zcU0gM3z+3iqj8UX45AmWY810l3oUmXM7uH4dt5xtzvMhRtYVhKGOmgOd1877dOPPepfCjUv57w+syamWIYe7w==", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@remix-run/serve": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/@remix-run/serve/-/serve-2.7.2.tgz", + "integrity": "sha512-5kR6fuD2MEWqd8DogyHP3fiSjGv56ZBWKntwMeEKh7kuyDhHPX+BAU2UsYvLOTB1VH9Ktg5mNM8l9gMMY6l/Jg==", + "dependencies": { + "@remix-run/express": "2.7.2", + "@remix-run/node": "2.7.2", + "chokidar": "^3.5.3", + "compression": "^1.7.4", + "express": "^4.17.1", + "get-port": "5.1.1", + "morgan": "^1.10.0", + "source-map-support": "^0.5.21" + }, + "bin": { + "remix-serve": "dist/cli.js" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@remix-run/server-runtime": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/@remix-run/server-runtime/-/server-runtime-2.7.2.tgz", + "integrity": "sha512-PGD1SPJttlYI3Nwe8ABk53gHCueWfZ2NOsKx7utD/lKRPFW2BqADpokzQXSzy4WTpk4drAmlagobGVIVH66Tmg==", + "dependencies": { + "@remix-run/router": "1.15.1", + "@types/cookie": "^0.6.0", + "@web3-storage/multipart-parser": "^1.0.0", + "cookie": "^0.6.0", + "set-cookie-parser": "^2.4.8", + "source-map": "^0.7.3" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "typescript": "^5.1.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@remix-run/web-blob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@remix-run/web-blob/-/web-blob-3.1.0.tgz", + "integrity": "sha512-owGzFLbqPH9PlKb8KvpNJ0NO74HWE2euAn61eEiyCXX/oteoVzTVSN8mpLgDjaxBf2btj5/nUllSUgpyd6IH6g==", + "dependencies": { + "@remix-run/web-stream": "^1.1.0", + "web-encoding": "1.1.5" + } + }, + "node_modules/@remix-run/web-fetch": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@remix-run/web-fetch/-/web-fetch-4.4.2.tgz", + "integrity": "sha512-jgKfzA713/4kAW/oZ4bC3MoLWyjModOVDjFPNseVqcJKSafgIscrYL9G50SurEYLswPuoU3HzSbO0jQCMYWHhA==", + "dependencies": { + "@remix-run/web-blob": "^3.1.0", + "@remix-run/web-file": "^3.1.0", + "@remix-run/web-form-data": "^3.1.0", + "@remix-run/web-stream": "^1.1.0", + "@web3-storage/multipart-parser": "^1.0.0", + "abort-controller": "^3.0.0", + "data-uri-to-buffer": "^3.0.1", + "mrmime": "^1.0.0" + }, + "engines": { + "node": "^10.17 || >=12.3" + } + }, + "node_modules/@remix-run/web-file": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@remix-run/web-file/-/web-file-3.1.0.tgz", + "integrity": "sha512-dW2MNGwoiEYhlspOAXFBasmLeYshyAyhIdrlXBi06Duex5tDr3ut2LFKVj7tyHLmn8nnNwFf1BjNbkQpygC2aQ==", + "dependencies": { + "@remix-run/web-blob": "^3.1.0" + } + }, + "node_modules/@remix-run/web-form-data": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@remix-run/web-form-data/-/web-form-data-3.1.0.tgz", + "integrity": "sha512-NdeohLMdrb+pHxMQ/Geuzdp0eqPbea+Ieo8M8Jx2lGC6TBHsgHzYcBvr0LyPdPVycNRDEpWpiDdCOdCryo3f9A==", + "dependencies": { + "web-encoding": "1.1.5" + } + }, + "node_modules/@remix-run/web-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@remix-run/web-stream/-/web-stream-1.1.0.tgz", + "integrity": "sha512-KRJtwrjRV5Bb+pM7zxcTJkhIqWWSy+MYsIxHK+0m5atcznsf15YwUBWHWulZerV2+vvHH1Lp1DD7pw6qKW8SgA==", + "dependencies": { + "web-streams-polyfill": "^3.1.1" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.12.0.tgz", + "integrity": "sha512-+ac02NL/2TCKRrJu2wffk1kZ+RyqxVUlbjSagNgPm94frxtr+XDL12E5Ll1enWskLrtrZ2r8L3wED1orIibV/w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.12.0.tgz", + "integrity": "sha512-OBqcX2BMe6nvjQ0Nyp7cC90cnumt8PXmO7Dp3gfAju/6YwG0Tj74z1vKrfRz7qAv23nBcYM8BCbhrsWqO7PzQQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.12.0.tgz", + "integrity": "sha512-X64tZd8dRE/QTrBIEs63kaOBG0b5GVEd3ccoLtyf6IdXtHdh8h+I56C2yC3PtC9Ucnv0CpNFJLqKFVgCYe0lOQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.12.0.tgz", + "integrity": "sha512-cc71KUZoVbUJmGP2cOuiZ9HSOP14AzBAThn3OU+9LcA1+IUqswJyR1cAJj3Mg55HbjZP6OLAIscbQsQLrpgTOg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.12.0.tgz", + "integrity": "sha512-a6w/Y3hyyO6GlpKL2xJ4IOh/7d+APaqLYdMf86xnczU3nurFTaVN9s9jOXQg97BE4nYm/7Ga51rjec5nfRdrvA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.12.0.tgz", + "integrity": "sha512-0fZBq27b+D7Ar5CQMofVN8sggOVhEtzFUwOwPppQt0k+VR+7UHMZZY4y+64WJ06XOhBTKXtQB/Sv0NwQMXyNAA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.12.0.tgz", + "integrity": "sha512-eTvzUS3hhhlgeAv6bfigekzWZjaEX9xP9HhxB0Dvrdbkk5w/b+1Sxct2ZuDxNJKzsRStSq1EaEkVSEe7A7ipgQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.12.0.tgz", + "integrity": "sha512-ix+qAB9qmrCRiaO71VFfY8rkiAZJL8zQRXveS27HS+pKdjwUfEhqo2+YF2oI+H/22Xsiski+qqwIBxVewLK7sw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.12.0.tgz", + "integrity": "sha512-TenQhZVOtw/3qKOPa7d+QgkeM6xY0LtwzR8OplmyL5LrgTWIXpTQg2Q2ycBf8jm+SFW2Wt/DTn1gf7nFp3ssVA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.12.0.tgz", + "integrity": "sha512-LfFdRhNnW0zdMvdCb5FNuWlls2WbbSridJvxOvYWgSBOYZtgBfW9UGNJG//rwMqTX1xQE9BAodvMH9tAusKDUw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.12.0.tgz", + "integrity": "sha512-JPDxovheWNp6d7AHCgsUlkuCKvtu3RB55iNEkaQcf0ttsDU/JZF+iQnYcQJSk/7PtT4mjjVG8N1kpwnI9SLYaw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.12.0.tgz", + "integrity": "sha512-fjtuvMWRGJn1oZacG8IPnzIV6GF2/XG+h71FKn76OYFqySXInJtseAqdprVTDTyqPxQOG9Exak5/E9Z3+EJ8ZA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.12.0.tgz", + "integrity": "sha512-ZYmr5mS2wd4Dew/JjT0Fqi2NPB/ZhZ2VvPp7SmvPZb4Y1CG/LRcS6tcRo2cYU7zLK5A7cdbhWnnWmUjoI4qapg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@ts-morph/common": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.11.1.tgz", + "integrity": "sha512-7hWZS0NRpEsNV8vWJzg7FEz6V8MaLNeJOmwmghqUXTpzk16V1LLZhdo+4QvE/+zv4cVci0OviuJFnqhEfoV3+g==", + "dependencies": { + "fast-glob": "^3.2.7", + "minimatch": "^3.0.4", + "mkdirp": "^1.0.4", + "path-browserify": "^1.0.1" + } + }, + "node_modules/@ts-morph/common/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@ts-morph/common/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@types/acorn": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@types/acorn/-/acorn-4.0.6.tgz", + "integrity": "sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==", + "dev": true, + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==" + }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "dev": true, + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, + "node_modules/@types/estree-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "dev": true, + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/hast": { + "version": "2.3.10", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.10.tgz", + "integrity": "sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==", + "dev": true, + "dependencies": { + "@types/unist": "^2" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true + }, + "node_modules/@types/mdast": { + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", + "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", + "dev": true, + "dependencies": { + "@types/unist": "^2" + } + }, + "node_modules/@types/mdx": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.11.tgz", + "integrity": "sha512-HM5bwOaIQJIQbAYfax35HCKxx7a3KrK3nBtIqJgSOitivTD1y3oW9P3rxY9RkXYPUk7y/AjAohfHKmFpGE79zw==", + "dev": true + }, + "node_modules/@types/ms": { + "version": "0.7.34", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==", + "dev": true + }, + "node_modules/@types/node": { + "version": "20.11.20", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.20.tgz", + "integrity": "sha512-7/rR21OS+fq8IyHTgtLkDK949uzsa6n8BkziAKtPVpugIkO6D+/ooXMvzXxDnZrmtXVfjb1bKQafYpb8s89LOg==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/prop-types": { + "version": "15.7.11", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz", + "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==", + "dev": true + }, + "node_modules/@types/react": { + "version": "18.2.58", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.58.tgz", + "integrity": "sha512-TaGvMNhxvG2Q0K0aYxiKfNDS5m5ZsoIBBbtfUorxdH4NGSXIlYvZxLJI+9Dd3KjeB3780bciLyAb7ylO8pLhPw==", + "dev": true, + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.2.19", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.19.tgz", + "integrity": "sha512-aZvQL6uUbIJpjZk4U8JZGbau9KDeAwMfmhyWorxgBkqDIEf6ROjRozcmPIicqsUwPUjbkDfHKgGee1Lq65APcA==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/scheduler": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz", + "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==", + "dev": true + }, + "node_modules/@types/semver": { + "version": "7.5.7", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.7.tgz", + "integrity": "sha512-/wdoPq1QqkSj9/QOeKkFquEuPzQbHTWAMPH/PaUMB+JuR31lXhlWXRZ52IpfDYVlDOUBvX09uBrPwxGT1hjNBg==", + "dev": true + }, + "node_modules/@types/unist": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", + "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==", + "dev": true + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz", + "integrity": "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/type-utils": "6.21.0", + "@typescript-eslint/utils": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", + "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", + "dev": true, + "peer": true, + "dependencies": { + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", + "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz", + "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/utils": "6.21.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", + "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", + "dev": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", + "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", + "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "semver": "^7.5.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", + "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, + "node_modules/@vanilla-extract/babel-plugin-debug-ids": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@vanilla-extract/babel-plugin-debug-ids/-/babel-plugin-debug-ids-1.0.5.tgz", + "integrity": "sha512-Rc9A6ylsw7EBErmpgqCMvc/Z/eEZxI5k1xfLQHw7f5HHh3oc5YfzsAsYU/PdmSNjF1dp3sGEViBdDltvwnfVaA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.23.9" + } + }, + "node_modules/@vanilla-extract/css": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@vanilla-extract/css/-/css-1.14.1.tgz", + "integrity": "sha512-V4JUuHNjZgl64NGfkDJePqizkNgiSpphODtZEs4cCPuxLAzwOUJYATGpejwimJr1n529kq4DEKWexW22LMBokw==", + "dev": true, + "dependencies": { + "@emotion/hash": "^0.9.0", + "@vanilla-extract/private": "^1.0.3", + "chalk": "^4.1.1", + "css-what": "^6.1.0", + "cssesc": "^3.0.0", + "csstype": "^3.0.7", + "deep-object-diff": "^1.1.9", + "deepmerge": "^4.2.2", + "media-query-parser": "^2.0.2", + "modern-ahocorasick": "^1.0.0", + "outdent": "^0.8.0" + } + }, + "node_modules/@vanilla-extract/integration": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@vanilla-extract/integration/-/integration-6.5.0.tgz", + "integrity": "sha512-E2YcfO8vA+vs+ua+gpvy1HRqvgWbI+MTlUpxA8FvatOvybuNcWAY0CKwQ/Gpj7rswYKtC6C7+xw33emM6/ImdQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.20.7", + "@babel/plugin-syntax-typescript": "^7.20.0", + "@vanilla-extract/babel-plugin-debug-ids": "^1.0.4", + "@vanilla-extract/css": "^1.14.0", + "esbuild": "npm:esbuild@~0.17.6 || ~0.18.0 || ~0.19.0", + "eval": "0.1.8", + "find-up": "^5.0.0", + "javascript-stringify": "^2.0.1", + "lodash": "^4.17.21", + "mlly": "^1.4.2", + "outdent": "^0.8.0", + "vite": "^5.0.11", + "vite-node": "^1.2.0" + } + }, + "node_modules/@vanilla-extract/private": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@vanilla-extract/private/-/private-1.0.3.tgz", + "integrity": "sha512-17kVyLq3ePTKOkveHxXuIJZtGYs+cSoev7BlP+Lf4916qfDhk/HBjvlYDe8egrea7LNPHKwSZJK/bzZC+Q6AwQ==", + "dev": true + }, + "node_modules/@vercel/remix": { + "version": "2.7.2-preset.1", + "resolved": "https://registry.npmjs.org/@vercel/remix/-/remix-2.7.2-preset.1.tgz", + "integrity": "sha512-ijfsiBE+R9D8cPefMzkMOjgvVv+lzYE+/LxD1ZCrG1HOG1aHX7C3aQAIixb+YUtXLmv3sne48Hl6QL0vc+E2fA==", + "dependencies": { + "@remix-run/node": "2.7.2", + "@remix-run/server-runtime": "2.7.2", + "@vercel/static-config": "3.0.0", + "isbot": "^3.6.8", + "ts-morph": "12.0.0" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/@vercel/remix/node_modules/isbot": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/isbot/-/isbot-3.8.0.tgz", + "integrity": "sha512-vne1mzQUTR+qsMLeCBL9+/tgnDXRyc2pygLGl/WsgA+EZKIiB5Ehu0CiVTHIIk30zhJ24uGz4M5Ppse37aR0Hg==", + "engines": { + "node": ">=12" + } + }, + "node_modules/@vercel/static-config": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@vercel/static-config/-/static-config-3.0.0.tgz", + "integrity": "sha512-2qtvcBJ1bGY0dYGYh3iM7yGKkk971FujLEDXzuW5wcZsPr1GSEjO/w2iSr3qve6nDDtBImsGoDEnus5FI4+fIw==", + "dependencies": { + "ajv": "8.6.3", + "json-schema-to-ts": "1.6.4", + "ts-morph": "12.0.0" + } + }, + "node_modules/@web3-storage/multipart-parser": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@web3-storage/multipart-parser/-/multipart-parser-1.0.0.tgz", + "integrity": "sha512-BEO6al7BYqcnfX15W2cnGR+Q566ACXAT9UQykORCWW80lmkpWsnEob6zJS1ZVBKsSJC8+7vJkHwlp+lXG1UCdw==" + }, + "node_modules/@zxing/text-encoding": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@zxing/text-encoding/-/text-encoding-0.9.0.tgz", + "integrity": "sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA==", + "optional": true + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "8.6.3", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.3.tgz", + "integrity": "sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "dev": true, + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "node_modules/array-includes": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", + "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/array.prototype.filter": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array.prototype.filter/-/array.prototype.filter-1.0.3.tgz", + "integrity": "sha512-VizNcj/RGJiUyQBgzwxzE5oHdeuXY5hSbbmKMlphj1cy1Vl7Pn2asCGbSrru6hSQjmCzqTBPVWAF/whmEOVHbw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-array-method-boxes-properly": "^1.0.0", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.4.tgz", + "integrity": "sha512-hzvSHUshSpCflDR1QMUBLHGHP1VIEBegT4pix9H/Z92Xw3ySoy6c2qh7lJWTJnRJ8JCZ9bJNCgTyYaJGcJu6xQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz", + "integrity": "sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.1.0", + "es-shim-unscopables": "^1.0.2" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ast-types-flow": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", + "dev": true + }, + "node_modules/astring": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/astring/-/astring-1.8.6.tgz", + "integrity": "sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==", + "dev": true, + "bin": { + "astring": "bin/astring" + } + }, + "node_modules/asynciterator.prototype": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz", + "integrity": "sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.3" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axe-core": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.0.tgz", + "integrity": "sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/axobject-query": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz", + "integrity": "sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==", + "dev": true, + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "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.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserify-zlib": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", + "integrity": "sha512-19OEpq7vWgsH6WkvkBJQDFvJS1uPcbFOQ4v9CU839dO+ZZXUZO6XpE6hNCqvlIIj+4fZvRiJ6DsAQ382GwiyTQ==", + "dev": true, + "dependencies": { + "pako": "~0.2.0" + } + }, + "node_modules/browserslist": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", + "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/builtins": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", + "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", + "dev": true, + "dependencies": { + "semver": "^7.0.0" + } + }, + "node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacache": { + "version": "17.1.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.4.tgz", + "integrity": "sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==", + "dev": true, + "dependencies": { + "@npmcli/fs": "^3.1.0", + "fs-minipass": "^3.0.0", + "glob": "^10.2.2", + "lru-cache": "^7.7.1", + "minipass": "^7.0.3", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "p-map": "^4.0.0", + "ssri": "^10.0.0", + "tar": "^6.1.11", + "unique-filename": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/cacache/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001589", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001589.tgz", + "integrity": "sha512-vNQWS6kI+q6sBlHbh71IIeC+sRwK2N3EDySc/updIGhIee2x5z00J4c1242/5/d6EpEMdOnk/m+6tuk4/tcsqg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/code-block-writer": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-10.1.1.tgz", + "integrity": "sha512-67ueh2IRGst/51p0n6FvPrnRjAGHY5F8xdjkgrYE7DDzpJe6qA07RYQ9VcoUeo5ATOjSOiWpSL3SWBRRbempMw==" + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-disposition/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.1.tgz", + "integrity": "sha512-78KWk9T26NhzXtuL26cIJ8/qNHANyJ/ZYrmEXFzUmhZdjpBv+DlWlOANRTGBt48YcyslsLrj0bMLFTmXvLRCOw==", + "engines": { + "node": ">=6.6.0" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cross-spawn/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "dev": true + }, + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", + "dev": true + }, + "node_modules/data-uri-to-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz", + "integrity": "sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decode-named-character-reference": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", + "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", + "dev": true, + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/deep-object-diff": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/deep-object-diff/-/deep-object-diff-1.1.9.tgz", + "integrity": "sha512-Rn+RuwkmkDwCi2/oXOFS9Gsr5lJZu/yTGpK7wAaAIE75CC+LCGEZHpY6VQJa/RoJcrmaA/docWJZvYohlNkWPA==", + "dev": true + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dev": true, + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/diff": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", + "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dotenv": { + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/duplexify/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/duplexify/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/duplexify/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/electron-to-chromium": { + "version": "1.4.681", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.681.tgz", + "integrity": "sha512-1PpuqJUFWoXZ1E54m8bsLPVYwIVCRzvaL+n5cjigGga4z854abDnFRc+cTa2th4S79kyGqya/1xoR7h+Y5G5lg==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true + }, + "node_modules/es-abstract": { + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.4.tgz", + "integrity": "sha512-vZYJlk2u6qHYxBOTjAeg7qUxHdNfih64Uu2J8QqWgXZ2cri0ZpJAkzDUK/q593+mvKwlxyaxr6F1Q+3LKoQRgg==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.6", + "call-bind": "^1.0.7", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.2", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.1", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.0", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", + "typed-array-buffer": "^1.0.1", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", + "dev": true + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.0.17", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.17.tgz", + "integrity": "sha512-lh7BsUqelv4KUbR5a/ZTaGGIMLCjPGPqJ6q+Oq24YP0RdyptX1uzm4vvaqzk7Zx3bpl/76YLTTDj9L7uYQ92oQ==", + "dev": true, + "dependencies": { + "asynciterator.prototype": "^1.0.0", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.4", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.2", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.3", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "iterator.prototype": "^1.1.2", + "safe-array-concat": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", + "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==", + "dev": true + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/esbuild": { + "version": "0.17.6", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.6.tgz", + "integrity": "sha512-TKFRp9TxrJDdRWfSsSERKEovm6v30iHnrjlcGhLBOtReE28Yp1VSBRfO3GTaOFMoxsNerx4TjrhzSuma9ha83Q==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "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" + } + }, + "node_modules/esbuild-plugins-node-modules-polyfill": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/esbuild-plugins-node-modules-polyfill/-/esbuild-plugins-node-modules-polyfill-1.6.3.tgz", + "integrity": "sha512-nydQGT3RijD8mBd3Hek+2gSAxndgceZU9GIjYYiqU+7CE7veN8utTmupf0frcKpwIXCXWpRofL9CY9k0yU70CA==", + "dev": true, + "dependencies": { + "@jspm/core": "^2.0.1", + "local-pkg": "^0.5.0", + "resolve.exports": "^2.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "esbuild": "^0.14.0 || ^0.15.0 || ^0.16.0 || ^0.17.0 || ^0.18.0 || ^0.19.0 || ^0.20.0" + } + }, + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@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.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-import-resolver-typescript": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz", + "integrity": "sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==", + "dev": true, + "dependencies": { + "debug": "^4.3.4", + "enhanced-resolve": "^5.12.0", + "eslint-module-utils": "^2.7.4", + "fast-glob": "^3.3.1", + "get-tsconfig": "^4.5.0", + "is-core-module": "^2.11.0", + "is-glob": "^4.0.3" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", + "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", + "dev": true, + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", + "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.7", + "array.prototype.findlastindex": "^1.2.3", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.8.0", + "hasown": "^2.0.0", + "is-core-module": "^2.13.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.7", + "object.groupby": "^1.0.1", + "object.values": "^1.1.7", + "semver": "^6.3.1", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "node_modules/eslint-plugin-import/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/eslint-plugin-import/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-import/node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz", + "integrity": "sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.23.2", + "aria-query": "^5.3.0", + "array-includes": "^3.1.7", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "=4.7.0", + "axobject-query": "^3.2.1", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "es-iterator-helpers": "^1.0.15", + "hasown": "^2.0.0", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", + "minimatch": "^3.1.2", + "object.entries": "^1.1.7", + "object.fromentries": "^2.0.7" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.33.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz", + "integrity": "sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flatmap": "^1.3.1", + "array.prototype.tosorted": "^1.1.1", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.0.12", + "estraverse": "^5.3.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.6", + "object.fromentries": "^2.0.6", + "object.hasown": "^1.1.2", + "object.values": "^1.1.6", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.4", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.8" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", + "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", + "dev": true, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/eslint-plugin-react/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-plugin-react/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-util-attach-comments": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-2.1.1.tgz", + "integrity": "sha512-+5Ba/xGGS6mnwFbXIuQiDPTbuTxuMCooq3arVv7gPZtYpjp+VXH/NkHAP35OOefPhNG/UGqU3vt/LTABwcHX0w==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-build-jsx": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/estree-util-build-jsx/-/estree-util-build-jsx-2.2.2.tgz", + "integrity": "sha512-m56vOXcOBuaF+Igpb9OPAy7f9w9OIkb5yhjsZuaPm7HoGi4oTOQi0h2+yZ+AtKklYFZ+rPC4n0wYCJCEU1ONqg==", + "dev": true, + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "estree-util-is-identifier-name": "^2.0.0", + "estree-walker": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-is-identifier-name": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-2.1.0.tgz", + "integrity": "sha512-bEN9VHRyXAUOjkKVQVvArFym08BTWB0aJPppZZr0UNyAqWsLaVfAqP7hbaTJjzHifmB5ebnR8Wm7r7yGN/HonQ==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-to-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-1.2.0.tgz", + "integrity": "sha512-IzU74r1PK5IMMGZXUVZbmiu4A1uhiPgW5hm1GjcOfr4ZzHaMPpLNJjR7HjXiIOzi25nZDrgFTobHTkV5Q6ITjA==", + "dev": true, + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "astring": "^1.8.0", + "source-map": "^0.7.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-value-to-estree": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/estree-util-value-to-estree/-/estree-util-value-to-estree-1.3.0.tgz", + "integrity": "sha512-Y+ughcF9jSUJvncXwqRageavjrNPAI+1M/L3BI3PyLp1nmgYTGUXU6t5z1Y7OWuThoDdhPME07bQU+d5LxdJqw==", + "dev": true, + "dependencies": { + "is-plain-obj": "^3.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/estree-util-visit": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-1.2.1.tgz", + "integrity": "sha512-xbgqcrkIVbIG+lI/gzbvd9SGTJL4zqJKBFttUl5pP27KhAjtMKbX/mQXJ7qgyXpMgVy/zvpm0xoQQaGL8OloOw==", + "dev": true, + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eval": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/eval/-/eval-0.1.8.tgz", + "integrity": "sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==", + "dev": true, + "dependencies": { + "@types/node": "*", + "require-like": ">= 0.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit-hook": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-2.2.1.tgz", + "integrity": "sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.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" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/express/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fault": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fault/-/fault-2.0.1.tgz", + "integrity": "sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==", + "dev": true, + "dependencies": { + "format": "^0.2.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "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" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "dev": true + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/format": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", + "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, + "node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fs-minipass": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", + "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", + "dev": true, + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/generic-names": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/generic-names/-/generic-names-4.0.0.tgz", + "integrity": "sha512-ySFolZQfw9FoDb3ed9d80Cm9f0+r7qj+HJkWjeD9RBfpxEVTlVhol+gvaQB/78WbwYfbnNh8nWHHBSlg072y6A==", + "dev": true, + "dependencies": { + "loader-utils": "^3.2.0" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-port": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz", + "integrity": "sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-tsconfig": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.2.tgz", + "integrity": "sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==", + "dev": true, + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", + "dev": true + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/gunzip-maybe": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/gunzip-maybe/-/gunzip-maybe-1.4.2.tgz", + "integrity": "sha512-4haO1M4mLO91PW57BMsDFf75UmwoRX0GkdD+Faw+Lr+r/OZrOCS0pIBwOL1xCKQqnQzbNFGgK2V2CpBUPeFNTw==", + "dev": true, + "dependencies": { + "browserify-zlib": "^0.1.4", + "is-deflate": "^1.0.0", + "is-gzip": "^1.0.0", + "peek-stream": "^1.1.0", + "pumpify": "^1.3.3", + "through2": "^2.0.3" + }, + "bin": { + "gunzip-maybe": "bin.js" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz", + "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hast-util-to-estree": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-2.3.3.tgz", + "integrity": "sha512-ihhPIUPxN0v0w6M5+IiAZZrn0LH2uZomeWwhn7uP7avZC6TE7lIiEh2yBMPr5+zi1aUCXq6VoYRgs2Bw9xmycQ==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^2.0.0", + "@types/unist": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "estree-util-attach-comments": "^2.0.0", + "estree-util-is-identifier-name": "^2.0.0", + "hast-util-whitespace": "^2.0.0", + "mdast-util-mdx-expression": "^1.0.0", + "mdast-util-mdxjs-esm": "^1.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-object": "^0.4.1", + "unist-util-position": "^4.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-2.0.1.tgz", + "integrity": "sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hosted-git-info": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", + "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", + "dev": true, + "dependencies": { + "lru-cache": "^7.5.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/inline-style-parser": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", + "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==", + "dev": true + }, + "node_modules/internal-slot": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "dev": true, + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-async-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "engines": { + "node": ">=4" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-deflate": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-deflate/-/is-deflate-1.0.0.tgz", + "integrity": "sha512-YDoFpuZWu1VRXlsnlYMzKyVRITXj7Ej/V9gXQ2/pAe7X1J7M/RNOqaIYi6qUn+B7nGyB9pDXrv02dsB58d2ZAQ==", + "dev": true + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", + "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-gzip": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-gzip/-/is-gzip-1.0.0.tgz", + "integrity": "sha512-rcfALRIb1YewtnksfRIHGcIY93QnK8BIQ/2c9yDYcG/Y6+vRoJuTWBmmSEbyLLYtXm7q35pHOHbZFQBaLrhlWQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", + "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-reference": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.2.tgz", + "integrity": "sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==", + "dev": true, + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", + "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dependencies": { + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", + "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", + "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/isbot": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/isbot/-/isbot-4.4.0.tgz", + "integrity": "sha512-8ZvOWUA68kyJO4hHJdWjyreq7TYNWTS9y15IzeqVdKxR9pPr3P/3r9AHcoIv9M0Rllkao5qWz2v1lmcyKIVCzQ==", + "engines": { + "node": ">=18" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/iterator.prototype": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", + "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", + "dev": true, + "dependencies": { + "define-properties": "^1.2.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "reflect.getprototypeof": "^1.0.4", + "set-function-name": "^2.0.1" + } + }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/javascript-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/javascript-stringify/-/javascript-stringify-2.1.0.tgz", + "integrity": "sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg==", + "dev": true + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-parse-even-better-errors": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.1.tgz", + "integrity": "sha512-aatBvbL26wVUCLmbWdCpeu9iF5wOyWpagiKkInA+kfws3sWdBrTnsvN2CKcyCYyUrc7rebNBlK6+kteg7ksecg==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/json-schema-to-ts": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/json-schema-to-ts/-/json-schema-to-ts-1.6.4.tgz", + "integrity": "sha512-pR4yQ9DHz6itqswtHCm26mw45FSNfQ9rEQjosaZErhn5J3J2sIViQiz8rDaezjKAhFGpmsoczYVBgGHzFw/stA==", + "dependencies": { + "@types/json-schema": "^7.0.6", + "ts-toolbelt": "^6.15.5" + } + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-parser": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.1.tgz", + "integrity": "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==", + "dev": true + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/language-subtag-registry": { + "version": "0.3.22", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", + "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==", + "dev": true + }, + "node_modules/language-tags": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", + "dev": true, + "dependencies": { + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lilconfig": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.1.tgz", + "integrity": "sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/loader-utils": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", + "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==", + "dev": true, + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/local-pkg": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.0.tgz", + "integrity": "sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==", + "dev": true, + "dependencies": { + "mlly": "^1.4.2", + "pkg-types": "^1.0.3" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "dev": true + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/markdown-extensions": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-1.1.1.tgz", + "integrity": "sha512-WWC0ZuMzCyDHYCasEGs4IPvLyTGftYwh6wIEOULOF0HXcqZlhwRzrK0w2VUlxWA98xnvb/jszw4ZSkJ6ADpM6Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mdast-util-definitions": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz", + "integrity": "sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==", + "dev": true, + "dependencies": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "unist-util-visit": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz", + "integrity": "sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==", + "dev": true, + "dependencies": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "mdast-util-to-string": "^3.1.0", + "micromark": "^3.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-decode-string": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "unist-util-stringify-position": "^3.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-frontmatter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-1.0.1.tgz", + "integrity": "sha512-JjA2OjxRqAa8wEG8hloD0uTU0kdn8kbtOWpPP94NBkfAlbxn4S8gCGf/9DwFtEeGPXrDcNXdiDjVaRdUFqYokw==", + "dev": true, + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-to-markdown": "^1.3.0", + "micromark-extension-frontmatter": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-2.0.1.tgz", + "integrity": "sha512-38w5y+r8nyKlGvNjSEqWrhG0w5PmnRA+wnBvm+ulYCct7nsGYhFVb0lljS9bQav4psDAS1eGkP2LMVcZBi/aqw==", + "dev": true, + "dependencies": { + "mdast-util-from-markdown": "^1.0.0", + "mdast-util-mdx-expression": "^1.0.0", + "mdast-util-mdx-jsx": "^2.0.0", + "mdast-util-mdxjs-esm": "^1.0.0", + "mdast-util-to-markdown": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-1.3.2.tgz", + "integrity": "sha512-xIPmR5ReJDu/DHH1OoIT1HkuybIfRGYRywC+gJtI7qHjCJp/M9jrmBEJW22O8lskDWm562BX2W8TiAwRTb0rKA==", + "dev": true, + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^2.0.0", + "@types/mdast": "^3.0.0", + "mdast-util-from-markdown": "^1.0.0", + "mdast-util-to-markdown": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-2.1.4.tgz", + "integrity": "sha512-DtMn9CmVhVzZx3f+optVDF8yFgQVt7FghCRNdlIaS3X5Bnym3hZwPbg/XW86vdpKjlc1PVj26SpnLGeJBXD3JA==", + "dev": true, + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^2.0.0", + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "ccount": "^2.0.0", + "mdast-util-from-markdown": "^1.1.0", + "mdast-util-to-markdown": "^1.3.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-remove-position": "^4.0.0", + "unist-util-stringify-position": "^3.0.0", + "vfile-message": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdxjs-esm": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-1.3.1.tgz", + "integrity": "sha512-SXqglS0HrEvSdUEfoXFtcg7DRl7S2cwOXc7jkuusG472Mmjag34DUDeOJUZtl+BVnyeO1frIgVpHlNRWc2gk/w==", + "dev": true, + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^2.0.0", + "@types/mdast": "^3.0.0", + "mdast-util-from-markdown": "^1.0.0", + "mdast-util-to-markdown": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-3.0.1.tgz", + "integrity": "sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==", + "dev": true, + "dependencies": { + "@types/mdast": "^3.0.0", + "unist-util-is": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "12.3.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-12.3.0.tgz", + "integrity": "sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==", + "dev": true, + "dependencies": { + "@types/hast": "^2.0.0", + "@types/mdast": "^3.0.0", + "mdast-util-definitions": "^5.0.0", + "micromark-util-sanitize-uri": "^1.1.0", + "trim-lines": "^3.0.0", + "unist-util-generated": "^2.0.0", + "unist-util-position": "^4.0.0", + "unist-util-visit": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-1.5.0.tgz", + "integrity": "sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==", + "dev": true, + "dependencies": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^3.0.0", + "mdast-util-to-string": "^3.0.0", + "micromark-util-decode-string": "^1.0.0", + "unist-util-visit": "^4.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz", + "integrity": "sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==", + "dev": true, + "dependencies": { + "@types/mdast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/media-query-parser": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/media-query-parser/-/media-query-parser-2.0.2.tgz", + "integrity": "sha512-1N4qp+jE0pL5Xv4uEcwVUhIkwdUO3S/9gML90nqKA7v7FcOS5vUtatfzok9S9U1EJU8dHWlcv95WLnKmmxZI9w==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.12.5" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromark": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.2.0.tgz", + "integrity": "sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "micromark-core-commonmark": "^1.0.1", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-chunked": "^1.0.0", + "micromark-util-combine-extensions": "^1.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-subtokenize": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.1", + "uvu": "^0.5.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz", + "integrity": "sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-factory-destination": "^1.0.0", + "micromark-factory-label": "^1.0.0", + "micromark-factory-space": "^1.0.0", + "micromark-factory-title": "^1.0.0", + "micromark-factory-whitespace": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-chunked": "^1.0.0", + "micromark-util-classify-character": "^1.0.0", + "micromark-util-html-tag-name": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-subtokenize": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.1", + "uvu": "^0.5.0" + } + }, + "node_modules/micromark-extension-frontmatter": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/micromark-extension-frontmatter/-/micromark-extension-frontmatter-1.1.1.tgz", + "integrity": "sha512-m2UH9a7n3W8VAH9JO9y01APpPKmNNNs71P0RbknEmYSaZU5Ghogv38BYO94AI5Xw6OYfxZRdHZZ2nYjs/Z+SZQ==", + "dev": true, + "dependencies": { + "fault": "^2.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdx-expression": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-1.0.8.tgz", + "integrity": "sha512-zZpeQtc5wfWKdzDsHRBY003H2Smg+PUi2REhqgIhdzAa5xonhP03FcXxqFSerFiNUr5AWmHpaNPQTBVOS4lrXw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "@types/estree": "^1.0.0", + "micromark-factory-mdx-expression": "^1.0.0", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-events-to-acorn": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "node_modules/micromark-extension-mdx-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-1.0.5.tgz", + "integrity": "sha512-gPH+9ZdmDflbu19Xkb8+gheqEDqkSpdCEubQyxuz/Hn8DOXiXvrXeikOoBA71+e8Pfi0/UYmU3wW3H58kr7akA==", + "dev": true, + "dependencies": { + "@types/acorn": "^4.0.0", + "@types/estree": "^1.0.0", + "estree-util-is-identifier-name": "^2.0.0", + "micromark-factory-mdx-expression": "^1.0.0", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0", + "vfile-message": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdx-md": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-1.0.1.tgz", + "integrity": "sha512-7MSuj2S7xjOQXAjjkbjBsHkMtb+mDGVW6uI2dBL9snOBCbZmoNgDAeZ0nSn9j3T42UE/g2xVNMn18PJxZvkBEA==", + "dev": true, + "dependencies": { + "micromark-util-types": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-1.0.1.tgz", + "integrity": "sha512-7YA7hF6i5eKOfFUzZ+0z6avRG52GpWR8DL+kN47y3f2KhxbBZMhmxe7auOeaTBrW2DenbbZTf1ea9tA2hDpC2Q==", + "dev": true, + "dependencies": { + "acorn": "^8.0.0", + "acorn-jsx": "^5.0.0", + "micromark-extension-mdx-expression": "^1.0.0", + "micromark-extension-mdx-jsx": "^1.0.0", + "micromark-extension-mdx-md": "^1.0.0", + "micromark-extension-mdxjs-esm": "^1.0.0", + "micromark-util-combine-extensions": "^1.0.0", + "micromark-util-types": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs-esm": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-1.0.5.tgz", + "integrity": "sha512-xNRBw4aoURcyz/S69B19WnZAkWJMxHMT5hE36GtDAyhoyn/8TuAeqjFJQlwk+MKQsUD7b3l7kFX+vlfVWgcX1w==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0", + "micromark-core-commonmark": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-events-to-acorn": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "unist-util-position-from-estree": "^1.1.0", + "uvu": "^0.5.0", + "vfile-message": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-factory-destination": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz", + "integrity": "sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz", + "integrity": "sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "node_modules/micromark-factory-mdx-expression": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-1.0.9.tgz", + "integrity": "sha512-jGIWzSmNfdnkJq05c7b0+Wv0Kfz3NJ3N4cBjnbO4zjXIlxJr+f8lk+5ZmwFvqdAbUy2q6B5rCY//g0QAAaXDWA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "@types/estree": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-events-to-acorn": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "unist-util-position-from-estree": "^1.0.0", + "uvu": "^0.5.0", + "vfile-message": "^3.0.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz", + "integrity": "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz", + "integrity": "sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz", + "integrity": "sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", + "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz", + "integrity": "sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz", + "integrity": "sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz", + "integrity": "sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz", + "integrity": "sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz", + "integrity": "sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz", + "integrity": "sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-events-to-acorn": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-1.2.3.tgz", + "integrity": "sha512-ij4X7Wuc4fED6UoLWkmo0xJQhsktfNh1J0m8g4PbIMPlx+ek/4YdW5mvbye8z/aZvAPUoxgXHrwVlXAPKMRp1w==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "@types/acorn": "^4.0.0", + "@types/estree": "^1.0.0", + "@types/unist": "^2.0.0", + "estree-util-visit": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0", + "vfile-message": "^3.0.0" + } + }, + "node_modules/micromark-util-html-tag-name": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz", + "integrity": "sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz", + "integrity": "sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz", + "integrity": "sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz", + "integrity": "sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz", + "integrity": "sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", + "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", + "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-collect/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-collect/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-flush/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-flush/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "dev": true + }, + "node_modules/mlly": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.6.1.tgz", + "integrity": "sha512-vLgaHvaeunuOXHSmEbZ9izxPx3USsk8KCQ8iC+aTlp5sKRSoZvwhHh5L9VbKSaVC6sJDqbyohIS76E2VmHIPAA==", + "dev": true, + "dependencies": { + "acorn": "^8.11.3", + "pathe": "^1.1.2", + "pkg-types": "^1.0.3", + "ufo": "^1.3.2" + } + }, + "node_modules/modern-ahocorasick": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/modern-ahocorasick/-/modern-ahocorasick-1.0.1.tgz", + "integrity": "sha512-yoe+JbhTClckZ67b2itRtistFKf8yPYelHLc7e5xAwtNAXxM6wJTUx2C7QeVSJFDzKT7bCIFyBVybPMKvmB9AA==", + "dev": true + }, + "node_modules/morgan": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", + "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==", + "dependencies": { + "basic-auth": "~2.0.1", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-finished": "~2.3.0", + "on-headers": "~1.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/morgan/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/morgan/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/morgan/node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/mrmime": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", + "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-releases": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "dev": true + }, + "node_modules/normalize-package-data": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-5.0.0.tgz", + "integrity": "sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==", + "dev": true, + "dependencies": { + "hosted-git-info": "^6.0.0", + "is-core-module": "^2.8.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-install-checks": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.3.0.tgz", + "integrity": "sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==", + "dev": true, + "dependencies": { + "semver": "^7.1.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-normalize-package-bin": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", + "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-package-arg": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-10.1.0.tgz", + "integrity": "sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^6.0.0", + "proc-log": "^3.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-pick-manifest": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-8.0.2.tgz", + "integrity": "sha512-1dKY+86/AIiq1tkKVD3l0WI+Gd3vkknVGAggsFeBkTvbhMQ1OND/LKkYv4JtXPKUJ8bOTCyLiqEg2P6QNdK+Gg==", + "dev": true, + "dependencies": { + "npm-install-checks": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0", + "npm-package-arg": "^10.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz", + "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", + "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.2.tgz", + "integrity": "sha512-bzBq58S+x+uo0VjurFT0UktpKHOZmv4/xePiOA1nbB9pMqpGK7rUPNgf+1YC+7mE+0HzhTMqNUuCqvKhj6FnBw==", + "dev": true, + "dependencies": { + "array.prototype.filter": "^1.0.3", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.0.0" + } + }, + "node_modules/object.hasown": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.3.tgz", + "integrity": "sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==", + "dev": true, + "dependencies": { + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", + "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/outdent": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/outdent/-/outdent-0.8.0.tgz", + "integrity": "sha512-KiOAIsdpUTcAXuykya5fnVVT+/5uS0Q1mrkRHcF89tpieSmY33O/tmc54CqwA+bfhbtEfZUNLHaPUiB9X3jt1A==", + "dev": true + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==", + "dev": true + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-entities": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.1.tgz", + "integrity": "sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-2.1.0.tgz", + "integrity": "sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-scurry": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "dev": true, + "dependencies": { + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "dev": true + }, + "node_modules/peek-stream": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/peek-stream/-/peek-stream-1.1.3.tgz", + "integrity": "sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "duplexify": "^3.5.0", + "through2": "^2.0.3" + } + }, + "node_modules/periscopic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz", + "integrity": "sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^3.0.0", + "is-reference": "^3.0.0" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pidtree": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", + "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", + "dev": true, + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/pkg-types": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz", + "integrity": "sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==", + "dev": true, + "dependencies": { + "jsonc-parser": "^3.2.0", + "mlly": "^1.2.0", + "pathe": "^1.1.0" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.4.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz", + "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-discard-duplicates": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", + "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-modules": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules/-/postcss-modules-6.0.0.tgz", + "integrity": "sha512-7DGfnlyi/ju82BRzTIjWS5C4Tafmzl3R79YP/PASiocj+aa6yYphHhhKUOEoXQToId5rgyFgJ88+ccOUydjBXQ==", + "dev": true, + "dependencies": { + "generic-names": "^4.0.0", + "icss-utils": "^5.1.0", + "lodash.camelcase": "^4.3.0", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "string-hash": "^1.1.1" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.4.tgz", + "integrity": "sha512-L4QzMnOdVwRm1Qb8m4x8jsZzKAaPAgrUF1r/hjDR2Xj7R+8Zsf97jAlSQzWtKx5YNiNGN8QxmPFIc/sh+RQl+Q==", + "dev": true, + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.1.1.tgz", + "integrity": "sha512-uZgqzdTleelWjzJY+Fhti6F3C9iF1JR/dODLs/JDefozYcKTBCdD8BIl6nNPbTbcLnGrk56hzwZC2DaGNvYjzA==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dev": true, + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.15", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz", + "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/pretty-ms": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-7.0.1.tgz", + "integrity": "sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==", + "dev": true, + "dependencies": { + "parse-ms": "^2.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/proc-log": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", + "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "dev": true + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dev": true, + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dev": true, + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/property-information": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.4.1.tgz", + "integrity": "sha512-OHYtXfu5aI2sS2LWFSN5rgJjrQ4pCy8i1jubJLe2QvMF8JJ++HXTUIVWFLfXJoaOfvYYjk2SN8J2wFUWIGXT4w==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "dependencies": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true + }, + "node_modules/react-refresh": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", + "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-router": { + "version": "6.22.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.22.1.tgz", + "integrity": "sha512-0pdoRGwLtemnJqn1K0XHUbnKiX0S4X8CgvVVmHGOWmofESj31msHo/1YiqcJWK7Wxfq2a4uvvtS01KAQyWK/CQ==", + "dependencies": { + "@remix-run/router": "1.15.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.22.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.22.1.tgz", + "integrity": "sha512-iwMyyyrbL7zkKY7MRjOVRy+TMnS/OPusaFVxM2P11x9dzSzGmLsebkCvYirGq0DWB9K9hOspHYYtDz33gE5Duw==", + "dependencies": { + "@remix-run/router": "1.15.1", + "react-router": "6.22.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.5.tgz", + "integrity": "sha512-62wgfC8dJWrmxv44CA36pLDnP6KKl3Vhxb7PL+8+qrrFMMoJij4vgiMP8zV4O8+CBMXY1mHxI5fITGHXFHVmQQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.0.0", + "get-intrinsic": "^1.2.3", + "globalthis": "^1.0.3", + "which-builtin-type": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "dev": true + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/remark-frontmatter": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/remark-frontmatter/-/remark-frontmatter-4.0.1.tgz", + "integrity": "sha512-38fJrB0KnmD3E33a5jZC/5+gGAC2WKNiPw1/fdXJvijBlhA7RCsvJklrYJakS0HedninvaCYW8lQGf9C918GfA==", + "dev": true, + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-frontmatter": "^1.0.0", + "micromark-extension-frontmatter": "^1.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-mdx": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-2.3.0.tgz", + "integrity": "sha512-g53hMkpM0I98MU266IzDFMrTD980gNF3BJnkyFcmN+dD873mQeD5rdMO3Y2X+x8umQfbSE0PcoEDl7ledSA+2g==", + "dev": true, + "dependencies": { + "mdast-util-mdx": "^2.0.0", + "micromark-extension-mdxjs": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-mdx-frontmatter": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/remark-mdx-frontmatter/-/remark-mdx-frontmatter-1.1.1.tgz", + "integrity": "sha512-7teX9DW4tI2WZkXS4DBxneYSY7NHiXl4AKdWDO9LXVweULlCT8OPWsOjLEnMIXViN1j+QcY8mfbq3k0EK6x3uA==", + "dev": true, + "dependencies": { + "estree-util-is-identifier-name": "^1.0.0", + "estree-util-value-to-estree": "^1.0.0", + "js-yaml": "^4.0.0", + "toml": "^3.0.0" + }, + "engines": { + "node": ">=12.2.0" + } + }, + "node_modules/remark-mdx-frontmatter/node_modules/estree-util-is-identifier-name": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-1.1.0.tgz", + "integrity": "sha512-OVJZ3fGGt9By77Ix9NhaRbzfbDV/2rx9EP7YIDJTmsZSEc5kYn2vWcNccYyahJL2uAQZK2a5Or2i0wtIKTPoRQ==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/remark-parse": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.2.tgz", + "integrity": "sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==", + "dev": true, + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-from-markdown": "^1.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-10.1.0.tgz", + "integrity": "sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==", + "dev": true, + "dependencies": { + "@types/hast": "^2.0.0", + "@types/mdast": "^3.0.0", + "mdast-util-to-hast": "^12.1.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-like": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz", + "integrity": "sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/resolve.exports": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/rollup": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.12.0.tgz", + "integrity": "sha512-wz66wn4t1OHIJw3+XU7mJJQV/2NAfw5OAk6G6Hoo3zcvz/XOfQ52Vgi+AN4Uxoxi0KBBwk2g8zPrTDA4btSB/Q==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.5" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.12.0", + "@rollup/rollup-android-arm64": "4.12.0", + "@rollup/rollup-darwin-arm64": "4.12.0", + "@rollup/rollup-darwin-x64": "4.12.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.12.0", + "@rollup/rollup-linux-arm64-gnu": "4.12.0", + "@rollup/rollup-linux-arm64-musl": "4.12.0", + "@rollup/rollup-linux-riscv64-gnu": "4.12.0", + "@rollup/rollup-linux-x64-gnu": "4.12.0", + "@rollup/rollup-linux-x64-musl": "4.12.0", + "@rollup/rollup-win32-arm64-msvc": "4.12.0", + "@rollup/rollup-win32-ia32-msvc": "4.12.0", + "@rollup/rollup-win32-x64-msvc": "4.12.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/sade": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", + "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", + "dev": true, + "dependencies": { + "mri": "^1.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.0.tgz", + "integrity": "sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "get-intrinsic": "^1.2.2", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/safe-regex-test": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-regex": "^1.1.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "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" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-cookie-parser": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.6.0.tgz", + "integrity": "sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==" + }, + "node_modules/set-function-length": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz", + "integrity": "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==", + "dependencies": { + "define-data-property": "^1.1.2", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.5.tgz", + "integrity": "sha512-QcgiIWV4WV7qWExbN5llt6frQB/lBven9pqliLXfGPB+K9ZYXxDozp0wLkHS24kWCm+6YXH/f0HhnObZnZOBnQ==", + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz", + "integrity": "sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==", + "dev": true + }, + "node_modules/ssri": { + "version": "10.0.5", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.5.tgz", + "integrity": "sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==", + "dev": true, + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/stream-shift": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", + "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==", + "dev": true + }, + "node_modules/stream-slice": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/stream-slice/-/stream-slice-0.1.2.tgz", + "integrity": "sha512-QzQxpoacatkreL6jsxnVb7X5R/pGw9OUv2qWTYWnmLpg4NdN31snPy/f3TdQE1ZUXaThRvj1Zw4/OGg0ZkaLMA==" + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/string-hash": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz", + "integrity": "sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A==", + "dev": true + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", + "integrity": "sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "regexp.prototype.flags": "^1.5.0", + "set-function-name": "^2.0.0", + "side-channel": "^1.0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", + "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", + "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", + "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.3.tgz", + "integrity": "sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==", + "dev": true, + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/style-to-object": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.4.tgz", + "integrity": "sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==", + "dev": true, + "dependencies": { + "inline-style-parser": "0.1.1" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", + "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", + "dev": true, + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "dev": true, + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-fs/node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "node_modules/tar-fs/node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar/node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/through2/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/through2/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/through2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/toml": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/toml/-/toml-3.0.0.tgz", + "integrity": "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==", + "dev": true + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/ts-api-utils": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.2.1.tgz", + "integrity": "sha512-RIYA36cJn2WiH9Hy77hdF9r7oEwxAtB/TS9/S4Qd90Ap4z5FSiin5zEiTL44OII1Y3IIlEvxwxFUVgrHSZ/UpA==", + "dev": true, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/ts-morph": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-12.0.0.tgz", + "integrity": "sha512-VHC8XgU2fFW7yO1f/b3mxKDje1vmyzFXHWzOYmKEkCEwcLjDtbdLgBQviqj4ZwP4MJkQtRo6Ha2I29lq/B+VxA==", + "dependencies": { + "@ts-morph/common": "~0.11.0", + "code-block-writer": "^10.1.1" + } + }, + "node_modules/ts-toolbelt": { + "version": "6.15.5", + "resolved": "https://registry.npmjs.org/ts-toolbelt/-/ts-toolbelt-6.15.5.tgz", + "integrity": "sha512-FZIXf1ksVyLcfr7M317jbB67XFJhOO1YqdTcuGaq9q5jLUoTikukZ+98TPjKiP2jC5CgmYdWWYs0s2nLSU0/1A==" + }, + "node_modules/tsconfck": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.0.2.tgz", + "integrity": "sha512-6lWtFjwuhS3XI4HsX4Zg0izOI3FU/AI9EGVlPEUMDIhvLPMD4wkiof0WCoDgW7qY+Dy198g4d9miAqUHWHFH6Q==", + "dev": true, + "bin": { + "tsconfck": "bin/tsconfck.js" + }, + "engines": { + "node": "^18 || >=20" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "dev": true, + "dependencies": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.5.tgz", + "integrity": "sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", + "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "devOptional": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/ufo": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.4.0.tgz", + "integrity": "sha512-Hhy+BhRBleFjpJ2vchUNN40qgkh0366FWJGqVLYBHev0vpHTrXSA0ryT+74UiW6KWsldNurQMKGqCm1M2zBciQ==", + "dev": true + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, + "node_modules/unified": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", + "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "bail": "^2.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unified/node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/unique-filename": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", + "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", + "dev": true, + "dependencies": { + "unique-slug": "^4.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/unique-slug": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", + "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/unist-util-generated": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-2.0.1.tgz", + "integrity": "sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz", + "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.4.tgz", + "integrity": "sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position-from-estree": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-1.1.2.tgz", + "integrity": "sha512-poZa0eXpS+/XpoQwGwl79UUdea4ol2ZuCYguVaJS4qzIOMDzbqz8a3erUCOmubSZkaOuGamb3tX790iwOIROww==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-remove-position": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-4.0.2.tgz", + "integrity": "sha512-TkBb0HABNmxzAcfLf4qsIbFbaPDvMO6wa3b3j4VcEzFVaw1LBKwnW4/sRJ/atSLSzoIg41JWEdnE7N6DIhGDGQ==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-visit": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", + "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", + "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz", + "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uvu": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/uvu/-/uvu-0.5.6.tgz", + "integrity": "sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==", + "dev": true, + "dependencies": { + "dequal": "^2.0.0", + "diff": "^5.0.0", + "kleur": "^4.0.3", + "sade": "^1.7.3" + }, + "bin": { + "uvu": "bin.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/validate-npm-package-name": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz", + "integrity": "sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==", + "dev": true, + "dependencies": { + "builtins": "^5.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vfile": { + "version": "5.3.7", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz", + "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^3.0.0", + "vfile-message": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", + "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vite": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.1.4.tgz", + "integrity": "sha512-n+MPqzq+d9nMVTKyewqw6kSt+R3CkvF9QAKY8obiQn8g1fwTscKxyfaYnC632HtBXAQGc1Yjomphwn1dtwGAHg==", + "dev": true, + "dependencies": { + "esbuild": "^0.19.3", + "postcss": "^8.4.35", + "rollup": "^4.2.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-node": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.3.1.tgz", + "integrity": "sha512-azbRrqRxlWTJEVbzInZCTchx0X69M/XPTCz4H+TLvlTcR/xH/3hkRqhOakT41fMJCMzXTu4UvegkZiEoJAWvng==", + "dev": true, + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.3.4", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "vite": "^5.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vite-tsconfig-paths": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-4.3.1.tgz", + "integrity": "sha512-cfgJwcGOsIxXOLU/nELPny2/LUD/lcf1IbfyeKTv2bsupVbTH/xpFtdQlBmIP1GEK2CjjLxYhFfB+QODFAx5aw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "globrex": "^0.1.2", + "tsconfck": "^3.0.1" + }, + "peerDependencies": { + "vite": "*" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", + "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", + "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", + "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", + "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", + "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", + "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", + "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", + "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", + "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", + "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-loong64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", + "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-mips64el": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", + "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", + "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-riscv64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", + "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-s390x": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", + "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", + "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/netbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", + "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/openbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", + "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/sunos-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", + "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", + "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", + "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", + "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/esbuild": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", + "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.19.12", + "@esbuild/android-arm": "0.19.12", + "@esbuild/android-arm64": "0.19.12", + "@esbuild/android-x64": "0.19.12", + "@esbuild/darwin-arm64": "0.19.12", + "@esbuild/darwin-x64": "0.19.12", + "@esbuild/freebsd-arm64": "0.19.12", + "@esbuild/freebsd-x64": "0.19.12", + "@esbuild/linux-arm": "0.19.12", + "@esbuild/linux-arm64": "0.19.12", + "@esbuild/linux-ia32": "0.19.12", + "@esbuild/linux-loong64": "0.19.12", + "@esbuild/linux-mips64el": "0.19.12", + "@esbuild/linux-ppc64": "0.19.12", + "@esbuild/linux-riscv64": "0.19.12", + "@esbuild/linux-s390x": "0.19.12", + "@esbuild/linux-x64": "0.19.12", + "@esbuild/netbsd-x64": "0.19.12", + "@esbuild/openbsd-x64": "0.19.12", + "@esbuild/sunos-x64": "0.19.12", + "@esbuild/win32-arm64": "0.19.12", + "@esbuild/win32-ia32": "0.19.12", + "@esbuild/win32-x64": "0.19.12" + } + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dev": true, + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/web-encoding": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/web-encoding/-/web-encoding-1.1.5.tgz", + "integrity": "sha512-HYLeVCdJ0+lBYV2FvNZmv3HJ2Nt0QYXqZojk3d9FJOLkwnuhzM9tmamh8d7HPM8QqjKH8DeHkFTx+CFlWpZZDA==", + "dependencies": { + "util": "^0.12.3" + }, + "optionalDependencies": { + "@zxing/text-encoding": "0.9.0" + } + }, + "node_modules/web-streams-polyfill": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", + "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/which": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", + "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", + "dev": true, + "dependencies": { + "function.prototype.name": "^1.1.5", + "has-tostringtag": "^1.0.0", + "is-async-function": "^2.0.0", + "is-date-object": "^1.0.5", + "is-finalizationregistry": "^1.0.2", + "is-generator-function": "^1.0.10", + "is-regex": "^1.1.4", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", + "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "dev": true, + "dependencies": { + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-weakmap": "^2.0.1", + "is-weakset": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.14.tgz", + "integrity": "sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==", + "dependencies": { + "available-typed-arrays": "^1.0.6", + "call-bind": "^1.0.5", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "dev": true, + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/yaml": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", + "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", + "dev": true, + "engines": { + "node": ">= 14" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/package.json b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/package.json new file mode 100644 index 000000000..0d5184dfc --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/package.json @@ -0,0 +1,43 @@ +{ + "name": "interactive-remix-routing-v2", + "description": "", + "license": "MIT", + "version": "0.1.0", + "private": true, + "type": "module", + "sideEffects": false, + "scripts": { + "build": "remix vite:build", + "dev": "remix vite:dev", + "lint": "eslint --ignore-path .gitignore --cache --cache-location ./node_modules/.cache/eslint .", + "start": "remix-serve ./build/server/index.js", + "typecheck": "tsc" + }, + "dependencies": { + "@remix-run/node": "2.7.2", + "@remix-run/react": "2.7.2", + "@remix-run/serve": "2.7.2", + "@vercel/remix": "2.7.2-preset.1", + "isbot": "4.4.0", + "react": "^18.2.0", + "react-dom": "^18.2.0" + }, + "devDependencies": { + "@remix-run/dev": "https://remix-e7asp269z.vercel.sh/remix-dev.tgz", + "@types/react": "^18.2.57", + "@types/react-dom": "^18.2.19", + "@typescript-eslint/eslint-plugin": "^6.21.0", + "eslint": "^8.56.0", + "eslint-import-resolver-typescript": "^3.6.1", + "eslint-plugin-import": "^2.29.1", + "eslint-plugin-jsx-a11y": "^6.8.0", + "eslint-plugin-react": "^7.33.2", + "eslint-plugin-react-hooks": "^4.6.0", + "typescript": "^5.3.3", + "vite": "^5.1.3", + "vite-tsconfig-paths": "^4.3.1" + }, + "engines": { + "node": ">=18" + } +} diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/probes.json b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/probes.json new file mode 100644 index 000000000..4ce7ca4ff --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/probes.json @@ -0,0 +1,121 @@ +{ + "probes": [ + { + "path": "/", + "status": 200, + "mustContain": "Home Page" + }, + { + "path": "/about", + "status": 200, + "mustContain": "About Page" + }, + { + "path": "/concerts/trending", + "status": 200, + "mustContain": "ConcertsTrending Page" + }, + { + "path": "/concerts/salt-lake-city", + "status": 200, + "mustContain": "ConcertsSaltLakeCity Page" + }, + { + "path": "/movies/avatar", + "status": 200, + "mustContain": "MoviesCommonMoviename Page" + }, + { + "path": "/movies/trending", + "status": 200, + "mustContain": "MoviesTrending Page" + }, + { + "path": "/actors", + "status": 200, + "mustContain": "Actorsindex Page" + }, + { + "path": "/actors/morgan-freeman", + "status": 200, + "mustContain": "ActorsCommonActorname Page" + }, + { + "path": "/actors/trending", + "status": 200, + "mustContain": "ActorsTrending Page" + }, + { + "path": "/actors/favourites", + "status": 200, + "mustContain": "ActorsFavourites Page" + }, + { + "path": "/login", + "status": 200, + "mustContain": "authLogin Page" + }, + { + "path": "/register", + "status": 200, + "mustContain": "authRegister Page" + }, + { + "path": "/products/en/american-flag-speedo", + "status": 200, + "mustContain": "ProductPage" + }, + { + "path": "/products/fr/categories", + "status": 200, + "mustContain": "Product Categories Page" + }, + { + "path": "/files", + "status": 200, + "mustContain": "Files Generic Page" + }, + { + "path": "/files/12345", + "status": 200, + "mustContain": "Files Generic Page" + }, + { + "path": "/sitemap.xml", + "status": 200, + "mustContain": "routes/sitemap[.]xml.tsx" + }, + { + "path": "/sitemap2.xml", + "status": 200, + "mustContain": "routes/[sitemap2.xml].tsx" + }, + { + "path": "/weird-url/_index", + "status": 200, + "mustContain": "routes/weird-url.[_index].tsx" + }, + { + "path": "/dolla-bills-$", + "status": 200, + "mustContain": "routes/dolla-bills-[$].tsx" + }, + { + "path": "/[so-weird]/", + "status": 200, + "mustContain": "routes/[[so-weird]].tsx" + }, + { + "path": "/does-not-exist", + "status": 404, + "mustContain": "Not Found" + }, + { + "path": "/assets/manifest-4eb87c14.js", + "status": 200, + "responseHeaders": { + "cache-control": "public, max-age=31536000, immutable" + } + } + ] +} diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/public/favicon.ico b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..8830cf6821b354114848e6354889b8ecf6d2bc61 GIT binary patch literal 16958 zcmeI3+jCXb9mnJN2h^uNlXH@jlam{_a8F3W{T}Wih>9YJpaf7TUbu)A5fv|h7OMfR zR;q$lr&D!wv|c)`wcw1?>4QT1(&|jdsrI2h`Rn)dTW5t$8pz=s3_5L?#oBxAowe8R z_WfPfN?F+@`q$D@rvC?(W!uWieppskmQ~YG*>*L?{img@tWpnYXZslxeh#TSUS3{q z1Ju6JcfQSbQuORq69@YK(X-3c9vC2c2a2z~zw=F=50@pm0PUiCAm!bAT?2jpM`(^b zC|2&Ngngt^<>oCv#?P(AZ`5_84x#QBPulix)TpkIAUp=(KgGo4CVS~Sxt zVoR4>r5g9%bDh7hi0|v$={zr>CHd`?-l4^Ld(Z9PNz9piFY+llUw_x4ou7Vf-q%$g z)&)J4>6Ft~RZ(uV>dJD|`nxI1^x{X@Z5S<=vf;V3w_(*O-7}W<=e$=}CB9_R;)m9)d7`d_xx+nl^Bg|%ew=?uoKO8w zeQU7h;~8s!@9-k>7Cx}1SDQ7m(&miH zs8!l*wOJ!GHbdh)pD--&W3+w`9YJ=;m^FtMY=`mTq8pyV!-@L6smwp3(q?G>=_4v^ zn(ikLue7!y70#2uhqUVpb7fp!=xu2{aM^1P^pts#+feZv8d~)2sf`sjXLQCEj;pdI z%~f`JOO;*KnziMv^i_6+?mL?^wrE_&=IT9o1i!}Sd4Sx4O@w~1bi1)8(sXvYR-1?7~Zr<=SJ1Cw!i~yfi=4h6o3O~(-Sb2Ilwq%g$+V` z>(C&N1!FV5rWF&iwt8~b)=jIn4b!XbrWrZgIHTISrdHcpjjx=TwJXI7_%Ks4oFLl9 zNT;!%!P4~xH85njXdfqgnIxIFOOKW`W$fxU%{{5wZkVF^G=JB$oUNU5dQSL&ZnR1s z*ckJ$R`eCUJsWL>j6*+|2S1TL_J|Fl&kt=~XZF=+=iT0Xq1*KU-NuH%NAQff$LJp3 zU_*a;@7I0K{mqwux87~vwsp<}@P>KNDb}3U+6$rcZ114|QTMUSk+rhPA(b{$>pQTc zIQri{+U>GMzsCy0Mo4BfWXJlkk;RhfpWpAB{=Rtr*d1MNC+H3Oi5+3D$gUI&AjV-1 z=0ZOox+bGyHe=yk-yu%=+{~&46C$ut^ZN+ysx$NH}*F43)3bKkMsxGyIl#>7Yb8W zO{}&LUO8Ow{7>!bvSq?X{15&Y|4}0w2=o_^0ZzYgB+4HhZ4>s*mW&?RQ6&AY|CPcx z$*LjftNS|H)ePYnIKNg{ck*|y7EJ&Co0ho0K`!{ENPkASeKy-JWE}dF_%}j)Z5a&q zXAI2gPu6`s-@baW=*+keiE$ALIs5G6_X_6kgKK8n3jH2-H9`6bo)Qn1 zZ2x)xPt1=`9V|bE4*;j9$X20+xQCc$rEK|9OwH-O+Q*k`ZNw}K##SkY z3u}aCV%V|j@!gL5(*5fuWo>JFjeU9Qqk`$bdwH8(qZovE2tA7WUpoCE=VKm^eZ|vZ z(k<+j*mGJVah>8CkAsMD6#I$RtF;#57Wi`c_^k5?+KCmX$;Ky2*6|Q^bJ8+s%2MB}OH-g$Ev^ zO3uqfGjuN%CZiu<`aCuKCh{kK!dDZ+CcwgIeU2dsDfz+V>V3BDb~)~ zO!2l!_)m;ZepR~sL+-~sHS7;5ZB|~uUM&&5vDda2b z)CW8S6GI*oF><|ZeY5D^+Mcsri)!tmrM33qvwI4r9o@(GlW!u2R>>sB|E#%W`c*@5 z|0iA|`{6aA7D4Q?vc1{vT-#yytn07`H!QIO^1+X7?zG3%y0gPdIPUJ#s*DNAwd}m1_IMN1^T&be~+E z_z%1W^9~dl|Me9U6+3oNyuMDkF*z_;dOG(Baa*yq;TRiw{EO~O_S6>e*L(+Cdu(TM z@o%xTCV%hi&p)x3_inIF!b|W4|AF5p?y1j)cr9RG@v%QVaN8&LaorC-kJz_ExfVHB za!mtuee#Vb?dh&bwrfGHYAiX&&|v$}U*UBM;#F!N=x>x|G5s0zOa9{(`=k4v^6iK3 z8d&=O@xhDs{;v7JQ%eO;!Bt`&*MH&d zp^K#dkq;jnJz%%bsqwlaKA5?fy zS5JDbO#BgSAdi8NM zDo2SifX6^Z;vn>cBh-?~r_n9qYvP|3ihrnqq6deS-#>l#dV4mX|G%L8|EL;$U+w69 z;rTK3FW$ewUfH|R-Z;3;jvpfiDm?Fvyu9PeR>wi|E8>&j2Z@2h`U}|$>2d`BPV3pz#ViIzH8v6pP^L-p!GbLv<;(p>}_6u&E6XO5- zJ8JEvJ1)0>{iSd|kOQn#?0rTYL=KSmgMHCf$Qbm;7|8d(goD&T-~oCDuZf57iP#_Y zmxaoOSjQsm*^u+m$L9AMqwi=6bpdiAY6k3akjGN{xOZ`_J<~Puyzpi7yhhKrLmXV; z@ftONPy;Uw1F#{_fyGbk04yLE01v=i_5`RqQP+SUH0nb=O?l!J)qCSTdsbmjFJrTm zx4^ef@qt{B+TV_OHOhtR?XT}1Etm(f21;#qyyW6FpnM+S7*M1iME?9fe8d-`Q#InN z?^y{C_|8bxgUE@!o+Z72C)BrS&5D`gb-X8kq*1G7Uld-z19V}HY~mK#!o9MC-*#^+ znEsdc-|jj0+%cgBMy(cEkq4IQ1D*b;17Lyp>Utnsz%LRTfjQKL*vo(yJxwtw^)l|! z7jhIDdtLB}mpkOIG&4@F+9cYkS5r%%jz}I0R#F4oBMf-|Jmmk* zk^OEzF%}%5{a~kGYbFjV1n>HKC+a`;&-n*v_kD2DPP~n5(QE3C;30L<32GB*qV2z$ zWR1Kh=^1-q)P37WS6YWKlUSDe=eD^u_CV+P)q!3^{=$#b^auGS7m8zFfFS<>(e~)TG z&uwWhSoetoe!1^%)O}=6{SUcw-UQmw+i8lokRASPsbT=H|4D|( zk^P7>TUEFho!3qXSWn$m2{lHXw zD>eN6-;wwq9(?@f^F4L2Ny5_6!d~iiA^s~(|B*lbZir-$&%)l>%Q(36yOIAu|326K ztmBWz|MLA{Kj(H_{w2gd*nZ6a@ma(w==~EHIscEk|C=NGJa%Ruh4_+~f|%rt{I5v* zIX@F?|KJID56-ivb+PLo(9hn_CdK{irOcL15>JNQFY112^$+}JPyI{uQ~$&E*=ri; z`d^fH?4f=8vKHT4!p9O*fX(brB75Y9?e>T9=X#Fc@V#%@5^)~#zu5I(=>LQA-EGTS zecy*#6gG+8lapch#Hh%vl(+}J;Q!hC1OKoo;#h3#V%5Js)tQ)|>pTT@1ojd+F9Gey zg`B)zm`|Mo%tH31s4=<+`Pu|B3orXwNyIcNN>;fBkIj^X8P}RXhF= zXQK1u5RLN7k#_Q(KznJrALtMM13!vhfr025ar?@-%{l|uWt@NEd<$~n>RQL{ z+o;->n)+~0tt(u|o_9h!T`%M8%)w2awpV9b*xz9Pl-daUJm3y-HT%xg`^mFd6LBeL z!0~s;zEr)Bn9x)I(wx`;JVwvRcc^io2XX(Nn3vr3dgbrr@YJ?K3w18P*52^ieBCQP z=Up1V$N2~5ppJHRTeY8QfM(7Yv&RG7oWJAyv?c3g(29)P)u;_o&w|&)HGDIinXT~p z3;S|e$=&Tek9Wn!`cdY+d-w@o`37}x{(hl>ykB|%9yB$CGdIcl7Z?d&lJ%}QHck77 zJPR%C+s2w1_Dl_pxu6$Zi!`HmoD-%7OD@7%lKLL^Ixd9VlRSW*o&$^iQ2z+}hTgH) z#91TO#+jH<`w4L}XWOt(`gqM*uTUcky`O(mEyU|4dJoy6*UZJ7%*}ajuos%~>&P2j zk23f5<@GeV?(?`l=ih+D8t`d72xrUjv0wsg;%s1@*2p?TQ;n2$pV7h?_T%sL>iL@w zZ{lmc<|B7!e&o!zs6RW+u8+aDyUdG>ZS(v&rT$QVymB7sEC@VsK1dg^3F@K90-wYB zX!we79qx`(6LA>F$~{{xE8-3Wzyfe`+Lsce(?uj{k@lb97YTJt#>l*Z&LyKX@zjmu?UJC9w~;|NsB{%7G}y*uNDBxirfC EKbET!0{{R3 literal 0 HcmV?d00001 diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/public/og.png b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/public/og.png new file mode 100644 index 0000000000000000000000000000000000000000..3b773217cd518beb0928dc8417506096db57021b GIT binary patch literal 23822 zcmeFZXIN8N^e=p9BAtN&8^s1_LK6f*I*x?+4Av$=+x0z54pCb$DW^uf@T7k`;m=j+;0B zGJ+t+VhE!5IeG-#F;EY*1RpFOH_W^sh>aKiM+d!5KMrovc^PSGLWR8oKfxD9Ck;If z2r7wV+p}YWAj`Km|I#q=qgx(#>$W2Ki|t&0-5K;)@UOVP&xqw<8FK&p@al}wsk0y7 zqQeG0YIRJCuC@ZNg;QbX46#4a_Vaw|mWS%b~cL}0-|ZQ-J- zLt8XQkq_7=WSD!!`|$G;9Y6eu;QuxdaY%n5Szl?nTn$#eFH_NrMXURM)9ZxE^`wOT5k|{2f?5;) z#HLeLU?D@;%va5$5cKTxpsD3ot5P@OJh@Hl#Y3*uiE-NCOdPc!;@65SVabA(;xzeS z=O=A-pVYb>X;!yVo6it-=Tzt||1_XHJN}jP(oz6+7pCL>PH*MhPmtU@hcV z@|?XKB|J6c%KPTo$nG{MBSAO#E(W4Y!y5`&T;t*tu zQuW*4eoJI2(l_z1z#vK*Yn%x4WUAZfH!vc)ngJ5OmZ#hQBT*+;!HhaowS_$=UDSJ( z(*1S0yTrV(yA2`n_{16~6w3lE9RE#eY{Wb+34Na$J_vY0CzeFFjK@~C{lnM>NuO_~ zhvv)?A9xHi%I+Cc8_NhQ$eSj{bkMi!VN6hW2BS$+m4l92l~YYP3UOVgOf1<*?iJlP zeCjqs+1w1V^7({TZuUvEiNxn3uF)e0?X2e9bSc5$5Vn%DQ#)11==0;m8BNLQ_BS5V z=Q>eWSGigTII*d!!M2<0c)_*5S+YZR>nS@#mY7wWFNnxX>2JI}Qm2nW6b*R!a+8Q4 zzv-|5%$ZWmqdZu2Vo<>zA|D?)Y`e3qrt#QXm9AOi^B%DTC!bx#%QUNO1(THoA#qV~ zDo3L^Gg9_%zdc*RW6`#onE}<$O zq{gsQVN;{~qQr`Y^auQGzlFkM1ISH6y9 zqu+)XB5!>HSvLE_&#l2Gcq)8lzbLc;h~pnXLVAcn6aM2I!!~Np*AR@R(!r*oKX}In zO|5Iv4{`$is4Mq}$9;Vv4`o2@Y_oP}4b~PuT!9J3N+re3TRFzYUFCAMU|0hDD7^rx znUlB8-X1ybs=9t%e_`EK>v5QX7gS_yO3-gXPC(020EA0 z)f)GA-i9RezYDP~kFbNnQt$9-LfIEnz2yYH6*93vwp&2P!bAmJCQzgCm6HK3zH6jp zB?xj%hS;Ew)~)$PWB%m3(fUilOC=!_*dz@oY(xxjC(j4Bwvf-I+&6x(Sp-Z+cMR;W zusqgu5I1}t^HhJ4dU{A5NP)@E1!SRuvu)iPD`Xo2FSl^MzAJ|t4DG%G+?gS^oSm~R zKgM^JAHJms-+Jzw9uh$POb89xpcrroE%}TG`!Yk#L9iDbte)Ok+~r2{SX&*85P-Kl z4euwuvZaTdab;(FOKD}EvvJQ8m?c<@dvX?>fAwu0niwdI8_aiELHbT8)@BT8TqDv! z$6;l5S%6hx&N`~b6#7^ChJYe6_cYK$wy*;(cI2@xu&F9+D)8op!e(INy8IY-$`}mx z!zXn#5J+2@|1E}Pxn#*_va4CTXg`Evie>fJ3q@J$5%wh-); zrIOcpHE8yR+5rgm&@gqL4T=E%++Ph`xY!1GhJm9XY5Cmxon=bzDH<*qFy#Tv+B>r8 z!8tpu;2X@MJ0;aS3)3orS0U&)GdzQz>^l1GkdL&12a5*a~&UV%fcd>k*!7PJemg25-@N8ij@cUGvT!CD1w znNN(-nalwejc0hzrP4Ox2*CpOU=eR;)?S{YHP3fXY)`XEJtQboEvZXD(4-Y(Etom( zGefqc`Xj}5ZTW)DCw0`Z(|t9Gz}50Ns?>4YI|v!vXP8N#&M<`TleIYRPx_2F014Gi zfY>m`iVBSjPm#4c{EzYshJ^lJqgJA7VAUeh$qPQ`#xs}=${Xd@O z3!D#KENTDO*QeRGek|=b8)Y$Od4+e+^0l6HR7l5D0DEh_!*Q>1utnblo?jjN6ezrQXS)YO%2Hs_piAaAOd4?+?oYZ#L$!L%$(%%tm>~3Q@N| zsQH*FeeA~?f{wD8MZ*n&Y-Z@2REE#!z0iI-U5&iA@>!w#^W-AcHFaNtY13%Ky1~J> z=XhjMeZLBgw(2{cU$jLjIm>6pQn@q9&<YWIZ{ zoYIUakdEc**izlXz(QAhPVK-S?1yKa%fQp2>C9kmDDV}*i?;Q<-Lkt$t9b= ztfFmYCRDi~3cohm3yM_~@2VE;iprV@D)}l@IpbPQ+ZFh|AU95Q6-AVvecG z#@yk0acu2iO-pS->ckU|O)=H4R-V5;(^ktue=VJSt_`Ie0|Ih8B>2pEg!A_|_`boj z5#voY(Gt(4^;vK{UGMu5!|kjEnjTCZu5D}17iH1X$Tt!PvqsnAicSlQGuM|;v1oiax<8a)E5uMYh> zS_r+68Z>Qt$xM~F^CmeG19FDY%m17XP3EhIEjW^B-OD!Qf> zi!hyD(gc)}O9RKd@!A`H73r&UV^l_T&Lf?uE6ua;zE5yIE3|75@)J%ft?he^J@D!gQk?`OPVP`%;{cRBQ$#YR0;dJ6LO=JzH4unuMFeI^<(lS590XB zPtzA)hWTB(U^8;2yQN3FYrQ?U67>h2Id+Yf8fAz`mMN|kS6+Jwd}Lo<2UT6tEJLE~ z5u@2R$Lgl_KsMq}8XglR-E01Ri*5H9lyK(=zx1U8w}bt!%O|5>bH^ECt+C4rME`wBNOb0Z5>(Nt4{XfRiuipvJKcZPH$QcQ)--7;M*#QnB)FL0j)nR(1c~?VV?3ZB?Cd!mJo=?N7q4h^cMg^le$)zklH6 zXr9BmxXr-4bKoOB65_tMhXXA&=g-nwlT+%3!js@#r?~MlTnhXNDd*G@y21?kXN;Q6$(qB7u>dKZHdFRpO zcE&K;P?eOp;-t1~cChQ3&tiQrUQqR7-!*76oVnJ0pJd|$>GobcCGYB2!H^Q4-V*df z?STB1Ff5f`kiM0=)eW2(Sxs$6vCNFqoQ})3$Ntvyy2g#1x8_HU-)t7~>&qWs>ou?4 z;mw*aY+Uam?MaQd)%oTx9Z8`F!u%J>b!Y9FV{iEfRu^-p5#t|OYkB23IA2&P%Jln( z!FJi6ukG_7W;MAhnL%4=WCYJmzayfVGNp^DOb^ThJ zaMK>1w!F78Lffr7puW_ql@ebvP61C=F+Uof+fo1cRACdyCQOBcit9qBWp0`c1yq-N zw<7Zy=)RH1fyD_X>DZh^)!!9kg!qktdA^=k%wNT$?@7x2JdK(&-cvi6R(lA2BRd_e zag7fgY&LD>H)EZxupmf^2Y&8#IY*;Ah?x5(A~9kX?*nQ)`w}W!4tD!>w3>F|kmz7% zaxaZDEI?4|)9bmhzo2YuaOAu#iF7?R>XlHh%R2vv8)wMB%&Px=yXqv%rpYr&eUCyyjB)T87rn`Lp3|imWRrO$R zpKP-`Xp?aluL$)Wxi%Iq2Zu>JeYxd-^3zz=*q9NyLtV=eY{_j!1ofNh-aD;Xg!Q4O zkh#?HRf#>p*yNhttcKNaW^osezT$kfUr$yRkVOKtAexgJ@)LcSB1r0ozWsC$4HUi| zJbO)e;maA6DVz=2bTX+ES86G}jaRRDYR)`W+c|e_oX%Ds90-wk8o3-6i!9X__=86Ovq@8d!VOa4mdhoZJO{ts3q$4NP%>^ehgG6e^>O;cHq}t9l3~)hV+i(t* z%~HjYS6u463}OUt@CZ0P>5Gg2Fq%qzAa&lUtQaK2AUlKZe(}f-%qv!{chF&mx>eyv z_H?LI-B(6rcg*8;Jf%N?S&NL%Xm{kSZLlg#*W(Ki2bon~`yYS(ZTTx691;%{T zz4%S-Ktyj_3I2ob_7}4vkvy3I90E@lJ$#f58yhqSXMbUiD#}NTP3-8Jm*A|Y4`*Vx z4D|LZArDNKKb$^lqq6^d-Y2hksK8>F4k|lbVIb3gr3O|sEw#`fVkIY(0%tJLYhQq+ zytr>u%59t5N*^`?XLs5Dxve`u`ZubEr6Ns*CrWb|AjiYCQ;U72*%o=+0MU)%!*oZw zOE6+$;sk!WH-Yq~4i3)&*Z?Q@wxR-NM~nUi(ejI`{{fGPfVZFeYwdJ%z~qRN@2ct| zjuX0@b$ItB0tb*PVVY}-64ZSJKC&#Sky%(^TtBSh{&+1Imv%UAz1xfM9Gnc^Sk>7x z&}9QazUJkf_QzstoH=W(DaAIrjfR;QrnBD2&(HIv!Hl4e+r~@^E{LQ+O#~Aj{4h zWe9QTF35Yp;pAP<>GBQ185RRH3e(c|y$WT_YrJfi8W+-N57Yf_?BU3N=^hHOh!w#P zSsf?l$@v_52Ib7HLZ&polH7ovUnCad>jp==-+X5JS`$|BIFox~G3YZeuhHeFGV3k&v zh9oQ*An!x!QC|os_QMF%)^fy4R-9DGJ_S66Sr*K&ZF!k>P`^7u2pMuaw40Hb+}41d z-ASPQ74WIUhG}pxU2AHy3JDa-Lu(Gq9y9&-r1rHg zWYNP=+Lh3Az|gY7hniA&aqM;ju!VJGE`fRYD0EN)%)v0;8;>`$g#6zfrtSGWUy5i8 zMLsZmpM@0xvpZpCHuEU|PpZg=DS>MOuiS{`f6_PqnOf z&tU%2@AV_q|kI(G0EP$L<>Ov3ZPhwJ4xKu6&WC2VQV8>EF59+qxr_~l)r^D*XdH5B>^!u=QLzXg5 zNy~lHLYt5puDTyni}8?ekS!pU~k$pJ&%Ub;eK(R#It)T%Hl&Q#X>n zN%nB&B*&U*6g%=bQ>P&e9z(d2@*{Ib^aVGtK#9GJif*T5d4*-zx{NO-d-QQME5o|1 z9%Yn+9WlGaUKwU{yih%5k<=ThbHj3vi%m>@5O(;GdW7}yat_A|0_o~vx2#qb7bt_| z!Bq$-`{uuyi%zB6sfr=V>!T0wtdVc}|5*6%*U5mrUn?;5wajRAC1__rXFs&a{AiK( zuAMm-s7Gw>}hlP^RxhM#BAT&c{$ zwE1~oP}6d`o`0Nv00xOcZ6NgEM=TAI0UMD6uR^Kc8IwO>ypvf>G_K8}EjiIvjom;> z66(8H@K){AVHF}RbURtluyPO6KK;z*haXY(#_^$sS5es$~G>`rZHS46o^w=r)2r6E5SAj zf=rfyyMaFsr4Ujd{O>mGAOV^G-`7Lp{Qrg;04_%T{uLKGc1h)c61q>gG8XbPC%N`o z45xPtm+(qxGG1+eMs2H!AP03niV+IN&3Le=_8DYpOpt~vJbo?fBR;vM~?X%dv1vmFVi>eSB02bH1Bx`8B zzKvcFm4->Ko7az7UET@QF2>>q4AjPLOkC&;>i}Y2QMXiz-&rl-Pk->`#Q5a?@}v*c zEk(yKog6I@`T2>@4_?~_vdZcSCbOD`2Qy#35^5~H2T`;vy_C&{)!?Gtt*WN+?r_+K z^Z;4ciO;mu@VI<&UahfcZ(O5J~X}@F2 zB0v_cMmc>~CsbI=fP7$1((yN^a4-~f6SU(i+=!KpR~LW8O07uUv(t4LDzvKGL2-ih z6dFOvO;`6(o=V`>Mug`T_ldD_znSN>RUTK7j)3(}u{uE|pACi?c&I#hVq&5+Qe!A5 z*?M%6Qv;}V^Aix^52>588$ZWN>%;^7^Z?cCFuBA$+zgZ1l`)TNzz2juY}u^stff4* z%fzZ8VTcRZX974U--#n;4&QfsGnDEq?$_i55{VNa5`?05doO&)@|!NZN8k!;M=N`(z9EhQTmUPqZxr zQOwB)M7OHVa{d#rppKw&lC8l~6n$n$g*r9>uZjSxz6IZF$eAvpfEdzc;7}aMGed{+ zC|iQl2fYa0XThi$p4(PlJ#xUlV~CY*i-13lParniBg(XmfpNF0@uA7a%^{0A-$qIX zuzbxp;BdMh7X>f7jIWH>?eej#Hc%(vy`#b29Xpn*CRNQ-`;>tk{Cnp{bj>8pHSlJ>0k-vb&U0yo@lcX!NDkPo1w0)bwVAzcxstf!g5&|zkO1P>UF;4*&$kF1n^b)< zz$ov&1arS&`B(r@VBiDJC;>wB?rI=en3vq(=g~B!Y{c%?@**ZR@^Z~59jS(If>$4Y zY|>}5l4Rx-n4i0qnE-;|X6;kcuyO$km;V*Ugzdzg6(t8w?pjk}&Tu{Oycj-=3;gj! zYzI1&==)8yEkK)W0RDXZG}n`+geL!w`tJKYYPMXjqt=sEXq#W2pW2nLwJfY%$lE7~ z^l5t=6&e@FJTh z0_JC+Pb(#vZn9OpoIST$%&bblcO@gOzT?+Ee$d-yA3wWDHw+^>pKGtG&p*`@hD0 zh;HMs27nb4cu&-ncYS9H+Xl&^LNue9;x((h5~C+rokdu&x^PA1Hvt>Vr+}w*k1wk; zJ5d^m&h0>;%p{O)L|HB%3fX*34@d8PpxtC{z9h2N8Aj|TUZ7~2TenEXiIg?&e{TAH zESPQjV1M$U4lw^?2CH~j!i_%T(Pg73Im?pb>kfW(AP)tP0ro(oqx)mOe#!}>)gZD` z9U2?H;m~*t5F7|Bq>~6O!t8DGG}gqSv4d&y_s71&%m;PIPtrGU01l$FO>9+uec}zauyf(DCE2bll@T(3GL#6^ zzaK9X=#cbY8SX?#C-I6Wa-U&tNPQ#v?JQ9rEh|ybA;yN%FISOtu;>m{CR(>{nT;L6 zQxt=mvN}5RhLU(ZvDD3~CfafhI}4qy1h5fcrAwsKcPVo{JyGhpr|}x*E4$(q_}NP& zb@?~yoc3|vwl;{j+TPc5aTieh_*<*n>*mA7rV)MQ(Hvnk1BvpPZN4Qv+9@ZP!lgZbP4px7By*=%-&i9EJB zPhO0b*E5t?bQY>6Azlb5tc=x^xqOAaDc+f+*g?MLAFOlA#(J_M^G)LN3h=k8&bxuX zJ|EkSm^~SRTMr@Rm?U8P@))nXYzHOre~Fc>{n#Yw9HLLzS^Zw}*5#|w#M=)5!J&4X zi^JV5w0mAE5xntMxS(;gjzrk+@b%y)m&7xC!y_Ugq)DD=(pA$ZgG$zNI-K0RJLTM8 zu>2*ShIIg;_ee0Tfe*uDy*POJUIJHnWNxRSMX3`cG@XKq*qG{8DcIRVm zt!L8YTY}m_knoN3&`z7$UYn}Py^_)j#s~fevlV%A#}O^TD>g{f&+ReEH+NNwELg^E zGaGUlY_E4I=a6tW+Sl#dWf;gh((z;^rBpMOOAh-5F{ZJkUt_S7^`Lo*Dljwp@A(Tk zI=si@I>Sj54S`z3yViB}(GpQFYKm$IBm1S}ZX=~R?sA!1^2v%1wtac8&U(qUpv*I* zn)cS`CRSs!2I7L3?$CT*El2(In+j*%Nf5ku(Y3-sW;tSeLWz`Uywh$tv;TMQvtFM} zLKAu{aJ7Nv>#Bo&EWHYhX1<|0h7mJ^)qclg=|GlI`mA_V*8`i;J%kRnER-w`u)jp8ea&vcY~kF357uW2URl+3W_tCp}}#;smXhebC`f{|kw*0!jeFYn9i%u?N;dneL2MTTXM zD!B#uKU)o64QxMoTO_h4P>uM&(Msfd>gUrQC5(Ug;}kvkZ|fNxnHTHm^0Kx#HDTl+ z@;T_rkn{jDD~c4Tloe5MK}?uOG%b*68B`a#-*`d+zt^Vk7qI6SYK!RPO26JbVVaLJ zN9rgU<$lq&IF(@Bn&06w+NEugk8O51e*5{%lo}s52~yUu-QV{QnEX&6ab^hEjVO$< zk;|zGPm#wKi>cNHy$xNeTDiwv?tNEYV*}nC)$zixyz;Vd&7@1kKx%f5i51qTCA|gJ z)ufzLAWg8a9$;_2?|tLJvSj^Q>)Y0ReJImM z)K4;D7ui5eqcqd}t;`;ln0z~bTtLhFluklk6VJ(sAWDx_Y`-=}=o+Hrz1?v}EcStm zDOy`RYg#`=11<_6%ab(voN?DTQTsjR?d%puocwc2DvZooy$oLtj`Q5Uchfv$8eu^h zU8wxd0GcPO8YGk@pC0_mZ(3Dw-Qv6Q&Bw3FN|PGGyWiVir^jHY%DOjR ze~~wSlzk(9vg;8WOC;XOPc<;C5)Mo*Fx!6}-OKlE`oLE&qJA^p$eh#2o5Vgpn@Cm| z9=S)Li{W;0@H9-J+a@WJQ4=e8A>3BE@m=W3WJ_R)iG1NYg|v{*QFE@ZI2=T{Re z>zSope(vUYoUvkEsF&q&P&B!$YYdsf0i=fy;iM!R`;Q1I#NeDCa@o}3!*KT2Pwv|V z6U8V|W*2j-xJtkHjbEJU`1CifF$T)NBG(qq8;vKeCf=)z>M6s~r}83lMRlx-OZI70=F{ zB+9Jn-`KzKeth|R|KBMLWPv^5B39%X-8|KpK}i9dJYwTo6sR^)(krXAtzG)jNd!Fl zT3hLBht?bki^^vWf~B9Oo0dZVS}7xVqzJ-is$Oel+l?SbGDt+p)DUu_JYKaBf2?W$ z+#l`m$`qN=5kVu^6>5y!`i%0s%{#)qQZIUuu%?Y?PWQ-P5g3(hwtih6h2@)Lf0$J- z^H)>%t1fDwi|7caKS=zxR!NcS1?2}$6V@XKYbQA2@>wyx!}jkXM@4Mec7ki*pVos8 z-}O`0JaeyAk*@O{`p4j!O{$`p$6?hC^M2{OBl&{4(uK4Q8o%{mZY0KE!pO{o z{$$7*!mZ4#$N>k(w9iNMSNu>IlE1FQV{B8B6iOq96)%qadAzXDj9>6>XL0|7i?PUb zU41|7>eEy1^(9ZF)$EFDOr>E#$D8=P@T@GW$avd-@=`7jZ(wzbfre zf?D|9Z4e=^5WbWB5d=Q5E4Wr|5A0&3q{!I1VzCU1iHV&aK^h8J4V)y}@6LHVh#EV< z_8Q_lKL%xKA&Sfu%#wHO;mpWq#jEv(?G}iOlirX<6h>;0)BWdt{+9Lnr~Ks6qJ>1k zozihft;w!P_r$K2NHg<^BuVCd7K^iI{1GMEeD9|_k;&3$2{w7f=IQuv|JXr^K*l55 zB0F;eq_Fl#v-)#lie3Af$la?XMsuMiaJo8hI-SG_TIA)gUE0dmSSD`sFwc#Q^z??9 z-L@DBX((NGWL8t!A-T%o(5j}|6^5#8JkDm`9-I5?QU|3?y`8-IkM*@wg$F{0)|GLC zI2=a*8+Mh#&+g=ng?LgxK`>0@LRp3<^x%L-y<&zkJVIEVXsA2&VLF{%R%|q0aL?{L zl#j}bI-8ZiLT6G^V4e3pdO1~B3&BdM7lWK1Ovjd%-WLDx3ip}U+utTJIKFg2@^IH; zC4SQWu?$bjC|93swS4xHDQBy&`=u;i5c%v{s-mpxMSJgc%OvvVBR0wTlo!gY#42}T zqWVTfJeDs8Yp;_#g%n#@x0+}@%fGz>OyHJAY21-+7&v0FU+Dm0Qko5_D7{9Q%6Ts} z;U)P?_mj%mY=vY2++7iS0iGA+FtuY0iR~ZC|9F4f=+yLvJyXxL`UXGQjsw}bQa$s6 zcYlPRY>iEbWf@zFI4p+?TW3{81VVNS!!bU_#1my)96xa!*94 z2v`&D>wU_>X3uPMQMz*4B4#XpF9u~Yv+(3lq?;eh5AEYl)5lY!KqKLtrDnd&V`c1x z>zv2Ug|$_2jVH+`y84~t83xT1F+D!z|WjQ)QR~_v$G@C>wb~khRHnX$?@aG3qL_xE@M6=o3*WbkUH6a^I4=v%>m1F z*FxC{q0@U?RXEzbqN{P#TrW4D!~U^K>2UopG0S8ueIpCED7+Pg;^E9<00r4L6fEK!cu3N~< z-=W@jadX{n>~cblXx-REEtej=%qx+mvd)3N1_T9$LLvr_OU9`5rt&LNQUxa>1qvch zDMI>qje9xW!32T$2djIWZ8&9W&FqvY(##r2Ne|?jCT1sMO2#APq*E83(`SEK;I3nP9f<3Bnnf6IJeH0{iO-Z)=SdMU^v#jC{3nuR zvA6C1$<0LmGvH76^6 zlBoId5_?hUKw4S%z}PK96E-3uk|($K=HtzmaY65P80G~|i_Pjhj^CAN4tUGM!xcj% zH&lK*;k+&DZ|!wa1Jyd+AM(0MiTO)G&yZPxz`LaFhYm`Xz5kq4JS_#<3&=8rdznPw zr5n~2`vM+g+f&@6iH{+dWqZ+)V<4ajsXO$PraP5enQnHwoq-D2JW`+li~!2owZ9O2 z+brtlIrD9FDL?%WoBXxBj&NT@k&H{eI4y&LFp7mvW0~5WCto||E_DW#$>7wM-;6Z! z{9W*#Lrh}`z^=O^lG}m(^vPS9{(k$smq{f6p3A!AFX`FvntZv)0Bv~)c}}X%Jd@oC z{Xn9dXVK$n&hYHIIFZJ8fl_>y=&l+1#Yus)Wek}O!{1>`vmB=66XX{Y9;6n2gr_!J zzj?IjH5Oju9OFC}=j5{WnkGecAN4IZf8q0y-IP~`GJHNWA!_e_d@SEQAEw8xgkR6R zfPIyUOl)r)opLVOYhWo^f1MGqkV|VC){GBQ&fy!;j`RjE*^zfWMBd!iKU-1nHfaA# zA=2|U6Tlw(s%0)Ki~jMQ9eK|Aisi*i*PLAx?^vwpJgV?Ka7J_Tca4?#Cl}lLNn;H? zjUwV=T3jlV*Z0%pM0B+uW8;6Ww0PO83bSlgES3OvWQCCbom;D8)QGPDJg; zpBMC;1?c-gvzB_B%$4_yXYVDSpwiiLj_Dw+*&=dckbHxeC(kiw_y?a2|7+RlC*CEv z9yK+0(>h;3_j+aiJpokadpuwUqTjrfIvmJ|;Oso?Rov~tv3wZ7B`vPX>1W~43 zsmN-%AadkAz~bwLFOVy`e6V@t_wJjHSa;>6vXnU9oXEfD-^>2yUZm;u{RU6t+UB+h`vkS7CnOzWz;o0$brld0J->PVM)V(CWMw^sEdp79W%&8JLi%na z`_EpAd7!jOWv+i_1U5UTp0GZuXOYT`1r2!2pI8{Y!m{$PxKa6KhHtLJIpg`C5xDgr zlK(r&obiJ0w*I*q<&mn3cEN7{t-{esXNuOqx9Iq+@L20Pi%GRy-}ZH$d?|po85~rJ!#ems%$FA`PQT~BTro7Cq+ z$9A{mnN}7A`MlTLgmI9oNs{NF^^tf2lULEO4s8QC;e9Zj# zWt+rd>A?$fNW#y0!7z^eBIoagjt)X*n!h5o!}849VA}7`y5hs)0ve?C)U+vT60?n(-ab{)nIfngV5LAR=Yiyrt~6-YBgt#EjcP7 z&d-2T0qVrWV-Le+?d*l3HCi zeJ1`(001U7fdVbR3?HkDpe1%UDb?s!-~|(NqWQ-^EpP(L!(*Ar3`GK#_Gu}}-1(8F zBk!G^oi0*y28Z7Oy7D|FH=fVdtCo+8{Zm>HRP3~I9qiSNvwOE!P>pv=i)0HHJhOvA zxR~-$KtSYOhxem5GB(Z^nDH#JMw(4SN}du?nj)?j>s4h*a;VU#!1`~4Pli&!$tv-~PuuuTbM z5{Iiytv*ZNe?_0r9P#hbxXbydH z3+Ldh%Dwddr1FlOuB(({qbI1m(mB1xRig(&sh7UDcD1Nm0oEHEYUV|1DlXc1DVQJ( z&5uS!ztMJ~(@|syUC905BZnj|C^KRdtGi~z>Adu`zZ>mtm14{{)>B_4HH@knYb&@! zDTpqExQ?cbgF(7^WXZbq$KWrs=ija8bvNWWykyS?Eu>*A$cSVwC^@6jav0a$gjkl7 zLsI1!)>5DGl=rkPC6%fS9+$2%D)AK;*~2Z%=4{s7E+=i1vsSOAMJnWWPXK)I!e1H8 zCq^@|CX`0}7%~hC+>tKEOhsJje$8J#Q!;lDB#InLefA)_xAekak9JQ+v;+;2R4}Sk+gGKmPNRtf`hElz>IS8FPGj^TuPt~{^zhwE zQE?|T{2FPgIw|}MT#gRCXov3YF5DdXF2nXdYTML*LLQXmFM$`CLxe_g=A-)-w|2b{ z&9`6k%uYNU&>KG&r`+E_ZCG8tUqebt&5FV1eKiuvpr!k}W-xvs1NY9G98qOr0oV0| z=U*A-r$>p~4J8<;juaW1I2sm2y|(y>IYj|b*TVag5zo-X@h%@(g90Ouvp^iVkuqE^ z5>1p3cI4g+8X2v4i@EqDAhKM1*u0C)?&yVX1oGEAO(b&Te1~}~wxp}2BtkEG&H-&$ zQ1;p!t=jJFcEZ`e^7yiLNnBjhXfeHwBo=U5oHM@U-6uv zNj>mG;~k5A3ChKkD-Qb>cSTMK^I<$(!ER13K9lX8Z(4NHn+w9$n1b410gcrbyfFn~ zFW|MEyfcj)vxZtt>_IK6AngeAngCw8{Ewt|G(`jLg7wIiym`SIZOasLW;GTxB2ZVK za{<2?tTc`5*j3G!_ekEITUx&P6)(GE%fK zdZDe8`)S)RxWDA>P;F2<0fc|)e)#>rw(Pna=)b@X3b_I|K2%71$#|~$4x&uG<5YL% z|FU4!2_u~rIv(SHe4i`-rF?7mCvi~L3?;l;;+?U<;fqNMsL?Lh{db&z;v4 zXMWu+I~bE-cZ5HE3@-b>j`406^nF;+RUOgKn)=|Vel*<-Xd=6-?nBRe+u_BhcbYhU zM~JQ&cM+(eTZ02W$&qXqyi1%ETE1opdS3;btHB~CUkZXi5m?;JyCVF})hXdjIsg*Q z{q&R&G$-35J|vw;^+yXld!~{yM1Q$?56J&zQ3jgrq`yu{>jNPc1gX~-r(!JcFm2!&6;tI`1_6`f_TwEN$dhFz6D% zZ7@L`C(uTq*k`lC{D$yIhHLRnjL-tv&cVi&kg0Mgf?=ug>l>C`0%_?z0^0G|np-26 zf_8p>s55)no*>xDu00OAC~UAy&^IZsBG5gN88Rs%_Qq#aJM%0CckZqbe@mPG|1SM0oTbm_NQjsmCD`&~Drz^FYU8ezt4BNN&sZF7u z>8x^%Wb?sG(^3WABUerosw=q2a3ObZ!{)%|lJys12p4$*)2w@8IfBLA2%9MQo>6J! zmbQW)XoT7dN1X`Dbj|^OyXO-R!GFoW{w2BtI=?!tzT0b@U`)^;67H?ep+rlKTc-_y_tWz8}WPWr&KDDey z*E&^#xp^TS4!CV8LBkWF2eh}W3uaDW51e2R_eDNwJD`2u@kB3;*Hv+qm|M|ZP-@BA zn-w!vX3MXDkkfPkGe~ z>{9}Bm35wkE_d~YvQhcMwz0IQjPfrlTl~3Pf%)h-9y4^TpYA>A>6Z2w(7Uqf#4H71 zCr48Xa{1xCbC!ikh+=J}G`bn+8^Wu|(@1<01?rpiPp5|+gy4eBF73JayMeAfJzF=R z-baiEjnRzG-s*m%N6*QMCLx`!zl|ECt(%K@;Ps0HZ6N1FMT2eC-o7n3zL`0ujdW;j zP&RqD>76B-vs3}vkz-7bFBBX zb}Z!9akI!$hPnW9xGPlWCt!Bc572SaZW8?_S-y4b{`C<%>zix05XI=yr_<&)!m!O^ zZJu85>vD#FV%9M)sAI|e1k0w4ex30**J5hhVz{VHr}i5+$x!z7?Ous8Sv+f?xK(P5 z_hLcS7U9mQ6eZ(`Aqetcyk);8mH$UlQY$*qXwNdKjJLs$uWhs~eypjxwQDi4G9rm6 zSDHb3FuSQOVi`R$CwD=%(=%h(;i7gnO0!^{@?(;%4nnVfGd5TzTa&zY_IFo>QOsq^ z{uArL$*j2UHcBHVo(?BcUB zHey4*B;Ydd&QdZ|WTVC^rqhgSEnKf7nM`6?3%Pyh#0{b=CqX%D&ieVy#sj$4_f=V( zAO@dA|1?%bk*)fb-MmXd;&_q0TvjAnf(gT7?l~l1gfi!n(RwRavzlYR;)g_YM06xb zbY?c?i)*Q}*Lh|@t`EL@mo_i<>qu3wD>q*{Z{O)$%~B*oeL4u7no#h@*Zof>TTUkB zbl?>!g>a+Jfi88*8zYIbR}iwr%08wZE1N}n=Ju!x2MzY0ATsJX-0!MRvJgh23PhK> zyiOLNE9i8MMr$eC8E=+t_Schp8cy;8p}JGTdZw8rkw4E>`gYkbmv@o?e zqB)Dj8gS#wY;-zZ-v^pL!-hojP&41h0AAc5PGt%|vUbYsK}fbkqs4UO(gZH`(kKJ% z$Fta~kcHr?m-_5Xi4*oOA7{FEt~vWga(!QzgA7I1j6_5svb~UrD;g}7Vu^pAV5YrA3JWrM2+MQQ>|BRv0{WYHHkjw5$;!ud2{$ z;X}jPY<7OdtA$)iT_gLzDkW$`t?v(TXe&vjDJ)PVni8k4){7v>YmFYEV)h9XN*jezzjqmCIs>y_EeNv)-Rf`d)S$#~FkQ$uVY z*?PzBoHAH8)Hc|eP&}ZG*dOHwF}0S@CTa*bcegW>A6ZII0-@Pyp=Cv?;AwAE3?gws z7_+=MqB}EJg6^2m@;@1-V{&;;df5+NiaLCIbUoF&-CP70vC6X9qO%-nw+g=9c45m` zn;F+TvR)7)=f%wnN|mFF?pHcH7_`OU>FKj>MV1|;wy|eQ4Acd(_G(Xx=mu{4vmGP} zI%3xGN=M0t1JEHfKP3?Df3Ot2+n9~vhnIXVmW?K@*QW9#=k8rVpPalo9v1^shls*` zjzzk4tecVx%Cb7!k2Dsql!!IK{Tn71XYj-c8IYLu*gL3r3{L2de_3#iPH*a>rLPHM zYV{iIYFY508VpOyzmT8n3)MEiOJd#xqN~-5HWb|}UUq+3JStR`I@w!-!{P6l?^Il# zy^WM|twTR$YAh5@cB0OkJU>&SH9 zvl=9)GFh!K1jqG*$?AT?P&geCQhQ|eo9Vr#7>t7H)e^f}9&tEfpc~bR2|2~OXqfDk zR+F}ik`y)=5w(WV{IQZx-z^tylk0(fID9U0sa2Vr_{8oC`WElJyW)~wi!DS-4c{L1 zA~d;Ru}gJ}xvBM=(CSPTsf{)5?n1H3Tg4L_oj*RegU62m!ED$0cVu?a_(K0^@jA84hDb<^J4hUic7VH0bvLigUmx^ zKD#C;BM=fRo?v|0)(=;Wn~{Pedga;glHc^|eWvh6~OayVd;QLJ%WwV)>&rtXFWeQ^k&BhELRnJOe6 zv)M-(+xKGHA^d|<0NrWIx=H#ku>{pr*;b}tXHh*DG2M#};C*3dAU6?xvbf}MEo0R*khb}U?s zNEftP;bBq_c z4M5lxp*J>KAigm7x-8ZN<6O^(Ud{GX<4>GSva@o)+|_mRc62CKGpjf_8`C6UXo zHMmgLX${GfSxe!Ux>fRY(hX#&C~ zpcgpO(1|Qu&|yWeATXXaPv9N3iE?Hl2)4V=gvjGMFZrN|H3_?3zR^T^_cw$65i99{ zHYfy?+QI}1BTw(WXp1K5?e6w+ze4!13m?glg}iQ zca;ApG2JaKvEqoLN>j*vQFE0`_+qrH6YF9eJa3qCRjv)Rzb<~$HqUPy`ay6pFb5?9(d}~}~c|Wq9!9HJ63sPn{dj7bd>c6PjNz3tLcN2C|JjHvsbM!O2o)7Hl zw@__T?FlvrpjcN* zXz1WZ%MlVcw}hjIb}t8jJ9b)4`~aPabe)Mk6%3!i`8EuJ_yow5)FVU8;bRS-^t+vE z9G0m{be`0*JB@-O73#hLA@d$*9+~7aG{v0Jwmc0twk$5xML-JxLg$QDrym|!z3_b| zudmQzku)&!j~N?mGCmY(-mL0NmVR?+{uhtkl~+NbdRI4p(1FXG)#jwO6n`Ia5WEjm z&Ka$o=@HeU>iH$WN{eEAtV$q`MD|>nkV1NIO&}`xP2y(O1zY7QYn{Ut1zID6U9T%rY^wlk zM~bQ^jRl+_?Zs>pNR^?HZ^5VSaeE~m$q1$^%Lq;Oo)r6<3_kI3ix~3i^|(S;?f^bN zl6}iT4oCo4IJ@E2(ToOH&9w@(B0(87HNa}}9sV^Eae4aNQEPz4mRMUZ$_1j>@6zgn zyP(QcA8cC+f((0oB2iCokna;S$VtMx(sGDiU$xa9m@9S5C|WDjwp<#ysvAMH`0j{2 zVOl&QeL`jc$W^S{80vl1)pC4r9fn~J;;*0;oyoC`j_xtpH|`do@+av%s$ zdA7>>%=$4ZacDp3?hr4>LiKJG&*wga7I3UX7T%a0Z9_!OtgrQm{6Tx33y9fnzpZ>@ zRP-4)*%@BIXe%wC^W2Q`0sk6yPNnzS z9;H{;V@(n53Wn#o5tCWPG)YspfW5Z9G^qV2NosGU(V)nGSU@~zipQcAT{mDopv^y( z&wKDi^kspYl(1nIx4642YO%K`0@Ir>^eYFOd2sFyRL~!o3R|2o>TbXU0!<}rzaf&# z)2L?1N1gh0YzG$=>-fV;ZK~_lIeVji?QF6cV}CXc!VveIgq?;B0&L-SGm|YDN(tFw z1RMQ1F_W9ib=11*P0Tlq_H*Wi*ZW5~_>VGG+85L-T8x@cW>sRd{@CrP;VJoBmU|l# zkD6D+91X-QCj_21M#@e12Y><23x@ZcG)H1cXo^p3xZHv!;9px3(D4v}SMOjQJKN;Vm9?1OLX09S&oXfEqS4~~aNjn- zfU=7N;F7?mqCn#p24irHhdYhx`uxVt9klV~5_9-Amb02?r)gtGW5+gNVW|uf26+Cj oZ2i|Z{Lg4t|NYzl+u!?lx)R1sv-3K&0*XS%lddP4js<4@6XCVsEC2ui literal 0 HcmV?d00001 diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/tailwind.config.js b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/tailwind.config.js new file mode 100644 index 000000000..9a3bb8684 --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/tailwind.config.js @@ -0,0 +1,9 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + darkMode: 'class', + content: ["./app/**/*.{ts,tsx,jsx,js}"], + theme: { + extend: {}, + }, + plugins: [], +} diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/tsconfig.json b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/tsconfig.json new file mode 100644 index 000000000..59879ebee --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/tsconfig.json @@ -0,0 +1,23 @@ +{ + "include": ["env.d.ts", "**/*.ts", "**/*.tsx"], + "compilerOptions": { + "lib": ["DOM", "DOM.Iterable", "ES2019"], + "isolatedModules": true, + "esModuleInterop": true, + "jsx": "react-jsx", + "module": "ESNext", + "moduleResolution": "Bundler", + "resolveJsonModule": true, + "target": "ES2022", + "strict": true, + "allowJs": true, + "forceConsistentCasingInFileNames": true, + "baseUrl": ".", + "paths": { + "~/*": ["./app/*"] + }, + + // Remix takes care of building everything in `remix build`. + "noEmit": true + } +} diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/vercel.json b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/vercel.json new file mode 100644 index 000000000..724d0678a --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/vercel.json @@ -0,0 +1,3 @@ +{ + "framework": "remix" +} diff --git a/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/vite.config.ts b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/vite.config.ts new file mode 100644 index 000000000..2b0a2e86b --- /dev/null +++ b/packages/remix/test/fixtures-vite/02-interactive-remix-routing-v2/vite.config.ts @@ -0,0 +1,13 @@ +import { vitePlugin as remix } from "@remix-run/dev"; +import { defineConfig } from "vite"; +import { vercelPreset } from "@vercel/remix/vite"; +import tsconfigPaths from "vite-tsconfig-paths"; + +export default defineConfig({ + plugins: [ + remix({ + presets: [vercelPreset()], + }), + tsconfigPaths(), + ], +}); diff --git a/packages/remix/test/integration-legacy.test.ts b/packages/remix/test/integration-legacy.test.ts new file mode 100644 index 000000000..553c7865e --- /dev/null +++ b/packages/remix/test/integration-legacy.test.ts @@ -0,0 +1,27 @@ +const fs = require('fs'); +const { join } = require('path'); + +const { + testDeployment, +} = require('../../../test/lib/deployment/test-deployment.js'); + +jest.setTimeout(12 * 60 * 1000); + +const fixturesPath = join(__dirname, 'fixtures-legacy'); +const exampleAbsolute = (name: string) => + join(__dirname, '..', '..', '..', 'examples', name); + +// eslint-disable-next-line no-restricted-syntax +for (const fixture of fs.readdirSync(fixturesPath)) { + // eslint-disable-next-line no-loop-func + it(`should build ${fixture}`, async () => { + await expect( + testDeployment(join(fixturesPath, fixture)) + ).resolves.toBeDefined(); + }); +} + +it(`should build remix example`, async () => { + const example = exampleAbsolute('remix'); + await expect(testDeployment(example)).resolves.toBeDefined(); +}); diff --git a/packages/remix/test/integration.test.ts b/packages/remix/test/integration-vite.test.ts similarity index 93% rename from packages/remix/test/integration.test.ts rename to packages/remix/test/integration-vite.test.ts index 86dc3b565..be1c764d4 100644 --- a/packages/remix/test/integration.test.ts +++ b/packages/remix/test/integration-vite.test.ts @@ -7,7 +7,7 @@ const { jest.setTimeout(12 * 60 * 1000); -const fixturesPath = join(__dirname, 'fixtures'); +const fixturesPath = join(__dirname, 'fixtures-vite'); const exampleAbsolute = (name: string) => join(__dirname, '..', '..', '..', 'examples', name); diff --git a/packages/remix/test/unit.ensure-resolvable.test.ts b/packages/remix/test/unit.ensure-resolvable.test.ts index ab7bf0bed..cd5ed4478 100644 --- a/packages/remix/test/unit.ensure-resolvable.test.ts +++ b/packages/remix/test/unit.ensure-resolvable.test.ts @@ -2,7 +2,7 @@ import { join } from 'path'; import { promises as fs } from 'fs'; import { ensureResolvable } from '../src/utils'; -const FIXTURES_DIR = join(__dirname, 'fixtures'); +const FIXTURES_DIR = join(__dirname, 'fixtures-legacy'); describe('ensureResolvable()', () => { it('should create a symlink in the node_modules within `start` with pnpm', async () => { diff --git a/packages/remix/test/unit.find-config.test.ts b/packages/remix/test/unit.find-config.test.ts index 8b1312a05..fe8c9331d 100644 --- a/packages/remix/test/unit.find-config.test.ts +++ b/packages/remix/test/unit.find-config.test.ts @@ -1,7 +1,7 @@ import { join } from 'path'; import { findConfig } from '../src/utils'; -const fixture = (name: string) => join(__dirname, 'fixtures', name); +const fixture = (name: string) => join(__dirname, 'fixtures-legacy', name); describe('findConfig()', () => { it.each([ diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 859e64a11..f1a97d795 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1381,6 +1381,9 @@ importers: packages/remix: dependencies: + '@vercel/error-utils': + specifier: 2.0.2 + version: link:../error-utils '@vercel/nft': specifier: 0.26.4 version: 0.26.4 diff --git a/utils/build-builder.mjs b/utils/build-builder.mjs index e9c0aa07d..16921d17b 100644 --- a/utils/build-builder.mjs +++ b/utils/build-builder.mjs @@ -7,13 +7,23 @@ */ import { join } from 'node:path'; import { readFileSync } from 'node:fs'; +import { fileURLToPath } from 'node:url'; import { esbuild } from './build.mjs'; -const pkgPath = join(process.cwd(), 'package.json'); -const pkg = JSON.parse(readFileSync(pkgPath, 'utf8')); -const externals = Object.keys(pkg.dependencies || {}); +export async function buildBuilder(opts, cwd = process.cwd()) { + const pkgPath = join(cwd, 'package.json'); + const pkg = JSON.parse(readFileSync(pkgPath, 'utf8')); + const externals = Object.keys(pkg.dependencies || {}); -await esbuild({ - bundle: true, - external: ['@vercel/build-utils', ...externals], -}); + await esbuild({ + bundle: true, + external: ['@vercel/build-utils', ...externals], + ...opts, + }); +} + +// If the script is invoked directly, do the +// common case of esbuild + tsc for types +if (fileURLToPath(import.meta.url) === process.argv[1]) { + await buildBuilder(); +}