├── .github ├── stale.yml └── workflows │ ├── ci.yml │ └── publish.yml ├── .gitignore ├── .npmignore ├── .vscode └── settings.json ├── LICENSE ├── README.md ├── docs └── logo.svg ├── examples ├── next-turbo │ ├── .eslintrc.js │ ├── .gitignore │ ├── README.md │ ├── apps │ │ ├── docs │ │ │ ├── .eslintrc.js │ │ │ ├── README.md │ │ │ ├── next-env.d.ts │ │ │ ├── next.config.js │ │ │ ├── package.json │ │ │ ├── pages │ │ │ │ └── index.tsx │ │ │ └── tsconfig.json │ │ └── web │ │ │ ├── .eslintrc.js │ │ │ ├── README.md │ │ │ ├── common │ │ │ └── api.ts │ │ │ ├── next-env.d.ts │ │ │ ├── next.config.js │ │ │ ├── package.json │ │ │ ├── pages │ │ │ ├── _app.tsx │ │ │ ├── api │ │ │ │ └── [...zodios].ts │ │ │ └── index.tsx │ │ │ ├── server │ │ │ ├── context.ts │ │ │ └── routers │ │ │ │ └── app.ts │ │ │ └── tsconfig.json │ ├── package.json │ ├── packages │ │ ├── eslint-config-custom │ │ │ ├── index.js │ │ │ └── package.json │ │ ├── tsconfig │ │ │ ├── README.md │ │ │ ├── base.json │ │ │ ├── nextjs.json │ │ │ ├── package.json │ │ │ └── react-library.json │ │ └── ui │ │ │ ├── Button.tsx │ │ │ ├── index.tsx │ │ │ ├── package.json │ │ │ └── tsconfig.json │ ├── pnpm-lock.yaml │ ├── pnpm-workspace.yaml │ └── turbo.json ├── next │ ├── .eslintrc.json │ ├── .gitignore │ ├── README.md │ ├── client │ │ └── api.ts │ ├── common │ │ └── api.ts │ ├── next.config.js │ ├── package.json │ ├── pages │ │ ├── _app.tsx │ │ ├── api │ │ │ └── [...zodios].ts │ │ └── index.tsx │ ├── public │ │ ├── favicon.ico │ │ └── vercel.svg │ ├── server │ │ ├── context.ts │ │ └── routers │ │ │ ├── app.ts │ │ │ └── users.ts │ ├── styles │ │ ├── Home.module.css │ │ └── globals.css │ ├── tsconfig.json │ └── yarn.lock └── server.ts ├── jest.config.ts ├── package.json ├── renovate.json ├── src ├── index.ts ├── zodios-validator.ts ├── zodios.spec.ts ├── zodios.ts ├── zodios.types.ts ├── zodios.utils.spec.ts └── zodios.utils.ts ├── tsconfig.build.json ├── tsconfig.json ├── tsup.config.js └── yarn.lock /.github/stale.yml: -------------------------------------------------------------------------------- 1 | daysUntilStale: 30 2 | # Number of days of inactivity before a stale issue is closed 3 | daysUntilClose: 7 4 | # Issues with these labels will never be considered stale 5 | exemptLabels: 6 | - pinned 7 | - security 8 | # Label to use when marking an issue as stale 9 | staleLabel: wontfix 10 | # Comment to post when marking an issue as stale. Set to `false` to disable 11 | markComment: > 12 | This issue has been automatically marked as stale because it has not had 13 | recent activity. It will be closed if no further activity occurs. Thank you 14 | for your contributions. 15 | # Comment to post when closing a stale issue. Set to `false` to disable 16 | closeComment: false 17 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | # This workflow will do a clean installation of node dependencies, cache/restore them, build the source code and run tests across different versions of node 2 | # For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions 3 | 4 | name: CI 5 | 6 | on: 7 | push: 8 | branches: [main] 9 | paths: 10 | - src/** 11 | - yarn.lock 12 | - package.json 13 | - tsconfig.json 14 | pull_request: 15 | branches: [main] 16 | paths: 17 | - src/** 18 | - yarn.lock 19 | - package.json 20 | - tsconfig.json 21 | 22 | jobs: 23 | build: 24 | name: Build 25 | runs-on: ubuntu-latest 26 | strategy: 27 | matrix: 28 | node-version: [14.x, 16.x, 18.x] 29 | # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ 30 | 31 | steps: 32 | - uses: actions/checkout@v4 33 | - name: Use Node.js ${{ matrix.node-version }} 34 | uses: actions/setup-node@v4 35 | with: 36 | node-version: ${{ matrix.node-version }} 37 | cache: "yarn" 38 | - run: yarn install --ignore-engines 39 | - run: yarn build 40 | - run: yarn test 41 | analyze: 42 | name: Analyze 43 | runs-on: ubuntu-latest 44 | permissions: 45 | actions: read 46 | contents: read 47 | security-events: write 48 | strategy: 49 | fail-fast: false 50 | matrix: 51 | language: ["javascript"] 52 | steps: 53 | - name: Checkout repository 54 | uses: actions/checkout@v4 55 | - name: Initialize CodeQL 56 | uses: github/codeql-action/init@v2 57 | with: 58 | languages: ${{ matrix.language }} 59 | - name: Perform CodeQL Analysis 60 | uses: github/codeql-action/analyze@v2 61 | -------------------------------------------------------------------------------- /.github/workflows/publish.yml: -------------------------------------------------------------------------------- 1 | # publish on npm when there is a new version tag 2 | 3 | name: publish 4 | on: 5 | push: 6 | tags: [v*] 7 | 8 | jobs: 9 | publish: 10 | runs-on: ubuntu-latest 11 | strategy: 12 | matrix: 13 | node-version: [16.x] 14 | steps: 15 | - uses: actions/checkout@v4 16 | - name: Use Node.js ${{ matrix.node-version }} 17 | uses: actions/setup-node@v4 18 | with: 19 | registry-url: "https://registry.npmjs.org" 20 | node-version: ${{ matrix.node-version }} 21 | cache: "yarn" 22 | - name: install dependencies 23 | run: yarn install 24 | - name: build 25 | run: yarn build 26 | - name: run test 27 | run: yarn test 28 | - name: publish to npm 29 | # only run when tag has no 'rc' in it 30 | if: ${{ !contains(github.ref, 'rc') }} 31 | run: yarn publish --access public 32 | env: 33 | NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} 34 | - name: publish beta to npm 35 | # only run when tag has 'rc' in it 36 | if: ${{ contains(github.ref, 'rc') }} 37 | run: yarn publish --access public --tag beta 38 | env: 39 | NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} 40 | - name: generate changelog 41 | uses: orhun/git-cliff-action@v2 42 | id: cliff 43 | with: 44 | args: --latest --strip footer 45 | env: 46 | OUTPUT: CHANGES.md 47 | - name: save changelog 48 | id: changelog 49 | shell: bash 50 | run: | 51 | changelog=$(cat ${{ steps.cliff.outputs.changelog }}) 52 | changelog="${changelog//'%'/'%25'}" 53 | changelog="${changelog//$'\n'/'%0A'}" 54 | changelog="${changelog//$'\r'/'%0D'}" 55 | echo "changelog=$changelog" >> $GITHUB_OUTPUT 56 | - name: create release 57 | id: release 58 | uses: actions/create-release@v1 59 | env: 60 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 61 | with: 62 | tag_name: ${{ github.ref }} 63 | release_name: Release ${{ github.ref }} 64 | body: ${{ steps.changelog.outputs.changelog }} 65 | draft: false 66 | prerelease: false 67 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | 9 | # Diagnostic reports (https://nodejs.org/api/report.html) 10 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 11 | 12 | # Runtime data 13 | pids 14 | *.pid 15 | *.seed 16 | *.pid.lock 17 | 18 | # Directory for instrumented libs generated by jscoverage/JSCover 19 | lib-cov 20 | 21 | # Coverage directory used by tools like istanbul 22 | coverage 23 | *.lcov 24 | 25 | # nyc test coverage 26 | .nyc_output 27 | 28 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 29 | .grunt 30 | 31 | # Bower dependency directory (https://bower.io/) 32 | bower_components 33 | 34 | # node-waf configuration 35 | .lock-wscript 36 | 37 | # Compiled binary addons (https://nodejs.org/api/addons.html) 38 | build/Release 39 | 40 | # Dependency directories 41 | node_modules/ 42 | jspm_packages/ 43 | 44 | # TypeScript v1 declaration files 45 | typings/ 46 | 47 | # TypeScript cache 48 | *.tsbuildinfo 49 | 50 | # Optional npm cache directory 51 | .npm 52 | 53 | # Optional eslint cache 54 | .eslintcache 55 | 56 | # Microbundle cache 57 | .rpt2_cache/ 58 | .rts2_cache_cjs/ 59 | .rts2_cache_es/ 60 | .rts2_cache_umd/ 61 | 62 | # Optional REPL history 63 | .node_repl_history 64 | 65 | # Output of 'npm pack' 66 | *.tgz 67 | 68 | # Yarn Integrity file 69 | .yarn-integrity 70 | 71 | # dotenv environment variables file 72 | .env 73 | .env.test 74 | 75 | # parcel-bundler cache (https://parceljs.org/) 76 | .cache 77 | 78 | # Next.js build output 79 | .next 80 | 81 | # Nuxt.js build / generate output 82 | .nuxt 83 | dist 84 | lib 85 | 86 | # Gatsby files 87 | .cache/ 88 | # Comment in the public line in if your project uses Gatsby and *not* Next.js 89 | # https://nextjs.org/blog/next-9-1#public-directory-support 90 | # public 91 | 92 | # vuepress build output 93 | .vuepress/dist 94 | 95 | # Serverless directories 96 | .serverless/ 97 | 98 | # FuseBox cache 99 | .fusebox/ 100 | 101 | # DynamoDB Local files 102 | .dynamodb/ 103 | 104 | # TernJS port file 105 | .tern-port 106 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | # compiled output 2 | !/lib 3 | /node_modules 4 | /src 5 | /examples 6 | 7 | # Logs 8 | logs 9 | *.log 10 | npm-debug.log* 11 | yarn-debug.log* 12 | yarn-error.log* 13 | lerna-debug.log* 14 | 15 | # OS 16 | .DS_Store 17 | 18 | # Tests 19 | /coverage 20 | /.nyc_output 21 | 22 | # IDEs and editors 23 | /.idea 24 | .project 25 | .classpath 26 | .c9/ 27 | *.launch 28 | .settings/ 29 | *.sublime-workspace 30 | 31 | # IDE - VSCode 32 | .vscode/* 33 | !.vscode/settings.json 34 | !.vscode/tasks.json 35 | !.vscode/launch.json 36 | !.vscode/extensions.json 37 | 38 | # ENV 39 | .env 40 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "typescript.tsdk": "node_modules/typescript/lib" 3 | } 4 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 ecyrbe 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

Zodios Express

2 |

3 | 4 | Zodios logo 5 | 6 |

7 |

8 | Zodios express is a typescript end to end typesafe adapter for express using zod 9 |
10 |

11 | 12 |

13 | 14 | langue typescript 15 | 16 | 17 | npm 18 | 19 | 20 | GitHub 21 | 22 | GitHub Workflow Status 23 |

24 | 25 | https://user-images.githubusercontent.com/633115/185851987-554f5686-cb78-4096-8ff5-c8d61b645608.mp4 26 | 27 | # What is it ? 28 | 29 | It's an express adapter for zodios that helps you type your express routes. 30 | 31 | - really simple centralized API declaration 32 | - router endpoints autocompletion 33 | - typescript autocompletion for query, path, header and body input parameters (`req` is fully typed) 34 | - typescript autocompletion for response body (`res.json()`) 35 | - input validation thanks to zod 36 | - openapi specification generation out of the box (using swagger) 37 | - end to end typesafe APIs (a la tRPC when using both @zodios/express and @zodios/core) 38 | 39 | **Table of contents:** 40 | 41 | - [What is it ?](#what-is-it-) 42 | - [Install](#install) 43 | - [How to use it ?](#how-to-use-it-) 44 | - [`zodiosApp` : Declare your API for fullstack end to end type safety](#zodiosapp--declare-your-api-for-fullstack-end-to-end-type-safety) 45 | - [`zodiosRouter` : Split your application with multiple routers](#zodiosrouter--split-your-application-with-multiple-routers) 46 | - [Error Handling](#error-handling) 47 | - [Roadmap](#roadmap) 48 | 49 | # Install 50 | 51 | ```bash 52 | > npm install @zodios/express 53 | ``` 54 | 55 | or 56 | 57 | ```bash 58 | > yarn add @zodios/express 59 | ``` 60 | 61 | # How to use it ? 62 | 63 | For an almost complete example on how to use zodios and how to split your APIs declarations, take a look at [dev.to](examples/dev.to/) example. 64 | 65 | ## `zodiosApp` : Declare your API for fullstack end to end type safety 66 | 67 | Here is an example of API declaration with Zodios. 68 | 69 | in a common directory (ex: `src/common/api.ts`) : 70 | 71 | ```typescript 72 | import { makeApi } from "@zodios/core"; 73 | import { z } from "zod"; 74 | 75 | const userApi = makeApi([ 76 | { 77 | method: "get", 78 | path: "/users/:id", // auto detect :id and ask for it in apiClient get params 79 | alias: "getUser", // optionnal alias to call this endpoint with it 80 | description: "Get a user", 81 | response: z.object({ 82 | id: z.number(), 83 | name: z.string(), 84 | }), 85 | }, 86 | ]); 87 | ``` 88 | 89 | in your frontend (ex: `src/client/api.ts`) : 90 | 91 | ```typescript 92 | import { Zodios } from "@zodios/core"; 93 | import { userApi } from "../../common/api"; 94 | 95 | const apiClient = new Zodios( 96 | "https://jsonplaceholder.typicode.com", 97 | userApi 98 | ); 99 | 100 | // typed alias auto-complete params 101 | // ▼ ▼ ▼ 102 | const user = await apiClient.getUser({ params: { id: 1 } }); 103 | ``` 104 | 105 | in your backend (ex: `src/server/router.ts`) : 106 | ```typescript 107 | import { zodiosApp } from "@zodios/express"; 108 | import { userApi } from "../../common/api"; 109 | 110 | // just an express adapter that is aware of your api, app is just an express app with type annotations and validation middlewares 111 | const app = zodiosApp(userApi); 112 | 113 | // auto-complete path fully typed and validated input params (body, query, path, header) 114 | // ▼ ▼ ▼ 115 | app.get("/users/:id", (req, res) => { 116 | // res.json is typed thanks to zod 117 | res.json({ 118 | // auto-complete req.params.id 119 | // ▼ 120 | id: req.params.id, 121 | name: "John Doe", 122 | }); 123 | }) 124 | 125 | app.listen(3000); 126 | ``` 127 | 128 | ## `zodiosRouter` : Split your application with multiple routers 129 | 130 | When organizing your express application, you usually want to split your API declarations into separate Routers. 131 | You can use the `zodiosRouter` to do that with a `zodiosApp` without APIs attached. 132 | 133 | ```typescript 134 | import { zodiosApp, zodiosRouter } from "@zodios/express"; 135 | 136 | const app = zodiosApp(); // just an axpess app with type annotations 137 | const userRouter = zodiosRouter(userApi); // just an express router with type annotations and validation middlewares 138 | const adminRouter = zodiosRouter(adminApi); // just an express router with type annotations and validation middlewares 139 | 140 | const app.use(userRouter,adminRouter); 141 | 142 | app.listen(3000); 143 | ``` 144 | ## Error Handling 145 | 146 | Zodios express can infer the status code to match your API error response and also have your errors correctly typed. 147 | 148 | ```typescript 149 | import { makeApi } from "@zodios/core"; 150 | import { zodiosApp } from "@zodios/express"; 151 | import { z } from "zod"; 152 | 153 | const userApi = makeApi([ 154 | { 155 | method: "get", 156 | path: "/users/:id", // auto detect :id and ask for it in apiClient get params 157 | alias: "getUser", // optionnal alias to call this endpoint with it 158 | description: "Get a user", 159 | response: z.object({ 160 | id: z.number(), 161 | name: z.string(), 162 | }), 163 | errors: [ 164 | { 165 | status: 404, 166 | response: z.object({ 167 | code: z.string(), 168 | message: z.string(), 169 | id: z.number(), 170 | }), 171 | }, { 172 | status: 'default', // default status code will be used if error is not 404 173 | response: z.object({ 174 | code: z.string(), 175 | message: z.string(), 176 | }), 177 | }, 178 | ], 179 | }, 180 | ]); 181 | 182 | const app = zodiosApp(userApi); 183 | app.get("/users/:id", (req, res) => { 184 | try { 185 | const id = +req.params.id; 186 | const user = service.findUser(id); 187 | if(!user) { 188 | // match error 404 schema with auto-completion 189 | res.status(404).json({ 190 | code: "USER_NOT_FOUND", 191 | message: "User not found", 192 | id, // compile time error if you forget to add id 193 | }); 194 | } else { 195 | // match response schema with auto-completion 196 | res.json(user); 197 | } 198 | } catch(err) { 199 | // match default error schema with auto-completion 200 | res.status(500).json({ 201 | code: "INTERNAL_ERROR", 202 | message: "Internal error", 203 | }); 204 | } 205 | }) 206 | 207 | app.listen(3000); 208 | ``` 209 | 210 | # Roadmap 211 | 212 | - [] add support for swagger/openapi generation 213 | - [] add utilities to combine api declarations to match the express router api 214 | - [] add autocompletion for express `app.name()` 215 | -------------------------------------------------------------------------------- /docs/logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 14 | 16 | 34 | 39 | 40 | -------------------------------------------------------------------------------- /examples/next-turbo/.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | // This tells ESLint to load the config from the package `eslint-config-custom` 4 | extends: ["custom"], 5 | settings: { 6 | next: { 7 | rootDir: ["apps/*/"], 8 | }, 9 | }, 10 | }; 11 | -------------------------------------------------------------------------------- /examples/next-turbo/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | node_modules 5 | .pnp 6 | .pnp.js 7 | 8 | # testing 9 | coverage 10 | 11 | # next.js 12 | .next/ 13 | out/ 14 | build 15 | 16 | # misc 17 | .DS_Store 18 | *.pem 19 | 20 | # debug 21 | npm-debug.log* 22 | yarn-debug.log* 23 | yarn-error.log* 24 | .pnpm-debug.log* 25 | 26 | # local env files 27 | .env.local 28 | .env.development.local 29 | .env.test.local 30 | .env.production.local 31 | 32 | # turbo 33 | .turbo 34 | -------------------------------------------------------------------------------- /examples/next-turbo/README.md: -------------------------------------------------------------------------------- 1 | # Turborepo starter 2 | 3 | This is an official pnpm starter turborepo. 4 | 5 | ## What's inside? 6 | 7 | This turborepo uses [pnpm](https://pnpm.io) as a package manager. It includes the following packages/apps: 8 | 9 | ### Apps and Packages 10 | 11 | - `docs`: a [Next.js](https://nextjs.org) app 12 | - `web`: another [Next.js](https://nextjs.org) app 13 | - `ui`: a stub React component library shared by both `web` and `docs` applications 14 | - `eslint-config-custom`: `eslint` configurations (includes `eslint-config-next` and `eslint-config-prettier`) 15 | - `tsconfig`: `tsconfig.json`s used throughout the monorepo 16 | 17 | Each package/app is 100% [TypeScript](https://www.typescriptlang.org/). 18 | 19 | ### Utilities 20 | 21 | This turborepo has some additional tools already setup for you: 22 | 23 | - [TypeScript](https://www.typescriptlang.org/) for static type checking 24 | - [ESLint](https://eslint.org/) for code linting 25 | - [Prettier](https://prettier.io) for code formatting 26 | 27 | ### Build 28 | 29 | To build all apps and packages, run the following command: 30 | 31 | ``` 32 | cd my-turborepo 33 | pnpm run build 34 | ``` 35 | 36 | ### Develop 37 | 38 | To develop all apps and packages, run the following command: 39 | 40 | ``` 41 | cd my-turborepo 42 | pnpm run dev 43 | ``` 44 | 45 | ### Remote Caching 46 | 47 | Turborepo can use a technique known as [Remote Caching](https://turborepo.org/docs/core-concepts/remote-caching) to share cache artifacts across machines, enabling you to share build caches with your team and CI/CD pipelines. 48 | 49 | By default, Turborepo will cache locally. To enable Remote Caching you will need an account with Vercel. If you don't have an account you can [create one](https://vercel.com/signup), then enter the following commands: 50 | 51 | ``` 52 | cd my-turborepo 53 | pnpm dlx turbo login 54 | ``` 55 | 56 | This will authenticate the Turborepo CLI with your [Vercel account](https://vercel.com/docs/concepts/personal-accounts/overview). 57 | 58 | Next, you can link your Turborepo to your Remote Cache by running the following command from the root of your turborepo: 59 | 60 | ``` 61 | pnpm dlx turbo link 62 | ``` 63 | 64 | ## Useful Links 65 | 66 | Learn more about the power of Turborepo: 67 | 68 | - [Pipelines](https://turborepo.org/docs/core-concepts/pipelines) 69 | - [Caching](https://turborepo.org/docs/core-concepts/caching) 70 | - [Remote Caching](https://turborepo.org/docs/core-concepts/remote-caching) 71 | - [Scoped Tasks](https://turborepo.org/docs/core-concepts/scopes) 72 | - [Configuration Options](https://turborepo.org/docs/reference/configuration) 73 | - [CLI Usage](https://turborepo.org/docs/reference/command-line-reference) 74 | -------------------------------------------------------------------------------- /examples/next-turbo/apps/docs/.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | extends: ["custom"], 4 | }; 5 | -------------------------------------------------------------------------------- /examples/next-turbo/apps/docs/README.md: -------------------------------------------------------------------------------- 1 | ## Getting Started 2 | 3 | First, run the development server: 4 | 5 | ```bash 6 | yarn dev 7 | ``` 8 | 9 | Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. 10 | 11 | You can start editing the page by modifying `pages/index.js`. The page auto-updates as you edit the file. 12 | 13 | [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`. 14 | 15 | 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. 16 | 17 | ## Learn More 18 | 19 | To learn more about Next.js, take a look at the following resources: 20 | 21 | - [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. 22 | - [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. 23 | 24 | You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome! 25 | 26 | ## Deploy on Vercel 27 | 28 | The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_source=github.com&utm_medium=referral&utm_campaign=turborepo-readme) from the creators of Next.js. 29 | 30 | Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details. 31 | -------------------------------------------------------------------------------- /examples/next-turbo/apps/docs/next-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | 4 | // NOTE: This file should not be edited 5 | // see https://nextjs.org/docs/basic-features/typescript for more information. 6 | -------------------------------------------------------------------------------- /examples/next-turbo/apps/docs/next.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | reactStrictMode: true, 3 | experimental: { 4 | transpilePackages: ["ui"], 5 | }, 6 | }; 7 | -------------------------------------------------------------------------------- /examples/next-turbo/apps/docs/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "docs", 3 | "version": "0.0.0", 4 | "private": true, 5 | "scripts": { 6 | "dev": "next dev --port 3001", 7 | "build": "next build", 8 | "start": "next start", 9 | "lint": "next lint" 10 | }, 11 | "dependencies": { 12 | "next": "12.3.1", 13 | "react": "18.2.0", 14 | "react-dom": "18.2.0", 15 | "ui": "workspace:*" 16 | }, 17 | "devDependencies": { 18 | "@babel/core": "^7.0.0", 19 | "eslint-config-custom": "workspace:*", 20 | "eslint": "7.32.0", 21 | "tsconfig": "workspace:*", 22 | "@types/node": "^17.0.12", 23 | "@types/react": "^18.0.22", 24 | "@types/react-dom": "^18.0.7", 25 | "typescript": "^4.5.3" 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /examples/next-turbo/apps/docs/pages/index.tsx: -------------------------------------------------------------------------------- 1 | import { Button } from "ui"; 2 | 3 | export default function Docs() { 4 | return ( 5 |
6 |

Docs

7 |
9 | ); 10 | } 11 | -------------------------------------------------------------------------------- /examples/next-turbo/apps/docs/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "tsconfig/nextjs.json", 3 | "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"], 4 | "exclude": ["node_modules"] 5 | } 6 | -------------------------------------------------------------------------------- /examples/next-turbo/apps/web/.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | extends: ["custom"], 4 | }; 5 | -------------------------------------------------------------------------------- /examples/next-turbo/apps/web/README.md: -------------------------------------------------------------------------------- 1 | ## Getting Started 2 | 3 | First, run the development server: 4 | 5 | ```bash 6 | yarn dev 7 | ``` 8 | 9 | Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. 10 | 11 | You can start editing the page by modifying `pages/index.js`. The page auto-updates as you edit the file. 12 | 13 | [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`. 14 | 15 | 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. 16 | 17 | ## Learn More 18 | 19 | To learn more about Next.js, take a look at the following resources: 20 | 21 | - [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. 22 | - [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. 23 | 24 | You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome! 25 | 26 | ## Deploy on Vercel 27 | 28 | The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_source=github.com&utm_medium=referral&utm_campaign=turborepo-readme) from the creators of Next.js. 29 | 30 | Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details. 31 | -------------------------------------------------------------------------------- /examples/next-turbo/apps/web/common/api.ts: -------------------------------------------------------------------------------- 1 | import { makeApi } from "@zodios/core"; 2 | import z from "zod"; 3 | 4 | export const api = makeApi([ 5 | { 6 | method: "get", 7 | path: "/health", 8 | alias: "health", 9 | response: z.object({ 10 | status: z.literal("ok"), 11 | }), 12 | }, 13 | ]); 14 | -------------------------------------------------------------------------------- /examples/next-turbo/apps/web/next-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | 4 | // NOTE: This file should not be edited 5 | // see https://nextjs.org/docs/basic-features/typescript for more information. 6 | -------------------------------------------------------------------------------- /examples/next-turbo/apps/web/next.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | reactStrictMode: true, 3 | experimental: { 4 | transpilePackages: ["ui"], 5 | }, 6 | }; 7 | -------------------------------------------------------------------------------- /examples/next-turbo/apps/web/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "web", 3 | "version": "0.0.0", 4 | "private": true, 5 | "scripts": { 6 | "dev": "next dev", 7 | "build": "next build", 8 | "start": "next start", 9 | "lint": "next lint" 10 | }, 11 | "dependencies": { 12 | "@tanstack/react-query": "^4.13.0", 13 | "@zodios/core": "^10.4.3", 14 | "@zodios/express": "^10.4.2", 15 | "@zodios/react": "^10.3.3", 16 | "axios": "^1.1.3", 17 | "express": "^4.18.2", 18 | "next": "12.3.2-canary.40", 19 | "react": "18.2.0", 20 | "react-dom": "18.2.0", 21 | "ui": "workspace:0.0.0", 22 | "zod": "^3.19.1" 23 | }, 24 | "devDependencies": { 25 | "@babel/core": "^7.19.6", 26 | "@types/express": "^4.17.14", 27 | "@types/node": "^17.0.45", 28 | "@types/react": "^18.0.24", 29 | "@types/react-dom": "^18.0.8", 30 | "eslint": "7.32.0", 31 | "eslint-config-custom": "workspace:0.0.0", 32 | "tsconfig": "workspace:0.0.0", 33 | "typescript": "^4.8.4" 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /examples/next-turbo/apps/web/pages/_app.tsx: -------------------------------------------------------------------------------- 1 | import type { AppProps } from "next/app"; 2 | import { QueryClientProvider, QueryClient } from "@tanstack/react-query"; 3 | 4 | const queryClient = new QueryClient(); 5 | 6 | function MyApp({ Component, pageProps }: AppProps) { 7 | return ( 8 | 9 | 10 | 11 | ); 12 | } 13 | 14 | export default MyApp; 15 | -------------------------------------------------------------------------------- /examples/next-turbo/apps/web/pages/api/[...zodios].ts: -------------------------------------------------------------------------------- 1 | import { app } from "../../server/routers/app"; 2 | 3 | export default app; 4 | -------------------------------------------------------------------------------- /examples/next-turbo/apps/web/pages/index.tsx: -------------------------------------------------------------------------------- 1 | import { Button } from "ui"; 2 | import { api } from "../common/api"; 3 | import { Zodios } from "@zodios/core"; 4 | import { ZodiosHooks } from "@zodios/react"; 5 | 6 | const zodios = new Zodios("/api", api); 7 | const zodiosHooks = new ZodiosHooks("health", zodios); 8 | 9 | export default function Web() { 10 | const { data: health, isLoading } = zodiosHooks.useHealth(); 11 | return ( 12 |
13 |

Health Status

14 | {isLoading ? ( 15 |

Loading...

16 | ) : ( 17 |

18 | Status: {health?.status} 19 |

20 | )} 21 |
22 | ); 23 | } 24 | -------------------------------------------------------------------------------- /examples/next-turbo/apps/web/server/context.ts: -------------------------------------------------------------------------------- 1 | import { zodiosContext } from "@zodios/express"; 2 | import z from "zod"; 3 | 4 | export const ctx = zodiosContext( 5 | z.object({ 6 | user: z.object({ 7 | id: z.string(), 8 | name: z.string(), 9 | }), 10 | }) 11 | ); 12 | -------------------------------------------------------------------------------- /examples/next-turbo/apps/web/server/routers/app.ts: -------------------------------------------------------------------------------- 1 | import { ctx } from "../context"; 2 | import { api } from "../../common/api"; 3 | 4 | export const app = ctx.nextApp(); 5 | const router = ctx.router(api); 6 | app.use("/api", router); 7 | 8 | router.get("/health", (req, res) => { 9 | res.status(200).json({ status: "ok" }); 10 | }); 11 | -------------------------------------------------------------------------------- /examples/next-turbo/apps/web/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "tsconfig/nextjs.json", 3 | "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"], 4 | "exclude": ["node_modules"] 5 | } 6 | -------------------------------------------------------------------------------- /examples/next-turbo/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "zodios-turbo", 3 | "version": "0.0.0", 4 | "private": true, 5 | "workspaces": [ 6 | "apps/*", 7 | "packages/*" 8 | ], 9 | "scripts": { 10 | "build": "turbo run build", 11 | "dev": "turbo run dev --parallel", 12 | "lint": "turbo run lint", 13 | "format": "prettier --write \"**/*.{ts,tsx,md}\"" 14 | }, 15 | "devDependencies": { 16 | "eslint-config-custom": "workspace:*", 17 | "prettier": "latest", 18 | "turbo": "latest" 19 | }, 20 | "engines": { 21 | "node": ">=14.0.0" 22 | }, 23 | "dependencies": {}, 24 | "packageManager": "pnpm@7.14.0" 25 | } -------------------------------------------------------------------------------- /examples/next-turbo/packages/eslint-config-custom/index.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | extends: ["next", "turbo", "prettier"], 3 | rules: { 4 | "@next/next/no-html-link-for-pages": "off", 5 | "react/jsx-key": "off", 6 | }, 7 | }; 8 | -------------------------------------------------------------------------------- /examples/next-turbo/packages/eslint-config-custom/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "eslint-config-custom", 3 | "version": "0.0.0", 4 | "main": "index.js", 5 | "license": "MIT", 6 | "dependencies": { 7 | "eslint": "^7.23.0", 8 | "eslint-config-next": "^12.0.8", 9 | "eslint-config-prettier": "^8.3.0", 10 | "eslint-plugin-react": "7.31.8", 11 | "eslint-config-turbo": "latest" 12 | }, 13 | "devDependencies": { 14 | "typescript": "^4.7.4" 15 | }, 16 | "publishConfig": { 17 | "access": "public" 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /examples/next-turbo/packages/tsconfig/README.md: -------------------------------------------------------------------------------- 1 | # `tsconfig` 2 | 3 | These are base shared `tsconfig.json`s from which all other `tsconfig.json`'s inherit from. 4 | -------------------------------------------------------------------------------- /examples/next-turbo/packages/tsconfig/base.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/tsconfig", 3 | "display": "Default", 4 | "compilerOptions": { 5 | "composite": false, 6 | "declaration": true, 7 | "declarationMap": true, 8 | "esModuleInterop": true, 9 | "forceConsistentCasingInFileNames": true, 10 | "inlineSources": false, 11 | "isolatedModules": true, 12 | "moduleResolution": "node", 13 | "noUnusedLocals": false, 14 | "noUnusedParameters": false, 15 | "preserveWatchOutput": true, 16 | "skipLibCheck": true, 17 | "strict": true 18 | }, 19 | "exclude": ["node_modules"] 20 | } 21 | -------------------------------------------------------------------------------- /examples/next-turbo/packages/tsconfig/nextjs.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/tsconfig", 3 | "display": "Next.js", 4 | "extends": "./base.json", 5 | "compilerOptions": { 6 | "target": "ES6", 7 | "lib": ["dom", "dom.iterable", "esnext"], 8 | "allowJs": true, 9 | "skipLibCheck": true, 10 | "strict": true, 11 | "forceConsistentCasingInFileNames": true, 12 | "noEmit": true, 13 | "incremental": true, 14 | "esModuleInterop": true, 15 | "module": "esnext", 16 | "moduleResolution": "Node", 17 | "resolveJsonModule": true, 18 | "isolatedModules": true, 19 | "jsx": "preserve" 20 | }, 21 | "include": ["src", "next-env.d.ts"], 22 | "exclude": ["node_modules"] 23 | } 24 | -------------------------------------------------------------------------------- /examples/next-turbo/packages/tsconfig/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "tsconfig", 3 | "version": "0.0.0", 4 | "private": true, 5 | "files": [ 6 | "base.json", 7 | "nextjs.json", 8 | "react-library.json" 9 | ] 10 | } 11 | -------------------------------------------------------------------------------- /examples/next-turbo/packages/tsconfig/react-library.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/tsconfig", 3 | "display": "React Library", 4 | "extends": "./base.json", 5 | "compilerOptions": { 6 | "jsx": "react-jsx", 7 | "lib": ["ES2015"], 8 | "module": "ESNext", 9 | "target": "es6" 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /examples/next-turbo/packages/ui/Button.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react"; 2 | export const Button = () => { 3 | return ; 4 | }; 5 | -------------------------------------------------------------------------------- /examples/next-turbo/packages/ui/index.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react"; 2 | export * from "./Button"; 3 | -------------------------------------------------------------------------------- /examples/next-turbo/packages/ui/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ui", 3 | "version": "0.0.0", 4 | "main": "./index.tsx", 5 | "types": "./index.tsx", 6 | "license": "MIT", 7 | "scripts": { 8 | "lint": "eslint *.ts*" 9 | }, 10 | "devDependencies": { 11 | "@types/react": "^18.0.17", 12 | "@types/react-dom": "^18.0.6", 13 | "eslint": "^7.32.0", 14 | "eslint-config-custom": "workspace:*", 15 | "react": "^18.2.0", 16 | "tsconfig": "workspace:*", 17 | "typescript": "^4.5.2" 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /examples/next-turbo/packages/ui/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "tsconfig/react-library.json", 3 | "include": ["."], 4 | "exclude": ["dist", "build", "node_modules"] 5 | } 6 | -------------------------------------------------------------------------------- /examples/next-turbo/pnpm-workspace.yaml: -------------------------------------------------------------------------------- 1 | packages: 2 | - "apps/*" 3 | - "packages/*" 4 | -------------------------------------------------------------------------------- /examples/next-turbo/turbo.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://turborepo.org/schema.json", 3 | "pipeline": { 4 | "build": { 5 | "dependsOn": ["^build"], 6 | "outputs": ["dist/**", ".next/**"] 7 | }, 8 | "lint": { 9 | "outputs": [] 10 | }, 11 | "dev": { 12 | "cache": false 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /examples/next/.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "next/core-web-vitals" 3 | } 4 | -------------------------------------------------------------------------------- /examples/next/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # next.js 12 | /.next/ 13 | /out/ 14 | 15 | # production 16 | /build 17 | 18 | # misc 19 | .DS_Store 20 | *.pem 21 | 22 | # debug 23 | npm-debug.log* 24 | yarn-debug.log* 25 | yarn-error.log* 26 | .pnpm-debug.log* 27 | 28 | # local env files 29 | .env*.local 30 | 31 | # vercel 32 | .vercel 33 | 34 | # typescript 35 | *.tsbuildinfo 36 | next-env.d.ts 37 | -------------------------------------------------------------------------------- /examples/next/README.md: -------------------------------------------------------------------------------- 1 | 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). 2 | 3 | ## Getting Started 4 | 5 | First, run the development server: 6 | 7 | ```bash 8 | npm run dev 9 | # or 10 | yarn dev 11 | ``` 12 | 13 | Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. 14 | 15 | You can start editing the page by modifying `pages/index.tsx`. The page auto-updates as you edit the file. 16 | 17 | [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.ts`. 18 | 19 | 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. 20 | 21 | ## Learn More 22 | 23 | To learn more about Next.js, take a look at the following resources: 24 | 25 | - [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. 26 | - [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. 27 | 28 | You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome! 29 | 30 | ## Deploy on Vercel 31 | 32 | 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. 33 | 34 | Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details. 35 | -------------------------------------------------------------------------------- /examples/next/client/api.ts: -------------------------------------------------------------------------------- 1 | import { Zodios } from "@zodios/core"; 2 | import { ZodiosHooks } from "@zodios/react"; 3 | import { userApi } from "../common/api"; 4 | 5 | export const userClientApi = new Zodios("/api", userApi); 6 | export const userClientHooks = new ZodiosHooks("users", userClientApi); 7 | -------------------------------------------------------------------------------- /examples/next/common/api.ts: -------------------------------------------------------------------------------- 1 | import z from "zod"; 2 | import { makeApi } from "@zodios/core"; 3 | 4 | const user = z.object({ 5 | id: z.number(), 6 | name: z.string(), 7 | age: z.number().positive(), 8 | email: z.string().email(), 9 | }); 10 | 11 | export const userApi = makeApi([ 12 | { 13 | method: "get", 14 | path: "/users", 15 | alias: "getUsers", 16 | response: z.array(user), 17 | }, 18 | { 19 | method: "get", 20 | path: "/users/:id", 21 | alias: "getUser", 22 | parameters: [ 23 | { 24 | name: "id", 25 | type: "Path", 26 | schema: z.number().positive(), 27 | }, 28 | ], 29 | response: user, 30 | errors: [ 31 | { 32 | status: "default", 33 | schema: z.object({ 34 | error: z.object({ 35 | code: z.number(), 36 | message: z.string(), 37 | }), 38 | }), 39 | }, 40 | ], 41 | }, 42 | { 43 | method: "post", 44 | path: "/users", 45 | alias: "createUser", 46 | parameters: [ 47 | { 48 | name: "user", 49 | type: "Body", 50 | schema: user.omit({ id: true }), 51 | }, 52 | ], 53 | response: user, 54 | }, 55 | ]); 56 | -------------------------------------------------------------------------------- /examples/next/next.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('next').NextConfig} */ 2 | const nextConfig = { 3 | reactStrictMode: true, 4 | swcMinify: true, 5 | }; 6 | 7 | module.exports = nextConfig; 8 | -------------------------------------------------------------------------------- /examples/next/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "zodios-next-app", 3 | "version": "0.1.0", 4 | "private": true, 5 | "scripts": { 6 | "dev": "next dev", 7 | "build": "next build", 8 | "start": "next start", 9 | "lint": "next lint" 10 | }, 11 | "dependencies": { 12 | "@tanstack/react-query": "4.13.0", 13 | "@zodios/core": "10.7.3", 14 | "@zodios/express": "10.4.4", 15 | "@zodios/react": "10.4.3", 16 | "axios": "1.2.6", 17 | "express": "4.18.2", 18 | "next": "12.2.5", 19 | "react": "18.2.0", 20 | "react-dom": "18.2.0", 21 | "zod": "3.20.2" 22 | }, 23 | "devDependencies": { 24 | "@types/express": "4.17.16", 25 | "@types/node": "18.11.18", 26 | "@types/react": "18.0.27", 27 | "@types/react-dom": "18.0.10", 28 | "eslint": "8.32.0", 29 | "eslint-config-next": "12.2.5", 30 | "typescript": "4.9.4" 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /examples/next/pages/_app.tsx: -------------------------------------------------------------------------------- 1 | import "../styles/globals.css"; 2 | import type { AppProps } from "next/app"; 3 | import { QueryClientProvider, QueryClient } from "@tanstack/react-query"; 4 | 5 | const queryClient = new QueryClient(); 6 | 7 | function MyApp({ Component, pageProps }: AppProps) { 8 | return ( 9 | 10 | 11 | 12 | ); 13 | } 14 | 15 | export default MyApp; 16 | -------------------------------------------------------------------------------- /examples/next/pages/api/[...zodios].ts: -------------------------------------------------------------------------------- 1 | import { app } from "../../server/routers/app"; 2 | 3 | export default app; 4 | -------------------------------------------------------------------------------- /examples/next/pages/index.tsx: -------------------------------------------------------------------------------- 1 | import type { NextPage } from "next"; 2 | import { useState } from "react"; 3 | import Head from "next/head"; 4 | import styles from "../styles/Home.module.css"; 5 | import { userClientHooks } from "../client/api"; 6 | 7 | const Users = () => { 8 | const [count, setCount] = useState(1); 9 | const { 10 | data: users, 11 | error, 12 | isLoading, 13 | invalidate, 14 | } = userClientHooks.useGetUsers(); 15 | const { mutate } = userClientHooks.useMutation("post", "/users", undefined, { 16 | onSuccess: () => invalidate(), 17 | }); 18 | if (isLoading) { 19 | return
Loading...
; 20 | } 21 | if (error) { 22 | return
{JSON.stringify(error)}
; 23 | } 24 | 25 | return ( 26 |
27 | 39 | {users?.map((user) => ( 40 |
41 | {user.name} - {user.email} 42 |
43 | ))} 44 |
45 | ); 46 | }; 47 | 48 | const Home: NextPage = () => { 49 | return ( 50 |
51 | 52 | Zodios Example App 53 | 54 | 55 | 56 |

Users

57 | 58 |
59 | ); 60 | }; 61 | 62 | export default Home; 63 | -------------------------------------------------------------------------------- /examples/next/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ecyrbe/zodios-express/f4f6c45eb99814fa74309bfae012c100352cc1a5/examples/next/public/favicon.ico -------------------------------------------------------------------------------- /examples/next/public/vercel.svg: -------------------------------------------------------------------------------- 1 | 3 | 4 | -------------------------------------------------------------------------------- /examples/next/server/context.ts: -------------------------------------------------------------------------------- 1 | import { zodiosContext } from "@zodios/express"; 2 | import z from "zod"; 3 | 4 | const user = z.object({ 5 | id: z.number(), 6 | name: z.string(), 7 | email: z.string().email(), 8 | }); 9 | 10 | export const ctx = zodiosContext(z.object({ user })); 11 | -------------------------------------------------------------------------------- /examples/next/server/routers/app.ts: -------------------------------------------------------------------------------- 1 | import { ctx } from "../context"; 2 | import { userRouter } from "./users"; 3 | 4 | export const app = ctx.nextApp(); 5 | app.use("/api", userRouter); 6 | -------------------------------------------------------------------------------- /examples/next/server/routers/users.ts: -------------------------------------------------------------------------------- 1 | import { ctx } from "../context"; 2 | import { userApi } from "../../common/api"; 3 | 4 | const users = [ 5 | { 6 | id: 1, 7 | name: "John Doe", 8 | age: 30, 9 | email: "john.doe@test.com", 10 | }, 11 | ]; 12 | 13 | export const userRouter = ctx.router(userApi); 14 | 15 | userRouter.get("/users", (req, res) => { 16 | return res.status(200).json(users); 17 | }); 18 | 19 | userRouter.get("/users/:id", (req, res) => { 20 | const user = users.find((u) => u.id === req.params.id); 21 | if (!user) { 22 | return res.status(404).json({ 23 | error: { 24 | code: 404, 25 | message: "User not found", 26 | }, 27 | }); 28 | } 29 | return res.status(200).json(user); 30 | }); 31 | 32 | userRouter.post("/users", (req, res) => { 33 | const id = users.length + 1; 34 | const user = { ...req.body, id }; 35 | users.push(user); 36 | return res.status(201).json(user); 37 | }); 38 | -------------------------------------------------------------------------------- /examples/next/styles/Home.module.css: -------------------------------------------------------------------------------- 1 | .container { 2 | padding: 0 2rem; 3 | } 4 | 5 | .main { 6 | min-height: 100vh; 7 | padding: 4rem 0; 8 | flex: 1; 9 | display: flex; 10 | flex-direction: column; 11 | justify-content: center; 12 | align-items: center; 13 | } 14 | 15 | .footer { 16 | display: flex; 17 | flex: 1; 18 | padding: 2rem 0; 19 | border-top: 1px solid #eaeaea; 20 | justify-content: center; 21 | align-items: center; 22 | } 23 | 24 | .footer a { 25 | display: flex; 26 | justify-content: center; 27 | align-items: center; 28 | flex-grow: 1; 29 | } 30 | 31 | .title a { 32 | color: #0070f3; 33 | text-decoration: none; 34 | } 35 | 36 | .title a:hover, 37 | .title a:focus, 38 | .title a:active { 39 | text-decoration: underline; 40 | } 41 | 42 | .title { 43 | margin: 0; 44 | line-height: 1.15; 45 | font-size: 4rem; 46 | } 47 | 48 | .title, 49 | .description { 50 | text-align: center; 51 | } 52 | 53 | .description { 54 | margin: 4rem 0; 55 | line-height: 1.5; 56 | font-size: 1.5rem; 57 | } 58 | 59 | .code { 60 | background: #fafafa; 61 | border-radius: 5px; 62 | padding: 0.75rem; 63 | font-size: 1.1rem; 64 | font-family: Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono, 65 | Bitstream Vera Sans Mono, Courier New, monospace; 66 | } 67 | 68 | .grid { 69 | display: flex; 70 | align-items: center; 71 | justify-content: center; 72 | flex-wrap: wrap; 73 | max-width: 800px; 74 | } 75 | 76 | .card { 77 | margin: 1rem; 78 | padding: 1.5rem; 79 | text-align: left; 80 | color: inherit; 81 | text-decoration: none; 82 | border: 1px solid #eaeaea; 83 | border-radius: 10px; 84 | transition: color 0.15s ease, border-color 0.15s ease; 85 | max-width: 300px; 86 | } 87 | 88 | .card:hover, 89 | .card:focus, 90 | .card:active { 91 | color: #0070f3; 92 | border-color: #0070f3; 93 | } 94 | 95 | .card h2 { 96 | margin: 0 0 1rem 0; 97 | font-size: 1.5rem; 98 | } 99 | 100 | .card p { 101 | margin: 0; 102 | font-size: 1.25rem; 103 | line-height: 1.5; 104 | } 105 | 106 | .logo { 107 | height: 1em; 108 | margin-left: 0.5rem; 109 | } 110 | 111 | @media (max-width: 600px) { 112 | .grid { 113 | width: 100%; 114 | flex-direction: column; 115 | } 116 | } 117 | 118 | @media (prefers-color-scheme: dark) { 119 | .card, 120 | .footer { 121 | border-color: #222; 122 | } 123 | .code { 124 | background: #111; 125 | } 126 | .logo img { 127 | filter: invert(1); 128 | } 129 | } 130 | -------------------------------------------------------------------------------- /examples/next/styles/globals.css: -------------------------------------------------------------------------------- 1 | html, 2 | body { 3 | padding: 0; 4 | margin: 0; 5 | font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, 6 | Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif; 7 | } 8 | 9 | a { 10 | color: inherit; 11 | text-decoration: none; 12 | } 13 | 14 | * { 15 | box-sizing: border-box; 16 | } 17 | 18 | @media (prefers-color-scheme: dark) { 19 | html { 20 | color-scheme: dark; 21 | } 22 | body { 23 | color: white; 24 | background: black; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /examples/next/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "lib": ["dom", "dom.iterable", "esnext"], 5 | "allowJs": true, 6 | "skipLibCheck": true, 7 | "strict": true, 8 | "forceConsistentCasingInFileNames": true, 9 | "noEmit": true, 10 | "esModuleInterop": true, 11 | "module": "esnext", 12 | "moduleResolution": "node", 13 | "resolveJsonModule": true, 14 | "isolatedModules": true, 15 | "jsx": "preserve", 16 | "incremental": true 17 | }, 18 | "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"], 19 | "exclude": ["node_modules"] 20 | } 21 | -------------------------------------------------------------------------------- /examples/next/yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@babel/runtime-corejs3@^7.10.2": 6 | version "7.18.9" 7 | resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.18.9.tgz#7bacecd1cb2dd694eacd32a91fcf7021c20770ae" 8 | integrity sha512-qZEWeccZCrHA2Au4/X05QW5CMdm4VjUDCrGq5gf1ZDcM4hRqreKrtwAn7yci9zfgAS9apvnsFXiGBHBAxZdK9A== 9 | dependencies: 10 | core-js-pure "^3.20.2" 11 | regenerator-runtime "^0.13.4" 12 | 13 | "@babel/runtime@^7.10.2", "@babel/runtime@^7.18.9": 14 | version "7.18.9" 15 | resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.18.9.tgz#b4fcfce55db3d2e5e080d2490f608a3b9f407f4a" 16 | integrity sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw== 17 | dependencies: 18 | regenerator-runtime "^0.13.4" 19 | 20 | "@eslint/eslintrc@^1.4.1": 21 | version "1.4.1" 22 | resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.4.1.tgz#af58772019a2d271b7e2d4c23ff4ddcba3ccfb3e" 23 | integrity sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA== 24 | dependencies: 25 | ajv "^6.12.4" 26 | debug "^4.3.2" 27 | espree "^9.4.0" 28 | globals "^13.19.0" 29 | ignore "^5.2.0" 30 | import-fresh "^3.2.1" 31 | js-yaml "^4.1.0" 32 | minimatch "^3.1.2" 33 | strip-json-comments "^3.1.1" 34 | 35 | "@humanwhocodes/config-array@^0.11.8": 36 | version "0.11.8" 37 | resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.8.tgz#03595ac2075a4dc0f191cc2131de14fbd7d410b9" 38 | integrity sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g== 39 | dependencies: 40 | "@humanwhocodes/object-schema" "^1.2.1" 41 | debug "^4.1.1" 42 | minimatch "^3.0.5" 43 | 44 | "@humanwhocodes/module-importer@^1.0.1": 45 | version "1.0.1" 46 | resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" 47 | integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== 48 | 49 | "@humanwhocodes/object-schema@^1.2.1": 50 | version "1.2.1" 51 | resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" 52 | integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== 53 | 54 | "@next/env@12.2.5": 55 | version "12.2.5" 56 | resolved "https://registry.yarnpkg.com/@next/env/-/env-12.2.5.tgz#d908c57b35262b94db3e431e869b72ac3e1ad3e3" 57 | integrity sha512-vLPLV3cpPGjUPT3PjgRj7e3nio9t6USkuew3JE/jMeon/9Mvp1WyR18v3iwnCuX7eUAm1HmAbJHHLAbcu/EJcw== 58 | 59 | "@next/eslint-plugin-next@12.2.5": 60 | version "12.2.5" 61 | resolved "https://registry.yarnpkg.com/@next/eslint-plugin-next/-/eslint-plugin-next-12.2.5.tgz#4f3acccd2ed4f9300fbf9fd480cc8a0b261889a8" 62 | integrity sha512-VBjVbmqEzGiOTBq4+wpeVXt/KgknnGB6ahvC/AxiIGnN93/RCSyXhFRI4uSfftM2Ba3w7ZO7076bfKasZsA0fw== 63 | dependencies: 64 | glob "7.1.7" 65 | 66 | "@next/swc-android-arm-eabi@12.2.5": 67 | version "12.2.5" 68 | resolved "https://registry.yarnpkg.com/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-12.2.5.tgz#903a5479ab4c2705d9c08d080907475f7bacf94d" 69 | integrity sha512-cPWClKxGhgn2dLWnspW+7psl3MoLQUcNqJqOHk2BhNcou9ARDtC0IjQkKe5qcn9qg7I7U83Gp1yh2aesZfZJMA== 70 | 71 | "@next/swc-android-arm64@12.2.5": 72 | version "12.2.5" 73 | resolved "https://registry.yarnpkg.com/@next/swc-android-arm64/-/swc-android-arm64-12.2.5.tgz#2f9a98ec4166c7860510963b31bda1f57a77c792" 74 | integrity sha512-vMj0efliXmC5b7p+wfcQCX0AfU8IypjkzT64GiKJD9PgiA3IILNiGJr1fw2lyUDHkjeWx/5HMlMEpLnTsQslwg== 75 | 76 | "@next/swc-darwin-arm64@12.2.5": 77 | version "12.2.5" 78 | resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-12.2.5.tgz#31b1c3c659d54be546120c488a1e1bad21c24a1d" 79 | integrity sha512-VOPWbO5EFr6snla/WcxUKtvzGVShfs302TEMOtzYyWni6f9zuOetijJvVh9CCTzInnXAZMtHyNhefijA4HMYLg== 80 | 81 | "@next/swc-darwin-x64@12.2.5": 82 | version "12.2.5" 83 | resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-12.2.5.tgz#2e44dd82b2b7fef88238d1bc4d3bead5884cedfd" 84 | integrity sha512-5o8bTCgAmtYOgauO/Xd27vW52G2/m3i5PX7MUYePquxXAnX73AAtqA3WgPXBRitEB60plSKZgOTkcpqrsh546A== 85 | 86 | "@next/swc-freebsd-x64@12.2.5": 87 | version "12.2.5" 88 | resolved "https://registry.yarnpkg.com/@next/swc-freebsd-x64/-/swc-freebsd-x64-12.2.5.tgz#e24e75d8c2581bfebc75e4f08f6ddbd116ce9dbd" 89 | integrity sha512-yYUbyup1JnznMtEBRkK4LT56N0lfK5qNTzr6/DEyDw5TbFVwnuy2hhLBzwCBkScFVjpFdfiC6SQAX3FrAZzuuw== 90 | 91 | "@next/swc-linux-arm-gnueabihf@12.2.5": 92 | version "12.2.5" 93 | resolved "https://registry.yarnpkg.com/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-12.2.5.tgz#46d8c514d834d2b5f67086013f0bd5e3081e10b9" 94 | integrity sha512-2ZE2/G921Acks7UopJZVMgKLdm4vN4U0yuzvAMJ6KBavPzqESA2yHJlm85TV/K9gIjKhSk5BVtauIUntFRP8cg== 95 | 96 | "@next/swc-linux-arm64-gnu@12.2.5": 97 | version "12.2.5" 98 | resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-12.2.5.tgz#91f725ac217d3a1f4f9f53b553615ba582fd3d9f" 99 | integrity sha512-/I6+PWVlz2wkTdWqhlSYYJ1pWWgUVva6SgX353oqTh8njNQp1SdFQuWDqk8LnM6ulheVfSsgkDzxrDaAQZnzjQ== 100 | 101 | "@next/swc-linux-arm64-musl@12.2.5": 102 | version "12.2.5" 103 | resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-12.2.5.tgz#e627e8c867920995810250303cd9b8e963598383" 104 | integrity sha512-LPQRelfX6asXyVr59p5sTpx5l+0yh2Vjp/R8Wi4X9pnqcayqT4CUJLiHqCvZuLin3IsFdisJL0rKHMoaZLRfmg== 105 | 106 | "@next/swc-linux-x64-gnu@12.2.5": 107 | version "12.2.5" 108 | resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-12.2.5.tgz#83a5e224fbc4d119ef2e0f29d0d79c40cc43887e" 109 | integrity sha512-0szyAo8jMCClkjNK0hknjhmAngUppoRekW6OAezbEYwHXN/VNtsXbfzgYOqjKWxEx3OoAzrT3jLwAF0HdX2MEw== 110 | 111 | "@next/swc-linux-x64-musl@12.2.5": 112 | version "12.2.5" 113 | resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-12.2.5.tgz#be700d48471baac1ec2e9539396625584a317e95" 114 | integrity sha512-zg/Y6oBar1yVnW6Il1I/08/2ukWtOG6s3acdJdEyIdsCzyQi4RLxbbhkD/EGQyhqBvd3QrC6ZXQEXighQUAZ0g== 115 | 116 | "@next/swc-win32-arm64-msvc@12.2.5": 117 | version "12.2.5" 118 | resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-12.2.5.tgz#a93e958133ad3310373fda33a79aa10af2a0aa97" 119 | integrity sha512-3/90DRNSqeeSRMMEhj4gHHQlLhhKg5SCCoYfE3kBjGpE63EfnblYUqsszGGZ9ekpKL/R4/SGB40iCQr8tR5Jiw== 120 | 121 | "@next/swc-win32-ia32-msvc@12.2.5": 122 | version "12.2.5" 123 | resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-12.2.5.tgz#4f5f7ba0a98ff89a883625d4af0125baed8b2e19" 124 | integrity sha512-hGLc0ZRAwnaPL4ulwpp4D2RxmkHQLuI8CFOEEHdzZpS63/hMVzv81g8jzYA0UXbb9pus/iTc3VRbVbAM03SRrw== 125 | 126 | "@next/swc-win32-x64-msvc@12.2.5": 127 | version "12.2.5" 128 | resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-12.2.5.tgz#20fed129b04a0d3f632c6d0de135345bb623b1e4" 129 | integrity sha512-7h5/ahY7NeaO2xygqVrSG/Y8Vs4cdjxIjowTZ5W6CKoTKn7tmnuxlUc2h74x06FKmbhAd9agOjr/AOKyxYYm9Q== 130 | 131 | "@nodelib/fs.scandir@2.1.5": 132 | version "2.1.5" 133 | resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" 134 | integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== 135 | dependencies: 136 | "@nodelib/fs.stat" "2.0.5" 137 | run-parallel "^1.1.9" 138 | 139 | "@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": 140 | version "2.0.5" 141 | resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" 142 | integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== 143 | 144 | "@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": 145 | version "1.2.8" 146 | resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" 147 | integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== 148 | dependencies: 149 | "@nodelib/fs.scandir" "2.1.5" 150 | fastq "^1.6.0" 151 | 152 | "@rushstack/eslint-patch@^1.1.3": 153 | version "1.1.4" 154 | resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.1.4.tgz#0c8b74c50f29ee44f423f7416829c0bf8bb5eb27" 155 | integrity sha512-LwzQKA4vzIct1zNZzBmRKI9QuNpLgTQMEjsQLf3BXuGYb3QPTP4Yjf6mkdX+X1mYttZ808QpOwAzZjv28kq7DA== 156 | 157 | "@swc/helpers@0.4.3": 158 | version "0.4.3" 159 | resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.4.3.tgz#16593dfc248c53b699d4b5026040f88ddb497012" 160 | integrity sha512-6JrF+fdUK2zbGpJIlN7G3v966PQjyx/dPt1T9km2wj+EUBqgrxCk3uX4Kct16MIm9gGxfKRcfax2hVf5jvlTzA== 161 | dependencies: 162 | tslib "^2.4.0" 163 | 164 | "@tanstack/query-core@4.13.0": 165 | version "4.13.0" 166 | resolved "https://registry.yarnpkg.com/@tanstack/query-core/-/query-core-4.13.0.tgz#89153096d1fce42c0294fa1d1ae4b3e72aa5353b" 167 | integrity sha512-PzmLQcEgC4rl2OzkiPHYPC9O79DFcMGaKsOzDEP+U4PJ+tbkcEP+Z+FQDlfvX8mCwYC7UNH7hXrQ5EdkGlJjVg== 168 | 169 | "@tanstack/react-query@4.13.0": 170 | version "4.13.0" 171 | resolved "https://registry.yarnpkg.com/@tanstack/react-query/-/react-query-4.13.0.tgz#13797d590a6c0708545881e38aea5eb39b960c28" 172 | integrity sha512-dI/5hJ/pGQ74P5hxBLC9h6K0/Cap2T3k0ZjjjFLBCNnohDYgl7LNmMopzrRzBHk2mMjf2hgXHIzcKNG8GOZ5hg== 173 | dependencies: 174 | "@tanstack/query-core" "4.13.0" 175 | use-sync-external-store "^1.2.0" 176 | 177 | "@types/body-parser@*": 178 | version "1.19.2" 179 | resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.2.tgz#aea2059e28b7658639081347ac4fab3de166e6f0" 180 | integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== 181 | dependencies: 182 | "@types/connect" "*" 183 | "@types/node" "*" 184 | 185 | "@types/connect@*": 186 | version "3.4.35" 187 | resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" 188 | integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== 189 | dependencies: 190 | "@types/node" "*" 191 | 192 | "@types/express-serve-static-core@^4.17.31": 193 | version "4.17.33" 194 | resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.33.tgz#de35d30a9d637dc1450ad18dd583d75d5733d543" 195 | integrity sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA== 196 | dependencies: 197 | "@types/node" "*" 198 | "@types/qs" "*" 199 | "@types/range-parser" "*" 200 | 201 | "@types/express@4.17.16": 202 | version "4.17.16" 203 | resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.16.tgz#986caf0b4b850611254505355daa24e1b8323de8" 204 | integrity sha512-LkKpqRZ7zqXJuvoELakaFYuETHjZkSol8EV6cNnyishutDBCCdv6+dsKPbKkCcIk57qRphOLY5sEgClw1bO3gA== 205 | dependencies: 206 | "@types/body-parser" "*" 207 | "@types/express-serve-static-core" "^4.17.31" 208 | "@types/qs" "*" 209 | "@types/serve-static" "*" 210 | 211 | "@types/json5@^0.0.29": 212 | version "0.0.29" 213 | resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" 214 | integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== 215 | 216 | "@types/mime@*": 217 | version "3.0.1" 218 | resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.1.tgz#5f8f2bca0a5863cb69bc0b0acd88c96cb1d4ae10" 219 | integrity sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA== 220 | 221 | "@types/node@*": 222 | version "18.7.13" 223 | resolved "https://registry.yarnpkg.com/@types/node/-/node-18.7.13.tgz#23e6c5168333480d454243378b69e861ab5c011a" 224 | integrity sha512-46yIhxSe5xEaJZXWdIBP7GU4HDTG8/eo0qd9atdiL+lFpA03y8KS+lkTN834TWJj5767GbWv4n/P6efyTFt1Dw== 225 | 226 | "@types/node@18.11.18": 227 | version "18.11.18" 228 | resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.18.tgz#8dfb97f0da23c2293e554c5a50d61ef134d7697f" 229 | integrity sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA== 230 | 231 | "@types/prop-types@*": 232 | version "15.7.5" 233 | resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" 234 | integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== 235 | 236 | "@types/qs@*": 237 | version "6.9.7" 238 | resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" 239 | integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== 240 | 241 | "@types/range-parser@*": 242 | version "1.2.4" 243 | resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" 244 | integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== 245 | 246 | "@types/react-dom@18.0.10": 247 | version "18.0.10" 248 | resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.0.10.tgz#3b66dec56aa0f16a6cc26da9e9ca96c35c0b4352" 249 | integrity sha512-E42GW/JA4Qv15wQdqJq8DL4JhNpB3prJgjgapN3qJT9K2zO5IIAQh4VXvCEDupoqAwnz0cY4RlXeC/ajX5SFHg== 250 | dependencies: 251 | "@types/react" "*" 252 | 253 | "@types/react@*": 254 | version "18.0.17" 255 | resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.17.tgz#4583d9c322d67efe4b39a935d223edcc7050ccf4" 256 | integrity sha512-38ETy4tL+rn4uQQi7mB81G7V1g0u2ryquNmsVIOKUAEIDK+3CUjZ6rSRpdvS99dNBnkLFL83qfmtLacGOTIhwQ== 257 | dependencies: 258 | "@types/prop-types" "*" 259 | "@types/scheduler" "*" 260 | csstype "^3.0.2" 261 | 262 | "@types/react@18.0.27": 263 | version "18.0.27" 264 | resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.27.tgz#d9425abe187a00f8a5ec182b010d4fd9da703b71" 265 | integrity sha512-3vtRKHgVxu3Jp9t718R9BuzoD4NcQ8YJ5XRzsSKxNDiDonD2MXIT1TmSkenxuCycZJoQT5d2vE8LwWJxBC1gmA== 266 | dependencies: 267 | "@types/prop-types" "*" 268 | "@types/scheduler" "*" 269 | csstype "^3.0.2" 270 | 271 | "@types/scheduler@*": 272 | version "0.16.2" 273 | resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" 274 | integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== 275 | 276 | "@types/serve-static@*": 277 | version "1.15.0" 278 | resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.0.tgz#c7930ff61afb334e121a9da780aac0d9b8f34155" 279 | integrity sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg== 280 | dependencies: 281 | "@types/mime" "*" 282 | "@types/node" "*" 283 | 284 | "@typescript-eslint/parser@^5.21.0": 285 | version "5.35.1" 286 | resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.35.1.tgz#bf2ee2ebeaa0a0567213748243fb4eec2857f04f" 287 | integrity sha512-XL2TBTSrh3yWAsMYpKseBYTVpvudNf69rPOWXWVBI08My2JVT5jR66eTt4IgQFHA/giiKJW5dUD4x/ZviCKyGg== 288 | dependencies: 289 | "@typescript-eslint/scope-manager" "5.35.1" 290 | "@typescript-eslint/types" "5.35.1" 291 | "@typescript-eslint/typescript-estree" "5.35.1" 292 | debug "^4.3.4" 293 | 294 | "@typescript-eslint/scope-manager@5.35.1": 295 | version "5.35.1" 296 | resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.35.1.tgz#ccb69d54b7fd0f2d0226a11a75a8f311f525ff9e" 297 | integrity sha512-kCYRSAzIW9ByEIzmzGHE50NGAvAP3wFTaZevgWva7GpquDyFPFcmvVkFJGWJJktg/hLwmys/FZwqM9EKr2u24Q== 298 | dependencies: 299 | "@typescript-eslint/types" "5.35.1" 300 | "@typescript-eslint/visitor-keys" "5.35.1" 301 | 302 | "@typescript-eslint/types@5.35.1": 303 | version "5.35.1" 304 | resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.35.1.tgz#af355fe52a0cc88301e889bc4ada72f279b63d61" 305 | integrity sha512-FDaujtsH07VHzG0gQ6NDkVVhi1+rhq0qEvzHdJAQjysN+LHDCKDKCBRlZFFE0ec0jKxiv0hN63SNfExy0KrbQQ== 306 | 307 | "@typescript-eslint/typescript-estree@5.35.1": 308 | version "5.35.1" 309 | resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.35.1.tgz#db878a39a0dbdc9bb133f11cdad451770bfba211" 310 | integrity sha512-JUqE1+VRTGyoXlDWWjm6MdfpBYVq+hixytrv1oyjYIBEOZhBCwtpp5ZSvBt4wIA1MKWlnaC2UXl2XmYGC3BoQA== 311 | dependencies: 312 | "@typescript-eslint/types" "5.35.1" 313 | "@typescript-eslint/visitor-keys" "5.35.1" 314 | debug "^4.3.4" 315 | globby "^11.1.0" 316 | is-glob "^4.0.3" 317 | semver "^7.3.7" 318 | tsutils "^3.21.0" 319 | 320 | "@typescript-eslint/visitor-keys@5.35.1": 321 | version "5.35.1" 322 | resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.35.1.tgz#285e9e34aed7c876f16ff646a3984010035898e6" 323 | integrity sha512-cEB1DvBVo1bxbW/S5axbGPE6b7FIMAbo3w+AGq6zNDA7+NYJOIkKj/sInfTv4edxd4PxJSgdN4t6/pbvgA+n5g== 324 | dependencies: 325 | "@typescript-eslint/types" "5.35.1" 326 | eslint-visitor-keys "^3.3.0" 327 | 328 | "@zodios/core@10.7.3": 329 | version "10.7.3" 330 | resolved "https://registry.yarnpkg.com/@zodios/core/-/core-10.7.3.tgz#813f3c27d42f00ece960941b61626b8d47317554" 331 | integrity sha512-O28q7FbamQP6vkdRH1rRh1JEDGVilDmFBW4HAJKs2DNt/Q25yZHqsegb+plfAMcbVuvU7rfnS0e0pK0LLAOT+g== 332 | 333 | "@zodios/express@10.4.4": 334 | version "10.4.4" 335 | resolved "https://registry.yarnpkg.com/@zodios/express/-/express-10.4.4.tgz#dc21666bb99d1cc18ddcfa97f37767040c0d1590" 336 | integrity sha512-hOVkorK/ORQ5yHQdflhI9mvNG+Pzhp1ZJuL9C39FE8qiIVz0orFAzUAYdBLVAwFptg77bAFcIF2RUx5OuetqKw== 337 | 338 | "@zodios/react@10.4.3": 339 | version "10.4.3" 340 | resolved "https://registry.yarnpkg.com/@zodios/react/-/react-10.4.3.tgz#08c346c859a635a39c9f59bbcc607959aeccbfc6" 341 | integrity sha512-J3Rgnlhr5p+Hv3EFUgeLhg4/YQta3+yMLU+bHw1CH+7tECmVvn1In5Q9Z4TDzczLMArINIGevjAuiNQ/Dwbwfw== 342 | 343 | accepts@~1.3.8: 344 | version "1.3.8" 345 | resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" 346 | integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== 347 | dependencies: 348 | mime-types "~2.1.34" 349 | negotiator "0.6.3" 350 | 351 | acorn-jsx@^5.3.2: 352 | version "5.3.2" 353 | resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" 354 | integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== 355 | 356 | acorn@^8.8.0: 357 | version "8.8.0" 358 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.0.tgz#88c0187620435c7f6015803f5539dae05a9dbea8" 359 | integrity sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w== 360 | 361 | ajv@^6.10.0, ajv@^6.12.4: 362 | version "6.12.6" 363 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" 364 | integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== 365 | dependencies: 366 | fast-deep-equal "^3.1.1" 367 | fast-json-stable-stringify "^2.0.0" 368 | json-schema-traverse "^0.4.1" 369 | uri-js "^4.2.2" 370 | 371 | ansi-regex@^5.0.1: 372 | version "5.0.1" 373 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" 374 | integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== 375 | 376 | ansi-styles@^4.1.0: 377 | version "4.3.0" 378 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 379 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 380 | dependencies: 381 | color-convert "^2.0.1" 382 | 383 | argparse@^2.0.1: 384 | version "2.0.1" 385 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" 386 | integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== 387 | 388 | aria-query@^4.2.2: 389 | version "4.2.2" 390 | resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-4.2.2.tgz#0d2ca6c9aceb56b8977e9fed6aed7e15bbd2f83b" 391 | integrity sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA== 392 | dependencies: 393 | "@babel/runtime" "^7.10.2" 394 | "@babel/runtime-corejs3" "^7.10.2" 395 | 396 | array-flatten@1.1.1: 397 | version "1.1.1" 398 | resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" 399 | integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== 400 | 401 | array-includes@^3.1.4, array-includes@^3.1.5: 402 | version "3.1.5" 403 | resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.5.tgz#2c320010db8d31031fd2a5f6b3bbd4b1aad31bdb" 404 | integrity sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ== 405 | dependencies: 406 | call-bind "^1.0.2" 407 | define-properties "^1.1.4" 408 | es-abstract "^1.19.5" 409 | get-intrinsic "^1.1.1" 410 | is-string "^1.0.7" 411 | 412 | array-union@^2.1.0: 413 | version "2.1.0" 414 | resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" 415 | integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== 416 | 417 | array.prototype.flat@^1.2.5: 418 | version "1.3.0" 419 | resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz#0b0c1567bf57b38b56b4c97b8aa72ab45e4adc7b" 420 | integrity sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw== 421 | dependencies: 422 | call-bind "^1.0.2" 423 | define-properties "^1.1.3" 424 | es-abstract "^1.19.2" 425 | es-shim-unscopables "^1.0.0" 426 | 427 | array.prototype.flatmap@^1.3.0: 428 | version "1.3.0" 429 | resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.0.tgz#a7e8ed4225f4788a70cd910abcf0791e76a5534f" 430 | integrity sha512-PZC9/8TKAIxcWKdyeb77EzULHPrIX/tIZebLJUQOMR1OwYosT8yggdfWScfTBCDj5utONvOuPQQumYsU2ULbkg== 431 | dependencies: 432 | call-bind "^1.0.2" 433 | define-properties "^1.1.3" 434 | es-abstract "^1.19.2" 435 | es-shim-unscopables "^1.0.0" 436 | 437 | ast-types-flow@^0.0.7: 438 | version "0.0.7" 439 | resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" 440 | integrity sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag== 441 | 442 | asynckit@^0.4.0: 443 | version "0.4.0" 444 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 445 | integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== 446 | 447 | axe-core@^4.4.3: 448 | version "4.4.3" 449 | resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.4.3.tgz#11c74d23d5013c0fa5d183796729bc3482bd2f6f" 450 | integrity sha512-32+ub6kkdhhWick/UjvEwRchgoetXqTK14INLqbGm5U2TzBkBNF3nQtLYm8ovxSkQWArjEQvftCKryjZaATu3w== 451 | 452 | axios@1.2.6: 453 | version "1.2.6" 454 | resolved "https://registry.yarnpkg.com/axios/-/axios-1.2.6.tgz#eacb6d065baa11bad5959e7ffa0cb6745c65f392" 455 | integrity sha512-rC/7F08XxZwjMV4iuWv+JpD3E0Ksqg9nac4IIg6RwNuF0JTeWoCo/mBNG54+tNhhI11G3/VDRbdDQTs9hGp4pQ== 456 | dependencies: 457 | follow-redirects "^1.15.0" 458 | form-data "^4.0.0" 459 | proxy-from-env "^1.1.0" 460 | 461 | axobject-query@^2.2.0: 462 | version "2.2.0" 463 | resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.2.0.tgz#943d47e10c0b704aa42275e20edf3722648989be" 464 | integrity sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA== 465 | 466 | balanced-match@^1.0.0: 467 | version "1.0.2" 468 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" 469 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== 470 | 471 | body-parser@1.20.1: 472 | version "1.20.1" 473 | resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" 474 | integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== 475 | dependencies: 476 | bytes "3.1.2" 477 | content-type "~1.0.4" 478 | debug "2.6.9" 479 | depd "2.0.0" 480 | destroy "1.2.0" 481 | http-errors "2.0.0" 482 | iconv-lite "0.4.24" 483 | on-finished "2.4.1" 484 | qs "6.11.0" 485 | raw-body "2.5.1" 486 | type-is "~1.6.18" 487 | unpipe "1.0.0" 488 | 489 | brace-expansion@^1.1.7: 490 | version "1.1.11" 491 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 492 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 493 | dependencies: 494 | balanced-match "^1.0.0" 495 | concat-map "0.0.1" 496 | 497 | braces@^3.0.2: 498 | version "3.0.2" 499 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" 500 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== 501 | dependencies: 502 | fill-range "^7.0.1" 503 | 504 | bytes@3.1.2: 505 | version "3.1.2" 506 | resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" 507 | integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== 508 | 509 | call-bind@^1.0.0, call-bind@^1.0.2: 510 | version "1.0.2" 511 | resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" 512 | integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== 513 | dependencies: 514 | function-bind "^1.1.1" 515 | get-intrinsic "^1.0.2" 516 | 517 | callsites@^3.0.0: 518 | version "3.1.0" 519 | resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" 520 | integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== 521 | 522 | caniuse-lite@^1.0.30001332: 523 | version "1.0.30001383" 524 | resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001383.tgz#aecf317ccd940690725ae3ae4f28293c5fb8050e" 525 | integrity sha512-swMpEoTp5vDoGBZsYZX7L7nXHe6dsHxi9o6/LKf/f0LukVtnrxly5GVb/fWdCDTqi/yw6Km6tiJ0pmBacm0gbg== 526 | 527 | chalk@^4.0.0: 528 | version "4.1.2" 529 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" 530 | integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== 531 | dependencies: 532 | ansi-styles "^4.1.0" 533 | supports-color "^7.1.0" 534 | 535 | color-convert@^2.0.1: 536 | version "2.0.1" 537 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 538 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 539 | dependencies: 540 | color-name "~1.1.4" 541 | 542 | color-name@~1.1.4: 543 | version "1.1.4" 544 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 545 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 546 | 547 | combined-stream@^1.0.8: 548 | version "1.0.8" 549 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" 550 | integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== 551 | dependencies: 552 | delayed-stream "~1.0.0" 553 | 554 | concat-map@0.0.1: 555 | version "0.0.1" 556 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 557 | integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== 558 | 559 | content-disposition@0.5.4: 560 | version "0.5.4" 561 | resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" 562 | integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== 563 | dependencies: 564 | safe-buffer "5.2.1" 565 | 566 | content-type@~1.0.4: 567 | version "1.0.4" 568 | resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" 569 | integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== 570 | 571 | cookie-signature@1.0.6: 572 | version "1.0.6" 573 | resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" 574 | integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== 575 | 576 | cookie@0.5.0: 577 | version "0.5.0" 578 | resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" 579 | integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== 580 | 581 | core-js-pure@^3.20.2: 582 | version "3.25.0" 583 | resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.25.0.tgz#f8d1f176ff29abbfeb610110de891d5ae5a361d4" 584 | integrity sha512-IeHpLwk3uoci37yoI2Laty59+YqH9x5uR65/yiA0ARAJrTrN4YU0rmauLWfvqOuk77SlNJXj2rM6oT/dBD87+A== 585 | 586 | cross-spawn@^7.0.2: 587 | version "7.0.3" 588 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" 589 | integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== 590 | dependencies: 591 | path-key "^3.1.0" 592 | shebang-command "^2.0.0" 593 | which "^2.0.1" 594 | 595 | csstype@^3.0.2: 596 | version "3.1.0" 597 | resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.0.tgz#4ddcac3718d787cf9df0d1b7d15033925c8f29f2" 598 | integrity sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA== 599 | 600 | damerau-levenshtein@^1.0.8: 601 | version "1.0.8" 602 | resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7" 603 | integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== 604 | 605 | debug@2.6.9, debug@^2.6.9: 606 | version "2.6.9" 607 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 608 | integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== 609 | dependencies: 610 | ms "2.0.0" 611 | 612 | debug@^3.2.7: 613 | version "3.2.7" 614 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" 615 | integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== 616 | dependencies: 617 | ms "^2.1.1" 618 | 619 | debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: 620 | version "4.3.4" 621 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" 622 | integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== 623 | dependencies: 624 | ms "2.1.2" 625 | 626 | deep-is@^0.1.3: 627 | version "0.1.4" 628 | resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" 629 | integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== 630 | 631 | define-properties@^1.1.3, define-properties@^1.1.4: 632 | version "1.1.4" 633 | resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" 634 | integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== 635 | dependencies: 636 | has-property-descriptors "^1.0.0" 637 | object-keys "^1.1.1" 638 | 639 | delayed-stream@~1.0.0: 640 | version "1.0.0" 641 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 642 | integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== 643 | 644 | depd@2.0.0: 645 | version "2.0.0" 646 | resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" 647 | integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== 648 | 649 | destroy@1.2.0: 650 | version "1.2.0" 651 | resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" 652 | integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== 653 | 654 | dir-glob@^3.0.1: 655 | version "3.0.1" 656 | resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" 657 | integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== 658 | dependencies: 659 | path-type "^4.0.0" 660 | 661 | doctrine@^2.1.0: 662 | version "2.1.0" 663 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" 664 | integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== 665 | dependencies: 666 | esutils "^2.0.2" 667 | 668 | doctrine@^3.0.0: 669 | version "3.0.0" 670 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" 671 | integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== 672 | dependencies: 673 | esutils "^2.0.2" 674 | 675 | ee-first@1.1.1: 676 | version "1.1.1" 677 | resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" 678 | integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== 679 | 680 | emoji-regex@^9.2.2: 681 | version "9.2.2" 682 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" 683 | integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== 684 | 685 | encodeurl@~1.0.2: 686 | version "1.0.2" 687 | resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" 688 | integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== 689 | 690 | es-abstract@^1.19.0, es-abstract@^1.19.1, es-abstract@^1.19.2, es-abstract@^1.19.5: 691 | version "1.20.1" 692 | resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.1.tgz#027292cd6ef44bd12b1913b828116f54787d1814" 693 | integrity sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA== 694 | dependencies: 695 | call-bind "^1.0.2" 696 | es-to-primitive "^1.2.1" 697 | function-bind "^1.1.1" 698 | function.prototype.name "^1.1.5" 699 | get-intrinsic "^1.1.1" 700 | get-symbol-description "^1.0.0" 701 | has "^1.0.3" 702 | has-property-descriptors "^1.0.0" 703 | has-symbols "^1.0.3" 704 | internal-slot "^1.0.3" 705 | is-callable "^1.2.4" 706 | is-negative-zero "^2.0.2" 707 | is-regex "^1.1.4" 708 | is-shared-array-buffer "^1.0.2" 709 | is-string "^1.0.7" 710 | is-weakref "^1.0.2" 711 | object-inspect "^1.12.0" 712 | object-keys "^1.1.1" 713 | object.assign "^4.1.2" 714 | regexp.prototype.flags "^1.4.3" 715 | string.prototype.trimend "^1.0.5" 716 | string.prototype.trimstart "^1.0.5" 717 | unbox-primitive "^1.0.2" 718 | 719 | es-shim-unscopables@^1.0.0: 720 | version "1.0.0" 721 | resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241" 722 | integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== 723 | dependencies: 724 | has "^1.0.3" 725 | 726 | es-to-primitive@^1.2.1: 727 | version "1.2.1" 728 | resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" 729 | integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== 730 | dependencies: 731 | is-callable "^1.1.4" 732 | is-date-object "^1.0.1" 733 | is-symbol "^1.0.2" 734 | 735 | escape-html@~1.0.3: 736 | version "1.0.3" 737 | resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" 738 | integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== 739 | 740 | escape-string-regexp@^4.0.0: 741 | version "4.0.0" 742 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" 743 | integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== 744 | 745 | eslint-config-next@12.2.5: 746 | version "12.2.5" 747 | resolved "https://registry.yarnpkg.com/eslint-config-next/-/eslint-config-next-12.2.5.tgz#76ce83f18cc02f6f42ed407a127f83db54fabd3c" 748 | integrity sha512-SOowilkqPzW6DxKp3a3SYlrfPi5Ajs9MIzp9gVfUDxxH9QFM5ElkR1hX5m/iICJuvCbWgQqFBiA3mCMozluniw== 749 | dependencies: 750 | "@next/eslint-plugin-next" "12.2.5" 751 | "@rushstack/eslint-patch" "^1.1.3" 752 | "@typescript-eslint/parser" "^5.21.0" 753 | eslint-import-resolver-node "^0.3.6" 754 | eslint-import-resolver-typescript "^2.7.1" 755 | eslint-plugin-import "^2.26.0" 756 | eslint-plugin-jsx-a11y "^6.5.1" 757 | eslint-plugin-react "^7.29.4" 758 | eslint-plugin-react-hooks "^4.5.0" 759 | 760 | eslint-import-resolver-node@^0.3.6: 761 | version "0.3.6" 762 | resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz#4048b958395da89668252001dbd9eca6b83bacbd" 763 | integrity sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw== 764 | dependencies: 765 | debug "^3.2.7" 766 | resolve "^1.20.0" 767 | 768 | eslint-import-resolver-typescript@^2.7.1: 769 | version "2.7.1" 770 | resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-2.7.1.tgz#a90a4a1c80da8d632df25994c4c5fdcdd02b8751" 771 | integrity sha512-00UbgGwV8bSgUv34igBDbTOtKhqoRMy9bFjNehT40bXg6585PNIct8HhXZ0SybqB9rWtXj9crcku8ndDn/gIqQ== 772 | dependencies: 773 | debug "^4.3.4" 774 | glob "^7.2.0" 775 | is-glob "^4.0.3" 776 | resolve "^1.22.0" 777 | tsconfig-paths "^3.14.1" 778 | 779 | eslint-module-utils@^2.7.3: 780 | version "2.7.4" 781 | resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz#4f3e41116aaf13a20792261e61d3a2e7e0583974" 782 | integrity sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA== 783 | dependencies: 784 | debug "^3.2.7" 785 | 786 | eslint-plugin-import@^2.26.0: 787 | version "2.26.0" 788 | resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz#f812dc47be4f2b72b478a021605a59fc6fe8b88b" 789 | integrity sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA== 790 | dependencies: 791 | array-includes "^3.1.4" 792 | array.prototype.flat "^1.2.5" 793 | debug "^2.6.9" 794 | doctrine "^2.1.0" 795 | eslint-import-resolver-node "^0.3.6" 796 | eslint-module-utils "^2.7.3" 797 | has "^1.0.3" 798 | is-core-module "^2.8.1" 799 | is-glob "^4.0.3" 800 | minimatch "^3.1.2" 801 | object.values "^1.1.5" 802 | resolve "^1.22.0" 803 | tsconfig-paths "^3.14.1" 804 | 805 | eslint-plugin-jsx-a11y@^6.5.1: 806 | version "6.6.1" 807 | resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.6.1.tgz#93736fc91b83fdc38cc8d115deedfc3091aef1ff" 808 | integrity sha512-sXgFVNHiWffBq23uiS/JaP6eVR622DqwB4yTzKvGZGcPq6/yZ3WmOZfuBks/vHWo9GaFOqC2ZK4i6+C35knx7Q== 809 | dependencies: 810 | "@babel/runtime" "^7.18.9" 811 | aria-query "^4.2.2" 812 | array-includes "^3.1.5" 813 | ast-types-flow "^0.0.7" 814 | axe-core "^4.4.3" 815 | axobject-query "^2.2.0" 816 | damerau-levenshtein "^1.0.8" 817 | emoji-regex "^9.2.2" 818 | has "^1.0.3" 819 | jsx-ast-utils "^3.3.2" 820 | language-tags "^1.0.5" 821 | minimatch "^3.1.2" 822 | semver "^6.3.0" 823 | 824 | eslint-plugin-react-hooks@^4.5.0: 825 | version "4.6.0" 826 | resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz#4c3e697ad95b77e93f8646aaa1630c1ba607edd3" 827 | integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== 828 | 829 | eslint-plugin-react@^7.29.4: 830 | version "7.31.1" 831 | resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.31.1.tgz#d29793ed27743f3ed8a473c347b1bf5a0a8fb9af" 832 | integrity sha512-j4/2xWqt/R7AZzG8CakGHA6Xa/u7iR8Q3xCxY+AUghdT92bnIDOBEefV456OeH0QvBcroVc0eyvrrLSyQGYIfg== 833 | dependencies: 834 | array-includes "^3.1.5" 835 | array.prototype.flatmap "^1.3.0" 836 | doctrine "^2.1.0" 837 | estraverse "^5.3.0" 838 | jsx-ast-utils "^2.4.1 || ^3.0.0" 839 | minimatch "^3.1.2" 840 | object.entries "^1.1.5" 841 | object.fromentries "^2.0.5" 842 | object.hasown "^1.1.1" 843 | object.values "^1.1.5" 844 | prop-types "^15.8.1" 845 | resolve "^2.0.0-next.3" 846 | semver "^6.3.0" 847 | string.prototype.matchall "^4.0.7" 848 | 849 | eslint-scope@^7.1.1: 850 | version "7.1.1" 851 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642" 852 | integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== 853 | dependencies: 854 | esrecurse "^4.3.0" 855 | estraverse "^5.2.0" 856 | 857 | eslint-utils@^3.0.0: 858 | version "3.0.0" 859 | resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" 860 | integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== 861 | dependencies: 862 | eslint-visitor-keys "^2.0.0" 863 | 864 | eslint-visitor-keys@^2.0.0: 865 | version "2.1.0" 866 | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" 867 | integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== 868 | 869 | eslint-visitor-keys@^3.3.0: 870 | version "3.3.0" 871 | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" 872 | integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== 873 | 874 | eslint@8.32.0: 875 | version "8.32.0" 876 | resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.32.0.tgz#d9690056bb6f1a302bd991e7090f5b68fbaea861" 877 | integrity sha512-nETVXpnthqKPFyuY2FNjz/bEd6nbosRgKbkgS/y1C7LJop96gYHWpiguLecMHQ2XCPxn77DS0P+68WzG6vkZSQ== 878 | dependencies: 879 | "@eslint/eslintrc" "^1.4.1" 880 | "@humanwhocodes/config-array" "^0.11.8" 881 | "@humanwhocodes/module-importer" "^1.0.1" 882 | "@nodelib/fs.walk" "^1.2.8" 883 | ajv "^6.10.0" 884 | chalk "^4.0.0" 885 | cross-spawn "^7.0.2" 886 | debug "^4.3.2" 887 | doctrine "^3.0.0" 888 | escape-string-regexp "^4.0.0" 889 | eslint-scope "^7.1.1" 890 | eslint-utils "^3.0.0" 891 | eslint-visitor-keys "^3.3.0" 892 | espree "^9.4.0" 893 | esquery "^1.4.0" 894 | esutils "^2.0.2" 895 | fast-deep-equal "^3.1.3" 896 | file-entry-cache "^6.0.1" 897 | find-up "^5.0.0" 898 | glob-parent "^6.0.2" 899 | globals "^13.19.0" 900 | grapheme-splitter "^1.0.4" 901 | ignore "^5.2.0" 902 | import-fresh "^3.0.0" 903 | imurmurhash "^0.1.4" 904 | is-glob "^4.0.0" 905 | is-path-inside "^3.0.3" 906 | js-sdsl "^4.1.4" 907 | js-yaml "^4.1.0" 908 | json-stable-stringify-without-jsonify "^1.0.1" 909 | levn "^0.4.1" 910 | lodash.merge "^4.6.2" 911 | minimatch "^3.1.2" 912 | natural-compare "^1.4.0" 913 | optionator "^0.9.1" 914 | regexpp "^3.2.0" 915 | strip-ansi "^6.0.1" 916 | strip-json-comments "^3.1.0" 917 | text-table "^0.2.0" 918 | 919 | espree@^9.4.0: 920 | version "9.4.0" 921 | resolved "https://registry.yarnpkg.com/espree/-/espree-9.4.0.tgz#cd4bc3d6e9336c433265fc0aa016fc1aaf182f8a" 922 | integrity sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw== 923 | dependencies: 924 | acorn "^8.8.0" 925 | acorn-jsx "^5.3.2" 926 | eslint-visitor-keys "^3.3.0" 927 | 928 | esquery@^1.4.0: 929 | version "1.4.0" 930 | resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" 931 | integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== 932 | dependencies: 933 | estraverse "^5.1.0" 934 | 935 | esrecurse@^4.3.0: 936 | version "4.3.0" 937 | resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" 938 | integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== 939 | dependencies: 940 | estraverse "^5.2.0" 941 | 942 | estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: 943 | version "5.3.0" 944 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" 945 | integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== 946 | 947 | esutils@^2.0.2: 948 | version "2.0.3" 949 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" 950 | integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== 951 | 952 | etag@~1.8.1: 953 | version "1.8.1" 954 | resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" 955 | integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== 956 | 957 | express@4.18.2: 958 | version "4.18.2" 959 | resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" 960 | integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== 961 | dependencies: 962 | accepts "~1.3.8" 963 | array-flatten "1.1.1" 964 | body-parser "1.20.1" 965 | content-disposition "0.5.4" 966 | content-type "~1.0.4" 967 | cookie "0.5.0" 968 | cookie-signature "1.0.6" 969 | debug "2.6.9" 970 | depd "2.0.0" 971 | encodeurl "~1.0.2" 972 | escape-html "~1.0.3" 973 | etag "~1.8.1" 974 | finalhandler "1.2.0" 975 | fresh "0.5.2" 976 | http-errors "2.0.0" 977 | merge-descriptors "1.0.1" 978 | methods "~1.1.2" 979 | on-finished "2.4.1" 980 | parseurl "~1.3.3" 981 | path-to-regexp "0.1.7" 982 | proxy-addr "~2.0.7" 983 | qs "6.11.0" 984 | range-parser "~1.2.1" 985 | safe-buffer "5.2.1" 986 | send "0.18.0" 987 | serve-static "1.15.0" 988 | setprototypeof "1.2.0" 989 | statuses "2.0.1" 990 | type-is "~1.6.18" 991 | utils-merge "1.0.1" 992 | vary "~1.1.2" 993 | 994 | fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: 995 | version "3.1.3" 996 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" 997 | integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== 998 | 999 | fast-glob@^3.2.9: 1000 | version "3.2.11" 1001 | resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9" 1002 | integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== 1003 | dependencies: 1004 | "@nodelib/fs.stat" "^2.0.2" 1005 | "@nodelib/fs.walk" "^1.2.3" 1006 | glob-parent "^5.1.2" 1007 | merge2 "^1.3.0" 1008 | micromatch "^4.0.4" 1009 | 1010 | fast-json-stable-stringify@^2.0.0: 1011 | version "2.1.0" 1012 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" 1013 | integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== 1014 | 1015 | fast-levenshtein@^2.0.6: 1016 | version "2.0.6" 1017 | resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" 1018 | integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== 1019 | 1020 | fastq@^1.6.0: 1021 | version "1.13.0" 1022 | resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" 1023 | integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== 1024 | dependencies: 1025 | reusify "^1.0.4" 1026 | 1027 | file-entry-cache@^6.0.1: 1028 | version "6.0.1" 1029 | resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" 1030 | integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== 1031 | dependencies: 1032 | flat-cache "^3.0.4" 1033 | 1034 | fill-range@^7.0.1: 1035 | version "7.0.1" 1036 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" 1037 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== 1038 | dependencies: 1039 | to-regex-range "^5.0.1" 1040 | 1041 | finalhandler@1.2.0: 1042 | version "1.2.0" 1043 | resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" 1044 | integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== 1045 | dependencies: 1046 | debug "2.6.9" 1047 | encodeurl "~1.0.2" 1048 | escape-html "~1.0.3" 1049 | on-finished "2.4.1" 1050 | parseurl "~1.3.3" 1051 | statuses "2.0.1" 1052 | unpipe "~1.0.0" 1053 | 1054 | find-up@^5.0.0: 1055 | version "5.0.0" 1056 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" 1057 | integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== 1058 | dependencies: 1059 | locate-path "^6.0.0" 1060 | path-exists "^4.0.0" 1061 | 1062 | flat-cache@^3.0.4: 1063 | version "3.0.4" 1064 | resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" 1065 | integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== 1066 | dependencies: 1067 | flatted "^3.1.0" 1068 | rimraf "^3.0.2" 1069 | 1070 | flatted@^3.1.0: 1071 | version "3.2.7" 1072 | resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" 1073 | integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== 1074 | 1075 | follow-redirects@^1.15.0: 1076 | version "1.15.2" 1077 | resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" 1078 | integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== 1079 | 1080 | form-data@^4.0.0: 1081 | version "4.0.0" 1082 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" 1083 | integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== 1084 | dependencies: 1085 | asynckit "^0.4.0" 1086 | combined-stream "^1.0.8" 1087 | mime-types "^2.1.12" 1088 | 1089 | forwarded@0.2.0: 1090 | version "0.2.0" 1091 | resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" 1092 | integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== 1093 | 1094 | fresh@0.5.2: 1095 | version "0.5.2" 1096 | resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" 1097 | integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== 1098 | 1099 | fs.realpath@^1.0.0: 1100 | version "1.0.0" 1101 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 1102 | integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== 1103 | 1104 | function-bind@^1.1.1: 1105 | version "1.1.1" 1106 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 1107 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 1108 | 1109 | function.prototype.name@^1.1.5: 1110 | version "1.1.5" 1111 | resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" 1112 | integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== 1113 | dependencies: 1114 | call-bind "^1.0.2" 1115 | define-properties "^1.1.3" 1116 | es-abstract "^1.19.0" 1117 | functions-have-names "^1.2.2" 1118 | 1119 | functions-have-names@^1.2.2: 1120 | version "1.2.3" 1121 | resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" 1122 | integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== 1123 | 1124 | get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: 1125 | version "1.1.2" 1126 | resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.2.tgz#336975123e05ad0b7ba41f152ee4aadbea6cf598" 1127 | integrity sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA== 1128 | dependencies: 1129 | function-bind "^1.1.1" 1130 | has "^1.0.3" 1131 | has-symbols "^1.0.3" 1132 | 1133 | get-symbol-description@^1.0.0: 1134 | version "1.0.0" 1135 | resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" 1136 | integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== 1137 | dependencies: 1138 | call-bind "^1.0.2" 1139 | get-intrinsic "^1.1.1" 1140 | 1141 | glob-parent@^5.1.2: 1142 | version "5.1.2" 1143 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" 1144 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 1145 | dependencies: 1146 | is-glob "^4.0.1" 1147 | 1148 | glob-parent@^6.0.2: 1149 | version "6.0.2" 1150 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" 1151 | integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== 1152 | dependencies: 1153 | is-glob "^4.0.3" 1154 | 1155 | glob@7.1.7: 1156 | version "7.1.7" 1157 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" 1158 | integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== 1159 | dependencies: 1160 | fs.realpath "^1.0.0" 1161 | inflight "^1.0.4" 1162 | inherits "2" 1163 | minimatch "^3.0.4" 1164 | once "^1.3.0" 1165 | path-is-absolute "^1.0.0" 1166 | 1167 | glob@^7.1.3, glob@^7.2.0: 1168 | version "7.2.3" 1169 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" 1170 | integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== 1171 | dependencies: 1172 | fs.realpath "^1.0.0" 1173 | inflight "^1.0.4" 1174 | inherits "2" 1175 | minimatch "^3.1.1" 1176 | once "^1.3.0" 1177 | path-is-absolute "^1.0.0" 1178 | 1179 | globals@^13.19.0: 1180 | version "13.20.0" 1181 | resolved "https://registry.yarnpkg.com/globals/-/globals-13.20.0.tgz#ea276a1e508ffd4f1612888f9d1bad1e2717bf82" 1182 | integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ== 1183 | dependencies: 1184 | type-fest "^0.20.2" 1185 | 1186 | globby@^11.1.0: 1187 | version "11.1.0" 1188 | resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" 1189 | integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== 1190 | dependencies: 1191 | array-union "^2.1.0" 1192 | dir-glob "^3.0.1" 1193 | fast-glob "^3.2.9" 1194 | ignore "^5.2.0" 1195 | merge2 "^1.4.1" 1196 | slash "^3.0.0" 1197 | 1198 | grapheme-splitter@^1.0.4: 1199 | version "1.0.4" 1200 | resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" 1201 | integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== 1202 | 1203 | has-bigints@^1.0.1, has-bigints@^1.0.2: 1204 | version "1.0.2" 1205 | resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" 1206 | integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== 1207 | 1208 | has-flag@^4.0.0: 1209 | version "4.0.0" 1210 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 1211 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 1212 | 1213 | has-property-descriptors@^1.0.0: 1214 | version "1.0.0" 1215 | resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" 1216 | integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== 1217 | dependencies: 1218 | get-intrinsic "^1.1.1" 1219 | 1220 | has-symbols@^1.0.2, has-symbols@^1.0.3: 1221 | version "1.0.3" 1222 | resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" 1223 | integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== 1224 | 1225 | has-tostringtag@^1.0.0: 1226 | version "1.0.0" 1227 | resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" 1228 | integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== 1229 | dependencies: 1230 | has-symbols "^1.0.2" 1231 | 1232 | has@^1.0.3: 1233 | version "1.0.3" 1234 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 1235 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 1236 | dependencies: 1237 | function-bind "^1.1.1" 1238 | 1239 | http-errors@2.0.0: 1240 | version "2.0.0" 1241 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" 1242 | integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== 1243 | dependencies: 1244 | depd "2.0.0" 1245 | inherits "2.0.4" 1246 | setprototypeof "1.2.0" 1247 | statuses "2.0.1" 1248 | toidentifier "1.0.1" 1249 | 1250 | iconv-lite@0.4.24: 1251 | version "0.4.24" 1252 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 1253 | integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== 1254 | dependencies: 1255 | safer-buffer ">= 2.1.2 < 3" 1256 | 1257 | ignore@^5.2.0: 1258 | version "5.2.0" 1259 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" 1260 | integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== 1261 | 1262 | import-fresh@^3.0.0, import-fresh@^3.2.1: 1263 | version "3.3.0" 1264 | resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" 1265 | integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== 1266 | dependencies: 1267 | parent-module "^1.0.0" 1268 | resolve-from "^4.0.0" 1269 | 1270 | imurmurhash@^0.1.4: 1271 | version "0.1.4" 1272 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 1273 | integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== 1274 | 1275 | inflight@^1.0.4: 1276 | version "1.0.6" 1277 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 1278 | integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== 1279 | dependencies: 1280 | once "^1.3.0" 1281 | wrappy "1" 1282 | 1283 | inherits@2, inherits@2.0.4: 1284 | version "2.0.4" 1285 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 1286 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 1287 | 1288 | internal-slot@^1.0.3: 1289 | version "1.0.3" 1290 | resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" 1291 | integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== 1292 | dependencies: 1293 | get-intrinsic "^1.1.0" 1294 | has "^1.0.3" 1295 | side-channel "^1.0.4" 1296 | 1297 | ipaddr.js@1.9.1: 1298 | version "1.9.1" 1299 | resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" 1300 | integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== 1301 | 1302 | is-bigint@^1.0.1: 1303 | version "1.0.4" 1304 | resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" 1305 | integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== 1306 | dependencies: 1307 | has-bigints "^1.0.1" 1308 | 1309 | is-boolean-object@^1.1.0: 1310 | version "1.1.2" 1311 | resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" 1312 | integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== 1313 | dependencies: 1314 | call-bind "^1.0.2" 1315 | has-tostringtag "^1.0.0" 1316 | 1317 | is-callable@^1.1.4, is-callable@^1.2.4: 1318 | version "1.2.4" 1319 | resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" 1320 | integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== 1321 | 1322 | is-core-module@^2.8.1, is-core-module@^2.9.0: 1323 | version "2.10.0" 1324 | resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.10.0.tgz#9012ede0a91c69587e647514e1d5277019e728ed" 1325 | integrity sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg== 1326 | dependencies: 1327 | has "^1.0.3" 1328 | 1329 | is-date-object@^1.0.1: 1330 | version "1.0.5" 1331 | resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" 1332 | integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== 1333 | dependencies: 1334 | has-tostringtag "^1.0.0" 1335 | 1336 | is-extglob@^2.1.1: 1337 | version "2.1.1" 1338 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 1339 | integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== 1340 | 1341 | is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: 1342 | version "4.0.3" 1343 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" 1344 | integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== 1345 | dependencies: 1346 | is-extglob "^2.1.1" 1347 | 1348 | is-negative-zero@^2.0.2: 1349 | version "2.0.2" 1350 | resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" 1351 | integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== 1352 | 1353 | is-number-object@^1.0.4: 1354 | version "1.0.7" 1355 | resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" 1356 | integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== 1357 | dependencies: 1358 | has-tostringtag "^1.0.0" 1359 | 1360 | is-number@^7.0.0: 1361 | version "7.0.0" 1362 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 1363 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 1364 | 1365 | is-path-inside@^3.0.3: 1366 | version "3.0.3" 1367 | resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" 1368 | integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== 1369 | 1370 | is-regex@^1.1.4: 1371 | version "1.1.4" 1372 | resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" 1373 | integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== 1374 | dependencies: 1375 | call-bind "^1.0.2" 1376 | has-tostringtag "^1.0.0" 1377 | 1378 | is-shared-array-buffer@^1.0.2: 1379 | version "1.0.2" 1380 | resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" 1381 | integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== 1382 | dependencies: 1383 | call-bind "^1.0.2" 1384 | 1385 | is-string@^1.0.5, is-string@^1.0.7: 1386 | version "1.0.7" 1387 | resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" 1388 | integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== 1389 | dependencies: 1390 | has-tostringtag "^1.0.0" 1391 | 1392 | is-symbol@^1.0.2, is-symbol@^1.0.3: 1393 | version "1.0.4" 1394 | resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" 1395 | integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== 1396 | dependencies: 1397 | has-symbols "^1.0.2" 1398 | 1399 | is-weakref@^1.0.2: 1400 | version "1.0.2" 1401 | resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" 1402 | integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== 1403 | dependencies: 1404 | call-bind "^1.0.2" 1405 | 1406 | isexe@^2.0.0: 1407 | version "2.0.0" 1408 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 1409 | integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== 1410 | 1411 | js-sdsl@^4.1.4: 1412 | version "4.1.5" 1413 | resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.1.5.tgz#1ff1645e6b4d1b028cd3f862db88c9d887f26e2a" 1414 | integrity sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q== 1415 | 1416 | "js-tokens@^3.0.0 || ^4.0.0": 1417 | version "4.0.0" 1418 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" 1419 | integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== 1420 | 1421 | js-yaml@^4.1.0: 1422 | version "4.1.0" 1423 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" 1424 | integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== 1425 | dependencies: 1426 | argparse "^2.0.1" 1427 | 1428 | json-schema-traverse@^0.4.1: 1429 | version "0.4.1" 1430 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" 1431 | integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== 1432 | 1433 | json-stable-stringify-without-jsonify@^1.0.1: 1434 | version "1.0.1" 1435 | resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" 1436 | integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== 1437 | 1438 | json5@^1.0.1: 1439 | version "1.0.1" 1440 | resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" 1441 | integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== 1442 | dependencies: 1443 | minimist "^1.2.0" 1444 | 1445 | "jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.2: 1446 | version "3.3.3" 1447 | resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz#76b3e6e6cece5c69d49a5792c3d01bd1a0cdc7ea" 1448 | integrity sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw== 1449 | dependencies: 1450 | array-includes "^3.1.5" 1451 | object.assign "^4.1.3" 1452 | 1453 | language-subtag-registry@~0.3.2: 1454 | version "0.3.22" 1455 | resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz#2e1500861b2e457eba7e7ae86877cbd08fa1fd1d" 1456 | integrity sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w== 1457 | 1458 | language-tags@^1.0.5: 1459 | version "1.0.5" 1460 | resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.5.tgz#d321dbc4da30ba8bf3024e040fa5c14661f9193a" 1461 | integrity sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ== 1462 | dependencies: 1463 | language-subtag-registry "~0.3.2" 1464 | 1465 | levn@^0.4.1: 1466 | version "0.4.1" 1467 | resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" 1468 | integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== 1469 | dependencies: 1470 | prelude-ls "^1.2.1" 1471 | type-check "~0.4.0" 1472 | 1473 | locate-path@^6.0.0: 1474 | version "6.0.0" 1475 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" 1476 | integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== 1477 | dependencies: 1478 | p-locate "^5.0.0" 1479 | 1480 | lodash.merge@^4.6.2: 1481 | version "4.6.2" 1482 | resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" 1483 | integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== 1484 | 1485 | loose-envify@^1.1.0, loose-envify@^1.4.0: 1486 | version "1.4.0" 1487 | resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" 1488 | integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== 1489 | dependencies: 1490 | js-tokens "^3.0.0 || ^4.0.0" 1491 | 1492 | lru-cache@^6.0.0: 1493 | version "6.0.0" 1494 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" 1495 | integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== 1496 | dependencies: 1497 | yallist "^4.0.0" 1498 | 1499 | media-typer@0.3.0: 1500 | version "0.3.0" 1501 | resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" 1502 | integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== 1503 | 1504 | merge-descriptors@1.0.1: 1505 | version "1.0.1" 1506 | resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" 1507 | integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== 1508 | 1509 | merge2@^1.3.0, merge2@^1.4.1: 1510 | version "1.4.1" 1511 | resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" 1512 | integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== 1513 | 1514 | methods@~1.1.2: 1515 | version "1.1.2" 1516 | resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" 1517 | integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== 1518 | 1519 | micromatch@^4.0.4: 1520 | version "4.0.5" 1521 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" 1522 | integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== 1523 | dependencies: 1524 | braces "^3.0.2" 1525 | picomatch "^2.3.1" 1526 | 1527 | mime-db@1.52.0: 1528 | version "1.52.0" 1529 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" 1530 | integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== 1531 | 1532 | mime-types@^2.1.12, mime-types@~2.1.24, mime-types@~2.1.34: 1533 | version "2.1.35" 1534 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" 1535 | integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== 1536 | dependencies: 1537 | mime-db "1.52.0" 1538 | 1539 | mime@1.6.0: 1540 | version "1.6.0" 1541 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" 1542 | integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== 1543 | 1544 | minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: 1545 | version "3.1.2" 1546 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" 1547 | integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== 1548 | dependencies: 1549 | brace-expansion "^1.1.7" 1550 | 1551 | minimist@^1.2.0, minimist@^1.2.6: 1552 | version "1.2.6" 1553 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" 1554 | integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== 1555 | 1556 | ms@2.0.0: 1557 | version "2.0.0" 1558 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 1559 | integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== 1560 | 1561 | ms@2.1.2: 1562 | version "2.1.2" 1563 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 1564 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 1565 | 1566 | ms@2.1.3, ms@^2.1.1: 1567 | version "2.1.3" 1568 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" 1569 | integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== 1570 | 1571 | nanoid@^3.3.4: 1572 | version "3.3.4" 1573 | resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" 1574 | integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== 1575 | 1576 | natural-compare@^1.4.0: 1577 | version "1.4.0" 1578 | resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" 1579 | integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== 1580 | 1581 | negotiator@0.6.3: 1582 | version "0.6.3" 1583 | resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" 1584 | integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== 1585 | 1586 | next@12.2.5: 1587 | version "12.2.5" 1588 | resolved "https://registry.yarnpkg.com/next/-/next-12.2.5.tgz#14fb5975e8841fad09553b8ef41fe1393602b717" 1589 | integrity sha512-tBdjqX5XC/oFs/6gxrZhjmiq90YWizUYU6qOWAfat7zJwrwapJ+BYgX2PmiacunXMaRpeVT4vz5MSPSLgNkrpA== 1590 | dependencies: 1591 | "@next/env" "12.2.5" 1592 | "@swc/helpers" "0.4.3" 1593 | caniuse-lite "^1.0.30001332" 1594 | postcss "8.4.14" 1595 | styled-jsx "5.0.4" 1596 | use-sync-external-store "1.2.0" 1597 | optionalDependencies: 1598 | "@next/swc-android-arm-eabi" "12.2.5" 1599 | "@next/swc-android-arm64" "12.2.5" 1600 | "@next/swc-darwin-arm64" "12.2.5" 1601 | "@next/swc-darwin-x64" "12.2.5" 1602 | "@next/swc-freebsd-x64" "12.2.5" 1603 | "@next/swc-linux-arm-gnueabihf" "12.2.5" 1604 | "@next/swc-linux-arm64-gnu" "12.2.5" 1605 | "@next/swc-linux-arm64-musl" "12.2.5" 1606 | "@next/swc-linux-x64-gnu" "12.2.5" 1607 | "@next/swc-linux-x64-musl" "12.2.5" 1608 | "@next/swc-win32-arm64-msvc" "12.2.5" 1609 | "@next/swc-win32-ia32-msvc" "12.2.5" 1610 | "@next/swc-win32-x64-msvc" "12.2.5" 1611 | 1612 | object-assign@^4.1.1: 1613 | version "4.1.1" 1614 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 1615 | integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== 1616 | 1617 | object-inspect@^1.12.0, object-inspect@^1.9.0: 1618 | version "1.12.2" 1619 | resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" 1620 | integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== 1621 | 1622 | object-keys@^1.1.1: 1623 | version "1.1.1" 1624 | resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" 1625 | integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== 1626 | 1627 | object.assign@^4.1.2, object.assign@^4.1.3: 1628 | version "4.1.4" 1629 | resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" 1630 | integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== 1631 | dependencies: 1632 | call-bind "^1.0.2" 1633 | define-properties "^1.1.4" 1634 | has-symbols "^1.0.3" 1635 | object-keys "^1.1.1" 1636 | 1637 | object.entries@^1.1.5: 1638 | version "1.1.5" 1639 | resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.5.tgz#e1acdd17c4de2cd96d5a08487cfb9db84d881861" 1640 | integrity sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g== 1641 | dependencies: 1642 | call-bind "^1.0.2" 1643 | define-properties "^1.1.3" 1644 | es-abstract "^1.19.1" 1645 | 1646 | object.fromentries@^2.0.5: 1647 | version "2.0.5" 1648 | resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.5.tgz#7b37b205109c21e741e605727fe8b0ad5fa08251" 1649 | integrity sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw== 1650 | dependencies: 1651 | call-bind "^1.0.2" 1652 | define-properties "^1.1.3" 1653 | es-abstract "^1.19.1" 1654 | 1655 | object.hasown@^1.1.1: 1656 | version "1.1.1" 1657 | resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.1.tgz#ad1eecc60d03f49460600430d97f23882cf592a3" 1658 | integrity sha512-LYLe4tivNQzq4JdaWW6WO3HMZZJWzkkH8fnI6EebWl0VZth2wL2Lovm74ep2/gZzlaTdV62JZHEqHQ2yVn8Q/A== 1659 | dependencies: 1660 | define-properties "^1.1.4" 1661 | es-abstract "^1.19.5" 1662 | 1663 | object.values@^1.1.5: 1664 | version "1.1.5" 1665 | resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.5.tgz#959f63e3ce9ef108720333082131e4a459b716ac" 1666 | integrity sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg== 1667 | dependencies: 1668 | call-bind "^1.0.2" 1669 | define-properties "^1.1.3" 1670 | es-abstract "^1.19.1" 1671 | 1672 | on-finished@2.4.1: 1673 | version "2.4.1" 1674 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" 1675 | integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== 1676 | dependencies: 1677 | ee-first "1.1.1" 1678 | 1679 | once@^1.3.0: 1680 | version "1.4.0" 1681 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1682 | integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== 1683 | dependencies: 1684 | wrappy "1" 1685 | 1686 | optionator@^0.9.1: 1687 | version "0.9.1" 1688 | resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" 1689 | integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== 1690 | dependencies: 1691 | deep-is "^0.1.3" 1692 | fast-levenshtein "^2.0.6" 1693 | levn "^0.4.1" 1694 | prelude-ls "^1.2.1" 1695 | type-check "^0.4.0" 1696 | word-wrap "^1.2.3" 1697 | 1698 | p-limit@^3.0.2: 1699 | version "3.1.0" 1700 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" 1701 | integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== 1702 | dependencies: 1703 | yocto-queue "^0.1.0" 1704 | 1705 | p-locate@^5.0.0: 1706 | version "5.0.0" 1707 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" 1708 | integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== 1709 | dependencies: 1710 | p-limit "^3.0.2" 1711 | 1712 | parent-module@^1.0.0: 1713 | version "1.0.1" 1714 | resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" 1715 | integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== 1716 | dependencies: 1717 | callsites "^3.0.0" 1718 | 1719 | parseurl@~1.3.3: 1720 | version "1.3.3" 1721 | resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" 1722 | integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== 1723 | 1724 | path-exists@^4.0.0: 1725 | version "4.0.0" 1726 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" 1727 | integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== 1728 | 1729 | path-is-absolute@^1.0.0: 1730 | version "1.0.1" 1731 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1732 | integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== 1733 | 1734 | path-key@^3.1.0: 1735 | version "3.1.1" 1736 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" 1737 | integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== 1738 | 1739 | path-parse@^1.0.7: 1740 | version "1.0.7" 1741 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" 1742 | integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== 1743 | 1744 | path-to-regexp@0.1.7: 1745 | version "0.1.7" 1746 | resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" 1747 | integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== 1748 | 1749 | path-type@^4.0.0: 1750 | version "4.0.0" 1751 | resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" 1752 | integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== 1753 | 1754 | picocolors@^1.0.0: 1755 | version "1.0.0" 1756 | resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" 1757 | integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== 1758 | 1759 | picomatch@^2.3.1: 1760 | version "2.3.1" 1761 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" 1762 | integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== 1763 | 1764 | postcss@8.4.14: 1765 | version "8.4.14" 1766 | resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.14.tgz#ee9274d5622b4858c1007a74d76e42e56fd21caf" 1767 | integrity sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig== 1768 | dependencies: 1769 | nanoid "^3.3.4" 1770 | picocolors "^1.0.0" 1771 | source-map-js "^1.0.2" 1772 | 1773 | prelude-ls@^1.2.1: 1774 | version "1.2.1" 1775 | resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" 1776 | integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== 1777 | 1778 | prop-types@^15.8.1: 1779 | version "15.8.1" 1780 | resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" 1781 | integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== 1782 | dependencies: 1783 | loose-envify "^1.4.0" 1784 | object-assign "^4.1.1" 1785 | react-is "^16.13.1" 1786 | 1787 | proxy-addr@~2.0.7: 1788 | version "2.0.7" 1789 | resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" 1790 | integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== 1791 | dependencies: 1792 | forwarded "0.2.0" 1793 | ipaddr.js "1.9.1" 1794 | 1795 | proxy-from-env@^1.1.0: 1796 | version "1.1.0" 1797 | resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" 1798 | integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== 1799 | 1800 | punycode@^2.1.0: 1801 | version "2.1.1" 1802 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" 1803 | integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== 1804 | 1805 | qs@6.11.0: 1806 | version "6.11.0" 1807 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" 1808 | integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== 1809 | dependencies: 1810 | side-channel "^1.0.4" 1811 | 1812 | queue-microtask@^1.2.2: 1813 | version "1.2.3" 1814 | resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" 1815 | integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== 1816 | 1817 | range-parser@~1.2.1: 1818 | version "1.2.1" 1819 | resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" 1820 | integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== 1821 | 1822 | raw-body@2.5.1: 1823 | version "2.5.1" 1824 | resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" 1825 | integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== 1826 | dependencies: 1827 | bytes "3.1.2" 1828 | http-errors "2.0.0" 1829 | iconv-lite "0.4.24" 1830 | unpipe "1.0.0" 1831 | 1832 | react-dom@18.2.0: 1833 | version "18.2.0" 1834 | resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" 1835 | integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== 1836 | dependencies: 1837 | loose-envify "^1.1.0" 1838 | scheduler "^0.23.0" 1839 | 1840 | react-is@^16.13.1: 1841 | version "16.13.1" 1842 | resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" 1843 | integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== 1844 | 1845 | react@18.2.0: 1846 | version "18.2.0" 1847 | resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" 1848 | integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== 1849 | dependencies: 1850 | loose-envify "^1.1.0" 1851 | 1852 | regenerator-runtime@^0.13.4: 1853 | version "0.13.9" 1854 | resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" 1855 | integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== 1856 | 1857 | regexp.prototype.flags@^1.4.1, regexp.prototype.flags@^1.4.3: 1858 | version "1.4.3" 1859 | resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" 1860 | integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== 1861 | dependencies: 1862 | call-bind "^1.0.2" 1863 | define-properties "^1.1.3" 1864 | functions-have-names "^1.2.2" 1865 | 1866 | regexpp@^3.2.0: 1867 | version "3.2.0" 1868 | resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" 1869 | integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== 1870 | 1871 | resolve-from@^4.0.0: 1872 | version "4.0.0" 1873 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" 1874 | integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== 1875 | 1876 | resolve@^1.20.0, resolve@^1.22.0: 1877 | version "1.22.1" 1878 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" 1879 | integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== 1880 | dependencies: 1881 | is-core-module "^2.9.0" 1882 | path-parse "^1.0.7" 1883 | supports-preserve-symlinks-flag "^1.0.0" 1884 | 1885 | resolve@^2.0.0-next.3: 1886 | version "2.0.0-next.4" 1887 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.4.tgz#3d37a113d6429f496ec4752d2a2e58efb1fd4660" 1888 | integrity sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ== 1889 | dependencies: 1890 | is-core-module "^2.9.0" 1891 | path-parse "^1.0.7" 1892 | supports-preserve-symlinks-flag "^1.0.0" 1893 | 1894 | reusify@^1.0.4: 1895 | version "1.0.4" 1896 | resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" 1897 | integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== 1898 | 1899 | rimraf@^3.0.2: 1900 | version "3.0.2" 1901 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" 1902 | integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== 1903 | dependencies: 1904 | glob "^7.1.3" 1905 | 1906 | run-parallel@^1.1.9: 1907 | version "1.2.0" 1908 | resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" 1909 | integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== 1910 | dependencies: 1911 | queue-microtask "^1.2.2" 1912 | 1913 | safe-buffer@5.2.1: 1914 | version "5.2.1" 1915 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 1916 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 1917 | 1918 | "safer-buffer@>= 2.1.2 < 3": 1919 | version "2.1.2" 1920 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 1921 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 1922 | 1923 | scheduler@^0.23.0: 1924 | version "0.23.0" 1925 | resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" 1926 | integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== 1927 | dependencies: 1928 | loose-envify "^1.1.0" 1929 | 1930 | semver@^6.3.0: 1931 | version "6.3.0" 1932 | resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" 1933 | integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== 1934 | 1935 | semver@^7.3.7: 1936 | version "7.3.7" 1937 | resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" 1938 | integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== 1939 | dependencies: 1940 | lru-cache "^6.0.0" 1941 | 1942 | send@0.18.0: 1943 | version "0.18.0" 1944 | resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" 1945 | integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== 1946 | dependencies: 1947 | debug "2.6.9" 1948 | depd "2.0.0" 1949 | destroy "1.2.0" 1950 | encodeurl "~1.0.2" 1951 | escape-html "~1.0.3" 1952 | etag "~1.8.1" 1953 | fresh "0.5.2" 1954 | http-errors "2.0.0" 1955 | mime "1.6.0" 1956 | ms "2.1.3" 1957 | on-finished "2.4.1" 1958 | range-parser "~1.2.1" 1959 | statuses "2.0.1" 1960 | 1961 | serve-static@1.15.0: 1962 | version "1.15.0" 1963 | resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" 1964 | integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== 1965 | dependencies: 1966 | encodeurl "~1.0.2" 1967 | escape-html "~1.0.3" 1968 | parseurl "~1.3.3" 1969 | send "0.18.0" 1970 | 1971 | setprototypeof@1.2.0: 1972 | version "1.2.0" 1973 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" 1974 | integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== 1975 | 1976 | shebang-command@^2.0.0: 1977 | version "2.0.0" 1978 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" 1979 | integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== 1980 | dependencies: 1981 | shebang-regex "^3.0.0" 1982 | 1983 | shebang-regex@^3.0.0: 1984 | version "3.0.0" 1985 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" 1986 | integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== 1987 | 1988 | side-channel@^1.0.4: 1989 | version "1.0.4" 1990 | resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" 1991 | integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== 1992 | dependencies: 1993 | call-bind "^1.0.0" 1994 | get-intrinsic "^1.0.2" 1995 | object-inspect "^1.9.0" 1996 | 1997 | slash@^3.0.0: 1998 | version "3.0.0" 1999 | resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" 2000 | integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== 2001 | 2002 | source-map-js@^1.0.2: 2003 | version "1.0.2" 2004 | resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" 2005 | integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== 2006 | 2007 | statuses@2.0.1: 2008 | version "2.0.1" 2009 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" 2010 | integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== 2011 | 2012 | string.prototype.matchall@^4.0.7: 2013 | version "4.0.7" 2014 | resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz#8e6ecb0d8a1fb1fda470d81acecb2dba057a481d" 2015 | integrity sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg== 2016 | dependencies: 2017 | call-bind "^1.0.2" 2018 | define-properties "^1.1.3" 2019 | es-abstract "^1.19.1" 2020 | get-intrinsic "^1.1.1" 2021 | has-symbols "^1.0.3" 2022 | internal-slot "^1.0.3" 2023 | regexp.prototype.flags "^1.4.1" 2024 | side-channel "^1.0.4" 2025 | 2026 | string.prototype.trimend@^1.0.5: 2027 | version "1.0.5" 2028 | resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz#914a65baaab25fbdd4ee291ca7dde57e869cb8d0" 2029 | integrity sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog== 2030 | dependencies: 2031 | call-bind "^1.0.2" 2032 | define-properties "^1.1.4" 2033 | es-abstract "^1.19.5" 2034 | 2035 | string.prototype.trimstart@^1.0.5: 2036 | version "1.0.5" 2037 | resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz#5466d93ba58cfa2134839f81d7f42437e8c01fef" 2038 | integrity sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg== 2039 | dependencies: 2040 | call-bind "^1.0.2" 2041 | define-properties "^1.1.4" 2042 | es-abstract "^1.19.5" 2043 | 2044 | strip-ansi@^6.0.1: 2045 | version "6.0.1" 2046 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" 2047 | integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== 2048 | dependencies: 2049 | ansi-regex "^5.0.1" 2050 | 2051 | strip-bom@^3.0.0: 2052 | version "3.0.0" 2053 | resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" 2054 | integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== 2055 | 2056 | strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: 2057 | version "3.1.1" 2058 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" 2059 | integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== 2060 | 2061 | styled-jsx@5.0.4: 2062 | version "5.0.4" 2063 | resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-5.0.4.tgz#5b1bd0b9ab44caae3dd1361295559706e044aa53" 2064 | integrity sha512-sDFWLbg4zR+UkNzfk5lPilyIgtpddfxXEULxhujorr5jtePTUqiPDc5BC0v1NRqTr/WaFBGQQUoYToGlF4B2KQ== 2065 | 2066 | supports-color@^7.1.0: 2067 | version "7.2.0" 2068 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" 2069 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 2070 | dependencies: 2071 | has-flag "^4.0.0" 2072 | 2073 | supports-preserve-symlinks-flag@^1.0.0: 2074 | version "1.0.0" 2075 | resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" 2076 | integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== 2077 | 2078 | text-table@^0.2.0: 2079 | version "0.2.0" 2080 | resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" 2081 | integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== 2082 | 2083 | to-regex-range@^5.0.1: 2084 | version "5.0.1" 2085 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 2086 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 2087 | dependencies: 2088 | is-number "^7.0.0" 2089 | 2090 | toidentifier@1.0.1: 2091 | version "1.0.1" 2092 | resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" 2093 | integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== 2094 | 2095 | tsconfig-paths@^3.14.1: 2096 | version "3.14.1" 2097 | resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz#ba0734599e8ea36c862798e920bcf163277b137a" 2098 | integrity sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ== 2099 | dependencies: 2100 | "@types/json5" "^0.0.29" 2101 | json5 "^1.0.1" 2102 | minimist "^1.2.6" 2103 | strip-bom "^3.0.0" 2104 | 2105 | tslib@^1.8.1: 2106 | version "1.14.1" 2107 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" 2108 | integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== 2109 | 2110 | tslib@^2.4.0: 2111 | version "2.4.0" 2112 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" 2113 | integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== 2114 | 2115 | tsutils@^3.21.0: 2116 | version "3.21.0" 2117 | resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" 2118 | integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== 2119 | dependencies: 2120 | tslib "^1.8.1" 2121 | 2122 | type-check@^0.4.0, type-check@~0.4.0: 2123 | version "0.4.0" 2124 | resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" 2125 | integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== 2126 | dependencies: 2127 | prelude-ls "^1.2.1" 2128 | 2129 | type-fest@^0.20.2: 2130 | version "0.20.2" 2131 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" 2132 | integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== 2133 | 2134 | type-is@~1.6.18: 2135 | version "1.6.18" 2136 | resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" 2137 | integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== 2138 | dependencies: 2139 | media-typer "0.3.0" 2140 | mime-types "~2.1.24" 2141 | 2142 | typescript@4.9.4: 2143 | version "4.9.4" 2144 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.4.tgz#a2a3d2756c079abda241d75f149df9d561091e78" 2145 | integrity sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg== 2146 | 2147 | unbox-primitive@^1.0.2: 2148 | version "1.0.2" 2149 | resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" 2150 | integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== 2151 | dependencies: 2152 | call-bind "^1.0.2" 2153 | has-bigints "^1.0.2" 2154 | has-symbols "^1.0.3" 2155 | which-boxed-primitive "^1.0.2" 2156 | 2157 | unpipe@1.0.0, unpipe@~1.0.0: 2158 | version "1.0.0" 2159 | resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" 2160 | integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== 2161 | 2162 | uri-js@^4.2.2: 2163 | version "4.4.1" 2164 | resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" 2165 | integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== 2166 | dependencies: 2167 | punycode "^2.1.0" 2168 | 2169 | use-sync-external-store@1.2.0, use-sync-external-store@^1.2.0: 2170 | version "1.2.0" 2171 | resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz#7dbefd6ef3fe4e767a0cf5d7287aacfb5846928a" 2172 | integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA== 2173 | 2174 | utils-merge@1.0.1: 2175 | version "1.0.1" 2176 | resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" 2177 | integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== 2178 | 2179 | vary@~1.1.2: 2180 | version "1.1.2" 2181 | resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" 2182 | integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== 2183 | 2184 | which-boxed-primitive@^1.0.2: 2185 | version "1.0.2" 2186 | resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" 2187 | integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== 2188 | dependencies: 2189 | is-bigint "^1.0.1" 2190 | is-boolean-object "^1.1.0" 2191 | is-number-object "^1.0.4" 2192 | is-string "^1.0.5" 2193 | is-symbol "^1.0.3" 2194 | 2195 | which@^2.0.1: 2196 | version "2.0.2" 2197 | resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" 2198 | integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== 2199 | dependencies: 2200 | isexe "^2.0.0" 2201 | 2202 | word-wrap@^1.2.3: 2203 | version "1.2.3" 2204 | resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" 2205 | integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== 2206 | 2207 | wrappy@1: 2208 | version "1.0.2" 2209 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 2210 | integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== 2211 | 2212 | yallist@^4.0.0: 2213 | version "4.0.0" 2214 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" 2215 | integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== 2216 | 2217 | yocto-queue@^0.1.0: 2218 | version "0.1.0" 2219 | resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" 2220 | integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== 2221 | 2222 | zod@3.20.2: 2223 | version "3.20.2" 2224 | resolved "https://registry.yarnpkg.com/zod/-/zod-3.20.2.tgz#068606642c8f51b3333981f91c0a8ab37dfc2807" 2225 | integrity sha512-1MzNQdAvO+54H+EaK5YpyEy0T+Ejo/7YLHS93G3RnYWh5gaotGHwGeN/ZO687qEDU2y4CdStQYXVHIgrUl5UVQ== 2226 | -------------------------------------------------------------------------------- /examples/server.ts: -------------------------------------------------------------------------------- 1 | import { makeApi } from "@zodios/core"; 2 | import { prefixApi, zodiosApp, zodiosContext } from "../src/index"; 3 | import { z } from "zod"; 4 | import { NextFunction, Request, Response } from "express"; 5 | 6 | const api = makeApi([ 7 | { 8 | method: "get", 9 | path: "/:id", 10 | alias: "getUser", 11 | description: "Get a user", 12 | parameters: [ 13 | { 14 | name: "id", 15 | type: "Path", 16 | schema: z.number(), 17 | }, 18 | { 19 | name: "filter", 20 | type: "Query", 21 | schema: z.string().array().default([]), 22 | }, 23 | ], 24 | response: z.object({ 25 | id: z.number(), 26 | name: z.string().nullable(), 27 | }), 28 | }, 29 | ]); 30 | 31 | const userApi = prefixApi("/users", api); 32 | 33 | const ctx = zodiosContext(z.object({ hello: z.string() })); 34 | const app = ctx.app(userApi); 35 | 36 | app.get("/users/:id", async (req, res) => { 37 | const { id } = req.params; 38 | // ^? 39 | const { filter } = req.query; 40 | // ^? 41 | return res.json({ 42 | id: req.params.id, 43 | name: "example", 44 | }); 45 | }); 46 | -------------------------------------------------------------------------------- /jest.config.ts: -------------------------------------------------------------------------------- 1 | import type { Config } from "@jest/types"; 2 | 3 | // Objet synchrone 4 | const config: Config.InitialOptions = { 5 | verbose: true, 6 | moduleFileExtensions: ["ts", "js", "json", "node"], 7 | rootDir: "./", 8 | testRegex: ".(spec|test).tsx?$", 9 | transform: { 10 | "^.+\\.tsx?$": "ts-jest", 11 | }, 12 | coverageDirectory: "./coverage", 13 | coverageThreshold: { 14 | global: { 15 | branches: 80, 16 | functions: 80, 17 | lines: 80, 18 | statements: 80, 19 | }, 20 | }, 21 | testEnvironment: "node", 22 | }; 23 | export default config; 24 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@zodios/express", 3 | "description": "Typescript express server", 4 | "version": "10.6.1", 5 | "main": "lib/index.js", 6 | "module": "lib/index.mjs", 7 | "typings": "lib/index.d.ts", 8 | "exports": { 9 | ".": { 10 | "import": "./lib/index.mjs", 11 | "require": "./lib/index.js", 12 | "types": "./lib/index.d.ts" 13 | }, 14 | "./package.json": "./package.json" 15 | }, 16 | "files": [ 17 | "lib" 18 | ], 19 | "author": { 20 | "name": "ecyrbe", 21 | "email": "ecyrbe@gmail.com" 22 | }, 23 | "homepage": "https://github.com/ecyrbe/zodios-express", 24 | "repository": { 25 | "type": "git", 26 | "url": "https://github.com/ecyrbe/zodios-express.git" 27 | }, 28 | "license": "MIT", 29 | "keywords": [ 30 | "express", 31 | "zod", 32 | "rpc", 33 | "validation" 34 | ], 35 | "scripts": { 36 | "prebuild": "rimraf lib", 37 | "example": "ts-node examples/jsonplaceholder.ts", 38 | "major-rc": "npm version premajor --preid=rc", 39 | "minor-rc": "npm version preminor --preid=rc", 40 | "patch-rc": "npm version prepatch --preid=rc", 41 | "rc": "npm version prerelease --preid=rc", 42 | "build": "tsup", 43 | "test": "jest --coverage" 44 | }, 45 | "peerDependencies": { 46 | "@zodios/core": ">=10.4.4 <11.0.0", 47 | "express": "4.x", 48 | "zod": "^3.x" 49 | }, 50 | "devDependencies": { 51 | "@jest/types": "^29.5.0", 52 | "@types/express": "4.17.19", 53 | "@types/jest": "29.5.5", 54 | "@types/node": "20.8.9", 55 | "@types/supertest": "2.0.14", 56 | "@zodios/core": "10.9.6", 57 | "axios": "1.5.1", 58 | "express": "4.18.2", 59 | "jest": "29.7.0", 60 | "rimraf": "5.0.5", 61 | "supertest": "6.3.3", 62 | "ts-jest": "29.1.1", 63 | "ts-node": "10.9.1", 64 | "tsup": "6.3.0", 65 | "typescript": "5.2.2", 66 | "zod": "3.22.4" 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /renovate.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": ["config:base"], 3 | "ignorePaths": ["examples/**"], 4 | "ignoreDeps": ["tsup"] 5 | } 6 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | export { 2 | zodiosApp, 3 | zodiosRouter, 4 | zodiosNextApp, 5 | zodiosContext, 6 | } from "./zodios"; 7 | export type { ZodiosContext } from "./zodios"; 8 | export { prefixApi } from "./zodios.utils"; 9 | 10 | export type { 11 | ZodiosApp, 12 | ZodiosAppOptions, 13 | ZodiosHandler, 14 | ZodiosHandlers, 15 | ZodiosRequestHandler, 16 | ZodiosRouter, 17 | ZodiosRouterOptions, 18 | ZodiosRouterContextRequestHandler, 19 | ZodiosValidationOptions, 20 | ZodiosUse, 21 | ZodiosSuccessCodes, 22 | WithZodiosContext, 23 | } from "./zodios.types"; 24 | -------------------------------------------------------------------------------- /src/zodios-validator.ts: -------------------------------------------------------------------------------- 1 | import express from "express"; 2 | import { 3 | ZodiosEndpointDefinition, 4 | ZodiosEndpointDefinitions, 5 | } from "@zodios/core"; 6 | import { isZodType, withoutTransform } from "./zodios.utils"; 7 | import { z, ZodObject } from "zod"; 8 | import { ZodiosRouterValidationErrorHandler } from "./zodios.types"; 9 | 10 | const METHODS = ["get", "post", "put", "patch", "delete"] as const; 11 | 12 | async function validateParam(schema: z.ZodType, parameter: unknown) { 13 | if ( 14 | !isZodType(schema, z.ZodFirstPartyTypeKind.ZodString) && 15 | parameter && 16 | typeof parameter === "string" 17 | ) { 18 | return z 19 | .preprocess((x) => { 20 | try { 21 | return JSON.parse(x as string); 22 | } catch { 23 | return x; 24 | } 25 | }, schema) 26 | .safeParseAsync(parameter); 27 | } 28 | return schema.safeParseAsync(parameter); 29 | } 30 | 31 | function validateEndpointMiddleware( 32 | endpoint: ZodiosEndpointDefinition, 33 | transform: boolean 34 | ) { 35 | return async ( 36 | req: express.Request, 37 | res: express.Response, 38 | next: express.NextFunction 39 | ) => { 40 | for (let parameter of endpoint.parameters!) { 41 | let schema = parameter.schema; 42 | if (!transform) { 43 | schema = withoutTransform(schema); 44 | } 45 | 46 | switch (parameter.type) { 47 | case "Body": 48 | { 49 | const result = await schema.safeParseAsync(req.body); 50 | if (!result.success) { 51 | return next({ 52 | context: "body", 53 | error: result.error.issues, 54 | }); 55 | } 56 | req.body = result.data; 57 | } 58 | break; 59 | case "Path": 60 | { 61 | const result = await validateParam( 62 | schema, 63 | req.params[parameter.name] 64 | ); 65 | if (!result.success) { 66 | return next({ 67 | context: `path.${parameter.name}`, 68 | error: result.error.issues, 69 | }); 70 | } 71 | req.params[parameter.name] = result.data as any; 72 | } 73 | break; 74 | case "Query": 75 | { 76 | const result = await validateParam( 77 | schema, 78 | req.query[parameter.name] 79 | ); 80 | if (!result.success) { 81 | return next({ 82 | context: `query.${parameter.name}`, 83 | error: result.error.issues, 84 | }); 85 | } 86 | req.query[parameter.name] = result.data as any; 87 | } 88 | break; 89 | case "Header": 90 | { 91 | const result = await parameter.schema.safeParseAsync( 92 | req.get(parameter.name) 93 | ); 94 | if (!result.success) { 95 | return next({ 96 | context: `header.${parameter.name}`, 97 | error: result.error.issues, 98 | }); 99 | } 100 | req.headers[parameter.name] = result.data as any; 101 | } 102 | break; 103 | } 104 | } 105 | next(); 106 | }; 107 | } 108 | 109 | /** 110 | * monkey patch express.Router to add inject the validation middlewares after the route is matched 111 | * @param api - the api definition 112 | * @param router - express router to patch 113 | * @param transform - whether to transform the data or not 114 | */ 115 | export function injectParametersValidators>( 116 | api: ZodiosEndpointDefinitions, 117 | router: express.Router, 118 | transform: boolean, 119 | validationErrorHandler: ZodiosRouterValidationErrorHandler 120 | ) { 121 | for (let method of METHODS) { 122 | const savedMethod = router[method].bind(router); 123 | // @ts-ignore 124 | router[method] = (path: string, ...handlers: any[]) => { 125 | const endpoint = api.find( 126 | (endpoint) => endpoint.method === method && endpoint.path === path 127 | ); 128 | if (endpoint && endpoint.parameters) { 129 | handlers = [ 130 | validateEndpointMiddleware(endpoint, transform), 131 | validationErrorHandler, 132 | ...handlers, 133 | ]; 134 | } 135 | return savedMethod(path, ...handlers); 136 | }; 137 | } 138 | } 139 | -------------------------------------------------------------------------------- /src/zodios.spec.ts: -------------------------------------------------------------------------------- 1 | import express from "express"; 2 | import request from "supertest"; 3 | import z from "zod"; 4 | import { apiBuilder, makeErrors } from "@zodios/core"; 5 | import { zodiosContext } from "./zodios"; 6 | 7 | const user = z.object({ 8 | id: z.number(), 9 | name: z.string(), 10 | email: z.string().email(), 11 | }); 12 | 13 | const errors = makeErrors([ 14 | { 15 | status: "default", 16 | schema: z.object({ 17 | error: z.object({ 18 | code: z.string(), 19 | message: z.string(), 20 | }), 21 | }), 22 | }, 23 | ]); 24 | 25 | const userApi = apiBuilder({ 26 | method: "get", 27 | path: "/users", 28 | parameters: [ 29 | { 30 | name: "limit", 31 | type: "Query", 32 | schema: z.number().min(1).max(Infinity).default(Infinity), 33 | }, 34 | { 35 | name: "offset", 36 | type: "Query", 37 | schema: z.number().min(0).max(Infinity).default(0), 38 | }, 39 | { 40 | name: "active", 41 | type: "Query", 42 | schema: z.boolean().default(true), 43 | }, 44 | ], 45 | response: z.array(user), 46 | errors, 47 | }) 48 | .addEndpoint({ 49 | method: "get", 50 | path: "/users/:id", 51 | parameters: [ 52 | { 53 | name: "id", 54 | type: "Path", 55 | schema: z.number(), 56 | }, 57 | ], 58 | response: user, 59 | errors, 60 | }) 61 | .addEndpoint({ 62 | method: "get", 63 | path: "/objects/:id", 64 | parameters: [ 65 | { 66 | name: "test", 67 | type: "Query", 68 | schema: z.object({ 69 | test: z.string(), 70 | }), 71 | }, 72 | { 73 | name: "id", 74 | type: "Path", 75 | schema: z.string(), 76 | }, 77 | ], 78 | response: z.object({ 79 | test: z.string(), 80 | }), 81 | }) 82 | .addEndpoint({ 83 | method: "post", 84 | path: "/users", 85 | parameters: [ 86 | { 87 | name: "user", 88 | type: "Body", 89 | schema: user.omit({ id: true }), 90 | }, 91 | ], 92 | response: user, 93 | }) 94 | .addEndpoint({ 95 | method: "put", 96 | path: "/users/:id", 97 | parameters: [ 98 | { 99 | name: "user", 100 | type: "Body", 101 | schema: user, 102 | }, 103 | { 104 | name: "Authorization", 105 | type: "Header", 106 | schema: z.string().regex(/^Bearer\s+[a-zA-Z0-9]+$/), 107 | }, 108 | ], 109 | response: user, 110 | }) 111 | .addEndpoint({ 112 | method: "delete", 113 | path: "/users/:id", 114 | response: user, 115 | }) 116 | .build(); 117 | 118 | describe("router", () => { 119 | it("should get one user", async () => { 120 | const app = zodiosContext().app(userApi); 121 | app.get("/users/:id", (req, res, next) => { 122 | if (req.params.id >= 10) { 123 | return res.status(404).json({ 124 | error: { 125 | code: "NOT_FOUND", 126 | message: "User not found", 127 | }, 128 | }); 129 | } 130 | res.json({ 131 | id: req.params.id, 132 | name: "john doe", 133 | email: "test@domain.com", 134 | }); 135 | }); 136 | const req = request(app); 137 | const result = await req.get("/users/3").expect(200); 138 | expect(result.body).toEqual({ 139 | id: 3, 140 | name: "john doe", 141 | email: "test@domain.com", 142 | }); 143 | }); 144 | 145 | it("should infer boolean in query params", async () => { 146 | const app = zodiosContext().app(userApi); 147 | app.get("/users", (req, res, next) => { 148 | if (req.query.active) { 149 | return res.status(200).json([ 150 | { 151 | id: 1, 152 | name: "john doe active", 153 | email: "test@domain.com", 154 | }, 155 | ]); 156 | } 157 | res.json([ 158 | { 159 | id: 1, 160 | name: "john doe", 161 | email: "test@domain.com", 162 | }, 163 | ]); 164 | }); 165 | const req = request(app); 166 | const result1 = await req.get("/users?active=false"); 167 | expect(result1.statusCode).toBe(200); 168 | expect(result1.body).toEqual([ 169 | { 170 | id: 1, 171 | name: "john doe", 172 | email: "test@domain.com", 173 | }, 174 | ]); 175 | const result2 = await req.get("/users?active=true"); 176 | expect(result2.statusCode).toBe(200); 177 | expect(result2.body).toEqual([ 178 | { 179 | id: 1, 180 | name: "john doe active", 181 | email: "test@domain.com", 182 | }, 183 | ]); 184 | const result3 = await req.get("/users"); 185 | expect(result3.statusCode).toBe(200); 186 | expect(result3.body).toEqual([ 187 | { 188 | id: 1, 189 | name: "john doe active", 190 | email: "test@domain.com", 191 | }, 192 | ]); 193 | }); 194 | 195 | it("should infer objects in query params", async () => { 196 | const app = zodiosContext().app(userApi); 197 | app.get("/objects/:id", (req, res, next) => { 198 | res.json(req.query.test); 199 | }); 200 | const req = request(app); 201 | // passing a stringified object 202 | const result1 = await req.get( 203 | "/objects/hello?test=%7B%22test%22%3A%22test%22%7D" 204 | ); 205 | expect(result1.statusCode).toBe(200); 206 | expect(result1.body).toEqual({ 207 | test: "test", 208 | }); 209 | }); 210 | 211 | it("should not find user if id>10", async () => { 212 | const app = zodiosContext().app(userApi); 213 | app.get("/users/:id", (req, res, next) => { 214 | if (req.params.id >= 10) { 215 | return res.status(404).json({ 216 | error: { 217 | code: "NOT_FOUND", 218 | message: "User not found", 219 | }, 220 | }); 221 | } 222 | res.json({ 223 | id: req.params.id, 224 | name: "john doe", 225 | email: "test@domain.com", 226 | }); 227 | }); 228 | const req = request(app); 229 | const result = await req.get("/users/10").expect(404); 230 | expect(result.body).toEqual({ 231 | error: { 232 | code: "NOT_FOUND", 233 | message: "User not found", 234 | }, 235 | }); 236 | }); 237 | 238 | it("should get many users with context", async () => { 239 | const ctx = zodiosContext( 240 | z.object({ 241 | user: z.object({ 242 | id: z.number(), 243 | name: z.string(), 244 | email: z.string().email(), 245 | }), 246 | }) 247 | ); 248 | const app = ctx.app(); 249 | const router = ctx.router(userApi); 250 | router.use((req, res, next) => { 251 | req.user = { 252 | id: 1, 253 | name: "john doe", 254 | email: "john.doe@domain.com", 255 | }; 256 | next(); 257 | }); 258 | app.use(router); 259 | router.get("/users", (req, res, next) => { 260 | res.json([ 261 | req.user, 262 | { 263 | id: 2, 264 | name: "jane doe", 265 | email: "jane.doe@domain.com", 266 | }, 267 | ]); 268 | }); 269 | const req = request(app); 270 | const result = await req.get("/users").expect(200); 271 | expect(result.body).toEqual([ 272 | { 273 | id: 1, 274 | name: "john doe", 275 | email: "john.doe@domain.com", 276 | }, 277 | { 278 | id: 2, 279 | name: "jane doe", 280 | email: "jane.doe@domain.com", 281 | }, 282 | ]); 283 | }); 284 | 285 | it("should return 400 error on bad path params", async () => { 286 | const app = zodiosContext().app(userApi); 287 | app.get("/users/:id", (req, res, next) => { 288 | res.json({ 289 | id: req.params.id, 290 | name: "john doe", 291 | email: "john.doe@domain.com", 292 | }); 293 | }); 294 | const req = request(app); 295 | const result = await req.get("/users/hello").expect(400); 296 | expect(result.body).toEqual({ 297 | context: "path.id", 298 | error: [ 299 | { 300 | code: "invalid_type", 301 | expected: "number", 302 | message: "Expected number, received string", 303 | path: [], 304 | received: "string", 305 | }, 306 | ], 307 | }); 308 | }); 309 | 310 | it("should return 400 error on bad query params", async () => { 311 | const app = zodiosContext().app(userApi); 312 | app.get("/users", (req, res, next) => { 313 | res.json([ 314 | { 315 | id: 1, 316 | name: "john doe", 317 | email: "john.doe@domain.com", 318 | }, 319 | { 320 | id: 2, 321 | name: "jane doe", 322 | email: "jane.doe@domain.com", 323 | }, 324 | ]); 325 | }); 326 | const req = request(app); 327 | const result = await req.get("/users?limit=0").expect(400); 328 | expect(result.body.context).toEqual("query.limit"); 329 | expect(result.body.error).toEqual([ 330 | expect.objectContaining({ 331 | code: "too_small", 332 | inclusive: true, 333 | message: "Number must be greater than or equal to 1", 334 | minimum: 1, 335 | path: [], 336 | type: "number", 337 | }), 338 | ]); 339 | }); 340 | it("should create a user", async () => { 341 | const app = zodiosContext().app(userApi); 342 | app.post("/users", (req, res, next) => { 343 | res.json({ 344 | id: 1, 345 | ...req.body, 346 | }); 347 | }); 348 | const req = request(app); 349 | const result = await req.post("/users").send({ 350 | name: "john doe", 351 | email: "john.doe@domain.com", 352 | }); 353 | expect(result.status).toBe(200); 354 | expect(result.body).toEqual({ 355 | id: 1, 356 | name: "john doe", 357 | email: "john.doe@domain.com", 358 | }); 359 | }); 360 | 361 | it("should return 400 error when sending an invalid user", async () => { 362 | const app = zodiosContext().app(userApi); 363 | app.post("/users", (req, res, next) => { 364 | res.json({ 365 | id: 1, 366 | ...req.body, 367 | }); 368 | }); 369 | const req = request(app); 370 | const result = await req.post("/users").send({ 371 | name: "john doe", 372 | email: "john.doe", 373 | }); 374 | expect(result.status).toBe(400); 375 | expect(result.body).toEqual({ 376 | context: "body", 377 | error: [ 378 | { 379 | validation: "email", 380 | code: "invalid_string", 381 | message: "Invalid email", 382 | path: ["email"], 383 | }, 384 | ], 385 | }); 386 | }); 387 | it("should succeed to put a user if authenticated", async () => { 388 | const app = zodiosContext().app(userApi); 389 | app.put("/users/:id", (req, res) => { 390 | res.json(req.body); 391 | }); 392 | const req = request(app); 393 | const result = await req 394 | .put("/users/1") 395 | .send({ 396 | id: 1, 397 | name: "john doe", 398 | email: "john.doe@domain.com", 399 | }) 400 | .set("Authorization", "Bearer 12345"); 401 | expect(result.status).toBe(200); 402 | expect(result.body).toEqual({ 403 | id: 1, 404 | name: "john doe", 405 | email: "john.doe@domain.com", 406 | }); 407 | }); 408 | it("should fail to put a user if not authenticated", async () => { 409 | const app = zodiosContext().app(userApi); 410 | app.put("/users/:id", (req, res) => { 411 | res.json(req.body); 412 | }); 413 | const req = request(app); 414 | const result = await req.put("/users/1").send({ 415 | id: 1, 416 | name: "john doe", 417 | email: "john.doe@domain.com", 418 | }); 419 | expect(result.status).toBe(400); 420 | }); 421 | }); 422 | -------------------------------------------------------------------------------- /src/zodios.ts: -------------------------------------------------------------------------------- 1 | import express, { RouterOptions } from "express"; 2 | import { z, ZodObject } from "zod"; 3 | import { ZodiosEndpointDefinitions } from "@zodios/core"; 4 | import { Narrow } from "@zodios/core/lib/utils.types"; 5 | import { 6 | ZodiosApp, 7 | ZodiosRouter, 8 | ZodiosAppOptions, 9 | ZodiosRouterOptions, 10 | WithZodiosContext, 11 | } from "./zodios.types"; 12 | import { injectParametersValidators } from "./zodios-validator"; 13 | 14 | /** 15 | * create a zodios app based on the given api and express 16 | * @param api - api definition 17 | * @param options - options to configure the app 18 | * @returns 19 | */ 20 | export function zodiosApp< 21 | Api extends ZodiosEndpointDefinitions = any, 22 | Context extends ZodObject = ZodObject 23 | >( 24 | api?: Narrow, 25 | options: ZodiosAppOptions = {} 26 | ): ZodiosApp { 27 | const { 28 | express: app = express(), 29 | enableJsonBodyParser = true, 30 | validate = true, 31 | transform = false, 32 | validationErrorHandler = defaultErrorHandler, 33 | } = options; 34 | if (enableJsonBodyParser) { 35 | app.use(express.json()); 36 | } 37 | if (api && validate) { 38 | injectParametersValidators(api, app, transform, validationErrorHandler); 39 | } 40 | return app as unknown as ZodiosApp; 41 | } 42 | 43 | /** 44 | * create a zodios router based on the given api and express router 45 | * @param api - api definition 46 | * @param options - options to configure the router 47 | * @returns 48 | */ 49 | export function zodiosRouter< 50 | Api extends ZodiosEndpointDefinitions, 51 | Context extends ZodObject = ZodObject 52 | >( 53 | api: Narrow, 54 | options: RouterOptions & ZodiosRouterOptions = {} 55 | ): ZodiosRouter { 56 | const { 57 | validate = true, 58 | transform = false, 59 | validationErrorHandler = defaultErrorHandler, 60 | ...routerOptions 61 | } = options; 62 | const router = options?.router ?? express.Router(routerOptions); 63 | if (validate) { 64 | injectParametersValidators(api, router, transform, validationErrorHandler); 65 | } 66 | return router as unknown as ZodiosRouter; 67 | } 68 | 69 | /** 70 | * create a zodios app for nextjs 71 | * @param options - options to configure the app 72 | * @returns - a zodios app 73 | */ 74 | export function zodiosNextApp< 75 | Api extends ZodiosEndpointDefinitions = any, 76 | Context extends ZodObject = ZodObject 77 | >( 78 | api?: Narrow, 79 | options: ZodiosAppOptions = {} 80 | ): ZodiosApp { 81 | return zodiosApp(api, { 82 | ...options, 83 | enableJsonBodyParser: false, 84 | }); 85 | } 86 | 87 | export class ZodiosContext> { 88 | constructor(public context?: Context) {} 89 | 90 | app( 91 | api?: Narrow, 92 | options: ZodiosAppOptions = {} 93 | ): ZodiosApp { 94 | return zodiosApp(api, options); 95 | } 96 | 97 | nextApp( 98 | api?: Narrow, 99 | options: ZodiosAppOptions = {} 100 | ): ZodiosApp { 101 | return zodiosNextApp(api, options); 102 | } 103 | 104 | router( 105 | api: Narrow, 106 | options?: RouterOptions & ZodiosRouterOptions 107 | ): ZodiosRouter { 108 | return zodiosRouter(api, options); 109 | } 110 | } 111 | 112 | export function zodiosContext = ZodObject>( 113 | context?: Context 114 | ): ZodiosContext { 115 | return new ZodiosContext(context); 116 | } 117 | 118 | export function defaultErrorHandler>( 119 | err: { 120 | context: string; 121 | error: z.ZodIssue[]; 122 | }, 123 | req: WithZodiosContext, 124 | res: express.Response, 125 | next: express.NextFunction 126 | ) { 127 | res.status(400).json(err); 128 | } 129 | -------------------------------------------------------------------------------- /src/zodios.types.ts: -------------------------------------------------------------------------------- 1 | import http from "http"; 2 | import express, { Request, Response } from "express"; 3 | import { 4 | ZodiosEndpointDefinitions, 5 | ZodiosEndpointDefinition, 6 | ZodiosErrorByPath, 7 | ZodiosResponseByPath, 8 | ZodiosQueryParamsByPath, 9 | ZodiosBodyByPath, 10 | ZodiosPathsByMethod, 11 | ZodiosPathParamsByPath, 12 | Method, 13 | } from "@zodios/core"; 14 | import { IfEquals } from "@zodios/core/lib/utils.types"; 15 | import { z, ZodAny, ZodObject } from "zod"; 16 | 17 | export type ZodiosSuccessCodes = 18 | | 200 19 | | 201 20 | | 202 21 | | 203 22 | | 204 23 | | 205 24 | | 206 25 | | 207 26 | | 208 27 | | 226; 28 | 29 | export type WithZodiosContext< 30 | T, 31 | Context extends ZodObject 32 | > = Context extends ZodAny ? T : T & z.infer; 33 | 34 | export interface ZodiosRequestHandler< 35 | Api extends ZodiosEndpointDefinitions, 36 | Context extends ZodObject, 37 | M extends Method, 38 | Path extends ZodiosPathsByMethod, 39 | ReqPath = ZodiosPathParamsByPath, 40 | ReqBody = ZodiosBodyByPath, 41 | ReqQuery = ZodiosQueryParamsByPath, 42 | Res = ZodiosResponseByPath 43 | > { 44 | ( 45 | req: WithZodiosContext< 46 | express.Request, 47 | Context 48 | >, 49 | res: Omit, "status"> & { 50 | // rebind context to allow for type inference 51 | status< 52 | StatusCode extends number, 53 | API extends ZodiosEndpointDefinition[] = Api, 54 | METHOD extends Method = M, 55 | PATH extends ZodiosPathsByMethod = Path 56 | >( 57 | status: StatusCode 58 | ): StatusCode extends ZodiosSuccessCodes 59 | ? express.Response 60 | : express.Response< 61 | ZodiosErrorByPath 62 | >; 63 | }, 64 | next: express.NextFunction 65 | ): void; 66 | } 67 | 68 | export type ZodiosHandler< 69 | Router, 70 | Context extends ZodObject, 71 | Api extends ZodiosEndpointDefinitions, 72 | M extends Method 73 | > = >( 74 | path: Path, 75 | ...handlers: Array> 76 | ) => Router; 77 | 78 | export type ZodiosRouterContextRequestHandler> = 79 | ( 80 | req: WithZodiosContext, 81 | res: express.Response, 82 | next: express.NextFunction 83 | ) => void; 84 | 85 | export type ZodiosRouterContextErrorHandler> = ( 86 | error: any, 87 | req: WithZodiosContext, 88 | res: express.Response, 89 | next: express.NextFunction 90 | ) => void; 91 | 92 | export type ZodiosRouterValidationErrorHandler> = 93 | ( 94 | error: { 95 | context: string; 96 | error: z.ZodIssue[]; 97 | }, 98 | req: WithZodiosContext, 99 | res: express.Response, 100 | next: express.NextFunction 101 | ) => void; 102 | 103 | export interface ZodiosUse> { 104 | use(...handlers: Array>): this; 105 | use(handlers: Array>): this; 106 | use(errorHandler: ZodiosRouterContextErrorHandler): this; 107 | use( 108 | path: string, 109 | ...handlers: Array> 110 | ): this; 111 | use( 112 | path: string, 113 | handlers: Array> 114 | ): this; 115 | } 116 | 117 | export interface ZodiosHandlers< 118 | Api extends ZodiosEndpointDefinitions, 119 | Context extends ZodObject 120 | > extends ZodiosUse { 121 | get: ZodiosHandler; 122 | post: ZodiosHandler; 123 | put: ZodiosHandler; 124 | patch: ZodiosHandler; 125 | delete: ZodiosHandler; 126 | options: ZodiosHandler; 127 | head: ZodiosHandler; 128 | } 129 | 130 | export interface ZodiosValidationOptions { 131 | /** 132 | * validate request parameters - default is true 133 | */ 134 | validate?: boolean; 135 | /** 136 | * transform request parameters - default is false 137 | */ 138 | transform?: boolean; 139 | } 140 | 141 | export interface ZodiosAppOptions> 142 | extends ZodiosValidationOptions { 143 | /** 144 | * express app intance - default is express() 145 | */ 146 | express?: ReturnType; 147 | /** 148 | * enable express json body parser - default is true 149 | */ 150 | enableJsonBodyParser?: boolean; 151 | context?: Context; 152 | validationErrorHandler?: ZodiosRouterValidationErrorHandler; 153 | } 154 | 155 | export interface ZodiosRouterOptions> 156 | extends ZodiosValidationOptions { 157 | /** 158 | * express router instance - default is express.Router 159 | */ 160 | router?: ReturnType; 161 | context?: Context; 162 | validationErrorHandler?: ZodiosRouterValidationErrorHandler; 163 | } 164 | 165 | export interface ZodiosUnknownApp> 166 | extends Omit, "use">, 167 | ZodiosUse { 168 | ( 169 | req: Request | http.IncomingMessage, 170 | res: Response | http.ServerResponse 171 | ): any; 172 | } 173 | 174 | export interface ZodiosApiApp< 175 | Api extends ZodiosEndpointDefinition[], 176 | Context extends ZodObject 177 | > extends Omit, Method | "use">, 178 | ZodiosHandlers { 179 | ( 180 | req: Request | http.IncomingMessage, 181 | res: Response | http.ServerResponse 182 | ): any; 183 | } 184 | 185 | export type ZodiosApp< 186 | Api extends ZodiosEndpointDefinitions, 187 | Context extends ZodObject 188 | > = IfEquals, ZodiosApiApp>; 189 | 190 | export type ZodiosRouter< 191 | Api extends ZodiosEndpointDefinitions, 192 | Context extends ZodObject 193 | > = IfEquals< 194 | Api, 195 | any, 196 | Omit, "use"> & 197 | ZodiosUse & 198 | ZodiosRouterContextRequestHandler, 199 | Omit, Method | "use"> & 200 | ZodiosHandlers & 201 | ZodiosRouterContextRequestHandler 202 | >; 203 | -------------------------------------------------------------------------------- /src/zodios.utils.spec.ts: -------------------------------------------------------------------------------- 1 | import { makeApi } from "@zodios/core"; 2 | import { z } from "zod"; 3 | import { prefixApi } from "./zodios.utils"; 4 | import { Assert } from "@zodios/core/lib/utils.types"; 5 | 6 | const response = z.object({ 7 | id: z.number(), 8 | name: z.string(), 9 | }); 10 | 11 | const api = makeApi([ 12 | { 13 | method: "get", 14 | path: "/", 15 | response, 16 | }, 17 | { 18 | method: "get", 19 | path: "/foo", 20 | response, 21 | }, 22 | ]); 23 | 24 | describe("zodios utils", () => { 25 | it("should prefix api", () => { 26 | type Expected = [ 27 | { 28 | method: "get"; 29 | path: "/api/"; 30 | response: typeof response; 31 | }, 32 | { 33 | method: "get"; 34 | path: "/api/foo"; 35 | response: typeof response; 36 | } 37 | ]; 38 | const prefix = "/api"; 39 | const prefixedApi = prefixApi(prefix, api); 40 | const testApi: Assert = true; 41 | expect(prefixedApi).toEqual([ 42 | { 43 | method: "get", 44 | path: "/api/", 45 | response, 46 | }, 47 | { 48 | method: "get", 49 | path: "/api/foo", 50 | response, 51 | }, 52 | ]); 53 | }); 54 | }); 55 | -------------------------------------------------------------------------------- /src/zodios.utils.ts: -------------------------------------------------------------------------------- 1 | import { z } from "zod"; 2 | 3 | type MapPrefixPath< 4 | T extends readonly unknown[], 5 | PrefixValue extends string, 6 | ACC extends unknown[] = [] 7 | > = T extends readonly [infer Head, ...infer Tail] 8 | ? MapPrefixPath< 9 | Tail, 10 | PrefixValue, 11 | [ 12 | ...ACC, 13 | { 14 | [K in keyof Head]: K extends "path" 15 | ? Head[K] extends string 16 | ? `${PrefixValue}${Head[K]}` 17 | : Head[K] 18 | : Head[K]; 19 | } 20 | ] 21 | > 22 | : ACC; 23 | 24 | export function prefixApi( 25 | prefix: Prefix, 26 | api: Api 27 | ) { 28 | return api.map((endpoint) => ({ 29 | ...endpoint, 30 | path: `${prefix}${endpoint.path}`, 31 | })) as MapPrefixPath; 32 | } 33 | 34 | export function isZodType( 35 | t: z.ZodTypeAny, 36 | type: z.ZodFirstPartyTypeKind 37 | ): boolean { 38 | if (t._def?.typeName === type) { 39 | return true; 40 | } 41 | if ( 42 | t._def?.typeName === z.ZodFirstPartyTypeKind.ZodEffects && 43 | (t as z.ZodEffects)._def.effect.type === "refinement" 44 | ) { 45 | return isZodType((t as z.ZodEffects).innerType(), type); 46 | } 47 | if (t._def?.innerType) { 48 | return isZodType(t._def?.innerType, type); 49 | } 50 | return false; 51 | } 52 | 53 | export function withoutTransform(t: z.ZodTypeAny): z.ZodTypeAny { 54 | if (t._def?.typeName === z.ZodFirstPartyTypeKind.ZodEffects) { 55 | return withoutTransform((t as z.ZodEffects).innerType()); 56 | } 57 | return t; 58 | } 59 | -------------------------------------------------------------------------------- /tsconfig.build.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "target": "ES6", 5 | "sourceMap": false 6 | }, 7 | "exclude": [ 8 | "node_modules", 9 | "lib", 10 | "examples", 11 | "**/*.config.ts", 12 | "**/*.spec.ts", 13 | "**/*.test.ts", 14 | "**/*.d.ts" 15 | ] 16 | } 17 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | // ts config for es 2021 3 | "compilerOptions": { 4 | "target": "ES2019", 5 | "module": "CommonJS", 6 | "moduleResolution": "Node", 7 | "lib": ["ES2019"], 8 | "outDir": "./lib", 9 | "alwaysStrict": true, 10 | "strict": true, 11 | "esModuleInterop": true, 12 | "sourceMap": true, 13 | "declaration": true 14 | }, 15 | "exclude": ["node_modules", "lib", "examples"] 16 | } 17 | -------------------------------------------------------------------------------- /tsup.config.js: -------------------------------------------------------------------------------- 1 | import { defineConfig } from "tsup"; 2 | 3 | export default defineConfig({ 4 | clean: true, 5 | dts: true, 6 | entry: ["src/index.ts"], 7 | outDir: "lib", 8 | format: ["cjs", "esm"], 9 | minify: true, 10 | treeshake: true, 11 | tsconfig: "tsconfig.build.json", 12 | splitting: true, 13 | sourcemap: false, 14 | }); 15 | --------------------------------------------------------------------------------