├── .eslintignore
├── .eslintrc.json
├── .github
└── workflows
│ └── ci.yml
├── .gitignore
├── .prettierignore
├── .prettierrc.json
├── .vscode
└── settings.json
├── LICENSE
├── README.md
├── examples
└── react
│ ├── client
│ ├── index.html
│ ├── package.json
│ ├── src
│ │ ├── App.tsx
│ │ ├── User.tsx
│ │ ├── api.ts
│ │ └── main.tsx
│ ├── tsconfig.json
│ └── vite.config.ts
│ ├── package.json
│ ├── server
│ ├── getUser.route.ts
│ ├── index.ts
│ ├── package.json
│ ├── server.ts
│ └── tsconfig.json
│ └── yarn.lock
├── package.json
├── packages
├── core
│ ├── .yarnrc.yml
│ ├── LICENSE
│ ├── README.md
│ ├── jest.config.js
│ ├── package.json
│ ├── src
│ │ ├── RouteDefinition.ts
│ │ ├── client
│ │ │ └── client.ts
│ │ ├── index.ts
│ │ ├── providers
│ │ │ ├── Provider.ts
│ │ │ ├── TypeboxProvider.ts
│ │ │ └── ZodProvider.ts
│ │ ├── server
│ │ │ └── server.ts
│ │ ├── tests
│ │ │ └── stack.test.ts
│ │ └── types.ts
│ ├── tsconfig.json
│ ├── tsup.config.ts
│ └── yarn.lock
└── react-query
│ ├── LICENSE
│ ├── README.md
│ ├── jest.config.js
│ ├── package.json
│ ├── src
│ ├── ReactQuery.ts
│ └── index.ts
│ ├── tsconfig.json
│ ├── tsup.config.ts
│ └── yarn.lock
├── site
├── .gitignore
├── README.md
├── babel.config.js
├── docs
│ ├── getting-started.md
│ ├── intro.mdx
│ └── recipes
│ │ ├── _category_.json
│ │ ├── client-usage.md
│ │ ├── react-query.md
│ │ ├── recommended-architecture.md
│ │ ├── server-usage.md
│ │ └── type-inference.md
├── docusaurus.config.js
├── package.json
├── sidebars.js
├── src
│ ├── components
│ │ ├── HomepageFeatures
│ │ │ ├── index.tsx
│ │ │ └── styles.module.css
│ │ └── Video.tsx
│ └── css
│ │ └── custom.css
├── static
│ ├── .nojekyll
│ ├── img
│ │ ├── favicon+o.png
│ │ ├── favicon.ico
│ │ ├── favicon.png
│ │ ├── favicon_o.ico
│ │ ├── logo_black.png
│ │ ├── logo_w.png
│ │ ├── logo_white.png
│ │ ├── logo_white_full.png
│ │ ├── social.jpg
│ │ └── social_o.jpg
│ ├── presentation.mov
│ └── video.mov
├── tsconfig.json
└── yarn.lock
└── yarn.lock
/.eslintignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | dist
3 | .webpack
4 | .data
5 | build
6 | infra
7 | release.config.js
8 | .next
9 | routeTree.gen.ts
10 |
--------------------------------------------------------------------------------
/.eslintrc.json:
--------------------------------------------------------------------------------
1 | {
2 | "env": {
3 | "es2021": true,
4 | "node": true
5 | },
6 | "extends": [
7 | "eslint:recommended",
8 | "plugin:react/recommended",
9 | "plugin:@typescript-eslint/recommended"
10 | ],
11 | "parser": "@typescript-eslint/parser",
12 | "parserOptions": {
13 | "ecmaFeatures": {
14 | "jsx": true
15 | },
16 | "ecmaVersion": "latest",
17 | "sourceType": "module"
18 | },
19 | "plugins": [
20 | "react",
21 | "@typescript-eslint",
22 | "simple-import-sort",
23 | "import",
24 | "unused-imports"
25 | ],
26 | "rules": {
27 | "simple-import-sort/imports": "error",
28 | "react/react-in-jsx-scope": "off",
29 | "@typescript-eslint/no-empty-function": "off",
30 | "react/display-name": 0,
31 | "@typescript-eslint/ban-ts-comment": "off",
32 | "react/prop-types": "off",
33 | "@typescript-eslint/no-empty-interface": "off",
34 | "react/no-unescaped-entities": "off",
35 | "@typescript-eslint/no-var-requires": "warn",
36 | "no-unused-vars": "off",
37 | "@typescript-eslint/no-unused-vars": "off",
38 | "unused-imports/no-unused-imports": "error",
39 | "unused-imports/no-unused-vars": [
40 | "error",
41 | {
42 | "vars": "all",
43 | "varsIgnorePattern": "^_",
44 | "args": "after-used",
45 | "argsIgnorePattern": "^_"
46 | }
47 | ],
48 | "import/no-useless-path-segments": ["error"],
49 | "import/no-duplicates": ["error", { "considerQueryString": true }],
50 | "import/no-unassigned-import": ["off"],
51 | "import/newline-after-import": ["error", { "count": 1 }]
52 | },
53 | "settings": {
54 | "react": {
55 | "version": "detect"
56 | }
57 | }
58 | }
59 |
--------------------------------------------------------------------------------
/.github/workflows/ci.yml:
--------------------------------------------------------------------------------
1 | name: CI
2 |
3 | on: [pull_request]
4 |
5 | jobs:
6 | lint:
7 | runs-on: ubuntu-latest
8 | steps:
9 | - uses: actions/checkout@v3
10 |
11 | - name: Run yarn install
12 | run: yarn install
13 |
14 | - name: Run prettier and eslint
15 | run: yarn lint
16 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 |
8 | # Directory for instrumented libs generated by jscoverage/JSCover
9 | lib-cov
10 |
11 | # Coverage directory used by tools like istanbul
12 | coverage
13 | *.lcov
14 |
15 | # Compiled binary addons (https://nodejs.org/api/addons.html)
16 | build/Release
17 |
18 | # Dependency directories
19 | node_modules/
20 |
21 | # Yarn Integrity file
22 | .yarn-integrity
23 |
24 | # dotenv environment variables file
25 | .env
26 | .env.test
27 |
28 | # parcel-bundler cache (https://parceljs.org/)
29 | .cache
30 |
31 | dist
32 |
33 | .idea/
34 |
35 | .pnp.*
36 | .yarn/*
37 | !.yarn/patches
38 | !.yarn/plugins
39 | !.yarn/releases
40 | !.yarn/sdks
41 | !.yarn/versions
42 |
43 | **/.yarn/*
--------------------------------------------------------------------------------
/.prettierignore:
--------------------------------------------------------------------------------
1 | dist
2 | .yarn
3 | node_modules
4 | .next
5 |
6 | styled-system
7 | styled-system/**
8 | styled-system/**/*
9 | routeTree.gen.ts
10 | build
11 | .docusaurus
12 |
--------------------------------------------------------------------------------
/.prettierrc.json:
--------------------------------------------------------------------------------
1 | {
2 | "arrowParens": "always",
3 | "printWidth": 80,
4 | "singleQuote": true,
5 | "tabWidth": 2,
6 | "trailingComma": "es5"
7 | }
8 |
--------------------------------------------------------------------------------
/.vscode/settings.json:
--------------------------------------------------------------------------------
1 | {
2 | "editor.formatOnSave": true,
3 | "[typescriptreact]": {
4 | "editor.defaultFormatter": "esbenp.prettier-vscode"
5 | },
6 | "editor.codeActionsOnSave": {
7 | "source.fixAll.eslint": true
8 | },
9 | "files.insertFinalNewline": true,
10 | "files.exclude": {
11 | "**/.git": true,
12 | "**/.svn": true,
13 | "**/.hg": true,
14 | "**/CVS": true,
15 | "**/.DS_Store": true,
16 | "**/*/lib": true,
17 | "**/*/build": true,
18 | "**/.webpack": true
19 | },
20 | "files.watcherExclude": {
21 | "**/*/lib": true,
22 | "**/*/dist": true,
23 | "**/*/build": true,
24 | "**/.webpack": true,
25 | "**/node_modules": false
26 | },
27 | "search.exclude": {
28 | "**/*/lib": true,
29 | "**/*/dist": true,
30 | "**/*/build": true,
31 | "**/.webpack": true,
32 | "**/.next": true,
33 | "**/node_modules": true
34 | },
35 | "javascript.preferences.importModuleSpecifier": "relative",
36 | "typescript.preferences.importModuleSpecifier": "relative"
37 | }
38 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2022 Florian DE LA COMBLE
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 |
http-wizard
2 | 
3 |
4 | ### Full documentation website:
5 |
6 | [http-wizard.vercel.app](https://http-wizard.vercel.app)
7 |
8 | ## Introduction
9 |
10 | Http-wizard weaves TypeScript magic, offering a type-safe API client and ensuring a delightful end-to-end developer experience. ✨
11 |
12 | #### Here is an example of usage
13 |
14 | https://github.com/flodlc/http-wizard/assets/3781663/e88fc3f8-4174-4ce0-b0f7-30ab127b4bea
15 |
16 | ### What it can do:
17 |
18 | - 100% type-safe api client with typescript magic (no code generation)
19 | - Fastify first-class support
20 | - React-query first-class support
21 | - Zod and Typebox Type providers
22 | - Delightful end-to-end developer experience (tRPC-like)
23 | - Http standards / REST compatibility: you are owner of your routes
24 | - Type inference utils
25 |
26 | ---
27 |
28 | Table of Contents:
29 |
30 | - [Installation](#installation)
31 | - [Usage](#usage)
32 |
33 | ---
34 |
35 | ## Installation
36 |
37 | To get started, install http-wizard using npm or yarn:
38 |
39 | ```sh
40 | npm install @http-wizard/core
41 | # or
42 | yarn add @http-wizard/core
43 | ```
44 |
45 | ## Usage
46 |
47 | Currently http-wizard uses Zod or Typebox for validation.
48 | Here is an example with Zod.
49 |
50 | Let's first create a route on the server:
51 |
52 | ```typescript title="Route creation with Fastify and Zod"
53 | // server.ts
54 | import { createRoute } from '@http-wizard/core';
55 | import { z } from 'zod';
56 |
57 | const User = z.object({
58 | id: z.string(),
59 | name: z.string(),
60 | });
61 |
62 | export const getUsers = (fastify: FastifyInstance) => {
63 | return createRoute('/users', {
64 | method: 'GET',
65 | schema: {
66 | response: {
67 | 200: z.array(User),
68 | },
69 | },
70 | }).handle((props) => {
71 | fastify.route({
72 | ...props,
73 | handler: (request) => {
74 | const users = await db.getUsers();
75 | return users;
76 | },
77 | });
78 | });
79 | };
80 |
81 | const router = { ...getUsers() };
82 | export type Router = typeof router;
83 | ```
84 |
85 | Now, let's use the Router type on the client:
86 |
87 | ```typescript title="Client instanciation with axios"
88 | // client.ts
89 | import { createClient, ZodTypeProvider } from '@http-wizard/core';
90 | import axios from 'axios';
91 |
92 | import type { Router } from './server';
93 |
94 | const apiClient = createClient(axios.instance());
95 | const users = await apiClient.ref('[GET]/users').query({});
96 | // users array is safe: { id:string, name:string }[]
97 | ```
98 |
99 | Easy, right?
100 |
--------------------------------------------------------------------------------
/examples/react/client/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Vite + React + TS
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/examples/react/client/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "client",
3 | "private": true,
4 | "version": "0.0.0",
5 | "type": "module",
6 | "scripts": {
7 | "dev": "vite",
8 | "build": "tsc && vite build",
9 | "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0",
10 | "preview": "vite preview",
11 | "typecheck": "tsc"
12 | },
13 | "dependencies": {
14 | "@http-wizard/core": "^1.3.16",
15 | "@http-wizard/react-query": "^1.3.18",
16 | "@tanstack/react-query": "^5.8.3",
17 | "axios": "^1.6.2",
18 | "react": "^18.2.0",
19 | "react-dom": "^18.2.0",
20 | "server": "*"
21 | },
22 | "devDependencies": {
23 | "@types/react": "^18.2.15",
24 | "@types/react-dom": "^18.2.7",
25 | "@typescript-eslint/eslint-plugin": "^6.0.0",
26 | "@typescript-eslint/parser": "^6.0.0",
27 | "@vitejs/plugin-react": "^4.0.3",
28 | "eslint": "^8.45.0",
29 | "eslint-plugin-react-hooks": "^4.6.0",
30 | "eslint-plugin-react-refresh": "^0.4.3",
31 | "typescript": "^5.1.2",
32 | "vite": "^4.4.5"
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/examples/react/client/src/App.tsx:
--------------------------------------------------------------------------------
1 | import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
2 | import { useState } from 'react';
3 |
4 | import { User } from './User';
5 |
6 | export function App() {
7 | const [queryClient] = useState(new QueryClient());
8 | return (
9 |
10 |
11 |
12 | );
13 | }
14 |
15 | export default App;
16 |
--------------------------------------------------------------------------------
/examples/react/client/src/User.tsx:
--------------------------------------------------------------------------------
1 | import { api } from './api';
2 |
3 | export const User = () => {
4 | const { data: user } = api.ref('[GET]/user').useQuery({});
5 |
6 | if (!user) return <>loading>;
7 |
8 | return (
9 |
10 |
Name: {user.name}
11 |
Age: {user.age}
12 |
13 | );
14 | };
15 |
--------------------------------------------------------------------------------
/examples/react/client/src/api.ts:
--------------------------------------------------------------------------------
1 | import { ZodTypeProvider } from '@http-wizard/core';
2 | import { createQueryClient } from '@http-wizard/react-query';
3 | import axios from 'axios';
4 | import { Router } from 'server';
5 |
6 | export const api = createQueryClient({
7 | instance: axios.create(),
8 | });
9 |
--------------------------------------------------------------------------------
/examples/react/client/src/main.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import ReactDOM from 'react-dom/client';
3 |
4 | import { App } from './App.tsx';
5 |
6 | // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
7 | ReactDOM.createRoot(document.getElementById('root')!).render(
8 |
9 |
10 |
11 | );
12 |
--------------------------------------------------------------------------------
/examples/react/client/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "ES2020",
4 | "useDefineForClassFields": true,
5 | "lib": ["ES2020", "DOM", "DOM.Iterable"],
6 | "module": "ESNext",
7 | "skipLibCheck": true,
8 | "allowSyntheticDefaultImports": true,
9 |
10 | /* Bundler mode */
11 | "moduleResolution": "bundler",
12 | "allowImportingTsExtensions": true,
13 | "resolveJsonModule": true,
14 | "isolatedModules": true,
15 | "noEmit": true,
16 | "jsx": "react-jsx",
17 | "esModuleInterop": true,
18 |
19 | /* Linting */
20 | "strict": true,
21 | "noUnusedLocals": true,
22 | "noUnusedParameters": true,
23 | "noFallthroughCasesInSwitch": true,
24 | "composite": true
25 | },
26 | "include": ["src", "vite.config.ts"]
27 | }
28 |
--------------------------------------------------------------------------------
/examples/react/client/vite.config.ts:
--------------------------------------------------------------------------------
1 | import react from '@vitejs/plugin-react';
2 | import { defineConfig } from 'vite';
3 |
4 | // https://vitejs.dev/config/
5 | export default defineConfig({
6 | plugins: [react()],
7 | });
8 |
--------------------------------------------------------------------------------
/examples/react/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "react-exemple",
3 | "version": "1.0.0",
4 | "license": "MIT",
5 | "private": true,
6 | "scripts": {
7 | "start": "echo 11 && (yarn workspace server dev & yarn workspace client dev)"
8 | },
9 | "workspaces": [
10 | "client",
11 | "server"
12 | ]
13 | }
14 |
--------------------------------------------------------------------------------
/examples/react/server/getUser.route.ts:
--------------------------------------------------------------------------------
1 | import { createRoute } from '@http-wizard/core';
2 | import { z } from 'zod';
3 |
4 | import { Server } from './server';
5 |
6 | export const getUserRoute = (server: Server) => {
7 | return createRoute('/user', {
8 | method: 'GET',
9 | schema: {
10 | response: {
11 | 200: z.object({
12 | name: z.string(),
13 | age: z.number(),
14 | }),
15 | },
16 | },
17 | }).handle((props) => {
18 | server.route({
19 | ...props,
20 | handler: (_, response) => {
21 | response.code(200).send({ name: 'John', age: 30 });
22 | },
23 | });
24 | });
25 | };
26 |
--------------------------------------------------------------------------------
/examples/react/server/index.ts:
--------------------------------------------------------------------------------
1 | import { getUserRoute } from './getUser.route';
2 | import { server } from './server';
3 |
4 | const router = { ...getUserRoute(server) };
5 |
6 | export type Router = typeof router;
7 |
8 | server.listen({ port: 5000, host: '0.0.0.0' }, () => {
9 | console.log('server listening');
10 | });
11 |
--------------------------------------------------------------------------------
/examples/react/server/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "server",
3 | "version": "0.0.1",
4 | "private": true,
5 | "license": "MIT",
6 | "types": "./index.ts",
7 | "scripts": {
8 | "dev": "tsx watch index.ts",
9 | "start": "tsx "
10 | },
11 | "dependencies": {
12 | "@fastify/cors": "^8.2.0",
13 | "fastify": "^4.12.0",
14 | "fastify-type-provider-zod": "^1.1.9",
15 | "@http-wizard/core": "1.3.16",
16 | "zod": "^3.22.4"
17 | },
18 | "engines": {
19 | "node": ">=18.0.0"
20 | },
21 | "devDependencies": {
22 | "@types/node": "^20.6.0",
23 | "tsx": "^4.1.2",
24 | "typescript": "^5.1.3"
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/examples/react/server/server.ts:
--------------------------------------------------------------------------------
1 | import fastifyCors from '@fastify/cors';
2 | import fastify from 'fastify';
3 | import {
4 | serializerCompiler,
5 | validatorCompiler,
6 | ZodTypeProvider,
7 | } from 'fastify-type-provider-zod';
8 |
9 | export const server = fastify({
10 | logger: true,
11 | }).withTypeProvider();
12 |
13 | server.setValidatorCompiler(validatorCompiler);
14 | server.setSerializerCompiler(serializerCompiler);
15 |
16 | server.register(fastifyCors, {});
17 |
18 | export type Server = typeof server;
19 |
--------------------------------------------------------------------------------
/examples/react/server/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "moduleResolution": "node",
4 | "esModuleInterop": true,
5 | "strict": true,
6 | "outDir": "dist"
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "scripts": {
3 | "lint": "yarn lint:eslint && yarn lint:prettier",
4 | "lint:eslint": "eslint .",
5 | "lint:prettier": "prettier --check ."
6 | },
7 | "devDependencies": {
8 | "typescript": "^5.0.4",
9 | "@typescript-eslint/eslint-plugin": "^5.30.0",
10 | "@typescript-eslint/parser": "^5.30.0",
11 | "eslint": "^8.51.0",
12 | "eslint-plugin-import": "^2.28.1",
13 | "eslint-plugin-react": "^7.30.1",
14 | "eslint-plugin-simple-import-sort": "^10.0.0",
15 | "eslint-plugin-unused-imports": "^3.0.0",
16 | "prettier": "^3.0.3"
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/packages/core/.yarnrc.yml:
--------------------------------------------------------------------------------
1 | nodeLinker: node-modules
2 |
3 | yarnPath: .yarn/releases/yarn-3.2.1.cjs
4 |
--------------------------------------------------------------------------------
/packages/core/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2022 Florian DE LA COMBLE
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 |
--------------------------------------------------------------------------------
/packages/core/README.md:
--------------------------------------------------------------------------------
1 | http-wizard
2 | 
3 |
4 | ### Full documentation website:
5 |
6 | [http-wizard.vercel.app](https://http-wizard.vercel.app)
7 |
8 | ## Introduction
9 |
10 | Http-wizard weaves TypeScript magic, offering a type-safe API client and ensuring a delightful end-to-end developer experience. ✨
11 |
12 | #### Here is an example of usage
13 |
14 | https://github.com/flodlc/http-wizard/assets/3781663/71c749f0-3493-4865-8a9a-41421a371a05
15 |
16 | ### What it can do:
17 |
18 | - 100% type-safe api client with typescript magic (no code generation)
19 | - Fastify first-class support
20 | - React-query first-class support
21 | - Zod and Typebox Type providers
22 | - Delightful end-to-end developer experience (tRPC-like)
23 | - Http standards / REST compatibility: you are owner of your routes
24 | - Type inference utils
25 |
26 | ---
27 |
28 | Table of Contents:
29 |
30 | - [Installation](#installation)
31 | - [Usage](#usage)
32 |
33 | ---
34 |
35 | ## Installation
36 |
37 | To get started, install http-wizard using npm or yarn:
38 |
39 | ```sh
40 | npm install @http-wizard/core
41 | # or
42 | yarn add @http-wizard/core
43 | ```
44 |
45 | ## Usage
46 |
47 | Currently http-wizard uses Zod or Typebox for validation.
48 | Here is an example with Zod.
49 |
50 | Let's first create a route on the server:
51 |
52 | ```typescript title="Route creation with Fastify and Zod"
53 | // server.ts
54 | import { createRoute } from '@http-wizard/core';
55 | import { z } from 'zod';
56 |
57 | const User = z.object({
58 | id: z.string(),
59 | name: z.string(),
60 | });
61 |
62 | export const getUsers = (fastify: FastifyInstance) => {
63 | return createRoute('/users', {
64 | method: 'GET',
65 | schema: {
66 | response: {
67 | 200: z.array(User),
68 | },
69 | },
70 | }).handle((props) => {
71 | fastify.route({
72 | ...props,
73 | handler: (request) => {
74 | const users = await db.getUsers();
75 | return users;
76 | },
77 | });
78 | });
79 | };
80 |
81 | const router = { ...getUsers() };
82 | export type Router = typeof router;
83 | ```
84 |
85 | Now, let's use the Router type on the client:
86 |
87 | ```typescript title="Client instanciation with axios"
88 | // client.ts
89 | import { createClient, ZodTypeProvider } from '@http-wizard/core';
90 | import axios from 'axios';
91 |
92 | import type { Router } from './server';
93 |
94 | const apiClient = createClient(axios.instance());
95 | const users = await apiClient.ref('[GET]/users').query({});
96 | // users array is safe: { id:string, name:string }[]
97 | ```
98 |
99 | Easy, right?
100 |
--------------------------------------------------------------------------------
/packages/core/jest.config.js:
--------------------------------------------------------------------------------
1 | /** @type {import('ts-jest/dist/types').InitialOptionsTsJest} */
2 | module.exports = {
3 | transform: {
4 | '^.+\\.tsx?$': 'esbuild-jest',
5 | },
6 | collectCoverageFrom: ['src/**/*.{ts,tsx}'],
7 | testEnvironment: 'node',
8 | };
9 |
--------------------------------------------------------------------------------
/packages/core/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@http-wizard/core",
3 | "repository": "https://github.com/flodlc/http-wizard.git",
4 | "author": "flodlc ",
5 | "license": "MIT",
6 | "main": "./dist/index.js",
7 | "types": "./dist/index.d.ts",
8 | "module": "./dist/index.mjs",
9 | "packageManager": "yarn@3.2.1",
10 | "version": "1.3.20",
11 | "scripts": {
12 | "dev": "tsup src/index.ts --watch",
13 | "typecheck": "tsc",
14 | "build": "tsup src/index.ts --dts",
15 | "test": "jest"
16 | },
17 | "devDependencies": {
18 | "@sinclair/typebox": "^0.31.23",
19 | "@tanstack/react-query": "^5.8.1",
20 | "@types/jest": "^29.5.2",
21 | "@types/node": "^18.7.16",
22 | "axios": "^1.4.0",
23 | "esbuild-jest": "^0.5.0",
24 | "jest": "^29.5.0",
25 | "ts-jest": "^29.1.1",
26 | "tsup": "^6.2.3",
27 | "typescript": "^5.0.4",
28 | "zod": "^3.22.4"
29 | },
30 | "peerDependencies": {
31 | "axios": "^1.4.0"
32 | },
33 | "files": [
34 | "dist/*"
35 | ],
36 | "exports": {
37 | ".": {
38 | "types": "./dist/index.d.ts",
39 | "import": "./dist/index.mjs",
40 | "require": "./dist/index.js"
41 | }
42 | },
43 | "keywords": [
44 | "zod",
45 | "typebox",
46 | "fastify",
47 | "typescript",
48 | "client",
49 | "api",
50 | "node",
51 | "js"
52 | ]
53 | }
54 |
--------------------------------------------------------------------------------
/packages/core/src/RouteDefinition.ts:
--------------------------------------------------------------------------------
1 | import { AxiosRequestConfig } from 'axios';
2 |
3 | import { SchemaTypeBox } from './providers/TypeboxProvider';
4 | import { SchemaZod } from './providers/ZodProvider';
5 |
6 | export type Schema = SchemaTypeBox | SchemaZod;
7 |
8 | export type RouteDefinition = {
9 | method: AxiosRequestConfig['method'];
10 | url: string | (({ params }: { params: { [s: string]: string } }) => string);
11 | okCode?: number;
12 | schema: Schema;
13 | };
14 |
--------------------------------------------------------------------------------
/packages/core/src/client/client.ts:
--------------------------------------------------------------------------------
1 | import { AxiosInstance, AxiosRequestConfig } from 'axios';
2 |
3 | import { TypeProvider } from '../providers/Provider';
4 | import { RouteDefinition } from '../RouteDefinition';
5 | import { Args, OkResponse } from '../types';
6 |
7 | const processUrl = (url: string, args: object) =>
8 | Object.entries(('params' in args ? args?.params : undefined) ?? {}).reduce(
9 | (acc, [key, value]) =>
10 | acc.replace(new RegExp(`:${key}`, 'g'), value as string),
11 | url
12 | );
13 |
14 | export const createRouteUri = <
15 | D extends RouteDefinition,
16 | TP extends TypeProvider,
17 | >({
18 | method,
19 | url,
20 | instance,
21 | args,
22 | config,
23 | }: {
24 | method: AxiosRequestConfig['method'];
25 | url: string;
26 | instance: AxiosInstance;
27 | args: Args;
28 | config?: AxiosRequestConfig;
29 | }): string => {
30 | return instance.getUri({
31 | method,
32 | url: processUrl(url, args),
33 | params: args?.query,
34 | data: args?.body,
35 | ...config,
36 | ...args,
37 | });
38 | };
39 |
40 | export const query = async <
41 | D extends RouteDefinition,
42 | TP extends TypeProvider,
43 | >({
44 | method,
45 | url,
46 | instance,
47 | args,
48 | config,
49 | }: {
50 | method: AxiosRequestConfig['method'];
51 | url: string;
52 | instance: AxiosInstance;
53 | args: Args;
54 | config?: AxiosRequestConfig;
55 | }): Promise> => {
56 | const { data } = await instance.request({
57 | method,
58 | url: processUrl(url, args),
59 | ...config,
60 | params: 'query' in args ? args.query : undefined,
61 | data: 'body' in args ? args.body : undefined,
62 | });
63 |
64 | return data;
65 | };
66 |
67 | export type Client<
68 | Definitions extends Record,
69 | TP extends TypeProvider,
70 | > = {
71 | ref: (
72 | url: URL
73 | ) => Ref;
74 | infer: {
75 | [URL in keyof Definitions & string]: OkResponse;
76 | };
77 | inferArgs: {
78 | [URL in keyof Definitions & string]: Args;
79 | };
80 | };
81 |
82 | export type Ref<
83 | Definitions extends Record,
84 | URL extends keyof Definitions & string,
85 | TP extends TypeProvider,
86 | > = {
87 | url: (
88 | args: Args,
89 | config?: AxiosRequestConfig
90 | ) => string;
91 | query: (
92 | args: Args,
93 | config?: AxiosRequestConfig
94 | ) => Promise>;
95 | };
96 |
97 | export const createClient = <
98 | Definitions extends Record,
99 | TP extends TypeProvider,
100 | >({
101 | instance,
102 | }: {
103 | instance: AxiosInstance;
104 | }) => {
105 | return {
106 | route: (
107 | url: URL,
108 | args: Args,
109 | config?: AxiosRequestConfig
110 | ) => {
111 | const method = url.split(']')[0].replace('[', '');
112 | const shortUrl = url.split(']').slice(1).join(']');
113 | return {
114 | url: createRouteUri({
115 | url: shortUrl,
116 | method,
117 | instance,
118 | args,
119 | config,
120 | }),
121 | query: () => {
122 | return query({
123 | url: shortUrl,
124 | method,
125 | instance,
126 | args,
127 | config,
128 | });
129 | },
130 | };
131 | },
132 | ref: (
133 | url: URL
134 | ): Ref => {
135 | const method = url.split(']')[0].replace('[', '');
136 | const shortUrl = url.split(']').slice(1).join(']');
137 | return {
138 | url: (
139 | args: Args,
140 | config?: AxiosRequestConfig
141 | ) =>
142 | createRouteUri({
143 | url: shortUrl,
144 | method,
145 | instance,
146 | args,
147 | config,
148 | }),
149 | query: (
150 | args: Args,
151 | config?: AxiosRequestConfig
152 | ) => {
153 | return query({
154 | url: shortUrl,
155 | method,
156 | instance,
157 | args,
158 | config,
159 | });
160 | },
161 | };
162 | },
163 | infer: undefined as unknown as {
164 | [URL in keyof Definitions & string]: OkResponse;
165 | },
166 | inferArgs: undefined as unknown as {
167 | [URL in keyof Definitions & string]: Args;
168 | },
169 | };
170 | };
171 |
--------------------------------------------------------------------------------
/packages/core/src/index.ts:
--------------------------------------------------------------------------------
1 | export type { TypeProvider } from './providers/Provider';
2 | export type { TypeBoxTypeProvider } from './providers/TypeboxProvider';
3 | export type { ZodTypeProvider } from './providers/ZodProvider';
4 | export type { RouteDefinition } from './RouteDefinition';
5 | export type { OkResponse, Args } from './types';
6 | export { createClient } from './client/client';
7 | export { createRoute } from './server/server';
8 | export type { Client, Ref } from './client/client';
9 |
--------------------------------------------------------------------------------
/packages/core/src/providers/Provider.ts:
--------------------------------------------------------------------------------
1 | export interface TypeProvider {
2 | readonly input: unknown;
3 | readonly output: unknown;
4 | }
5 |
6 | export type CallTypeProvider = (F & {
7 | input: I;
8 | })['output'];
9 |
--------------------------------------------------------------------------------
/packages/core/src/providers/TypeboxProvider.ts:
--------------------------------------------------------------------------------
1 | import { Static, TSchema } from '@sinclair/typebox';
2 |
3 | import { TypeProvider } from './Provider';
4 |
5 | export type SchemaTypeBox = {
6 | params?: TSchema;
7 | querystring?: TSchema;
8 | body?: TSchema;
9 | response: Record;
10 | };
11 |
12 | export interface TypeBoxTypeProvider extends TypeProvider {
13 | output: this['input'] extends TSchema ? Static : never;
14 | }
15 |
--------------------------------------------------------------------------------
/packages/core/src/providers/ZodProvider.ts:
--------------------------------------------------------------------------------
1 | import { z, ZodType } from 'zod';
2 |
3 | import { TypeProvider } from './Provider';
4 |
5 | ``;
6 | export type SchemaZod = {
7 | params?: z.AnyZodObject;
8 | querystring?: z.AnyZodObject;
9 | body?: z.Schema;
10 | response: Record;
11 | };
12 |
13 | export interface ZodTypeProvider extends TypeProvider {
14 | output: this['input'] extends ZodType ? z.infer : never;
15 | }
16 |
--------------------------------------------------------------------------------
/packages/core/src/server/server.ts:
--------------------------------------------------------------------------------
1 | import { RouteDefinition, Schema } from '../RouteDefinition';
2 |
3 | const methods = [
4 | 'GET',
5 | 'POST',
6 | 'PUT',
7 | 'DELETE',
8 | 'HEAD',
9 | 'PATCH',
10 | 'OPTIONS',
11 | 'COPY',
12 | 'MOVE',
13 | 'SEARCH',
14 | ] as const;
15 |
16 | export const createRouteDefinition = (
17 | routeDefinition: R
18 | ) => routeDefinition;
19 |
20 | export const createRoute = <
21 | const URL extends string,
22 | const D extends {
23 | schema: Schema;
24 | okCode?: number;
25 | method: (typeof methods)[number];
26 | },
27 | >(
28 | url: URL,
29 | options: D
30 | ) => {
31 | return {
32 | handle: (
33 | callback: (args: {
34 | method: (typeof methods)[number];
35 | url: URL;
36 | schema: D['schema'];
37 | }) => void
38 | ) => {
39 | callback({
40 | url,
41 | method: options.method,
42 | schema: options.schema,
43 | });
44 | const routeDef = { url, ...options };
45 | const key = `${options.method}/${url}` as `${D['method']}${URL}`;
46 | return { [key]: routeDef } as {
47 | [k in `[${D['method']}]${URL}`]: typeof routeDef;
48 | };
49 | },
50 | };
51 | };
52 |
--------------------------------------------------------------------------------
/packages/core/src/tests/stack.test.ts:
--------------------------------------------------------------------------------
1 | import { Type } from '@sinclair/typebox';
2 | import { AxiosInstance } from 'axios';
3 |
4 | import { createClient } from '../client/client';
5 | import { TypeBoxTypeProvider } from '../providers/TypeboxProvider';
6 | import { createRoute } from '../server/server';
7 |
8 | const getUser = createRoute('/user/:id', {
9 | method: 'GET',
10 | schema: {
11 | params: Type.Object({
12 | id: Type.String(),
13 | }),
14 | response: {
15 | 200: Type.Array(
16 | Type.Object({
17 | name: Type.String(),
18 | age: Type.Number(),
19 | })
20 | ),
21 | },
22 | },
23 | }).handle(() => {});
24 |
25 | const getToken = createRoute('/token', {
26 | method: 'GET',
27 | schema: {
28 | querystring: Type.Object({ size: Type.String() }),
29 | response: {
30 | 200: Type.String(),
31 | },
32 | },
33 | }).handle(() => {});
34 |
35 | const createUser = createRoute('/user', {
36 | method: 'POST',
37 | schema: {
38 | body: Type.Object({ name: Type.String() }),
39 | response: {
40 | 200: Type.String(),
41 | },
42 | },
43 | }).handle(() => {});
44 |
45 | const routes = { ...getUser, ...getToken, ...createUser };
46 |
47 | type Router = typeof routes;
48 |
49 | describe('Check requests parameters and response', () => {
50 | it('it should correctly call axios.request for a GET query with query parameters', async () => {
51 | const request = jest.fn((_params) => {
52 | return { data: { name: 'John Doe' } };
53 | });
54 | const client = createClient({
55 | instance: {
56 | request,
57 | getUri: () => '/user/toto',
58 | } as unknown as AxiosInstance,
59 | });
60 |
61 | const user = await client
62 | .ref('[GET]/user/:id')
63 | .query({ params: { id: 'toto' } });
64 |
65 | const url = await client.route('[GET]/user/:id', { params: { id: 'toto' } })
66 | .url;
67 |
68 | expect(request.mock.calls?.[0]?.[0]).toMatchObject({
69 | url: '/user/toto',
70 | method: 'GET',
71 | });
72 | expect(url).toBe('/user/toto');
73 | expect(user).toMatchObject({ name: 'John Doe' });
74 | });
75 |
76 | it('it should correctly call axios.request with corrects parameters for a GET query without arguments', async () => {
77 | const request = jest.fn((_params) => {
78 | return { data: 'my-token' };
79 | });
80 | const client = createClient({
81 | instance: { request, getUri: () => '' } as unknown as AxiosInstance,
82 | });
83 |
84 | const token = await client
85 | .route('[GET]/token', { query: { size: '20' } })
86 | .query();
87 |
88 | expect(request.mock.calls?.[0]?.[0]).toMatchObject({
89 | url: '/token',
90 | method: 'GET',
91 | params: { size: '20' },
92 | });
93 | expect(token).toBe('my-token');
94 | });
95 |
96 | it('it should correctly call axios.request on a POST query with a body', async () => {
97 | const request = jest.fn((_params) => {
98 | return { data: { name: 'John Doe' } };
99 | });
100 | const client = createClient({
101 | instance: { request, getUri: () => '' } as unknown as AxiosInstance,
102 | });
103 |
104 | const user = await client
105 | .route('[POST]/user', {
106 | body: { name: 'John Doe' },
107 | })
108 | .query();
109 |
110 | expect(request.mock.calls?.[0]?.[0]).toMatchObject({
111 | url: '/user',
112 | method: 'POST',
113 | data: { name: 'John Doe' },
114 | });
115 | expect(user).toMatchObject({ name: 'John Doe' });
116 | });
117 | });
118 |
--------------------------------------------------------------------------------
/packages/core/src/types.ts:
--------------------------------------------------------------------------------
1 | import { CallTypeProvider, TypeProvider } from './providers/Provider';
2 | import { RouteDefinition, Schema } from './RouteDefinition';
3 |
4 | export type Args<
5 | S extends Schema,
6 | TP extends TypeProvider,
7 | > = (S['params'] extends object
8 | ? { params: CallTypeProvider }
9 | : { params?: undefined }) &
10 | (S['querystring'] extends object
11 | ? { query: CallTypeProvider }
12 | : { query?: undefined }) &
13 | (S['body'] extends object
14 | ? { body: CallTypeProvider }
15 | : { body?: undefined });
16 |
17 | export type Response<
18 | S extends Schema,
19 | OK extends number,
20 | TP extends TypeProvider,
21 | > = CallTypeProvider;
22 |
23 | export type OkResponse<
24 | D extends RouteDefinition,
25 | TP extends TypeProvider,
26 | > = Response;
27 |
--------------------------------------------------------------------------------
/packages/core/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "include": ["./src"],
3 | "compilerOptions": {
4 | "declarationMap": true,
5 | "listEmittedFiles": false,
6 | "listFiles": false,
7 | "pretty": true,
8 | "strictPropertyInitialization": false,
9 | "isolatedModules": true,
10 | "lib": ["ES2019"] /* Emit ECMAScript-standard-compliant class fields. */,
11 | "module": "ESNext" /* Specify what module code is generated. */,
12 | "moduleResolution": "node" /* Specify how TypeScript looks up a file from a given module specifier. */,
13 | "resolveJsonModule": true,
14 | "target": "ES2015",
15 | "outDir": "./dist" /* Specify an output folder for all emitted files. */,
16 | "esModuleInterop": true /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables `allowSyntheticDefaultImports` for type compatibility. */,
17 | "strict": true /* Enable all strict type-checking options. */,
18 | "skipLibCheck": false,
19 | "declaration": true,
20 | "emitDeclarationOnly": true,
21 | "forceConsistentCasingInFileNames": true,
22 | "allowJs": false,
23 | "baseUrl": "."
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/packages/core/tsup.config.ts:
--------------------------------------------------------------------------------
1 | import { defineConfig } from 'tsup';
2 |
3 | export default defineConfig({
4 | target: 'es2015',
5 | platform: 'browser',
6 | format: ['cjs', 'esm'],
7 | splitting: false,
8 | shims: false,
9 | minify: false,
10 | sourcemap: true,
11 | clean: true,
12 | });
13 |
--------------------------------------------------------------------------------
/packages/react-query/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2022 Florian DE LA COMBLE
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 |
--------------------------------------------------------------------------------
/packages/react-query/README.md:
--------------------------------------------------------------------------------
1 | http-wizard
2 | 
3 |
4 | ### Full documentation website:
5 |
6 | [http-wizard.vercel.app](https://http-wizard.vercel.app)
7 |
8 | ## Introduction
9 |
10 | Http-wizard weaves TypeScript magic, offering a type-safe API client and ensuring a delightful end-to-end developer experience. ✨
11 |
12 | #### Here is an example of usage
13 |
14 | https://github.com/flodlc/http-wizard/assets/3781663/71c749f0-3493-4865-8a9a-41421a371a05
15 |
16 | ### What it can do:
17 |
18 | - 100% type-safe api client with typescript magic (no code generation)
19 | - Fastify first-class support
20 | - React-query first-class support
21 | - Zod and Typebox Type providers
22 | - Delightful end-to-end developer experience (tRPC-like)
23 | - Http standards / REST compatibility: you are owner of your routes
24 | - Type inference utils
25 |
26 | ---
27 |
28 | Table of Contents:
29 |
30 | - [Installation](#installation)
31 | - [Usage](#usage)
32 |
33 | ---
34 |
35 | ## Installation
36 |
37 | To get started, install http-wizard using npm or yarn:
38 |
39 | ```sh
40 | npm install @http-wizard/core
41 | # or
42 | yarn add @http-wizard/core
43 | ```
44 |
45 | ## Usage
46 |
47 | Currently http-wizard uses Zod or Typebox for validation.
48 | Here is an example with Zod.
49 |
50 | Let's first create a route on the server:
51 |
52 | ```typescript title="Route creation with Fastify and Zod"
53 | // server.ts
54 | import { createRoute } from '@http-wizard/core';
55 | import { z } from 'zod';
56 |
57 | const User = z.object({
58 | id: z.string(),
59 | name: z.string(),
60 | });
61 |
62 | export const getUsers = (fastify: FastifyInstance) => {
63 | return createRoute('/users', {
64 | method: 'GET',
65 | schema: {
66 | response: {
67 | 200: z.array(User),
68 | },
69 | },
70 | }).handle((props) => {
71 | fastify.route({
72 | ...props,
73 | handler: (request) => {
74 | const users = await db.getUsers();
75 | return users;
76 | },
77 | });
78 | });
79 | };
80 |
81 | const router = { ...getUsers() };
82 | export type Router = typeof router;
83 | ```
84 |
85 | Now, let's use the Router type on the client:
86 |
87 | ```typescript title="Client instanciation with axios"
88 | // client.ts
89 | import { createClient, ZodTypeProvider } from '@http-wizard/core';
90 | import axios from 'axios';
91 |
92 | import type { Router } from './server';
93 |
94 | const apiClient = createClient(axios.instance());
95 | const users = await apiClient.ref('[GET]/users').query({});
96 | // users array is safe: { id:string, name:string }[]
97 | ```
98 |
99 | Easy, right?
100 |
--------------------------------------------------------------------------------
/packages/react-query/jest.config.js:
--------------------------------------------------------------------------------
1 | /** @type {import('ts-jest/dist/types').InitialOptionsTsJest} */
2 | module.exports = {
3 | transform: {
4 | '^.+\\.tsx?$': 'esbuild-jest',
5 | },
6 | collectCoverageFrom: ['src/**/*.{ts,tsx}'],
7 | testEnvironment: 'node',
8 | };
9 |
--------------------------------------------------------------------------------
/packages/react-query/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@http-wizard/react-query",
3 | "repository": "https://github.com/flodlc/http-wizard.git",
4 | "author": "flodlc ",
5 | "license": "MIT",
6 | "main": "./dist/index.js",
7 | "types": "./dist/index.d.ts",
8 | "module": "./dist/index.mjs",
9 | "packageManager": "yarn@3.2.1",
10 | "version": "1.3.20",
11 | "scripts": {
12 | "dev": "tsup src/index.ts --watch",
13 | "typecheck": "tsc",
14 | "build": "tsup src/index.ts --dts",
15 | "test": "jest"
16 | },
17 | "dependencies": {},
18 | "devDependencies": {
19 | "@sinclair/typebox": "^0.31.23",
20 | "@tanstack/react-query": "^5.8.1",
21 | "@types/jest": "^29.5.2",
22 | "@types/node": "^18.7.16",
23 | "esbuild-jest": "^0.5.0",
24 | "@http-wizard/core": "1.3.20",
25 | "jest": "^29.5.0",
26 | "ts-jest": "^29.1.1",
27 | "tsup": "^6.2.3",
28 | "typescript": "^5.0.4",
29 | "zod": "^3.22.4",
30 | "axios": "^1.4.0"
31 | },
32 | "peerDependencies": {
33 | "@tanstack/react-query": "5.x",
34 | "@http-wizard/core": "1.3.20"
35 | },
36 | "files": [
37 | "dist/*"
38 | ],
39 | "exports": {
40 | ".": {
41 | "types": "./dist/index.d.ts",
42 | "import": "./dist/index.mjs",
43 | "require": "./dist/index.js"
44 | }
45 | },
46 | "keywords": [
47 | "zod",
48 | "typebox",
49 | "fastify",
50 | "typescript",
51 | "client",
52 | "api",
53 | "node",
54 | "js",
55 | "react-query"
56 | ]
57 | }
58 |
--------------------------------------------------------------------------------
/packages/react-query/src/ReactQuery.ts:
--------------------------------------------------------------------------------
1 | import {
2 | Args,
3 | Client,
4 | createClient,
5 | OkResponse,
6 | Ref,
7 | RouteDefinition,
8 | TypeProvider,
9 | } from '@http-wizard/core';
10 | import {
11 | FetchQueryOptions,
12 | QueryClient,
13 | QueryKey,
14 | useInfiniteQuery,
15 | UseInfiniteQueryOptions,
16 | UseInfiniteQueryResult,
17 | useMutation,
18 | UseMutationOptions,
19 | UseMutationResult,
20 | useQuery,
21 | useQueryClient,
22 | UseQueryOptions,
23 | UseQueryResult,
24 | } from '@tanstack/react-query';
25 | import axios, { AxiosRequestConfig } from 'axios';
26 |
27 | export type ClientWithReactQuery<
28 | Definitions extends Record,
29 | TP extends TypeProvider,
30 | > = Omit, 'ref'> & {
31 | ref: (
32 | url: URL
33 | ) => Ref & {
34 | useQuery: (
35 | args: Args,
36 | options?: Omit<
37 | UseQueryOptions<
38 | OkResponse,
39 | Error,
40 | OkResponse,
41 | QueryKey
42 | >,
43 | 'queryKey' | 'queryFn'
44 | >,
45 | config?: AxiosRequestConfig
46 | ) => UseQueryResult>;
47 | useInfiniteQuery: (
48 | args: Args,
49 | options: Omit<
50 | UseInfiniteQueryOptions>,
51 | 'queryKey' | 'queryFn'
52 | >,
53 | config?: AxiosRequestConfig
54 | ) => UseInfiniteQueryResult>;
55 | useMutation: (
56 | options?: UseMutationOptions<
57 | OkResponse,
58 | Error,
59 | Args
60 | >,
61 | config?: Parameters[['query']>[1]
62 | ) => UseMutationResult<
63 | OkResponse,
64 | Error,
65 | Args
66 | >;
67 | prefetchQuery: (
68 | args: Args,
69 | options?: Omit<
70 | FetchQueryOptions>,
71 | 'queryKey' | 'queryFn'
72 | >,
73 | config?: Parameters][['query']>[1]
74 | ) => Promise;
75 | };
76 | };
77 |
78 | export const createQueryClient = <
79 | Definitions extends Record,
80 | TP extends TypeProvider,
81 | >({
82 | queryClient: optionQueryClient,
83 | ...options
84 | }: Parameters[0] & {
85 | queryClient?: QueryClient;
86 | }): ClientWithReactQuery => {
87 | const client: Client = createClient(
88 | options
89 | );
90 | return {
91 | ...client,
92 | ref: (url: URL) => {
93 | const routeRef = client.ref(url);
94 | return {
95 | useQuery: (
96 | args: Args,
97 | options?: Omit<
98 | UseQueryOptions<
99 | OkResponse,
100 | Error,
101 | OkResponse,
102 | QueryKey
103 | >,
104 | 'queryKey' | 'queryFn'
105 | >,
106 | config?: Parameters][['query']>[1]
107 | ) =>
108 | useQuery(
109 | {
110 | queryKey: [url, args],
111 | queryFn: () => routeRef.query(args, config),
112 | ...options,
113 | },
114 | optionQueryClient
115 | ),
116 | useInfiniteQuery: (
117 | args: Args,
118 | options: Omit<
119 | UseInfiniteQueryOptions>,
120 | 'queryKey' | 'queryFn'
121 | >,
122 | config?: Parameters][['query']>[1]
123 | ) =>
124 | useInfiniteQuery(
125 | {
126 | queryKey: [url, args],
127 | queryFn: () => routeRef.query(args, config),
128 | ...options,
129 | },
130 | optionQueryClient
131 | ),
132 | useMutation: (
133 | options?: UseMutationOptions<
134 | OkResponse,
135 | Error,
136 | Args
137 | >,
138 | config?: Parameters][['query']>[1]
139 | ) =>
140 | useMutation(
141 | {
142 | mutationKey: [url],
143 | mutationFn: (args) => routeRef.query(args, config),
144 | ...options,
145 | },
146 | optionQueryClient
147 | ),
148 | prefetchQuery: (
149 | args: Args,
150 | options?: Omit<
151 | FetchQueryOptions>,
152 | 'queryKey' | 'queryFn'
153 | >,
154 | config?: Parameters][['query']>[1]
155 | ) => {
156 | const queryClient = optionQueryClient ?? useQueryClient();
157 | return queryClient.prefetchQuery({
158 | queryKey: [url, args],
159 | queryFn: () => routeRef.query(args, config),
160 | ...options,
161 | });
162 | },
163 | ...routeRef,
164 | };
165 | },
166 | };
167 | };
168 |
169 | createQueryClient({ instance: axios.create() });
170 |
--------------------------------------------------------------------------------
/packages/react-query/src/index.ts:
--------------------------------------------------------------------------------
1 | export type { Client, RouteDefinition, OkResponse } from '@http-wizard/core';
2 | export { createQueryClient } from './ReactQuery';
3 | export type { ClientWithReactQuery } from './ReactQuery';
4 |
--------------------------------------------------------------------------------
/packages/react-query/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "include": ["./src"],
3 | "compilerOptions": {
4 | "declarationMap": true,
5 | "listEmittedFiles": false,
6 | "listFiles": false,
7 | "pretty": true,
8 | "strictPropertyInitialization": false,
9 | "isolatedModules": true,
10 | "lib": ["ES2019"] /* Emit ECMAScript-standard-compliant class fields. */,
11 | "module": "ESNext" /* Specify what module code is generated. */,
12 | "moduleResolution": "node" /* Specify how TypeScript looks up a file from a given module specifier. */,
13 | "resolveJsonModule": true,
14 | "target": "ES2015",
15 | "outDir": "./dist" /* Specify an output folder for all emitted files. */,
16 | "esModuleInterop": true /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables `allowSyntheticDefaultImports` for type compatibility. */,
17 | "strict": true /* Enable all strict type-checking options. */,
18 | "skipLibCheck": true,
19 | "declaration": true,
20 | "emitDeclarationOnly": true,
21 | "forceConsistentCasingInFileNames": true,
22 | "allowJs": false,
23 | "baseUrl": "."
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/packages/react-query/tsup.config.ts:
--------------------------------------------------------------------------------
1 | import { defineConfig } from 'tsup';
2 |
3 | export default defineConfig({
4 | target: 'es2015',
5 | platform: 'browser',
6 | format: ['cjs', 'esm'],
7 | splitting: false,
8 | shims: false,
9 | minify: false,
10 | sourcemap: true,
11 | clean: true,
12 | external: ['http-wizard'],
13 | });
14 |
--------------------------------------------------------------------------------
/site/.gitignore:
--------------------------------------------------------------------------------
1 | # Dependencies
2 | /node_modules
3 |
4 | # Production
5 | /build
6 |
7 | # Generated files
8 | .docusaurus
9 | .cache-loader
10 |
11 | # Misc
12 | .DS_Store
13 | .env.local
14 | .env.development.local
15 | .env.test.local
16 | .env.production.local
17 |
18 | npm-debug.log*
19 | yarn-debug.log*
20 | yarn-error.log*
21 |
22 |
23 | .pnp.*
24 | .yarn/*
25 | !.yarn/patches
26 | !.yarn/plugins
27 | !.yarn/releases
28 | !.yarn/sdks
29 | !.yarn/versions
30 |
--------------------------------------------------------------------------------
/site/README.md:
--------------------------------------------------------------------------------
1 | # Website
2 |
3 | This website is built using [Docusaurus 2](https://docusaurus.io/), a modern static website generator.
4 |
5 | ### Installation
6 |
7 | ```
8 | $ yarn
9 | ```
10 |
11 | ### Local Development
12 |
13 | ```
14 | $ yarn start
15 | ```
16 |
17 | This command starts a local development server and opens up a browser window. Most changes are reflected live without having to restart the server.
18 |
19 | ### Build
20 |
21 | ```
22 | $ yarn build
23 | ```
24 |
25 | This command generates static content into the `build` directory and can be served using any static contents hosting service.
26 |
27 | ### Deployment
28 |
29 | Using SSH:
30 |
31 | ```
32 | $ USE_SSH=true yarn deploy
33 | ```
34 |
35 | Not using SSH:
36 |
37 | ```
38 | $ GIT_USER= yarn deploy
39 | ```
40 |
41 | If you are using GitHub pages for hosting, this command is a convenient way to build the website and push to the `gh-pages` branch.
42 |
--------------------------------------------------------------------------------
/site/babel.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | presets: [require.resolve('@docusaurus/core/lib/babel/preset')],
3 | };
4 |
--------------------------------------------------------------------------------
/site/docs/getting-started.md:
--------------------------------------------------------------------------------
1 | ---
2 | sidebar_position: 2
3 | ---
4 |
5 | # Getting started
6 |
7 | ## Installation
8 |
9 | To get started, install http-wizard using npm or yarn:
10 |
11 | ```bash title="command"
12 | npm install @http-wizard/core zod axios
13 | # or
14 | yarn add @http-wizard/core zod axios
15 | ```
16 |
17 | ## How it works
18 |
19 | Currently http-wizard uses Zod or Typebox for validation.
20 | Here is an example with Zod.
21 |
22 | ```typescript title="Route creation with Fastify and Zod"
23 | // server.ts
24 | import { createRoute } from '@http-wizard/core';
25 | import fastify from 'fastify';
26 | import {
27 | serializerCompiler,
28 | validatorCompiler,
29 | ZodTypeProvider,
30 | } from 'fastify-type-provider-zod';
31 | import { z } from 'zod';
32 |
33 | const User = z.object({
34 | id: z.string(),
35 | name: z.string(),
36 | });
37 |
38 | export const getUsersRoute = (fastify: FastifyInstance) => {
39 | return createRoute('/users', {
40 | method: 'GET',
41 | schema: {
42 | response: {
43 | 200: z.array(User),
44 | },
45 | },
46 | }).handle((props) => {
47 | fastify.route({
48 | ...props,
49 | handler: (request) => {
50 | const users = await db.getUsers();
51 | return users;
52 | },
53 | });
54 | });
55 | };
56 |
57 | export const server = fastify().withTypeProvider();
58 | server.setValidatorCompiler(validatorCompiler);
59 | server.setSerializerCompiler(serializerCompiler);
60 | export type Server = typeof server;
61 |
62 | const router = { ...getUsersRoute(server) };
63 | export type Router = typeof router;
64 | ```
65 |
66 | Now, let's use the Router type on the client:
67 |
68 | ```typescript title="Client instancation with axios"
69 | // client.ts
70 | import { createClient, ZodTypeProvider } from '@http-wizard/core';
71 | import axios from 'axios';
72 |
73 | import type { Router } from './server';
74 |
75 | const apiClient = createClient(axios.instance());
76 | const users = await apiClient.ref('[GET]/users').query({});
77 | // users array is safe: { id:string, name:string }[]
78 | ```
79 |
80 | Let's first create a route on the server:
81 |
82 | ```typescript title="Route creation with Fastify and Zod"
83 | // server.ts
84 | import { createRoute } from '@http-wizard/core';
85 | import fastify from 'fastify';
86 | import {
87 | serializerCompiler,
88 | validatorCompiler,
89 | ZodTypeProvider,
90 | } from 'fastify-type-provider-zod';
91 | import { z } from 'zod';
92 |
93 | const User = z.object({
94 | id: z.string(),
95 | name: z.string(),
96 | });
97 |
98 | export const getUsersRoute = (fastify: FastifyInstance) => {
99 | return createRoute('/users', {
100 | method: 'GET',
101 | schema: {
102 | response: {
103 | 200: z.array(User),
104 | },
105 | },
106 | }).handle((props) => {
107 | fastify.route({
108 | ...props,
109 | handler: (request) => {
110 | const users = await db.getUsers();
111 | return users;
112 | },
113 | });
114 | });
115 | };
116 |
117 | export const server = fastify().withTypeProvider();
118 | server.setValidatorCompiler(validatorCompiler);
119 | server.setSerializerCompiler(serializerCompiler);
120 | export type Server = typeof server;
121 |
122 | const router = { ...getUsersRoute(server) };
123 | export type Router = typeof router;
124 | ```
125 |
126 | Now, let's use the Router type on the client:
127 |
128 | ```typescript title="Client instancation with axios"
129 | // client.ts
130 | import { createClient, ZodTypeProvider } from '@http-wizard/core';
131 | import axios from 'axios';
132 |
133 | import type { Router } from './server';
134 |
135 | const apiClient = createClient(axios.instance());
136 | const users = await apiClient.ref('[GET]/users').query({});
137 | // users array is safe: { id:string, name:string }[]
138 | ```
139 |
140 | Easy, right?
141 |
--------------------------------------------------------------------------------
/site/docs/intro.mdx:
--------------------------------------------------------------------------------
1 | ---
2 | sidebar_position: 1
3 | slug: /
4 | description: Http-wizard weaves TypeScript magic, offering a type-safe API client and ensuring a delightful end-to-end developer experience.
5 | ---
6 |
7 | import { Video } from './../src/components/Video';
8 |
9 | # Introduction
10 |
11 | ]
12 |
21 |
22 |
23 | Support http-wizard on github 💪
24 |
25 |
26 | #### ✨ Http-wizard weaves TypeScript magic, offering a type-safe API client and ensuring a delightful end-to-end developer experience. ✨
27 |
28 | It natively supports Fastify interface (literally made for it) and Zod or Typebox for validation
29 |
30 | ### What it can do:
31 |
32 | - 100% type-safe api client with typescript magic (no code generation)
33 | - Fastify first-class support
34 | - React-query first-class support
35 | - Zod and Typebox Type providers
36 | - Delightful end-to-end developer experience (tRPC-like)
37 | - Http standards / REST compatibility: you are owner of your routes
38 | - Type inference utils
39 |
40 |
41 |
42 | ### Why not GraphQL or tRPC?
43 |
44 | Both are excellent choices!
45 |
46 | Http-wizard allows maintaining a standard HTTP API and to keep tools such
47 | as Swagger, etc to document your API. For people who wants a tRPC-like DX but still
48 | using fastify or Express with full control over route naming, http-wizard is made
49 | for you! It combines the best of both worlds, ensuring a smooth, efficient, and productive
50 | development process.
51 |
52 | ### How it works
53 |
54 | Currently, http-wizard uses Zod or Typebox for validation, axios for data fetching.
55 | Using Fastify for a new project is highly recommended for the best developer experience.
56 |
57 | Here's how to integrate it into your project:
58 | [getting-started](/getting-started)
59 |
60 |
69 |
--------------------------------------------------------------------------------
/site/docs/recipes/_category_.json:
--------------------------------------------------------------------------------
1 | {
2 | "label": "Recipes",
3 | "position": 3,
4 | "collapsed": false,
5 | "link": {
6 | "type": "generated-index",
7 | "description": "A list of guides or recipes explaning how to use various features of the library."
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/site/docs/recipes/client-usage.md:
--------------------------------------------------------------------------------
1 | ---
2 | sidebar_position: 2
3 | ---
4 |
5 | # Usage on the client
6 |
7 | ### ✨ Client side is where http-wizard starts to shine ✨
8 |
9 | On the client side, we need the exported `Router` type from the server and http-wizard installed.
10 |
11 | Let's instantiate our apiClient!
12 |
13 | ```typescript title="Client instancation with axios"
14 | // client/apiClient.ts
15 | import axios from 'axios';
16 | import { createClient, ZodTypeProvider } from '@http-wizard/core';
17 |
18 | import type { Router } from 'server';
19 |
20 | export const apiClient = createClient(
21 | axios.instance()
22 | );
23 | ```
24 |
25 | ```typescript title="apiClient usage"
26 | // client/my-page.ts
27 | import type { Router } from 'server';
28 | import { apiClient } from './apiClient';
29 |
30 | const user = await apiClient
31 | .ref('[GET]/user/:id')
32 | .query({ params: { id: '1' } });
33 |
34 | // user is safe: { id:string, name:string }
35 | ```
36 |
37 | Enjoy!
38 |
--------------------------------------------------------------------------------
/site/docs/recipes/react-query.md:
--------------------------------------------------------------------------------
1 | ---
2 | sidebar_position: 3
3 | ---
4 |
5 | # React-Query integration
6 |
7 | ### Installation
8 |
9 | To get started, install http-wizard using npm or yarn:
10 |
11 | ```bash title="install @http-wizard/react-query"
12 | npm install @http-wizard/core @http-wizard/react-query zod axios
13 | # or
14 | yarn add @http-wizard/core @http-wizard/react-query zod axios
15 | ```
16 |
17 | ### Usage
18 |
19 | `@http-wizard/react-query` provides a wrapper of http-wizard with additional react-query functions.
20 |
21 | #### Currently supported React-Query features include:
22 |
23 | - useQuery
24 | - useMutation
25 | - useInfiniteQuery
26 | - prefetchQuery
27 |
28 | Let's instantiate our apiClient with @http-wizard/react-query. Instead of createClient, we use createQueryClient.
29 |
30 | ```typescript title="Client instanciation with axios"
31 | // client/apiClient.ts
32 | import axios from 'axios';
33 | import { createQueryClient, ZodTypeProvider } from '@http-wizard/react-query';
34 |
35 | import type { Router } from 'server';
36 |
37 | export const apiClient = createQueryClient(
38 | axios.instance()
39 | );
40 | ```
41 |
42 | ```tsx title="apiClient usage with useQuery"
43 | // client/my-page.ts
44 | import type { Router } from 'server';
45 | import { apiClient } from './apiClient';
46 |
47 | const MyComponent = () => {
48 | // user is safe: { id:string, name:string }
49 | const { data: user } = apiClient
50 | .ref('[GET]/user/:id')
51 | .useQuery({ params: { id: '1' } });
52 |
53 | if (isLoading) return loading...
;
54 | return {user.name}
;
55 | };
56 | ```
57 |
58 | ```tsx title="apiClient usage with useMutation"
59 | // client/my-page.ts
60 | import type { Router } from 'server';
61 | import { apiClient } from './apiClient';
62 |
63 | const MyComponent = () => {
64 | const { mutate } = apiClient.ref('[POST]/user').useMutation();
65 | return (
66 |
69 | );
70 | };
71 | ```
72 |
73 | React query functions take many options.
74 | [Full React-query doc is available here](https://tanstack.com/query/latest/docs/react/overview).
75 |
76 | Enjoy!
77 |
--------------------------------------------------------------------------------
/site/docs/recipes/recommended-architecture.md:
--------------------------------------------------------------------------------
1 | ---
2 | sidebar_position: 5
3 | ---
4 |
5 | # Recommended Architecture
6 |
7 | Http-wizard is unopinionated, so you're free to organize your routes however you prefer. It can be adapted to most architectures.
8 |
9 | That said, here's an architecture approach that works great. It promotes a clean structure with both vertical and horizontal code separation:
10 |
11 | ```
12 | ├── src
13 | │ ├── repositories
14 | │ │ ├── repositories
15 | │ │ │ └── user.repository.ts
16 | │ ├── usecases
17 | │ │ ├── createUser
18 | │ │ │ ├── createUser.route.ts
19 | │ │ │ └── createUser.usecase.ts
20 | │ │ ├── getUserById
21 | │ │ │ ├── getUserById.route.ts
22 | │ │ │ └── getUserById.usecase.ts
23 | └── package.json
24 | ```
25 |
26 | Typically, each xxx.route.ts file will look something like this:
27 |
28 | ```typescript title="Route creation"
29 | // src/usecases/getUserById/getUserById.route.ts
30 | import { createRoute } from '@http-wizard/core';
31 | import { z } from 'zod';
32 |
33 | const User = z.object({
34 | id: z.string(),
35 | name: z.string(),
36 | });
37 |
38 | export const getUserByIdRoute = (fastify: FastifyInstance) => {
39 | return createRoute('/user/:id', {
40 | method: 'GET',
41 | schema: {
42 | response: {
43 | 200: User,
44 | },
45 | },
46 | }).handle((props) => {
47 | // ... create your server route as usual
48 | });
49 | };
50 | ```
51 |
52 | This approach embraces the code colocation principle:
53 |
54 | «keep the code that changes together close together»
55 |
56 | Then, create your Router type:
57 |
58 | ```typescript title="Export Router type"
59 | // index.ts
60 |
61 | import { getUserByIdRoute } from 'src/usecases/getUserById/getUserById.route.ts';
62 | import { createUserRoute } from 'src/usecases/createUser/createUser.route.ts';
63 |
64 | export const registerRoutes = (instance: FastifyInstance) => ({
65 | ...getUserByIdRoute(instance),
66 | ...createUserRoute(instance),
67 | });
68 |
69 | export type Router = ReturnType;
70 | ```
71 |
72 | Don't forget to export the Router type from your backend package, it will be used for creating a typesafe client in your front packages!
73 |
--------------------------------------------------------------------------------
/site/docs/recipes/server-usage.md:
--------------------------------------------------------------------------------
1 | ---
2 | sidebar_position: 1
3 | ---
4 |
5 | # Usage on the server
6 |
7 | Http-wizard is made for Fastify but can be used with all node servers through custom adapters.
8 | On the server, http-wizard is mainly used to link the route validation schemas with the exported `Router` type.
9 |
10 | ### Basic example of route definition
11 |
12 | ```typescript title="basic route definition"
13 | // server/getUserById.ts
14 | import { createRoute } from '@http-wizard/core';
15 | import { z } from 'zod';
16 |
17 | const User = z.object({
18 | id: z.string(),
19 | name: z.string(),
20 | });
21 |
22 | export const getUserByIdRoute = (fastify: FastifyInstance) => {
23 | return createRoute('get/user/:id', {
24 | schema: {
25 | params: z.object({
26 | id: z.string(),
27 | }),
28 | response: {
29 | 200: z.array(User),
30 | },
31 | },
32 | }).handle((props) => {
33 | fastify.route({
34 | // schema, url and method props are used by fastify to define the route
35 | ...props,
36 | handler: (request) => {
37 | const user = await db.getUserById(request.params.id);
38 | return user;
39 | },
40 | });
41 | });
42 | };
43 | ```
44 |
45 | In this example, we create a `[get]` route on the `/user` uri.
46 | The schema requires an `id` input parameter and ensures an array of users as a response (code: 200).
47 | In this case, validation is managed by fastify.
48 |
49 | As you can see, we export the returned object from createRoute. It's very important and will be used to export the Router type from the server.
50 |
51 | ### Fastify instanciation and Router export
52 |
53 | Let's create the fastify server with zod validation and export the Router type!
54 |
55 | ```typescript title="Router type export"
56 | //server/index.ts
57 | import fastify from 'fastify';
58 | import {
59 | serializerCompiler,
60 | validatorCompiler,
61 | ZodTypeProvider,
62 | } from 'fastify-type-provider-zod';
63 | import { getUserById } from './getUserById.ts';
64 |
65 | export const server = fastify().withTypeProvider();
66 | server.setValidatorCompiler(validatorCompiler);
67 | server.setSerializerCompiler(serializerCompiler);
68 | export type Server = typeof server;
69 |
70 | const router = { ...getUserByIdRoute(server) };
71 | export type Router = typeof router;
72 | ```
73 |
74 | The Router type is necessary on the client side for the instantiation of http-wizard.
75 | In a monorepo architecture, you import it as an internal package from the client.
76 |
77 | You're all set to use http-wizard on the [client side](/recipes/client-usage)!
78 |
79 | ### Custom repsonse code
80 |
81 | By default, the type definition is inferred from the 200 response schema.
82 | The property `okCode` allows inferring the response type from a given response code.
83 |
84 | ```typescript title="Usage of okCode property"
85 | // server/getUserById.ts
86 | import { createRoute } from '@http-wizard/core';
87 | import { z } from 'zod';
88 |
89 | const User = z.object({
90 | id: z.string(),
91 | name: z.string(),
92 | });
93 |
94 | export const getUserByIdRoute = (fastify: FastifyInstance) => {
95 | return createRoute('/user/:id', {
96 | method: 'GET',
97 | okCode: 201,
98 | schema: {
99 | response: {
100 | 201: User,
101 | },
102 | },
103 | }).handle((props) => {
104 | // ... create your server route as usual
105 | });
106 | };
107 | ```
108 |
--------------------------------------------------------------------------------
/site/docs/recipes/type-inference.md:
--------------------------------------------------------------------------------
1 | ---
2 | sidebar_position: 4
3 | ---
4 |
5 | # Type inference
6 |
7 | You will often want to manipulate a type corresponding to a route response.
8 |
9 | Here is how to infer the response type from `http-wizard`.
10 |
11 | ### Response type inference
12 |
13 | The infer property is made for this.
14 |
15 | ```typescript title="Response type inference"
16 | // client/my-page.ts
17 | import type { Router } from 'server';
18 | import { apiClient } from './apiClient';
19 |
20 | type User = (typeof apiClient.infer)['[GET]/user/:id'];
21 | // { id: string, name: string }
22 | ```
23 |
24 | ### Args type inference
25 |
26 | The infer property is made for this.
27 |
28 | ```typescript title="Args type inference"
29 | // client/my-page.ts
30 | import type { Router } from 'server';
31 | import { apiClient } from './apiClient';
32 |
33 | type User = (typeof apiClient.inferArgs)['[GET]/user/:id'];
34 | // { query: { id: string } }
35 | ```
36 |
--------------------------------------------------------------------------------
/site/docusaurus.config.js:
--------------------------------------------------------------------------------
1 | /* eslint-disable @typescript-eslint/no-var-requires */
2 | // @ts-check
3 | // Note: type annotations allow type checking and IDEs autocompletion
4 |
5 | const lightCodeTheme = require('prism-react-renderer/themes/github');
6 | const darkCodeTheme = require('prism-react-renderer/themes/dracula');
7 |
8 | /** @type {import('@docusaurus/types').Config} */
9 | const config = {
10 | title: 'Http-wizard',
11 | tagline:
12 | 'Http-wizard weaves TypeScript magic, offering a type-safe API client and ensuring a delightful end-to-end developer experience. ✨',
13 | favicon: 'img/favicon.ico',
14 |
15 | // Set the production url of your site here
16 | url: 'https://http-wizard.vercel.app/',
17 | // Set the // pathname under which your site is served
18 | // For GitHub pages deployment, it is often '//'
19 | baseUrl: '/',
20 |
21 | // GitHub pages deployment config.
22 | // If you aren't using GitHub pages, you don't need these.
23 | organizationName: 'http-wizard', // Usually your GitHub org/user name.
24 | projectName: 'http-wizard', // Usually your repo name.
25 |
26 | onBrokenLinks: 'throw',
27 | onBrokenMarkdownLinks: 'warn',
28 |
29 | // Even if you don't use internalization, you can use this field to set useful
30 | // metadata like html lang. For example, if your site is Chinese, you may want
31 | // to replace "en" with "zh-Hans".
32 | i18n: {
33 | defaultLocale: 'en',
34 | locales: ['en'],
35 | },
36 |
37 | presets: [
38 | [
39 | 'classic',
40 | /** @type {import('@docusaurus/preset-classic').Options} */
41 | ({
42 | docs: {
43 | routeBasePath: '/',
44 | sidebarPath: require.resolve('./sidebars.js'),
45 | // Please change this to your repo.
46 | // Remove this to remove the "edit this page" links.
47 | },
48 | blog: false,
49 | theme: {
50 | customCss: require.resolve('./src/css/custom.css'),
51 | },
52 | }),
53 | ],
54 | ],
55 |
56 | themeConfig:
57 | /** @type {import('@docusaurus/preset-classic').ThemeConfig} */
58 | ({
59 | colorMode: {
60 | defaultMode: 'dark',
61 | disableSwitch: true,
62 | respectPrefersColorScheme: false,
63 | },
64 | // Replace with your project's social card
65 | image: 'img/social.jpg',
66 | navbar: {
67 | logo: {
68 | alt: 'My Site Logo',
69 | src: 'img/logo_w.png',
70 | },
71 | items: [
72 | {
73 | type: 'docSidebar',
74 | sidebarId: 'tutorialSidebar',
75 | position: 'left',
76 | label: 'Doc',
77 | },
78 | {
79 | href: 'https://github.com/flodlc/http-wizard',
80 | label: 'GitHub',
81 | position: 'right',
82 | },
83 | ],
84 | },
85 | footer: {
86 | style: 'dark',
87 | links: [
88 | {
89 | title: 'Docs',
90 | items: [
91 | {
92 | label: 'Intro',
93 | to: '/',
94 | },
95 | {
96 | label: 'Getting started',
97 | to: '/getting-started',
98 | },
99 | ],
100 | },
101 | {
102 | title: 'More',
103 | items: [
104 | {
105 | label: 'GitHub',
106 | href: 'https://github.com/flodlc/http-wizard',
107 | },
108 | ],
109 | },
110 | ],
111 | },
112 | prism: {
113 | theme: lightCodeTheme,
114 | darkTheme: darkCodeTheme,
115 | },
116 | }),
117 | };
118 |
119 | module.exports = config;
120 |
--------------------------------------------------------------------------------
/site/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "site",
3 | "version": "0.0.0",
4 | "private": true,
5 | "scripts": {
6 | "docusaurus": "docusaurus",
7 | "start": "docusaurus start",
8 | "build": "docusaurus build",
9 | "swizzle": "docusaurus swizzle",
10 | "deploy": "docusaurus deploy",
11 | "clear": "docusaurus clear",
12 | "serve": "docusaurus serve",
13 | "write-translations": "docusaurus write-translations",
14 | "write-heading-ids": "docusaurus write-heading-ids",
15 | "typecheck": "tsc"
16 | },
17 | "dependencies": {
18 | "@docusaurus/core": "2.4.3",
19 | "@docusaurus/preset-classic": "2.4.3",
20 | "@mdx-js/react": "^1.6.22",
21 | "clsx": "^1.2.1",
22 | "prism-react-renderer": "^1.3.5",
23 | "react": "^17.0.2",
24 | "react-dom": "^17.0.2"
25 | },
26 | "devDependencies": {
27 | "@docusaurus/module-type-aliases": "2.4.3",
28 | "@tsconfig/docusaurus": "^1.0.5",
29 | "typescript": "^4.7.4"
30 | },
31 | "browserslist": {
32 | "production": [
33 | ">0.5%",
34 | "not dead",
35 | "not op_mini all"
36 | ],
37 | "development": [
38 | "last 1 chrome version",
39 | "last 1 firefox version",
40 | "last 1 safari version"
41 | ]
42 | },
43 | "engines": {
44 | "node": ">=16.14"
45 | }
46 | }
47 |
--------------------------------------------------------------------------------
/site/sidebars.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Creating a sidebar enables you to:
3 | - create an ordered group of docs
4 | - render a sidebar for each doc of that group
5 | - provide next/previous navigation
6 |
7 | The sidebars can be generated from the filesystem, or explicitly defined here.
8 |
9 | Create as many sidebars as you want.
10 | */
11 |
12 | // @ts-check
13 |
14 | /** @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} */
15 | const sidebars = {
16 | // By default, Docusaurus generates a sidebar from the docs folder structure
17 | tutorialSidebar: [{ type: 'autogenerated', dirName: '.' }],
18 |
19 | // But you can create a sidebar manually
20 | /*
21 | tutorialSidebar: [
22 | 'intro',
23 | 'hello',
24 | {
25 | type: 'category',
26 | label: 'Tutorial',
27 | items: ['tutorial-basics/create-a-document'],
28 | },
29 | ],
30 | */
31 | };
32 |
33 | module.exports = sidebars;
34 |
--------------------------------------------------------------------------------
/site/src/components/HomepageFeatures/index.tsx:
--------------------------------------------------------------------------------
1 | /* eslint-disable @typescript-eslint/no-var-requires */
2 | import clsx from 'clsx';
3 | import React from 'react';
4 |
5 | import styles from './styles.module.css';
6 |
7 | type FeatureItem = {
8 | title: string;
9 | Svg: React.ComponentType>;
10 | description: JSX.Element;
11 | };
12 |
13 | const FeatureList: FeatureItem[] = [
14 | {
15 | title: 'Easy to Use',
16 | Svg: require('@site/static/img/undraw_docusaurus_mountain.svg').default,
17 | description: (
18 | <>
19 | Docusaurus was designed from the ground up to be easily installed and
20 | used to get your website up and running quickly.
21 | >
22 | ),
23 | },
24 | {
25 | title: 'Focus on What Matters',
26 | Svg: require('@site/static/img/undraw_docusaurus_tree.svg').default,
27 | description: (
28 | <>
29 | Docusaurus lets you focus on your docs, and we'll do the chores. Go
30 | ahead and move your docs into the docs
directory.
31 | >
32 | ),
33 | },
34 | {
35 | title: 'Powered by React',
36 | Svg: require('@site/static/img/undraw_docusaurus_react.svg').default,
37 | description: (
38 | <>
39 | Extend or customize your website layout by reusing React. Docusaurus can
40 | be extended while reusing the same header and footer.
41 | >
42 | ),
43 | },
44 | ];
45 |
46 | function Feature({ title, Svg, description }: FeatureItem) {
47 | return (
48 |
49 |
50 |
51 |
52 |
53 |
{title}
54 |
{description}
55 |
56 |
57 | );
58 | }
59 |
60 | export default function HomepageFeatures(): JSX.Element {
61 | return (
62 |
63 |
64 |
65 | {FeatureList.map((props, idx) => (
66 |
67 | ))}
68 |
69 |
70 |
71 | );
72 | }
73 |
--------------------------------------------------------------------------------
/site/src/components/HomepageFeatures/styles.module.css:
--------------------------------------------------------------------------------
1 | .features {
2 | display: flex;
3 | align-items: center;
4 | padding: 2rem 0;
5 | width: 100%;
6 | }
7 |
8 | .featureSvg {
9 | height: 200px;
10 | width: 200px;
11 | }
12 |
--------------------------------------------------------------------------------
/site/src/components/Video.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 |
3 | export const Video = ({ src }: { src: string }) => {
4 | return ;
5 | };
6 |
--------------------------------------------------------------------------------
/site/src/css/custom.css:
--------------------------------------------------------------------------------
1 | /**
2 | * Any CSS included here will be global. The classic template
3 | * bundles Infima by default. Infima is a CSS framework designed to
4 | * work well for content-centric websites.
5 | */
6 |
7 | /* You can override the default Infima variables here. */
8 | :root {
9 | --ifm-color-primary: #2e8555;
10 | --ifm-color-primary-dark: #29784c;
11 | --ifm-color-primary-darker: #277148;
12 | --ifm-color-primary-darkest: #205d3b;
13 | --ifm-color-primary-light: #33925d;
14 | --ifm-color-primary-lighter: #359962;
15 | --ifm-color-primary-lightest: #3cad6e;
16 | --ifm-code-font-size: 95%;
17 | --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.1);
18 | }
19 |
20 | /* For readability concerns, you should choose a lighter palette in dark mode. */
21 | [data-theme='dark'] {
22 | --ifm-color-primary: #25c2a0;
23 | --ifm-color-primary-dark: #21af90;
24 | --ifm-color-primary-darker: #1fa588;
25 | --ifm-color-primary-darkest: #1a8870;
26 | --ifm-color-primary-light: #29d5b0;
27 | --ifm-color-primary-lighter: #32d8b4;
28 | --ifm-color-primary-lightest: #4fddbf;
29 | --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.3);
30 | }
31 |
--------------------------------------------------------------------------------
/site/static/.nojekyll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/flodlc/http-wizard/7d18b2b23ee371f3b1d822f276ebdcf2d9e6d47c/site/static/.nojekyll
--------------------------------------------------------------------------------
/site/static/img/favicon+o.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/flodlc/http-wizard/7d18b2b23ee371f3b1d822f276ebdcf2d9e6d47c/site/static/img/favicon+o.png
--------------------------------------------------------------------------------
/site/static/img/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/flodlc/http-wizard/7d18b2b23ee371f3b1d822f276ebdcf2d9e6d47c/site/static/img/favicon.ico
--------------------------------------------------------------------------------
/site/static/img/favicon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/flodlc/http-wizard/7d18b2b23ee371f3b1d822f276ebdcf2d9e6d47c/site/static/img/favicon.png
--------------------------------------------------------------------------------
/site/static/img/favicon_o.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/flodlc/http-wizard/7d18b2b23ee371f3b1d822f276ebdcf2d9e6d47c/site/static/img/favicon_o.ico
--------------------------------------------------------------------------------
/site/static/img/logo_black.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/flodlc/http-wizard/7d18b2b23ee371f3b1d822f276ebdcf2d9e6d47c/site/static/img/logo_black.png
--------------------------------------------------------------------------------
/site/static/img/logo_w.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/flodlc/http-wizard/7d18b2b23ee371f3b1d822f276ebdcf2d9e6d47c/site/static/img/logo_w.png
--------------------------------------------------------------------------------
/site/static/img/logo_white.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/flodlc/http-wizard/7d18b2b23ee371f3b1d822f276ebdcf2d9e6d47c/site/static/img/logo_white.png
--------------------------------------------------------------------------------
/site/static/img/logo_white_full.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/flodlc/http-wizard/7d18b2b23ee371f3b1d822f276ebdcf2d9e6d47c/site/static/img/logo_white_full.png
--------------------------------------------------------------------------------
/site/static/img/social.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/flodlc/http-wizard/7d18b2b23ee371f3b1d822f276ebdcf2d9e6d47c/site/static/img/social.jpg
--------------------------------------------------------------------------------
/site/static/img/social_o.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/flodlc/http-wizard/7d18b2b23ee371f3b1d822f276ebdcf2d9e6d47c/site/static/img/social_o.jpg
--------------------------------------------------------------------------------
/site/static/presentation.mov:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/flodlc/http-wizard/7d18b2b23ee371f3b1d822f276ebdcf2d9e6d47c/site/static/presentation.mov
--------------------------------------------------------------------------------
/site/static/video.mov:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/flodlc/http-wizard/7d18b2b23ee371f3b1d822f276ebdcf2d9e6d47c/site/static/video.mov
--------------------------------------------------------------------------------
/site/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | // This file is not used in compilation. It is here just for a nice editor experience.
3 | "extends": "@tsconfig/docusaurus/tsconfig.json",
4 | "compilerOptions": {
5 | "baseUrl": "."
6 | }
7 | }
8 |
--------------------------------------------------------------------------------
/yarn.lock:
--------------------------------------------------------------------------------
1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
2 | # yarn lockfile v1
3 |
4 |
5 | "@aashutoshrathi/word-wrap@^1.2.3":
6 | version "1.2.6"
7 | resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf"
8 | integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==
9 |
10 | "@eslint-community/eslint-utils@^4.2.0":
11 | version "4.4.0"
12 | resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59"
13 | integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==
14 | dependencies:
15 | eslint-visitor-keys "^3.3.0"
16 |
17 | "@eslint-community/regexpp@^4.4.0", "@eslint-community/regexpp@^4.6.1":
18 | version "4.10.0"
19 | resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63"
20 | integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==
21 |
22 | "@eslint/eslintrc@^2.1.3":
23 | version "2.1.3"
24 | resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.3.tgz#797470a75fe0fbd5a53350ee715e85e87baff22d"
25 | integrity sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==
26 | dependencies:
27 | ajv "^6.12.4"
28 | debug "^4.3.2"
29 | espree "^9.6.0"
30 | globals "^13.19.0"
31 | ignore "^5.2.0"
32 | import-fresh "^3.2.1"
33 | js-yaml "^4.1.0"
34 | minimatch "^3.1.2"
35 | strip-json-comments "^3.1.1"
36 |
37 | "@eslint/js@8.53.0":
38 | version "8.53.0"
39 | resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.53.0.tgz#bea56f2ed2b5baea164348ff4d5a879f6f81f20d"
40 | integrity sha512-Kn7K8dx/5U6+cT1yEhpX1w4PCSg0M+XyRILPgvwcEBjerFWCwQj5sbr3/VmxqV0JGHCBCzyd6LxypEuehypY1w==
41 |
42 | "@humanwhocodes/config-array@^0.11.13":
43 | version "0.11.13"
44 | resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.13.tgz#075dc9684f40a531d9b26b0822153c1e832ee297"
45 | integrity sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==
46 | dependencies:
47 | "@humanwhocodes/object-schema" "^2.0.1"
48 | debug "^4.1.1"
49 | minimatch "^3.0.5"
50 |
51 | "@humanwhocodes/module-importer@^1.0.1":
52 | version "1.0.1"
53 | resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c"
54 | integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==
55 |
56 | "@humanwhocodes/object-schema@^2.0.1":
57 | version "2.0.1"
58 | resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz#e5211452df060fa8522b55c7b3c0c4d1981cb044"
59 | integrity sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==
60 |
61 | "@nodelib/fs.scandir@2.1.5":
62 | version "2.1.5"
63 | resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5"
64 | integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==
65 | dependencies:
66 | "@nodelib/fs.stat" "2.0.5"
67 | run-parallel "^1.1.9"
68 |
69 | "@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2":
70 | version "2.0.5"
71 | resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b"
72 | integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
73 |
74 | "@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8":
75 | version "1.2.8"
76 | resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a"
77 | integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==
78 | dependencies:
79 | "@nodelib/fs.scandir" "2.1.5"
80 | fastq "^1.6.0"
81 |
82 | "@types/json-schema@^7.0.9":
83 | version "7.0.15"
84 | resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841"
85 | integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==
86 |
87 | "@types/json5@^0.0.29":
88 | version "0.0.29"
89 | resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee"
90 | integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==
91 |
92 | "@types/semver@^7.3.12":
93 | version "7.5.5"
94 | resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.5.tgz#deed5ab7019756c9c90ea86139106b0346223f35"
95 | integrity sha512-+d+WYC1BxJ6yVOgUgzK8gWvp5qF8ssV5r4nsDcZWKRWcDQLQ619tvWAxJQYGgBrO1MnLJC7a5GtiYsAoQ47dJg==
96 |
97 | "@typescript-eslint/eslint-plugin@^5.30.0":
98 | version "5.62.0"
99 | resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz#aeef0328d172b9e37d9bab6dbc13b87ed88977db"
100 | integrity sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==
101 | dependencies:
102 | "@eslint-community/regexpp" "^4.4.0"
103 | "@typescript-eslint/scope-manager" "5.62.0"
104 | "@typescript-eslint/type-utils" "5.62.0"
105 | "@typescript-eslint/utils" "5.62.0"
106 | debug "^4.3.4"
107 | graphemer "^1.4.0"
108 | ignore "^5.2.0"
109 | natural-compare-lite "^1.4.0"
110 | semver "^7.3.7"
111 | tsutils "^3.21.0"
112 |
113 | "@typescript-eslint/parser@^5.30.0":
114 | version "5.62.0"
115 | resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.62.0.tgz#1b63d082d849a2fcae8a569248fbe2ee1b8a56c7"
116 | integrity sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==
117 | dependencies:
118 | "@typescript-eslint/scope-manager" "5.62.0"
119 | "@typescript-eslint/types" "5.62.0"
120 | "@typescript-eslint/typescript-estree" "5.62.0"
121 | debug "^4.3.4"
122 |
123 | "@typescript-eslint/scope-manager@5.62.0":
124 | version "5.62.0"
125 | resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz#d9457ccc6a0b8d6b37d0eb252a23022478c5460c"
126 | integrity sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==
127 | dependencies:
128 | "@typescript-eslint/types" "5.62.0"
129 | "@typescript-eslint/visitor-keys" "5.62.0"
130 |
131 | "@typescript-eslint/type-utils@5.62.0":
132 | version "5.62.0"
133 | resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz#286f0389c41681376cdad96b309cedd17d70346a"
134 | integrity sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==
135 | dependencies:
136 | "@typescript-eslint/typescript-estree" "5.62.0"
137 | "@typescript-eslint/utils" "5.62.0"
138 | debug "^4.3.4"
139 | tsutils "^3.21.0"
140 |
141 | "@typescript-eslint/types@5.62.0":
142 | version "5.62.0"
143 | resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f"
144 | integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==
145 |
146 | "@typescript-eslint/typescript-estree@5.62.0":
147 | version "5.62.0"
148 | resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz#7d17794b77fabcac615d6a48fb143330d962eb9b"
149 | integrity sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==
150 | dependencies:
151 | "@typescript-eslint/types" "5.62.0"
152 | "@typescript-eslint/visitor-keys" "5.62.0"
153 | debug "^4.3.4"
154 | globby "^11.1.0"
155 | is-glob "^4.0.3"
156 | semver "^7.3.7"
157 | tsutils "^3.21.0"
158 |
159 | "@typescript-eslint/utils@5.62.0":
160 | version "5.62.0"
161 | resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.62.0.tgz#141e809c71636e4a75daa39faed2fb5f4b10df86"
162 | integrity sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==
163 | dependencies:
164 | "@eslint-community/eslint-utils" "^4.2.0"
165 | "@types/json-schema" "^7.0.9"
166 | "@types/semver" "^7.3.12"
167 | "@typescript-eslint/scope-manager" "5.62.0"
168 | "@typescript-eslint/types" "5.62.0"
169 | "@typescript-eslint/typescript-estree" "5.62.0"
170 | eslint-scope "^5.1.1"
171 | semver "^7.3.7"
172 |
173 | "@typescript-eslint/visitor-keys@5.62.0":
174 | version "5.62.0"
175 | resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz#2174011917ce582875954ffe2f6912d5931e353e"
176 | integrity sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==
177 | dependencies:
178 | "@typescript-eslint/types" "5.62.0"
179 | eslint-visitor-keys "^3.3.0"
180 |
181 | "@ungap/structured-clone@^1.2.0":
182 | version "1.2.0"
183 | resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406"
184 | integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==
185 |
186 | acorn-jsx@^5.3.2:
187 | version "5.3.2"
188 | resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937"
189 | integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==
190 |
191 | acorn@^8.9.0:
192 | version "8.11.2"
193 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.2.tgz#ca0d78b51895be5390a5903c5b3bdcdaf78ae40b"
194 | integrity sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==
195 |
196 | ajv@^6.12.4:
197 | version "6.12.6"
198 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4"
199 | integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
200 | dependencies:
201 | fast-deep-equal "^3.1.1"
202 | fast-json-stable-stringify "^2.0.0"
203 | json-schema-traverse "^0.4.1"
204 | uri-js "^4.2.2"
205 |
206 | ansi-regex@^5.0.1:
207 | version "5.0.1"
208 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304"
209 | integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
210 |
211 | ansi-styles@^4.1.0:
212 | version "4.3.0"
213 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937"
214 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
215 | dependencies:
216 | color-convert "^2.0.1"
217 |
218 | argparse@^2.0.1:
219 | version "2.0.1"
220 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38"
221 | integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==
222 |
223 | array-buffer-byte-length@^1.0.0:
224 | version "1.0.0"
225 | resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead"
226 | integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==
227 | dependencies:
228 | call-bind "^1.0.2"
229 | is-array-buffer "^3.0.1"
230 |
231 | array-includes@^3.1.6, array-includes@^3.1.7:
232 | version "3.1.7"
233 | resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.7.tgz#8cd2e01b26f7a3086cbc87271593fe921c62abda"
234 | integrity sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==
235 | dependencies:
236 | call-bind "^1.0.2"
237 | define-properties "^1.2.0"
238 | es-abstract "^1.22.1"
239 | get-intrinsic "^1.2.1"
240 | is-string "^1.0.7"
241 |
242 | array-union@^2.1.0:
243 | version "2.1.0"
244 | resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d"
245 | integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==
246 |
247 | array.prototype.findlastindex@^1.2.3:
248 | version "1.2.3"
249 | resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz#b37598438f97b579166940814e2c0493a4f50207"
250 | integrity sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==
251 | dependencies:
252 | call-bind "^1.0.2"
253 | define-properties "^1.2.0"
254 | es-abstract "^1.22.1"
255 | es-shim-unscopables "^1.0.0"
256 | get-intrinsic "^1.2.1"
257 |
258 | array.prototype.flat@^1.3.1, array.prototype.flat@^1.3.2:
259 | version "1.3.2"
260 | resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18"
261 | integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==
262 | dependencies:
263 | call-bind "^1.0.2"
264 | define-properties "^1.2.0"
265 | es-abstract "^1.22.1"
266 | es-shim-unscopables "^1.0.0"
267 |
268 | array.prototype.flatmap@^1.3.1, array.prototype.flatmap@^1.3.2:
269 | version "1.3.2"
270 | resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527"
271 | integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==
272 | dependencies:
273 | call-bind "^1.0.2"
274 | define-properties "^1.2.0"
275 | es-abstract "^1.22.1"
276 | es-shim-unscopables "^1.0.0"
277 |
278 | array.prototype.tosorted@^1.1.1:
279 | version "1.1.2"
280 | resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.2.tgz#620eff7442503d66c799d95503f82b475745cefd"
281 | integrity sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg==
282 | dependencies:
283 | call-bind "^1.0.2"
284 | define-properties "^1.2.0"
285 | es-abstract "^1.22.1"
286 | es-shim-unscopables "^1.0.0"
287 | get-intrinsic "^1.2.1"
288 |
289 | arraybuffer.prototype.slice@^1.0.2:
290 | version "1.0.2"
291 | resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz#98bd561953e3e74bb34938e77647179dfe6e9f12"
292 | integrity sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==
293 | dependencies:
294 | array-buffer-byte-length "^1.0.0"
295 | call-bind "^1.0.2"
296 | define-properties "^1.2.0"
297 | es-abstract "^1.22.1"
298 | get-intrinsic "^1.2.1"
299 | is-array-buffer "^3.0.2"
300 | is-shared-array-buffer "^1.0.2"
301 |
302 | asynciterator.prototype@^1.0.0:
303 | version "1.0.0"
304 | resolved "https://registry.yarnpkg.com/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz#8c5df0514936cdd133604dfcc9d3fb93f09b2b62"
305 | integrity sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==
306 | dependencies:
307 | has-symbols "^1.0.3"
308 |
309 | available-typed-arrays@^1.0.5:
310 | version "1.0.5"
311 | resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7"
312 | integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==
313 |
314 | balanced-match@^1.0.0:
315 | version "1.0.2"
316 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
317 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
318 |
319 | brace-expansion@^1.1.7:
320 | version "1.1.11"
321 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
322 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
323 | dependencies:
324 | balanced-match "^1.0.0"
325 | concat-map "0.0.1"
326 |
327 | braces@^3.0.2:
328 | version "3.0.2"
329 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
330 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
331 | dependencies:
332 | fill-range "^7.0.1"
333 |
334 | call-bind@^1.0.0, call-bind@^1.0.2, call-bind@^1.0.4, call-bind@^1.0.5:
335 | version "1.0.5"
336 | resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.5.tgz#6fa2b7845ce0ea49bf4d8b9ef64727a2c2e2e513"
337 | integrity sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==
338 | dependencies:
339 | function-bind "^1.1.2"
340 | get-intrinsic "^1.2.1"
341 | set-function-length "^1.1.1"
342 |
343 | callsites@^3.0.0:
344 | version "3.1.0"
345 | resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73"
346 | integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
347 |
348 | chalk@^4.0.0:
349 | version "4.1.2"
350 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01"
351 | integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
352 | dependencies:
353 | ansi-styles "^4.1.0"
354 | supports-color "^7.1.0"
355 |
356 | color-convert@^2.0.1:
357 | version "2.0.1"
358 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
359 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
360 | dependencies:
361 | color-name "~1.1.4"
362 |
363 | color-name@~1.1.4:
364 | version "1.1.4"
365 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
366 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
367 |
368 | concat-map@0.0.1:
369 | version "0.0.1"
370 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
371 | integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==
372 |
373 | cross-spawn@^7.0.2:
374 | version "7.0.3"
375 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
376 | integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
377 | dependencies:
378 | path-key "^3.1.0"
379 | shebang-command "^2.0.0"
380 | which "^2.0.1"
381 |
382 | debug@^3.2.7:
383 | version "3.2.7"
384 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a"
385 | integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==
386 | dependencies:
387 | ms "^2.1.1"
388 |
389 | debug@^4.1.1, debug@^4.3.2, debug@^4.3.4:
390 | version "4.3.4"
391 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865"
392 | integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
393 | dependencies:
394 | ms "2.1.2"
395 |
396 | deep-is@^0.1.3:
397 | version "0.1.4"
398 | resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831"
399 | integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==
400 |
401 | define-data-property@^1.0.1, define-data-property@^1.1.1:
402 | version "1.1.1"
403 | resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.1.tgz#c35f7cd0ab09883480d12ac5cb213715587800b3"
404 | integrity sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==
405 | dependencies:
406 | get-intrinsic "^1.2.1"
407 | gopd "^1.0.1"
408 | has-property-descriptors "^1.0.0"
409 |
410 | define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0, define-properties@^1.2.1:
411 | version "1.2.1"
412 | resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c"
413 | integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==
414 | dependencies:
415 | define-data-property "^1.0.1"
416 | has-property-descriptors "^1.0.0"
417 | object-keys "^1.1.1"
418 |
419 | dir-glob@^3.0.1:
420 | version "3.0.1"
421 | resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f"
422 | integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==
423 | dependencies:
424 | path-type "^4.0.0"
425 |
426 | doctrine@^2.1.0:
427 | version "2.1.0"
428 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d"
429 | integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==
430 | dependencies:
431 | esutils "^2.0.2"
432 |
433 | doctrine@^3.0.0:
434 | version "3.0.0"
435 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961"
436 | integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==
437 | dependencies:
438 | esutils "^2.0.2"
439 |
440 | es-abstract@^1.22.1:
441 | version "1.22.3"
442 | resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.3.tgz#48e79f5573198de6dee3589195727f4f74bc4f32"
443 | integrity sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==
444 | dependencies:
445 | array-buffer-byte-length "^1.0.0"
446 | arraybuffer.prototype.slice "^1.0.2"
447 | available-typed-arrays "^1.0.5"
448 | call-bind "^1.0.5"
449 | es-set-tostringtag "^2.0.1"
450 | es-to-primitive "^1.2.1"
451 | function.prototype.name "^1.1.6"
452 | get-intrinsic "^1.2.2"
453 | get-symbol-description "^1.0.0"
454 | globalthis "^1.0.3"
455 | gopd "^1.0.1"
456 | has-property-descriptors "^1.0.0"
457 | has-proto "^1.0.1"
458 | has-symbols "^1.0.3"
459 | hasown "^2.0.0"
460 | internal-slot "^1.0.5"
461 | is-array-buffer "^3.0.2"
462 | is-callable "^1.2.7"
463 | is-negative-zero "^2.0.2"
464 | is-regex "^1.1.4"
465 | is-shared-array-buffer "^1.0.2"
466 | is-string "^1.0.7"
467 | is-typed-array "^1.1.12"
468 | is-weakref "^1.0.2"
469 | object-inspect "^1.13.1"
470 | object-keys "^1.1.1"
471 | object.assign "^4.1.4"
472 | regexp.prototype.flags "^1.5.1"
473 | safe-array-concat "^1.0.1"
474 | safe-regex-test "^1.0.0"
475 | string.prototype.trim "^1.2.8"
476 | string.prototype.trimend "^1.0.7"
477 | string.prototype.trimstart "^1.0.7"
478 | typed-array-buffer "^1.0.0"
479 | typed-array-byte-length "^1.0.0"
480 | typed-array-byte-offset "^1.0.0"
481 | typed-array-length "^1.0.4"
482 | unbox-primitive "^1.0.2"
483 | which-typed-array "^1.1.13"
484 |
485 | es-iterator-helpers@^1.0.12:
486 | version "1.0.15"
487 | resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz#bd81d275ac766431d19305923707c3efd9f1ae40"
488 | integrity sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==
489 | dependencies:
490 | asynciterator.prototype "^1.0.0"
491 | call-bind "^1.0.2"
492 | define-properties "^1.2.1"
493 | es-abstract "^1.22.1"
494 | es-set-tostringtag "^2.0.1"
495 | function-bind "^1.1.1"
496 | get-intrinsic "^1.2.1"
497 | globalthis "^1.0.3"
498 | has-property-descriptors "^1.0.0"
499 | has-proto "^1.0.1"
500 | has-symbols "^1.0.3"
501 | internal-slot "^1.0.5"
502 | iterator.prototype "^1.1.2"
503 | safe-array-concat "^1.0.1"
504 |
505 | es-set-tostringtag@^2.0.1:
506 | version "2.0.2"
507 | resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz#11f7cc9f63376930a5f20be4915834f4bc74f9c9"
508 | integrity sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==
509 | dependencies:
510 | get-intrinsic "^1.2.2"
511 | has-tostringtag "^1.0.0"
512 | hasown "^2.0.0"
513 |
514 | es-shim-unscopables@^1.0.0:
515 | version "1.0.2"
516 | resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763"
517 | integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==
518 | dependencies:
519 | hasown "^2.0.0"
520 |
521 | es-to-primitive@^1.2.1:
522 | version "1.2.1"
523 | resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a"
524 | integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==
525 | dependencies:
526 | is-callable "^1.1.4"
527 | is-date-object "^1.0.1"
528 | is-symbol "^1.0.2"
529 |
530 | escape-string-regexp@^4.0.0:
531 | version "4.0.0"
532 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34"
533 | integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
534 |
535 | eslint-import-resolver-node@^0.3.9:
536 | version "0.3.9"
537 | resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac"
538 | integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==
539 | dependencies:
540 | debug "^3.2.7"
541 | is-core-module "^2.13.0"
542 | resolve "^1.22.4"
543 |
544 | eslint-module-utils@^2.8.0:
545 | version "2.8.0"
546 | resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz#e439fee65fc33f6bba630ff621efc38ec0375c49"
547 | integrity sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==
548 | dependencies:
549 | debug "^3.2.7"
550 |
551 | eslint-plugin-import@^2.28.1:
552 | version "2.29.0"
553 | resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.29.0.tgz#8133232e4329ee344f2f612885ac3073b0b7e155"
554 | integrity sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg==
555 | dependencies:
556 | array-includes "^3.1.7"
557 | array.prototype.findlastindex "^1.2.3"
558 | array.prototype.flat "^1.3.2"
559 | array.prototype.flatmap "^1.3.2"
560 | debug "^3.2.7"
561 | doctrine "^2.1.0"
562 | eslint-import-resolver-node "^0.3.9"
563 | eslint-module-utils "^2.8.0"
564 | hasown "^2.0.0"
565 | is-core-module "^2.13.1"
566 | is-glob "^4.0.3"
567 | minimatch "^3.1.2"
568 | object.fromentries "^2.0.7"
569 | object.groupby "^1.0.1"
570 | object.values "^1.1.7"
571 | semver "^6.3.1"
572 | tsconfig-paths "^3.14.2"
573 |
574 | eslint-plugin-react@^7.30.1:
575 | version "7.33.2"
576 | resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz#69ee09443ffc583927eafe86ffebb470ee737608"
577 | integrity sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==
578 | dependencies:
579 | array-includes "^3.1.6"
580 | array.prototype.flatmap "^1.3.1"
581 | array.prototype.tosorted "^1.1.1"
582 | doctrine "^2.1.0"
583 | es-iterator-helpers "^1.0.12"
584 | estraverse "^5.3.0"
585 | jsx-ast-utils "^2.4.1 || ^3.0.0"
586 | minimatch "^3.1.2"
587 | object.entries "^1.1.6"
588 | object.fromentries "^2.0.6"
589 | object.hasown "^1.1.2"
590 | object.values "^1.1.6"
591 | prop-types "^15.8.1"
592 | resolve "^2.0.0-next.4"
593 | semver "^6.3.1"
594 | string.prototype.matchall "^4.0.8"
595 |
596 | eslint-plugin-simple-import-sort@^10.0.0:
597 | version "10.0.0"
598 | resolved "https://registry.yarnpkg.com/eslint-plugin-simple-import-sort/-/eslint-plugin-simple-import-sort-10.0.0.tgz#cc4ceaa81ba73252427062705b64321946f61351"
599 | integrity sha512-AeTvO9UCMSNzIHRkg8S6c3RPy5YEwKWSQPx3DYghLedo2ZQxowPFLGDN1AZ2evfg6r6mjBSZSLxLFsWSu3acsw==
600 |
601 | eslint-plugin-unused-imports@^3.0.0:
602 | version "3.0.0"
603 | resolved "https://registry.yarnpkg.com/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-3.0.0.tgz#d25175b0072ff16a91892c3aa72a09ca3a9e69e7"
604 | integrity sha512-sduiswLJfZHeeBJ+MQaG+xYzSWdRXoSw61DpU13mzWumCkR0ufD0HmO4kdNokjrkluMHpj/7PJeN35pgbhW3kw==
605 | dependencies:
606 | eslint-rule-composer "^0.3.0"
607 |
608 | eslint-rule-composer@^0.3.0:
609 | version "0.3.0"
610 | resolved "https://registry.yarnpkg.com/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz#79320c927b0c5c0d3d3d2b76c8b4a488f25bbaf9"
611 | integrity sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==
612 |
613 | eslint-scope@^5.1.1:
614 | version "5.1.1"
615 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c"
616 | integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==
617 | dependencies:
618 | esrecurse "^4.3.0"
619 | estraverse "^4.1.1"
620 |
621 | eslint-scope@^7.2.2:
622 | version "7.2.2"
623 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f"
624 | integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==
625 | dependencies:
626 | esrecurse "^4.3.0"
627 | estraverse "^5.2.0"
628 |
629 | eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3:
630 | version "3.4.3"
631 | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800"
632 | integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==
633 |
634 | eslint@^8.51.0:
635 | version "8.53.0"
636 | resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.53.0.tgz#14f2c8244298fcae1f46945459577413ba2697ce"
637 | integrity sha512-N4VuiPjXDUa4xVeV/GC/RV3hQW9Nw+Y463lkWaKKXKYMvmRiRDAtfpuPFLN+E1/6ZhyR8J2ig+eVREnYgUsiag==
638 | dependencies:
639 | "@eslint-community/eslint-utils" "^4.2.0"
640 | "@eslint-community/regexpp" "^4.6.1"
641 | "@eslint/eslintrc" "^2.1.3"
642 | "@eslint/js" "8.53.0"
643 | "@humanwhocodes/config-array" "^0.11.13"
644 | "@humanwhocodes/module-importer" "^1.0.1"
645 | "@nodelib/fs.walk" "^1.2.8"
646 | "@ungap/structured-clone" "^1.2.0"
647 | ajv "^6.12.4"
648 | chalk "^4.0.0"
649 | cross-spawn "^7.0.2"
650 | debug "^4.3.2"
651 | doctrine "^3.0.0"
652 | escape-string-regexp "^4.0.0"
653 | eslint-scope "^7.2.2"
654 | eslint-visitor-keys "^3.4.3"
655 | espree "^9.6.1"
656 | esquery "^1.4.2"
657 | esutils "^2.0.2"
658 | fast-deep-equal "^3.1.3"
659 | file-entry-cache "^6.0.1"
660 | find-up "^5.0.0"
661 | glob-parent "^6.0.2"
662 | globals "^13.19.0"
663 | graphemer "^1.4.0"
664 | ignore "^5.2.0"
665 | imurmurhash "^0.1.4"
666 | is-glob "^4.0.0"
667 | is-path-inside "^3.0.3"
668 | js-yaml "^4.1.0"
669 | json-stable-stringify-without-jsonify "^1.0.1"
670 | levn "^0.4.1"
671 | lodash.merge "^4.6.2"
672 | minimatch "^3.1.2"
673 | natural-compare "^1.4.0"
674 | optionator "^0.9.3"
675 | strip-ansi "^6.0.1"
676 | text-table "^0.2.0"
677 |
678 | espree@^9.6.0, espree@^9.6.1:
679 | version "9.6.1"
680 | resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f"
681 | integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==
682 | dependencies:
683 | acorn "^8.9.0"
684 | acorn-jsx "^5.3.2"
685 | eslint-visitor-keys "^3.4.1"
686 |
687 | esquery@^1.4.2:
688 | version "1.5.0"
689 | resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b"
690 | integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==
691 | dependencies:
692 | estraverse "^5.1.0"
693 |
694 | esrecurse@^4.3.0:
695 | version "4.3.0"
696 | resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921"
697 | integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==
698 | dependencies:
699 | estraverse "^5.2.0"
700 |
701 | estraverse@^4.1.1:
702 | version "4.3.0"
703 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d"
704 | integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==
705 |
706 | estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0:
707 | version "5.3.0"
708 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123"
709 | integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==
710 |
711 | esutils@^2.0.2:
712 | version "2.0.3"
713 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
714 | integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
715 |
716 | fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
717 | version "3.1.3"
718 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
719 | integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
720 |
721 | fast-glob@^3.2.9:
722 | version "3.3.2"
723 | resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129"
724 | integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==
725 | dependencies:
726 | "@nodelib/fs.stat" "^2.0.2"
727 | "@nodelib/fs.walk" "^1.2.3"
728 | glob-parent "^5.1.2"
729 | merge2 "^1.3.0"
730 | micromatch "^4.0.4"
731 |
732 | fast-json-stable-stringify@^2.0.0:
733 | version "2.1.0"
734 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
735 | integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
736 |
737 | fast-levenshtein@^2.0.6:
738 | version "2.0.6"
739 | resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
740 | integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==
741 |
742 | fastq@^1.6.0:
743 | version "1.15.0"
744 | resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a"
745 | integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==
746 | dependencies:
747 | reusify "^1.0.4"
748 |
749 | file-entry-cache@^6.0.1:
750 | version "6.0.1"
751 | resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027"
752 | integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==
753 | dependencies:
754 | flat-cache "^3.0.4"
755 |
756 | fill-range@^7.0.1:
757 | version "7.0.1"
758 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
759 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==
760 | dependencies:
761 | to-regex-range "^5.0.1"
762 |
763 | find-up@^5.0.0:
764 | version "5.0.0"
765 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc"
766 | integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==
767 | dependencies:
768 | locate-path "^6.0.0"
769 | path-exists "^4.0.0"
770 |
771 | flat-cache@^3.0.4:
772 | version "3.2.0"
773 | resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee"
774 | integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==
775 | dependencies:
776 | flatted "^3.2.9"
777 | keyv "^4.5.3"
778 | rimraf "^3.0.2"
779 |
780 | flatted@^3.2.9:
781 | version "3.2.9"
782 | resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.9.tgz#7eb4c67ca1ba34232ca9d2d93e9886e611ad7daf"
783 | integrity sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==
784 |
785 | for-each@^0.3.3:
786 | version "0.3.3"
787 | resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e"
788 | integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==
789 | dependencies:
790 | is-callable "^1.1.3"
791 |
792 | fs.realpath@^1.0.0:
793 | version "1.0.0"
794 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
795 | integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==
796 |
797 | function-bind@^1.1.1, function-bind@^1.1.2:
798 | version "1.1.2"
799 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c"
800 | integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==
801 |
802 | function.prototype.name@^1.1.5, function.prototype.name@^1.1.6:
803 | version "1.1.6"
804 | resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd"
805 | integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==
806 | dependencies:
807 | call-bind "^1.0.2"
808 | define-properties "^1.2.0"
809 | es-abstract "^1.22.1"
810 | functions-have-names "^1.2.3"
811 |
812 | functions-have-names@^1.2.3:
813 | version "1.2.3"
814 | resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834"
815 | integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==
816 |
817 | get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2:
818 | version "1.2.2"
819 | resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.2.tgz#281b7622971123e1ef4b3c90fd7539306da93f3b"
820 | integrity sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==
821 | dependencies:
822 | function-bind "^1.1.2"
823 | has-proto "^1.0.1"
824 | has-symbols "^1.0.3"
825 | hasown "^2.0.0"
826 |
827 | get-symbol-description@^1.0.0:
828 | version "1.0.0"
829 | resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6"
830 | integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==
831 | dependencies:
832 | call-bind "^1.0.2"
833 | get-intrinsic "^1.1.1"
834 |
835 | glob-parent@^5.1.2:
836 | version "5.1.2"
837 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
838 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
839 | dependencies:
840 | is-glob "^4.0.1"
841 |
842 | glob-parent@^6.0.2:
843 | version "6.0.2"
844 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3"
845 | integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==
846 | dependencies:
847 | is-glob "^4.0.3"
848 |
849 | glob@^7.1.3:
850 | version "7.2.3"
851 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b"
852 | integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==
853 | dependencies:
854 | fs.realpath "^1.0.0"
855 | inflight "^1.0.4"
856 | inherits "2"
857 | minimatch "^3.1.1"
858 | once "^1.3.0"
859 | path-is-absolute "^1.0.0"
860 |
861 | globals@^13.19.0:
862 | version "13.23.0"
863 | resolved "https://registry.yarnpkg.com/globals/-/globals-13.23.0.tgz#ef31673c926a0976e1f61dab4dca57e0c0a8af02"
864 | integrity sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==
865 | dependencies:
866 | type-fest "^0.20.2"
867 |
868 | globalthis@^1.0.3:
869 | version "1.0.3"
870 | resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf"
871 | integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==
872 | dependencies:
873 | define-properties "^1.1.3"
874 |
875 | globby@^11.1.0:
876 | version "11.1.0"
877 | resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b"
878 | integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==
879 | dependencies:
880 | array-union "^2.1.0"
881 | dir-glob "^3.0.1"
882 | fast-glob "^3.2.9"
883 | ignore "^5.2.0"
884 | merge2 "^1.4.1"
885 | slash "^3.0.0"
886 |
887 | gopd@^1.0.1:
888 | version "1.0.1"
889 | resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c"
890 | integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==
891 | dependencies:
892 | get-intrinsic "^1.1.3"
893 |
894 | graphemer@^1.4.0:
895 | version "1.4.0"
896 | resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6"
897 | integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==
898 |
899 | has-bigints@^1.0.1, has-bigints@^1.0.2:
900 | version "1.0.2"
901 | resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa"
902 | integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==
903 |
904 | has-flag@^4.0.0:
905 | version "4.0.0"
906 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
907 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
908 |
909 | has-property-descriptors@^1.0.0:
910 | version "1.0.1"
911 | resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz#52ba30b6c5ec87fd89fa574bc1c39125c6f65340"
912 | integrity sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==
913 | dependencies:
914 | get-intrinsic "^1.2.2"
915 |
916 | has-proto@^1.0.1:
917 | version "1.0.1"
918 | resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0"
919 | integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==
920 |
921 | has-symbols@^1.0.2, has-symbols@^1.0.3:
922 | version "1.0.3"
923 | resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8"
924 | integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==
925 |
926 | has-tostringtag@^1.0.0:
927 | version "1.0.0"
928 | resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25"
929 | integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==
930 | dependencies:
931 | has-symbols "^1.0.2"
932 |
933 | hasown@^2.0.0:
934 | version "2.0.0"
935 | resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.0.tgz#f4c513d454a57b7c7e1650778de226b11700546c"
936 | integrity sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==
937 | dependencies:
938 | function-bind "^1.1.2"
939 |
940 | ignore@^5.2.0:
941 | version "5.2.4"
942 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324"
943 | integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==
944 |
945 | import-fresh@^3.2.1:
946 | version "3.3.0"
947 | resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b"
948 | integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==
949 | dependencies:
950 | parent-module "^1.0.0"
951 | resolve-from "^4.0.0"
952 |
953 | imurmurhash@^0.1.4:
954 | version "0.1.4"
955 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
956 | integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==
957 |
958 | inflight@^1.0.4:
959 | version "1.0.6"
960 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
961 | integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==
962 | dependencies:
963 | once "^1.3.0"
964 | wrappy "1"
965 |
966 | inherits@2:
967 | version "2.0.4"
968 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
969 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
970 |
971 | internal-slot@^1.0.5:
972 | version "1.0.6"
973 | resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.6.tgz#37e756098c4911c5e912b8edbf71ed3aa116f930"
974 | integrity sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==
975 | dependencies:
976 | get-intrinsic "^1.2.2"
977 | hasown "^2.0.0"
978 | side-channel "^1.0.4"
979 |
980 | is-array-buffer@^3.0.1, is-array-buffer@^3.0.2:
981 | version "3.0.2"
982 | resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe"
983 | integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==
984 | dependencies:
985 | call-bind "^1.0.2"
986 | get-intrinsic "^1.2.0"
987 | is-typed-array "^1.1.10"
988 |
989 | is-async-function@^2.0.0:
990 | version "2.0.0"
991 | resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.0.0.tgz#8e4418efd3e5d3a6ebb0164c05ef5afb69aa9646"
992 | integrity sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==
993 | dependencies:
994 | has-tostringtag "^1.0.0"
995 |
996 | is-bigint@^1.0.1:
997 | version "1.0.4"
998 | resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3"
999 | integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==
1000 | dependencies:
1001 | has-bigints "^1.0.1"
1002 |
1003 | is-boolean-object@^1.1.0:
1004 | version "1.1.2"
1005 | resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719"
1006 | integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==
1007 | dependencies:
1008 | call-bind "^1.0.2"
1009 | has-tostringtag "^1.0.0"
1010 |
1011 | is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7:
1012 | version "1.2.7"
1013 | resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055"
1014 | integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==
1015 |
1016 | is-core-module@^2.13.0, is-core-module@^2.13.1:
1017 | version "2.13.1"
1018 | resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384"
1019 | integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==
1020 | dependencies:
1021 | hasown "^2.0.0"
1022 |
1023 | is-date-object@^1.0.1, is-date-object@^1.0.5:
1024 | version "1.0.5"
1025 | resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f"
1026 | integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==
1027 | dependencies:
1028 | has-tostringtag "^1.0.0"
1029 |
1030 | is-extglob@^2.1.1:
1031 | version "2.1.1"
1032 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
1033 | integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==
1034 |
1035 | is-finalizationregistry@^1.0.2:
1036 | version "1.0.2"
1037 | resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz#c8749b65f17c133313e661b1289b95ad3dbd62e6"
1038 | integrity sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==
1039 | dependencies:
1040 | call-bind "^1.0.2"
1041 |
1042 | is-generator-function@^1.0.10:
1043 | version "1.0.10"
1044 | resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72"
1045 | integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==
1046 | dependencies:
1047 | has-tostringtag "^1.0.0"
1048 |
1049 | is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3:
1050 | version "4.0.3"
1051 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084"
1052 | integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
1053 | dependencies:
1054 | is-extglob "^2.1.1"
1055 |
1056 | is-map@^2.0.1:
1057 | version "2.0.2"
1058 | resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127"
1059 | integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==
1060 |
1061 | is-negative-zero@^2.0.2:
1062 | version "2.0.2"
1063 | resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150"
1064 | integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==
1065 |
1066 | is-number-object@^1.0.4:
1067 | version "1.0.7"
1068 | resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc"
1069 | integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==
1070 | dependencies:
1071 | has-tostringtag "^1.0.0"
1072 |
1073 | is-number@^7.0.0:
1074 | version "7.0.0"
1075 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
1076 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
1077 |
1078 | is-path-inside@^3.0.3:
1079 | version "3.0.3"
1080 | resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283"
1081 | integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==
1082 |
1083 | is-regex@^1.1.4:
1084 | version "1.1.4"
1085 | resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958"
1086 | integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==
1087 | dependencies:
1088 | call-bind "^1.0.2"
1089 | has-tostringtag "^1.0.0"
1090 |
1091 | is-set@^2.0.1:
1092 | version "2.0.2"
1093 | resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.2.tgz#90755fa4c2562dc1c5d4024760d6119b94ca18ec"
1094 | integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==
1095 |
1096 | is-shared-array-buffer@^1.0.2:
1097 | version "1.0.2"
1098 | resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79"
1099 | integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==
1100 | dependencies:
1101 | call-bind "^1.0.2"
1102 |
1103 | is-string@^1.0.5, is-string@^1.0.7:
1104 | version "1.0.7"
1105 | resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd"
1106 | integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==
1107 | dependencies:
1108 | has-tostringtag "^1.0.0"
1109 |
1110 | is-symbol@^1.0.2, is-symbol@^1.0.3:
1111 | version "1.0.4"
1112 | resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c"
1113 | integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==
1114 | dependencies:
1115 | has-symbols "^1.0.2"
1116 |
1117 | is-typed-array@^1.1.10, is-typed-array@^1.1.12, is-typed-array@^1.1.9:
1118 | version "1.1.12"
1119 | resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.12.tgz#d0bab5686ef4a76f7a73097b95470ab199c57d4a"
1120 | integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==
1121 | dependencies:
1122 | which-typed-array "^1.1.11"
1123 |
1124 | is-weakmap@^2.0.1:
1125 | version "2.0.1"
1126 | resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.1.tgz#5008b59bdc43b698201d18f62b37b2ca243e8cf2"
1127 | integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==
1128 |
1129 | is-weakref@^1.0.2:
1130 | version "1.0.2"
1131 | resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2"
1132 | integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==
1133 | dependencies:
1134 | call-bind "^1.0.2"
1135 |
1136 | is-weakset@^2.0.1:
1137 | version "2.0.2"
1138 | resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.2.tgz#4569d67a747a1ce5a994dfd4ef6dcea76e7c0a1d"
1139 | integrity sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==
1140 | dependencies:
1141 | call-bind "^1.0.2"
1142 | get-intrinsic "^1.1.1"
1143 |
1144 | isarray@^2.0.5:
1145 | version "2.0.5"
1146 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723"
1147 | integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==
1148 |
1149 | isexe@^2.0.0:
1150 | version "2.0.0"
1151 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
1152 | integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==
1153 |
1154 | iterator.prototype@^1.1.2:
1155 | version "1.1.2"
1156 | resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.2.tgz#5e29c8924f01916cb9335f1ff80619dcff22b0c0"
1157 | integrity sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==
1158 | dependencies:
1159 | define-properties "^1.2.1"
1160 | get-intrinsic "^1.2.1"
1161 | has-symbols "^1.0.3"
1162 | reflect.getprototypeof "^1.0.4"
1163 | set-function-name "^2.0.1"
1164 |
1165 | "js-tokens@^3.0.0 || ^4.0.0":
1166 | version "4.0.0"
1167 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
1168 | integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
1169 |
1170 | js-yaml@^4.1.0:
1171 | version "4.1.0"
1172 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602"
1173 | integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==
1174 | dependencies:
1175 | argparse "^2.0.1"
1176 |
1177 | json-buffer@3.0.1:
1178 | version "3.0.1"
1179 | resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13"
1180 | integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==
1181 |
1182 | json-schema-traverse@^0.4.1:
1183 | version "0.4.1"
1184 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
1185 | integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
1186 |
1187 | json-stable-stringify-without-jsonify@^1.0.1:
1188 | version "1.0.1"
1189 | resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
1190 | integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==
1191 |
1192 | json5@^1.0.2:
1193 | version "1.0.2"
1194 | resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593"
1195 | integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==
1196 | dependencies:
1197 | minimist "^1.2.0"
1198 |
1199 | "jsx-ast-utils@^2.4.1 || ^3.0.0":
1200 | version "3.3.5"
1201 | resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz#4766bd05a8e2a11af222becd19e15575e52a853a"
1202 | integrity sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==
1203 | dependencies:
1204 | array-includes "^3.1.6"
1205 | array.prototype.flat "^1.3.1"
1206 | object.assign "^4.1.4"
1207 | object.values "^1.1.6"
1208 |
1209 | keyv@^4.5.3:
1210 | version "4.5.4"
1211 | resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93"
1212 | integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==
1213 | dependencies:
1214 | json-buffer "3.0.1"
1215 |
1216 | levn@^0.4.1:
1217 | version "0.4.1"
1218 | resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade"
1219 | integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==
1220 | dependencies:
1221 | prelude-ls "^1.2.1"
1222 | type-check "~0.4.0"
1223 |
1224 | locate-path@^6.0.0:
1225 | version "6.0.0"
1226 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286"
1227 | integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==
1228 | dependencies:
1229 | p-locate "^5.0.0"
1230 |
1231 | lodash.merge@^4.6.2:
1232 | version "4.6.2"
1233 | resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a"
1234 | integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
1235 |
1236 | loose-envify@^1.4.0:
1237 | version "1.4.0"
1238 | resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
1239 | integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
1240 | dependencies:
1241 | js-tokens "^3.0.0 || ^4.0.0"
1242 |
1243 | lru-cache@^6.0.0:
1244 | version "6.0.0"
1245 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94"
1246 | integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==
1247 | dependencies:
1248 | yallist "^4.0.0"
1249 |
1250 | merge2@^1.3.0, merge2@^1.4.1:
1251 | version "1.4.1"
1252 | resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
1253 | integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
1254 |
1255 | micromatch@^4.0.4:
1256 | version "4.0.5"
1257 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6"
1258 | integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==
1259 | dependencies:
1260 | braces "^3.0.2"
1261 | picomatch "^2.3.1"
1262 |
1263 | minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2:
1264 | version "3.1.2"
1265 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
1266 | integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
1267 | dependencies:
1268 | brace-expansion "^1.1.7"
1269 |
1270 | minimist@^1.2.0, minimist@^1.2.6:
1271 | version "1.2.8"
1272 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c"
1273 | integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==
1274 |
1275 | ms@2.1.2:
1276 | version "2.1.2"
1277 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
1278 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
1279 |
1280 | ms@^2.1.1:
1281 | version "2.1.3"
1282 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
1283 | integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
1284 |
1285 | natural-compare-lite@^1.4.0:
1286 | version "1.4.0"
1287 | resolved "https://registry.yarnpkg.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4"
1288 | integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==
1289 |
1290 | natural-compare@^1.4.0:
1291 | version "1.4.0"
1292 | resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
1293 | integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==
1294 |
1295 | object-assign@^4.1.1:
1296 | version "4.1.1"
1297 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
1298 | integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==
1299 |
1300 | object-inspect@^1.13.1, object-inspect@^1.9.0:
1301 | version "1.13.1"
1302 | resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2"
1303 | integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==
1304 |
1305 | object-keys@^1.1.1:
1306 | version "1.1.1"
1307 | resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
1308 | integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
1309 |
1310 | object.assign@^4.1.4:
1311 | version "4.1.4"
1312 | resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f"
1313 | integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==
1314 | dependencies:
1315 | call-bind "^1.0.2"
1316 | define-properties "^1.1.4"
1317 | has-symbols "^1.0.3"
1318 | object-keys "^1.1.1"
1319 |
1320 | object.entries@^1.1.6:
1321 | version "1.1.7"
1322 | resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.7.tgz#2b47760e2a2e3a752f39dd874655c61a7f03c131"
1323 | integrity sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==
1324 | dependencies:
1325 | call-bind "^1.0.2"
1326 | define-properties "^1.2.0"
1327 | es-abstract "^1.22.1"
1328 |
1329 | object.fromentries@^2.0.6, object.fromentries@^2.0.7:
1330 | version "2.0.7"
1331 | resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.7.tgz#71e95f441e9a0ea6baf682ecaaf37fa2a8d7e616"
1332 | integrity sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==
1333 | dependencies:
1334 | call-bind "^1.0.2"
1335 | define-properties "^1.2.0"
1336 | es-abstract "^1.22.1"
1337 |
1338 | object.groupby@^1.0.1:
1339 | version "1.0.1"
1340 | resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.1.tgz#d41d9f3c8d6c778d9cbac86b4ee9f5af103152ee"
1341 | integrity sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==
1342 | dependencies:
1343 | call-bind "^1.0.2"
1344 | define-properties "^1.2.0"
1345 | es-abstract "^1.22.1"
1346 | get-intrinsic "^1.2.1"
1347 |
1348 | object.hasown@^1.1.2:
1349 | version "1.1.3"
1350 | resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.3.tgz#6a5f2897bb4d3668b8e79364f98ccf971bda55ae"
1351 | integrity sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==
1352 | dependencies:
1353 | define-properties "^1.2.0"
1354 | es-abstract "^1.22.1"
1355 |
1356 | object.values@^1.1.6, object.values@^1.1.7:
1357 | version "1.1.7"
1358 | resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.7.tgz#617ed13272e7e1071b43973aa1655d9291b8442a"
1359 | integrity sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==
1360 | dependencies:
1361 | call-bind "^1.0.2"
1362 | define-properties "^1.2.0"
1363 | es-abstract "^1.22.1"
1364 |
1365 | once@^1.3.0:
1366 | version "1.4.0"
1367 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
1368 | integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==
1369 | dependencies:
1370 | wrappy "1"
1371 |
1372 | optionator@^0.9.3:
1373 | version "0.9.3"
1374 | resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64"
1375 | integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==
1376 | dependencies:
1377 | "@aashutoshrathi/word-wrap" "^1.2.3"
1378 | deep-is "^0.1.3"
1379 | fast-levenshtein "^2.0.6"
1380 | levn "^0.4.1"
1381 | prelude-ls "^1.2.1"
1382 | type-check "^0.4.0"
1383 |
1384 | p-limit@^3.0.2:
1385 | version "3.1.0"
1386 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b"
1387 | integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==
1388 | dependencies:
1389 | yocto-queue "^0.1.0"
1390 |
1391 | p-locate@^5.0.0:
1392 | version "5.0.0"
1393 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834"
1394 | integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==
1395 | dependencies:
1396 | p-limit "^3.0.2"
1397 |
1398 | parent-module@^1.0.0:
1399 | version "1.0.1"
1400 | resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2"
1401 | integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==
1402 | dependencies:
1403 | callsites "^3.0.0"
1404 |
1405 | path-exists@^4.0.0:
1406 | version "4.0.0"
1407 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3"
1408 | integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==
1409 |
1410 | path-is-absolute@^1.0.0:
1411 | version "1.0.1"
1412 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
1413 | integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==
1414 |
1415 | path-key@^3.1.0:
1416 | version "3.1.1"
1417 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
1418 | integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
1419 |
1420 | path-parse@^1.0.7:
1421 | version "1.0.7"
1422 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
1423 | integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
1424 |
1425 | path-type@^4.0.0:
1426 | version "4.0.0"
1427 | resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
1428 | integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
1429 |
1430 | picomatch@^2.3.1:
1431 | version "2.3.1"
1432 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
1433 | integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
1434 |
1435 | prelude-ls@^1.2.1:
1436 | version "1.2.1"
1437 | resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396"
1438 | integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==
1439 |
1440 | prettier@^3.0.3:
1441 | version "3.0.3"
1442 | resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.0.3.tgz#432a51f7ba422d1469096c0fdc28e235db8f9643"
1443 | integrity sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==
1444 |
1445 | prop-types@^15.8.1:
1446 | version "15.8.1"
1447 | resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5"
1448 | integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==
1449 | dependencies:
1450 | loose-envify "^1.4.0"
1451 | object-assign "^4.1.1"
1452 | react-is "^16.13.1"
1453 |
1454 | punycode@^2.1.0:
1455 | version "2.3.1"
1456 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5"
1457 | integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==
1458 |
1459 | queue-microtask@^1.2.2:
1460 | version "1.2.3"
1461 | resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243"
1462 | integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==
1463 |
1464 | react-is@^16.13.1:
1465 | version "16.13.1"
1466 | resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"
1467 | integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
1468 |
1469 | reflect.getprototypeof@^1.0.4:
1470 | version "1.0.4"
1471 | resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz#aaccbf41aca3821b87bb71d9dcbc7ad0ba50a3f3"
1472 | integrity sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==
1473 | dependencies:
1474 | call-bind "^1.0.2"
1475 | define-properties "^1.2.0"
1476 | es-abstract "^1.22.1"
1477 | get-intrinsic "^1.2.1"
1478 | globalthis "^1.0.3"
1479 | which-builtin-type "^1.1.3"
1480 |
1481 | regexp.prototype.flags@^1.5.0, regexp.prototype.flags@^1.5.1:
1482 | version "1.5.1"
1483 | resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz#90ce989138db209f81492edd734183ce99f9677e"
1484 | integrity sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==
1485 | dependencies:
1486 | call-bind "^1.0.2"
1487 | define-properties "^1.2.0"
1488 | set-function-name "^2.0.0"
1489 |
1490 | resolve-from@^4.0.0:
1491 | version "4.0.0"
1492 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
1493 | integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
1494 |
1495 | resolve@^1.22.4:
1496 | version "1.22.8"
1497 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d"
1498 | integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==
1499 | dependencies:
1500 | is-core-module "^2.13.0"
1501 | path-parse "^1.0.7"
1502 | supports-preserve-symlinks-flag "^1.0.0"
1503 |
1504 | resolve@^2.0.0-next.4:
1505 | version "2.0.0-next.5"
1506 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.5.tgz#6b0ec3107e671e52b68cd068ef327173b90dc03c"
1507 | integrity sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==
1508 | dependencies:
1509 | is-core-module "^2.13.0"
1510 | path-parse "^1.0.7"
1511 | supports-preserve-symlinks-flag "^1.0.0"
1512 |
1513 | reusify@^1.0.4:
1514 | version "1.0.4"
1515 | resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
1516 | integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
1517 |
1518 | rimraf@^3.0.2:
1519 | version "3.0.2"
1520 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
1521 | integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
1522 | dependencies:
1523 | glob "^7.1.3"
1524 |
1525 | run-parallel@^1.1.9:
1526 | version "1.2.0"
1527 | resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee"
1528 | integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==
1529 | dependencies:
1530 | queue-microtask "^1.2.2"
1531 |
1532 | safe-array-concat@^1.0.1:
1533 | version "1.0.1"
1534 | resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.0.1.tgz#91686a63ce3adbea14d61b14c99572a8ff84754c"
1535 | integrity sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==
1536 | dependencies:
1537 | call-bind "^1.0.2"
1538 | get-intrinsic "^1.2.1"
1539 | has-symbols "^1.0.3"
1540 | isarray "^2.0.5"
1541 |
1542 | safe-regex-test@^1.0.0:
1543 | version "1.0.0"
1544 | resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295"
1545 | integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==
1546 | dependencies:
1547 | call-bind "^1.0.2"
1548 | get-intrinsic "^1.1.3"
1549 | is-regex "^1.1.4"
1550 |
1551 | semver@^6.3.1:
1552 | version "6.3.1"
1553 | resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4"
1554 | integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
1555 |
1556 | semver@^7.3.7:
1557 | version "7.5.4"
1558 | resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e"
1559 | integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==
1560 | dependencies:
1561 | lru-cache "^6.0.0"
1562 |
1563 | set-function-length@^1.1.1:
1564 | version "1.1.1"
1565 | resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.1.1.tgz#4bc39fafb0307224a33e106a7d35ca1218d659ed"
1566 | integrity sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==
1567 | dependencies:
1568 | define-data-property "^1.1.1"
1569 | get-intrinsic "^1.2.1"
1570 | gopd "^1.0.1"
1571 | has-property-descriptors "^1.0.0"
1572 |
1573 | set-function-name@^2.0.0, set-function-name@^2.0.1:
1574 | version "2.0.1"
1575 | resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.1.tgz#12ce38b7954310b9f61faa12701620a0c882793a"
1576 | integrity sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==
1577 | dependencies:
1578 | define-data-property "^1.0.1"
1579 | functions-have-names "^1.2.3"
1580 | has-property-descriptors "^1.0.0"
1581 |
1582 | shebang-command@^2.0.0:
1583 | version "2.0.0"
1584 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
1585 | integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==
1586 | dependencies:
1587 | shebang-regex "^3.0.0"
1588 |
1589 | shebang-regex@^3.0.0:
1590 | version "3.0.0"
1591 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
1592 | integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
1593 |
1594 | side-channel@^1.0.4:
1595 | version "1.0.4"
1596 | resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf"
1597 | integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==
1598 | dependencies:
1599 | call-bind "^1.0.0"
1600 | get-intrinsic "^1.0.2"
1601 | object-inspect "^1.9.0"
1602 |
1603 | slash@^3.0.0:
1604 | version "3.0.0"
1605 | resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
1606 | integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
1607 |
1608 | string.prototype.matchall@^4.0.8:
1609 | version "4.0.10"
1610 | resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz#a1553eb532221d4180c51581d6072cd65d1ee100"
1611 | integrity sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==
1612 | dependencies:
1613 | call-bind "^1.0.2"
1614 | define-properties "^1.2.0"
1615 | es-abstract "^1.22.1"
1616 | get-intrinsic "^1.2.1"
1617 | has-symbols "^1.0.3"
1618 | internal-slot "^1.0.5"
1619 | regexp.prototype.flags "^1.5.0"
1620 | set-function-name "^2.0.0"
1621 | side-channel "^1.0.4"
1622 |
1623 | string.prototype.trim@^1.2.8:
1624 | version "1.2.8"
1625 | resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz#f9ac6f8af4bd55ddfa8895e6aea92a96395393bd"
1626 | integrity sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==
1627 | dependencies:
1628 | call-bind "^1.0.2"
1629 | define-properties "^1.2.0"
1630 | es-abstract "^1.22.1"
1631 |
1632 | string.prototype.trimend@^1.0.7:
1633 | version "1.0.7"
1634 | resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz#1bb3afc5008661d73e2dc015cd4853732d6c471e"
1635 | integrity sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==
1636 | dependencies:
1637 | call-bind "^1.0.2"
1638 | define-properties "^1.2.0"
1639 | es-abstract "^1.22.1"
1640 |
1641 | string.prototype.trimstart@^1.0.7:
1642 | version "1.0.7"
1643 | resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz#d4cdb44b83a4737ffbac2d406e405d43d0184298"
1644 | integrity sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==
1645 | dependencies:
1646 | call-bind "^1.0.2"
1647 | define-properties "^1.2.0"
1648 | es-abstract "^1.22.1"
1649 |
1650 | strip-ansi@^6.0.1:
1651 | version "6.0.1"
1652 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
1653 | integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
1654 | dependencies:
1655 | ansi-regex "^5.0.1"
1656 |
1657 | strip-bom@^3.0.0:
1658 | version "3.0.0"
1659 | resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
1660 | integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==
1661 |
1662 | strip-json-comments@^3.1.1:
1663 | version "3.1.1"
1664 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
1665 | integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
1666 |
1667 | supports-color@^7.1.0:
1668 | version "7.2.0"
1669 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
1670 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
1671 | dependencies:
1672 | has-flag "^4.0.0"
1673 |
1674 | supports-preserve-symlinks-flag@^1.0.0:
1675 | version "1.0.0"
1676 | resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09"
1677 | integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
1678 |
1679 | text-table@^0.2.0:
1680 | version "0.2.0"
1681 | resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
1682 | integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==
1683 |
1684 | to-regex-range@^5.0.1:
1685 | version "5.0.1"
1686 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
1687 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
1688 | dependencies:
1689 | is-number "^7.0.0"
1690 |
1691 | tsconfig-paths@^3.14.2:
1692 | version "3.14.2"
1693 | resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz#6e32f1f79412decd261f92d633a9dc1cfa99f088"
1694 | integrity sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==
1695 | dependencies:
1696 | "@types/json5" "^0.0.29"
1697 | json5 "^1.0.2"
1698 | minimist "^1.2.6"
1699 | strip-bom "^3.0.0"
1700 |
1701 | tslib@^1.8.1:
1702 | version "1.14.1"
1703 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
1704 | integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
1705 |
1706 | tsutils@^3.21.0:
1707 | version "3.21.0"
1708 | resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623"
1709 | integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==
1710 | dependencies:
1711 | tslib "^1.8.1"
1712 |
1713 | type-check@^0.4.0, type-check@~0.4.0:
1714 | version "0.4.0"
1715 | resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1"
1716 | integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==
1717 | dependencies:
1718 | prelude-ls "^1.2.1"
1719 |
1720 | type-fest@^0.20.2:
1721 | version "0.20.2"
1722 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4"
1723 | integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==
1724 |
1725 | typed-array-buffer@^1.0.0:
1726 | version "1.0.0"
1727 | resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz#18de3e7ed7974b0a729d3feecb94338d1472cd60"
1728 | integrity sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==
1729 | dependencies:
1730 | call-bind "^1.0.2"
1731 | get-intrinsic "^1.2.1"
1732 | is-typed-array "^1.1.10"
1733 |
1734 | typed-array-byte-length@^1.0.0:
1735 | version "1.0.0"
1736 | resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz#d787a24a995711611fb2b87a4052799517b230d0"
1737 | integrity sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==
1738 | dependencies:
1739 | call-bind "^1.0.2"
1740 | for-each "^0.3.3"
1741 | has-proto "^1.0.1"
1742 | is-typed-array "^1.1.10"
1743 |
1744 | typed-array-byte-offset@^1.0.0:
1745 | version "1.0.0"
1746 | resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz#cbbe89b51fdef9cd6aaf07ad4707340abbc4ea0b"
1747 | integrity sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==
1748 | dependencies:
1749 | available-typed-arrays "^1.0.5"
1750 | call-bind "^1.0.2"
1751 | for-each "^0.3.3"
1752 | has-proto "^1.0.1"
1753 | is-typed-array "^1.1.10"
1754 |
1755 | typed-array-length@^1.0.4:
1756 | version "1.0.4"
1757 | resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb"
1758 | integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==
1759 | dependencies:
1760 | call-bind "^1.0.2"
1761 | for-each "^0.3.3"
1762 | is-typed-array "^1.1.9"
1763 |
1764 | typescript@^5.0.4:
1765 | version "5.2.2"
1766 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.2.2.tgz#5ebb5e5a5b75f085f22bc3f8460fba308310fa78"
1767 | integrity sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==
1768 |
1769 | unbox-primitive@^1.0.2:
1770 | version "1.0.2"
1771 | resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e"
1772 | integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==
1773 | dependencies:
1774 | call-bind "^1.0.2"
1775 | has-bigints "^1.0.2"
1776 | has-symbols "^1.0.3"
1777 | which-boxed-primitive "^1.0.2"
1778 |
1779 | uri-js@^4.2.2:
1780 | version "4.4.1"
1781 | resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e"
1782 | integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==
1783 | dependencies:
1784 | punycode "^2.1.0"
1785 |
1786 | which-boxed-primitive@^1.0.2:
1787 | version "1.0.2"
1788 | resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6"
1789 | integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==
1790 | dependencies:
1791 | is-bigint "^1.0.1"
1792 | is-boolean-object "^1.1.0"
1793 | is-number-object "^1.0.4"
1794 | is-string "^1.0.5"
1795 | is-symbol "^1.0.3"
1796 |
1797 | which-builtin-type@^1.1.3:
1798 | version "1.1.3"
1799 | resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.1.3.tgz#b1b8443707cc58b6e9bf98d32110ff0c2cbd029b"
1800 | integrity sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==
1801 | dependencies:
1802 | function.prototype.name "^1.1.5"
1803 | has-tostringtag "^1.0.0"
1804 | is-async-function "^2.0.0"
1805 | is-date-object "^1.0.5"
1806 | is-finalizationregistry "^1.0.2"
1807 | is-generator-function "^1.0.10"
1808 | is-regex "^1.1.4"
1809 | is-weakref "^1.0.2"
1810 | isarray "^2.0.5"
1811 | which-boxed-primitive "^1.0.2"
1812 | which-collection "^1.0.1"
1813 | which-typed-array "^1.1.9"
1814 |
1815 | which-collection@^1.0.1:
1816 | version "1.0.1"
1817 | resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.1.tgz#70eab71ebbbd2aefaf32f917082fc62cdcb70906"
1818 | integrity sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==
1819 | dependencies:
1820 | is-map "^2.0.1"
1821 | is-set "^2.0.1"
1822 | is-weakmap "^2.0.1"
1823 | is-weakset "^2.0.1"
1824 |
1825 | which-typed-array@^1.1.11, which-typed-array@^1.1.13, which-typed-array@^1.1.9:
1826 | version "1.1.13"
1827 | resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.13.tgz#870cd5be06ddb616f504e7b039c4c24898184d36"
1828 | integrity sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==
1829 | dependencies:
1830 | available-typed-arrays "^1.0.5"
1831 | call-bind "^1.0.4"
1832 | for-each "^0.3.3"
1833 | gopd "^1.0.1"
1834 | has-tostringtag "^1.0.0"
1835 |
1836 | which@^2.0.1:
1837 | version "2.0.2"
1838 | resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
1839 | integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
1840 | dependencies:
1841 | isexe "^2.0.0"
1842 |
1843 | wrappy@1:
1844 | version "1.0.2"
1845 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
1846 | integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==
1847 |
1848 | yallist@^4.0.0:
1849 | version "4.0.0"
1850 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
1851 | integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
1852 |
1853 | yocto-queue@^0.1.0:
1854 | version "0.1.0"
1855 | resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"
1856 | integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==
1857 |
--------------------------------------------------------------------------------