From 91f7efe3652a8fdf27944235c855a92bfac370ae Mon Sep 17 00:00:00 2001 From: Matt Brophy Date: Fri, 29 Mar 2024 17:00:39 -0400 Subject: [PATCH 01/10] Bring back remix dev fixtures for unit tests This partially reverts commit c59aca047247cf684d51a61e744dd226c895e8b5. --- .../__tests__/fixtures/cloudflare/.gitignore | 7 + .../fixtures/cloudflare/.node-version | 1 + .../__tests__/fixtures/cloudflare/README.md | 22 +++ .../fixtures/cloudflare/app/root.tsx | 33 +++++ .../fixtures/cloudflare/app/routes/_index.tsx | 41 ++++++ .../fixtures/cloudflare/package.json | 32 +++++ .../fixtures/cloudflare/public/_headers | 4 + .../fixtures/cloudflare/public/_routes.json | 5 + .../fixtures/cloudflare/public/favicon.ico | Bin 0 -> 16958 bytes .../fixtures/cloudflare/remix.config.js | 14 ++ .../fixtures/cloudflare/remix.env.d.ts | 3 + .../__tests__/fixtures/cloudflare/server.ts | 9 ++ .../fixtures/cloudflare/tsconfig.json | 22 +++ .../__tests__/fixtures/deno/.gitignore | 6 + .../fixtures/deno/.vscode/extensions.json | 3 + .../deno/.vscode/resolve_npm_imports.json | 22 +++ .../fixtures/deno/.vscode/settings.json | 4 + .../__tests__/fixtures/deno/README.md | 128 ++++++++++++++++++ .../__tests__/fixtures/deno/app/root.tsx | 34 +++++ .../fixtures/deno/app/routes/_index.tsx | 42 ++++++ .../__tests__/fixtures/deno/deno.json | 6 + .../__tests__/fixtures/deno/package.json | 30 ++++ .../fixtures/deno/public/favicon.ico | Bin 0 -> 16958 bytes .../__tests__/fixtures/deno/remix.config.js | 13 ++ .../__tests__/fixtures/deno/server.ts | 13 ++ .../__tests__/fixtures/node/.gitignore | 6 + .../__tests__/fixtures/node/README.md | 38 ++++++ .../__tests__/fixtures/node/app/root.tsx | 33 +++++ .../fixtures/node/app/routes/_index.tsx | 41 ++++++ .../__tests__/fixtures/node/package.json | 30 ++++ .../fixtures/node/public/favicon.ico | Bin 0 -> 16958 bytes .../__tests__/fixtures/node/remix.config.js | 7 + .../__tests__/fixtures/node/remix.env.d.ts | 2 + .../__tests__/fixtures/node/tsconfig.json | 22 +++ 34 files changed, 673 insertions(+) create mode 100644 packages/remix-dev/__tests__/fixtures/cloudflare/.gitignore create mode 100644 packages/remix-dev/__tests__/fixtures/cloudflare/.node-version create mode 100644 packages/remix-dev/__tests__/fixtures/cloudflare/README.md create mode 100644 packages/remix-dev/__tests__/fixtures/cloudflare/app/root.tsx create mode 100644 packages/remix-dev/__tests__/fixtures/cloudflare/app/routes/_index.tsx create mode 100644 packages/remix-dev/__tests__/fixtures/cloudflare/package.json create mode 100644 packages/remix-dev/__tests__/fixtures/cloudflare/public/_headers create mode 100644 packages/remix-dev/__tests__/fixtures/cloudflare/public/_routes.json create mode 100644 packages/remix-dev/__tests__/fixtures/cloudflare/public/favicon.ico create mode 100644 packages/remix-dev/__tests__/fixtures/cloudflare/remix.config.js create mode 100644 packages/remix-dev/__tests__/fixtures/cloudflare/remix.env.d.ts create mode 100644 packages/remix-dev/__tests__/fixtures/cloudflare/server.ts create mode 100644 packages/remix-dev/__tests__/fixtures/cloudflare/tsconfig.json create mode 100644 packages/remix-dev/__tests__/fixtures/deno/.gitignore create mode 100644 packages/remix-dev/__tests__/fixtures/deno/.vscode/extensions.json create mode 100644 packages/remix-dev/__tests__/fixtures/deno/.vscode/resolve_npm_imports.json create mode 100644 packages/remix-dev/__tests__/fixtures/deno/.vscode/settings.json create mode 100644 packages/remix-dev/__tests__/fixtures/deno/README.md create mode 100644 packages/remix-dev/__tests__/fixtures/deno/app/root.tsx create mode 100644 packages/remix-dev/__tests__/fixtures/deno/app/routes/_index.tsx create mode 100644 packages/remix-dev/__tests__/fixtures/deno/deno.json create mode 100644 packages/remix-dev/__tests__/fixtures/deno/package.json create mode 100644 packages/remix-dev/__tests__/fixtures/deno/public/favicon.ico create mode 100644 packages/remix-dev/__tests__/fixtures/deno/remix.config.js create mode 100644 packages/remix-dev/__tests__/fixtures/deno/server.ts create mode 100644 packages/remix-dev/__tests__/fixtures/node/.gitignore create mode 100644 packages/remix-dev/__tests__/fixtures/node/README.md create mode 100644 packages/remix-dev/__tests__/fixtures/node/app/root.tsx create mode 100644 packages/remix-dev/__tests__/fixtures/node/app/routes/_index.tsx create mode 100644 packages/remix-dev/__tests__/fixtures/node/package.json create mode 100644 packages/remix-dev/__tests__/fixtures/node/public/favicon.ico create mode 100644 packages/remix-dev/__tests__/fixtures/node/remix.config.js create mode 100644 packages/remix-dev/__tests__/fixtures/node/remix.env.d.ts create mode 100644 packages/remix-dev/__tests__/fixtures/node/tsconfig.json diff --git a/packages/remix-dev/__tests__/fixtures/cloudflare/.gitignore b/packages/remix-dev/__tests__/fixtures/cloudflare/.gitignore new file mode 100644 index 0000000000..7c0736ebf5 --- /dev/null +++ b/packages/remix-dev/__tests__/fixtures/cloudflare/.gitignore @@ -0,0 +1,7 @@ +node_modules + +/.cache +/functions/\[\[path\]\].js +/functions/\[\[path\]\].js.map +/public/build +.dev.vars diff --git a/packages/remix-dev/__tests__/fixtures/cloudflare/.node-version b/packages/remix-dev/__tests__/fixtures/cloudflare/.node-version new file mode 100644 index 0000000000..5b0ad74a81 --- /dev/null +++ b/packages/remix-dev/__tests__/fixtures/cloudflare/.node-version @@ -0,0 +1 @@ +16.13.0 \ No newline at end of file diff --git a/packages/remix-dev/__tests__/fixtures/cloudflare/README.md b/packages/remix-dev/__tests__/fixtures/cloudflare/README.md new file mode 100644 index 0000000000..130feb1486 --- /dev/null +++ b/packages/remix-dev/__tests__/fixtures/cloudflare/README.md @@ -0,0 +1,22 @@ +# Welcome to Remix! + +- [Remix Docs](https://remix.run/docs) + +## Development + +You will be utilizing Wrangler for local development to emulate the Cloudflare runtime. This is already wired up in your package.json as the `dev` script: + +```sh +# start the remix dev server and wrangler +npm run dev +``` + +Open up [http://127.0.0.1:8788](http://127.0.0.1:8788) and you should be ready to go! + +## Deployment + +Cloudflare Pages are currently only deployable through their Git provider integrations. + +If you don't already have an account, then [create a Cloudflare account here](https://dash.cloudflare.com/sign-up/pages) and after verifying your email address with Cloudflare, go to your dashboard and follow the [Cloudflare Pages deployment guide](https://developers.cloudflare.com/pages/framework-guides/deploy-anything). + +Configure the "Build command" should be set to `npm run build`, and the "Build output directory" should be set to `public`. diff --git a/packages/remix-dev/__tests__/fixtures/cloudflare/app/root.tsx b/packages/remix-dev/__tests__/fixtures/cloudflare/app/root.tsx new file mode 100644 index 0000000000..68397b09d4 --- /dev/null +++ b/packages/remix-dev/__tests__/fixtures/cloudflare/app/root.tsx @@ -0,0 +1,33 @@ +import type { LinksFunction } from "@remix-run/cloudflare"; +import { cssBundleHref } from "@remix-run/css-bundle"; +import { + Links, + LiveReload, + Meta, + Outlet, + Scripts, + ScrollRestoration, +} from "@remix-run/react"; + +export const links: LinksFunction = () => [ + ...(cssBundleHref ? [{ rel: "stylesheet", href: cssBundleHref }] : []), +]; + +export default function App() { + return ( + + + + + + + + + + + + + + + ); +} diff --git a/packages/remix-dev/__tests__/fixtures/cloudflare/app/routes/_index.tsx b/packages/remix-dev/__tests__/fixtures/cloudflare/app/routes/_index.tsx new file mode 100644 index 0000000000..4aa6089f12 --- /dev/null +++ b/packages/remix-dev/__tests__/fixtures/cloudflare/app/routes/_index.tsx @@ -0,0 +1,41 @@ +import type { MetaFunction } from "@remix-run/cloudflare"; + +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-dev/__tests__/fixtures/cloudflare/package.json b/packages/remix-dev/__tests__/fixtures/cloudflare/package.json new file mode 100644 index 0000000000..c644afccb8 --- /dev/null +++ b/packages/remix-dev/__tests__/fixtures/cloudflare/package.json @@ -0,0 +1,32 @@ +{ + "private": true, + "sideEffects": false, + "type": "module", + "scripts": { + "build": "remix build", + "dev": "remix dev --manual -c \"npm run start\"", + "start": "wrangler pages dev --compatibility-date=2023-06-21 ./public", + "typecheck": "tsc" + }, + "dependencies": { + "@remix-run/cloudflare": "*", + "@remix-run/cloudflare-pages": "*", + "@remix-run/css-bundle": "*", + "@remix-run/react": "*", + "isbot": "^4.1.0", + "react": "^18.2.0", + "react-dom": "^18.2.0" + }, + "devDependencies": { + "@cloudflare/workers-types": "^4.20230518.0", + "@remix-run/dev": "*", + "@types/react": "^18.2.20", + "@types/react-dom": "^18.2.7", + "eslint": "^8.38.0", + "typescript": "^5.1.0", + "wrangler": "^3.1.1" + }, + "engines": { + "node": ">=18.0.0" + } +} diff --git a/packages/remix-dev/__tests__/fixtures/cloudflare/public/_headers b/packages/remix-dev/__tests__/fixtures/cloudflare/public/_headers new file mode 100644 index 0000000000..c5129f35cd --- /dev/null +++ b/packages/remix-dev/__tests__/fixtures/cloudflare/public/_headers @@ -0,0 +1,4 @@ +/favicon.ico + Cache-Control: public, max-age=3600, s-maxage=3600 +/build/* + Cache-Control: public, max-age=31536000, immutable diff --git a/packages/remix-dev/__tests__/fixtures/cloudflare/public/_routes.json b/packages/remix-dev/__tests__/fixtures/cloudflare/public/_routes.json new file mode 100644 index 0000000000..4b57270dae --- /dev/null +++ b/packages/remix-dev/__tests__/fixtures/cloudflare/public/_routes.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "include": ["/*"], + "exclude": ["/favicon.ico", "/build/*"] +} diff --git a/packages/remix-dev/__tests__/fixtures/cloudflare/public/favicon.ico b/packages/remix-dev/__tests__/fixtures/cloudflare/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..8830cf6821b354114848e6354889b8ecf6d2bc61 GIT binary patch literal 16958 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 EKbET!0{{R3 literal 0 HcmV?d00001 diff --git a/packages/remix-dev/__tests__/fixtures/cloudflare/remix.config.js b/packages/remix-dev/__tests__/fixtures/cloudflare/remix.config.js new file mode 100644 index 0000000000..88f8d63bbc --- /dev/null +++ b/packages/remix-dev/__tests__/fixtures/cloudflare/remix.config.js @@ -0,0 +1,14 @@ +/** @type {import('@remix-run/dev').AppConfig} */ +export default { + server: "./server.ts", + serverBuildPath: "functions/[[path]].js", + serverConditions: ["workerd", "worker", "browser"], + serverDependenciesToBundle: "all", + serverMainFields: ["browser", "module", "main"], + serverMinify: true, + serverModuleFormat: "esm", + serverPlatform: "neutral", + // appDirectory: "app", + // assetsBuildDirectory: "public/build", + // publicPath: "/build/", +}; diff --git a/packages/remix-dev/__tests__/fixtures/cloudflare/remix.env.d.ts b/packages/remix-dev/__tests__/fixtures/cloudflare/remix.env.d.ts new file mode 100644 index 0000000000..425870ae63 --- /dev/null +++ b/packages/remix-dev/__tests__/fixtures/cloudflare/remix.env.d.ts @@ -0,0 +1,3 @@ +/// +/// +/// diff --git a/packages/remix-dev/__tests__/fixtures/cloudflare/server.ts b/packages/remix-dev/__tests__/fixtures/cloudflare/server.ts new file mode 100644 index 0000000000..338a5e5737 --- /dev/null +++ b/packages/remix-dev/__tests__/fixtures/cloudflare/server.ts @@ -0,0 +1,9 @@ +import { logDevReady } from "@remix-run/cloudflare"; +import { createPagesFunctionHandler } from "@remix-run/cloudflare-pages"; +import * as build from "@remix-run/dev/server-build"; + +if (process.env.NODE_ENV === "development") { + logDevReady(build); +} + +export const onRequest = createPagesFunctionHandler({ build }); diff --git a/packages/remix-dev/__tests__/fixtures/cloudflare/tsconfig.json b/packages/remix-dev/__tests__/fixtures/cloudflare/tsconfig.json new file mode 100644 index 0000000000..28cce918b8 --- /dev/null +++ b/packages/remix-dev/__tests__/fixtures/cloudflare/tsconfig.json @@ -0,0 +1,22 @@ +{ + "include": ["remix.env.d.ts", "**/*.ts", "**/*.tsx"], + "compilerOptions": { + "lib": ["DOM", "DOM.Iterable", "ES2022"], + "isolatedModules": true, + "esModuleInterop": true, + "jsx": "react-jsx", + "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-dev/__tests__/fixtures/deno/.gitignore b/packages/remix-dev/__tests__/fixtures/deno/.gitignore new file mode 100644 index 0000000000..3f7bf98da3 --- /dev/null +++ b/packages/remix-dev/__tests__/fixtures/deno/.gitignore @@ -0,0 +1,6 @@ +node_modules + +/.cache +/build +/public/build +.env diff --git a/packages/remix-dev/__tests__/fixtures/deno/.vscode/extensions.json b/packages/remix-dev/__tests__/fixtures/deno/.vscode/extensions.json new file mode 100644 index 0000000000..74baffcc47 --- /dev/null +++ b/packages/remix-dev/__tests__/fixtures/deno/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["denoland.vscode-deno"] +} diff --git a/packages/remix-dev/__tests__/fixtures/deno/.vscode/resolve_npm_imports.json b/packages/remix-dev/__tests__/fixtures/deno/.vscode/resolve_npm_imports.json new file mode 100644 index 0000000000..af7431c1ee --- /dev/null +++ b/packages/remix-dev/__tests__/fixtures/deno/.vscode/resolve_npm_imports.json @@ -0,0 +1,22 @@ +{ + "comment": [ + "Resolve NPM imports for `packages/remix-deno`.", + "This import map is used solely for the denoland.vscode-deno extension.", + "Remix does not support import maps.", + "Dependency management is done through `npm` and `node_modules/` instead.", + "Deno-only dependencies may be imported via URL imports (without using import maps)." + ], + "imports": { + "@remix-run/css-bundle": "https://esm.sh/@remix-run/css-bundle@1.16.0", + "// `@remix-run/deno` code is already a Deno module, so just get types for it directly from `node_modules/`": "", + "@remix-run/deno": "../node_modules/@remix-run/deno/index.ts", + "@remix-run/dev/server-build": "https://esm.sh/@remix-run/dev@1.16.0/server-build", + "@remix-run/react": "https://esm.sh/@remix-run/react@1.16.0", + "@remix-run/server-runtime": "https://esm.sh/@remix-run/server-runtime@1.16.0", + "isbot": "https://esm.sh/isbot@^4.1.0", + "react": "https://esm.sh/react@^18.2.0", + "react-dom": "https://esm.sh/react-dom@^18.2.0", + "react-dom/client": "https://esm.sh/react-dom@^18.2.0/client", + "react-dom/server": "https://esm.sh/react-dom@^18.2.0/server" + } +} diff --git a/packages/remix-dev/__tests__/fixtures/deno/.vscode/settings.json b/packages/remix-dev/__tests__/fixtures/deno/.vscode/settings.json new file mode 100644 index 0000000000..e1533c2bb7 --- /dev/null +++ b/packages/remix-dev/__tests__/fixtures/deno/.vscode/settings.json @@ -0,0 +1,4 @@ +{ + "deno.enable": true, + "deno.lint": true +} diff --git a/packages/remix-dev/__tests__/fixtures/deno/README.md b/packages/remix-dev/__tests__/fixtures/deno/README.md new file mode 100644 index 0000000000..3e7473485e --- /dev/null +++ b/packages/remix-dev/__tests__/fixtures/deno/README.md @@ -0,0 +1,128 @@ +# Remix + Deno + +Welcome to the Deno template for Remix! 🦕 + +For more, check out the [Remix docs](https://remix.run/docs). + +## Install + +```sh +npx create-remix@latest --template remix-run/remix/templates/classic-remix-compiler/deno +``` + +## Managing dependencies + +Read about +[how we recommend to manage dependencies for Remix projects using Deno](https://github.com/remix-run/remix/blob/main/decisions/0001-use-npm-to-manage-npm-dependencies-for-deno-projects.md). + +- ✅ You should use `npm` to install NPM packages + ```sh + npm install react + ``` + ```ts + import { useState } from "react"; + ``` +- ✅ You may use inlined URL imports or + [deps.ts](https://deno.land/manual/examples/manage_dependencies#managing-dependencies) + for Deno modules. + ```ts + import { copy } from "https://deno.land/std@0.138.0/streams/conversion.ts"; + ``` +- ❌ Do not use + [import maps](https://deno.land/manual/linking_to_external_code/import_maps). + +## Development + +From your terminal: + +```sh +npm run dev +``` + +This starts your app in development mode, rebuilding assets on file changes. + +### Type hints + +This template provides type hinting to VS Code via a +[dedicated import map](./.vscode/resolve_npm_imports.json). + +To get types in another editor, use an extension for Deno that supports import +maps and point your editor to `./.vscode/resolve_npm_imports.json`. + +For more, see +[our decision doc for interop between Deno and NPM](https://github.com/remix-run/remix/blob/main/decisions/0001-use-npm-to-manage-npm-dependencies-for-deno-projects.md#vs-code-type-hints). + +## Production + +First, build your app for production: + +```sh +npm run build +``` + +Then run the app in production mode: + +```sh +npm start +``` + +## Deployment + +Building the Deno app (`npm run build`) results in two outputs: + +- `build/` (server bundle) +- `public/build/` (browser bundle) + +You can deploy these bundles to any host that runs Deno, but here we'll focus on +deploying to [Deno Deploy](https://deno.com/deploy). + +### Setting up Deno Deploy + +1. [Sign up](https://dash.deno.com/signin) for Deno Deploy. + +2. [Create a new Deno Deploy project](https://dash.deno.com/new) for this app. + +3. Replace `` in the `deploy` script in `package.json` + with your Deno Deploy project name: + +```json filename=package.json +{ + "scripts": { + "deploy": "deployctl deploy --project= --include=.cache,build,public ./build/index.js" + } +} +``` + +4. [Create a personal access token](https://dash.deno.com/account) for the Deno + Deploy API and export it as `DENO_DEPLOY_TOKEN`: + +```sh +export DENO_DEPLOY_TOKEN= +``` + +You may want to add this to your `rc` file (e.g. `.bashrc` or `.zshrc`) to make +it available for new terminal sessions, but make sure you don't commit this +token into `git`. If you want to use this token in GitHub Actions, set it as a +GitHub secret. + +5. Install the Deno Deploy CLI, + [`deployctl`](https://github.com/denoland/deployctl): + +```sh +deno install --allow-read --allow-write --allow-env --allow-net --allow-run --no-check -r -f https://deno.land/x/deploy/deployctl.ts +``` + +6. If you have previously installed the Deno Deploy CLI, you should update it to + the latest version: + +```sh +deployctl upgrade +``` + +### Deploying to Deno Deploy + +After you've set up Deno Deploy, run: + +```sh +npm run deploy +``` diff --git a/packages/remix-dev/__tests__/fixtures/deno/app/root.tsx b/packages/remix-dev/__tests__/fixtures/deno/app/root.tsx new file mode 100644 index 0000000000..60ddcdf8f8 --- /dev/null +++ b/packages/remix-dev/__tests__/fixtures/deno/app/root.tsx @@ -0,0 +1,34 @@ +import { cssBundleHref } from "@remix-run/css-bundle"; +import type { LinksFunction } from "@remix-run/deno"; +import { + Links, + LiveReload, + Meta, + Outlet, + Scripts, + ScrollRestoration, +} from "@remix-run/react"; +import * as React from "react"; + +export const links: LinksFunction = () => [ + ...(cssBundleHref ? [{ rel: "stylesheet", href: cssBundleHref }] : []), +]; + +export default function App() { + return ( + + + + + + + + + + + + + + + ); +} diff --git a/packages/remix-dev/__tests__/fixtures/deno/app/routes/_index.tsx b/packages/remix-dev/__tests__/fixtures/deno/app/routes/_index.tsx new file mode 100644 index 0000000000..2e62fab622 --- /dev/null +++ b/packages/remix-dev/__tests__/fixtures/deno/app/routes/_index.tsx @@ -0,0 +1,42 @@ +import * as React from "react"; +import type { MetaFunction } from "@remix-run/deno"; + +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-dev/__tests__/fixtures/deno/deno.json b/packages/remix-dev/__tests__/fixtures/deno/deno.json new file mode 100644 index 0000000000..67973e8d59 --- /dev/null +++ b/packages/remix-dev/__tests__/fixtures/deno/deno.json @@ -0,0 +1,6 @@ +{ + "importMap": ".vscode/resolve_npm_imports.json", + "compilerOptions": { + "lib": ["dom", "dom.iterable", "dom.asynciterable", "deno.ns"] + } +} diff --git a/packages/remix-dev/__tests__/fixtures/deno/package.json b/packages/remix-dev/__tests__/fixtures/deno/package.json new file mode 100644 index 0000000000..7a4554c403 --- /dev/null +++ b/packages/remix-dev/__tests__/fixtures/deno/package.json @@ -0,0 +1,30 @@ +{ + "private": true, + "sideEffects": false, + "scripts": { + "build": "remix build", + "deploy": "deployctl deploy --prod --include=build,public --project= ./build/index.js", + "dev": "npm-run-all build --parallel \"dev:*\"", + "dev:deno": "NODE_ENV=development deno run --unstable --watch --allow-net --allow-read --allow-env ./build/index.js", + "dev:remix": "remix watch", + "format": "deno fmt --ignore=node_modules,build,public/build", + "lint": "deno lint --ignore=node_modules,build,public/build", + "start": "NODE_ENV=production deno run --unstable --allow-net --allow-read --allow-env ./build/index.js", + "typecheck": "deno check" + }, + "dependencies": { + "@remix-run/css-bundle": "*", + "@remix-run/deno": "*", + "@remix-run/react": "*", + "isbot": "^4.1.0", + "react": "^18.2.0", + "react-dom": "^18.2.0" + }, + "devDependencies": { + "@remix-run/dev": "*", + "npm-run-all": "^4.1.5" + }, + "engines": { + "node": ">=18.0.0" + } +} diff --git a/packages/remix-dev/__tests__/fixtures/deno/public/favicon.ico b/packages/remix-dev/__tests__/fixtures/deno/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..8830cf6821b354114848e6354889b8ecf6d2bc61 GIT binary patch literal 16958 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 EKbET!0{{R3 literal 0 HcmV?d00001 diff --git a/packages/remix-dev/__tests__/fixtures/deno/remix.config.js b/packages/remix-dev/__tests__/fixtures/deno/remix.config.js new file mode 100644 index 0000000000..cd3a46d297 --- /dev/null +++ b/packages/remix-dev/__tests__/fixtures/deno/remix.config.js @@ -0,0 +1,13 @@ +/** @type {import('@remix-run/dev').AppConfig} */ +module.exports = { + server: "./server.ts", + serverConditions: ["deno", "worker"], + serverDependenciesToBundle: "all", + serverMainFields: ["module", "main"], + serverModuleFormat: "esm", + serverPlatform: "neutral", + // appDirectory: "app", + // assetsBuildDirectory: "public/build", + // publicPath: "/build/", + // serverBuildPath: "build/index.js", +}; diff --git a/packages/remix-dev/__tests__/fixtures/deno/server.ts b/packages/remix-dev/__tests__/fixtures/deno/server.ts new file mode 100644 index 0000000000..a7caa47e20 --- /dev/null +++ b/packages/remix-dev/__tests__/fixtures/deno/server.ts @@ -0,0 +1,13 @@ +import { serve } from "https://deno.land/std@0.128.0/http/server.ts"; +import { createRequestHandlerWithStaticFiles } from "@remix-run/deno"; +// Import path interpreted by the Remix compiler +import * as build from "@remix-run/dev/server-build"; + +const remixHandler = createRequestHandlerWithStaticFiles({ + build, + getLoadContext: () => ({}), +}); + +const port = Number(Deno.env.get("PORT")) || 8000; +console.log(`Listening on http://localhost:${port}`); +serve(remixHandler, { port }); diff --git a/packages/remix-dev/__tests__/fixtures/node/.gitignore b/packages/remix-dev/__tests__/fixtures/node/.gitignore new file mode 100644 index 0000000000..3f7bf98da3 --- /dev/null +++ b/packages/remix-dev/__tests__/fixtures/node/.gitignore @@ -0,0 +1,6 @@ +node_modules + +/.cache +/build +/public/build +.env diff --git a/packages/remix-dev/__tests__/fixtures/node/README.md b/packages/remix-dev/__tests__/fixtures/node/README.md new file mode 100644 index 0000000000..da8d02ad77 --- /dev/null +++ b/packages/remix-dev/__tests__/fixtures/node/README.md @@ -0,0 +1,38 @@ +# Welcome to Remix! + +- [Remix Docs](https://remix.run/docs) + +## Development + +From your terminal: + +```sh +npm run dev +``` + +This starts your app in development mode, rebuilding assets on file changes. + +## 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 `remix build` + +- `build/` +- `public/build/` diff --git a/packages/remix-dev/__tests__/fixtures/node/app/root.tsx b/packages/remix-dev/__tests__/fixtures/node/app/root.tsx new file mode 100644 index 0000000000..b46b8fb15b --- /dev/null +++ b/packages/remix-dev/__tests__/fixtures/node/app/root.tsx @@ -0,0 +1,33 @@ +import { cssBundleHref } from "@remix-run/css-bundle"; +import type { LinksFunction } from "@remix-run/node"; +import { + Links, + LiveReload, + Meta, + Outlet, + Scripts, + ScrollRestoration, +} from "@remix-run/react"; + +export const links: LinksFunction = () => [ + ...(cssBundleHref ? [{ rel: "stylesheet", href: cssBundleHref }] : []), +]; + +export default function App() { + return ( + + + + + + + + + + + + + + + ); +} diff --git a/packages/remix-dev/__tests__/fixtures/node/app/routes/_index.tsx b/packages/remix-dev/__tests__/fixtures/node/app/routes/_index.tsx new file mode 100644 index 0000000000..5347369230 --- /dev/null +++ b/packages/remix-dev/__tests__/fixtures/node/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-dev/__tests__/fixtures/node/package.json b/packages/remix-dev/__tests__/fixtures/node/package.json new file mode 100644 index 0000000000..26280f9db3 --- /dev/null +++ b/packages/remix-dev/__tests__/fixtures/node/package.json @@ -0,0 +1,30 @@ +{ + "private": true, + "sideEffects": false, + "type": "module", + "scripts": { + "build": "remix build", + "dev": "remix dev", + "start": "remix-serve build/index.js", + "typecheck": "tsc" + }, + "dependencies": { + "@remix-run/css-bundle": "*", + "@remix-run/node": "*", + "@remix-run/react": "*", + "@remix-run/serve": "*", + "isbot": "^4.1.0", + "react": "^18.2.0", + "react-dom": "^18.2.0" + }, + "devDependencies": { + "@remix-run/dev": "*", + "@types/react": "^18.2.20", + "@types/react-dom": "^18.2.7", + "eslint": "^8.38.0", + "typescript": "^5.1.6" + }, + "engines": { + "node": ">=18.0.0" + } +} diff --git a/packages/remix-dev/__tests__/fixtures/node/public/favicon.ico b/packages/remix-dev/__tests__/fixtures/node/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..8830cf6821b354114848e6354889b8ecf6d2bc61 GIT binary patch literal 16958 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 EKbET!0{{R3 literal 0 HcmV?d00001 diff --git a/packages/remix-dev/__tests__/fixtures/node/remix.config.js b/packages/remix-dev/__tests__/fixtures/node/remix.config.js new file mode 100644 index 0000000000..015e2b7085 --- /dev/null +++ b/packages/remix-dev/__tests__/fixtures/node/remix.config.js @@ -0,0 +1,7 @@ +/** @type {import('@remix-run/dev').AppConfig} */ +export default { + // appDirectory: "app", + // assetsBuildDirectory: "public/build", + // publicPath: "/build/", + // serverBuildPath: "build/index.js", +}; diff --git a/packages/remix-dev/__tests__/fixtures/node/remix.env.d.ts b/packages/remix-dev/__tests__/fixtures/node/remix.env.d.ts new file mode 100644 index 0000000000..dcf8c45e1d --- /dev/null +++ b/packages/remix-dev/__tests__/fixtures/node/remix.env.d.ts @@ -0,0 +1,2 @@ +/// +/// diff --git a/packages/remix-dev/__tests__/fixtures/node/tsconfig.json b/packages/remix-dev/__tests__/fixtures/node/tsconfig.json new file mode 100644 index 0000000000..28cce918b8 --- /dev/null +++ b/packages/remix-dev/__tests__/fixtures/node/tsconfig.json @@ -0,0 +1,22 @@ +{ + "include": ["remix.env.d.ts", "**/*.ts", "**/*.tsx"], + "compilerOptions": { + "lib": ["DOM", "DOM.Iterable", "ES2022"], + "isolatedModules": true, + "esModuleInterop": true, + "jsx": "react-jsx", + "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 + } +} From 0e48df0531a5a078c3fe7426bf63e7c6c797aa11 Mon Sep 17 00:00:00 2001 From: Matt Brophy Date: Fri, 29 Mar 2024 17:01:29 -0400 Subject: [PATCH 02/10] Fix test using new fixture instead of stack fixture --- packages/remix-dev/__tests__/readConfig-test.ts | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/packages/remix-dev/__tests__/readConfig-test.ts b/packages/remix-dev/__tests__/readConfig-test.ts index b521261815..6fd9d84246 100644 --- a/packages/remix-dev/__tests__/readConfig-test.ts +++ b/packages/remix-dev/__tests__/readConfig-test.ts @@ -3,7 +3,7 @@ import path from "node:path"; import type { RemixConfig } from "../config"; import { readConfig } from "../config"; -const remixRoot = path.join(__dirname, "fixtures", "stack"); +const remixRoot = path.join(__dirname, "fixtures", "node"); describe("readConfig", () => { let config: RemixConfig; @@ -33,7 +33,7 @@ describe("readConfig", () => { "dev": {}, "entryClientFile": "entry.client.tsx", "entryClientFilePath": Any, - "entryServerFile": "entry.server.tsx", + "entryServerFile": "entry.server.node.tsx", "entryServerFilePath": Any, "future": { "unstable_singleFetch": false, @@ -52,6 +52,13 @@ describe("readConfig", () => { "id": "root", "path": "", }, + "routes/_index": { + "file": "routes/_index.tsx", + "id": "routes/_index", + "index": true, + "parentId": "root", + "path": undefined, + }, }, "serverBuildPath": Any, "serverBuildTargetEntryModule": "export * from "@remix-run/dev/server-build";", From cae0eaeef6591e8f07e6b5559fd38fdc39ef221f Mon Sep 17 00:00:00 2001 From: Matt Brophy Date: Fri, 29 Mar 2024 17:01:11 -0400 Subject: [PATCH 03/10] Remove remix init tests --- packages/remix-dev/__tests__/init-test.ts | 152 ---------------------- 1 file changed, 152 deletions(-) delete mode 100644 packages/remix-dev/__tests__/init-test.ts diff --git a/packages/remix-dev/__tests__/init-test.ts b/packages/remix-dev/__tests__/init-test.ts deleted file mode 100644 index 63607af575..0000000000 --- a/packages/remix-dev/__tests__/init-test.ts +++ /dev/null @@ -1,152 +0,0 @@ -import * as os from "node:os"; -import * as path from "node:path"; -import fse from "fs-extra"; -import stripAnsi from "strip-ansi"; - -import { run } from "../cli/run"; - -// this is so we can mock execSync for "npm install" and the like -jest.mock("child_process", () => { - let cp = jest.requireActual( - "child_process" - ) as typeof import("child_process"); - let installDepsCmdPattern = /^(npm|yarn|pnpm) install$/; - let configGetCmdPattern = /^(npm|yarn|pnpm) config get/; - - return { - ...cp, - execSync: jest.fn( - (command: string, options: Parameters[1]) => { - // this prevents us from having to run the install process - // and keeps our console output clean - if ( - installDepsCmdPattern.test(command) || - configGetCmdPattern.test(command) - ) { - return "sample stdout"; - } - return cp.execSync(command, options); - } - ), - }; -}); - -const TEMP_DIR = path.join( - fse.realpathSync(os.tmpdir()), - `remix-tests-${Math.random().toString(32).slice(2)}` -); - -beforeAll(async () => { - await fse.remove(TEMP_DIR); - await fse.ensureDir(TEMP_DIR); -}); - -afterAll(async () => { - await fse.remove(TEMP_DIR); -}); - -let output: string; -let originalLog = console.log; -let originalWarn = console.warn; -let originalError = console.error; - -beforeEach(async () => { - output = ""; - function hijackLog(message: unknown = "", ...rest: Array) { - // if you need to debug stuff, then use: - // console.log('debug:', 'whatever you need to say'); - if (typeof message === "string" && message.startsWith("debug:")) { - return originalLog(message, ...rest); - } - let messageString = - typeof message === "string" ? message : JSON.stringify(message, null, 2); - if (rest[0]) { - throw new Error( - "Our tests are not set up to handle multiple arguments to console.log." - ); - } - output += "\n" + stripAnsi(messageString).replace(TEMP_DIR, ""); - } - console.log = hijackLog; - console.warn = hijackLog; - console.error = hijackLog; -}); - -afterEach(() => { - console.log = originalLog; - console.warn = originalWarn; - console.error = originalError; -}); - -describe("the init command", () => { - let tempDirs = new Set(); - let originalCwd = process.cwd(); - - beforeEach(() => { - process.chdir(TEMP_DIR); - jest.clearAllMocks(); - }); - - afterEach(async () => { - process.chdir(originalCwd); - for (let dir of tempDirs) { - await fse.remove(dir); - } - tempDirs = new Set(); - }); - - async function getProjectDir(name: string) { - let tmpDir = path.join(TEMP_DIR, name); - tempDirs.add(tmpDir); - return tmpDir; - } - - it("runs remix.init script when using `remix init`", async () => { - let projectDir = await getProjectDir("remix-init-manual"); - - fse.copySync( - path.join(__dirname, "fixtures", "successful-remix-init"), - projectDir - ); - process.chdir(path.join(projectDir)); - await run(["init"]); - - expect(output).toBe(""); - expect(fse.existsSync(path.join(projectDir, "test.txt"))).toBeTruthy(); - expect(fse.existsSync(path.join(projectDir, "remix.init"))).toBeFalsy(); - }); - - it("keeps the `remix.init` script when using the `--no-delete` flag", async () => { - let projectDir = await getProjectDir("remix-init-manual"); - - fse.copySync( - path.join(__dirname, "fixtures", "successful-remix-init"), - projectDir - ); - process.chdir(projectDir); - await run(["init", "--no-delete"]); - - expect(output).toBe(""); - expect(fse.existsSync(path.join(projectDir, "remix.init"))).toBeTruthy(); - }); - - it("throws an error when invalid remix.init script when manually ran", async () => { - let projectDir = await getProjectDir("invalid-remix-init-manual"); - - fse.copySync( - path.join(__dirname, "fixtures", "failing-remix-init"), - projectDir - ); - process.chdir(projectDir); - await expect(run(["init"])).rejects.toThrowError( - `🚨 Oops, remix.init failed` - ); - // we should keep remix.init around if the init script fails - expect(fse.existsSync(path.join(projectDir, "remix.init"))).toBeTruthy(); - }); -}); - -/* -eslint - @typescript-eslint/consistent-type-imports: "off", -*/ From 71b785c322afa36a3be49abd863d1fd196d0133c Mon Sep 17 00:00:00 2001 From: Matt Brophy Date: Fri, 29 Mar 2024 17:10:20 -0400 Subject: [PATCH 04/10] Fix remaining unit tests --- jest/jest.config.shared.js | 3 +++ packages/remix-node/__tests__/setup.ts | 3 ++- packages/remix-server-runtime/__tests__/setup.ts | 2 +- packages/remix-testing/__tests__/stub-test.tsx | 2 +- packages/remix-testing/jest.config.js | 3 +++ 5 files changed, 10 insertions(+), 3 deletions(-) diff --git a/jest/jest.config.shared.js b/jest/jest.config.shared.js index cf7bcfbdb7..e0cf35da06 100644 --- a/jest/jest.config.shared.js +++ b/jest/jest.config.shared.js @@ -15,6 +15,9 @@ module.exports = { "^react-router-dom-v5-compat$": "/../react-router-dom-v5-compat/index.ts", "^react-router-native$": "/../react-router-native/index.tsx", + "^@web3-storage/multipart-parser$": require.resolve( + "@web3-storage/multipart-parser" + ), }, modulePathIgnorePatterns: ignorePatterns, setupFiles: ["/__tests__/setup.ts"], diff --git a/packages/remix-node/__tests__/setup.ts b/packages/remix-node/__tests__/setup.ts index 917305ac93..53d59d28c0 100644 --- a/packages/remix-node/__tests__/setup.ts +++ b/packages/remix-node/__tests__/setup.ts @@ -1,2 +1,3 @@ -import { installGlobals } from "@remix-run/node"; +import { installGlobals } from "../globals"; + installGlobals(); diff --git a/packages/remix-server-runtime/__tests__/setup.ts b/packages/remix-server-runtime/__tests__/setup.ts index 451031301a..a6306af2a0 100644 --- a/packages/remix-server-runtime/__tests__/setup.ts +++ b/packages/remix-server-runtime/__tests__/setup.ts @@ -1,3 +1,3 @@ -import { installGlobals } from "@remix-run/node"; +import { installGlobals } from "../../remix-node/globals"; installGlobals(); diff --git a/packages/remix-testing/__tests__/stub-test.tsx b/packages/remix-testing/__tests__/stub-test.tsx index 956c9c5d0f..a2a8c07ae8 100644 --- a/packages/remix-testing/__tests__/stub-test.tsx +++ b/packages/remix-testing/__tests__/stub-test.tsx @@ -9,7 +9,7 @@ import { useFetcher, useLoaderData, useMatches, -} from "@remix-run/react"; +} from "react-router-dom"; import type { LoaderFunctionArgs } from "@remix-run/node"; import { json } from "@remix-run/node"; diff --git a/packages/remix-testing/jest.config.js b/packages/remix-testing/jest.config.js index 483aa32c42..b9c8381c03 100644 --- a/packages/remix-testing/jest.config.js +++ b/packages/remix-testing/jest.config.js @@ -5,4 +5,7 @@ module.exports = { setupFiles: [], testEnvironment: "jsdom", setupFilesAfterEnv: ["@testing-library/jest-dom", "./jest.setup.js"], + globals: { + __DEV__: true, + }, }; From 01d97b3f1519b2e098110131ebecfefccd53ab28 Mon Sep 17 00:00:00 2001 From: Matt Brophy Date: Mon, 1 Apr 2024 14:54:42 -0400 Subject: [PATCH 05/10] Add missing dep --- package.json | 1 + pnpm-lock.yaml | 14 +++++++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 278ec0c6f6..8414dc6ba4 100644 --- a/package.json +++ b/package.json @@ -54,6 +54,7 @@ "@rollup/plugin-typescript": "^8.5.0", "@testing-library/jest-dom": "5.17.0", "@testing-library/react": "^13.4.0", + "@testing-library/user-event": "^14.5.2", "@types/jest": "^29.5.4", "@types/jsdom": "^21.1.1", "@types/jsonfile": "^6.1.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3f58e6c63b..d3fec04b4f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -81,6 +81,9 @@ importers: '@testing-library/react': specifier: ^13.4.0 version: 13.4.0(react-dom@18.2.0)(react@18.2.0) + '@testing-library/user-event': + specifier: ^14.5.2 + version: 14.5.2(@testing-library/dom@8.17.1) '@types/jest': specifier: ^29.5.4 version: 29.5.12 @@ -1901,7 +1904,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.3 - '@babel/helper-module-imports': 7.24.3 + '@babel/helper-module-imports': 7.22.5 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-remap-async-to-generator': 7.22.9(@babel/core@7.24.3) dev: true @@ -5474,6 +5477,15 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: false + /@testing-library/user-event@14.5.2(@testing-library/dom@8.17.1): + resolution: {integrity: sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ==} + engines: {node: '>=12', npm: '>=6'} + peerDependencies: + '@testing-library/dom': '>=7.21.4' + dependencies: + '@testing-library/dom': 8.17.1 + dev: false + /@tootallnate/once@2.0.0: resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} engines: {node: '>= 10'} From 08cd345e4ed2e06518806e0d5200e64f0f7dcbed Mon Sep 17 00:00:00 2001 From: Matt Brophy Date: Mon, 1 Apr 2024 14:56:20 -0400 Subject: [PATCH 06/10] Remove watchPlugins --- jest/jest.config.shared.js | 5 -- package.json | 2 - pnpm-lock.yaml | 106 ------------------------------------- 3 files changed, 113 deletions(-) diff --git a/jest/jest.config.shared.js b/jest/jest.config.shared.js index e0cf35da06..b30c83b8de 100644 --- a/jest/jest.config.shared.js +++ b/jest/jest.config.shared.js @@ -26,9 +26,4 @@ module.exports = { "\\.[jt]sx?$": require.resolve("./transform"), }, watchPathIgnorePatterns: [...ignorePatterns, "\\/node_modules\\/"], - watchPlugins: [ - require.resolve("jest-watch-select-projects"), - require.resolve("jest-watch-typeahead/filename"), - require.resolve("jest-watch-typeahead/testname"), - ], }; diff --git a/package.json b/package.json index 8414dc6ba4..61ebb8bbda 100644 --- a/package.json +++ b/package.json @@ -84,8 +84,6 @@ "history": "^5.3.0", "jest": "^29.6.4", "jest-environment-jsdom": "^29.6.2", - "jest-watch-select-projects": "^2.0.0", - "jest-watch-typeahead": "^2.2.2", "jsonfile": "^6.1.0", "prettier": "^2.8.8", "prompt-confirm": "^2.0.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d3fec04b4f..0e913b2a92 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -171,12 +171,6 @@ importers: jest-environment-jsdom: specifier: ^29.6.2 version: 29.6.2 - jest-watch-select-projects: - specifier: ^2.0.0 - version: 2.0.0 - jest-watch-typeahead: - specifier: ^2.2.2 - version: 2.2.2(jest@29.7.0) jsonfile: specifier: ^6.1.0 version: 6.1.0 @@ -4282,18 +4276,6 @@ packages: engines: {node: '>=8'} dev: false - /@jest/console@29.6.2: - resolution: {integrity: sha512-0N0yZof5hi44HAR2pPS+ikJ3nzKNoZdVu8FffRf3wy47I7Dm7etk/3KetMdRUqzVd16V4O2m2ISpNTbnIuqy1w==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.6.3 - '@types/node': 18.19.26 - chalk: 4.1.2 - jest-message-util: 29.7.0 - jest-util: 29.7.0 - slash: 3.0.0 - dev: false - /@jest/console@29.7.0: resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -4486,16 +4468,6 @@ packages: graceful-fs: 4.2.11 dev: false - /@jest/test-result@29.6.2: - resolution: {integrity: sha512-3VKFXzcV42EYhMCsJQURptSqnyjqCGbtLuX5Xxb6Pm6gUf1wIRIl+mandIRGJyWKgNKYF9cnstti6Ls5ekduqw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/console': 29.6.2 - '@jest/types': 29.6.3 - '@types/istanbul-lib-coverage': 2.0.4 - collect-v8-coverage: 1.0.1 - dev: false - /@jest/test-result@29.7.0: resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -6411,13 +6383,6 @@ packages: dependencies: type-fest: 0.21.3 - /ansi-escapes@6.2.0: - resolution: {integrity: sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw==} - engines: {node: '>=14.16'} - dependencies: - type-fest: 3.13.1 - dev: false - /ansi-fragments@0.2.1: resolution: {integrity: sha512-DykbNHxuXQwUDRv5ibc2b0x7uw7wmwOGLBUd5RmaQ5z8Lhx19vwvKV+FAsM5rEA6dEcHxX+/Ad5s9eF2k2bB+w==} dependencies: @@ -7399,21 +7364,11 @@ packages: ansi-styles: 4.3.0 supports-color: 7.2.0 - /chalk@5.3.0: - resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - dev: false - /char-regex@1.0.2: resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} engines: {node: '>=10'} dev: false - /char-regex@2.0.1: - resolution: {integrity: sha512-oSvEeo6ZUD7NepqAat3RqoucZ5SeqLJgOvVIwkafu6IP3V0pO38s/ypdVUmDDK6qIIHNlYHJAKX9E7R7HoKElw==} - engines: {node: '>=12.20'} - dev: false - /character-entities-html4@2.1.0: resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} dev: false @@ -10624,11 +10579,6 @@ packages: engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dev: true - /jest-regex-util@29.4.3: - resolution: {integrity: sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dev: false - /jest-regex-util@29.6.3: resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -10813,44 +10763,6 @@ packages: pretty-format: 29.7.0 dev: false - /jest-watch-select-projects@2.0.0: - resolution: {integrity: sha512-j00nW4dXc2NiCW6znXgFLF9g8PJ0zP25cpQ1xRro/HU2GBfZQFZD0SoXnAlaoKkIY4MlfTMkKGbNXFpvCdjl1w==} - dependencies: - ansi-escapes: 4.3.2 - chalk: 3.0.0 - prompts: 2.4.2 - dev: false - - /jest-watch-typeahead@2.2.2(jest@29.7.0): - resolution: {integrity: sha512-+QgOFW4o5Xlgd6jGS5X37i08tuuXNW8X0CV9WNFi+3n8ExCIP+E1melYhvYLjv5fE6D0yyzk74vsSO8I6GqtvQ==} - engines: {node: ^14.17.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - jest: ^27.0.0 || ^28.0.0 || ^29.0.0 - dependencies: - ansi-escapes: 6.2.0 - chalk: 5.3.0 - jest: 29.7.0 - jest-regex-util: 29.4.3 - jest-watcher: 29.6.2 - slash: 5.1.0 - string-length: 5.0.1 - strip-ansi: 7.1.0 - dev: false - - /jest-watcher@29.6.2: - resolution: {integrity: sha512-GZitlqkMkhkefjfN/p3SJjrDaxPflqxEAv3/ik10OirZqJGYH5rPiIsgVcfof0Tdqg3shQGdEIxDBx+B4tuLzA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/test-result': 29.6.2 - '@jest/types': 29.6.3 - '@types/node': 18.19.26 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - emittery: 0.13.1 - jest-util: 29.7.0 - string-length: 4.0.2 - dev: false - /jest-watcher@29.7.0: resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -14468,11 +14380,6 @@ packages: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} - /slash@5.1.0: - resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} - engines: {node: '>=14.16'} - dev: false - /slice-ansi@2.1.0: resolution: {integrity: sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==} engines: {node: '>=6'} @@ -14717,14 +14624,6 @@ packages: strip-ansi: 6.0.1 dev: false - /string-length@5.0.1: - resolution: {integrity: sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow==} - engines: {node: '>=12.20'} - dependencies: - char-regex: 2.0.1 - strip-ansi: 7.1.0 - dev: false - /string-natural-compare@3.0.1: resolution: {integrity: sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==} dev: false @@ -15251,11 +15150,6 @@ packages: resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} engines: {node: '>=12.20'} - /type-fest@3.13.1: - resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} - engines: {node: '>=14.16'} - dev: false - /type-is@1.6.18: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} From d4eac83ab97672127193ab3d4a4d6575af267605 Mon Sep 17 00:00:00 2001 From: Matt Brophy Date: Mon, 1 Apr 2024 15:23:38 -0400 Subject: [PATCH 07/10] Remove unused msw from remix-dev --- packages/remix-dev/__tests__/github-mocks.ts | 358 ------------------- packages/remix-dev/__tests__/msw.ts | 33 -- packages/remix-dev/package.json | 1 - pnpm-lock.yaml | 233 ++---------- 4 files changed, 20 insertions(+), 605 deletions(-) delete mode 100644 packages/remix-dev/__tests__/github-mocks.ts delete mode 100644 packages/remix-dev/__tests__/msw.ts diff --git a/packages/remix-dev/__tests__/github-mocks.ts b/packages/remix-dev/__tests__/github-mocks.ts deleted file mode 100644 index 69e4574a66..0000000000 --- a/packages/remix-dev/__tests__/github-mocks.ts +++ /dev/null @@ -1,358 +0,0 @@ -import * as path from "node:path"; -import fsp from "node:fs/promises"; -import invariant from "tiny-invariant"; -import type { setupServer } from "msw/node"; -import { rest } from "msw"; - -type RequestHandler = Parameters[0]; - -async function isDirectory(d: string) { - try { - return (await fsp.lstat(d)).isDirectory(); - } catch { - return false; - } -} -async function isFile(d: string) { - try { - return (await fsp.lstat(d)).isFile(); - } catch { - return false; - } -} - -type GHContentsDescription = { - name: string; - path: string; - sha: string; - size: number; - url: string; - html_url: string; - git_url: string; - download_url: string | null; - type: "dir" | "file"; - _links: { - self: string; - git: string; - html: string; - }; -}; - -type GHContent = { - sha: string; - node_id: string; - size: number; - url: string; - content: string; - encoding: "base64"; -}; - -type ResponseResolver = Parameters[1]; - -let sendTarball: ResponseResolver = async (req, res, ctx) => { - let { owner, repo } = req.params; - invariant(typeof owner === "string", "owner must be a string"); - invariant(typeof repo === "string", "repo must be a string"); - - let pathToTarball: string; - if (owner === "remix-run" && repo === "examples") { - pathToTarball = path.join(__dirname, "fixtures", "examples-main.tar.gz"); - } else if (owner === "remix-run" && repo === "remix") { - pathToTarball = path.join(__dirname, "fixtures", "remix-repo.tar.gz"); - } else if (owner === "fake-remix-tester" && repo === "nested-dir") { - pathToTarball = path.join(__dirname, "fixtures", "nested-dir-repo.tar.gz"); - } else { - pathToTarball = path.join(__dirname, "fixtures", "stack.tar.gz"); - } - - let fileBuffer = await fsp.readFile(pathToTarball); - - return res( - ctx.body(fileBuffer), - ctx.set("Content-Type", "application/x-gzip") - ); -}; - -let githubHandlers: Array = [ - rest.head( - `https://github.com/remix-run/remix/tree/main/:type/:name`, - async (_req, res, ctx) => { - return res(ctx.status(200)); - } - ), - rest.head( - `https://github.com/remix-run/examples/tree/main/:type/:name`, - async (_req, res, ctx) => { - return res(ctx.status(200)); - } - ), - rest.head( - `https://github.com/error-username/:status`, - async (req, res, ctx) => { - return res(ctx.status(Number(req.params.status))); - } - ), - rest.head(`https://github.com/:owner/:repo`, async (req, res, ctx) => { - return res(ctx.status(200)); - }), - rest.head( - `https://api.github.com/repos/error-username/:status`, - async (req, res, ctx) => { - return res(ctx.status(Number(req.params.status))); - } - ), - rest.head( - `https://api.github.com/repos/private-org/private-repo`, - async (req, res, ctx) => { - let status = - req.headers.get("Authorization") === "token valid-token" ? 200 : 404; - return res(ctx.status(status)); - } - ), - rest.head( - `https://api.github.com/repos/:owner/:repo`, - async (req, res, ctx) => { - return res(ctx.status(200)); - } - ), - rest.head( - `https://github.com/:owner/:repo/tree/:branch/:path*`, - async (req, res, ctx) => { - return res(ctx.status(200)); - } - ), - rest.get( - `https://api.github.com/repos/:owner/:repo/git/trees/:branch`, - async (req, res, ctx) => { - let { owner, repo } = req.params; - - return res( - ctx.status(200), - ctx.json({ - sha: "7d906ff5bbb79401a4a8ec1e1799845ed502c0a1", - url: `https://api.github.com/repos/${owner}/${repo}/trees/7d906ff5bbb79401a4a8ec1e1799845ed502c0a1`, - tree: [ - { - path: "package.json", - mode: "040000", - type: "blob", - sha: "a405cd8355516db9c96e1467fb14b74c97ac0a65", - size: 138, - url: `https://api.github.com/repos/${owner}/${repo}/git/blobs/a405cd8355516db9c96e1467fb14b74c97ac0a65`, - }, - { - path: "stack", - mode: "040000", - type: "tree", - sha: "3f350a670e8fefd58535a9e1878539dc19afb4b5", - url: `https://api.github.com/repos/${owner}/${repo}/trees/3f350a670e8fefd58535a9e1878539dc19afb4b5`, - }, - ], - }) - ); - } - ), - rest.get( - `https://api.github.com/repos/:owner/:repo/contents/:path`, - async (req, res, ctx) => { - let { owner, repo } = req.params; - if (typeof req.params.path !== "string") { - throw new Error("req.params.path must be a string"); - } - let path = decodeURIComponent(req.params.path).trim(); - let isMockable = owner === "remix-run" && repo === "remix"; - - if (!isMockable) { - let message = `Attempting to get content description for unmockable resource: ${owner}/${repo}/${path}`; - console.error(message); - throw new Error(message); - } - - let localPath = path.join(__dirname, "../../..", path); - let isLocalDir = await isDirectory(localPath); - let isLocalFile = await isFile(localPath); - - if (!isLocalDir && !isLocalFile) { - return res( - ctx.status(404), - ctx.json({ - message: "Not Found", - documentation_url: - "https://docs.github.com/rest/reference/repos#get-repository-content", - }) - ); - } - - if (isLocalFile) { - let encoding = "base64" as const; - let content = await fsp.readFile(localPath, { encoding: "utf-8" }); - return res( - ctx.status(200), - ctx.json({ - content: Buffer.from(content, "utf-8").toString(encoding), - encoding, - }) - ); - } - - let dirList = await fsp.readdir(localPath); - - let contentDescriptions = await Promise.all( - dirList.map(async (name): Promise => { - let relativePath = path.join(path, name); - // NOTE: this is a cheat-code so we don't have to determine the sha of the file - // and our sha endpoint handler doesn't have to do a reverse-lookup. - let sha = relativePath; - let fullPath = path.join(localPath, name); - let isDir = await isDirectory(fullPath); - let size = isDir ? 0 : (await fsp.stat(fullPath)).size; - return { - name, - path: relativePath, - sha, - size, - url: `https://api.github.com/repos/${owner}/${repo}/contents/${path}?${req.url.searchParams}`, - html_url: `https://github.com/${owner}/${repo}/tree/main/${path}`, - git_url: `https://api.github.com/repos/${owner}/${repo}/git/trees/${sha}`, - download_url: null, - type: isDir ? "dir" : "file", - _links: { - self: `https://api.github.com/repos/${owner}/${repo}/contents/${path}${req.url.searchParams}`, - git: `https://api.github.com/repos/${owner}/${repo}/git/trees/${sha}`, - html: `https://github.com/${owner}/${repo}/tree/main/${path}`, - }, - }; - }) - ); - - return res(ctx.json(contentDescriptions)); - } - ), - rest.get( - `https://api.github.com/repos/:owner/:repo/git/blobs/:sha`, - async (req, res, ctx) => { - let { owner, repo } = req.params; - if (typeof req.params.sha !== "string") { - throw new Error("req.params.sha must be a string"); - } - let sha = decodeURIComponent(req.params.sha).trim(); - // if the sha includes a "/" that means it's not a sha but a relativePath - // and therefore the client is getting content it got from the local - // mock environment, not the actual github API. - if (!sha.includes("/")) { - let message = `Attempting to get content for sha, but no sha exists locally: ${sha}`; - console.error(message); - throw new Error(message); - } - - // NOTE: we cheat a bit and in the contents/:path handler, we set the sha to the relativePath - let relativePath = sha; - let fullPath = path.join(__dirname, "..", relativePath); - let encoding = "base64" as const; - let size = (await fsp.stat(fullPath)).size; - let content = await fsp.readFile(fullPath, { encoding: "utf-8" }); - - let resource: GHContent = { - sha, - node_id: `${sha}_node_id`, - size, - url: `https://api.github.com/repos/${owner}/${repo}/git/blobs/${sha}`, - content: Buffer.from(content, "utf-8").toString(encoding), - encoding, - }; - - return res(ctx.json(resource)); - } - ), - rest.get( - `https://api.github.com/repos/:owner/:repo/contents/:path*`, - async (req, res, ctx) => { - let { owner, repo } = req.params; - - let relativePath = req.params.path; - if (typeof relativePath !== "string") { - throw new Error("req.params.path must be a string"); - } - let fullPath = path.join(__dirname, "..", relativePath); - let encoding = "base64" as const; - let size = (await fsp.stat(fullPath)).size; - let content = await fsp.readFile(fullPath, { encoding: "utf-8" }); - let sha = `${relativePath}_sha`; - - let resource: GHContent = { - sha, - node_id: `${req.params.path}_node_id`, - size, - url: `https://api.github.com/repos/${owner}/${repo}/git/blobs/${sha}`, - content: Buffer.from(content, "utf-8").toString(encoding), - encoding, - }; - - return res(ctx.json(resource)); - } - ), - rest.get( - `https://codeload.github.com/private-org/private-repo/tar.gz/:branch`, - (req, res, ctx) => { - if (req.headers.get("Authorization") !== "token valid-token") { - return res(ctx.status(404)); - } - req.params.owner = "private-org"; - req.params.repo = "private-repo"; - return sendTarball(req, res, ctx); - } - ), - rest.get( - `https://codeload.github.com/:owner/:repo/tar.gz/:branch`, - sendTarball - ), - rest.get( - `https://api.github.com/repos/private-org/private-repo/tarball`, - (req, res, ctx) => { - if (req.headers.get("Authorization") !== "token valid-token") { - return res(ctx.status(404)); - } - req.params.owner = "private-org"; - req.params.repo = "private-repo"; - - return sendTarball(req, res, ctx); - } - ), - rest.get( - `https://api.github.com/repos/private-org/private-repo/releases/tags/:tag`, - (req, res, ctx) => { - if (req.headers.get("Authorization") !== "token valid-token") { - return res(ctx.status(404)); - } - let { tag } = req.params; - return res( - ctx.status(200), - ctx.json({ - assets: [ - { - browser_download_url: `https://github.com/private-org/private-repo/releases/download/${tag}/stack.tar.gz`, - id: "working-asset-id", - }, - ], - }) - ); - } - ), - rest.get( - `https://api.github.com/repos/private-org/private-repo/releases/assets/working-asset-id`, - (req, res, ctx) => { - if (req.headers.get("Authorization") !== "token valid-token") { - return res(ctx.status(404)); - } - req.params.owner = "private-org"; - req.params.repo = "private-repo"; - return sendTarball(req, res, ctx); - } - ), - rest.get(`https://api.github.com/repos/:owner/:repo/tarball`, sendTarball), - rest.get(`https://api.github.com/repos/:repo*`, async (req, res, ctx) => { - return res(ctx.json({ default_branch: "main" })); - }), -]; - -export { githubHandlers }; diff --git a/packages/remix-dev/__tests__/msw.ts b/packages/remix-dev/__tests__/msw.ts deleted file mode 100644 index 36915d39dd..0000000000 --- a/packages/remix-dev/__tests__/msw.ts +++ /dev/null @@ -1,33 +0,0 @@ -import path from "node:path"; -import fsp from "node:fs/promises"; -import { setupServer } from "msw/node"; -import { rest } from "msw"; - -import { githubHandlers } from "./github-mocks"; - -type RequestHandler = Parameters[0]; - -let miscHandlers: Array = [ - rest.head( - "https://example.com/error/:status/remix-stack.tar.gz", - async (req, res, ctx) => { - return res(ctx.status(Number(req.params.status))); - } - ), - rest.head("https://example.com/remix-stack.tar.gz", async (req, res, ctx) => { - return res(ctx.status(200)); - }), - rest.get("https://example.com/remix-stack.tar.gz", async (req, res, ctx) => { - let fileBuffer = await fsp.readFile( - path.join(__dirname, "fixtures", "stack.tar.gz") - ); - - return res( - ctx.body(fileBuffer), - ctx.set("Content-Type", "application/x-gzip") - ); - }), -]; - -let server = setupServer(...githubHandlers, ...miscHandlers); -export { server }; diff --git a/packages/remix-dev/package.json b/packages/remix-dev/package.json index 0c918f07c0..cc4b84f851 100644 --- a/packages/remix-dev/package.json +++ b/packages/remix-dev/package.json @@ -98,7 +98,6 @@ "@types/ws": "^7.4.1", "esbuild-register": "^3.3.2", "fast-glob": "3.2.11", - "msw": "^1.2.3", "strip-ansi": "^6.0.1", "tiny-invariant": "^1.2.0", "vite": "5.1.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0e913b2a92..4519942a6b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -544,9 +544,6 @@ importers: fast-glob: specifier: 3.2.11 version: 3.2.11 - msw: - specifier: ^1.2.3 - version: 1.3.3(typescript@5.1.6) strip-ansi: specifier: ^6.0.1 version: 6.0.1 @@ -4658,30 +4655,6 @@ packages: - supports-color dev: false - /@mswjs/cookies@0.2.2: - resolution: {integrity: sha512-mlN83YSrcFgk7Dm1Mys40DLssI1KdJji2CMKN8eOlBqsTADYzj2+jWzsANsUTFbxDMWPD5e9bfA1RGqBpS3O1g==} - engines: {node: '>=14'} - dependencies: - '@types/set-cookie-parser': 2.4.7 - set-cookie-parser: 2.6.0 - dev: true - - /@mswjs/interceptors@0.17.10: - resolution: {integrity: sha512-N8x7eSLGcmUFNWZRxT1vsHvypzIRgQYdG0rJey/rZCy6zT/30qDt8Joj7FxzGNLSwXbeZqJOMqDurp7ra4hgbw==} - engines: {node: '>=14'} - dependencies: - '@open-draft/until': 1.0.3 - '@types/debug': 4.1.12 - '@xmldom/xmldom': 0.8.10 - debug: 4.3.4 - headers-polyfill: 3.2.5 - outvariant: 1.4.2 - strict-event-emitter: 0.2.8 - web-encoding: 1.1.5 - transitivePeerDependencies: - - supports-color - dev: true - /@nodelib/fs.scandir@2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -4934,10 +4907,6 @@ packages: '@octokit/openapi-types': 18.0.0 dev: false - /@open-draft/until@1.0.3: - resolution: {integrity: sha512-Aq58f5HiWdyDlFffbbSjAlv596h/cOnt2DO1w3DOC7OJ5EHs0hd/nycJfiu9RJbT6Yk6F1knnRRXNSpxoIVZ9Q==} - dev: true - /@pkgjs/parseargs@0.11.0: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -5528,10 +5497,6 @@ packages: '@types/node': 18.19.26 dev: true - /@types/cookie@0.4.1: - resolution: {integrity: sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==} - dev: true - /@types/cookie@0.6.0: resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} dev: false @@ -5550,6 +5515,7 @@ packages: resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} dependencies: '@types/ms': 0.7.34 + dev: false /@types/estree-jsx@1.0.5: resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} @@ -5640,10 +5606,6 @@ packages: pretty-format: 29.7.0 dev: false - /@types/js-levenshtein@1.1.3: - resolution: {integrity: sha512-jd+Q+sD20Qfu9e2aEXogiO3vpOC1PYJOUdyN9gvs4Qrvkg4wF43L5OhqrPeokdv8TL0/mXoYfpkcoGZMNN2pkQ==} - dev: true - /@types/jsdom@20.0.1: resolution: {integrity: sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==} dependencies: @@ -5724,6 +5686,7 @@ packages: /@types/ms@0.7.34: resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} + dev: false /@types/node-forge@1.3.11: resolution: {integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==} @@ -6140,17 +6103,6 @@ packages: resolution: {integrity: sha512-BEO6al7BYqcnfX15W2cnGR+Q566ACXAT9UQykORCWW80lmkpWsnEob6zJS1ZVBKsSJC8+7vJkHwlp+lXG1UCdw==} dev: false - /@xmldom/xmldom@0.8.10: - resolution: {integrity: sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==} - engines: {node: '>=10.0.0'} - dev: true - - /@zxing/text-encoding@0.9.0: - resolution: {integrity: sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA==} - requiresBuild: true - dev: true - optional: true - /abab@2.0.6: resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} deprecated: Use your platform's native atob() and btoa() methods instead @@ -6382,6 +6334,7 @@ packages: engines: {node: '>=8'} dependencies: type-fest: 0.21.3 + dev: false /ansi-fragments@0.2.1: resolution: {integrity: sha512-DykbNHxuXQwUDRv5ibc2b0x7uw7wmwOGLBUd5RmaQ5z8Lhx19vwvKV+FAsM5rEA6dEcHxX+/Ad5s9eF2k2bB+w==} @@ -6728,6 +6681,7 @@ packages: /available-typed-arrays@1.0.5: resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} engines: {node: '>= 0.4'} + dev: false /axe-core@4.7.2: resolution: {integrity: sha512-zIURGIS1E1Q4pcrMjp+nnEh+16G56eG/MUllJH8yEvw7asDo7Ac9uhC9KIH5jzpITueEZolfYglnCGIuSBz39g==} @@ -7387,6 +7341,7 @@ packages: /chardet@0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + dev: false /cheerio-select@2.1.0: resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} @@ -7483,11 +7438,6 @@ packages: resolution: {integrity: sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw==} engines: {node: '>=6'} - /cli-width@3.0.0: - resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} - engines: {node: '>= 10'} - dev: true - /cliui@6.0.0: resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} dependencies: @@ -7502,6 +7452,7 @@ packages: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 7.0.0 + dev: false /clone-deep@1.0.0: resolution: {integrity: sha512-hmJRX8x1QOJVV+GUjOBzi6iauhPqc9hIF6xitWRBbiPZOBb6vGo/mDRIK9P74RTKSQK7AE8B0DDWY/vpRrPmQw==} @@ -7653,11 +7604,6 @@ packages: engines: {node: '>=6.6.0'} dev: false - /cookie@0.4.2: - resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} - engines: {node: '>= 0.6'} - dev: true - /cookie@0.5.0: resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} engines: {node: '>= 0.6'} @@ -8790,11 +8736,6 @@ packages: resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} engines: {node: '>=6'} - /events@3.3.0: - resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} - engines: {node: '>=0.8.x'} - dev: true - /execa@1.0.0: resolution: {integrity: sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==} engines: {node: '>=6'} @@ -8925,6 +8866,7 @@ packages: chardet: 0.7.0 iconv-lite: 0.4.24 tmp: 0.0.33 + dev: false /extglob@2.0.4: resolution: {integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==} @@ -8996,13 +8938,6 @@ packages: dependencies: bser: 2.1.1 - /figures@3.2.0: - resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} - engines: {node: '>=8'} - dependencies: - escape-string-regexp: 1.0.5 - dev: true - /file-entry-cache@6.0.1: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} @@ -9118,6 +9053,7 @@ packages: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} dependencies: is-callable: 1.2.7 + dev: false /for-in@0.1.8: resolution: {integrity: sha512-F0to7vbBSHP8E3l6dCjxNOLuSFAACIxFy3UehTUlG7svlXi37HHsDkyVcHo0Pq8QwrE+pXvWSVX3ZT1T9wAZ9g==} @@ -9430,11 +9366,6 @@ packages: resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} dev: false - /graphql@16.8.1: - resolution: {integrity: sha512-59LZHPdGZVh695Ud9lRzPBVTtlX9ZCV150Er2W43ro37wVof0ctenSaskPPjN7lVTIN8mSZt8PHUNKZuNQUuxw==} - engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} - dev: true - /gunzip-maybe@1.4.2: resolution: {integrity: sha512-4haO1M4mLO91PW57BMsDFf75UmwoRX0GkdD+Faw+Lr+r/OZrOCS0pIBwOL1xCKQqnQzbNFGgK2V2CpBUPeFNTw==} hasBin: true @@ -9489,6 +9420,7 @@ packages: engines: {node: '>= 0.4'} dependencies: has-symbols: 1.0.3 + dev: false /has-value@0.3.1: resolution: {integrity: sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==} @@ -9560,10 +9492,6 @@ packages: resolution: {integrity: sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==} dev: false - /headers-polyfill@3.2.5: - resolution: {integrity: sha512-tUCGvt191vNSQgttSyJoibR+VO+I6+iCHIUdhzEMJKE+EAL8BwCN7fUOZlY4ofOelNHsK+gEjxB/B+9N3EWtdA==} - dev: true - /hermes-engine@0.11.0: resolution: {integrity: sha512-7aMUlZja2IyLYAcZ69NBnwJAR5ZOYlSllj0oMpx08a8HzxHOys0eKCzfphrf6D0vX1JGO1QQvVsQKe6TkYherw==} dev: true @@ -9773,27 +9701,6 @@ packages: resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} dev: false - /inquirer@8.2.6: - resolution: {integrity: sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==} - engines: {node: '>=12.0.0'} - dependencies: - ansi-escapes: 4.3.2 - chalk: 4.1.2 - cli-cursor: 3.1.0 - cli-width: 3.0.0 - external-editor: 3.1.0 - figures: 3.2.0 - lodash: 4.17.21 - mute-stream: 0.0.8 - ora: 5.4.1 - run-async: 2.4.1 - rxjs: 7.8.1 - string-width: 4.2.3 - strip-ansi: 6.0.1 - through: 2.3.8 - wrap-ansi: 6.2.0 - dev: true - /internal-slot@1.0.5: resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} engines: {node: '>= 0.4'} @@ -9842,14 +9749,6 @@ packages: is-decimal: 2.0.1 dev: false - /is-arguments@1.1.1: - resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - has-tostringtag: 1.0.0 - dev: true - /is-array-buffer@3.0.2: resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} dependencies: @@ -9892,6 +9791,7 @@ packages: /is-callable@1.2.7: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} + dev: false /is-ci@3.0.1: resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} @@ -9989,13 +9889,6 @@ packages: engines: {node: '>=6'} dev: false - /is-generator-function@1.0.10: - resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} - engines: {node: '>= 0.4'} - dependencies: - has-tostringtag: 1.0.0 - dev: true - /is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} @@ -10024,10 +9917,6 @@ packages: engines: {node: '>= 0.4'} dev: false - /is-node-process@1.2.0: - resolution: {integrity: sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==} - dev: true - /is-number-object@1.0.7: resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} engines: {node: '>= 0.4'} @@ -10140,6 +10029,7 @@ packages: engines: {node: '>= 0.4'} dependencies: which-typed-array: 1.1.11 + dev: false /is-unicode-supported@0.1.0: resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} @@ -10841,11 +10731,6 @@ packages: '@sideway/pinpoint': 2.0.0 dev: true - /js-levenshtein@1.1.6: - resolution: {integrity: sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==} - engines: {node: '>=0.10.0'} - dev: true - /js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -12423,42 +12308,6 @@ packages: /ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - /msw@1.3.3(typescript@5.1.6): - resolution: {integrity: sha512-CiPyRFiYJCXYyH/vwxT7m+sa4VZHuUH6cGwRBj0kaTjBGpsk4EnL47YzhoA859htVCF2vzqZuOsomIUlFqg9GQ==} - engines: {node: '>=14'} - hasBin: true - requiresBuild: true - peerDependencies: - typescript: '>= 4.4.x' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@mswjs/cookies': 0.2.2 - '@mswjs/interceptors': 0.17.10 - '@open-draft/until': 1.0.3 - '@types/cookie': 0.4.1 - '@types/js-levenshtein': 1.1.3 - chalk: 4.1.2 - chokidar: 3.6.0 - cookie: 0.4.2 - graphql: 16.8.1 - headers-polyfill: 3.2.5 - inquirer: 8.2.6 - is-node-process: 1.2.0 - js-levenshtein: 1.1.6 - node-fetch: 2.6.7 - outvariant: 1.4.2 - path-to-regexp: 6.2.1 - strict-event-emitter: 0.4.6 - type-fest: 2.19.0 - typescript: 5.1.6 - yargs: 17.7.2 - transitivePeerDependencies: - - encoding - - supports-color - dev: true - /mustache@4.2.0: resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} hasBin: true @@ -12468,10 +12317,6 @@ packages: resolution: {integrity: sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==} dev: false - /mute-stream@0.0.8: - resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} - dev: true - /nanoid@3.3.7: resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -12820,10 +12665,6 @@ packages: resolution: {integrity: sha512-KiOAIsdpUTcAXuykya5fnVVT+/5uS0Q1mrkRHcF89tpieSmY33O/tmc54CqwA+bfhbtEfZUNLHaPUiB9X3jt1A==} dev: false - /outvariant@1.4.2: - resolution: {integrity: sha512-Ou3dJ6bA/UJ5GVHxah4LnqDwZRwAmWxrG3wtrHrbGnP4RnLCtA64A4F+ae7Y8ww660JaddSoArUR5HjipWSHAQ==} - dev: true - /p-filter@2.1.0: resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} engines: {node: '>=8'} @@ -14124,22 +13965,11 @@ packages: /rrweb-cssom@0.6.0: resolution: {integrity: sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==} - /run-async@2.4.1: - resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} - engines: {node: '>=0.12.0'} - dev: true - /run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} dependencies: queue-microtask: 1.2.3 - /rxjs@7.8.1: - resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} - dependencies: - tslib: 2.6.2 - dev: true - /sade@1.8.1: resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} engines: {node: '>=6'} @@ -14267,6 +14097,7 @@ packages: /set-cookie-parser@2.6.0: resolution: {integrity: sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==} + dev: false /set-function-length@1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} @@ -14602,16 +14433,6 @@ packages: mixme: 0.5.4 dev: false - /strict-event-emitter@0.2.8: - resolution: {integrity: sha512-KDf/ujU8Zud3YaLtMCcTI4xkZlZVIYxTLr+XIULexP+77EEVWixeXroLUXQXiVtH4XH2W7jr/3PT1v3zBuvc3A==} - dependencies: - events: 3.3.0 - dev: true - - /strict-event-emitter@0.4.6: - resolution: {integrity: sha512-12KWeb+wixJohmnwNFerbyiBrAlq5qJLwIt38etRtKtmmHyDSoGlIqFE9wx+4IwG0aDjI7GV8tc8ZccjWZZtTg==} - dev: true - /string-hash@1.1.3: resolution: {integrity: sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A==} dev: false @@ -14948,10 +14769,6 @@ packages: readable-stream: 2.3.7 xtend: 4.0.2 - /through@2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - dev: true - /time-stamp@1.1.0: resolution: {integrity: sha512-gLCeArryy2yNTRzTGKbZbloctj64jkZ57hj5zdraXue6aFgd6PmvVtEyiUU+hvU0v7q08oVv8r8ev0tRo6bvgw==} engines: {node: '>=0.10.0'} @@ -14969,6 +14786,7 @@ packages: engines: {node: '>=0.6.0'} dependencies: os-tmpdir: 1.0.2 + dev: false /tmpl@1.0.5: resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} @@ -15130,6 +14948,7 @@ packages: /type-fest@0.21.3: resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} engines: {node: '>=10'} + dev: false /type-fest@0.6.0: resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} @@ -15149,6 +14968,7 @@ packages: /type-fest@2.19.0: resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} engines: {node: '>=12.20'} + dev: false /type-is@1.6.18: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} @@ -15433,16 +15253,6 @@ packages: /util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - /util@0.12.5: - resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} - dependencies: - inherits: 2.0.4 - is-arguments: 1.1.1 - is-generator-function: 1.0.10 - is-typed-array: 1.1.12 - which-typed-array: 1.1.11 - dev: true - /utils-merge@1.0.1: resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} engines: {node: '>= 0.4.0'} @@ -15590,14 +15400,6 @@ packages: dependencies: defaults: 1.0.3 - /web-encoding@1.1.5: - resolution: {integrity: sha512-HYLeVCdJ0+lBYV2FvNZmv3HJ2Nt0QYXqZojk3d9FJOLkwnuhzM9tmamh8d7HPM8QqjKH8DeHkFTx+CFlWpZZDA==} - dependencies: - util: 0.12.5 - optionalDependencies: - '@zxing/text-encoding': 0.9.0 - dev: true - /webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} @@ -15662,6 +15464,7 @@ packages: for-each: 0.3.3 gopd: 1.0.1 has-tostringtag: 1.0.0 + dev: false /which@1.3.1: resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} @@ -15759,6 +15562,7 @@ packages: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 + dev: false /wrap-ansi@8.1.0: resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} @@ -15852,6 +15656,7 @@ packages: /y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} + dev: false /yallist@2.1.2: resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} @@ -15879,6 +15684,7 @@ packages: /yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} + dev: false /yargs@15.4.1: resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} @@ -15907,6 +15713,7 @@ packages: string-width: 4.2.3 y18n: 5.0.8 yargs-parser: 21.1.1 + dev: false /yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} From b1bd61ca94f1c8a5ac19028523b9e44a8be53b23 Mon Sep 17 00:00:00 2001 From: Matt Brophy Date: Mon, 1 Apr 2024 15:41:44 -0400 Subject: [PATCH 08/10] Drop node 16 --- .changeset/drop-node-16.md | 9 +++++++++ .github/workflows/format.yml | 2 +- .github/workflows/release-experimental.yml | 2 +- .github/workflows/release.yml | 2 +- .github/workflows/test.yml | 4 ++-- 5 files changed, 14 insertions(+), 5 deletions(-) create mode 100644 .changeset/drop-node-16.md diff --git a/.changeset/drop-node-16.md b/.changeset/drop-node-16.md new file mode 100644 index 0000000000..a01b749f70 --- /dev/null +++ b/.changeset/drop-node-16.md @@ -0,0 +1,9 @@ +--- +"react-router-dom-v5-compat": major +"react-router-native": major +"react-router-dom": major +"react-router": major +"@remix-run/router": major +--- + +Drop support for Node 16, React Router SSR now requires Node 18 or higher diff --git a/.github/workflows/format.yml b/.github/workflows/format.yml index 7e6b410c39..de70984536 100644 --- a/.github/workflows/format.yml +++ b/.github/workflows/format.yml @@ -27,8 +27,8 @@ jobs: - name: ⎔ Setup node uses: actions/setup-node@v4 with: - cache: pnpm node-version-file: ".nvmrc" + cache: pnpm - name: 📥 Install deps run: pnpm install --frozen-lockfile diff --git a/.github/workflows/release-experimental.yml b/.github/workflows/release-experimental.yml index f1cbe2c77b..d344598cee 100644 --- a/.github/workflows/release-experimental.yml +++ b/.github/workflows/release-experimental.yml @@ -28,8 +28,8 @@ jobs: - name: ⎔ Setup node uses: actions/setup-node@v4 with: - cache: pnpm node-version-file: ".nvmrc" + cache: pnpm - name: 📥 Install deps run: pnpm install --frozen-lockfile diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 55daeb6aa6..11e860cdf4 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -79,7 +79,7 @@ jobs: - name: ⎔ Setup node uses: actions/setup-node@v4 with: - node-version: 16 + node-version-file: ".nvmrc" cache: "pnpm" - id: find_package_version diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 3fbb8d9cfa..deaf719460 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -26,8 +26,8 @@ jobs: fail-fast: false matrix: node: - - 16 - 18 + - 20 runs-on: ubuntu-latest @@ -41,9 +41,9 @@ jobs: - name: ⎔ Setup node uses: actions/setup-node@v4 with: + node-version: ${{ matrix.node }} cache: pnpm check-latest: true - node-version: ${{ matrix.node }} - name: Disable GitHub Actions Annotations run: | From 7a099db76e43ccb1923babef4943ed4b7e230723 Mon Sep 17 00:00:00 2001 From: Matt Brophy Date: Mon, 1 Apr 2024 15:50:47 -0400 Subject: [PATCH 09/10] Fix node 20 snapshot --- packages/router/__tests__/navigation-test.ts | 23 +++++++++++--------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/packages/router/__tests__/navigation-test.ts b/packages/router/__tests__/navigation-test.ts index 894da06535..47be1634ae 100644 --- a/packages/router/__tests__/navigation-test.ts +++ b/packages/router/__tests__/navigation-test.ts @@ -169,11 +169,13 @@ describe("navigations", () => { }) ); expect(t.router.state.loaderData).toEqual({}); - expect(t.router.state.errors).toMatchInlineSnapshot(` - { - "foo": [SyntaxError: Unexpected token } in JSON at position 15], - } - `); + + // Node 18 and 20 output different errors here + // Node 18 and 20 output different errors here + let expected = process.version.startsWith("18") + ? "Unexpected token } in JSON at position 15" + : "Unexpected non-whitespace character after JSON at position 15"; + expect(t.router.state.errors?.foo).toEqual(new SyntaxError(expected)); }); it("bubbles errors when unwrapping Responses", async () => { @@ -204,11 +206,12 @@ describe("navigations", () => { }) ); expect(t.router.state.loaderData).toEqual({}); - expect(t.router.state.errors).toMatchInlineSnapshot(` - { - "root": [SyntaxError: Unexpected token } in JSON at position 15], - } - `); + + // Node 18 and 20 output different errors here + let expected = process.version.startsWith("18") + ? "Unexpected token } in JSON at position 15" + : "Unexpected non-whitespace character after JSON at position 15"; + expect(t.router.state.errors?.root).toEqual(new SyntaxError(expected)); }); it("does not fetch unchanging layout data", async () => { From 72090660b011afd253629cc2e3018a0de443893c Mon Sep 17 00:00:00 2001 From: Matt Brophy Date: Mon, 1 Apr 2024 16:00:14 -0400 Subject: [PATCH 10/10] Fix version check --- packages/router/__tests__/navigation-test.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/router/__tests__/navigation-test.ts b/packages/router/__tests__/navigation-test.ts index 47be1634ae..55838ab4be 100644 --- a/packages/router/__tests__/navigation-test.ts +++ b/packages/router/__tests__/navigation-test.ts @@ -172,7 +172,8 @@ describe("navigations", () => { // Node 18 and 20 output different errors here // Node 18 and 20 output different errors here - let expected = process.version.startsWith("18") + console.log("process.version", process.version); + let expected = process.version.startsWith("v18") ? "Unexpected token } in JSON at position 15" : "Unexpected non-whitespace character after JSON at position 15"; expect(t.router.state.errors?.foo).toEqual(new SyntaxError(expected)); @@ -208,7 +209,7 @@ describe("navigations", () => { expect(t.router.state.loaderData).toEqual({}); // Node 18 and 20 output different errors here - let expected = process.version.startsWith("18") + let expected = process.version.startsWith("v18") ? "Unexpected token } in JSON at position 15" : "Unexpected non-whitespace character after JSON at position 15"; expect(t.router.state.errors?.root).toEqual(new SyntaxError(expected));