diff --git a/.eslintignore b/.eslintignore index d950f09cbc..c20790218c 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1 +1,3 @@ **/generated/** +.eslintrc.cjs +e2e/ \ No newline at end of file diff --git a/.eslintrc.cjs b/.eslintrc.cjs index 722ac3f5c8..24dd31a5f3 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -42,12 +42,6 @@ module.exports = { 'unicorn/filename-case': 'off', }, }, - { - files: ['e2e/**'], - rules: { - 'no-console': 'off', - }, - }, { files: ['packages/graphiql/**', 'packages/render-graphiql/**'], rules: { diff --git a/.github/workflows/deployment-e2e.yml b/.github/workflows/deployment-e2e.yml index 78066107c0..33ad6acebf 100644 --- a/.github/workflows/deployment-e2e.yml +++ b/.github/workflows/deployment-e2e.yml @@ -16,6 +16,7 @@ jobs: 'azure-function', 'aws-lambda', 'vercel-function', + 'vercel-edge', ] name: e2e / ${{ matrix.plan }} diff --git a/e2e/.eslintrc.cjs b/e2e/.eslintrc.cjs new file mode 100644 index 0000000000..e951196ad1 --- /dev/null +++ b/e2e/.eslintrc.cjs @@ -0,0 +1,7 @@ +module.exports = { + extends: ['@theguild'], + parserOptions: { + tsconfigRootDir: __dirname, + project: './tsconfig.json', + }, +}; \ No newline at end of file diff --git a/e2e/README.md b/e2e/README.md index 3538196d1e..824b14587b 100644 --- a/e2e/README.md +++ b/e2e/README.md @@ -15,6 +15,7 @@ On each PR, this workflow runs, and tried to deploy and test an actual environme - [x] [AWS Lambda](./tests/aws-lambda.ts) - [x] [Docker container](./tests/docker.ts) - [x] [Vercel Function](./tests/vercel.ts) +- [x] [Vercel Edge Function](./tests/vercel-edge.ts) - [ ] K8s Pod - [ ] Docker diff --git a/e2e/index.ts b/e2e/index.ts index e27b40d647..eb74d8c40d 100644 --- a/e2e/index.ts +++ b/e2e/index.ts @@ -7,6 +7,7 @@ import { dockerDeployment } from './tests/docker' import { DeploymentConfiguration } from './types' import { env, getCommitId } from './utils' import { vercelDeployment } from './tests/vercel' +import { vercelEdgeDeployment } from './tests/vercel-edge' const AVAILABLE_TEST_PLANS = { 'cf-worker': cloudFlareDeployment, @@ -14,6 +15,7 @@ const AVAILABLE_TEST_PLANS = { 'azure-function': azureFunctionDeployment, 'aws-lambda': awsLambdaDeployment, 'vercel-function': vercelDeployment, + 'vercel-edge': vercelEdgeDeployment, 'docker-node-17': dockerDeployment('node:17.8.0-alpine3.14'), } diff --git a/e2e/package.json b/e2e/package.json index 3690d93441..4dc71037dc 100644 --- a/e2e/package.json +++ b/e2e/package.json @@ -11,11 +11,12 @@ "@pulumi/aws": "5.34.0", "@pulumi/docker": "4.1.2", "@types/node": "18.15.11", + "execa": "^5.1.0", "typescript": "5.0.3", "ts-node": "10.9.1" }, "scripts": { "start": "ts-node --transpile-only index.ts", - "check": "exit 0" + "check": "tsc --noEmit --pretty" } } diff --git a/e2e/tests/vercel-edge.ts b/e2e/tests/vercel-edge.ts new file mode 100644 index 0000000000..df838113ed --- /dev/null +++ b/e2e/tests/vercel-edge.ts @@ -0,0 +1,57 @@ +import * as pulumi from '@pulumi/pulumi' +import { + assertGraphiQL, + assertQuery, + env, + execPromise, + fsPromises, + waitForEndpoint, +} from '../utils' +import { DeploymentConfiguration } from '../types' +import { VercelDeployment } from './vercel' + +export const vercelEdgeDeployment: DeploymentConfiguration<{ + functionUrl: string +}> = { + prerequisites: async () => { + // Build and bundle the function + console.info('\t\tℹ️ Bundling the Vercel Function....') + await execPromise('pnpm bundle', { + cwd: '../examples/nextjs-edge', + }) + }, + program: async () => { + const deployment = new VercelDeployment('vercel-edge-function', { + files: [ + { + file: '/api/graphql.js', + data: await fsPromises.readFile( + '../examples/nextjs-edge/dist/index.js', + 'utf-8', + ), + }, + ], + name: `yoga-e2e-testing`, + functions: { + 'api/graphql.js': { + runtime: 'edge', + memory: 256, + maxDuration: 5, + }, + }, + projectSettings: { + framework: null, + }, + }) + + return { + functionUrl: pulumi.interpolate`https://${deployment.url}/api/graphql`, + } + }, + test: async ({ functionUrl }) => { + console.log(`ℹ️ Vercel Function deployed to URL: ${functionUrl.value}`) + await waitForEndpoint(functionUrl.value, 5, 10000) + await assertGraphiQL(functionUrl.value) + await assertQuery(functionUrl.value) + }, +} diff --git a/e2e/tests/vercel.ts b/e2e/tests/vercel.ts index ae7b365b82..29b3c48c40 100644 --- a/e2e/tests/vercel.ts +++ b/e2e/tests/vercel.ts @@ -31,7 +31,7 @@ type VercelDeploymentInputs = { [K in keyof VercelProviderInputs]: pulumi.Input } -class VercelProvider implements pulumi.dynamic.ResourceProvider { +export class VercelProvider implements pulumi.dynamic.ResourceProvider { private baseUrl = 'https://api.vercel.com' private authToken = env('VERCEL_AUTH_TOKEN') diff --git a/e2e/tsconfig.json b/e2e/tsconfig.json index f68fbc915d..30284d3a54 100644 --- a/e2e/tsconfig.json +++ b/e2e/tsconfig.json @@ -1,7 +1,9 @@ { "compilerOptions": { + "baseUrl": ".", "outDir": "dist", "target": "es2016", + "lib": ["esnext"], "module": "commonjs", "moduleResolution": "node", "declaration": true, @@ -9,5 +11,6 @@ "resolveJsonModule": true, "skipLibCheck": true }, - "include": ["./**/*.ts"] + "files": ["index.ts"], + "exclude": ["**/node_modules", "**/dist"] } diff --git a/examples/nextjs-edge/.eslintrc.json b/examples/nextjs-edge/.eslintrc.json new file mode 100644 index 0000000000..bffb357a71 --- /dev/null +++ b/examples/nextjs-edge/.eslintrc.json @@ -0,0 +1,3 @@ +{ + "extends": "next/core-web-vitals" +} diff --git a/examples/nextjs-edge/.gitignore b/examples/nextjs-edge/.gitignore new file mode 100644 index 0000000000..8e01f84623 --- /dev/null +++ b/examples/nextjs-edge/.gitignore @@ -0,0 +1,32 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* + +# local env files +.env.local +.env.development.local +.env.test.local +.env.production.local + +# vercel +.vercel diff --git a/examples/nextjs-edge/README.md b/examples/nextjs-edge/README.md new file mode 100644 index 0000000000..35983c015f --- /dev/null +++ b/examples/nextjs-edge/README.md @@ -0,0 +1,34 @@ +This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app). + +## Getting Started + +First, run the development server: + +```bash +npm run dev +# or +pnpm dev +``` + +Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. + +You can start editing the page by modifying `pages/index.js`. The page auto-updates as you edit the file. + +[API routes](https://nextjs.org/docs/api-routes/introduction) can be accessed on [http://localhost:3000/api/hello](http://localhost:3000/api/hello). This endpoint can be edited in `pages/api/hello.js`. + +The `pages/api` directory is mapped to `/api/*`. Files in this directory are treated as [API routes](https://nextjs.org/docs/api-routes/introduction) instead of React pages. + +## Learn More + +To learn more about Next.js, take a look at the following resources: + +- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. +- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. + +You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome! + +## Deploy on Vercel + +The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. + +Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details. diff --git a/examples/nextjs-edge/next-env.d.ts b/examples/nextjs-edge/next-env.d.ts new file mode 100644 index 0000000000..4f11a03dc6 --- /dev/null +++ b/examples/nextjs-edge/next-env.d.ts @@ -0,0 +1,5 @@ +/// +/// + +// NOTE: This file should not be edited +// see https://nextjs.org/docs/basic-features/typescript for more information. diff --git a/examples/nextjs-edge/next.config.js b/examples/nextjs-edge/next.config.js new file mode 100644 index 0000000000..bd45b86244 --- /dev/null +++ b/examples/nextjs-edge/next.config.js @@ -0,0 +1,8 @@ +module.exports = { + reactStrictMode: true, + eslint: { + // Warning: This allows production builds to successfully complete even if + // your project has ESLint errors. + ignoreDuringBuilds: true, + }, +} diff --git a/examples/nextjs-edge/package.json b/examples/nextjs-edge/package.json new file mode 100644 index 0000000000..339eef2f6a --- /dev/null +++ b/examples/nextjs-edge/package.json @@ -0,0 +1,31 @@ +{ + "name": "example-nextjs-edge", + "private": true, + "version": "0.13.11", + "scripts": { + "dev": "next dev", + "build": "next build", + "bundle": "node scripts/bundle.js", + "start": "next start", + "lint": "next lint", + "check": "tsc --pretty --noEmit", + "deploy": "vercel deploy -y" + }, + "dependencies": { + "graphql-yoga": "3.7.0", + "@types/react": "18.0.28", + "@types/node": "18.15.11", + "graphql": "^16.1.0", + "next": "13.2.0", + "react": "18.2.0", + "react-dom": "18.2.0", + "tslib": "2.5.0" + }, + "devDependencies": { + "@types/react": "18.0.28", + "eslint": "8.34.0", + "eslint-config-next": "13.2.0", + "esbuild": "0.17.15", + "typescript": "4.9.5" + } +} diff --git a/examples/nextjs-edge/pages/_app.tsx b/examples/nextjs-edge/pages/_app.tsx new file mode 100644 index 0000000000..1e1cec9242 --- /dev/null +++ b/examples/nextjs-edge/pages/_app.tsx @@ -0,0 +1,7 @@ +import '../styles/globals.css' + +function MyApp({ Component, pageProps }) { + return +} + +export default MyApp diff --git a/examples/nextjs-edge/pages/api/graphql.ts b/examples/nextjs-edge/pages/api/graphql.ts new file mode 100644 index 0000000000..c8e284c9d0 --- /dev/null +++ b/examples/nextjs-edge/pages/api/graphql.ts @@ -0,0 +1,26 @@ +import { createYoga, createSchema } from 'graphql-yoga' + +// Docs: https://vercel.com/docs/concepts/functions/edge-functions + +export const config = { + runtime: 'edge', +} + +const yoga = createYoga({ + graphqlEndpoint: '/api/graphql', + schema: createSchema({ + typeDefs: /* GraphQL */ ` + type Query { + greetings: String + } + `, + resolvers: { + Query: { + greetings: () => + 'This is the `greetings` field of the root `Query` type', + }, + }, + }), +}) + +export default yoga.handleRequest diff --git a/examples/nextjs-edge/pages/index.tsx b/examples/nextjs-edge/pages/index.tsx new file mode 100644 index 0000000000..44226d0963 --- /dev/null +++ b/examples/nextjs-edge/pages/index.tsx @@ -0,0 +1,38 @@ +import Head from 'next/head' +import styles from '../styles/Home.module.css' + +export default function Home() { + return ( +
+ + GraphQL Yoga + + + + +
+

+ Welcome to Next.js! +

+ +

+ Edit the GraphQL Schema + + pages/api/graphql.js + +

+ + +
+
+ ) +} diff --git a/examples/nextjs-edge/public/favicon.ico b/examples/nextjs-edge/public/favicon.ico new file mode 100644 index 0000000000..bb8813fed2 Binary files /dev/null and b/examples/nextjs-edge/public/favicon.ico differ diff --git a/examples/nextjs-edge/public/logo.svg b/examples/nextjs-edge/public/logo.svg new file mode 100644 index 0000000000..7798e0564c --- /dev/null +++ b/examples/nextjs-edge/public/logo.svg @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/nextjs-edge/scripts/bundle.js b/examples/nextjs-edge/scripts/bundle.js new file mode 100644 index 0000000000..215d5cb079 --- /dev/null +++ b/examples/nextjs-edge/scripts/bundle.js @@ -0,0 +1,21 @@ +/* eslint-disable */ +const { build } = require('esbuild') + +async function main() { + await build({ + entryPoints: ['./pages/api/graphql.ts'], + outfile: 'dist/index.js', + format: 'esm', + minify: false, + bundle: true, + platform: 'browser', + target: 'es2020', + }) + + console.info(`Vercel Function build done!`) +} + +main().catch((e) => { + console.error(e) + process.exit(1) +}) diff --git a/examples/nextjs-edge/styles/Home.module.css b/examples/nextjs-edge/styles/Home.module.css new file mode 100644 index 0000000000..32a57d52f3 --- /dev/null +++ b/examples/nextjs-edge/styles/Home.module.css @@ -0,0 +1,116 @@ +.container { + padding: 0 2rem; +} + +.main { + min-height: 100vh; + padding: 4rem 0; + flex: 1; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; +} + +.footer { + display: flex; + flex: 1; + padding: 2rem 0; + border-top: 1px solid #eaeaea; + justify-content: center; + align-items: center; +} + +.footer a { + display: flex; + justify-content: center; + align-items: center; + flex-grow: 1; +} + +.title a { + color: #0070f3; + text-decoration: none; +} + +.title a:hover, +.title a:focus, +.title a:active { + text-decoration: underline; +} + +.title { + margin: 0; + line-height: 1.15; + font-size: 4rem; +} + +.title, +.description { + text-align: center; +} + +.description { + margin: 4rem 0; + line-height: 1.5; + font-size: 1.5rem; +} + +.code { + background: #fafafa; + border-radius: 5px; + padding: 0.75rem; + font-size: 1.1rem; + font-family: Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono, + Bitstream Vera Sans Mono, Courier New, monospace; +} + +.grid { + display: flex; + align-items: center; + justify-content: center; + flex-wrap: wrap; + max-width: 800px; +} + +.card { + margin: 1rem; + padding: 1.5rem; + text-align: left; + color: inherit; + text-decoration: none; + border: 1px solid #eaeaea; + border-radius: 10px; + transition: color 0.15s ease, border-color 0.15s ease; + max-width: 300px; +} + +.card:hover, +.card:focus, +.card:active { + color: #0070f3; + border-color: #0070f3; +} + +.card h2 { + margin: 0 0 1rem 0; + font-size: 1.5rem; +} + +.card p { + margin: 0; + font-size: 1.25rem; + line-height: 1.5; +} + +.logo { + height: 1em; + margin-left: 0.5rem; +} + +@media (max-width: 600px) { + .grid { + width: 100%; + flex-direction: column; + } +} diff --git a/examples/nextjs-edge/styles/globals.css b/examples/nextjs-edge/styles/globals.css new file mode 100644 index 0000000000..e5e2dcc23b --- /dev/null +++ b/examples/nextjs-edge/styles/globals.css @@ -0,0 +1,16 @@ +html, +body { + padding: 0; + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, + Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif; +} + +a { + color: inherit; + text-decoration: none; +} + +* { + box-sizing: border-box; +} diff --git a/examples/nextjs-edge/tsconfig.json b/examples/nextjs-edge/tsconfig.json new file mode 100644 index 0000000000..205a9f8077 --- /dev/null +++ b/examples/nextjs-edge/tsconfig.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "target": "es5", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": false, + "forceConsistentCasingInFileNames": true, + "noEmit": true, + "incremental": false, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "node", + "resolveJsonModule": true, + "jsx": "preserve", + "importHelpers": true, + "isolatedModules": true + }, + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"], + "exclude": ["node_modules", "dist", "test"] +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 27ffa01cff..b0eacb0162 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -165,6 +165,9 @@ importers: '@types/node': specifier: 18.15.11 version: 18.15.11 + execa: + specifier: ^5.1.0 + version: 5.1.1 ts-node: specifier: 10.9.1 version: 10.9.1(@types/node@18.15.11)(typescript@5.0.3) @@ -1047,6 +1050,46 @@ importers: specifier: 5.0.3 version: 5.0.3 + examples/nextjs-edge: + dependencies: + '@types/node': + specifier: 18.15.11 + version: 18.15.11 + '@types/react': + specifier: 18.0.28 + version: 18.0.28 + graphql: + specifier: 16.6.0 + version: 16.6.0 + graphql-yoga: + specifier: 3.7.0 + version: 3.7.0(graphql@16.6.0) + next: + specifier: 13.2.0 + version: 13.2.0(react-dom@18.2.0)(react@18.2.0) + react: + specifier: 18.2.0 + version: 18.2.0 + react-dom: + specifier: 18.2.0 + version: 18.2.0(react@18.2.0) + tslib: + specifier: 2.5.0 + version: 2.5.0 + devDependencies: + esbuild: + specifier: 0.17.15 + version: 0.17.15 + eslint: + specifier: 8.34.0 + version: 8.34.0 + eslint-config-next: + specifier: 13.2.0 + version: 13.2.0(eslint@8.34.0)(typescript@4.9.5) + typescript: + specifier: 4.9.5 + version: 4.9.5 + examples/nextjs-ws: dependencies: '@types/react': @@ -2771,9 +2814,9 @@ packages: dependencies: '@babel/core': 7.21.4 '@babel/generator': 7.21.4 - '@babel/parser': 7.21.3 + '@babel/parser': 7.21.4 '@babel/runtime': 7.20.13 - '@babel/traverse': 7.21.3 + '@babel/traverse': 7.21.4 '@babel/types': 7.21.4 babel-preset-fbjs: 3.4.0(@babel/core@7.21.4) chalk: 4.1.2 @@ -3538,13 +3581,6 @@ packages: uuid: 8.3.2 dev: true - /@babel/code-frame@7.18.6: - resolution: {integrity: sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/highlight': 7.18.6 - dev: true - /@babel/code-frame@7.21.4: resolution: {integrity: sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==} engines: {node: '>=6.9.0'} @@ -3562,15 +3598,15 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@ampproject/remapping': 2.2.0 - '@babel/code-frame': 7.18.6 - '@babel/generator': 7.21.0 + '@babel/code-frame': 7.21.4 + '@babel/generator': 7.21.4 '@babel/helper-compilation-targets': 7.20.7(@babel/core@7.20.12) '@babel/helper-module-transforms': 7.21.2 '@babel/helpers': 7.21.0 - '@babel/parser': 7.21.0 + '@babel/parser': 7.21.4 '@babel/template': 7.20.7 - '@babel/traverse': 7.21.0 - '@babel/types': 7.21.3 + '@babel/traverse': 7.21.4 + '@babel/types': 7.21.4 convert-source-map: 1.9.0 debug: 4.3.4 gensync: 1.0.0-beta.2 @@ -3612,16 +3648,6 @@ packages: jsesc: 2.5.2 dev: true - /@babel/generator@7.21.0: - resolution: {integrity: sha512-z/zN3SePOtxN1/vPFdqrkuJGCD2Vx469+dSbNRD+4TF2+6e4Of5exHqAtcfL/2Nwu0RN0QsFwjyDBFwdUMzNSA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.21.4 - '@jridgewell/gen-mapping': 0.3.2 - '@jridgewell/trace-mapping': 0.3.17 - jsesc: 2.5.2 - dev: true - /@babel/generator@7.21.4: resolution: {integrity: sha512-NieM3pVIYW2SwGzKoqfPrQsf4xGs9M9AIG3ThppsSRmO+m7eQhmI6amajKMUeIO37wFfsvnvcxQFx6x6iqxDnA==} engines: {node: '>=6.9.0'} @@ -3854,7 +3880,7 @@ packages: '@babel/helper-member-expression-to-functions': 7.21.0 '@babel/helper-optimise-call-expression': 7.18.6 '@babel/template': 7.20.7 - '@babel/traverse': 7.21.0 + '@babel/traverse': 7.21.4 '@babel/types': 7.21.4 transitivePeerDependencies: - supports-color @@ -3937,20 +3963,6 @@ packages: /@babel/parser@7.19.4: resolution: {integrity: sha512-qpVT7gtuOLjWeDTKLkJ6sryqLliBaFpAtGeqw5cs5giLldvh+Ch0plqnUMKoVAUS6ZEueQQiZV+p5pxtPitEsA==} engines: {node: '>=6.0.0'} - dependencies: - '@babel/types': 7.21.0 - dev: true - - /@babel/parser@7.21.0: - resolution: {integrity: sha512-ONjtg4renj14A9pj3iA5T5+r5Eijxbr2eNIkMBTC74occDSsRZUpe8vowmowAjFR1imWlkD8eEmjYXiREZpGZg==} - engines: {node: '>=6.0.0'} - dependencies: - '@babel/types': 7.21.4 - dev: true - - /@babel/parser@7.21.3: - resolution: {integrity: sha512-lobG0d7aOfQRXh8AyklEAgZGvA4FShxo6xQbUrrT/cNBPUdIDojlokwJsQyCC/eKia7ifqM0yP+2DRZ4WKw2RQ==} - engines: {node: '>=6.0.0'} dependencies: '@babel/types': 7.21.4 dev: true @@ -4296,16 +4308,6 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-jsx@7.18.6(@babel/core@7.21.4): - resolution: {integrity: sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-syntax-jsx@7.21.4(@babel/core@7.21.4): resolution: {integrity: sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ==} engines: {node: '>=6.9.0'} @@ -4965,42 +4967,6 @@ packages: '@babel/types': 7.21.4 dev: true - /@babel/traverse@7.21.0: - resolution: {integrity: sha512-Xdt2P1H4LKTO8ApPfnO1KmzYMFpp7D/EinoXzLYN/cHcBNrVCAkAtGUcXnHXrl/VGktureU6fkQrHSBE2URfoA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.21.4 - '@babel/generator': 7.21.4 - '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-function-name': 7.21.0 - '@babel/helper-hoist-variables': 7.18.6 - '@babel/helper-split-export-declaration': 7.18.6 - '@babel/parser': 7.21.4 - '@babel/types': 7.21.4 - debug: 4.3.4 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/traverse@7.21.3: - resolution: {integrity: sha512-XLyopNeaTancVitYZe2MlUEvgKb6YVVPXzofHgqHijCImG33b/uTurMS488ht/Hbsb2XK3U2BnSTxKVNGV3nGQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.21.4 - '@babel/generator': 7.21.4 - '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-function-name': 7.21.0 - '@babel/helper-hoist-variables': 7.18.6 - '@babel/helper-split-export-declaration': 7.18.6 - '@babel/parser': 7.21.4 - '@babel/types': 7.21.4 - debug: 4.3.4 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/traverse@7.21.4: resolution: {integrity: sha512-eyKrRHKdyZxqDm+fV1iqL9UAHMoIg0nDaGqfIOd8rKH17m5snv7Gn4qgjBoFfLz9APvjFU/ICT00NVCv1Epp8Q==} engines: {node: '>=6.9.0'} @@ -5037,24 +5003,6 @@ packages: to-fast-properties: 2.0.0 dev: true - /@babel/types@7.21.0: - resolution: {integrity: sha512-uR7NWq2VNFnDi7EYqiRz2Jv/VQIu38tu64Zy8TX2nQFQ6etJ9V/Rr2msW8BS132mum2rL645qpDrLtAJtVpuow==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-string-parser': 7.19.4 - '@babel/helper-validator-identifier': 7.19.1 - to-fast-properties: 2.0.0 - dev: true - - /@babel/types@7.21.3: - resolution: {integrity: sha512-sBGdETxC+/M4o/zKC0sl6sjWv62WFR/uzxrJ6uYyMLZOUlPnwzw0tKgVHOXxaAd5l2g8pEDM5RZ495GPQI77kg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-string-parser': 7.19.4 - '@babel/helper-validator-identifier': 7.19.1 - to-fast-properties: 2.0.0 - dev: true - /@babel/types@7.21.4: resolution: {integrity: sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA==} engines: {node: '>=6.9.0'} @@ -6094,6 +6042,23 @@ packages: - supports-color dev: true + /@eslint/eslintrc@1.4.1: + resolution: {integrity: sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + ajv: 6.12.6 + debug: 4.3.4 + espree: 9.5.1 + globals: 13.19.0 + ignore: 5.2.4 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + /@eslint/eslintrc@2.0.2: resolution: {integrity: sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -8259,7 +8224,7 @@ packages: resolution: {integrity: sha512-ZrGzGfh31NtdVH8tn0mgJw4khQuNHiKqdzJAFbCaERbyCP9tHlxWuL/mnMu8P7e/+k4puWjI1NOzi/sFsjce/g==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@sinclair/typebox': 0.25.21 + '@sinclair/typebox': 0.25.24 /@jest/source-map@29.4.2: resolution: {integrity: sha512-tIoqV5ZNgYI9XCKXMqbYe5JbumcvyTgNN+V5QW4My033lanijvCD0D4PI9tBw4pRTqWOc00/7X3KVvUh+qnF4Q==} @@ -8496,6 +8461,7 @@ packages: /@mapbox/node-pre-gyp@1.0.10: resolution: {integrity: sha512-4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA==} + hasBin: true dependencies: detect-libc: 2.0.1 https-proxy-agent: 5.0.1 @@ -8513,6 +8479,7 @@ packages: /@mapbox/node-pre-gyp@1.0.10(supports-color@9.2.3): resolution: {integrity: sha512-4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA==} + hasBin: true dependencies: detect-libc: 2.0.1 https-proxy-agent: 5.0.1(supports-color@9.2.3) @@ -9962,7 +9929,7 @@ packages: '@babel/parser': 7.16.8 '@netlify/binary-info': 1.0.0 '@netlify/esbuild': 0.14.39 - '@vercel/nft': 0.22.1 + '@vercel/nft': 0.22.5 archiver: 5.3.1 common-path-prefix: 3.0.0 cp-file: 10.0.0 @@ -10002,7 +9969,7 @@ packages: '@babel/parser': 7.16.8 '@netlify/binary-info': 1.0.0 '@netlify/esbuild': 0.14.39 - '@vercel/nft': 0.22.1(supports-color@9.2.3) + '@vercel/nft': 0.22.5(supports-color@9.2.3) archiver: 5.3.1 common-path-prefix: 3.0.0 cp-file: 10.0.0 @@ -10044,16 +10011,35 @@ packages: - utf-8-validate dev: false + /@next/env@13.2.0: + resolution: {integrity: sha512-yv9oaRVa+AxFa27uQOVecS931NrE+GcQSqcL2HaRxL8NunStLtPiyNm/VixvdzfiWLabMz4dXvbXfwCNaECzcw==} + dev: false + /@next/env@13.2.4: resolution: {integrity: sha512-+Mq3TtpkeeKFZanPturjcXt+KHfKYnLlX6jMLyCrmpq6OOs4i1GqBOAauSkii9QeKCMTYzGppar21JU57b/GEA==} dev: false + /@next/eslint-plugin-next@13.2.0: + resolution: {integrity: sha512-/UW29MPgX5P1J1AVIj9g1TCv4BKzUTBB54wgtEp7X15pEKerACGYv9iny44KGZxSJDizWD2+Zaw6+E7do4kwRA==} + dependencies: + glob: 7.1.7 + dev: true + /@next/eslint-plugin-next@13.2.4: resolution: {integrity: sha512-ck1lI+7r1mMJpqLNa3LJ5pxCfOB1lfJncKmRJeJxcJqcngaFwylreLP7da6Rrjr6u2gVRTfmnkSkjc80IiQCwQ==} dependencies: glob: 7.1.7 dev: true + /@next/swc-android-arm-eabi@13.2.0: + resolution: {integrity: sha512-VMetUwBWtDBGzNiOkhiWTP+99ZYW5NVRpIGlUsldEtY8IQIqleaUgW9iamsO0kDSjhWNdCQCB+xu5HcCvmDTww==} + engines: {node: '>= 10'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: false + optional: true + /@next/swc-android-arm-eabi@13.2.4: resolution: {integrity: sha512-DWlalTSkLjDU11MY11jg17O1gGQzpRccM9Oes2yTqj2DpHndajrXHGxj9HGtJ+idq2k7ImUdJVWS2h2l/EDJOw==} engines: {node: '>= 10'} @@ -10063,6 +10049,15 @@ packages: dev: false optional: true + /@next/swc-android-arm64@13.2.0: + resolution: {integrity: sha512-fAiP54Om3fSj5aKntxEvW5fWzyMUzLzjFrHuUt5jBnTRWM4QikhLy547OZDoxycyk4GoQVHmNMSA3hILsrV/dQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: false + optional: true + /@next/swc-android-arm64@13.2.4: resolution: {integrity: sha512-sRavmUImUCf332Gy+PjIfLkMhiRX1Ez4SI+3vFDRs1N5eXp+uNzjFUK/oLMMOzk6KFSkbiK/3Wt8+dHQR/flNg==} engines: {node: '>= 10'} @@ -10072,6 +10067,15 @@ packages: dev: false optional: true + /@next/swc-darwin-arm64@13.2.0: + resolution: {integrity: sha512-F4zbvPnq3zCTqyyM6WN8ledazzJx3OrxIdc2ewnqnfk6tjBZ/aq1M27GhEfylGjZG1KvbtJCxUqi7dR/6R94bA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + /@next/swc-darwin-arm64@13.2.4: resolution: {integrity: sha512-S6vBl+OrInP47TM3LlYx65betocKUUlTZDDKzTiRDbsRESeyIkBtZ6Qi5uT2zQs4imqllJznVjFd1bXLx3Aa6A==} engines: {node: '>= 10'} @@ -10081,6 +10085,15 @@ packages: dev: false optional: true + /@next/swc-darwin-x64@13.2.0: + resolution: {integrity: sha512-Y9+fB7TLAAnkCZQXWjwJg5bi1pT5NuNkI+HoKYp26U1J0SxW5vZWFGc31WFmmHIz3wA0zlaQfRa4mF7cpZL5yw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + /@next/swc-darwin-x64@13.2.4: resolution: {integrity: sha512-a6LBuoYGcFOPGd4o8TPo7wmv5FnMr+Prz+vYHopEDuhDoMSHOnC+v+Ab4D7F0NMZkvQjEJQdJS3rqgFhlZmKlw==} engines: {node: '>= 10'} @@ -10090,6 +10103,15 @@ packages: dev: false optional: true + /@next/swc-freebsd-x64@13.2.0: + resolution: {integrity: sha512-b9bCLlfznbV6e6Vg9wKYZJs7Uz8z/Py9105MYq95a3JlHiI3e/fvBpm1c7fe5QlvWJlqyNav6Clyu1W+lDk+IQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + /@next/swc-freebsd-x64@13.2.4: resolution: {integrity: sha512-kkbzKVZGPaXRBPisoAQkh3xh22r+TD+5HwoC5bOkALraJ0dsOQgSMAvzMXKsN3tMzJUPS0tjtRf1cTzrQ0I5vQ==} engines: {node: '>= 10'} @@ -10099,6 +10121,15 @@ packages: dev: false optional: true + /@next/swc-linux-arm-gnueabihf@13.2.0: + resolution: {integrity: sha512-jY/2JjDVVyktzRtMclAIVLgOxk5Ut9NKu8kKMCPdKMf9/ila37UpRfIh2fOXtRhv8AK7Lq/iSI/v2vjopZxZgQ==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@next/swc-linux-arm-gnueabihf@13.2.4: resolution: {integrity: sha512-7qA1++UY0fjprqtjBZaOA6cas/7GekpjVsZn/0uHvquuITFCdKGFCsKNBx3S0Rpxmx6WYo0GcmhNRM9ru08BGg==} engines: {node: '>= 10'} @@ -10108,6 +10139,15 @@ packages: dev: false optional: true + /@next/swc-linux-arm64-gnu@13.2.0: + resolution: {integrity: sha512-EKjWU3/lSBhOwPQRQLbySUnATnXygCjGd8ag3rP6d7kTIhfuPO4pY+DYW+wHOt5qB1ULNRmW0sXZ/ZKnQrVszw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@next/swc-linux-arm64-gnu@13.2.4: resolution: {integrity: sha512-xzYZdAeq883MwXgcwc72hqo/F/dwUxCukpDOkx/j1HTq/J0wJthMGjinN9wH5bPR98Mfeh1MZJ91WWPnZOedOg==} engines: {node: '>= 10'} @@ -10117,6 +10157,15 @@ packages: dev: false optional: true + /@next/swc-linux-arm64-musl@13.2.0: + resolution: {integrity: sha512-T5R9r23Docwo6PYZRzndeFB5WUN3+smMbyk25K50MAngCiSydr82/YfAetcp7Ov7Shp4a8xXP9DHDIsBas6wbQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@next/swc-linux-arm64-musl@13.2.4: resolution: {integrity: sha512-8rXr3WfmqSiYkb71qzuDP6I6R2T2tpkmf83elDN8z783N9nvTJf2E7eLx86wu2OJCi4T05nuxCsh4IOU3LQ5xw==} engines: {node: '>= 10'} @@ -10126,6 +10175,15 @@ packages: dev: false optional: true + /@next/swc-linux-x64-gnu@13.2.0: + resolution: {integrity: sha512-FeXTc2KFvUSnTJmkpNMKoBHmNA1Ujr3QdfcKnVm/gXWqK+rfuEhAiRNOo+6mPcQ0noEge1j8Ai+W1LTbdDwPZQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@next/swc-linux-x64-gnu@13.2.4: resolution: {integrity: sha512-Ngxh51zGSlYJ4EfpKG4LI6WfquulNdtmHg1yuOYlaAr33KyPJp4HeN/tivBnAHcZkoNy0hh/SbwDyCnz5PFJQQ==} engines: {node: '>= 10'} @@ -10135,6 +10193,15 @@ packages: dev: false optional: true + /@next/swc-linux-x64-musl@13.2.0: + resolution: {integrity: sha512-7Y0XMUzWDWI94pxC0xWGMWrgTFKHu/myc+GTNVEwvLtI9WA0brKqZrL1tCQW/+t6J+5XqS7w+AHbViaF+muu1A==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@next/swc-linux-x64-musl@13.2.4: resolution: {integrity: sha512-gOvwIYoSxd+j14LOcvJr+ekd9fwYT1RyMAHOp7znA10+l40wkFiMONPLWiZuHxfRk+Dy7YdNdDh3ImumvL6VwA==} engines: {node: '>= 10'} @@ -10144,6 +10211,15 @@ packages: dev: false optional: true + /@next/swc-win32-arm64-msvc@13.2.0: + resolution: {integrity: sha512-NM5h2gEMe8EtvOeRU3vRM83tq1xo6Qvhuz0xJem/176SAMxbqzAz4LLP3l9VyUI3SIzGyiztvF/1c0jqeq7UEA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + /@next/swc-win32-arm64-msvc@13.2.4: resolution: {integrity: sha512-q3NJzcfClgBm4HvdcnoEncmztxrA5GXqKeiZ/hADvC56pwNALt3ngDC6t6qr1YW9V/EPDxCYeaX4zYxHciW4Dw==} engines: {node: '>= 10'} @@ -10153,6 +10229,15 @@ packages: dev: false optional: true + /@next/swc-win32-ia32-msvc@13.2.0: + resolution: {integrity: sha512-G7YEJZX9wkcUaBOvXQSCF9Wb2sqP8hhsmFXF6po7M3llw4b+2ut2DXLf+UMdthOdUK0u+Ijhy5F7SbW9HOn2ig==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + /@next/swc-win32-ia32-msvc@13.2.4: resolution: {integrity: sha512-/eZ5ncmHUYtD2fc6EUmAIZlAJnVT2YmxDsKs1Ourx0ttTtvtma/WKlMV5NoUsyOez0f9ExLyOpeCoz5aj+MPXw==} engines: {node: '>= 10'} @@ -10162,6 +10247,15 @@ packages: dev: false optional: true + /@next/swc-win32-x64-msvc@13.2.0: + resolution: {integrity: sha512-QTAjSuPevnZnlHfC4600+4NvxRuPar6tWdYbPum9vnk3OIH1xu9YLK+2ArPGFd0bB2K8AoY2SIMbs1dhK0GjQQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + /@next/swc-win32-x64-msvc@13.2.4: resolution: {integrity: sha512-0MffFmyv7tBLlji01qc0IaPP/LVExzvj7/R5x1Jph1bTAIj4Vu81yFQWHHQAP6r4ff9Ukj1mBK6MDNVXm7Tcvw==} engines: {node: '>= 10'} @@ -10212,6 +10306,7 @@ packages: /@npmcli/move-file@2.0.1: resolution: {integrity: sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + deprecated: This functionality has been moved to @npmcli/fs dependencies: mkdirp: 1.0.4 rimraf: 3.0.2 @@ -11369,8 +11464,8 @@ packages: - zenObservable dev: true - /@sinclair/typebox@0.25.21: - resolution: {integrity: sha512-gFukHN4t8K4+wVC+ECqeqwzBDeFeTzBXroBTqE6vcWrQGbEUpHO7LYdG0f4xnvYq4VOEwITSlHlp0JBAIFMS/g==} + /@sinclair/typebox@0.25.24: + resolution: {integrity: sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==} /@sindresorhus/is@0.7.0: resolution: {integrity: sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==} @@ -11788,7 +11883,7 @@ packages: /@types/babel__generator@7.6.4: resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==} dependencies: - '@babel/types': 7.21.0 + '@babel/types': 7.21.4 dev: true /@types/babel__preset-env@7.9.2: @@ -11798,14 +11893,14 @@ packages: /@types/babel__template@7.4.1: resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} dependencies: - '@babel/parser': 7.21.0 - '@babel/types': 7.21.0 + '@babel/parser': 7.21.4 + '@babel/types': 7.21.4 dev: true /@types/babel__traverse@7.18.2: resolution: {integrity: sha512-FcFaxOr2V5KZCviw1TnutEMVUVsGt4D2hP1TAfXZAMKuHYW3xQhe3jTxNPWutgCJ3/X1c5yX8ZoGVEItxKbwBg==} dependencies: - '@babel/types': 7.21.0 + '@babel/types': 7.21.4 dev: true /@types/better-sqlite3@7.6.2: @@ -11982,13 +12077,13 @@ packages: dependencies: '@types/minimatch': 5.1.2 '@types/node': 18.15.11 + dev: true /@types/glob@8.1.0: resolution: {integrity: sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==} dependencies: '@types/minimatch': 5.1.2 '@types/node': 18.15.11 - dev: true /@types/got@8.3.6: resolution: {integrity: sha512-nvLlj+831dhdm4LR2Ly+HTpdLyBaMynoOr6wpIxS19d/bPeHQxFU5XQ6Gp6ohBpxvCWZM1uHQIC2+ySRH1rGrQ==} @@ -12229,6 +12324,14 @@ packages: csstype: 3.1.1 dev: true + /@types/react@18.0.28: + resolution: {integrity: sha512-RD0ivG1kEztNBdoAK7lekI9M+azSnitIn85h4iOiaLjaTrMjzslhaqCGaI4IyCJ1RljWiLCEu4jyrLLgqxBTew==} + dependencies: + '@types/prop-types': 15.7.5 + '@types/scheduler': 0.16.2 + csstype: 3.1.1 + dev: false + /@types/react@18.0.33: resolution: {integrity: sha512-sHxzVxeanvQyQ1lr8NSHaj0kDzcNiGpILEVt69g9S31/7PfMvNCKLKcsHw4lYKjs3cGNJjXSP4mYzX43QlnjNA==} dependencies: @@ -12253,7 +12356,7 @@ packages: /@types/rimraf@3.0.2: resolution: {integrity: sha512-F3OznnSLAUxFrCEu/L5PY8+ny8DtcFRjx7fZZ9bycvXRi3KPTRS9HOitGZwvPg0juRhXFWIeKX58cnX5YqLohQ==} dependencies: - '@types/glob': 7.2.0 + '@types/glob': 8.1.0 '@types/node': 18.15.11 /@types/scheduler@0.16.2: @@ -12496,6 +12599,26 @@ packages: - supports-color dev: true + /@typescript-eslint/parser@5.57.1(eslint@8.34.0)(typescript@4.9.5): + resolution: {integrity: sha512-hlA0BLeVSA/wBPKdPGxoVr9Pp6GutGoY380FEhbVi0Ph4WNe8kLvqIRx76RSQt1lynZKfrXKs0/XeEk4zZycuA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/scope-manager': 5.57.1 + '@typescript-eslint/types': 5.57.1 + '@typescript-eslint/typescript-estree': 5.57.1(typescript@4.9.5) + debug: 4.3.4 + eslint: 8.34.0 + typescript: 4.9.5 + transitivePeerDependencies: + - supports-color + dev: true + /@typescript-eslint/parser@5.57.1(eslint@8.37.0)(typescript@5.0.3): resolution: {integrity: sha512-hlA0BLeVSA/wBPKdPGxoVr9Pp6GutGoY380FEhbVi0Ph4WNe8kLvqIRx76RSQt1lynZKfrXKs0/XeEk4zZycuA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -12819,7 +12942,7 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: '@typescript-eslint/types': 5.40.1 - eslint-visitor-keys: 3.3.0 + eslint-visitor-keys: 3.4.0 dev: true /@typescript-eslint/visitor-keys@5.55.0: @@ -12827,7 +12950,7 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: '@typescript-eslint/types': 5.55.0 - eslint-visitor-keys: 3.3.0 + eslint-visitor-keys: 3.4.0 dev: true /@typescript-eslint/visitor-keys@5.57.0: @@ -12857,11 +12980,14 @@ packages: resolution: {integrity: sha512-S4cL7Taa9yb5qbv+6wLgiKVZ03Qfkc4jGRuiUQMQ8HGBD5pcNRnHeYM33zBvJE4/zJGjJJ8GScB+WmTsn9mORw==} dev: true - /@vercel/nft@0.22.1: - resolution: {integrity: sha512-lYYZIoxRurqDOSoVIdBicGnpUIpfyaS5qVjdPq+EfI285WqtZK3NK/dyCkiyBul+X2U2OEhRyeMdXPCHGJbohw==} + /@vercel/nft@0.22.5: + resolution: {integrity: sha512-mug57Wd1BL7GMj9gXMgMeKUjdqO0e4u+0QLPYMFE1rwdJ+55oPy6lp3nIBCS8gOvigT62UI4QKUL2sGqcoW4Hw==} + engines: {node: '>=14'} + hasBin: true dependencies: '@mapbox/node-pre-gyp': 1.0.10 - acorn: 8.8.0 + '@rollup/pluginutils': 4.2.1 + acorn: 8.8.2 async-sema: 3.1.1 bindings: 1.5.0 estree-walker: 2.0.2 @@ -12870,17 +12996,19 @@ packages: micromatch: 4.0.5 node-gyp-build: 4.5.0 resolve-from: 5.0.0 - rollup-pluginutils: 2.8.2 transitivePeerDependencies: - encoding - supports-color dev: true - /@vercel/nft@0.22.1(supports-color@9.2.3): - resolution: {integrity: sha512-lYYZIoxRurqDOSoVIdBicGnpUIpfyaS5qVjdPq+EfI285WqtZK3NK/dyCkiyBul+X2U2OEhRyeMdXPCHGJbohw==} + /@vercel/nft@0.22.5(supports-color@9.2.3): + resolution: {integrity: sha512-mug57Wd1BL7GMj9gXMgMeKUjdqO0e4u+0QLPYMFE1rwdJ+55oPy6lp3nIBCS8gOvigT62UI4QKUL2sGqcoW4Hw==} + engines: {node: '>=14'} + hasBin: true dependencies: '@mapbox/node-pre-gyp': 1.0.10(supports-color@9.2.3) - acorn: 8.8.0 + '@rollup/pluginutils': 4.2.1 + acorn: 8.8.2 async-sema: 3.1.1 bindings: 1.5.0 estree-walker: 2.0.2 @@ -12889,7 +13017,6 @@ packages: micromatch: 4.0.5 node-gyp-build: 4.5.0 resolve-from: 5.0.0 - rollup-pluginutils: 2.8.2 transitivePeerDependencies: - encoding - supports-color @@ -13189,6 +13316,13 @@ packages: - '@types/node' dev: false + /@whatwg-node/server@0.6.7: + resolution: {integrity: sha512-M4zHWdJ6M1IdcxnZBdDmiUh1bHQ4gPYRxzkH0gh8Qf6MpWJmX6I/MNftqem3GNn+qn1y47qqlGSed7T7nzsRFw==} + dependencies: + '@whatwg-node/fetch': 0.8.4 + tslib: 2.5.0 + dev: false + /@whatwg-node/server@0.7.3: resolution: {integrity: sha512-ToaxdIXka8WHre92b1n9Wne/jXPOgg5w17Hx/UqFtL+HM2+0M+AAEz31kY9bjHGaKBfWE8YZwVVIYvGMgb3ARA==} dependencies: @@ -13254,12 +13388,20 @@ packages: acorn: 8.8.0 dev: true - /acorn-jsx@5.3.2(acorn@8.8.0): + /acorn-import-assertions@1.8.0(acorn@8.8.2): + resolution: {integrity: sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==} + peerDependencies: + acorn: ^8 + dependencies: + acorn: 8.8.2 + dev: true + + /acorn-jsx@5.3.2(acorn@8.8.2): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - acorn: 8.8.0 + acorn: 8.8.2 /acorn-node@1.8.2: resolution: {integrity: sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==} @@ -13288,6 +13430,11 @@ packages: resolution: {integrity: sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==} engines: {node: '>=0.4.0'} + /acorn@8.8.2: + resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} + engines: {node: '>=0.4.0'} + hasBin: true + /agent-base@6.0.2: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} @@ -14184,7 +14331,7 @@ packages: '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.21.4) '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.21.4) '@babel/plugin-syntax-flow': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-syntax-jsx': 7.18.6(@babel/core@7.21.4) + '@babel/plugin-syntax-jsx': 7.21.4(@babel/core@7.21.4) '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.21.4) '@babel/plugin-transform-arrow-functions': 7.20.7(@babel/core@7.21.4) '@babel/plugin-transform-block-scoped-functions': 7.18.6(@babel/core@7.21.4) @@ -15392,6 +15539,7 @@ packages: /color-support@1.1.3: resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} + hasBin: true dev: true /color@3.2.1: @@ -15966,6 +16114,7 @@ packages: /cssesc@3.0.0: resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} engines: {node: '>=4'} + hasBin: true dev: true /cssnano-preset-default@5.2.12(postcss@8.4.18): @@ -17613,6 +17762,7 @@ packages: /escodegen@1.14.3: resolution: {integrity: sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==} engines: {node: '>=4.0'} + hasBin: true dependencies: esprima: 4.0.1 estraverse: 4.3.0 @@ -17624,6 +17774,7 @@ packages: /escodegen@2.0.0: resolution: {integrity: sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==} engines: {node: '>=6.0'} + hasBin: true dependencies: esprima: 4.0.1 estraverse: 5.3.0 @@ -17633,6 +17784,31 @@ packages: source-map: 0.6.1 dev: true + /eslint-config-next@13.2.0(eslint@8.34.0)(typescript@4.9.5): + resolution: {integrity: sha512-nZfIQG5m82xwgGO8EjakbF5qjnXADcveGxOxlg5J1jZ9MQlESvqqRrvl4+KHE+JKRgFD2h0q5xwDDWfFbtZmMA==} + peerDependencies: + eslint: ^7.23.0 || ^8.0.0 + typescript: '>=3.3.1' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@next/eslint-plugin-next': 13.2.0 + '@rushstack/eslint-patch': 1.2.0 + '@typescript-eslint/parser': 5.57.1(eslint@8.34.0)(typescript@4.9.5) + eslint: 8.34.0 + eslint-import-resolver-node: 0.3.7 + eslint-import-resolver-typescript: 3.5.3(eslint-plugin-import@2.27.5)(eslint@8.34.0) + eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.57.1)(eslint-import-resolver-typescript@3.5.3)(eslint@8.34.0) + eslint-plugin-jsx-a11y: 6.7.1(eslint@8.34.0) + eslint-plugin-react: 7.32.2(eslint@8.34.0) + eslint-plugin-react-hooks: 4.6.0(eslint@8.34.0) + typescript: 4.9.5 + transitivePeerDependencies: + - eslint-import-resolver-webpack + - supports-color + dev: true + /eslint-config-next@13.2.4(eslint@8.37.0)(typescript@5.0.3): resolution: {integrity: sha512-lunIBhsoeqw6/Lfkd6zPt25w1bn0znLA/JCL+au1HoEpSb4/PpsOYsYtgV/q+YPsoKIOzFyU5xnb04iZnXjUvg==} peerDependencies: @@ -17706,6 +17882,26 @@ packages: - supports-color dev: true + /eslint-import-resolver-typescript@3.5.3(eslint-plugin-import@2.27.5)(eslint@8.34.0): + resolution: {integrity: sha512-njRcKYBc3isE42LaTcJNVANR3R99H9bAxBDMNDr2W7yq5gYPxbU3MkdhsQukxZ/Xg9C2vcyLlDsbKfRDg0QvCQ==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + eslint: '*' + eslint-plugin-import: '*' + dependencies: + debug: 4.3.4 + enhanced-resolve: 5.10.0 + eslint: 8.34.0 + eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.57.1)(eslint-import-resolver-typescript@3.5.3)(eslint@8.34.0) + get-tsconfig: 4.2.0 + globby: 13.1.3 + is-core-module: 2.11.0 + is-glob: 4.0.3 + synckit: 0.8.4 + transitivePeerDependencies: + - supports-color + dev: true + /eslint-import-resolver-typescript@3.5.3(eslint-plugin-import@2.27.5)(eslint@8.37.0): resolution: {integrity: sha512-njRcKYBc3isE42LaTcJNVANR3R99H9bAxBDMNDr2W7yq5gYPxbU3MkdhsQukxZ/Xg9C2vcyLlDsbKfRDg0QvCQ==} engines: {node: ^14.18.0 || >=16.0.0} @@ -17732,8 +17928,8 @@ packages: peerDependencies: eslint: '>=8.0.0' dependencies: - acorn: 8.8.0 - acorn-jsx: 5.3.2(acorn@8.8.0) + acorn: 8.8.2 + acorn-jsx: 5.3.2(acorn@8.8.2) cosmiconfig: 7.0.1 eslint: 8.25.0 espree: 9.5.1 @@ -17811,6 +18007,36 @@ packages: - supports-color dev: true + /eslint-module-utils@2.7.4(@typescript-eslint/parser@5.57.1)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.3)(eslint@8.34.0): + resolution: {integrity: sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + dependencies: + '@typescript-eslint/parser': 5.57.1(eslint@8.34.0)(typescript@4.9.5) + debug: 3.2.7 + eslint: 8.34.0 + eslint-import-resolver-node: 0.3.7 + eslint-import-resolver-typescript: 3.5.3(eslint-plugin-import@2.27.5)(eslint@8.34.0) + transitivePeerDependencies: + - supports-color + dev: true + /eslint-plugin-es@4.1.0(eslint@8.25.0): resolution: {integrity: sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==} engines: {node: '>=8.10.0'} @@ -17888,6 +18114,39 @@ packages: - supports-color dev: true + /eslint-plugin-import@2.27.5(@typescript-eslint/parser@5.57.1)(eslint-import-resolver-typescript@3.5.3)(eslint@8.34.0): + resolution: {integrity: sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + dependencies: + '@typescript-eslint/parser': 5.57.1(eslint@8.34.0)(typescript@4.9.5) + array-includes: 3.1.6 + array.prototype.flat: 1.3.1 + array.prototype.flatmap: 1.3.1 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 8.34.0 + eslint-import-resolver-node: 0.3.7 + eslint-module-utils: 2.7.4(@typescript-eslint/parser@5.57.1)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.3)(eslint@8.34.0) + has: 1.0.3 + is-core-module: 2.11.0 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.values: 1.1.6 + resolve: 1.22.1 + semver: 6.3.0 + tsconfig-paths: 3.14.1 + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + dev: true + /eslint-plugin-jsonc@2.6.0(eslint@8.25.0): resolution: {integrity: sha512-4bA9YTx58QaWalua1Q1b82zt7eZMB7i+ed8q8cKkbKP75ofOA2SXbtFyCSok7RY6jIXeCqQnKjN9If8zCgv6PA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -17925,6 +18184,31 @@ packages: semver: 6.3.0 dev: true + /eslint-plugin-jsx-a11y@6.7.1(eslint@8.34.0): + resolution: {integrity: sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==} + engines: {node: '>=4.0'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + dependencies: + '@babel/runtime': 7.20.13 + aria-query: 5.1.3 + array-includes: 3.1.6 + array.prototype.flatmap: 1.3.1 + ast-types-flow: 0.0.7 + axe-core: 4.6.3 + axobject-query: 3.1.1 + damerau-levenshtein: 1.0.8 + emoji-regex: 9.2.2 + eslint: 8.34.0 + has: 1.0.3 + jsx-ast-utils: 3.3.3 + language-tags: 1.0.5 + minimatch: 3.1.2 + object.entries: 1.1.6 + object.fromentries: 2.0.6 + semver: 6.3.0 + dev: true + /eslint-plugin-jsx-a11y@6.7.1(eslint@8.37.0): resolution: {integrity: sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==} engines: {node: '>=4.0'} @@ -18016,6 +18300,15 @@ packages: eslint: 8.25.0 dev: true + /eslint-plugin-react-hooks@4.6.0(eslint@8.34.0): + resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + dependencies: + eslint: 8.34.0 + dev: true + /eslint-plugin-react-hooks@4.6.0(eslint@8.37.0): resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} engines: {node: '>=10'} @@ -18049,6 +18342,30 @@ packages: string.prototype.matchall: 4.0.8 dev: true + /eslint-plugin-react@7.32.2(eslint@8.34.0): + resolution: {integrity: sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + dependencies: + array-includes: 3.1.6 + array.prototype.flatmap: 1.3.1 + array.prototype.tosorted: 1.1.1 + doctrine: 2.1.0 + eslint: 8.34.0 + estraverse: 5.3.0 + jsx-ast-utils: 3.3.3 + 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.0 + string.prototype.matchall: 4.0.8 + dev: true + /eslint-plugin-react@7.32.2(eslint@8.37.0): resolution: {integrity: sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==} engines: {node: '>=4'} @@ -18165,6 +18482,16 @@ packages: eslint-visitor-keys: 2.1.0 dev: true + /eslint-utils@3.0.0(eslint@8.34.0): + resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} + engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} + peerDependencies: + eslint: '>=5' + dependencies: + eslint: 8.34.0 + eslint-visitor-keys: 2.1.0 + dev: true + /eslint-visitor-keys@1.3.0: resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==} engines: {node: '>=4'} @@ -18230,6 +18557,54 @@ packages: - supports-color dev: true + /eslint@8.34.0: + resolution: {integrity: sha512-1Z8iFsucw+7kSqXNZVslXS8Ioa4u2KM7GPwuKtkTFAqZ/cHMcEaR+1+Br0wLlot49cNxIiZk5wp8EAbPcYZxTg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + dependencies: + '@eslint/eslintrc': 1.4.1 + '@humanwhocodes/config-array': 0.11.8 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.1.1 + eslint-utils: 3.0.0(eslint@8.34.0) + eslint-visitor-keys: 3.4.0 + espree: 9.5.1 + esquery: 1.4.2 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.19.0 + grapheme-splitter: 1.0.4 + ignore: 5.2.4 + import-fresh: 3.3.0 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-sdsl: 4.3.0 + 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.1 + regexpp: 3.2.0 + strip-ansi: 6.0.1 + strip-json-comments: 3.1.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + dev: true + /eslint@8.37.0: resolution: {integrity: sha512-NU3Ps9nI05GUoVMxcZx1J8CNR6xOvUT4jAUMH5+z8lpp3aEdPVCImKw6PWG4PY+Vfkpr+jvMpxs/qoE7wq0sPw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -18283,8 +18658,8 @@ packages: resolution: {integrity: sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - acorn: 8.8.0 - acorn-jsx: 5.3.2(acorn@8.8.0) + acorn: 8.8.2 + acorn-jsx: 5.3.2(acorn@8.8.2) eslint-visitor-keys: 3.4.0 dev: true @@ -18292,8 +18667,8 @@ packages: resolution: {integrity: sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - acorn: 8.8.0 - acorn-jsx: 5.3.2(acorn@8.8.0) + acorn: 8.8.2 + acorn-jsx: 5.3.2(acorn@8.8.2) eslint-visitor-keys: 3.4.0 /esprima@4.0.1: @@ -20445,6 +20820,25 @@ packages: graphql: 16.6.0 dev: false + /graphql-yoga@3.7.0(graphql@16.6.0): + resolution: {integrity: sha512-yL5oAD1VnK2J8qZFNVy+T2Z5t7YByv7HmCB1fzE26hoILEgY97eKvDYZwXRcPxoN/OhzbN8I42ffCf0dv9Dp8g==} + peerDependencies: + graphql: ^15.2.0 || ^16.0.0 + dependencies: + '@envelop/core': 3.0.4 + '@envelop/validation-cache': 5.1.2(@envelop/core@3.0.4)(graphql@16.6.0) + '@graphql-tools/executor': 0.0.14(graphql@16.6.0) + '@graphql-tools/schema': 9.0.17(graphql@16.6.0) + '@graphql-tools/utils': 9.2.1(graphql@16.6.0) + '@graphql-yoga/subscription': 3.1.0 + '@whatwg-node/fetch': 0.8.4 + '@whatwg-node/server': 0.6.7 + dset: 3.1.2 + graphql: 16.6.0 + lru-cache: 7.18.3 + tslib: 2.5.0 + dev: false + /graphql-yoga@3.7.2(graphql@16.6.0): resolution: {integrity: sha512-T7Uxrf2Mc8RTqcSrVz69Fwek4VHwLEhxjgkiX6VVtO76ngWBCp6kNQGmcw06LGQz4PRkhMg9dbM3XAGxfCB73A==} peerDependencies: @@ -22641,13 +23035,14 @@ packages: /json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} + hasBin: true dev: true /jsonc-eslint-parser@2.1.0: resolution: {integrity: sha512-qCRJWlbP2v6HbmKW7R3lFbeiVWHo+oMJ0j+MizwvauqnCV/EvtAeEeuCgoc/ErtsuoKgYB8U4Ih8AxJbXoE6/g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - acorn: 8.8.0 + acorn: 8.8.2 eslint-visitor-keys: 3.4.0 espree: 9.5.1 semver: 7.3.8 @@ -24192,8 +24587,8 @@ packages: /micromark-extension-mdxjs@1.0.0: resolution: {integrity: sha512-TZZRZgeHvtgm+IhtgC2+uDMR7h8eTKF0QUX9YsgoL9+bADBpBY6SiLvWqnBlLbCEevITmTqmEuY3FoxMKVs1rQ==} dependencies: - acorn: 8.8.0 - acorn-jsx: 5.3.2(acorn@8.8.0) + acorn: 8.8.2 + acorn-jsx: 5.3.2(acorn@8.8.2) micromark-extension-mdx-expression: 1.0.3 micromark-extension-mdx-jsx: 1.0.3 micromark-extension-mdx-md: 1.0.0 @@ -25244,6 +25639,53 @@ packages: - webpack dev: false + /next@13.2.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-vhByvKHedsaMwNTwXKzK4IMmNp7XI7vN4etcGUoIpLrIuDfoYA3bS0ImS4X9F6lKzopG5aVp7a1CjuzF2NGkvA==} + engines: {node: '>=14.6.0'} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.4.0 + fibers: '>= 3.1.0' + node-sass: ^6.0.0 || ^7.0.0 + react: ^18.2.0 + react-dom: ^18.2.0 + sass: ^1.3.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + fibers: + optional: true + node-sass: + optional: true + sass: + optional: true + dependencies: + '@next/env': 13.2.0 + '@swc/helpers': 0.4.14 + caniuse-lite: 1.0.30001421 + postcss: 8.4.14 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + styled-jsx: 5.1.1(react@18.2.0) + optionalDependencies: + '@next/swc-android-arm-eabi': 13.2.0 + '@next/swc-android-arm64': 13.2.0 + '@next/swc-darwin-arm64': 13.2.0 + '@next/swc-darwin-x64': 13.2.0 + '@next/swc-freebsd-x64': 13.2.0 + '@next/swc-linux-arm-gnueabihf': 13.2.0 + '@next/swc-linux-arm64-gnu': 13.2.0 + '@next/swc-linux-arm64-musl': 13.2.0 + '@next/swc-linux-x64-gnu': 13.2.0 + '@next/swc-linux-x64-musl': 13.2.0 + '@next/swc-win32-arm64-msvc': 13.2.0 + '@next/swc-win32-ia32-msvc': 13.2.0 + '@next/swc-win32-x64-msvc': 13.2.0 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + dev: false + /next@13.2.4(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-g1I30317cThkEpvzfXujf0O4wtaQHtDCLhlivwlTJ885Ld+eOgcz7r3TGQzeU+cSRoNHtD8tsJgzxVdYojFssw==} engines: {node: '>=14.6.0'} @@ -25440,6 +25882,7 @@ packages: /node-gyp-build@4.5.0: resolution: {integrity: sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==} + hasBin: true dev: true /node-gyp@9.3.1: @@ -25512,6 +25955,7 @@ packages: /nopt@5.0.0: resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} engines: {node: '>=6'} + hasBin: true dependencies: abbrev: 1.1.1 dev: true @@ -25519,6 +25963,7 @@ packages: /nopt@6.0.0: resolution: {integrity: sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + hasBin: true dependencies: abbrev: 1.1.1 dev: true @@ -28436,6 +28881,7 @@ packages: /rimraf@3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true dependencies: glob: 7.2.3 @@ -30174,7 +30620,7 @@ packages: engines: {node: '>=10'} dependencies: '@jridgewell/source-map': 0.3.2 - acorn: 8.8.0 + acorn: 8.8.2 commander: 2.20.3 source-map-support: 0.5.21 dev: true @@ -31709,8 +32155,9 @@ packages: /vm2@3.9.14: resolution: {integrity: sha512-HgvPHYHeQy8+QhzlFryvSteA4uQLBCOub02mgqdR+0bN/akRZ48TGB1v0aCv7ksyc0HXx16AZtMHKS38alc6TA==} engines: {node: '>=6.0'} + hasBin: true dependencies: - acorn: 8.8.0 + acorn: 8.8.2 acorn-walk: 8.2.0 dev: true @@ -31822,7 +32269,7 @@ packages: engines: {node: '>= 10.13.0'} hasBin: true dependencies: - acorn: 8.8.0 + acorn: 8.8.2 acorn-walk: 8.2.0 chalk: 4.1.2 commander: 7.2.0 @@ -31861,8 +32308,8 @@ packages: '@webassemblyjs/ast': 1.11.1 '@webassemblyjs/wasm-edit': 1.11.1 '@webassemblyjs/wasm-parser': 1.11.1 - acorn: 8.8.0 - acorn-import-assertions: 1.8.0(acorn@8.8.0) + acorn: 8.8.2 + acorn-import-assertions: 1.8.0(acorn@8.8.2) browserslist: 4.21.4 chrome-trace-event: 1.0.3 enhanced-resolve: 5.10.0 diff --git a/tsconfig.json b/tsconfig.json index 62720d9d4a..837a4ebae9 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -39,5 +39,12 @@ "jsx": "preserve" }, "include": ["packages"], - "exclude": ["**/dist", "**/temp", "**/.bob", "**/examples", "**/benchmark"] + "exclude": [ + "**/dist", + "**/temp", + "**/.bob", + "**/examples", + "**/benchmark", + "**/e2e" + ] } diff --git a/website/src/pages/docs/integrations/_meta.json b/website/src/pages/docs/integrations/_meta.json index 12ae27242d..ef26e126b2 100644 --- a/website/src/pages/docs/integrations/_meta.json +++ b/website/src/pages/docs/integrations/_meta.json @@ -6,10 +6,11 @@ "integration-with-fastify": "Fastify", "integration-with-koa": "Koa", "integration-with-nestjs": "NestJS", - "integration-with-nextjs": "Next.js", + "integration-with-nextjs": "Next.js (Vercel)", "integration-with-sveltekit": "SvelteKit", "integration-with-hapi": "Hapi", "integration-with-bun": "Bun", "integration-with-uwebsockets": "uWebSockets", + "integration-with-gcp": "Google Cloud Platform (GCP)", "z-other-environments": "Other Environments" } diff --git a/website/src/pages/docs/integrations/integration-with-aws-lambda.mdx b/website/src/pages/docs/integrations/integration-with-aws-lambda.mdx index ff16d3fddc..b437ed34a4 100644 --- a/website/src/pages/docs/integrations/integration-with-aws-lambda.mdx +++ b/website/src/pages/docs/integrations/integration-with-aws-lambda.mdx @@ -10,7 +10,7 @@ AWS Lambda is a serverless computing platform that makes it easy to build applic ## Installation - + ## Example diff --git a/website/src/pages/docs/integrations/integration-with-bun.mdx b/website/src/pages/docs/integrations/integration-with-bun.mdx index 6bb05c20d4..5576ee43ea 100644 --- a/website/src/pages/docs/integrations/integration-with-bun.mdx +++ b/website/src/pages/docs/integrations/integration-with-bun.mdx @@ -12,7 +12,7 @@ So the configuration is really simple like any other JS runtime with Yoga; ## Installation - + ## Usage diff --git a/website/src/pages/docs/integrations/integration-with-cloudflare-workers.mdx b/website/src/pages/docs/integrations/integration-with-cloudflare-workers.mdx index 84e415ae2d..87d02f4c29 100644 --- a/website/src/pages/docs/integrations/integration-with-cloudflare-workers.mdx +++ b/website/src/pages/docs/integrations/integration-with-cloudflare-workers.mdx @@ -21,7 +21,7 @@ You will want to use the package `graphql-yoga` which has an agnostic HTTP handl ## Installation - + ## Example with regular `fetch` event listener diff --git a/website/src/pages/docs/integrations/integration-with-express.mdx b/website/src/pages/docs/integrations/integration-with-express.mdx index cdbe32d1e3..d5a32eab91 100644 --- a/website/src/pages/docs/integrations/integration-with-express.mdx +++ b/website/src/pages/docs/integrations/integration-with-express.mdx @@ -16,7 +16,7 @@ You can easily integrate GraphQL Yoga into your Express application with a few l ## Installation - + ## Example diff --git a/website/src/pages/docs/integrations/integration-with-fastify.mdx b/website/src/pages/docs/integrations/integration-with-fastify.mdx index bcfc332068..a947159c9b 100644 --- a/website/src/pages/docs/integrations/integration-with-fastify.mdx +++ b/website/src/pages/docs/integrations/integration-with-fastify.mdx @@ -14,7 +14,7 @@ So you can benefit from the powerful plugins of Fastify ecosystem with GraphQL Y ## Installation - + ## Example diff --git a/website/src/pages/docs/integrations/integration-with-gcp.mdx b/website/src/pages/docs/integrations/integration-with-gcp.mdx index 0cf519bf24..a75b74d297 100644 --- a/website/src/pages/docs/integrations/integration-with-gcp.mdx +++ b/website/src/pages/docs/integrations/integration-with-gcp.mdx @@ -11,7 +11,7 @@ It is easy to use GraphQL Yoga with GCP. ## Installation - + ## Usage diff --git a/website/src/pages/docs/integrations/integration-with-koa.mdx b/website/src/pages/docs/integrations/integration-with-koa.mdx index e0da7a211b..ed16826872 100644 --- a/website/src/pages/docs/integrations/integration-with-koa.mdx +++ b/website/src/pages/docs/integrations/integration-with-koa.mdx @@ -11,7 +11,7 @@ GraphQL Yoga can be integrated easily as a route to the existing Koa application ## Installation - + ## Example diff --git a/website/src/pages/docs/integrations/integration-with-nextjs.mdx b/website/src/pages/docs/integrations/integration-with-nextjs.mdx index a5452e85a4..f1f5171f97 100644 --- a/website/src/pages/docs/integrations/integration-with-nextjs.mdx +++ b/website/src/pages/docs/integrations/integration-with-nextjs.mdx @@ -2,7 +2,7 @@ description: Next.js is a web framework that allows you to build websites very quickly and GraphQL Yoga can be integrated with Next.js easily as an API Route. --- -import { PackageCmd } from '@theguild/components' +import { PackageCmd, Callout } from '@theguild/components' # Integration with Next.js @@ -10,7 +10,7 @@ import { PackageCmd } from '@theguild/components' ## Installation - + ## Example @@ -51,6 +51,43 @@ export default createYoga<{ > You can also check a full example on our GitHub repository [here](https://github.com/dotansimha/graphql-yoga/tree/v3/examples/nextjs) +## Edge Function + + + Edge functions is a feature of the Vercel platform and not available when + using Next.js as a standalone server. Learn more about edge functions on the + [Vercel documentation](https://nextjs.org/docs/api-routes/edge-functions). + + +For edge functions you need to adjust the `config` object to include the `runtime` property with the value `"edge"` and export `yoga.handleRequest` instead of `yoga`. + +```ts filename="pages/api/graphql.ts" {2-5,24} +import { createYoga, createSchema } from 'graphql-yoga' + +export const config = { + runtime: 'edge' +} + +const yoga = createYoga({ + graphqlEndpoint: '/api/graphql', + schema: createSchema({ + typeDefs: /* GraphQL */ ` + type Query { + greetings: String + } + `, + resolvers: { + Query: { + greetings: () => + 'This is the `greetings` field of the root `Query` type' + } + } + }) +}) + +export default yoga.handleRequest +``` + ## WebSockets for subscriptions WebSockets cannot be used with [Next.js API Routes](https://nextjs.org/docs/api-routes/introduction), we therefore have to create a [custom Next.js server](https://nextjs.org/docs/advanced-features/custom-server) that will serve the GraphQL API, WebSockets and the rest of Next.js content.