From ca08104c703bb8a51f994484e545a03015060ff8 Mon Sep 17 00:00:00 2001 From: Markus Blomqvist Date: Tue, 27 Dec 2022 20:38:09 +0200 Subject: [PATCH] v0.2.0 This change breaks the API by changing the previous logic used for both input/output validation and the OpenAPI generation so that only a simple default specification is generated from the newly introfuced `input` and `output` logic, whereas the user can override these with the `openApiSpec` object that can now be used on three levels, similarly to the middlewares and error handlers. This change also contains miscellaneous refactorings for the project structure due to the increasing amount of utility functions etc. --- .gitignore | 7 + .npmrc | 2 - CHANGELOG.md | 6 + apps/dev/.gitignore | 36 - .../pages/api/[[...next-rest-framework]].ts | 4 +- apps/dev/pages/api/todos.ts | 130 +- apps/dev/sample-data.json | 1202 --------- apps/example/.gitignore | 36 - apps/example/package-lock.json | 918 ------- apps/example/package.json | 2 +- apps/example/pages/api/yup.ts | 31 + apps/example/pages/api/{example.ts => zod.ts} | 16 +- docs/.gitignore | 20 - docs/.npmrc | 1 - docs/package.json | 5 +- packages/next-rest-framework/.gitignore | 2 - packages/next-rest-framework/README.md | 114 +- packages/next-rest-framework/package.json | 16 +- packages/next-rest-framework/src/client.ts | 7 +- packages/next-rest-framework/src/constants.ts | 2 +- .../src/define-catch-all-handler.ts | 44 - .../src/define-endpoints.ts | 414 ++-- packages/next-rest-framework/src/types.ts | 330 --- .../src/types/api-handler.ts | 20 + .../next-rest-framework/src/types/config.ts | 24 + .../src/{ => types}/content-types.ts | 0 .../src/types/define-endpoints.ts | 132 + .../src/types/error-handler.ts | 15 + .../next-rest-framework/src/types/index.ts | 11 + .../src/types/method-handlers.ts | 80 + .../src/types/middleware.ts | 16 + .../next-rest-framework/src/types/request.ts | 11 + .../next-rest-framework/src/types/response.ts | 16 + .../next-rest-framework/src/types/schemas.ts | 10 + .../src/{ => types}/utility-types.ts | 1 + packages/next-rest-framework/src/utils.ts | 520 ---- .../next-rest-framework/src/utils/config.ts | 32 + .../next-rest-framework/src/utils/index.ts | 4 + .../next-rest-framework/src/utils/logging.ts | 144 ++ .../next-rest-framework/src/utils/open-api.ts | 269 ++ .../next-rest-framework/src/utils/schemas.ts | 296 +++ .../next-rest-framework/tests/index.test.ts | 802 +++--- .../next-rest-framework/tests/paths.test.ts | 342 ++- ...edPaths.test.ts => reserved-paths.test.ts} | 61 +- packages/next-rest-framework/tests/utils.ts | 46 +- packages/next-rest-framework/tsconfig.json | 15 +- packages/tsconfig/package.json | 4 + packages/tsconfig/tsconfig.base.json | 17 + pnpm-lock.yaml | 2163 +++++++---------- 49 files changed, 3151 insertions(+), 5245 deletions(-) delete mode 100644 .npmrc delete mode 100644 apps/dev/.gitignore delete mode 100644 apps/dev/sample-data.json delete mode 100644 apps/example/.gitignore delete mode 100644 apps/example/package-lock.json create mode 100644 apps/example/pages/api/yup.ts rename apps/example/pages/api/{example.ts => zod.ts} (65%) delete mode 100644 docs/.gitignore delete mode 100644 docs/.npmrc delete mode 100644 packages/next-rest-framework/.gitignore delete mode 100644 packages/next-rest-framework/src/define-catch-all-handler.ts delete mode 100644 packages/next-rest-framework/src/types.ts create mode 100644 packages/next-rest-framework/src/types/api-handler.ts create mode 100644 packages/next-rest-framework/src/types/config.ts rename packages/next-rest-framework/src/{ => types}/content-types.ts (100%) create mode 100644 packages/next-rest-framework/src/types/define-endpoints.ts create mode 100644 packages/next-rest-framework/src/types/error-handler.ts create mode 100644 packages/next-rest-framework/src/types/index.ts create mode 100644 packages/next-rest-framework/src/types/method-handlers.ts create mode 100644 packages/next-rest-framework/src/types/middleware.ts create mode 100644 packages/next-rest-framework/src/types/request.ts create mode 100644 packages/next-rest-framework/src/types/response.ts create mode 100644 packages/next-rest-framework/src/types/schemas.ts rename packages/next-rest-framework/src/{ => types}/utility-types.ts (86%) delete mode 100644 packages/next-rest-framework/src/utils.ts create mode 100644 packages/next-rest-framework/src/utils/config.ts create mode 100644 packages/next-rest-framework/src/utils/index.ts create mode 100644 packages/next-rest-framework/src/utils/logging.ts create mode 100644 packages/next-rest-framework/src/utils/open-api.ts create mode 100644 packages/next-rest-framework/src/utils/schemas.ts rename packages/next-rest-framework/tests/{reservedPaths.test.ts => reserved-paths.test.ts} (80%) create mode 100644 packages/tsconfig/package.json create mode 100644 packages/tsconfig/tsconfig.base.json diff --git a/.gitignore b/.gitignore index 3c3629e..3971946 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,8 @@ node_modules +coverage +dist +tsconfig.tsbuildinfo +.next +next-env.d.ts +build +.docusaurus diff --git a/.npmrc b/.npmrc deleted file mode 100644 index b01cb82..0000000 --- a/.npmrc +++ /dev/null @@ -1,2 +0,0 @@ -auto-install-peers=true -ignore-workspace-root-check=true diff --git a/CHANGELOG.md b/CHANGELOG.md index 384c307..1de4463 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,12 @@ All notable changes to this project will be documented in this file. We follow the [Semantic Versioning 2.0.0](http://semver.org/) format. +### 0.2.0 - 2023-01-03 + +### Changed + +- The public API is changed in a way that the OpenAPI spec generation is split out from the input/output validation. The validation is now done with `input` and `output` keywords within the `defineEndpoints` handler, that generates a minimal OpenAPI spec out of the contents of the input and output definitions and all other OpenAPI generation-related overrides are done inside the `openApiSpec` object. This makes the separation of the business logic and documentation clearer, while still auto-generating the definitions from the application logic. + ### 0.1.2 - 2022-12-09 ### Fixed diff --git a/apps/dev/.gitignore b/apps/dev/.gitignore deleted file mode 100644 index c87c9b3..0000000 --- a/apps/dev/.gitignore +++ /dev/null @@ -1,36 +0,0 @@ -# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. - -# dependencies -/node_modules -/.pnp -.pnp.js - -# testing -/coverage - -# next.js -/.next/ -/out/ - -# production -/build - -# misc -.DS_Store -*.pem - -# debug -npm-debug.log* -yarn-debug.log* -yarn-error.log* -.pnpm-debug.log* - -# local env files -.env*.local - -# vercel -.vercel - -# typescript -*.tsbuildinfo -next-env.d.ts diff --git a/apps/dev/pages/api/[[...next-rest-framework]].ts b/apps/dev/pages/api/[[...next-rest-framework]].ts index 4980bb9..b1f9054 100644 --- a/apps/dev/pages/api/[[...next-rest-framework]].ts +++ b/apps/dev/pages/api/[[...next-rest-framework]].ts @@ -1,9 +1,9 @@ import { defineCatchAllHandler } from 'next-rest-framework/client'; -import * as z from 'zod'; +import { z } from 'zod'; export default defineCatchAllHandler({ GET: { - responses: [ + output: [ { status: 200, contentType: 'text/plain', diff --git a/apps/dev/pages/api/todos.ts b/apps/dev/pages/api/todos.ts index c42ae98..0a9ffcd 100644 --- a/apps/dev/pages/api/todos.ts +++ b/apps/dev/pages/api/todos.ts @@ -1,108 +1,108 @@ -import sampleData from 'sample-data.json'; -import * as z from 'zod'; -import * as yup from 'yup'; import { defineEndpoints } from 'next-rest-framework/client'; +import { z } from 'zod'; +import * as yup from 'yup'; export default defineEndpoints({ middleware: ({ params: { foo, bar, baz } }) => ({ foo: bar, bar: baz, - baz: foo, - asd: 'asd' + baz: foo }), GET: { middleware: () => ({ qux: 'qux' }), - responses: [ + output: [ { status: 200, contentType: 'text/html', schema: z.object({ - data: z.array( - z.object({ - userId: z.number(), - id: z.number(), - title: z.string(), - completed: z.boolean() - }) - ) + foo: z.string(), + bar: z.string(), + baz: z.string(), + qux: z.string() }) } ], handler: async ({ res, params: { foo, bar, baz, qux } }) => { - console.log({ foo, bar, baz, qux }); res.setHeader('content-type', 'text/html'); - res.status(200).json({ data: sampleData }); + res.status(200).json({ foo, bar, baz, qux }); } }, POST: { - tags: ['Todo'], - description: 'Create a new todo', - externalDocs: { - description: 'Find out more about Swagger', - url: 'http://swagger.io' + input: { + contentType: 'application/json', + schema: z.object({ + foo: z.string(), + bar: z.number() + }) }, - operationId: 'createTodo', - parameters: [ + output: [ { - name: 'todo', - in: 'body', - description: 'The todo to create', - required: true, - deprecated: false, - allowEmptyValue: false - } - ], - deprecated: false, - security: [ - { - foo: ['bar'] - } - ], - servers: [ - { - url: 'http://localhost:3000', - description: 'Development server', - variables: {} + status: 201, + contentType: 'application/json', + schema: z.object({ + foo: z.string(), + bar: z.number(), + qux: z.array( + z.object({ + qux: z.string() + }) + ) + }) } ], - requestBody: { - description: 'The todo to create', + middleware: () => ({ + qux: 'qux' + }), + handler: async ({ + req: { + body: { foo, bar } + }, + res, + params: { qux } + }) => { + res.status(201).json({ foo, bar, qux: [{ qux }] }); + } + }, + PUT: { + input: { contentType: 'application/json', schema: yup.object({ - foo: yup.string(), - bar: yup.number() - }), - example: { - foo: 'Buy milk', - bar: 1 - }, - examples: {}, - encoding: {}, - required: true + foo: yup.array( + yup.object({ + bar: yup.string() + }) + ), + baz: yup.number() + }) }, - responses: [ + output: [ { status: 201, contentType: 'application/json', - schema: z.object({ - data: z.array( - z.object({ - userId: z.number(), - id: z.number(), - title: z.string(), - completed: z.boolean() + schema: yup.object({ + foo: yup.array( + yup.object({ + bar: yup.string() }) - ) + ), + bar: yup.number(), + qux: yup.string() }) } ], middleware: () => ({ qux: 'qux' }), - handler: async ({ res }) => { - res.status(201).json({ data: sampleData }); + handler: async ({ + req: { + body: { foo } + }, + res, + params: { qux } + }) => { + res.status(201).json({ foo, bar: 0, qux }); } } }); diff --git a/apps/dev/sample-data.json b/apps/dev/sample-data.json deleted file mode 100644 index a718b9e..0000000 --- a/apps/dev/sample-data.json +++ /dev/null @@ -1,1202 +0,0 @@ -[ - { - "userId": 1, - "id": 1, - "title": "delectus aut autem", - "completed": false - }, - { - "userId": 1, - "id": 2, - "title": "quis ut nam facilis et officia qui", - "completed": false - }, - { - "userId": 1, - "id": 3, - "title": "fugiat veniam minus", - "completed": false - }, - { - "userId": 1, - "id": 4, - "title": "et porro tempora", - "completed": true - }, - { - "userId": 1, - "id": 5, - "title": "laboriosam mollitia et enim quasi adipisci quia provident illum", - "completed": false - }, - { - "userId": 1, - "id": 6, - "title": "qui ullam ratione quibusdam voluptatem quia omnis", - "completed": false - }, - { - "userId": 1, - "id": 7, - "title": "illo expedita consequatur quia in", - "completed": false - }, - { - "userId": 1, - "id": 8, - "title": "quo adipisci enim quam ut ab", - "completed": true - }, - { - "userId": 1, - "id": 9, - "title": "molestiae perspiciatis ipsa", - "completed": false - }, - { - "userId": 1, - "id": 10, - "title": "illo est ratione doloremque quia maiores aut", - "completed": true - }, - { - "userId": 1, - "id": 11, - "title": "vero rerum temporibus dolor", - "completed": true - }, - { - "userId": 1, - "id": 12, - "title": "ipsa repellendus fugit nisi", - "completed": true - }, - { - "userId": 1, - "id": 13, - "title": "et doloremque nulla", - "completed": false - }, - { - "userId": 1, - "id": 14, - "title": "repellendus sunt dolores architecto voluptatum", - "completed": true - }, - { - "userId": 1, - "id": 15, - "title": "ab voluptatum amet voluptas", - "completed": true - }, - { - "userId": 1, - "id": 16, - "title": "accusamus eos facilis sint et aut voluptatem", - "completed": true - }, - { - "userId": 1, - "id": 17, - "title": "quo laboriosam deleniti aut qui", - "completed": true - }, - { - "userId": 1, - "id": 18, - "title": "dolorum est consequatur ea mollitia in culpa", - "completed": false - }, - { - "userId": 1, - "id": 19, - "title": "molestiae ipsa aut voluptatibus pariatur dolor nihil", - "completed": true - }, - { - "userId": 1, - "id": 20, - "title": "ullam nobis libero sapiente ad optio sint", - "completed": true - }, - { - "userId": 2, - "id": 21, - "title": "suscipit repellat esse quibusdam voluptatem incidunt", - "completed": false - }, - { - "userId": 2, - "id": 22, - "title": "distinctio vitae autem nihil ut molestias quo", - "completed": true - }, - { - "userId": 2, - "id": 23, - "title": "et itaque necessitatibus maxime molestiae qui quas velit", - "completed": false - }, - { - "userId": 2, - "id": 24, - "title": "adipisci non ad dicta qui amet quaerat doloribus ea", - "completed": false - }, - { - "userId": 2, - "id": 25, - "title": "voluptas quo tenetur perspiciatis explicabo natus", - "completed": true - }, - { - "userId": 2, - "id": 26, - "title": "aliquam aut quasi", - "completed": true - }, - { - "userId": 2, - "id": 27, - "title": "veritatis pariatur delectus", - "completed": true - }, - { - "userId": 2, - "id": 28, - "title": "nesciunt totam sit blanditiis sit", - "completed": false - }, - { - "userId": 2, - "id": 29, - "title": "laborum aut in quam", - "completed": false - }, - { - "userId": 2, - "id": 30, - "title": "nemo perspiciatis repellat ut dolor libero commodi blanditiis omnis", - "completed": true - }, - { - "userId": 2, - "id": 31, - "title": "repudiandae totam in est sint facere fuga", - "completed": false - }, - { - "userId": 2, - "id": 32, - "title": "earum doloribus ea doloremque quis", - "completed": false - }, - { - "userId": 2, - "id": 33, - "title": "sint sit aut vero", - "completed": false - }, - { - "userId": 2, - "id": 34, - "title": "porro aut necessitatibus eaque distinctio", - "completed": false - }, - { - "userId": 2, - "id": 35, - "title": "repellendus veritatis molestias dicta incidunt", - "completed": true - }, - { - "userId": 2, - "id": 36, - "title": "excepturi deleniti adipisci voluptatem et neque optio illum ad", - "completed": true - }, - { - "userId": 2, - "id": 37, - "title": "sunt cum tempora", - "completed": false - }, - { - "userId": 2, - "id": 38, - "title": "totam quia non", - "completed": false - }, - { - "userId": 2, - "id": 39, - "title": "doloremque quibusdam asperiores libero corrupti illum qui omnis", - "completed": false - }, - { - "userId": 2, - "id": 40, - "title": "totam atque quo nesciunt", - "completed": true - }, - { - "userId": 3, - "id": 41, - "title": "aliquid amet impedit consequatur aspernatur placeat eaque fugiat suscipit", - "completed": false - }, - { - "userId": 3, - "id": 42, - "title": "rerum perferendis error quia ut eveniet", - "completed": false - }, - { - "userId": 3, - "id": 43, - "title": "tempore ut sint quis recusandae", - "completed": true - }, - { - "userId": 3, - "id": 44, - "title": "cum debitis quis accusamus doloremque ipsa natus sapiente omnis", - "completed": true - }, - { - "userId": 3, - "id": 45, - "title": "velit soluta adipisci molestias reiciendis harum", - "completed": false - }, - { - "userId": 3, - "id": 46, - "title": "vel voluptatem repellat nihil placeat corporis", - "completed": false - }, - { - "userId": 3, - "id": 47, - "title": "nam qui rerum fugiat accusamus", - "completed": false - }, - { - "userId": 3, - "id": 48, - "title": "sit reprehenderit omnis quia", - "completed": false - }, - { - "userId": 3, - "id": 49, - "title": "ut necessitatibus aut maiores debitis officia blanditiis velit et", - "completed": false - }, - { - "userId": 3, - "id": 50, - "title": "cupiditate necessitatibus ullam aut quis dolor voluptate", - "completed": true - }, - { - "userId": 3, - "id": 51, - "title": "distinctio exercitationem ab doloribus", - "completed": false - }, - { - "userId": 3, - "id": 52, - "title": "nesciunt dolorum quis recusandae ad pariatur ratione", - "completed": false - }, - { - "userId": 3, - "id": 53, - "title": "qui labore est occaecati recusandae aliquid quam", - "completed": false - }, - { - "userId": 3, - "id": 54, - "title": "quis et est ut voluptate quam dolor", - "completed": true - }, - { - "userId": 3, - "id": 55, - "title": "voluptatum omnis minima qui occaecati provident nulla voluptatem ratione", - "completed": true - }, - { - "userId": 3, - "id": 56, - "title": "deleniti ea temporibus enim", - "completed": true - }, - { - "userId": 3, - "id": 57, - "title": "pariatur et magnam ea doloribus similique voluptatem rerum quia", - "completed": false - }, - { - "userId": 3, - "id": 58, - "title": "est dicta totam qui explicabo doloribus qui dignissimos", - "completed": false - }, - { - "userId": 3, - "id": 59, - "title": "perspiciatis velit id laborum placeat iusto et aliquam odio", - "completed": false - }, - { - "userId": 3, - "id": 60, - "title": "et sequi qui architecto ut adipisci", - "completed": true - }, - { - "userId": 4, - "id": 61, - "title": "odit optio omnis qui sunt", - "completed": true - }, - { - "userId": 4, - "id": 62, - "title": "et placeat et tempore aspernatur sint numquam", - "completed": false - }, - { - "userId": 4, - "id": 63, - "title": "doloremque aut dolores quidem fuga qui nulla", - "completed": true - }, - { - "userId": 4, - "id": 64, - "title": "voluptas consequatur qui ut quia magnam nemo esse", - "completed": false - }, - { - "userId": 4, - "id": 65, - "title": "fugiat pariatur ratione ut asperiores necessitatibus magni", - "completed": false - }, - { - "userId": 4, - "id": 66, - "title": "rerum eum molestias autem voluptatum sit optio", - "completed": false - }, - { - "userId": 4, - "id": 67, - "title": "quia voluptatibus voluptatem quos similique maiores repellat", - "completed": false - }, - { - "userId": 4, - "id": 68, - "title": "aut id perspiciatis voluptatem iusto", - "completed": false - }, - { - "userId": 4, - "id": 69, - "title": "doloribus sint dolorum ab adipisci itaque dignissimos aliquam suscipit", - "completed": false - }, - { - "userId": 4, - "id": 70, - "title": "ut sequi accusantium et mollitia delectus sunt", - "completed": false - }, - { - "userId": 4, - "id": 71, - "title": "aut velit saepe ullam", - "completed": false - }, - { - "userId": 4, - "id": 72, - "title": "praesentium facilis facere quis harum voluptatibus voluptatem eum", - "completed": false - }, - { - "userId": 4, - "id": 73, - "title": "sint amet quia totam corporis qui exercitationem commodi", - "completed": true - }, - { - "userId": 4, - "id": 74, - "title": "expedita tempore nobis eveniet laborum maiores", - "completed": false - }, - { - "userId": 4, - "id": 75, - "title": "occaecati adipisci est possimus totam", - "completed": false - }, - { - "userId": 4, - "id": 76, - "title": "sequi dolorem sed", - "completed": true - }, - { - "userId": 4, - "id": 77, - "title": "maiores aut nesciunt delectus exercitationem vel assumenda eligendi at", - "completed": false - }, - { - "userId": 4, - "id": 78, - "title": "reiciendis est magnam amet nemo iste recusandae impedit quaerat", - "completed": false - }, - { - "userId": 4, - "id": 79, - "title": "eum ipsa maxime ut", - "completed": true - }, - { - "userId": 4, - "id": 80, - "title": "tempore molestias dolores rerum sequi voluptates ipsum consequatur", - "completed": true - }, - { - "userId": 5, - "id": 81, - "title": "suscipit qui totam", - "completed": true - }, - { - "userId": 5, - "id": 82, - "title": "voluptates eum voluptas et dicta", - "completed": false - }, - { - "userId": 5, - "id": 83, - "title": "quidem at rerum quis ex aut sit quam", - "completed": true - }, - { - "userId": 5, - "id": 84, - "title": "sunt veritatis ut voluptate", - "completed": false - }, - { - "userId": 5, - "id": 85, - "title": "et quia ad iste a", - "completed": true - }, - { - "userId": 5, - "id": 86, - "title": "incidunt ut saepe autem", - "completed": true - }, - { - "userId": 5, - "id": 87, - "title": "laudantium quae eligendi consequatur quia et vero autem", - "completed": true - }, - { - "userId": 5, - "id": 88, - "title": "vitae aut excepturi laboriosam sint aliquam et et accusantium", - "completed": false - }, - { - "userId": 5, - "id": 89, - "title": "sequi ut omnis et", - "completed": true - }, - { - "userId": 5, - "id": 90, - "title": "molestiae nisi accusantium tenetur dolorem et", - "completed": true - }, - { - "userId": 5, - "id": 91, - "title": "nulla quis consequatur saepe qui id expedita", - "completed": true - }, - { - "userId": 5, - "id": 92, - "title": "in omnis laboriosam", - "completed": true - }, - { - "userId": 5, - "id": 93, - "title": "odio iure consequatur molestiae quibusdam necessitatibus quia sint", - "completed": true - }, - { - "userId": 5, - "id": 94, - "title": "facilis modi saepe mollitia", - "completed": false - }, - { - "userId": 5, - "id": 95, - "title": "vel nihil et molestiae iusto assumenda nemo quo ut", - "completed": true - }, - { - "userId": 5, - "id": 96, - "title": "nobis suscipit ducimus enim asperiores voluptas", - "completed": false - }, - { - "userId": 5, - "id": 97, - "title": "dolorum laboriosam eos qui iure aliquam", - "completed": false - }, - { - "userId": 5, - "id": 98, - "title": "debitis accusantium ut quo facilis nihil quis sapiente necessitatibus", - "completed": true - }, - { - "userId": 5, - "id": 99, - "title": "neque voluptates ratione", - "completed": false - }, - { - "userId": 5, - "id": 100, - "title": "excepturi a et neque qui expedita vel voluptate", - "completed": false - }, - { - "userId": 6, - "id": 101, - "title": "explicabo enim cumque porro aperiam occaecati minima", - "completed": false - }, - { - "userId": 6, - "id": 102, - "title": "sed ab consequatur", - "completed": false - }, - { - "userId": 6, - "id": 103, - "title": "non sunt delectus illo nulla tenetur enim omnis", - "completed": false - }, - { - "userId": 6, - "id": 104, - "title": "excepturi non laudantium quo", - "completed": false - }, - { - "userId": 6, - "id": 105, - "title": "totam quia dolorem et illum repellat voluptas optio", - "completed": true - }, - { - "userId": 6, - "id": 106, - "title": "ad illo quis voluptatem temporibus", - "completed": true - }, - { - "userId": 6, - "id": 107, - "title": "praesentium facilis omnis laudantium fugit ad iusto nihil nesciunt", - "completed": false - }, - { - "userId": 6, - "id": 108, - "title": "a eos eaque nihil et exercitationem incidunt delectus", - "completed": true - }, - { - "userId": 6, - "id": 109, - "title": "autem temporibus harum quisquam in culpa", - "completed": true - }, - { - "userId": 6, - "id": 110, - "title": "aut aut ea corporis", - "completed": true - }, - { - "userId": 6, - "id": 111, - "title": "magni accusantium labore et id quis provident", - "completed": false - }, - { - "userId": 6, - "id": 112, - "title": "consectetur impedit quisquam qui deserunt non rerum consequuntur eius", - "completed": false - }, - { - "userId": 6, - "id": 113, - "title": "quia atque aliquam sunt impedit voluptatum rerum assumenda nisi", - "completed": false - }, - { - "userId": 6, - "id": 114, - "title": "cupiditate quos possimus corporis quisquam exercitationem beatae", - "completed": false - }, - { - "userId": 6, - "id": 115, - "title": "sed et ea eum", - "completed": false - }, - { - "userId": 6, - "id": 116, - "title": "ipsa dolores vel facilis ut", - "completed": true - }, - { - "userId": 6, - "id": 117, - "title": "sequi quae est et qui qui eveniet asperiores", - "completed": false - }, - { - "userId": 6, - "id": 118, - "title": "quia modi consequatur vero fugiat", - "completed": false - }, - { - "userId": 6, - "id": 119, - "title": "corporis ducimus ea perspiciatis iste", - "completed": false - }, - { - "userId": 6, - "id": 120, - "title": "dolorem laboriosam vel voluptas et aliquam quasi", - "completed": false - }, - { - "userId": 7, - "id": 121, - "title": "inventore aut nihil minima laudantium hic qui omnis", - "completed": true - }, - { - "userId": 7, - "id": 122, - "title": "provident aut nobis culpa", - "completed": true - }, - { - "userId": 7, - "id": 123, - "title": "esse et quis iste est earum aut impedit", - "completed": false - }, - { - "userId": 7, - "id": 124, - "title": "qui consectetur id", - "completed": false - }, - { - "userId": 7, - "id": 125, - "title": "aut quasi autem iste tempore illum possimus", - "completed": false - }, - { - "userId": 7, - "id": 126, - "title": "ut asperiores perspiciatis veniam ipsum rerum saepe", - "completed": true - }, - { - "userId": 7, - "id": 127, - "title": "voluptatem libero consectetur rerum ut", - "completed": true - }, - { - "userId": 7, - "id": 128, - "title": "eius omnis est qui voluptatem autem", - "completed": false - }, - { - "userId": 7, - "id": 129, - "title": "rerum culpa quis harum", - "completed": false - }, - { - "userId": 7, - "id": 130, - "title": "nulla aliquid eveniet harum laborum libero alias ut unde", - "completed": true - }, - { - "userId": 7, - "id": 131, - "title": "qui ea incidunt quis", - "completed": false - }, - { - "userId": 7, - "id": 132, - "title": "qui molestiae voluptatibus velit iure harum quisquam", - "completed": true - }, - { - "userId": 7, - "id": 133, - "title": "et labore eos enim rerum consequatur sunt", - "completed": true - }, - { - "userId": 7, - "id": 134, - "title": "molestiae doloribus et laborum quod ea", - "completed": false - }, - { - "userId": 7, - "id": 135, - "title": "facere ipsa nam eum voluptates reiciendis vero qui", - "completed": false - }, - { - "userId": 7, - "id": 136, - "title": "asperiores illo tempora fuga sed ut quasi adipisci", - "completed": false - }, - { - "userId": 7, - "id": 137, - "title": "qui sit non", - "completed": false - }, - { - "userId": 7, - "id": 138, - "title": "placeat minima consequatur rem qui ut", - "completed": true - }, - { - "userId": 7, - "id": 139, - "title": "consequatur doloribus id possimus voluptas a voluptatem", - "completed": false - }, - { - "userId": 7, - "id": 140, - "title": "aut consectetur in blanditiis deserunt quia sed laboriosam", - "completed": true - }, - { - "userId": 8, - "id": 141, - "title": "explicabo consectetur debitis voluptates quas quae culpa rerum non", - "completed": true - }, - { - "userId": 8, - "id": 142, - "title": "maiores accusantium architecto necessitatibus reiciendis ea aut", - "completed": true - }, - { - "userId": 8, - "id": 143, - "title": "eum non recusandae cupiditate animi", - "completed": false - }, - { - "userId": 8, - "id": 144, - "title": "ut eum exercitationem sint", - "completed": false - }, - { - "userId": 8, - "id": 145, - "title": "beatae qui ullam incidunt voluptatem non nisi aliquam", - "completed": false - }, - { - "userId": 8, - "id": 146, - "title": "molestiae suscipit ratione nihil odio libero impedit vero totam", - "completed": true - }, - { - "userId": 8, - "id": 147, - "title": "eum itaque quod reprehenderit et facilis dolor autem ut", - "completed": true - }, - { - "userId": 8, - "id": 148, - "title": "esse quas et quo quasi exercitationem", - "completed": false - }, - { - "userId": 8, - "id": 149, - "title": "animi voluptas quod perferendis est", - "completed": false - }, - { - "userId": 8, - "id": 150, - "title": "eos amet tempore laudantium fugit a", - "completed": false - }, - { - "userId": 8, - "id": 151, - "title": "accusamus adipisci dicta qui quo ea explicabo sed vero", - "completed": true - }, - { - "userId": 8, - "id": 152, - "title": "odit eligendi recusandae doloremque cumque non", - "completed": false - }, - { - "userId": 8, - "id": 153, - "title": "ea aperiam consequatur qui repellat eos", - "completed": false - }, - { - "userId": 8, - "id": 154, - "title": "rerum non ex sapiente", - "completed": true - }, - { - "userId": 8, - "id": 155, - "title": "voluptatem nobis consequatur et assumenda magnam", - "completed": true - }, - { - "userId": 8, - "id": 156, - "title": "nam quia quia nulla repellat assumenda quibusdam sit nobis", - "completed": true - }, - { - "userId": 8, - "id": 157, - "title": "dolorem veniam quisquam deserunt repellendus", - "completed": true - }, - { - "userId": 8, - "id": 158, - "title": "debitis vitae delectus et harum accusamus aut deleniti a", - "completed": true - }, - { - "userId": 8, - "id": 159, - "title": "debitis adipisci quibusdam aliquam sed dolore ea praesentium nobis", - "completed": true - }, - { - "userId": 8, - "id": 160, - "title": "et praesentium aliquam est", - "completed": false - }, - { - "userId": 9, - "id": 161, - "title": "ex hic consequuntur earum omnis alias ut occaecati culpa", - "completed": true - }, - { - "userId": 9, - "id": 162, - "title": "omnis laboriosam molestias animi sunt dolore", - "completed": true - }, - { - "userId": 9, - "id": 163, - "title": "natus corrupti maxime laudantium et voluptatem laboriosam odit", - "completed": false - }, - { - "userId": 9, - "id": 164, - "title": "reprehenderit quos aut aut consequatur est sed", - "completed": false - }, - { - "userId": 9, - "id": 165, - "title": "fugiat perferendis sed aut quidem", - "completed": false - }, - { - "userId": 9, - "id": 166, - "title": "quos quo possimus suscipit minima ut", - "completed": false - }, - { - "userId": 9, - "id": 167, - "title": "et quis minus quo a asperiores molestiae", - "completed": false - }, - { - "userId": 9, - "id": 168, - "title": "recusandae quia qui sunt libero", - "completed": false - }, - { - "userId": 9, - "id": 169, - "title": "ea odio perferendis officiis", - "completed": true - }, - { - "userId": 9, - "id": 170, - "title": "quisquam aliquam quia doloribus aut", - "completed": false - }, - { - "userId": 9, - "id": 171, - "title": "fugiat aut voluptatibus corrupti deleniti velit iste odio", - "completed": true - }, - { - "userId": 9, - "id": 172, - "title": "et provident amet rerum consectetur et voluptatum", - "completed": false - }, - { - "userId": 9, - "id": 173, - "title": "harum ad aperiam quis", - "completed": false - }, - { - "userId": 9, - "id": 174, - "title": "similique aut quo", - "completed": false - }, - { - "userId": 9, - "id": 175, - "title": "laudantium eius officia perferendis provident perspiciatis asperiores", - "completed": true - }, - { - "userId": 9, - "id": 176, - "title": "magni soluta corrupti ut maiores rem quidem", - "completed": false - }, - { - "userId": 9, - "id": 177, - "title": "et placeat temporibus voluptas est tempora quos quibusdam", - "completed": false - }, - { - "userId": 9, - "id": 178, - "title": "nesciunt itaque commodi tempore", - "completed": true - }, - { - "userId": 9, - "id": 179, - "title": "omnis consequuntur cupiditate impedit itaque ipsam quo", - "completed": true - }, - { - "userId": 9, - "id": 180, - "title": "debitis nisi et dolorem repellat et", - "completed": true - }, - { - "userId": 10, - "id": 181, - "title": "ut cupiditate sequi aliquam fuga maiores", - "completed": false - }, - { - "userId": 10, - "id": 182, - "title": "inventore saepe cumque et aut illum enim", - "completed": true - }, - { - "userId": 10, - "id": 183, - "title": "omnis nulla eum aliquam distinctio", - "completed": true - }, - { - "userId": 10, - "id": 184, - "title": "molestias modi perferendis perspiciatis", - "completed": false - }, - { - "userId": 10, - "id": 185, - "title": "voluptates dignissimos sed doloribus animi quaerat aut", - "completed": false - }, - { - "userId": 10, - "id": 186, - "title": "explicabo odio est et", - "completed": false - }, - { - "userId": 10, - "id": 187, - "title": "consequuntur animi possimus", - "completed": false - }, - { - "userId": 10, - "id": 188, - "title": "vel non beatae est", - "completed": true - }, - { - "userId": 10, - "id": 189, - "title": "culpa eius et voluptatem et", - "completed": true - }, - { - "userId": 10, - "id": 190, - "title": "accusamus sint iusto et voluptatem exercitationem", - "completed": true - }, - { - "userId": 10, - "id": 191, - "title": "temporibus atque distinctio omnis eius impedit tempore molestias pariatur", - "completed": true - }, - { - "userId": 10, - "id": 192, - "title": "ut quas possimus exercitationem sint voluptates", - "completed": false - }, - { - "userId": 10, - "id": 193, - "title": "rerum debitis voluptatem qui eveniet tempora distinctio a", - "completed": true - }, - { - "userId": 10, - "id": 194, - "title": "sed ut vero sit molestiae", - "completed": false - }, - { - "userId": 10, - "id": 195, - "title": "rerum ex veniam mollitia voluptatibus pariatur", - "completed": true - }, - { - "userId": 10, - "id": 196, - "title": "consequuntur aut ut fugit similique", - "completed": true - }, - { - "userId": 10, - "id": 197, - "title": "dignissimos quo nobis earum saepe", - "completed": true - }, - { - "userId": 10, - "id": 198, - "title": "quis eius est sint explicabo", - "completed": true - }, - { - "userId": 10, - "id": 199, - "title": "numquam repellendus a magnam", - "completed": true - }, - { - "userId": 10, - "id": 200, - "title": "ipsam aperiam voluptates qui", - "completed": false - } -] diff --git a/apps/example/.gitignore b/apps/example/.gitignore deleted file mode 100644 index c87c9b3..0000000 --- a/apps/example/.gitignore +++ /dev/null @@ -1,36 +0,0 @@ -# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. - -# dependencies -/node_modules -/.pnp -.pnp.js - -# testing -/coverage - -# next.js -/.next/ -/out/ - -# production -/build - -# misc -.DS_Store -*.pem - -# debug -npm-debug.log* -yarn-debug.log* -yarn-error.log* -.pnpm-debug.log* - -# local env files -.env*.local - -# vercel -.vercel - -# typescript -*.tsbuildinfo -next-env.d.ts diff --git a/apps/example/package-lock.json b/apps/example/package-lock.json deleted file mode 100644 index 18ad1c3..0000000 --- a/apps/example/package-lock.json +++ /dev/null @@ -1,918 +0,0 @@ -{ - "name": "example", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "example", - "dependencies": { - "next-rest-framework": "0.1.2" - } - }, - "../../node_modules/.pnpm/@sodaru+yup-to-json-schema@1.0.5/node_modules/@sodaru/yup-to-json-schema": { - "version": "1.0.5", - "license": "MIT License", - "dependencies": { - "lodash": "^4.17.20" - }, - "devDependencies": { - "@babel/core": "^7.12.10", - "@babel/preset-env": "^7.12.11", - "@babel/preset-typescript": "^7.12.7", - "@types/jest": "^26.0.20", - "@types/json-schema": "^7.0.7", - "@types/lodash": "^4.14.168", - "@types/yup": "^0.29.11", - "@typescript-eslint/eslint-plugin": "^4.14.0", - "@typescript-eslint/parser": "^4.14.0", - "babel-jest": "^26.6.3", - "eslint": "^7.18.0", - "eslint-import-resolver-typescript": "^2.3.0", - "eslint-plugin-import": "^2.22.1", - "jest": "^26.6.3", - "prettier": "^2.2.1", - "rimraf": "^3.0.2", - "typescript": "^4.1.3", - "yup": "^0.32.8" - } - }, - "../../node_modules/.pnpm/@types+jest@29.2.3/node_modules/@types/jest": { - "version": "29.2.3", - "dev": true, - "license": "MIT", - "dependencies": { - "expect": "^29.0.0", - "pretty-format": "^29.0.0" - } - }, - "../../node_modules/.pnpm/@types+js-yaml@4.0.5/node_modules/@types/js-yaml": { - "version": "4.0.5", - "dev": true, - "license": "MIT" - }, - "../../node_modules/.pnpm/@types+lodash.isequalwith@4.4.7/node_modules/@types/lodash.isequalwith": { - "version": "4.4.7", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/lodash": "*" - } - }, - "../../node_modules/.pnpm/@types+lodash.merge@4.6.7/node_modules/@types/lodash.merge": { - "version": "4.6.7", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/lodash": "*" - } - }, - "../../node_modules/.pnpm/chalk@4.1.2/node_modules/chalk": { - "version": "4.1.2", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "devDependencies": { - "ava": "^2.4.0", - "coveralls": "^3.0.7", - "execa": "^4.0.0", - "import-fresh": "^3.1.0", - "matcha": "^0.7.0", - "nyc": "^15.0.0", - "resolve-from": "^5.0.0", - "tsd": "^0.7.4", - "xo": "^0.28.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "../../node_modules/.pnpm/jest@29.3.1_odkjkoia5xunhxkdrka32ib6vi/node_modules/jest": { - "version": "29.3.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/core": "^29.3.1", - "@jest/types": "^29.3.1", - "import-local": "^3.0.2", - "jest-cli": "^29.3.1" - }, - "bin": { - "jest": "bin/jest.js" - }, - "devDependencies": { - "@tsd/typescript": "~4.8.2", - "tsd-lite": "^0.6.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "../../node_modules/.pnpm/js-yaml@4.1.0/node_modules/js-yaml": { - "version": "4.1.0", - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - }, - "devDependencies": { - "@rollup/plugin-commonjs": "^17.0.0", - "@rollup/plugin-node-resolve": "^11.0.0", - "ansi": "^0.3.1", - "benchmark": "^2.1.4", - "codemirror": "^5.13.4", - "eslint": "^7.0.0", - "fast-check": "^2.8.0", - "gh-pages": "^3.1.0", - "mocha": "^8.2.1", - "nyc": "^15.1.0", - "rollup": "^2.34.1", - "rollup-plugin-node-polyfills": "^0.2.1", - "rollup-plugin-terser": "^7.0.2", - "shelljs": "^0.8.4" - } - }, - "../../node_modules/.pnpm/json-to-zod@1.1.2/node_modules/json-to-zod": { - "version": "1.1.2", - "license": "ISC", - "dependencies": { - "prettier": "^2.3.2" - }, - "bin": { - "json-to-zod": "src/cli.js" - }, - "devDependencies": { - "@types/node": "^16.6.0", - "@types/prettier": "^2.3.2", - "copyfiles": "^2.4.1", - "rimraf": "^3.0.2", - "typescript": "^4.3.5", - "zod": "^3.7.1" - } - }, - "../../node_modules/.pnpm/lodash.isequalwith@4.4.0/node_modules/lodash.isequalwith": { - "version": "4.4.0", - "license": "MIT" - }, - "../../node_modules/.pnpm/lodash.merge@4.6.2/node_modules/lodash.merge": { - "version": "4.6.2", - "license": "MIT" - }, - "../../node_modules/.pnpm/node-mocks-http@1.12.1/node_modules/node-mocks-http": { - "version": "1.12.1", - "dev": true, - "license": "MIT", - "dependencies": { - "accepts": "^1.3.7", - "content-disposition": "^0.5.3", - "depd": "^1.1.0", - "fresh": "^0.5.2", - "merge-descriptors": "^1.0.1", - "methods": "^1.1.2", - "mime": "^1.3.4", - "parseurl": "^1.3.3", - "range-parser": "^1.2.0", - "type-is": "^1.6.18" - }, - "devDependencies": { - "@types/express": "^4.17.7", - "chai": "^4.2.0", - "eslint": "^7.7.0", - "gulp": "^4.0.2", - "gulp-eslint": "^6.0.0", - "gulp-istanbul": "^1.1.3", - "gulp-mocha": "^7.0.2", - "istanbul": "^0.4.5", - "mocha": "^8.1.1", - "sinon": "^9.0.3", - "sinon-chai": "^3.5.0" - }, - "engines": { - "node": ">=0.6" - } - }, - "../../node_modules/.pnpm/openapi-types@12.0.2/node_modules/openapi-types": { - "version": "12.0.2", - "dev": true, - "license": "MIT" - }, - "../../node_modules/.pnpm/ts-jest@29.0.3_gruvivcimsmdfhnjphbo3uejz4/node_modules/ts-jest": { - "version": "29.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "bs-logger": "0.x", - "fast-json-stable-stringify": "2.x", - "jest-util": "^29.0.0", - "json5": "^2.2.1", - "lodash.memoize": "4.x", - "make-error": "1.x", - "semver": "7.x", - "yargs-parser": "^21.0.1" - }, - "bin": { - "ts-jest": "cli.js" - }, - "devDependencies": { - "@commitlint/cli": "17.x", - "@commitlint/config-angular": "^17.1.0", - "@jest/transform": "^29.0.3", - "@jest/types": "^29.0.3", - "@types/babel__core": "7.x", - "@types/cross-spawn": "latest", - "@types/fs-extra": "latest", - "@types/js-yaml": "latest", - "@types/lodash.camelcase": "4.x", - "@types/lodash.memoize": "4.x", - "@types/lodash.set": "4.x", - "@types/micromatch": "4.x", - "@types/node": "17.0.35", - "@types/node-fetch": "^3.0.3", - "@types/react": "18.x", - "@types/rimraf": "^3.0.2", - "@types/semver": "latest", - "@types/yargs": "latest", - "@types/yargs-parser": "21.x", - "@typescript-eslint/eslint-plugin": "^5.38.1", - "@typescript-eslint/parser": "^5.38.1", - "babel-jest": "^29.0.3", - "conventional-changelog-cli": "2.x", - "cross-spawn": "latest", - "esbuild": "~0.15.9", - "eslint": "^8.24.0", - "eslint-config-prettier": "latest", - "eslint-plugin-import": "latest", - "eslint-plugin-jest": "latest", - "eslint-plugin-jsdoc": "latest", - "eslint-plugin-prefer-arrow": "latest", - "eslint-plugin-prettier": "latest", - "execa": "5.1.1", - "fs-extra": "10.x", - "glob": "^8.0.3", - "glob-gitignore": "latest", - "husky": "4.x", - "jest": "^29.0.3", - "jest-snapshot-serializer-raw": "^1.2.0", - "js-yaml": "latest", - "json-schema-to-typescript": "^11.0.2", - "lint-staged": "latest", - "lodash.camelcase": "^4.3.0", - "lodash.set": "^4.3.2", - "node-fetch": "^3.2.10", - "prettier": "^2.7.1", - "typescript": "~4.8.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": ">=7.0.0-beta.0 <8", - "@jest/types": "^29.0.0", - "babel-jest": "^29.0.0", - "jest": "^29.0.0", - "typescript": ">=4.3" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "@jest/types": { - "optional": true - }, - "babel-jest": { - "optional": true - }, - "esbuild": { - "optional": true - } - } - }, - "../../node_modules/.pnpm/ts-node@10.9.1_wup25etrarvlqkprac7h35hj7u/node_modules/ts-node": { - "version": "10.9.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "devDependencies": { - "@microsoft/api-extractor": "^7.19.4", - "@swc/core": ">=1.2.205", - "@swc/wasm": ">=1.2.205", - "@types/diff": "^4.0.2", - "@types/lodash": "^4.14.151", - "@types/node": "13.13.5", - "@types/proper-lockfile": "^4.1.2", - "@types/proxyquire": "^1.3.28", - "@types/react": "^16.14.19", - "@types/rimraf": "^3.0.0", - "@types/semver": "^7.1.0", - "@yarnpkg/fslib": "^2.4.0", - "ava": "^3.15.0", - "axios": "^0.21.1", - "dprint": "^0.25.0", - "expect": "^27.0.2", - "get-stream": "^6.0.0", - "lodash": "^4.17.15", - "ntypescript": "^1.201507091536.1", - "nyc": "^15.0.1", - "outdent": "^0.8.0", - "proper-lockfile": "^4.1.2", - "proxyquire": "^2.0.0", - "react": "^16.14.0", - "rimraf": "^3.0.0", - "semver": "^7.1.3", - "throat": "^6.0.1", - "typedoc": "^0.22.10", - "typescript": "4.7.4", - "typescript-json-schema": "^0.53.0", - "util.promisify": "^1.0.1" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "../../node_modules/.pnpm/typescript@4.9.3/node_modules/typescript": { - "version": "4.9.3", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "devDependencies": { - "@octokit/rest": "latest", - "@types/chai": "latest", - "@types/fancy-log": "^2.0.0", - "@types/fs-extra": "^9.0.13", - "@types/glob": "latest", - "@types/gulp": "^4.0.9", - "@types/gulp-concat": "latest", - "@types/gulp-newer": "latest", - "@types/gulp-rename": "latest", - "@types/gulp-sourcemaps": "latest", - "@types/merge2": "latest", - "@types/microsoft__typescript-etw": "latest", - "@types/minimist": "latest", - "@types/mkdirp": "latest", - "@types/mocha": "latest", - "@types/ms": "latest", - "@types/node": "latest", - "@types/source-map-support": "latest", - "@types/which": "^2.0.1", - "@types/xml2js": "^0.4.11", - "@typescript-eslint/eslint-plugin": "^5.33.1", - "@typescript-eslint/parser": "^5.33.1", - "@typescript-eslint/utils": "^5.33.1", - "azure-devops-node-api": "^11.2.0", - "chai": "latest", - "chalk": "^4.1.2", - "del": "^6.1.1", - "diff": "^5.1.0", - "eslint": "^8.22.0", - "eslint-formatter-autolinkable-stylish": "^1.2.0", - "eslint-plugin-import": "^2.26.0", - "eslint-plugin-jsdoc": "^39.3.6", - "eslint-plugin-local": "^1.0.0", - "eslint-plugin-no-null": "^1.0.2", - "fancy-log": "latest", - "fs-extra": "^9.1.0", - "glob": "latest", - "gulp": "^4.0.2", - "gulp-concat": "latest", - "gulp-insert": "latest", - "gulp-newer": "latest", - "gulp-rename": "latest", - "gulp-sourcemaps": "latest", - "merge2": "latest", - "minimist": "latest", - "mkdirp": "latest", - "mocha": "latest", - "mocha-fivemat-progress-reporter": "latest", - "ms": "^2.1.3", - "node-fetch": "^3.2.10", - "source-map-support": "latest", - "typescript": "^4.8.4", - "vinyl": "latest", - "which": "^2.0.2", - "xml2js": "^0.4.23" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "../../node_modules/.pnpm/zod-to-json-schema@3.19.0_zod@3.19.1/node_modules/zod-to-json-schema": { - "version": "3.19.0", - "license": "ISC", - "devDependencies": { - "@types/jest": "^26.0.24", - "@types/json-schema": "^7.0.9", - "ajv": "^8.6.3", - "ajv-formats": "^2.1.1", - "jest": "^26.6.3", - "json-schema-deref-sync": "^0.14.0", - "rimraf": "^3.0.2", - "ts-jest": "^26.5.2", - "typescript": "^4.4.3", - "zod": "^3.19.0" - }, - "peerDependencies": { - "zod": "^3.19.0" - } - }, - "../../packages/next-rest-framework": { - "version": "0.1.2", - "license": "ISC", - "dependencies": { - "@sodaru/yup-to-json-schema": "1.0.5", - "chalk": "4.1.2", - "js-yaml": "4.1.0", - "json-to-zod": "1.1.2", - "lodash.isequalwith": "4.4.0", - "lodash.merge": "4.6.2", - "zod-to-json-schema": "3.19.0" - }, - "devDependencies": { - "@types/jest": "29.2.3", - "@types/js-yaml": "4.0.5", - "@types/lodash.isequalwith": "4.4.7", - "@types/lodash.merge": "4.6.7", - "jest": "29.3.1", - "node-mocks-http": "1.12.1", - "openapi-types": "12.0.2", - "ts-jest": "29.0.3", - "ts-node": "10.9.1", - "typescript": "*" - }, - "engines": { - "node": "^14.15.0 || ^16.13.0 || ^18.12.0" - } - }, - "../../packages/next-rest-framework/node_modules/@sodaru/yup-to-json-schema": { - "resolved": "../../node_modules/.pnpm/@sodaru+yup-to-json-schema@1.0.5/node_modules/@sodaru/yup-to-json-schema", - "link": true - }, - "../../packages/next-rest-framework/node_modules/@types/jest": { - "resolved": "../../node_modules/.pnpm/@types+jest@29.2.3/node_modules/@types/jest", - "link": true - }, - "../../packages/next-rest-framework/node_modules/@types/js-yaml": { - "resolved": "../../node_modules/.pnpm/@types+js-yaml@4.0.5/node_modules/@types/js-yaml", - "link": true - }, - "../../packages/next-rest-framework/node_modules/@types/lodash.isequalwith": { - "resolved": "../../node_modules/.pnpm/@types+lodash.isequalwith@4.4.7/node_modules/@types/lodash.isequalwith", - "link": true - }, - "../../packages/next-rest-framework/node_modules/@types/lodash.merge": { - "resolved": "../../node_modules/.pnpm/@types+lodash.merge@4.6.7/node_modules/@types/lodash.merge", - "link": true - }, - "../../packages/next-rest-framework/node_modules/chalk": { - "resolved": "../../node_modules/.pnpm/chalk@4.1.2/node_modules/chalk", - "link": true - }, - "../../packages/next-rest-framework/node_modules/jest": { - "resolved": "../../node_modules/.pnpm/jest@29.3.1_odkjkoia5xunhxkdrka32ib6vi/node_modules/jest", - "link": true - }, - "../../packages/next-rest-framework/node_modules/js-yaml": { - "resolved": "../../node_modules/.pnpm/js-yaml@4.1.0/node_modules/js-yaml", - "link": true - }, - "../../packages/next-rest-framework/node_modules/json-to-zod": { - "resolved": "../../node_modules/.pnpm/json-to-zod@1.1.2/node_modules/json-to-zod", - "link": true - }, - "../../packages/next-rest-framework/node_modules/lodash.isequalwith": { - "resolved": "../../node_modules/.pnpm/lodash.isequalwith@4.4.0/node_modules/lodash.isequalwith", - "link": true - }, - "../../packages/next-rest-framework/node_modules/lodash.merge": { - "resolved": "../../node_modules/.pnpm/lodash.merge@4.6.2/node_modules/lodash.merge", - "link": true - }, - "../../packages/next-rest-framework/node_modules/node-mocks-http": { - "resolved": "../../node_modules/.pnpm/node-mocks-http@1.12.1/node_modules/node-mocks-http", - "link": true - }, - "../../packages/next-rest-framework/node_modules/openapi-types": { - "resolved": "../../node_modules/.pnpm/openapi-types@12.0.2/node_modules/openapi-types", - "link": true - }, - "../../packages/next-rest-framework/node_modules/ts-jest": { - "resolved": "../../node_modules/.pnpm/ts-jest@29.0.3_gruvivcimsmdfhnjphbo3uejz4/node_modules/ts-jest", - "link": true - }, - "../../packages/next-rest-framework/node_modules/ts-node": { - "resolved": "../../node_modules/.pnpm/ts-node@10.9.1_wup25etrarvlqkprac7h35hj7u/node_modules/ts-node", - "link": true - }, - "../../packages/next-rest-framework/node_modules/typescript": { - "resolved": "../../node_modules/.pnpm/typescript@4.9.3/node_modules/typescript", - "link": true - }, - "../../packages/next-rest-framework/node_modules/zod-to-json-schema": { - "resolved": "../../node_modules/.pnpm/zod-to-json-schema@3.19.0_zod@3.19.1/node_modules/zod-to-json-schema", - "link": true - }, - "node_modules/next-rest-framework": { - "resolved": "../../packages/next-rest-framework", - "link": true - } - }, - "dependencies": { - "next-rest-framework": { - "version": "file:../../packages/next-rest-framework", - "requires": { - "@sodaru/yup-to-json-schema": "1.0.5", - "@types/jest": "29.2.3", - "@types/js-yaml": "4.0.5", - "@types/lodash.isequalwith": "4.4.7", - "@types/lodash.merge": "4.6.7", - "chalk": "4.1.2", - "jest": "29.3.1", - "js-yaml": "4.1.0", - "json-to-zod": "1.1.2", - "lodash.isequalwith": "4.4.0", - "lodash.merge": "4.6.2", - "node-mocks-http": "1.12.1", - "openapi-types": "12.0.2", - "ts-jest": "29.0.3", - "ts-node": "10.9.1", - "typescript": "*", - "zod-to-json-schema": "3.19.0" - }, - "dependencies": { - "@sodaru/yup-to-json-schema": { - "version": "file:../../node_modules/.pnpm/@sodaru+yup-to-json-schema@1.0.5/node_modules/@sodaru/yup-to-json-schema", - "requires": { - "@babel/core": "^7.12.10", - "@babel/preset-env": "^7.12.11", - "@babel/preset-typescript": "^7.12.7", - "@types/jest": "^26.0.20", - "@types/json-schema": "^7.0.7", - "@types/lodash": "^4.14.168", - "@types/yup": "^0.29.11", - "@typescript-eslint/eslint-plugin": "^4.14.0", - "@typescript-eslint/parser": "^4.14.0", - "babel-jest": "^26.6.3", - "eslint": "^7.18.0", - "eslint-import-resolver-typescript": "^2.3.0", - "eslint-plugin-import": "^2.22.1", - "jest": "^26.6.3", - "lodash": "^4.17.20", - "prettier": "^2.2.1", - "rimraf": "^3.0.2", - "typescript": "^4.1.3", - "yup": "^0.32.8" - } - }, - "@types/jest": { - "version": "file:../../node_modules/.pnpm/@types+jest@29.2.3/node_modules/@types/jest", - "requires": { - "expect": "^29.0.0", - "pretty-format": "^29.0.0" - } - }, - "@types/js-yaml": { - "version": "file:../../node_modules/.pnpm/@types+js-yaml@4.0.5/node_modules/@types/js-yaml" - }, - "@types/lodash.isequalwith": { - "version": "file:../../node_modules/.pnpm/@types+lodash.isequalwith@4.4.7/node_modules/@types/lodash.isequalwith", - "requires": { - "@types/lodash": "*" - } - }, - "@types/lodash.merge": { - "version": "file:../../node_modules/.pnpm/@types+lodash.merge@4.6.7/node_modules/@types/lodash.merge", - "requires": { - "@types/lodash": "*" - } - }, - "chalk": { - "version": "file:../../node_modules/.pnpm/chalk@4.1.2/node_modules/chalk", - "requires": { - "ansi-styles": "^4.1.0", - "ava": "^2.4.0", - "coveralls": "^3.0.7", - "execa": "^4.0.0", - "import-fresh": "^3.1.0", - "matcha": "^0.7.0", - "nyc": "^15.0.0", - "resolve-from": "^5.0.0", - "supports-color": "^7.1.0", - "tsd": "^0.7.4", - "xo": "^0.28.2" - } - }, - "jest": { - "version": "file:../../node_modules/.pnpm/jest@29.3.1_odkjkoia5xunhxkdrka32ib6vi/node_modules/jest", - "requires": { - "@jest/core": "^29.3.1", - "@jest/types": "^29.3.1", - "@tsd/typescript": "~4.8.2", - "import-local": "^3.0.2", - "jest-cli": "^29.3.1", - "tsd-lite": "^0.6.0" - } - }, - "js-yaml": { - "version": "file:../../node_modules/.pnpm/js-yaml@4.1.0/node_modules/js-yaml", - "requires": { - "@rollup/plugin-commonjs": "^17.0.0", - "@rollup/plugin-node-resolve": "^11.0.0", - "ansi": "^0.3.1", - "argparse": "^2.0.1", - "benchmark": "^2.1.4", - "codemirror": "^5.13.4", - "eslint": "^7.0.0", - "fast-check": "^2.8.0", - "gh-pages": "^3.1.0", - "mocha": "^8.2.1", - "nyc": "^15.1.0", - "rollup": "^2.34.1", - "rollup-plugin-node-polyfills": "^0.2.1", - "rollup-plugin-terser": "^7.0.2", - "shelljs": "^0.8.4" - } - }, - "json-to-zod": { - "version": "file:../../node_modules/.pnpm/json-to-zod@1.1.2/node_modules/json-to-zod", - "requires": { - "@types/node": "^16.6.0", - "@types/prettier": "^2.3.2", - "copyfiles": "^2.4.1", - "prettier": "^2.3.2", - "rimraf": "^3.0.2", - "typescript": "^4.3.5", - "zod": "^3.7.1" - } - }, - "lodash.isequalwith": { - "version": "file:../../node_modules/.pnpm/lodash.isequalwith@4.4.0/node_modules/lodash.isequalwith" - }, - "lodash.merge": { - "version": "file:../../node_modules/.pnpm/lodash.merge@4.6.2/node_modules/lodash.merge" - }, - "node-mocks-http": { - "version": "file:../../node_modules/.pnpm/node-mocks-http@1.12.1/node_modules/node-mocks-http", - "requires": { - "@types/express": "^4.17.7", - "accepts": "^1.3.7", - "chai": "^4.2.0", - "content-disposition": "^0.5.3", - "depd": "^1.1.0", - "eslint": "^7.7.0", - "fresh": "^0.5.2", - "gulp": "^4.0.2", - "gulp-eslint": "^6.0.0", - "gulp-istanbul": "^1.1.3", - "gulp-mocha": "^7.0.2", - "istanbul": "^0.4.5", - "merge-descriptors": "^1.0.1", - "methods": "^1.1.2", - "mime": "^1.3.4", - "mocha": "^8.1.1", - "parseurl": "^1.3.3", - "range-parser": "^1.2.0", - "sinon": "^9.0.3", - "sinon-chai": "^3.5.0", - "type-is": "^1.6.18" - } - }, - "openapi-types": { - "version": "file:../../node_modules/.pnpm/openapi-types@12.0.2/node_modules/openapi-types" - }, - "ts-jest": { - "version": "file:../../node_modules/.pnpm/ts-jest@29.0.3_gruvivcimsmdfhnjphbo3uejz4/node_modules/ts-jest", - "requires": { - "@commitlint/cli": "17.x", - "@commitlint/config-angular": "^17.1.0", - "@jest/transform": "^29.0.3", - "@jest/types": "^29.0.3", - "@types/babel__core": "7.x", - "@types/cross-spawn": "latest", - "@types/fs-extra": "latest", - "@types/js-yaml": "latest", - "@types/lodash.camelcase": "4.x", - "@types/lodash.memoize": "4.x", - "@types/lodash.set": "4.x", - "@types/micromatch": "4.x", - "@types/node": "17.0.35", - "@types/node-fetch": "^3.0.3", - "@types/react": "18.x", - "@types/rimraf": "^3.0.2", - "@types/semver": "latest", - "@types/yargs": "latest", - "@types/yargs-parser": "21.x", - "@typescript-eslint/eslint-plugin": "^5.38.1", - "@typescript-eslint/parser": "^5.38.1", - "babel-jest": "^29.0.3", - "bs-logger": "0.x", - "conventional-changelog-cli": "2.x", - "cross-spawn": "latest", - "esbuild": "~0.15.9", - "eslint": "^8.24.0", - "eslint-config-prettier": "latest", - "eslint-plugin-import": "latest", - "eslint-plugin-jest": "latest", - "eslint-plugin-jsdoc": "latest", - "eslint-plugin-prefer-arrow": "latest", - "eslint-plugin-prettier": "latest", - "execa": "5.1.1", - "fast-json-stable-stringify": "2.x", - "fs-extra": "10.x", - "glob": "^8.0.3", - "glob-gitignore": "latest", - "husky": "4.x", - "jest": "^29.0.3", - "jest-snapshot-serializer-raw": "^1.2.0", - "jest-util": "^29.0.0", - "js-yaml": "latest", - "json-schema-to-typescript": "^11.0.2", - "json5": "^2.2.1", - "lint-staged": "latest", - "lodash.camelcase": "^4.3.0", - "lodash.memoize": "4.x", - "lodash.set": "^4.3.2", - "make-error": "1.x", - "node-fetch": "^3.2.10", - "prettier": "^2.7.1", - "semver": "7.x", - "typescript": "~4.8.3", - "yargs-parser": "^21.0.1" - } - }, - "ts-node": { - "version": "file:../../node_modules/.pnpm/ts-node@10.9.1_wup25etrarvlqkprac7h35hj7u/node_modules/ts-node", - "requires": { - "@cspotcode/source-map-support": "^0.8.0", - "@microsoft/api-extractor": "^7.19.4", - "@swc/core": ">=1.2.205", - "@swc/wasm": ">=1.2.205", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "@types/diff": "^4.0.2", - "@types/lodash": "^4.14.151", - "@types/node": "13.13.5", - "@types/proper-lockfile": "^4.1.2", - "@types/proxyquire": "^1.3.28", - "@types/react": "^16.14.19", - "@types/rimraf": "^3.0.0", - "@types/semver": "^7.1.0", - "@yarnpkg/fslib": "^2.4.0", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "ava": "^3.15.0", - "axios": "^0.21.1", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "dprint": "^0.25.0", - "expect": "^27.0.2", - "get-stream": "^6.0.0", - "lodash": "^4.17.15", - "make-error": "^1.1.1", - "ntypescript": "^1.201507091536.1", - "nyc": "^15.0.1", - "outdent": "^0.8.0", - "proper-lockfile": "^4.1.2", - "proxyquire": "^2.0.0", - "react": "^16.14.0", - "rimraf": "^3.0.0", - "semver": "^7.1.3", - "throat": "^6.0.1", - "typedoc": "^0.22.10", - "typescript": "4.7.4", - "typescript-json-schema": "^0.53.0", - "util.promisify": "^1.0.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - } - }, - "typescript": { - "version": "file:../../node_modules/.pnpm/typescript@4.9.3/node_modules/typescript", - "requires": { - "@octokit/rest": "latest", - "@types/chai": "latest", - "@types/fancy-log": "^2.0.0", - "@types/fs-extra": "^9.0.13", - "@types/glob": "latest", - "@types/gulp": "^4.0.9", - "@types/gulp-concat": "latest", - "@types/gulp-newer": "latest", - "@types/gulp-rename": "latest", - "@types/gulp-sourcemaps": "latest", - "@types/merge2": "latest", - "@types/microsoft__typescript-etw": "latest", - "@types/minimist": "latest", - "@types/mkdirp": "latest", - "@types/mocha": "latest", - "@types/ms": "latest", - "@types/node": "latest", - "@types/source-map-support": "latest", - "@types/which": "^2.0.1", - "@types/xml2js": "^0.4.11", - "@typescript-eslint/eslint-plugin": "^5.33.1", - "@typescript-eslint/parser": "^5.33.1", - "@typescript-eslint/utils": "^5.33.1", - "azure-devops-node-api": "^11.2.0", - "chai": "latest", - "chalk": "^4.1.2", - "del": "^6.1.1", - "diff": "^5.1.0", - "eslint": "^8.22.0", - "eslint-formatter-autolinkable-stylish": "^1.2.0", - "eslint-plugin-import": "^2.26.0", - "eslint-plugin-jsdoc": "^39.3.6", - "eslint-plugin-local": "^1.0.0", - "eslint-plugin-no-null": "^1.0.2", - "fancy-log": "latest", - "fs-extra": "^9.1.0", - "glob": "latest", - "gulp": "^4.0.2", - "gulp-concat": "latest", - "gulp-insert": "latest", - "gulp-newer": "latest", - "gulp-rename": "latest", - "gulp-sourcemaps": "latest", - "merge2": "latest", - "minimist": "latest", - "mkdirp": "latest", - "mocha": "latest", - "mocha-fivemat-progress-reporter": "latest", - "ms": "^2.1.3", - "node-fetch": "^3.2.10", - "source-map-support": "latest", - "typescript": "^4.8.4", - "vinyl": "latest", - "which": "^2.0.2", - "xml2js": "^0.4.23" - } - }, - "zod-to-json-schema": { - "version": "file:../../node_modules/.pnpm/zod-to-json-schema@3.19.0_zod@3.19.1/node_modules/zod-to-json-schema", - "requires": { - "@types/jest": "^26.0.24", - "@types/json-schema": "^7.0.9", - "ajv": "^8.6.3", - "ajv-formats": "^2.1.1", - "jest": "^26.6.3", - "json-schema-deref-sync": "^0.14.0", - "rimraf": "^3.0.2", - "ts-jest": "^26.5.2", - "typescript": "^4.4.3", - "zod": "^3.19.0" - } - } - } - } - } -} diff --git a/apps/example/package.json b/apps/example/package.json index bcdf89e..e270537 100644 --- a/apps/example/package.json +++ b/apps/example/package.json @@ -8,6 +8,6 @@ "type-check": "tsc --noEmit" }, "dependencies": { - "next-rest-framework": "0.1.2" + "next-rest-framework": "0.2.0" } } diff --git a/apps/example/pages/api/yup.ts b/apps/example/pages/api/yup.ts new file mode 100644 index 0000000..7233271 --- /dev/null +++ b/apps/example/pages/api/yup.ts @@ -0,0 +1,31 @@ +import { defineEndpoints } from 'next-rest-framework/client'; +import { object, string } from 'yup'; + +export default defineEndpoints({ + POST: { + input: { + contentType: 'application/json', + schema: object({ + foo: string() + }) + }, + output: [ + { + status: 200, + contentType: 'application/json', + schema: object({ + bar: string() + }) + } + ], + handler: async ({ + res, + req: { + body: { foo } + } + }) => { + res.setHeader('content-type', 'application/json'); + res.status(200).json({ bar: foo }); + } + } +}); diff --git a/apps/example/pages/api/example.ts b/apps/example/pages/api/zod.ts similarity index 65% rename from apps/example/pages/api/example.ts rename to apps/example/pages/api/zod.ts index 880b735..ef369bd 100644 --- a/apps/example/pages/api/example.ts +++ b/apps/example/pages/api/zod.ts @@ -1,18 +1,18 @@ -import { object, string } from 'zod'; import { defineEndpoints } from 'next-rest-framework/client'; +import { object, string } from 'zod'; export default defineEndpoints({ POST: { - requestBody: { + input: { contentType: 'application/json', schema: object({ - bar: string() + foo: string() }) }, - responses: [ + output: [ { status: 200, - contentType: 'text/html', + contentType: 'application/json', schema: object({ bar: string() }) @@ -21,11 +21,11 @@ export default defineEndpoints({ handler: async ({ res, req: { - body: { bar } + body: { foo } } }) => { - res.setHeader('content-type', 'text/html'); - res.status(200).json({ bar }); + res.setHeader('content-type', 'application/json'); + res.status(200).json({ bar: foo }); } } }); diff --git a/docs/.gitignore b/docs/.gitignore deleted file mode 100644 index b2d6de3..0000000 --- a/docs/.gitignore +++ /dev/null @@ -1,20 +0,0 @@ -# Dependencies -/node_modules - -# Production -/build - -# Generated files -.docusaurus -.cache-loader - -# Misc -.DS_Store -.env.local -.env.development.local -.env.test.local -.env.production.local - -npm-debug.log* -yarn-debug.log* -yarn-error.log* diff --git a/docs/.npmrc b/docs/.npmrc deleted file mode 100644 index 3e775ef..0000000 --- a/docs/.npmrc +++ /dev/null @@ -1 +0,0 @@ -auto-install-peers=true diff --git a/docs/package.json b/docs/package.json index b23d35b..15b8704 100644 --- a/docs/package.json +++ b/docs/package.json @@ -16,7 +16,7 @@ "dependencies": { "@docusaurus/core": "2.2.0", "@docusaurus/preset-classic": "2.2.0", - "@docusaurus/theme-classic": "^2.2.0", + "@docusaurus/theme-classic": "2.2.0", "@mdx-js/react": "1.6.22", "clsx": "1.2.1", "prism-react-renderer": "1.3.5" @@ -37,8 +37,5 @@ "last 1 firefox version", "last 1 safari version" ] - }, - "engines": { - "node": ">=16.14" } } diff --git a/packages/next-rest-framework/.gitignore b/packages/next-rest-framework/.gitignore deleted file mode 100644 index e86ef84..0000000 --- a/packages/next-rest-framework/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -coverage -dist \ No newline at end of file diff --git a/packages/next-rest-framework/README.md b/packages/next-rest-framework/README.md index f6d45dc..3bc34fe 100644 --- a/packages/next-rest-framework/README.md +++ b/packages/next-rest-framework/README.md @@ -38,8 +38,8 @@ - [Config options](#config-options) - [Route config](#route-config) - [Method handlers](#method-handlers) - - [Request body](#request-body) - - [Response object](#response-object) + - [Input](#input) + - [Output object](#output-object) - [Handler](#handler) - [Middlewares](#middlewares) - [Global middleware](#global-middleware) @@ -67,7 +67,7 @@ This is a monorepo containing the following packages / projects: ### Lightweight, type-safe, easy to use - Designed to work with TypeScript so that your request bodies, responses, headers etc. are strongly typed. -- Object-schema validation with popular libraries like [Zod](https://github.com/colinhacks/zod) or [Yup](https://github.com/jquense/yup) +- Object-schema validation with popular libraries like [Zod](https://github.com/colinhacks/zod) or [Yup](https://github.com/jquense/yup). These schemas are automatically converted to JSON schema format for the auto-generated OpenAPI specifications. - Supports auto-generated openapi.json and openapi.yaml documents for which you can include your existing OpenAPI specification. - Supports any kind of middleware logic that you want to use for authentication etc. See more in [Middlewares](#middlewares). Also works with other Next.js server-side libraries, like [NextAuth.js](#https://github.com/nextauthjs/next-auth). - Fully customizable - You can decide which routes Next REST Framework will use to serve your API docs etc. and it can be easily customized to work with any kind of existing Next.js REST API. @@ -125,13 +125,13 @@ All of these are configurable with the [Config options](#config-options) that yo ```typescript // pages/api/todos.ts -import { object, string, number, boolean, array } from 'zod'; import { defineEndpoints } from 'next-rest-framework/client'; +import { z } from 'zod'; const todoSchema = object({ - id: string(), - name: string(), - completed: boolean() + id: z.string(), + name: z.string(), + completed: z.boolean() }); export default defineEndpoints({ @@ -140,39 +140,33 @@ export default defineEndpoints({ { status: 200, contentType: 'application/json', - schema: object({ - data: array(todoSchema) - }) + schema: z.array(todoSchema) } ], handler: ({ res }) => { // Using any other content type, status code or response data format will lead to TS error. res.setHeader('content-type', 'application/json'); - res.status(200).json({ - data: [ - { - id: 'foo', - name: 'bar', - completed: true - } - ] - }); + res.status(200).json([ + { + id: 'foo', + name: 'bar', + completed: true + } + ]); } }, POST: { - requestBody: { + request: { contentType: 'application/json', - schema: object({ - name: string() + schema: z.object({ + name: z.string() }) }, responses: [ { status: 201, contentType: 'application/json', - schema: object({ - data: todoSchema - }) + schema: todoSchema } ], handler: ({ @@ -199,65 +193,57 @@ These type-safe endpoints will be now auto-generated to your OpenAPI spec and Sw The optional config options allow you to customize Next REST Framework. The following options can be passed as a parameter for your `NextRestFramework` client in an object: -| Name | Description | -| ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `openApiSpec` | Your custom [OpenAPI Object](https://swagger.io/specification/#openapi-object) that will be merged with the auto-generated spec. Defaults to a minimum config required for the OpenAPI spec generation. | -| `openApiJsonPath` | Custom path for serving `openapi.json` file. Defaults to `/api/openapi.json`. | -| `openApiYamlPath` | Custom path for serving `openapi.yaml` file. Defaults to `/api/openapi.yaml`. | -| `swaggerUiPath` | Custom path for service Swagger UI. Defaults to `/api`. | -| `exposeOpenApiSpec` | Setting this to `false` will serve none of the OpenAPI documents neither the Swagger UI. Defaults to `true`. | -| `middleware` | A global middleware for all of your API routes. See [Global middleware](#global-middleware) for more information. | -| `errorHandler` | A [Global error handler](#global-error-handler) for all of your API routes. Defaults to a basic error handler logging the errors in non-production mode. | -| `suppressInfo` | Setting this to `true` will suppress all informational logs from Next REST Framework. Defaults to `false`. | +| Name | Description | +| ------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `openApiSpec` | An [OpenAPI Object](https://swagger.io/specification/#openapi-object) that can be used to override and extend the auto-generated specification. | +| `openApiJsonPath` | Custom path for serving `openapi.json` file. Defaults to `/api/openapi.json`. | +| `openApiYamlPath` | Custom path for serving `openapi.yaml` file. Defaults to `/api/openapi.yaml`. | +| `swaggerUiPath` | Custom path for service Swagger UI. Defaults to `/api`. | +| `exposeOpenApiSpec` | Setting this to `false` will serve none of the OpenAPI documents neither the Swagger UI. Defaults to `true`. | +| `middleware` | A global middleware for all of your API routes. See [Global middleware](#global-middleware) for more information. | +| `errorHandler` | A [Global error handler](#global-error-handler) for all of your API routes. Defaults to a basic error handler logging the errors in non-production mode. | +| `suppressInfo` | Setting this to `true` will suppress all informational logs from Next REST Framework. Defaults to `false`. | ## [Route config](#route-config) In addition to your method handlers, `middleware` and `errorHandler`, you can also configure OpenAPI [Path Item Object](https://swagger.io/specification/#path-item-object) parameters for your API route and they will automatically become part of your auto-generated OpenAPI spec The following options can be passed as a parameter for your `defineCatchAllHandler` and `defineEndpoints` in an object: -| Name | Description | Required | -| ------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- | -| `GET \| PUT \| POST \| DELETE \| OPTIONS \| HEAD \| PATCH \| TRACE` | A [Method handler](#method-handlers) object. | `true` | -| `middleware` |  A [Middleware](#middlewares) function that takes in the return values from your [Global middleware](#global-middleware). | `false` | -| `errorHandler` | A [Route error handler](#route-error-handler) for this API route, overriding the [Global error handler](#global-error-handler). | `false` | -| `$ref` | A reference to another [Path Item Object](https://swagger.io/specification/#path-item-object). | `false` | -| `description` | A string description, intended to apply to all operations in this path. [CommonMark syntax](https://spec.commonmark.org/) MAY be used for rich text representation. | `false` | -| `servers` | An array of [Server Objects](https://swagger.io/specification/#server-object). | `false` | -| `parameters` | An array of [Parameter objects](#https://swagger.io/specification/#parameter-object) or [Reference objects](https://swagger.io/specification/#reference-object). | `false` | +| Name | Description | Required | +| ------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- | +| `GET \| PUT \| POST \| DELETE \| OPTIONS \| HEAD \| PATCH \| TRACE` | A [Method handler](#method-handlers) object. | `true` | +| `middleware` |  A [Middleware](#middlewares) function that takes in the return values from your [Global middleware](#global-middleware). | `false` | +| `errorHandler` | A [Route error handler](#route-error-handler) for this API route, overriding the [Global error handler](#global-error-handler). | `false` | +| `openApiSpec` | An OpenAPI [Path Item Object](https://swagger.io/specification/#path-item-object) that can be used to override and extend the auto-generated and higher level specifications. | `false` | ### [Method handlers](#method-handlers) | Name | Description | Required | | -------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- | -| `requestBody` | A [Request body](#request-body) object. | `false` | -| `responses` | An array of [Response objects](#response-object). |  `true` | +| `input` | An [Input object](#input-object) object. | `false` | +| `output` | An array of [Output objects](#output-object). |  `true` | | `middleware` | A [Middleware](#middlewares) function that takes in the return values from both your [Global middleware](#global-middleware) and [Route middleware](#route-middleware). |  `false` | | `handler` |  Your [Handler](#handler) function that takes in your typed request, response and [Middleware](#middlewares) parameters and contains all of your business logic. | `true` | | `errorHandler` | A [Method error handler](#method-error-handler) for this method, overriding both the [Global error handler](#global-error-handler) and [Route error handler](#route-error-handler). | `false` | +| `openApiSpec` | An OpenAPI [Operation object](https://swagger.io/specification/#operation-object) that can be used to override and extend the auto-generated and higher level specifications. | `false` | + +#### [Input](#input-object) -#### [Request body](#request-body) +The input object is used for the validation of the incoming request: -The required properties are used for internal type-checking and the optional properties are used for OpenAPI spec generation and come from the OpenAPI [Request Body Object](https://swagger.io/specification/#request-body-object) and [Media Type Object](https://swagger.io/specification/#media-type-object) specification. +| Name | Description | Required | +| ------------- | ------------------------------------------------------------------------------------------------------------------------------------- | -------- | +| `contentType` | The content type that the request must have - request with no content type or incorrect content type will get an error response. | `true` | +| `schema` | A [Zod](https://github.com/colinhacks/zod) or [Yup](https://github.com/jquense/yup) schema describing the format of the request body. | `true` | -| Name | Description | Required | -| ------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- | -| `contentType` | The content type that all requests must have - requests with no content type or incorrect content type will get an error response. | `true` | -| `schema` | A [Zod](https://github.com/colinhacks/zod) or [Yup](https://github.com/jquense/yup) schema describing the format of the request body. | `true` | -| `description` |  A brief description of the request body. This could contain examples of use. [CommonMark syntax](https://spec.commonmark.org/) MAY be used for rich text representation. |  `false` | -| `required` | Determines if the request body is required in the request. All requests without a body will get an error response when this is set to `true`. Defaults to `false`. | `false` | -| `example` | An example object matching the `schema`. | `false` | -| `examples` | A mapping of [Example Objects](https://swagger.io/specification/#example-object) or [Reference Objects](#https://swagger.io/specification/#reference-object) matching the `schema`. |  `false` | -| `encoding` | A mapping of [Encoding Objects](https://swagger.io/specification/#encoding-object). |  `false` | +#### [Output object](#output-object) -#### [Response object](#response-object) +The output objects define what kind of responses you are allowed to return from your API handlers: | Name | Description | Required | | ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------- | -| `description` | A short description of the response. [CommonMark syntax](https://spec.commonmark.org/) MAY be used for rich text representation. |  `true` | -| `status` | A possible status code returned by your API route. | `true` | -| `contentType` | The content type of the response. Using any other content-type will lead to a TS error. | `true` | -| `schema` | A [Zod](https://github.com/colinhacks/zod) or [Yup](https://github.com/jquense/yup) schema describing the format of the response data. All response data not matching to the schema will lead to a TS error. |  `true` | -| `headers` | A mapping of headers to [Header Objects](https://swagger.io/specification/#header-object) or [Reference Objects](https://swagger.io/specification/#reference-object). | `false` | -| `links` |  A mapping of [Link Objects](https://swagger.io/specification/#link-object) or [Reference Objects](https://swagger.io/specification/#reference-object). | `false` | +| `status` | A possible status code that your API can return - using other status codes will lead to a TS error. | `true` | +| `contentType` | The content type of the response - using other content-types will lead to a TS error. | `true` | +| `schema` | A [Zod](https://github.com/colinhacks/zod) or [Yup](https://github.com/jquense/yup) schema describing the format of the response data. A response format not matching to the schema will lead to a TS error. |  `true` | #### [Handler](#handler) diff --git a/packages/next-rest-framework/package.json b/packages/next-rest-framework/package.json index e525030..19dfe44 100644 --- a/packages/next-rest-framework/package.json +++ b/packages/next-rest-framework/package.json @@ -1,6 +1,6 @@ { "name": "next-rest-framework", - "version": "0.1.2", + "version": "0.2.0", "description": "Next REST Framework - write type-safe, self-documenting REST APIs in Next.js", "keywords": [ "nextjs", @@ -16,8 +16,7 @@ "license": "ISC", "author": "Markus Blomqvist ", "files": [ - "dist", - "logo.svg" + "dist" ], "main": "dist/index.js", "repository": { @@ -33,27 +32,22 @@ "test:watch": "jest --watch" }, "dependencies": { - "@sodaru/yup-to-json-schema": "1.0.5", "chalk": "4.1.2", "js-yaml": "4.1.0", - "json-to-zod": "1.1.2", "lodash.isequalwith": "4.4.0", - "lodash.merge": "4.6.2", - "zod-to-json-schema": "3.19.0" + "lodash.merge": "4.6.2" }, "devDependencies": { + "@next-rest-framework/tsconfig": "workspace:*", "@types/jest": "29.2.3", "@types/js-yaml": "4.0.5", - "@types/lodash.merge": "4.6.7", "@types/lodash.isequalwith": "4.4.7", + "@types/lodash.merge": "4.6.7", "jest": "29.3.1", "node-mocks-http": "1.12.1", "openapi-types": "12.0.2", "ts-jest": "29.0.3", "ts-node": "10.9.1", "typescript": "*" - }, - "engines": { - "node": "^14.15.0 || ^16.13.0 || ^18.12.0" } } diff --git a/packages/next-rest-framework/src/client.ts b/packages/next-rest-framework/src/client.ts index 46d1a45..5d6a14f 100644 --- a/packages/next-rest-framework/src/client.ts +++ b/packages/next-rest-framework/src/client.ts @@ -1,4 +1,3 @@ -import { defineCatchAllHandler } from './define-catch-all-handler'; import { defineEndpoints } from './define-endpoints'; import { NextRestFrameworkConfig } from './types'; import merge from 'lodash.merge'; @@ -15,7 +14,11 @@ export const NextRestFramework = ( return { config, - defineCatchAllHandler: defineCatchAllHandler({ config }), + defineCatchAllHandler: defineEndpoints({ + config, + _warnAboutReservedPaths: false, + _returnNotFoundForMissingHandler: true + }), defineEndpoints: defineEndpoints({ config }) }; }; diff --git a/packages/next-rest-framework/src/constants.ts b/packages/next-rest-framework/src/constants.ts index 8eef887..1cf3dae 100644 --- a/packages/next-rest-framework/src/constants.ts +++ b/packages/next-rest-framework/src/constants.ts @@ -7,7 +7,7 @@ export const DEFAULT_ERRORS = { unexpectedError: 'An unknown error occurred, trying again might help.', methodNotAllowed: 'Method not allowed.', notFound: 'Not found.', - unsupportedMediaType: 'Unsupported media type.' + invalidMediaType: 'Invalid media type.' }; export const OPEN_API_VERSION = '3.0.1'; diff --git a/packages/next-rest-framework/src/define-catch-all-handler.ts b/packages/next-rest-framework/src/define-catch-all-handler.ts deleted file mode 100644 index 5b6fe42..0000000 --- a/packages/next-rest-framework/src/define-catch-all-handler.ts +++ /dev/null @@ -1,44 +0,0 @@ -import * as zod from 'zod'; -import { DEFAULT_ERRORS, ValidMethod } from './constants'; -import { DefineEndpointsParams, NextRestFrameworkConfig } from './types'; -import { defineEndpoints } from './define-endpoints'; -import { NextApiResponse } from 'next'; - -export const defineCatchAllHandler = - ({ - config - }: { - config: NextRestFrameworkConfig; - }) => - (methodHandlers?: DefineEndpointsParams) => { - return defineEndpoints({ config, _warnAboutReservedPaths: false })({ - GET: { - responses: [ - { - description: 'Response for 404 fallback.', - status: 404, - contentType: 'application/json', - schema: zod.object({ - message: zod.string() - }) - } - ], - handler: async ({ req, res }) => { - const methodHandlerExists = - methodHandlers && - Object.values(ValidMethod).some((method) => - Object.keys(methodHandlers).includes(method) - ); - - if (methodHandlerExists) { - await defineEndpoints({ config })(methodHandlers)( - req, - res as NextApiResponse - ); - } else { - res.status(404).json({ message: DEFAULT_ERRORS.notFound }); - } - } - } - }); - }; diff --git a/packages/next-rest-framework/src/define-endpoints.ts b/packages/next-rest-framework/src/define-endpoints.ts index 6095d48..667af98 100644 --- a/packages/next-rest-framework/src/define-endpoints.ts +++ b/packages/next-rest-framework/src/define-endpoints.ts @@ -2,82 +2,83 @@ import { NextApiResponse } from 'next'; import { DEFAULT_ERRORS, NEXT_REST_FRAMEWORK_USER_AGENT } from './constants'; import { BaseContentType, + BaseSchemaType, BaseStatus, DefineEndpointsParams, NextRestFrameworkConfig, - ResponseObject, + SchemaReturnType, TypedNextApiRequest } from './types'; import { isValidMethod, - isZodSchema, - isYupSchema, - isYupValidationError, logReservedPaths, getPathsFromMethodHandlers, handleReservedPathWarnings, getHTMLForSwaggerUI, - getOpenApiSpecWithPaths + getOpenApiSpecWithPaths, + validateRequestBody } from './utils'; import yaml from 'js-yaml'; export const defineEndpoints = ({ config, - _warnAboutReservedPaths = true + _warnAboutReservedPaths = true, + _returnNotFoundForMissingHandler = false }: { config: NextRestFrameworkConfig; _warnAboutReservedPaths?: boolean; + _returnNotFoundForMissingHandler?: boolean; }) => { return < - GetBody, + GetBodySchema extends BaseSchemaType, GetStatus extends BaseStatus, GetContentType extends BaseContentType, - GetResponse extends ResponseObject, + GetResponseSchema extends BaseSchemaType, GetMiddlewareResponse, - PutBody, + PutBodySchema extends BaseSchemaType, PutStatus extends BaseStatus, PutContentType extends BaseContentType, - PutResponse extends ResponseObject, + PutResponseSchema extends BaseSchemaType, PutMiddlewareResponse, - PostBody, + PostBodySchema extends BaseSchemaType, PostStatus extends BaseStatus, PostContentType extends BaseContentType, - PostResponse extends ResponseObject, + PostResponseSchema extends BaseSchemaType, PostMiddlewareResponse, - DeleteBody, + DeleteBodySchema extends BaseSchemaType, DeleteStatus extends BaseStatus, DeleteContentType extends BaseContentType, - DeleteResponse extends ResponseObject, + DeleteResponseSchema extends BaseSchemaType, DeleteMiddlewareResponse, - OptionsBody, + OptionsBodySchema extends BaseSchemaType, OptionsStatus extends BaseStatus, OptionsContentType extends BaseContentType, - OptionsResponse extends ResponseObject, + OptionsResponseSchema extends BaseSchemaType, OptionsMiddlewareResponse, - HeadBody, + HeadBodySchema extends BaseSchemaType, HeadStatus extends BaseStatus, HeadContentType extends BaseContentType, - HeadResponse extends ResponseObject, + HeadResponseSchema extends BaseSchemaType, HeadMiddlewareResponse, - PatchBody, + PatchBodySchema extends BaseSchemaType, PatchStatus extends BaseStatus, PatchContentType extends BaseContentType, - PatchResponse extends ResponseObject, + PatchResponseSchema extends BaseSchemaType, PatchMiddlewareResponse, - TraceBody, + TraceBodySchema extends BaseSchemaType, TraceStatus extends BaseStatus, TraceContentType extends BaseContentType, - TraceResponse extends ResponseObject, + TraceResponseSchema extends BaseSchemaType, TraceMiddlewareResponse, RouteMiddlewareResponse, - Body extends GetBody & - PutBody & - PostBody & - DeleteBody & - OptionsBody & - HeadBody & - PatchBody & - TraceBody, + SchemaType extends GetBodySchema & + PutBodySchema & + PostBodySchema & + DeleteBodySchema & + OptionsBodySchema & + HeadBodySchema & + PatchBodySchema & + TraceBodySchema, MethodMiddlewareResponse extends GetMiddlewareResponse & PutMiddlewareResponse & PostMiddlewareResponse & @@ -88,254 +89,305 @@ export const defineEndpoints = ({ TraceMiddlewareResponse >( methodHandlers: DefineEndpointsParams< - GetBody, + GetBodySchema, GetStatus, GetContentType, - GetResponse, + GetResponseSchema, GetMiddlewareResponse, - PutBody, + PutBodySchema, PutStatus, PutContentType, - PutResponse, + PutResponseSchema, PutMiddlewareResponse, - PostBody, + PostBodySchema, PostStatus, PostContentType, - PostResponse, + PostResponseSchema, PostMiddlewareResponse, - DeleteBody, + DeleteBodySchema, DeleteStatus, DeleteContentType, - DeleteResponse, + DeleteResponseSchema, DeleteMiddlewareResponse, - OptionsBody, + OptionsBodySchema, OptionsStatus, OptionsContentType, - OptionsResponse, + OptionsResponseSchema, OptionsMiddlewareResponse, - HeadBody, + HeadBodySchema, HeadStatus, HeadContentType, - HeadResponse, + HeadResponseSchema, HeadMiddlewareResponse, - PatchBody, + PatchBodySchema, PatchStatus, PatchContentType, - PatchResponse, + PatchResponseSchema, PatchMiddlewareResponse, - TraceBody, + TraceBodySchema, TraceStatus, TraceContentType, - TraceResponse, + TraceResponseSchema, TraceMiddlewareResponse, GlobalMiddlewareResponse, RouteMiddlewareResponse - > + > = {} ) => { return async ( - req: TypedNextApiRequest, + req: TypedNextApiRequest>, res: NextApiResponse ): Promise< | DefineEndpointsParams< - GetBody, + GetBodySchema, GetStatus, GetContentType, - GetResponse, + GetResponseSchema, GetMiddlewareResponse, - PutBody, + PutBodySchema, PutStatus, PutContentType, - PutResponse, + PutResponseSchema, PutMiddlewareResponse, - PostBody, + PostBodySchema, PostStatus, PostContentType, - PostResponse, + PostResponseSchema, PostMiddlewareResponse, - DeleteBody, + DeleteBodySchema, DeleteStatus, DeleteContentType, - DeleteResponse, + DeleteResponseSchema, DeleteMiddlewareResponse, - OptionsBody, + OptionsBodySchema, OptionsStatus, OptionsContentType, - OptionsResponse, + OptionsResponseSchema, OptionsMiddlewareResponse, - HeadBody, + HeadBodySchema, HeadStatus, HeadContentType, - HeadResponse, + HeadResponseSchema, HeadMiddlewareResponse, - PatchBody, + PatchBodySchema, PatchStatus, PatchContentType, - PatchResponse, + PatchResponseSchema, PatchMiddlewareResponse, - TraceBody, + TraceBodySchema, TraceStatus, TraceContentType, - TraceResponse, + TraceResponseSchema, TraceMiddlewareResponse, GlobalMiddlewareResponse, RouteMiddlewareResponse > | undefined > => { - const { method, body, headers, url } = req; - - const { - openApiJsonPath, - openApiYamlPath, - swaggerUiPath, - exposeOpenApiSpec, - suppressInfo - } = config; - - if (!suppressInfo && !global.reservedPathsLogged) { - logReservedPaths({ config, headers }); - } - - if ( - [openApiJsonPath, openApiYamlPath, swaggerUiPath].includes(url) && - exposeOpenApiSpec - ) { - const spec = await getOpenApiSpecWithPaths({ req, res, config }); - - if (_warnAboutReservedPaths) { - handleReservedPathWarnings({ url, config }); - } + const returnUnexpectedError = () => { + res.status(500).json({ message: DEFAULT_ERRORS.unexpectedError }); + }; - if (url === openApiJsonPath) { - res.status(200).json(spec); - return; - } + const handleRequest = async (): Promise< + | DefineEndpointsParams< + GetBodySchema, + GetStatus, + GetContentType, + GetResponseSchema, + GetMiddlewareResponse, + PutBodySchema, + PutStatus, + PutContentType, + PutResponseSchema, + PutMiddlewareResponse, + PostBodySchema, + PostStatus, + PostContentType, + PostResponseSchema, + PostMiddlewareResponse, + DeleteBodySchema, + DeleteStatus, + DeleteContentType, + DeleteResponseSchema, + DeleteMiddlewareResponse, + OptionsBodySchema, + OptionsStatus, + OptionsContentType, + OptionsResponseSchema, + OptionsMiddlewareResponse, + HeadBodySchema, + HeadStatus, + HeadContentType, + HeadResponseSchema, + HeadMiddlewareResponse, + PatchBodySchema, + PatchStatus, + PatchContentType, + PatchResponseSchema, + PatchMiddlewareResponse, + TraceBodySchema, + TraceStatus, + TraceContentType, + TraceResponseSchema, + TraceMiddlewareResponse, + GlobalMiddlewareResponse, + RouteMiddlewareResponse + > + | undefined + > => { + const { method, body, headers, url } = req; - if (url === openApiYamlPath) { - res.setHeader('Content-Type', 'text/plain'); - res.status(200).send(yaml.dump(spec)); - return; - } + const { + openApiJsonPath, + openApiYamlPath, + swaggerUiPath, + exposeOpenApiSpec, + suppressInfo + } = config; - if (url === swaggerUiPath) { - const html = getHTMLForSwaggerUI({ headers }); - res.setHeader('Content-Type', 'text/html'); - res.status(200).send(html); - return; + if (!suppressInfo && !global.reservedPathsLogged) { + logReservedPaths({ config, headers }); } - } - const allowedMethods = Object.keys(methodHandlers); + if ( + [openApiJsonPath, openApiYamlPath, swaggerUiPath].includes(url) && + exposeOpenApiSpec + ) { + if (_warnAboutReservedPaths) { + handleReservedPathWarnings({ url, config }); + } - const returnMethodNotAllowed = (): void => { - res.setHeader('Allow', allowedMethods.join(', ')); - res.status(405).json({ message: DEFAULT_ERRORS.methodNotAllowed }); - }; + const spec = await getOpenApiSpecWithPaths({ req, res, config }); - const returnUnexpectedError = () => { - res.status(500).json({ message: DEFAULT_ERRORS.unexpectedError }); - }; + if (url === openApiJsonPath) { + res.status(200).json(spec); + return; + } - if (headers['user-agent'] === NEXT_REST_FRAMEWORK_USER_AGENT) { - try { - const paths = getPathsFromMethodHandlers({ - methodHandlers: methodHandlers as DefineEndpointsParams, - route: url ?? '' - }); + if (url === openApiYamlPath) { + res.setHeader('Content-Type', 'text/plain'); + res.status(200).send(yaml.dump(spec)); + return; + } - res.status(200).json(paths); - } catch (error) { - await config.errorHandler?.({ req, res, error }); - returnUnexpectedError(); + if (url === swaggerUiPath) { + const html = getHTMLForSwaggerUI({ headers }); + res.setHeader('Content-Type', 'text/html'); + res.status(200).send(html); + return; + } } - return; - } + const allowedMethods = Object.keys(methodHandlers); - if (!isValidMethod(method)) { - returnMethodNotAllowed(); - return; - } + const returnMethodNotAllowed = (): void => { + res.setHeader('Allow', allowedMethods.join(', ')); + res.status(405).json({ message: DEFAULT_ERRORS.methodNotAllowed }); + }; - const methodHandler = methodHandlers[method]; + if (headers['user-agent'] === NEXT_REST_FRAMEWORK_USER_AGENT) { + const route = url ?? ''; - if (methodHandler == null) { - returnMethodNotAllowed(); - return; - } + try { + const paths = getPathsFromMethodHandlers({ + config, + methodHandlers: methodHandlers as DefineEndpointsParams, + route + }); - const { - requestBody, - handler, - errorHandler = methodHandlers.errorHandler ?? config.errorHandler - } = methodHandler; + res.status(200).json(paths); + return; + } catch (error) { + throw Error(`OpenAPI spec generation failed for route: ${route} +${error}`); + } + } - if (requestBody) { - const { schema, contentType } = requestBody; + if (!isValidMethod(method)) { + returnMethodNotAllowed(); + return; + } - if (headers['content-type'] !== contentType) { - res - .status(415) - .json({ message: DEFAULT_ERRORS.unsupportedMediaType }); + const methodHandler = methodHandlers[method]; + if (!methodHandler && _returnNotFoundForMissingHandler) { + res.status(404).json({ message: DEFAULT_ERRORS.notFound }); + return; + } else if (!methodHandler) { + returnMethodNotAllowed(); return; } - if (isZodSchema(schema)) { - const data = schema.safeParse(body); + const { + input, + handler, + errorHandler = methodHandlers.errorHandler ?? config.errorHandler + } = methodHandler; + + if (input) { + const { schema, contentType } = input; - if (!data.success) { - res.status(400).json({ message: data.error.issues }); + if (headers['content-type'] !== contentType) { + res.status(415).json({ message: DEFAULT_ERRORS.invalidMediaType }); return; } - } else if (isYupSchema(schema)) { - try { - await schema.validate(body); - } catch (e) { - if (isYupValidationError(e)) { - res.status(400).json({ message: e.errors }); + + const validate = await validateRequestBody?.({ + schema, + body + }); + + if (validate) { + const { valid, errors } = validate; + + if (!valid) { + res.status(400).json({ message: errors }); return; - } else { - returnUnexpectedError(); } } } - } - const globalMiddlewareParams = (await config.middleware?.({ - req, - res - })) as Awaited; + const globalMiddlewareParams = (await config.middleware?.({ + req, + res + })) as Awaited; + + const routeMiddlewareParams = (await methodHandlers.middleware?.({ + req, + res, + params: globalMiddlewareParams + })) as Awaited; - const routeMiddlewareParams = (await methodHandlers.middleware?.({ - req, - res, - params: globalMiddlewareParams - })) as Awaited; + const methodMiddlewareParams = (await methodHandler.middleware?.({ + req, + res, + params: { + ...globalMiddlewareParams, + ...routeMiddlewareParams + } + })) as Awaited; - const methodMiddlewareParams = (await methodHandler.middleware?.({ - req, - res, - params: { + const params = { ...globalMiddlewareParams, - ...routeMiddlewareParams - } - })) as Awaited; + ...routeMiddlewareParams, + ...methodMiddlewareParams + }; - const params = { - ...globalMiddlewareParams, - ...routeMiddlewareParams, - ...methodMiddlewareParams + try { + await handler({ + req, + res, + params + }); + } catch (error) { + await errorHandler?.({ req, res, error, params }); + returnUnexpectedError(); + } }; try { - await handler({ - req, - res, - params - }); + return await handleRequest(); } catch (error) { - await errorHandler?.({ req, res, error, params }); + await config.errorHandler?.({ req, res, error }); returnUnexpectedError(); } }; diff --git a/packages/next-rest-framework/src/types.ts b/packages/next-rest-framework/src/types.ts deleted file mode 100644 index 8e3cb05..0000000 --- a/packages/next-rest-framework/src/types.ts +++ /dev/null @@ -1,330 +0,0 @@ -import { z } from 'zod'; -import * as yup from 'yup'; -import { NextApiRequest, NextApiResponse } from 'next'; -import { OpenAPIV3_1 } from 'openapi-types'; -import { ValidMethod } from './constants'; -import { AnyCase, Modify } from './utility-types'; -import { AnyContentTypeWithAutocompleteForMostCommonOnes } from './content-types'; - -export type BaseStatus = number; -export type BaseContentType = AnyContentTypeWithAutocompleteForMostCommonOnes; - -export type TypedNextApiRequest = Modify< - NextApiRequest, - { - body: Body; - method: ValidMethod; - } ->; - -export type TypedNextApiResponse = Modify< - Omit, 'send' | 'json'>, - { - status: (code: Status) => Omit, 'status'>; - setHeader: < - K extends AnyCase<'Content-Type'> | string, - V extends number | string | readonly string[] - >( - name: K, - value: K extends AnyCase<'Content-Type'> ? ContentType : V - ) => void; - } ->; - -type NextRestFrameworkOpenApiSpec = Partial< - Modify< - Omit, - { - info: Partial; - } - > ->; - -export type ResponseObject< - Status = unknown, - ContentType = unknown, - Response = unknown -> = Modify< - Omit & OpenAPIV3_1.MediaTypeObject, - { - status: Status; - schema: z.ZodType | yup.SchemaOf; - contentType: ContentType; - description?: string; - } ->; - -type ExampleObject = Modify< - OpenAPIV3_1.ExampleObject, - { - value: Body; - } ->; - -export type RequestBodyObject = Omit< - OpenAPIV3_1.RequestBodyObject, - 'content' -> & - Modify< - OpenAPIV3_1.MediaTypeObject, - { - description?: string; - required?: boolean; - contentType: BaseContentType; - schema: z.ZodType | yup.SchemaOf; - example?: Body; - examples?: Record< - string, - OpenAPIV3_1.ReferenceObject | ExampleObject - >; - } - >; - -type ApiHandler< - Body, - Status, - ContentType, - Response, - GlobalMiddlewareResponse, - RouteMiddlewareResponse, - MethodMiddlewareResponse -> = (params: { - req: TypedNextApiRequest; - res: TypedNextApiResponse; - params: - | Record - | (Awaited & - Awaited & - Awaited); -}) => Promise | void; - -type Middleware< - MiddlewareResponse, - ExtraParams = unknown, - Req = NextApiRequest, - Res = NextApiResponse -> = ( - params: { - req: Req; - res: Res; - } & ExtraParams -) => - | Promise<(MiddlewareResponse & Record) | undefined> - | (MiddlewareResponse & Record) - | undefined; - -type ErrorHandler< - ExtraParams = unknown, - Req = NextApiRequest, - Res = NextApiResponse -> = ({ - req, - res, - error -}: { - req: Req; - res: Res; - error: unknown; -} & ExtraParams) => Promise | void; - -type SchemaOutput = Schema extends z.ZodType - ? Schema['_output'] - : Schema extends yup.AnySchema - ? Schema['__outputType'] - : never; - -export type MethodHandler< - Body = unknown, - Status extends BaseStatus = BaseStatus, - ContentType extends BaseContentType = BaseContentType, - Response extends ResponseObject = ResponseObject, - GlobalMiddlewareResponse = unknown, - RouteMiddlewareResponse = unknown, - MethodMiddlewareResponse = unknown -> = Modify< - OpenAPIV3_1.OperationObject, - { - requestBody?: RequestBodyObject; - responses: Array< - Response & { - status: Status; - contentType: ContentType; - } - >; - middleware?: Middleware< - MethodMiddlewareResponse, - { - params: GlobalMiddlewareResponse & RouteMiddlewareResponse; - }, - TypedNextApiRequest, - TypedNextApiResponse< - Status, - ContentType, - SchemaOutput - > - >; - handler: ApiHandler< - Body, - Status, - ContentType, - SchemaOutput, - GlobalMiddlewareResponse, - RouteMiddlewareResponse, - MethodMiddlewareResponse - >; - errorHandler?: ErrorHandler< - { - params: GlobalMiddlewareResponse & - RouteMiddlewareResponse & - MethodMiddlewareResponse; - }, - TypedNextApiRequest, - TypedNextApiResponse< - Status, - ContentType, - SchemaOutput - > - >; - } ->; - -export interface DefineEndpointsParams< - GetBody = unknown, - GetStatus extends BaseStatus = BaseStatus, - GetContentType extends BaseContentType = BaseContentType, - GetResponse extends ResponseObject = ResponseObject, - GetMiddlewareResponse = unknown, - PutBody = unknown, - PutStatus extends BaseStatus = BaseStatus, - PutContentType extends BaseContentType = BaseContentType, - PutResponse extends ResponseObject = ResponseObject, - PutMiddlewareResponse = unknown, - PostBody = unknown, - PostStatus extends BaseStatus = BaseStatus, - PostContentType extends BaseContentType = BaseContentType, - PostResponse extends ResponseObject = ResponseObject, - PostMiddlewareResponse = unknown, - DeleteBody = unknown, - DeleteStatus extends BaseStatus = BaseStatus, - DeleteContentType extends BaseContentType = BaseContentType, - DeleteResponse extends ResponseObject = ResponseObject, - DeleteMiddlewareResponse = unknown, - OptionsBody = unknown, - OptionsStatus extends BaseStatus = BaseStatus, - OptionsContentType extends BaseContentType = BaseContentType, - OptionsResponse extends ResponseObject = ResponseObject, - OptionsMiddlewareResponse = unknown, - HeadBody = unknown, - HeadStatus extends BaseStatus = BaseStatus, - HeadContentType extends BaseContentType = BaseContentType, - HeadResponse extends ResponseObject = ResponseObject, - HeadMiddlewareResponse = unknown, - PatchBody = unknown, - PatchStatus extends BaseStatus = BaseStatus, - PatchContentType extends BaseContentType = BaseContentType, - PatchResponse extends ResponseObject = ResponseObject, - PatchMiddlewareResponse = unknown, - TraceBody = unknown, - TraceStatus extends BaseStatus = BaseStatus, - TraceContentType extends BaseContentType = BaseContentType, - TraceResponse extends ResponseObject = ResponseObject, - TraceMiddlewareResponse = unknown, - GlobalMiddlewareResponse = unknown, - RouteMiddlewareResponse = unknown -> { - [ValidMethod.GET]?: MethodHandler< - GetBody, - GetStatus, - GetContentType, - GetResponse, - GlobalMiddlewareResponse, - RouteMiddlewareResponse, - GetMiddlewareResponse - >; - [ValidMethod.PUT]?: MethodHandler< - PutBody, - PutStatus, - PutContentType, - PutResponse, - GlobalMiddlewareResponse, - RouteMiddlewareResponse, - PutMiddlewareResponse - >; - [ValidMethod.POST]?: MethodHandler< - PostBody, - PostStatus, - PostContentType, - PostResponse, - GlobalMiddlewareResponse, - RouteMiddlewareResponse, - PostMiddlewareResponse - >; - [ValidMethod.DELETE]?: MethodHandler< - DeleteBody, - DeleteStatus, - DeleteContentType, - DeleteResponse, - GlobalMiddlewareResponse, - RouteMiddlewareResponse, - DeleteMiddlewareResponse - >; - [ValidMethod.OPTIONS]?: MethodHandler< - OptionsBody, - OptionsStatus, - OptionsContentType, - OptionsResponse, - GlobalMiddlewareResponse, - RouteMiddlewareResponse, - OptionsMiddlewareResponse - >; - [ValidMethod.HEAD]?: MethodHandler< - HeadBody, - HeadStatus, - HeadContentType, - HeadResponse, - GlobalMiddlewareResponse, - RouteMiddlewareResponse, - HeadMiddlewareResponse - >; - [ValidMethod.PATCH]?: MethodHandler< - PatchBody, - PatchStatus, - PatchContentType, - PatchResponse, - GlobalMiddlewareResponse, - RouteMiddlewareResponse, - PatchMiddlewareResponse - >; - [ValidMethod.TRACE]?: MethodHandler< - TraceBody, - TraceStatus, - TraceContentType, - TraceResponse, - GlobalMiddlewareResponse, - RouteMiddlewareResponse, - TraceMiddlewareResponse - >; - middleware?: Middleware< - RouteMiddlewareResponse, - { params: GlobalMiddlewareResponse } - >; - errorHandler?: ErrorHandler<{ - params: GlobalMiddlewareResponse & RouteMiddlewareResponse; - }>; - $ref?: OpenAPIV3_1.ReferenceObject; - summary?: OpenAPIV3_1.PathItemObject['summary']; - description?: OpenAPIV3_1.PathItemObject['description']; - servers?: OpenAPIV3_1.ServerObject[]; - parameters?: OpenAPIV3_1.PathItemObject['parameters']; -} - -export interface NextRestFrameworkConfig { - openApiSpec?: NextRestFrameworkOpenApiSpec; // Fully typed OpenAPI spec for your API. - openApiJsonPath?: string; // Path that will be used for the OpenAPI spec - defaults tp `/api/openapi.json`. - openApiYamlPath?: string; // Path that will be used for the OpenAPI spec - defaults tp `/api/openapi.json`. - swaggerUiPath?: string; // Path that will be used for the API docs - defaults to `/api/docs`. - exposeOpenApiSpec?: boolean; // Setting this to `false` will expose neither the API docs nor the OpenAPI specs. - middleware?: Middleware; // A middleware used for all of your APIs - useful for e.g. authentication. The return object will be passed to your request handlers. - errorHandler?: ErrorHandler; // A function that will be called when an error occurs. By default, it will return a 500 status code and a default error unless your provide a custom response. - suppressInfo?: boolean; // Setting this to `true` will suppress all informational logs from Next REST Framework. -} diff --git a/packages/next-rest-framework/src/types/api-handler.ts b/packages/next-rest-framework/src/types/api-handler.ts new file mode 100644 index 0000000..34f91d8 --- /dev/null +++ b/packages/next-rest-framework/src/types/api-handler.ts @@ -0,0 +1,20 @@ +import { TypedNextApiRequest } from './request'; +import { TypedNextApiResponse } from './response'; + +export type ApiHandler< + Body, + Status, + ContentType, + Response, + GlobalMiddlewareResponse, + RouteMiddlewareResponse, + MethodMiddlewareResponse +> = (params: { + req: TypedNextApiRequest; + res: TypedNextApiResponse; + params: + | Record + | (Awaited & + Awaited & + Awaited); +}) => Promise | void; diff --git a/packages/next-rest-framework/src/types/config.ts b/packages/next-rest-framework/src/types/config.ts new file mode 100644 index 0000000..becc630 --- /dev/null +++ b/packages/next-rest-framework/src/types/config.ts @@ -0,0 +1,24 @@ +import { OpenAPIV3_1 } from 'openapi-types'; +import { ErrorHandler } from './error-handler'; +import { Middleware } from './middleware'; +import { Modify } from './utility-types'; + +type NextRestFrameworkOpenApiSpec = Partial< + Modify< + Omit, + { + info: Partial; + } + > +>; + +export interface NextRestFrameworkConfig { + openApiSpec?: NextRestFrameworkOpenApiSpec; // Fully typed OpenAPI spec for your API. + openApiJsonPath?: string; // Path that will be used for the OpenAPI spec - defaults tp `/api/openapi.json`. + openApiYamlPath?: string; // Path that will be used for the OpenAPI spec - defaults tp `/api/openapi.json`. + swaggerUiPath?: string; // Path that will be used for the API docs - defaults to `/api/docs`. + exposeOpenApiSpec?: boolean; // Setting this to `false` will expose neither the API docs nor the OpenAPI specs. + middleware?: Middleware; // A middleware used for all of your APIs - useful for e.g. authentication. The return object will be passed to your request handlers. + errorHandler?: ErrorHandler; // A function that will be called when an error occurs. By default, it will return a 500 status code and a default error unless your provide a custom response. + suppressInfo?: boolean; // Setting this to `true` will suppress all informational logs from Next REST Framework. +} diff --git a/packages/next-rest-framework/src/content-types.ts b/packages/next-rest-framework/src/types/content-types.ts similarity index 100% rename from packages/next-rest-framework/src/content-types.ts rename to packages/next-rest-framework/src/types/content-types.ts diff --git a/packages/next-rest-framework/src/types/define-endpoints.ts b/packages/next-rest-framework/src/types/define-endpoints.ts new file mode 100644 index 0000000..3bca19a --- /dev/null +++ b/packages/next-rest-framework/src/types/define-endpoints.ts @@ -0,0 +1,132 @@ +import { OpenAPIV3_1 } from 'openapi-types'; +import { ValidMethod } from '../constants'; +import { BaseSchemaType } from './schemas'; +import { Middleware } from './middleware'; +import { ErrorHandler } from './error-handler'; +import { BaseContentType, BaseStatus, MethodHandler } from './method-handlers'; + +export interface DefineEndpointsParams< + GetBodySchema extends BaseSchemaType = BaseSchemaType, + GetStatus extends BaseStatus = BaseStatus, + GetContentType extends BaseContentType = BaseContentType, + GetResponseSchema extends BaseSchemaType = BaseSchemaType, + GetMiddlewareResponse = unknown, + PutBodySchema extends BaseSchemaType = BaseSchemaType, + PutStatus extends BaseStatus = BaseStatus, + PutContentType extends BaseContentType = BaseContentType, + PutResponseSchema extends BaseSchemaType = BaseSchemaType, + PutMiddlewareResponse = unknown, + PostBodySchema extends BaseSchemaType = BaseSchemaType, + PostStatus extends BaseStatus = BaseStatus, + PostContentType extends BaseContentType = BaseContentType, + PostResponseSchema extends BaseSchemaType = BaseSchemaType, + PostMiddlewareResponse = unknown, + DeleteBodySchema extends BaseSchemaType = BaseSchemaType, + DeleteStatus extends BaseStatus = BaseStatus, + DeleteContentType extends BaseContentType = BaseContentType, + DeleteResponseSchema extends BaseSchemaType = BaseSchemaType, + DeleteMiddlewareResponse = unknown, + OptionsBodySchema extends BaseSchemaType = BaseSchemaType, + OptionsStatus extends BaseStatus = BaseStatus, + OptionsContentType extends BaseContentType = BaseContentType, + OptionsResponseSchema extends BaseSchemaType = BaseSchemaType, + OptionsMiddlewareResponse = unknown, + HeadBodySchema extends BaseSchemaType = BaseSchemaType, + HeadStatus extends BaseStatus = BaseStatus, + HeadContentType extends BaseContentType = BaseContentType, + HeadResponseSchema extends BaseSchemaType = BaseSchemaType, + HeadMiddlewareResponse = unknown, + PatchBodySchema extends BaseSchemaType = BaseSchemaType, + PatchStatus extends BaseStatus = BaseStatus, + PatchContentType extends BaseContentType = BaseContentType, + PatchResponseSchema extends BaseSchemaType = BaseSchemaType, + PatchMiddlewareResponse = unknown, + TraceBodySchema extends BaseSchemaType = BaseSchemaType, + TraceStatus extends BaseStatus = BaseStatus, + TraceContentType extends BaseContentType = BaseContentType, + TraceResponseSchema extends BaseSchemaType = BaseSchemaType, + TraceMiddlewareResponse = unknown, + GlobalMiddlewareResponse = unknown, + RouteMiddlewareResponse = unknown +> { + [ValidMethod.GET]?: MethodHandler< + GetBodySchema, + GetStatus, + GetContentType, + GetResponseSchema, + GlobalMiddlewareResponse, + RouteMiddlewareResponse, + GetMiddlewareResponse + >; + [ValidMethod.PUT]?: MethodHandler< + PutBodySchema, + PutStatus, + PutContentType, + PutResponseSchema, + GlobalMiddlewareResponse, + RouteMiddlewareResponse, + PutMiddlewareResponse + >; + [ValidMethod.POST]?: MethodHandler< + PostBodySchema, + PostStatus, + PostContentType, + PostResponseSchema, + GlobalMiddlewareResponse, + RouteMiddlewareResponse, + PostMiddlewareResponse + >; + [ValidMethod.DELETE]?: MethodHandler< + DeleteBodySchema, + DeleteStatus, + DeleteContentType, + DeleteResponseSchema, + GlobalMiddlewareResponse, + RouteMiddlewareResponse, + DeleteMiddlewareResponse + >; + [ValidMethod.OPTIONS]?: MethodHandler< + OptionsBodySchema, + OptionsStatus, + OptionsContentType, + OptionsResponseSchema, + GlobalMiddlewareResponse, + RouteMiddlewareResponse, + OptionsMiddlewareResponse + >; + [ValidMethod.HEAD]?: MethodHandler< + HeadBodySchema, + HeadStatus, + HeadContentType, + HeadResponseSchema, + GlobalMiddlewareResponse, + RouteMiddlewareResponse, + HeadMiddlewareResponse + >; + [ValidMethod.PATCH]?: MethodHandler< + PatchBodySchema, + PatchStatus, + PatchContentType, + PatchResponseSchema, + GlobalMiddlewareResponse, + RouteMiddlewareResponse, + PatchMiddlewareResponse + >; + [ValidMethod.TRACE]?: MethodHandler< + TraceBodySchema, + TraceStatus, + TraceContentType, + TraceResponseSchema, + GlobalMiddlewareResponse, + RouteMiddlewareResponse, + TraceMiddlewareResponse + >; + middleware?: Middleware< + RouteMiddlewareResponse, + { params: GlobalMiddlewareResponse } + >; + errorHandler?: ErrorHandler<{ + params: GlobalMiddlewareResponse & RouteMiddlewareResponse; + }>; + openApiSpec?: OpenAPIV3_1.PathItemObject; +} diff --git a/packages/next-rest-framework/src/types/error-handler.ts b/packages/next-rest-framework/src/types/error-handler.ts new file mode 100644 index 0000000..214a718 --- /dev/null +++ b/packages/next-rest-framework/src/types/error-handler.ts @@ -0,0 +1,15 @@ +import { NextApiRequest, NextApiResponse } from 'next'; + +export type ErrorHandler< + ExtraParams = unknown, + Req = NextApiRequest, + Res = NextApiResponse +> = ({ + req, + res, + error +}: { + req: Req; + res: Res; + error: unknown; +} & ExtraParams) => Promise | void; diff --git a/packages/next-rest-framework/src/types/index.ts b/packages/next-rest-framework/src/types/index.ts new file mode 100644 index 0000000..96a00e9 --- /dev/null +++ b/packages/next-rest-framework/src/types/index.ts @@ -0,0 +1,11 @@ +export * from './api-handler'; +export * from './config'; +export * from './content-types'; +export * from './define-endpoints'; +export * from './error-handler'; +export * from './method-handlers'; +export * from './middleware'; +export * from './request'; +export * from './response'; +export * from './schemas'; +export * from './utility-types'; diff --git a/packages/next-rest-framework/src/types/method-handlers.ts b/packages/next-rest-framework/src/types/method-handlers.ts new file mode 100644 index 0000000..19102c5 --- /dev/null +++ b/packages/next-rest-framework/src/types/method-handlers.ts @@ -0,0 +1,80 @@ +import { OpenAPIV3_1 } from 'openapi-types'; +import { ApiHandler } from './api-handler'; +import { AnyContentTypeWithAutocompleteForMostCommonOnes } from './content-types'; +import { ErrorHandler } from './error-handler'; +import { Middleware } from './middleware'; +import { TypedNextApiRequest } from './request'; +import { TypedNextApiResponse } from './response'; +import { BaseSchemaType, SchemaReturnType } from './schemas'; +import { Modify } from './utility-types'; + +export type BaseStatus = number; +export type BaseContentType = AnyContentTypeWithAutocompleteForMostCommonOnes; + +export interface InputObject< + BodySchema extends BaseSchemaType = BaseSchemaType +> { + contentType: BaseContentType; + schema: BodySchema; +} + +export interface OutputObject< + Status = unknown, + ContentType = unknown, + ResponseSchema extends BaseSchemaType = BaseSchemaType +> { + status: Status; + schema: ResponseSchema; + contentType: ContentType; +} + +export type MethodHandler< + BodySchema extends BaseSchemaType = BaseSchemaType, + Status extends BaseStatus = BaseStatus, + ContentType extends BaseContentType = BaseContentType, + ResponseSchema extends BaseSchemaType = BaseSchemaType, + GlobalMiddlewareResponse = unknown, + RouteMiddlewareResponse = unknown, + MethodMiddlewareResponse = unknown +> = Modify< + OpenAPIV3_1.OperationObject, + { + input?: InputObject; + output?: Array>; + middleware?: Middleware< + MethodMiddlewareResponse, + { + params: GlobalMiddlewareResponse & RouteMiddlewareResponse; + }, + TypedNextApiRequest>, + TypedNextApiResponse< + Status, + ContentType, + SchemaReturnType + > + >; + handler: ApiHandler< + SchemaReturnType, + Status, + ContentType, + SchemaReturnType, + GlobalMiddlewareResponse, + RouteMiddlewareResponse, + MethodMiddlewareResponse + >; + errorHandler?: ErrorHandler< + { + params: GlobalMiddlewareResponse & + RouteMiddlewareResponse & + MethodMiddlewareResponse; + }, + TypedNextApiRequest>, + TypedNextApiResponse< + Status, + ContentType, + SchemaReturnType + > + >; + openApiSpec?: OpenAPIV3_1.OperationObject; + } +>; diff --git a/packages/next-rest-framework/src/types/middleware.ts b/packages/next-rest-framework/src/types/middleware.ts new file mode 100644 index 0000000..5980d90 --- /dev/null +++ b/packages/next-rest-framework/src/types/middleware.ts @@ -0,0 +1,16 @@ +import { NextApiRequest, NextApiResponse } from 'next'; + +export type Middleware< + MiddlewareResponse, + ExtraParams = unknown, + Req = NextApiRequest, + Res = NextApiResponse +> = ( + params: { + req: Req; + res: Res; + } & ExtraParams +) => + | Promise<(MiddlewareResponse & Record) | undefined> + | (MiddlewareResponse & Record) + | undefined; diff --git a/packages/next-rest-framework/src/types/request.ts b/packages/next-rest-framework/src/types/request.ts new file mode 100644 index 0000000..c537cc2 --- /dev/null +++ b/packages/next-rest-framework/src/types/request.ts @@ -0,0 +1,11 @@ +import { NextApiRequest } from 'next'; +import { ValidMethod } from '../constants'; +import { Modify } from './utility-types'; + +export type TypedNextApiRequest = Modify< + NextApiRequest, + { + body: Body; + method: ValidMethod; + } +>; diff --git a/packages/next-rest-framework/src/types/response.ts b/packages/next-rest-framework/src/types/response.ts new file mode 100644 index 0000000..8b0ca70 --- /dev/null +++ b/packages/next-rest-framework/src/types/response.ts @@ -0,0 +1,16 @@ +import { NextApiResponse } from 'next'; +import { AnyCase, Modify } from './utility-types'; + +export type TypedNextApiResponse = Modify< + Omit, 'send' | 'json'>, + { + status: (code: Status) => Omit, 'status'>; + setHeader: < + K extends AnyCase<'Content-Type'> | string, + V extends number | string | readonly string[] + >( + name: K, + value: K extends AnyCase<'Content-Type'> ? ContentType : V + ) => void; + } +>; diff --git a/packages/next-rest-framework/src/types/schemas.ts b/packages/next-rest-framework/src/types/schemas.ts new file mode 100644 index 0000000..99ec58a --- /dev/null +++ b/packages/next-rest-framework/src/types/schemas.ts @@ -0,0 +1,10 @@ +import { z } from 'zod'; +import * as yup from 'yup'; + +export type BaseSchemaType = z.ZodSchema | yup.AnySchema; + +export type SchemaReturnType = T extends z.ZodSchema + ? z.infer + : T extends yup.AnySchema + ? yup.InferType + : never; diff --git a/packages/next-rest-framework/src/utility-types.ts b/packages/next-rest-framework/src/types/utility-types.ts similarity index 86% rename from packages/next-rest-framework/src/utility-types.ts rename to packages/next-rest-framework/src/types/utility-types.ts index a571262..2bcff8b 100644 --- a/packages/next-rest-framework/src/utility-types.ts +++ b/packages/next-rest-framework/src/types/utility-types.ts @@ -1,5 +1,6 @@ export type Modify = Omit & R; +// Accept a string with any casing - used for validating headers. // Ref: https://stackoverflow.com/a/64932909 export type AnyCase = string extends T ? string diff --git a/packages/next-rest-framework/src/utils.ts b/packages/next-rest-framework/src/utils.ts deleted file mode 100644 index d788010..0000000 --- a/packages/next-rest-framework/src/utils.ts +++ /dev/null @@ -1,520 +0,0 @@ -import http from 'http'; -import { - DEFAULT_ERRORS, - OPEN_API_VERSION, - ValidMethod, - NEXT_REST_FRAMEWORK_USER_AGENT, - VERSION -} from './constants'; -import { - DefineEndpointsParams, - MethodHandler, - NextRestFrameworkConfig -} from './types'; -import { readFileSync, readdirSync } from 'fs'; -import { join } from 'path'; -import { z } from 'zod'; -import * as yup from 'yup'; -import { OpenAPIV3_1 } from 'openapi-types'; -import chalk from 'chalk'; -import merge from 'lodash.merge'; -import { Modify } from './utility-types'; -import isEqualWith from 'lodash.isequalwith'; -import zodToJsonSchema from 'zod-to-json-schema'; -import yupToJsonSchema from '@sodaru/yup-to-json-schema'; -import { NextApiRequest, NextApiResponse } from 'next'; - -const logNextRestFrameworkError = ({ error }: { error: unknown }) => { - if (process.env.NODE_ENV !== 'production') { - console.error( - chalk.red(`Next REST Framework encountered an error: -${error}`) - ); - } else { - console.error( - chalk.red( - 'Next REST Framework encountered an error - suppressed in production mode.' - ) - ); - } -}; - -export const getDefaultConfig = ({ - config -}: { - config?: NextRestFrameworkConfig; -} = {}): Modify< - NextRestFrameworkConfig, - { - openApiSpec: OpenAPIV3_1.Document; - } -> => ({ - openApiSpec: { - openapi: OPEN_API_VERSION, - info: { - title: 'Next REST Framework', - description: - 'This is an autogenerated OpenAPI spec by Next REST Framework.', - version: VERSION - }, - components: {} - }, - openApiJsonPath: '/api/openapi.json', - openApiYamlPath: '/api/openapi.yaml', - swaggerUiPath: '/api', - exposeOpenApiSpec: true, - errorHandler: logNextRestFrameworkError, - suppressInfo: false -}); - -export const logInitInfo = ({ - config -}: { - config: NextRestFrameworkConfig; -}) => { - const configsEqual = isEqualWith( - global.nextRestFrameworkConfig, - config, - (val1, val2) => { - if (typeof val1 === 'function' && typeof val2 === 'function') { - return val1.toString() === val2.toString(); - } - } - ); - - if (!global.nextRestFrameworkConfig) { - global.nextRestFrameworkConfig = config; - console.info(chalk.green('Next REST Framework initialized! 🚀')); - } else if (!configsEqual) { - console.info( - chalk.green('Next REST Framework config changed, re-initializing!') - ); - - global.nextRestFrameworkConfig = config; - global.reservedPathsLogged = false; - } -}; - -export const logReservedPaths = ({ - config, - headers -}: { - config: NextRestFrameworkConfig; - headers: http.IncomingHttpHeaders; -}) => { - const proto = headers['x-forwarded-proto'] ?? 'http'; - const host = headers.host; - const baseUrl = `${proto}://${host}`; - - if (config.exposeOpenApiSpec) { - console.info( - chalk.yellowBright(`Swagger UI: ${baseUrl}${config.swaggerUiPath} -OpenAPI JSON: ${baseUrl}${config.openApiJsonPath} -OpenAPI YAML: ${baseUrl}${config.openApiYamlPath}`) - ); - } else { - console.info( - chalk.yellowBright( - `OpenAPI spec is not exposed. To expose it, set ${chalk.bold( - 'exposeOpenApiSpec' - )} to ${chalk.bold('true')} in the Next REST Framework config.` - ) - ); - } - - global.reservedPathsLogged = true; -}; - -export const warnAboutReservedPath = ({ - path, - name, - configName -}: { - path?: string; - name: string; - configName: 'openApiJsonPath' | 'openApiYamlPath' | 'swaggerUiPath'; -}) => { - console.warn( - chalk.yellowBright( - `Warning: ${chalk.bold( - path - )} is reserved for ${name}. Update ${chalk.bold( - configName - )} in your Next REST Framework config to use this path for other purposes.` - ) - ); - - switch (configName) { - case 'openApiJsonPath': { - global.reservedOpenApiJsonPathWarningLogged = true; - break; - } - case 'openApiYamlPath': { - global.reservedOpenApiYamlPathWarningLogged = true; - break; - } - case 'swaggerUiPath': { - global.reservedSwaggerUiPathWarningLogged = true; - break; - } - } -}; - -export const handleReservedPathWarnings = ({ - url, - config: { openApiJsonPath, openApiYamlPath, swaggerUiPath } -}: { - url?: string; - config: NextRestFrameworkConfig; -}) => { - if (url === openApiJsonPath && !global.reservedOpenApiJsonPathWarningLogged) { - warnAboutReservedPath({ - path: openApiJsonPath, - name: 'OpenAPI JSON spec', - configName: 'openApiJsonPath' - }); - } - - if (url === openApiYamlPath && !global.reservedOpenApiYamlPathWarningLogged) { - warnAboutReservedPath({ - path: openApiYamlPath, - name: 'OpenAPI YAML spec', - configName: 'openApiYamlPath' - }); - } - - if (url === swaggerUiPath && !global.reservedSwaggerUiPathWarningLogged) { - warnAboutReservedPath({ - path: swaggerUiPath, - name: 'Swagger UI', - configName: 'swaggerUiPath' - }); - } -}; - -export const getHTMLForSwaggerUI = ({ - headers -}: { - headers: http.IncomingHttpHeaders; -}) => { - const proto = headers['x-forwarded-proto'] ?? 'http'; - const host = headers.host; - const url = `${proto}://${host}/api/openapi.yaml`; - - const css = readFileSync( - join( - process.cwd(), - 'node_modules/next-rest-framework/dist/swagger-ui/swagger-ui.css' - ) - ); - - const swaggerUiBundle = readFileSync( - join( - process.cwd(), - 'node_modules/next-rest-framework/dist/swagger-ui/swagger-ui-bundle.js' - ) - ); - - const swaggerUiStandalonePreset = readFileSync( - join( - process.cwd(), - 'node_modules/next-rest-framework/dist/swagger-ui/swagger-ui-standalone-preset.js' - ) - ); - - return ` - - - - - - Next REST Framework | SwaggerUI - - - -
- - - - -`; -}; - -export const isValidMethod = (x: unknown): x is ValidMethod => - Object.values(ValidMethod).includes(x as ValidMethod); - -export const getOpenApiSpecWithPaths = async ({ - req, - res, - config -}: { - req: NextApiRequest; - res: NextApiResponse; - config: NextRestFrameworkConfig; -}) => { - const paths = await generatePaths({ req, res, config }); - - const spec = { - ...config.openApiSpec, - openapi: OPEN_API_VERSION, - paths: merge(config.openApiSpec?.paths, paths) - }; - - return spec; -}; - -export const isZodSchema = (obj: unknown): obj is z.ZodAny => { - return !!obj && typeof obj === 'object' && '_def' in obj; -}; - -export const isYupSchema = (obj: unknown): obj is yup.AnySchema => { - return !!obj && obj.constructor.name === 'ObjectSchema'; -}; - -export const isYupValidationError = (e: unknown): e is yup.ValidationError => { - return e instanceof Error && e.name === 'ValidationError'; -}; - -export const convertSchemaToJsonSchema = ( - _schema: unknown -): OpenAPIV3_1.SchemaObject => { - let schema: OpenAPIV3_1.SchemaObject = {}; - - if (isZodSchema(_schema)) { - schema = zodToJsonSchema(_schema) as OpenAPIV3_1.SchemaObject; - } else if (isYupSchema(_schema)) { - schema = yupToJsonSchema(_schema) as OpenAPIV3_1.SchemaObject; - } else { - console.warn( - chalk.yellowBright( - "Warning: Unsupported schema type. Can't convert to JSON Schema." - ) - ); - } - - return schema; -}; - -export const defaultResponses: OpenAPIV3_1.ResponsesObject = { - 500: { - description: DEFAULT_ERRORS.unexpectedError, - content: { - 'application/json': { - schema: convertSchemaToJsonSchema(z.object({ message: z.string() })) - } - } - } -}; - -export const getPathsFromMethodHandlers = ({ - methodHandlers, - route -}: { - methodHandlers: DefineEndpointsParams; - route: string; -}) => { - const { $ref, summary, description, servers, parameters } = methodHandlers; - const paths: OpenAPIV3_1.PathsObject = {}; - - paths[route] = { - $ref: $ref as string | undefined, - summary, - description, - servers, - parameters - }; - - Object.keys(methodHandlers) - .filter(isValidMethod) - .forEach((method) => { - const { - tags, - summary, - description, - externalDocs, - operationId, - parameters, - requestBody: _requestBody, - responses: _responses, - callbacks, - deprecated, - security, - servers - } = methodHandlers[method] as MethodHandler; - - let requestBody: OpenAPIV3_1.OperationObject['requestBody']; - - if (_requestBody) { - const { - description, - required, - contentType, - schema: _schema, - examples, - example, - encoding - } = _requestBody; - - const schema = convertSchemaToJsonSchema(_schema); - - requestBody = { - description, - required, - content: { - [contentType]: { - schema, - examples, - example, - encoding - } - } - }; - } else { - requestBody = _requestBody; - } - - const responses: OpenAPIV3_1.ResponsesObject = { - ...defaultResponses - }; - - _responses.forEach( - ({ - status, - contentType, - description = 'Auto-generated description by Next REST Framework.', - headers, - links, - schema: _schema, - example, - examples, - encoding - }) => { - if (status) { - const schema = convertSchemaToJsonSchema(_schema); - - responses[status.toString()] = { - description, - headers, - links, - content: { - [contentType]: { - schema, - example, - examples, - encoding - } - } - }; - } - } - ); - - paths[route] = { - ...paths[route], - [method.toLowerCase()]: { - tags, - summary, - description, - externalDocs, - operationId, - parameters, - requestBody, - responses, - callbacks, - deprecated, - security, - servers - } - }; - }); - - return paths; -}; - -export const generatePaths = async ({ - req: { headers }, - config: { openApiJsonPath, openApiYamlPath, swaggerUiPath } -}: { - req: NextApiRequest; - res: NextApiResponse; - config: NextRestFrameworkConfig; -}): Promise => { - const filterApiRoutes = (file: string) => { - const isCatchAllRoute = file.includes('...'); - - const isOpenApiJsonRoute = file.endsWith( - `${openApiJsonPath?.split('/').at(-1)}.ts` - ); - - const isOpenApiYamlRoute = file.endsWith( - `${openApiYamlPath?.split('/').at(-1)}.ts` - ); - - const isSwaggerUiRoute = file.endsWith( - `${swaggerUiPath?.split('/').at(-1)}.ts` - ); - - if ( - isCatchAllRoute || - isOpenApiJsonRoute || - isOpenApiYamlRoute || - isSwaggerUiRoute - ) { - return false; - } else { - return true; - } - }; - - const mapApiRoutes = readdirSync(join(process.cwd(), 'pages/api')) - .filter(filterApiRoutes) - .map((file) => - `/api/${file}` - .replace('/index', '') - .replace('[', '{') - .replace(']', '}') - .replace('.ts', '') - ); - - let paths: OpenAPIV3_1.PathsObject = {}; - - await Promise.all( - mapApiRoutes.map(async (route) => { - try { - const proto = headers['x-forwarded-proto'] ?? 'http'; - const host = headers.host; - const url = `${proto}://${host}${route}`; - - const res = await fetch(url, { - headers: { - 'User-Agent': NEXT_REST_FRAMEWORK_USER_AGENT - } - }); - - const data: Record = - await res.json(); - - paths = { ...paths, ...data }; - } catch (error) { - logNextRestFrameworkError({ error }); - } - }) - ); - - return paths; -}; diff --git a/packages/next-rest-framework/src/utils/config.ts b/packages/next-rest-framework/src/utils/config.ts new file mode 100644 index 0000000..0cc9e4d --- /dev/null +++ b/packages/next-rest-framework/src/utils/config.ts @@ -0,0 +1,32 @@ +import { OPEN_API_VERSION, VERSION } from '../constants'; +import { OpenAPIV3_1 } from 'openapi-types'; +import { Modify, NextRestFrameworkConfig } from '../types'; +import { logNextRestFrameworkError } from './logging'; + +export const getDefaultConfig = ({ + config +}: { + config?: NextRestFrameworkConfig; +} = {}): Modify< + NextRestFrameworkConfig, + { + openApiSpec: OpenAPIV3_1.Document; + } +> => ({ + openApiSpec: { + openapi: OPEN_API_VERSION, + info: { + title: 'Next REST Framework', + description: + 'This is an autogenerated OpenAPI spec by Next REST Framework.', + version: VERSION + }, + components: {} + }, + openApiJsonPath: '/api/openapi.json', + openApiYamlPath: '/api/openapi.yaml', + swaggerUiPath: '/api', + exposeOpenApiSpec: true, + errorHandler: logNextRestFrameworkError, + suppressInfo: false +}); diff --git a/packages/next-rest-framework/src/utils/index.ts b/packages/next-rest-framework/src/utils/index.ts new file mode 100644 index 0000000..ee250cc --- /dev/null +++ b/packages/next-rest-framework/src/utils/index.ts @@ -0,0 +1,4 @@ +export * from './config'; +export * from './logging'; +export * from './open-api'; +export * from './schemas'; diff --git a/packages/next-rest-framework/src/utils/logging.ts b/packages/next-rest-framework/src/utils/logging.ts new file mode 100644 index 0000000..4728a0a --- /dev/null +++ b/packages/next-rest-framework/src/utils/logging.ts @@ -0,0 +1,144 @@ +import chalk from 'chalk'; +import { NextRestFrameworkConfig } from '../types'; +import http from 'http'; +import isEqualWith from 'lodash.isequalwith'; + +export const logNextRestFrameworkError = ({ error }: { error: unknown }) => { + if (process.env.NODE_ENV !== 'production') { + console.error( + chalk.red(`Next REST Framework encountered an error: +${error}`) + ); + } else { + console.error( + chalk.red( + 'Next REST Framework encountered an error - suppressed in production mode.' + ) + ); + } +}; + +export const logInitInfo = ({ + config +}: { + config: NextRestFrameworkConfig; +}) => { + const configsEqual = isEqualWith( + global.nextRestFrameworkConfig, + config, + (val1, val2) => { + if (typeof val1 === 'function' && typeof val2 === 'function') { + return val1.toString() === val2.toString(); + } + } + ); + + if (!global.nextRestFrameworkConfig) { + global.nextRestFrameworkConfig = config; + console.info(chalk.green('Next REST Framework initialized! 🚀')); + } else if (!configsEqual) { + console.info( + chalk.green('Next REST Framework config changed, re-initializing!') + ); + + global.nextRestFrameworkConfig = config; + global.reservedPathsLogged = false; + } +}; + +export const logReservedPaths = ({ + config, + headers +}: { + config: NextRestFrameworkConfig; + headers: http.IncomingHttpHeaders; +}) => { + const proto = headers['x-forwarded-proto'] ?? 'http'; + const host = headers.host; + const baseUrl = `${proto}://${host}`; + + if (config.exposeOpenApiSpec) { + console.info( + chalk.yellowBright(`Swagger UI: ${baseUrl}${config.swaggerUiPath} +OpenAPI JSON: ${baseUrl}${config.openApiJsonPath} +OpenAPI YAML: ${baseUrl}${config.openApiYamlPath}`) + ); + } else { + console.info( + chalk.yellowBright( + `OpenAPI spec is not exposed. To expose it, set ${chalk.bold( + 'exposeOpenApiSpec' + )} to ${chalk.bold('true')} in the Next REST Framework config.` + ) + ); + } + + global.reservedPathsLogged = true; +}; + +export const warnAboutReservedPath = ({ + path, + name, + configName +}: { + path?: string; + name: string; + configName: 'openApiJsonPath' | 'openApiYamlPath' | 'swaggerUiPath'; +}) => { + console.warn( + chalk.yellowBright( + `Warning: ${chalk.bold( + path + )} is reserved for ${name}. Update ${chalk.bold( + configName + )} in your Next REST Framework config to use this path for other purposes.` + ) + ); + + switch (configName) { + case 'openApiJsonPath': { + global.reservedOpenApiJsonPathWarningLogged = true; + break; + } + case 'openApiYamlPath': { + global.reservedOpenApiYamlPathWarningLogged = true; + break; + } + case 'swaggerUiPath': { + global.reservedSwaggerUiPathWarningLogged = true; + break; + } + } +}; + +export const handleReservedPathWarnings = ({ + url, + config: { openApiJsonPath, openApiYamlPath, swaggerUiPath } +}: { + url?: string; + config: NextRestFrameworkConfig; +}) => { + if (url === openApiJsonPath && !global.reservedOpenApiJsonPathWarningLogged) { + warnAboutReservedPath({ + path: openApiJsonPath, + name: 'OpenAPI JSON spec', + configName: 'openApiJsonPath' + }); + } + + if (url === openApiYamlPath && !global.reservedOpenApiYamlPathWarningLogged) { + warnAboutReservedPath({ + path: openApiYamlPath, + name: 'OpenAPI YAML spec', + configName: 'openApiYamlPath' + }); + } + + if (url === swaggerUiPath && !global.reservedSwaggerUiPathWarningLogged) { + warnAboutReservedPath({ + path: swaggerUiPath, + name: 'Swagger UI', + configName: 'swaggerUiPath' + }); + } +}; diff --git a/packages/next-rest-framework/src/utils/open-api.ts b/packages/next-rest-framework/src/utils/open-api.ts new file mode 100644 index 0000000..1202517 --- /dev/null +++ b/packages/next-rest-framework/src/utils/open-api.ts @@ -0,0 +1,269 @@ +import { readdirSync, readFileSync } from 'fs'; +import { join } from 'path'; +import http from 'http'; +import { NextApiRequest, NextApiResponse } from 'next'; +import { + DefineEndpointsParams, + MethodHandler, + NextRestFrameworkConfig +} from '../types'; +import { OpenAPIV3_1 } from 'openapi-types'; +import { + DEFAULT_ERRORS, + NEXT_REST_FRAMEWORK_USER_AGENT, + OPEN_API_VERSION, + ValidMethod +} from '../constants'; +import merge from 'lodash.merge'; +import { getJsonSchema } from './schemas'; + +export const getHTMLForSwaggerUI = ({ + headers +}: { + headers: http.IncomingHttpHeaders; +}) => { + const proto = headers['x-forwarded-proto'] ?? 'http'; + const host = headers.host; + const url = `${proto}://${host}/api/openapi.yaml`; + + const css = readFileSync( + join( + process.cwd(), + 'node_modules/next-rest-framework/dist/swagger-ui/swagger-ui.css' + ) + ); + + const swaggerUiBundle = readFileSync( + join( + process.cwd(), + 'node_modules/next-rest-framework/dist/swagger-ui/swagger-ui-bundle.js' + ) + ); + + const swaggerUiStandalonePreset = readFileSync( + join( + process.cwd(), + 'node_modules/next-rest-framework/dist/swagger-ui/swagger-ui-standalone-preset.js' + ) + ); + + return ` + + + + + + Next REST Framework | SwaggerUI + + + +
+ + + + + `; +}; + +// Generate the OpenAPI paths from the Next.js API routes. +// If a single path fails to generate, the entire process will fail. +const generatePaths = async ({ + req: { headers }, + config: { openApiJsonPath, openApiYamlPath, swaggerUiPath } +}: { + req: NextApiRequest; + res: NextApiResponse; + config: NextRestFrameworkConfig; +}): Promise => { + const filterApiRoutes = (file: string) => { + const isCatchAllRoute = file.includes('...'); + + const isOpenApiJsonRoute = file.endsWith( + `${openApiJsonPath?.split('/').at(-1)}.ts` + ); + + const isOpenApiYamlRoute = file.endsWith( + `${openApiYamlPath?.split('/').at(-1)}.ts` + ); + + const isSwaggerUiRoute = file.endsWith( + `${swaggerUiPath?.split('/').at(-1)}.ts` + ); + + if ( + isCatchAllRoute || + isOpenApiJsonRoute || + isOpenApiYamlRoute || + isSwaggerUiRoute + ) { + return false; + } else { + return true; + } + }; + + const mapApiRoutes = readdirSync(join(process.cwd(), 'pages/api')) + .filter(filterApiRoutes) + .map((file) => + `/api/${file}` + .replace('/index', '') + .replace('[', '{') + .replace(']', '}') + .replace('.ts', '') + ); + + let paths: OpenAPIV3_1.PathsObject = {}; + + await Promise.all( + mapApiRoutes.map(async (route) => { + const proto = headers['x-forwarded-proto'] ?? 'http'; + const host = headers.host; + const url = `${proto}://${host}${route}`; + + const res = await fetch(url, { + headers: { + 'User-Agent': NEXT_REST_FRAMEWORK_USER_AGENT + } + }); + + const data: Record = await res.json(); + + const isPathItemObject = ( + obj: unknown + ): obj is OpenAPIV3_1.PathItemObject => { + return typeof obj === 'object' && !!obj && !('message' in obj); + }; + + if (res.status === 200 && isPathItemObject(data)) { + paths = { ...paths, ...data }; + } + }) + ); + + return paths; +}; + +export const getOpenApiSpecWithPaths = async ({ + req, + res, + config +}: { + req: NextApiRequest; + res: NextApiResponse; + config: NextRestFrameworkConfig; +}) => { + const paths = await generatePaths({ req, res, config }); + + const spec = { + ...config.openApiSpec, + openapi: OPEN_API_VERSION, + paths: merge(config.openApiSpec?.paths, paths) + }; + + return spec; +}; + +export const defaultResponse: OpenAPIV3_1.ResponseObject = { + description: DEFAULT_ERRORS.unexpectedError, + content: { + 'application/json': { + schema: { + type: 'object', + properties: { + message: { type: 'string' } + } + } + } + } +}; + +export const isValidMethod = (x: unknown): x is ValidMethod => + Object.values(ValidMethod).includes(x as ValidMethod); + +export const getPathsFromMethodHandlers = ({ + config, + methodHandlers, + route +}: { + config: NextRestFrameworkConfig; + methodHandlers: DefineEndpointsParams; + route: string; +}) => { + const { openApiSpec } = methodHandlers; + const paths: OpenAPIV3_1.PathsObject = {}; + + paths[route] = { + ...openApiSpec + }; + + Object.keys(methodHandlers) + .filter(isValidMethod) + .forEach((_method) => { + const { openApiSpec, input, output } = methodHandlers[ + _method + ] as MethodHandler; + + const method = _method.toLowerCase(); + + let requestBodyContent: Record = {}; + + if (input) { + const schema = getJsonSchema({ schema: input.schema }); + + requestBodyContent = { + [input.contentType]: { + schema + } + }; + } + + const generatedResponses = output?.reduce( + (obj, { status, contentType, schema }) => { + const responseSchema = getJsonSchema({ schema }); + + return Object.assign(obj, { + [status]: { + content: { + [contentType]: { + schema: responseSchema + } + } + } + }); + }, + {} + ); + + const generatedOperationObject: OpenAPIV3_1.OperationObject = { + requestBody: { + content: requestBodyContent + }, + responses: { + ...generatedResponses, + default: defaultResponse + } + }; + + paths[route] = { + ...paths[route], + [method]: merge(generatedOperationObject, openApiSpec) + }; + }); + + return paths; +}; diff --git a/packages/next-rest-framework/src/utils/schemas.ts b/packages/next-rest-framework/src/utils/schemas.ts new file mode 100644 index 0000000..1189276 --- /dev/null +++ b/packages/next-rest-framework/src/utils/schemas.ts @@ -0,0 +1,296 @@ +import { OpenAPIV3_1 } from 'openapi-types'; +import { z } from 'zod'; +import * as yup from 'yup'; +import { BaseSchemaType } from '../types'; + +export const isZodSchema = (schema: unknown): schema is z.ZodSchema => + !!schema && typeof schema === 'object' && '_def' in schema; + +const zodSchemaValidator = ({ + schema, + body +}: { + schema: z.ZodSchema; + body: unknown; +}) => { + const data = schema.safeParse(body); + + const errors = !data.success + ? data.error.issues.map(({ message }) => message) + : null; + + return { + valid: data.success, + errors + }; +}; + +export const convertZodSchema = (schema: z.ZodSchema) => { + let jsonSchema = {}; + + const isZodString = (schema: z.ZodSchema): schema is z.ZodString => { + // @ts-expect-error + return schema._def.typeName === 'ZodString'; + }; + + const isZodNumber = (schema: z.ZodSchema): schema is z.ZodNumber => { + // @ts-expect-error + return schema._def.typeName === 'ZodNumber'; + }; + + const isZodBoolean = (schema: z.ZodSchema): schema is z.ZodBoolean => { + // @ts-expect-error + return schema._def.typeName === 'ZodBoolean'; + }; + + const isZodArray = (schema: z.ZodSchema): schema is z.ZodArray => { + // @ts-expect-error + return schema._def.typeName === 'ZodArray'; + }; + + const isZodObject = (schema: z.ZodSchema): schema is z.ZodObject => { + // @ts-expect-error + return schema._def.typeName === 'ZodObject'; + }; + + const convertZodShape = (shape: z.ZodRawShape) => { + const jsonSchema: OpenAPIV3_1.SchemaObject = {}; + + Object.entries(shape).forEach(([key, value]) => { + if (isZodString(value)) { + jsonSchema[key as keyof typeof jsonSchema] = { + type: 'string' + }; + } + + if (isZodNumber(value)) { + jsonSchema[key as keyof typeof jsonSchema] = { + type: 'number' + }; + } + + if (isZodBoolean(value)) { + jsonSchema[key as keyof typeof jsonSchema] = { + type: 'boolean' + }; + } + + if (isZodArray(value)) { + jsonSchema[key as keyof typeof jsonSchema] = { + type: 'array', + items: convertZodSchema(value._def.type) + }; + } + + if (isZodObject(value)) { + jsonSchema[key as keyof typeof jsonSchema] = { + type: 'object', + properties: convertZodShape(value._def.shape()) + }; + } + }); + + return jsonSchema; + }; + + if (isZodString(schema)) { + jsonSchema = { + type: 'string' + }; + } + + if (isZodNumber(schema)) { + jsonSchema = { + type: 'number' + }; + } + + if (isZodBoolean(schema)) { + jsonSchema = { + type: 'boolean' + }; + } + + if (isZodArray(schema)) { + jsonSchema = { + type: 'array', + items: convertZodSchema(schema._def.type) + }; + } + + if (isZodObject(schema)) { + jsonSchema = { + type: 'object', + properties: convertZodShape(schema._def.shape()) + }; + } + + return jsonSchema; +}; + +const isYupSchema = (schema: unknown): schema is yup.AnySchema => + !!schema && typeof schema === 'object' && 'spec' in schema; + +const yupSchemaValidator = async ({ + schema, + body +}: { + schema: yup.AnySchema; + body: unknown; +}) => { + let valid = true; + let errors = null; + + try { + await schema.validate(body); + } catch (e) { + valid = false; + + if (e instanceof yup.ValidationError) { + errors = e.errors; + } else { + errors = ['Unexpected error.']; + } + } + + return { + valid, + errors + }; +}; + +const convertYupSchema = (schema: yup.AnySchema) => { + let jsonSchema = {}; + + const isYupString = (schema: yup.AnySchema): schema is yup.StringSchema => { + return schema.type === 'string'; + }; + + const isYupNumber = (schema: yup.AnySchema): schema is yup.NumberSchema => { + return schema.type === 'number'; + }; + + const isYupBoolean = (schema: yup.AnySchema): schema is yup.BooleanSchema => { + return schema.type === 'boolean'; + }; + + const isYupArray = ( + schema: yup.AnySchema + ): schema is yup.ArraySchema => { + return schema.type === 'array'; + }; + + const isYupObject = ( + schema: yup.AnySchema + ): schema is yup.ObjectSchema => { + return schema.type === 'object'; + }; + + const convertYupFields = (fields: yup.ObjectSchema) => { + const jsonSchema: OpenAPIV3_1.SchemaObject = {}; + + Object.entries(fields).forEach(([key, value]) => { + if (isYupString(value)) { + jsonSchema[key as keyof typeof jsonSchema] = { + type: 'string' + }; + } + + if (isYupNumber(value)) { + jsonSchema[key as keyof typeof jsonSchema] = { + type: 'number' + }; + } + + if (isYupBoolean(value)) { + jsonSchema[key as keyof typeof jsonSchema] = { + type: 'boolean' + }; + } + + if (isYupArray(value)) { + jsonSchema[key as keyof typeof jsonSchema] = { + type: 'array', + items: convertYupSchema(value.innerType) + }; + } + + if (isYupObject(value)) { + jsonSchema[key as keyof typeof jsonSchema] = { + type: 'object', + properties: convertYupFields(value.fields) + }; + } + }); + + return jsonSchema; + }; + + if (isYupString(schema)) { + jsonSchema = { + type: 'string' + }; + } + + if (isYupNumber(schema)) { + jsonSchema = { + type: 'number' + }; + } + + if (isYupBoolean(schema)) { + jsonSchema = { + type: 'boolean' + }; + } + + if (isYupArray(schema)) { + jsonSchema = { + type: 'array', + items: convertYupSchema(schema.innerType) + }; + } + + if (isYupObject(schema)) { + jsonSchema = { + type: 'object', + properties: convertYupFields(schema.fields) + }; + } + + return jsonSchema; +}; + +export const validateRequestBody = async ({ + schema, + body +}: { + schema: BaseSchemaType; + body: unknown; +}) => { + if (isZodSchema(schema)) { + return zodSchemaValidator({ schema, body }); + } + + if (isYupSchema(schema)) { + return await yupSchemaValidator({ schema, body }); + } + + throw Error('Invalid schema.'); +}; + +export const getJsonSchema = ({ + schema +}: { + schema: BaseSchemaType; +}): OpenAPIV3_1.SchemaObject => { + if (isZodSchema(schema)) { + return convertZodSchema(schema); + } + + if (isYupSchema(schema)) { + return convertYupSchema(schema); + } + + throw Error('Invalid schema.'); +}; diff --git a/packages/next-rest-framework/tests/index.test.ts b/packages/next-rest-framework/tests/index.test.ts index caa0a28..84dc78a 100644 --- a/packages/next-rest-framework/tests/index.test.ts +++ b/packages/next-rest-framework/tests/index.test.ts @@ -2,11 +2,12 @@ import { NextRestFramework } from '../src'; import { RequestMethod } from 'node-mocks-http'; import { getDefaultConfig, getHTMLForSwaggerUI } from '../src/utils'; import { DEFAULT_ERRORS, ValidMethod, VERSION } from '../src/constants'; -import { z } from 'zod'; import { NextRestFrameworkConfig } from '../src/types'; import merge from 'lodash.merge'; import chalk from 'chalk'; import { createNextRestFrameworkMocks, resetCustomGlobals } from './utils'; +import { z } from 'zod'; +import * as yup from 'yup'; jest.mock('fs', () => ({ readdirSync: () => [], @@ -17,107 +18,106 @@ beforeEach(() => { resetCustomGlobals(); }); -describe('handler', () => { - it('uses the default config by default', () => { - const { config } = NextRestFramework(); - expect(JSON.stringify(config)).toEqual(JSON.stringify(getDefaultConfig())); - }); +it('uses the default config by default', () => { + const { config } = NextRestFramework(); + expect(JSON.stringify(config)).toEqual(JSON.stringify(getDefaultConfig())); +}); - it('sets the global config', () => { - const customConfig: NextRestFrameworkConfig = { - openApiSpec: { - info: { - title: 'Some Title', - version: '1.2.3' - }, - paths: {} +it('sets the global config', () => { + const customConfig: NextRestFrameworkConfig = { + openApiSpec: { + info: { + title: 'Some Title', + version: '1.2.3' }, - openApiJsonPath: '/foo/bar', - openApiYamlPath: '/bar/baz', - swaggerUiPath: '/baz/qux', - exposeOpenApiSpec: false, - errorHandler: () => {} - }; - - const { config } = NextRestFramework(customConfig); - - expect(JSON.stringify(config)).toEqual( - JSON.stringify(merge(getDefaultConfig(), customConfig)) - ); - }); + paths: {} + }, + openApiJsonPath: '/foo/bar', + openApiYamlPath: '/bar/baz', + swaggerUiPath: '/baz/qux', + exposeOpenApiSpec: false, + errorHandler: () => {} + }; + + const { config } = NextRestFramework(customConfig); + + expect(JSON.stringify(config)).toEqual( + JSON.stringify(merge(getDefaultConfig(), customConfig)) + ); +}); - it('logs init, reserved paths and config changed info', async () => { - console.info = jest.fn(); +it('logs init, reserved paths and config changed info', async () => { + console.info = jest.fn(); - const { req, res } = createNextRestFrameworkMocks({ - method: 'GET', - path: '/api/openapi.yaml', - headers: { - 'x-forwarded-proto': 'http', - host: 'localhost:3000' - } - }); + const { req, res } = createNextRestFrameworkMocks({ + method: 'GET', + path: '/api/openapi.yaml', + headers: { + 'x-forwarded-proto': 'http', + host: 'localhost:3000' + } + }); - await NextRestFramework().defineCatchAllHandler()(req, res); + await NextRestFramework().defineCatchAllHandler()(req, res); - expect(console.info).toHaveBeenNthCalledWith( - 1, - chalk.green('Next REST Framework initialized! 🚀') - ); + expect(console.info).toHaveBeenNthCalledWith( + 1, + chalk.green('Next REST Framework initialized! 🚀') + ); - expect(console.info).toHaveBeenNthCalledWith( - 2, - chalk.yellowBright(`Swagger UI: http://localhost:3000/api + expect(console.info).toHaveBeenNthCalledWith( + 2, + chalk.yellowBright(`Swagger UI: http://localhost:3000/api OpenAPI JSON: http://localhost:3000/api/openapi.json OpenAPI YAML: http://localhost:3000/api/openapi.yaml`) - ); - - await NextRestFramework({ - swaggerUiPath: '/api/foo/bar', - openApiJsonPath: '/api/bar/baz', - openApiYamlPath: '/api/baz/qux' - }).defineCatchAllHandler()(req, res); - - expect(console.info).toHaveBeenNthCalledWith( - 3, - chalk.green('Next REST Framework config changed, re-initializing!') - ); - - expect(console.info).toHaveBeenNthCalledWith( - 4, - chalk.yellowBright(`Swagger UI: http://localhost:3000/api/foo/bar + ); + + await NextRestFramework({ + swaggerUiPath: '/api/foo/bar', + openApiJsonPath: '/api/bar/baz', + openApiYamlPath: '/api/baz/qux' + }).defineCatchAllHandler()(req, res); + + expect(console.info).toHaveBeenNthCalledWith( + 3, + chalk.green('Next REST Framework config changed, re-initializing!') + ); + + expect(console.info).toHaveBeenNthCalledWith( + 4, + chalk.yellowBright(`Swagger UI: http://localhost:3000/api/foo/bar OpenAPI JSON: http://localhost:3000/api/bar/baz OpenAPI YAML: http://localhost:3000/api/baz/qux`) - ); - - await NextRestFramework({ - exposeOpenApiSpec: false - }).defineCatchAllHandler()(req, res); - - expect(console.info).toHaveBeenNthCalledWith( - 5, - chalk.green('Next REST Framework config changed, re-initializing!') - ); - - expect(console.info).toHaveBeenNthCalledWith( - 6, - chalk.yellowBright( - `OpenAPI spec is not exposed. To expose it, set ${chalk.bold( - 'exposeOpenApiSpec' - )} to ${chalk.bold('true')} in the Next REST Framework config.` - ) - ); - }); + ); - it('returns OpenAPI YAML spec', async () => { - const { req, res } = createNextRestFrameworkMocks({ - method: 'GET', - path: '/api/openapi.yaml' - }); + await NextRestFramework({ + exposeOpenApiSpec: false + }).defineCatchAllHandler()(req, res); + + expect(console.info).toHaveBeenNthCalledWith( + 5, + chalk.green('Next REST Framework config changed, re-initializing!') + ); + + expect(console.info).toHaveBeenNthCalledWith( + 6, + chalk.yellowBright( + `OpenAPI spec is not exposed. To expose it, set ${chalk.bold( + 'exposeOpenApiSpec' + )} to ${chalk.bold('true')} in the Next REST Framework config.` + ) + ); +}); + +it('returns OpenAPI YAML spec', async () => { + const { req, res } = createNextRestFrameworkMocks({ + method: 'GET', + path: '/api/openapi.yaml' + }); - await NextRestFramework().defineCatchAllHandler()(req, res); + await NextRestFramework().defineCatchAllHandler()(req, res); - const yaml = `openapi: 3.0.1 + const yaml = `openapi: 3.0.1 info: title: Next REST Framework description: This is an autogenerated OpenAPI spec by Next REST Framework. @@ -126,164 +126,221 @@ components: {} paths: {} `; - expect(res._getData()).toEqual(yaml); + expect(res._getData()).toEqual(yaml); +}); + +it('returns OpenAPI JSON spec', async () => { + const { req, res } = createNextRestFrameworkMocks({ + method: 'GET', + path: '/api/openapi.json' }); - it('returns OpenAPI JSON spec', async () => { - const { req, res } = createNextRestFrameworkMocks({ - method: 'GET', - path: '/api/openapi.json' - }); + await NextRestFramework().defineCatchAllHandler()(req, res); + + const json = { + openapi: '3.0.1', + info: { + title: 'Next REST Framework', + description: + 'This is an autogenerated OpenAPI spec by Next REST Framework.', + version: VERSION + }, + components: {}, + paths: {} + }; + + expect(res._getJSONData()).toEqual(json); +}); - await NextRestFramework().defineCatchAllHandler()(req, res); +it('returns Swagger UI', async () => { + const headers = { + 'x-forwarded-proto': 'http', + host: 'localhost:3000' + }; - const json = { - openapi: '3.0.1', - info: { - title: 'Next REST Framework', - description: - 'This is an autogenerated OpenAPI spec by Next REST Framework.', - version: VERSION - }, - components: {}, - paths: {} - }; - - expect(res._getJSONData()).toEqual(json); + const { req, res } = createNextRestFrameworkMocks({ + method: 'GET', + path: '/api', + headers }); - it('returns Swagger UI', async () => { - const headers = { - 'x-forwarded-proto': 'http', - host: 'localhost:3000' - }; + await NextRestFramework().defineCatchAllHandler()(req, res); + const html = getHTMLForSwaggerUI({ headers }); + expect(res._getData()).toEqual(html); +}); +it.each(Object.values(ValidMethod))( + 'works with HTTP method: %p', + async (method) => { const { req, res } = createNextRestFrameworkMocks({ - method: 'GET', - path: '/api', - headers + method }); - await NextRestFramework().defineCatchAllHandler()(req, res); - const html = getHTMLForSwaggerUI({ headers }); - expect(res._getData()).toEqual(html); - }); -}); + const output = [ + { + status: 200, + contentType: 'application/json', + schema: z.array(z.string()) + } + ]; -describe('defineEndpoints', () => { - it.each(Object.values(ValidMethod))( - 'works with HTTP method: %p', - async (method) => { - const { req, res } = createNextRestFrameworkMocks({ - method - }); + const data = ['All good!']; - const responses = [ - { - status: 200, - contentType: 'application/json', - schema: z.array(z.string()) + await NextRestFramework().defineEndpoints({ + [ValidMethod.GET]: { + output, + handler: ({ res }) => { + res.status(200).json(data); } - ]; + }, + [ValidMethod.PUT]: { + output, + handler: ({ res }) => { + res.status(200).json(data); + } + }, + [ValidMethod.POST]: { + output, + handler: ({ res }) => { + res.status(200).json(data); + } + }, + [ValidMethod.DELETE]: { + output, + handler: ({ res }) => { + res.status(200).json(data); + } + }, + [ValidMethod.OPTIONS]: { + output, + handler: ({ res }) => { + res.status(200).json(data); + } + }, + [ValidMethod.HEAD]: { + output, + handler: ({ res }) => { + res.status(200).json(data); + } + }, + [ValidMethod.PATCH]: { + output, + handler: ({ res }) => { + res.status(200).json(data); + } + }, + [ValidMethod.TRACE]: { + output, + handler: ({ res }) => { + res.status(200).json(data); + } + } + })(req, res); - const data = ['All good!']; + expect(res._getJSONData()).toEqual(data); + } +); - await NextRestFramework().defineEndpoints({ - [ValidMethod.GET]: { - responses, - handler: ({ res }) => { - res.status(200).json(data); - } - }, - [ValidMethod.PUT]: { - responses, - handler: ({ res }) => { - res.status(200).json(data); - } - }, - [ValidMethod.POST]: { - responses, - handler: ({ res }) => { - res.status(200).json(data); - } - }, - [ValidMethod.DELETE]: { - responses, - handler: ({ res }) => { - res.status(200).json(data); - } - }, - [ValidMethod.OPTIONS]: { - responses, - handler: ({ res }) => { - res.status(200).json(data); - } - }, - [ValidMethod.HEAD]: { - responses, - handler: ({ res }) => { - res.status(200).json(data); - } - }, - [ValidMethod.PATCH]: { - responses, - handler: ({ res }) => { - res.status(200).json(data); - } - }, - [ValidMethod.TRACE]: { - responses, - handler: ({ res }) => { - res.status(200).json(data); - } - } - })(req, res); +it('returns error for valid methods with no handlers', async () => { + const { req, res } = createNextRestFrameworkMocks({ + method: 'POST' + }); - expect(res._getJSONData()).toEqual(data); + await NextRestFramework().defineEndpoints({ + [ValidMethod.GET]: { + output: [], + handler: () => {} } - ); + })(req, res); - it('returns error for valid methods with no handlers', async () => { - const { req, res } = createNextRestFrameworkMocks({ - method: 'POST' - }); + expect(res._getStatusCode()).toEqual(405); + expect(res._getHeaders().allow).toEqual('GET'); - await NextRestFramework().defineEndpoints({ - [ValidMethod.GET]: { - responses: [], - handler: () => {} + expect(JSON.parse(res._getData())).toEqual({ + message: DEFAULT_ERRORS.methodNotAllowed + }); +}); + +it('works with a valid catch-all-handler', async () => { + const { req, res } = createNextRestFrameworkMocks({ + method: 'POST' + }); + + await NextRestFramework().defineCatchAllHandler({ + [ValidMethod.POST]: { + output: [], + handler: ({ res }) => { + res.status(200).json({ message: 'All good!' }); } - })(req, res); + } + })(req, res); - expect(res._getStatusCode()).toEqual(405); - expect(res._getHeaders().allow).toEqual('GET'); + expect(res._getStatusCode()).toEqual(200); - expect(JSON.parse(res._getData())).toEqual({ - message: DEFAULT_ERRORS.methodNotAllowed - }); + expect(JSON.parse(res._getData())).toEqual({ + message: 'All good!' }); +}); - it('returns error for invalid methods', async () => { - const { req, res } = createNextRestFrameworkMocks({ - method: 'FOO' as RequestMethod - }); +it('returns 404 for missing catch-all-handlers', async () => { + const { req, res } = createNextRestFrameworkMocks({ + method: 'GET' + }); - await NextRestFramework().defineEndpoints({ - [ValidMethod.GET]: { - responses: [], - handler: () => {} - } - })(req, res); + await NextRestFramework().defineCatchAllHandler({ + [ValidMethod.POST]: { + output: [], + handler: () => {} + } + })(req, res); - expect(res._getStatusCode()).toEqual(405); - expect(res._getHeaders().allow).toEqual('GET'); + expect(res._getStatusCode()).toEqual(404); - expect(JSON.parse(res._getData())).toEqual({ - message: DEFAULT_ERRORS.methodNotAllowed - }); + expect(JSON.parse(res._getData())).toEqual({ + message: DEFAULT_ERRORS.notFound + }); +}); + +it('returns error for invalid methods', async () => { + const { req, res } = createNextRestFrameworkMocks({ + method: 'FOO' as RequestMethod + }); + + await NextRestFramework().defineEndpoints({ + [ValidMethod.GET]: { + output: [], + handler: () => {} + } + })(req, res); + + expect(res._getStatusCode()).toEqual(405); + expect(res._getHeaders().allow).toEqual('GET'); + + expect(JSON.parse(res._getData())).toEqual({ + message: DEFAULT_ERRORS.methodNotAllowed }); +}); - it('returns error for invalid request body', async () => { +it.each([ + { + name: 'Zod', + schema: z.object({ + foo: z.number() + }), + message: ['Expected number, received string'] + }, + { + name: 'Yup', + schema: yup.object({ + foo: yup.number() + }), + message: [ + 'foo must be a `number` type, but the final value was: `NaN` (cast from the value `"bar"`).' + ] + } +])( + 'returns error for invalid request body: $name', + async ({ schema, message }) => { const { req, res } = createNextRestFrameworkMocks({ method: 'POST', body: { @@ -296,186 +353,199 @@ describe('defineEndpoints', () => { await NextRestFramework().defineEndpoints({ [ValidMethod.POST]: { - responses: [], - handler: () => {}, - requestBody: { + input: { contentType: 'application/json', - schema: z.object({ - name: z.string() - }) - } + schema + }, + output: [], + handler: () => {} } - })( - // @ts-expect-error: Typed incorrectly on purpose. - req, - res - ); + })(req, res); expect(res._getStatusCode()).toEqual(400); expect(res._getJSONData()).toEqual({ - message: [ - { - code: 'invalid_type', - expected: 'string', - message: 'Required', - path: ['name'], - received: 'undefined' - } - ] + message }); + } +); + +it('returns error for invalid content-type', async () => { + const { req, res } = createNextRestFrameworkMocks({ + method: 'POST', + body: { + foo: 'bar' + }, + headers: { + 'content-type': 'application/xml' + } }); - it('works with middlewares', async () => { - const { req, res } = createNextRestFrameworkMocks({ - method: 'GET' - }); + await NextRestFramework().defineEndpoints({ + [ValidMethod.POST]: { + input: { + contentType: 'application/json', + schema: z.string() + }, + output: [], + handler: () => {} + } + })(req, res); + + expect(res._getStatusCode()).toEqual(415); + + expect(res._getJSONData()).toEqual({ + message: DEFAULT_ERRORS.invalidMediaType + }); +}); - await NextRestFramework({ - middleware: () => ({ - foo: 'foo' - }) - }).defineEndpoints({ - middleware: ({ params: { foo } }) => ({ bar: 'bar', foo }), - GET: { - responses: [ - { - status: 200, - contentType: 'application/json', - schema: z.object({ - foo: z.string(), - bar: z.string(), - baz: z.string() - }) - } - ], - middleware: ({ params: { foo, bar } }) => ({ foo, bar, baz: 'baz' }), - handler: ({ res, params: { foo, bar, baz } }) => { - res.status(200).json({ foo, bar, baz }); +it('works with middlewares', async () => { + const { req, res } = createNextRestFrameworkMocks({ + method: 'GET' + }); + + await NextRestFramework({ + middleware: () => ({ + foo: 'foo' + }) + }).defineEndpoints({ + middleware: ({ params: { foo } }) => ({ bar: 'bar', foo }), + GET: { + output: [ + { + status: 200, + contentType: 'application/json', + schema: z.object({ + foo: z.string(), + bar: z.string(), + baz: z.string() + }) } + ], + middleware: ({ params: { foo, bar } }) => ({ foo, bar, baz: 'baz' }), + handler: ({ res, params: { foo, bar, baz } }) => { + res.status(200).json({ foo, bar, baz }); } - })(req, res); + } + })(req, res); - expect(res._getStatusCode()).toEqual(200); + expect(res._getStatusCode()).toEqual(200); - expect(res._getJSONData()).toEqual({ - foo: 'foo', - bar: 'bar', - baz: 'baz' - }); + expect(res._getJSONData()).toEqual({ + foo: 'foo', + bar: 'bar', + baz: 'baz' }); +}); - describe('error handing', () => { - it('returns a default error response', async () => { - const { req, res } = createNextRestFrameworkMocks({ - method: 'GET' - }); - - console.error = jest.fn(); +it('returns a default error response', async () => { + const { req, res } = createNextRestFrameworkMocks({ + method: 'GET' + }); - await NextRestFramework().defineEndpoints({ - GET: { - responses: [], - handler: () => { - throw new Error('Something went wrong'); - } - } - })(req, res); + console.error = jest.fn(); - expect(res._getJSONData()).toEqual({ - message: DEFAULT_ERRORS.unexpectedError - }); - }); + await NextRestFramework().defineEndpoints({ + GET: { + output: [], + handler: () => { + throw Error('Something went wrong'); + } + } + })(req, res); - it('works with global error handler', async () => { - const { req, res } = createNextRestFrameworkMocks({ - method: 'GET' - }); + expect(res._getJSONData()).toEqual({ + message: DEFAULT_ERRORS.unexpectedError + }); +}); - console.log = jest.fn(); +it('works with global error handler', async () => { + const { req, res } = createNextRestFrameworkMocks({ + method: 'GET' + }); - await NextRestFramework({ - errorHandler: () => { - console.log('foo'); - } - }).defineEndpoints({ - GET: { - responses: [], - handler: () => { - throw new Error('Something went wrong'); - } - } - })(req, res); + console.log = jest.fn(); - expect(console.log).toBeCalledWith('foo'); - }); + await NextRestFramework({ + errorHandler: () => { + console.log('foo'); + } + }).defineEndpoints({ + GET: { + output: [], + handler: () => { + throw Error('Something went wrong'); + } + } + })(req, res); - it('works with route-specific error handler', async () => { - const { req, res } = createNextRestFrameworkMocks({ - method: 'GET' - }); + expect(console.log).toBeCalledWith('foo'); +}); - console.log = jest.fn(); +it('works with route-specific error handler', async () => { + const { req, res } = createNextRestFrameworkMocks({ + method: 'GET' + }); - await NextRestFramework().defineEndpoints({ - errorHandler: () => { - console.log('bar'); - }, - GET: { - responses: [], - handler: () => { - throw new Error('Something went wrong'); - } - } - })(req, res); + console.log = jest.fn(); - expect(console.log).toBeCalledWith('bar'); - }); + await NextRestFramework().defineEndpoints({ + errorHandler: () => { + console.log('bar'); + }, + GET: { + output: [], + handler: () => { + throw Error('Something went wrong'); + } + } + })(req, res); - it('works with method-specific error handler', async () => { - const { req, res } = createNextRestFrameworkMocks({ - method: 'GET' - }); - - console.log = jest.fn(); - - await NextRestFramework().defineEndpoints({ - GET: { - responses: [], - handler: () => { - throw new Error('Something went wrong'); - }, - errorHandler: () => { - console.log('baz'); - } - } - })(req, res); + expect(console.log).toBeCalledWith('bar'); +}); - expect(console.log).toBeCalledWith('baz'); - }); +it('works with method-specific error handler', async () => { + const { req, res } = createNextRestFrameworkMocks({ + method: 'GET' + }); - it('suppresses errors in production mode by default', async () => { - const { req, res } = createNextRestFrameworkMocks({ - method: 'GET' - }); + console.log = jest.fn(); - console.error = jest.fn(); - process.env = { ...process.env, NODE_ENV: 'production' }; + await NextRestFramework().defineEndpoints({ + GET: { + output: [], + handler: () => { + throw Error('Something went wrong'); + }, + errorHandler: () => { + console.log('baz'); + } + } + })(req, res); - await NextRestFramework().defineEndpoints({ - GET: { - responses: [], - handler: () => { - throw new Error('Something went wrong'); - } - } - })(req, res); + expect(console.log).toBeCalledWith('baz'); +}); - expect(console.error).toBeCalledWith( - chalk.red( - 'Next REST Framework encountered an error - suppressed in production mode.' - ) - ); - }); +it('suppresses errors in production mode by default', async () => { + const { req, res } = createNextRestFrameworkMocks({ + method: 'GET' }); + + console.error = jest.fn(); + process.env = { ...process.env, NODE_ENV: 'production' }; + + await NextRestFramework().defineEndpoints({ + GET: { + output: [], + handler: () => { + throw Error('Something went wrong'); + } + } + })(req, res); + + expect(console.error).toBeCalledWith( + chalk.red( + 'Next REST Framework encountered an error - suppressed in production mode.' + ) + ); }); diff --git a/packages/next-rest-framework/tests/paths.test.ts b/packages/next-rest-framework/tests/paths.test.ts index 0776994..71a53ff 100644 --- a/packages/next-rest-framework/tests/paths.test.ts +++ b/packages/next-rest-framework/tests/paths.test.ts @@ -1,13 +1,15 @@ import { NextRestFramework } from '../src'; -import { z } from 'zod'; -import zodToJsonSchema from 'zod-to-json-schema'; -import { defaultResponses, getPathsFromMethodHandlers } from '../src/utils'; -import { createNextRestFrameworkMocks, resetCustomGlobals } from './utils'; +import * as openApiUtils from '../src/utils/open-api'; +import { defaultResponse } from '../src/utils'; import { - TypedNextApiRequest, - TypedNextApiResponse, - DefineEndpointsParams -} from '../src/types'; + complexSchemaData, + complexYupSchema, + complexZodSchema, + createNextRestFrameworkMocks, + resetCustomGlobals +} from './utils'; +import { NEXT_REST_FRAMEWORK_USER_AGENT } from '../src/constants'; +import chalk from 'chalk'; jest.mock('fs', () => ({ readdirSync: () => [ @@ -22,218 +24,296 @@ beforeEach(() => { resetCustomGlobals(); }); -const fooMethodHandlers = { +const { defineEndpoints } = NextRestFramework(); + +const fooMethodHandlers = defineEndpoints({ POST: { - responses: [ + input: { + contentType: 'application/json', + schema: complexZodSchema + }, + output: [ { - description: 'foo', status: 201, - schema: z.string(), + schema: complexYupSchema, contentType: 'application/json' } ], - handler: ({ - req: { body }, - res - }: { - req: TypedNextApiRequest<{ name: string }>; - res: TypedNextApiResponse<201, 'application/json', string>; - }) => { - res.status(201).json(body.name); - }, - requestBody: { - contentType: 'application/json', - schema: z.object({ - name: z.string() - }) + handler: ({ req: { body }, res }) => { + res.status(201).json(body); } } -}; +}); -const fooBarMethodHandlers = { +const fooBarMethodHandlers = defineEndpoints({ PUT: { - responses: [ + input: { + contentType: 'application/json', + schema: complexYupSchema + }, + output: [ { - description: 'bar', status: 203, - schema: z.string(), + schema: complexZodSchema, contentType: 'application/json' } ], - handler: ({ - req: { body }, - res - }: { - req: TypedNextApiRequest<{ name: string }>; - res: TypedNextApiResponse<203, 'application/json', string>; - }) => { - res.status(203).json(body.name); - }, - requestBody: { - contentType: 'application/json', - schema: z.object({ - name: z.string() - }) + handler: ({ req: { body }, res }) => { + res.status(203).json(body); } } -}; +}); -const fooBarBazMethodHandlers = { +const fooBarBazMethodHandlers = defineEndpoints({ GET: { - responses: [ + output: [ { - description: 'baz', status: 200, - schema: z.string(), + schema: complexZodSchema, contentType: 'application/json' } ], - handler: ({ - res - }: { - res: TypedNextApiResponse<200, 'application/json', string>; - }) => { - res.status(200).send('baz'); + handler: ({ res }) => { + res.status(200).send(complexSchemaData); } } -}; +}); -const fooBarBazQuzMethodHandlers = { +const fooBarBazQuxMethodHandlers = defineEndpoints({ GET: { - responses: [ + output: [ { - description: 'qux', status: 200, - schema: z.string(), + schema: complexYupSchema, contentType: 'application/json' } ], - handler: ({ - res - }: { - res: TypedNextApiResponse<200, 'application/json', string>; - }) => { - res.status(200).send('qux'); + handler: ({ res }) => { + res.status(200).send(complexSchemaData); } } -}; +}); -jest.mock( - '../../../apps/dev/pages/api/foo', - () => - NextRestFramework().defineEndpoints( - fooMethodHandlers as DefineEndpointsParams - ), - { virtual: true } -); +jest.mock('../../../apps/dev/pages/api/foo', () => fooMethodHandlers, { + virtual: true +}); jest.mock( '../../../apps/dev/pages/api/foo/bar', - () => - NextRestFramework().defineEndpoints( - fooBarMethodHandlers as DefineEndpointsParams - ), + () => fooBarBazMethodHandlers, { virtual: true } ); jest.mock( '../../../apps/dev/pages/api/foo/bar/baz', - () => - NextRestFramework().defineEndpoints( - fooBarBazMethodHandlers as DefineEndpointsParams - ), + () => fooBarBazMethodHandlers, { virtual: true } ); jest.mock( '../../../apps/dev/pages/api/foo/bar/[qux]/index', - () => - NextRestFramework().defineEndpoints( - fooBarBazQuzMethodHandlers as DefineEndpointsParams - ), + () => fooBarBazQuxMethodHandlers, { virtual: true } ); // @ts-expect-error: TS expects the mock function to extend the typings of the global `fetch` function but we don't need those types here. -global.fetch = (url: string) => { - const route = url.replace('http://localhost:3000', ''); - console.log('route', route); +global.fetch = async (url: string) => { + const path = url.replace('http://localhost:3000', ''); + + const { req, res } = createNextRestFrameworkMocks({ + method: 'GET', + path, + headers: { + 'x-forwarded-proto': 'http', + host: 'localhost:3000', + 'user-agent': NEXT_REST_FRAMEWORK_USER_AGENT + } + }); const handlersForPaths = { '/api/foo': fooMethodHandlers, '/api/foo/bar': fooBarMethodHandlers, '/api/foo/bar/baz': fooBarBazMethodHandlers, - '/api/foo/bar/{qux}': fooBarBazQuzMethodHandlers + '/api/foo/bar/{qux}': fooBarBazQuxMethodHandlers }; - const methodHandlers = handlersForPaths[ - route as keyof typeof handlersForPaths - ] as DefineEndpointsParams; - const data = getPathsFromMethodHandlers({ methodHandlers, route }); + const methodHandlers = + handlersForPaths[path as keyof typeof handlersForPaths]; + + await methodHandlers(req, res); + const json = () => res._getJSONData(); return { - json: async () => await Promise.resolve(data) + json, + status: 200 }; }; -it('auto-generates responses', async () => { +it('auto-generates the paths from the internal endpoint responses', async () => { const { req, res } = createNextRestFrameworkMocks({ method: 'GET', path: '/api/openapi.json', headers: { 'x-forwarded-proto': 'http', - host: 'localhost:3000' + host: 'localhost:3000', + 'content-type': 'application/json' } }); await NextRestFramework().defineCatchAllHandler()(req, res); const { paths } = res._getJSONData(); - expect(paths['/api/foo'].post.responses).toEqual({ - ...defaultResponses, - 201: { - description: 'foo', - content: { - 'application/json': { - schema: zodToJsonSchema(z.string()) - } + const schema = { + type: 'object', + properties: { + name: { + type: 'string' + }, + age: { + type: 'number' + }, + hobbies: { + items: { + type: 'object', + properties: { + name: { + type: 'string' + }, + properties: { + type: 'object', + properties: { + foo: { + type: 'string' + } + } + } + } + }, + type: 'array' + }, + isCool: { + type: 'boolean' + } + } + }; + + const requestBody = { + content: { + 'application/json': { + schema + } + } + }; + + const responseContent = { + content: { + 'application/json': { + schema + } + } + }; + + expect(paths['/api/foo']).toEqual({ + post: { + requestBody, + responses: { + '201': responseContent, + default: defaultResponse } } }); - expect(paths['/api/foo/bar'].put.responses).toEqual({ - ...defaultResponses, - 203: { - description: 'bar', - content: { - 'application/json': { - schema: zodToJsonSchema(z.string()) - } + expect(paths['/api/foo/bar']).toEqual({ + put: { + requestBody, + responses: { + '203': responseContent, + default: defaultResponse } } }); - expect(paths['/api/foo/bar/baz'].get.responses).toEqual({ - ...defaultResponses, - 200: { - description: 'baz', - content: { - 'application/json': { - schema: zodToJsonSchema(z.string()) - } + expect(paths['/api/foo/bar/baz']).toEqual({ + get: { + requestBody: { + content: {} + }, + responses: { + '200': responseContent, + default: defaultResponse } } }); - expect(paths['/api/foo/bar/{qux}'].get.responses).toEqual({ - ...defaultResponses, - 200: { - description: 'qux', - content: { - 'application/json': { - schema: zodToJsonSchema(z.string()) - } + expect(paths['/api/foo/bar/{qux}']).toEqual({ + get: { + requestBody: { + content: {} + }, + responses: { + '200': responseContent, + default: defaultResponse } } }); }); + +it('handles error if the OpenAPI spec generation fails', async () => { + console.error = jest.fn(); + + jest.mock('../src/utils/open-api', () => { + return { + __esModule: true, + ...jest.requireActual('../src/utils/open-api') + }; + }); + + const error = 'Something went wrong'; + + jest + .spyOn(openApiUtils, 'getPathsFromMethodHandlers') + .mockImplementation(() => { + throw Error(error); + }); + + const { req, res } = createNextRestFrameworkMocks({ + method: 'GET', + path: '/api/openapi.json', + headers: { + 'x-forwarded-proto': 'http', + host: 'localhost:3000' + } + }); + + await NextRestFramework().defineCatchAllHandler()(req, res); + const { paths } = res._getJSONData(); + expect(paths).toEqual({}); + + expect(console.error).toHaveBeenNthCalledWith( + 1, + chalk.red(`Next REST Framework encountered an error: +${'Error: OpenAPI spec generation failed for route: /api/foo'} +${`Error: ${error}`}`) + ); + + expect(console.error).toHaveBeenNthCalledWith( + 2, + chalk.red(`Next REST Framework encountered an error: +${'Error: OpenAPI spec generation failed for route: /api/foo/bar'} +${`Error: ${error}`}`) + ); + + expect(console.error).toHaveBeenNthCalledWith( + 3, + chalk.red(`Next REST Framework encountered an error: +${'Error: OpenAPI spec generation failed for route: /api/foo/bar/baz'} +${`Error: ${error}`}`) + ); + + expect(console.error).toHaveBeenNthCalledWith( + 4, + chalk.red(`Next REST Framework encountered an error: +${'Error: OpenAPI spec generation failed for route: /api/foo/bar/{qux}'} +${`Error: ${error}`}`) + ); +}); diff --git a/packages/next-rest-framework/tests/reservedPaths.test.ts b/packages/next-rest-framework/tests/reserved-paths.test.ts similarity index 80% rename from packages/next-rest-framework/tests/reservedPaths.test.ts rename to packages/next-rest-framework/tests/reserved-paths.test.ts index 756f35e..a475517 100644 --- a/packages/next-rest-framework/tests/reservedPaths.test.ts +++ b/packages/next-rest-framework/tests/reserved-paths.test.ts @@ -1,7 +1,8 @@ import { NextRestFramework } from '../src'; -import { z } from 'zod'; import chalk from 'chalk'; import { createNextRestFrameworkMocks, resetCustomGlobals } from './utils'; +import { z } from 'zod'; +import * as yup from 'yup'; jest.mock('fs', () => ({ readdirSync: () => ['openapi.json.ts', 'openapi.yaml.ts', 'docs.ts'], @@ -12,50 +13,58 @@ beforeEach(() => { resetCustomGlobals(); }); -const openApiSpecHandler = NextRestFramework({ +const { defineEndpoints } = NextRestFramework({ swaggerUiPath: '/api/docs' -}).defineEndpoints({ +}); + +const inputSchema = z.object({ + name: z.string(), + age: z.number(), + isCool: z.boolean(), + hobbies: z.array(z.object({ name: z.string() })) +}); + +const outputSchema = yup.object({ + name: yup.string(), + age: yup.number(), + isCool: yup.boolean(), + hobbies: yup.array(yup.object({ name: yup.string() })) +}); + +const openApiSpecHandler = defineEndpoints({ POST: { - responses: [ + input: { + contentType: 'application/json', + schema: inputSchema + }, + output: [ { - description: 'foo', status: 201, - schema: z.string(), + schema: outputSchema, contentType: 'application/json' } ], handler: ({ req: { body }, res }) => { - res.status(201).json(body.name); - }, - requestBody: { - contentType: 'application/json', - schema: z.object({ - name: z.string() - }) + res.status(201).json(body); } } }); -const swaggerUiHandler = NextRestFramework({ - swaggerUiPath: '/api/docs' -}).defineEndpoints({ +const swaggerUiHandler = defineEndpoints({ PUT: { - responses: [ + input: { + contentType: 'application/json', + schema: inputSchema + }, + output: [ { - description: 'bar', status: 203, - schema: z.string(), + schema: outputSchema, contentType: 'application/json' } ], handler: ({ req: { body }, res }) => { - res.status(203).json(body.name); - }, - requestBody: { - contentType: 'application/json', - schema: z.object({ - name: z.string() - }) + res.status(203).json(body); } } }); diff --git a/packages/next-rest-framework/tests/utils.ts b/packages/next-rest-framework/tests/utils.ts index 96beedf..058c174 100644 --- a/packages/next-rest-framework/tests/utils.ts +++ b/packages/next-rest-framework/tests/utils.ts @@ -1,6 +1,11 @@ import { createMocks, RequestOptions, ResponseOptions } from 'node-mocks-http'; -import { TypedNextApiRequest, TypedNextApiResponse } from '../src/types'; -import { Modify } from '../src/utility-types'; +import { + Modify, + TypedNextApiRequest, + TypedNextApiResponse +} from '../src/types'; +import { z } from 'zod'; +import * as yup from 'yup'; export const resetCustomGlobals = () => { global.nextRestFrameworkConfig = undefined; @@ -20,3 +25,40 @@ export const createNextRestFrameworkMocks = ( // @ts-expect-error: Same as above. TypedNextApiResponse >(reqOptions as RequestOptions, resOptions); + +export const complexZodSchema = z.object({ + name: z.string(), + age: z.number(), + isCool: z.boolean(), + hobbies: z.array( + z.object({ + name: z.string(), + properties: z.object({ + foo: z.string() + }) + }) + ) +}); + +export const complexYupSchema = yup.object({ + name: yup.string().required(), + age: yup.number().required(), + isCool: yup.boolean().required(), + hobbies: yup + .array( + yup.object({ + name: yup.string().required(), + properties: yup.object({ + foo: yup.string().required() + }) + }) + ) + .required() +}); + +export const complexSchemaData = { + name: 'foo', + age: 1, + isCool: true, + hobbies: [{ name: 'bar', properties: { foo: 'bar' } }] +}; diff --git a/packages/next-rest-framework/tsconfig.json b/packages/next-rest-framework/tsconfig.json index d5f7dd0..b868adc 100644 --- a/packages/next-rest-framework/tsconfig.json +++ b/packages/next-rest-framework/tsconfig.json @@ -1,18 +1,7 @@ { + "extends": "@next-rest-framework/tsconfig/tsconfig.base.json", "compilerOptions": { - "target": "esnext", - "declaration": true, - "outDir": "./dist", - "esModuleInterop": true, - "skipLibCheck": true, - "strict": true, - "forceConsistentCasingInFileNames": true, - "module": "commonjs", - "moduleResolution": "node", - "resolveJsonModule": true, - "isolatedModules": true, - "incremental": true, - "allowJs": true + "outDir": "./dist" }, "include": ["src/**/*", "tests/**/*", "jest.config.ts"] } diff --git a/packages/tsconfig/package.json b/packages/tsconfig/package.json new file mode 100644 index 0000000..22079c4 --- /dev/null +++ b/packages/tsconfig/package.json @@ -0,0 +1,4 @@ +{ + "name": "@next-rest-framework/tsconfig", + "version": "0.0.0" +} diff --git a/packages/tsconfig/tsconfig.base.json b/packages/tsconfig/tsconfig.base.json new file mode 100644 index 0000000..81b3442 --- /dev/null +++ b/packages/tsconfig/tsconfig.base.json @@ -0,0 +1,17 @@ +{ + "compilerOptions": { + "target": "esnext", + "declaration": true, + "esModuleInterop": true, + "skipLibCheck": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "module": "commonjs", + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true, + "incremental": true, + "allowJs": true, + "strictNullChecks": true + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6f3d2f5..f353c5a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -28,11 +28,11 @@ importers: '@types/node': 18.11.9 '@types/react': 18.0.25 '@types/react-dom': 18.0.8 - '@typescript-eslint/eslint-plugin': 5.0.0_6smm3ppkqcrhrv2tlnxbs2d6xe + '@typescript-eslint/eslint-plugin': 5.0.0_sk6dheeoswfazfunrkzs65l6ae eslint: 8.0.1 eslint-config-prettier: 8.5.0_eslint@8.0.1 eslint-config-standard-with-typescript: 23.0.0_w6jtgcq3gfypkflswofniefxvi - eslint-plugin-import: 2.25.2_nrmdsx6ad244zymq7ioo53a7zy + eslint-plugin-import: 2.25.2_uhrjhsy2b3ck2b4sjj2nhiqd4m eslint-plugin-n: 15.0.0_eslint@8.0.1 eslint-plugin-promise: 6.0.0_eslint@8.0.1 next: 13.0.2_biqbaboplfbrettd7655fr4n2y @@ -49,7 +49,7 @@ importers: apps/example: specifiers: - next-rest-framework: 0.1.2 + next-rest-framework: 0.2.0 dependencies: next-rest-framework: link:../../packages/next-rest-framework @@ -58,16 +58,16 @@ importers: '@docusaurus/core': 2.2.0 '@docusaurus/module-type-aliases': 2.2.0 '@docusaurus/preset-classic': 2.2.0 - '@docusaurus/theme-classic': ^2.2.0 + '@docusaurus/theme-classic': 2.2.0 '@docusaurus/types': 2.2.0 '@mdx-js/react': 1.6.22 '@tsconfig/docusaurus': 1.0.6 clsx: 1.2.1 prism-react-renderer: 1.3.5 dependencies: - '@docusaurus/core': 2.2.0_aeigrxhfhc4abyd45ix2hknizy - '@docusaurus/preset-classic': 2.2.0_mxv5mfbuokwbf4v23zvtcqiixm - '@docusaurus/theme-classic': 2.2.0_wfh3mw2ke2bdr53qfq544ltemu + '@docusaurus/core': 2.2.0_vukvsfkp4hxnee7vteliqou2xy + '@docusaurus/preset-classic': 2.2.0_65e6vsojdhusq2wqqiy3kus3ju + '@docusaurus/theme-classic': 2.2.0_lhsnqlb35hvawm3f6bviuzo2eu '@mdx-js/react': 1.6.22_react@17.0.2 clsx: 1.2.1 prism-react-renderer: 1.3.5_react@17.0.2 @@ -78,7 +78,7 @@ importers: packages/next-rest-framework: specifiers: - '@sodaru/yup-to-json-schema': 1.0.5 + '@next-rest-framework/tsconfig': workspace:* '@types/jest': 29.2.3 '@types/js-yaml': 4.0.5 '@types/lodash.isequalwith': 4.4.7 @@ -86,7 +86,6 @@ importers: chalk: 4.1.2 jest: 29.3.1 js-yaml: 4.1.0 - json-to-zod: 1.1.2 lodash.isequalwith: 4.4.0 lodash.merge: 4.6.2 node-mocks-http: 1.12.1 @@ -94,26 +93,26 @@ importers: ts-jest: 29.0.3 ts-node: 10.9.1 typescript: '*' - zod-to-json-schema: 3.19.0 dependencies: - '@sodaru/yup-to-json-schema': 1.0.5 chalk: 4.1.2 js-yaml: 4.1.0 - json-to-zod: 1.1.2 lodash.isequalwith: 4.4.0 lodash.merge: 4.6.2 - zod-to-json-schema: 3.19.0_zod@3.19.1 devDependencies: + '@next-rest-framework/tsconfig': link:../tsconfig '@types/jest': 29.2.3 '@types/js-yaml': 4.0.5 '@types/lodash.isequalwith': 4.4.7 '@types/lodash.merge': 4.6.7 - jest: 29.3.1_odkjkoia5xunhxkdrka32ib6vi + jest: 29.3.1_zfha7dvnw4nti6zkbsmhmn6xo4 node-mocks-http: 1.12.1 openapi-types: 12.0.2 - ts-jest: 29.0.3_gruvivcimsmdfhnjphbo3uejz4 - ts-node: 10.9.1_wup25etrarvlqkprac7h35hj7u - typescript: 4.9.3 + ts-jest: 29.0.3_jgcrazg63n7mkdjrxsk5jv2npy + ts-node: 10.9.1_awa2wsr5thmg3i7jqycphctjfq + typescript: 4.9.4 + + packages/tsconfig: + specifiers: {} packages: @@ -123,113 +122,113 @@ packages: '@algolia/autocomplete-shared': 1.7.2 dev: false - /@algolia/autocomplete-preset-algolia/1.7.2_qs6lk5nhygj2o3hj4sf6xnr724: + /@algolia/autocomplete-preset-algolia/1.7.2_dk4ct527ug5whbfokpeal2wzha: resolution: {integrity: sha512-+RYEG6B0QiGGfRb2G3MtPfyrl0dALF3cQNTWBzBX6p5o01vCCGTTinAm2UKG3tfc2CnOMAtnPLkzNZyJUpnVJw==} peerDependencies: '@algolia/client-search': '>= 4.9.1 < 6' algoliasearch: '>= 4.9.1 < 6' dependencies: '@algolia/autocomplete-shared': 1.7.2 - '@algolia/client-search': 4.14.2 - algoliasearch: 4.14.2 + '@algolia/client-search': 4.14.3 + algoliasearch: 4.14.3 dev: false /@algolia/autocomplete-shared/1.7.2: resolution: {integrity: sha512-QCckjiC7xXHIUaIL3ektBtjJ0w7tTA3iqKcAE/Hjn1lZ5omp7i3Y4e09rAr9ZybqirL7AbxCLLq0Ra5DDPKeug==} dev: false - /@algolia/cache-browser-local-storage/4.14.2: - resolution: {integrity: sha512-FRweBkK/ywO+GKYfAWbrepewQsPTIEirhi1BdykX9mxvBPtGNKccYAxvGdDCumU1jL4r3cayio4psfzKMejBlA==} + /@algolia/cache-browser-local-storage/4.14.3: + resolution: {integrity: sha512-hWH1yCxgG3+R/xZIscmUrWAIBnmBFHH5j30fY/+aPkEZWt90wYILfAHIOZ1/Wxhho5SkPfwFmT7ooX2d9JeQBw==} dependencies: - '@algolia/cache-common': 4.14.2 + '@algolia/cache-common': 4.14.3 dev: false - /@algolia/cache-common/4.14.2: - resolution: {integrity: sha512-SbvAlG9VqNanCErr44q6lEKD2qoK4XtFNx9Qn8FK26ePCI8I9yU7pYB+eM/cZdS9SzQCRJBbHUumVr4bsQ4uxg==} + /@algolia/cache-common/4.14.3: + resolution: {integrity: sha512-oZJofOoD9FQOwiGTzyRnmzvh3ZP8WVTNPBLH5xU5JNF7drDbRT0ocVT0h/xB2rPHYzOeXRrLaQQBwRT/CKom0Q==} dev: false - /@algolia/cache-in-memory/4.14.2: - resolution: {integrity: sha512-HrOukWoop9XB/VFojPv1R5SVXowgI56T9pmezd/djh2JnVN/vXswhXV51RKy4nCpqxyHt/aGFSq2qkDvj6KiuQ==} + /@algolia/cache-in-memory/4.14.3: + resolution: {integrity: sha512-ES0hHQnzWjeioLQf5Nq+x1AWdZJ50znNPSH3puB/Y4Xsg4Av1bvLmTJe7SY2uqONaeMTvL0OaVcoVtQgJVw0vg==} dependencies: - '@algolia/cache-common': 4.14.2 + '@algolia/cache-common': 4.14.3 dev: false - /@algolia/client-account/4.14.2: - resolution: {integrity: sha512-WHtriQqGyibbb/Rx71YY43T0cXqyelEU0lB2QMBRXvD2X0iyeGl4qMxocgEIcbHyK7uqE7hKgjT8aBrHqhgc1w==} + /@algolia/client-account/4.14.3: + resolution: {integrity: sha512-PBcPb0+f5Xbh5UfLZNx2Ow589OdP8WYjB4CnvupfYBrl9JyC1sdH4jcq/ri8osO/mCZYjZrQsKAPIqW/gQmizQ==} dependencies: - '@algolia/client-common': 4.14.2 - '@algolia/client-search': 4.14.2 - '@algolia/transporter': 4.14.2 + '@algolia/client-common': 4.14.3 + '@algolia/client-search': 4.14.3 + '@algolia/transporter': 4.14.3 dev: false - /@algolia/client-analytics/4.14.2: - resolution: {integrity: sha512-yBvBv2mw+HX5a+aeR0dkvUbFZsiC4FKSnfqk9rrfX+QrlNOKEhCG0tJzjiOggRW4EcNqRmaTULIYvIzQVL2KYQ==} + /@algolia/client-analytics/4.14.3: + resolution: {integrity: sha512-eAwQq0Hb/aauv9NhCH5Dp3Nm29oFx28sayFN2fdOWemwSeJHIl7TmcsxVlRsO50fsD8CtPcDhtGeD3AIFLNvqw==} dependencies: - '@algolia/client-common': 4.14.2 - '@algolia/client-search': 4.14.2 - '@algolia/requester-common': 4.14.2 - '@algolia/transporter': 4.14.2 + '@algolia/client-common': 4.14.3 + '@algolia/client-search': 4.14.3 + '@algolia/requester-common': 4.14.3 + '@algolia/transporter': 4.14.3 dev: false - /@algolia/client-common/4.14.2: - resolution: {integrity: sha512-43o4fslNLcktgtDMVaT5XwlzsDPzlqvqesRi4MjQz2x4/Sxm7zYg5LRYFol1BIhG6EwxKvSUq8HcC/KxJu3J0Q==} + /@algolia/client-common/4.14.3: + resolution: {integrity: sha512-jkPPDZdi63IK64Yg4WccdCsAP4pHxSkr4usplkUZM5C1l1oEpZXsy2c579LQ0rvwCs5JFmwfNG4ahOszidfWPw==} dependencies: - '@algolia/requester-common': 4.14.2 - '@algolia/transporter': 4.14.2 + '@algolia/requester-common': 4.14.3 + '@algolia/transporter': 4.14.3 dev: false - /@algolia/client-personalization/4.14.2: - resolution: {integrity: sha512-ACCoLi0cL8CBZ1W/2juehSltrw2iqsQBnfiu/Rbl9W2yE6o2ZUb97+sqN/jBqYNQBS+o0ekTMKNkQjHHAcEXNw==} + /@algolia/client-personalization/4.14.3: + resolution: {integrity: sha512-UCX1MtkVNgaOL9f0e22x6tC9e2H3unZQlSUdnVaSKpZ+hdSChXGaRjp2UIT7pxmPqNCyv51F597KEX5WT60jNg==} dependencies: - '@algolia/client-common': 4.14.2 - '@algolia/requester-common': 4.14.2 - '@algolia/transporter': 4.14.2 + '@algolia/client-common': 4.14.3 + '@algolia/requester-common': 4.14.3 + '@algolia/transporter': 4.14.3 dev: false - /@algolia/client-search/4.14.2: - resolution: {integrity: sha512-L5zScdOmcZ6NGiVbLKTvP02UbxZ0njd5Vq9nJAmPFtjffUSOGEp11BmD2oMJ5QvARgx2XbX4KzTTNS5ECYIMWw==} + /@algolia/client-search/4.14.3: + resolution: {integrity: sha512-I2U7xBx5OPFdPLA8AXKUPPxGY3HDxZ4r7+mlZ8ZpLbI8/ri6fnu6B4z3wcL7sgHhDYMwnAE8Xr0AB0h3Hnkp4A==} dependencies: - '@algolia/client-common': 4.14.2 - '@algolia/requester-common': 4.14.2 - '@algolia/transporter': 4.14.2 + '@algolia/client-common': 4.14.3 + '@algolia/requester-common': 4.14.3 + '@algolia/transporter': 4.14.3 dev: false /@algolia/events/4.0.1: resolution: {integrity: sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==} dev: false - /@algolia/logger-common/4.14.2: - resolution: {integrity: sha512-/JGlYvdV++IcMHBnVFsqEisTiOeEr6cUJtpjz8zc0A9c31JrtLm318Njc72p14Pnkw3A/5lHHh+QxpJ6WFTmsA==} + /@algolia/logger-common/4.14.3: + resolution: {integrity: sha512-kUEAZaBt/J3RjYi8MEBT2QEexJR2kAE2mtLmezsmqMQZTV502TkHCxYzTwY2dE7OKcUTxi4OFlMuS4GId9CWPw==} dev: false - /@algolia/logger-console/4.14.2: - resolution: {integrity: sha512-8S2PlpdshbkwlLCSAB5f8c91xyc84VM9Ar9EdfE9UmX+NrKNYnWR1maXXVDQQoto07G1Ol/tYFnFVhUZq0xV/g==} + /@algolia/logger-console/4.14.3: + resolution: {integrity: sha512-ZWqAlUITktiMN2EiFpQIFCJS10N96A++yrexqC2Z+3hgF/JcKrOxOdT4nSCQoEPvU4Ki9QKbpzbebRDemZt/hw==} dependencies: - '@algolia/logger-common': 4.14.2 + '@algolia/logger-common': 4.14.3 dev: false - /@algolia/requester-browser-xhr/4.14.2: - resolution: {integrity: sha512-CEh//xYz/WfxHFh7pcMjQNWgpl4wFB85lUMRyVwaDPibNzQRVcV33YS+63fShFWc2+42YEipFGH2iPzlpszmDw==} + /@algolia/requester-browser-xhr/4.14.3: + resolution: {integrity: sha512-AZeg2T08WLUPvDncl2XLX2O67W5wIO8MNaT7z5ii5LgBTuk/rU4CikTjCe2xsUleIZeFl++QrPAi4Bdxws6r/Q==} dependencies: - '@algolia/requester-common': 4.14.2 + '@algolia/requester-common': 4.14.3 dev: false - /@algolia/requester-common/4.14.2: - resolution: {integrity: sha512-73YQsBOKa5fvVV3My7iZHu1sUqmjjfs9TteFWwPwDmnad7T0VTCopttcsM3OjLxZFtBnX61Xxl2T2gmG2O4ehg==} + /@algolia/requester-common/4.14.3: + resolution: {integrity: sha512-RrRzqNyKFDP7IkTuV3XvYGF9cDPn9h6qEDl595lXva3YUk9YSS8+MGZnnkOMHvjkrSCKfoLeLbm/T4tmoIeclw==} dev: false - /@algolia/requester-node-http/4.14.2: - resolution: {integrity: sha512-oDbb02kd1o5GTEld4pETlPZLY0e+gOSWjWMJHWTgDXbv9rm/o2cF7japO6Vj1ENnrqWvLBmW1OzV9g6FUFhFXg==} + /@algolia/requester-node-http/4.14.3: + resolution: {integrity: sha512-O5wnPxtDRPuW2U0EaOz9rMMWdlhwP0J0eSL1Z7TtXF8xnUeeUyNJrdhV5uy2CAp6RbhM1VuC3sOJcIR6Av+vbA==} dependencies: - '@algolia/requester-common': 4.14.2 + '@algolia/requester-common': 4.14.3 dev: false - /@algolia/transporter/4.14.2: - resolution: {integrity: sha512-t89dfQb2T9MFQHidjHcfhh6iGMNwvuKUvojAj+JsrHAGbuSy7yE4BylhLX6R0Q1xYRoC4Vvv+O5qIw/LdnQfsQ==} + /@algolia/transporter/4.14.3: + resolution: {integrity: sha512-2qlKlKsnGJ008exFRb5RTeTOqhLZj0bkMCMVskxoqWejs2Q2QtWmsiH98hDfpw0fmnyhzHEt0Z7lqxBYp8bW2w==} dependencies: - '@algolia/cache-common': 4.14.2 - '@algolia/logger-common': 4.14.2 - '@algolia/requester-common': 4.14.2 + '@algolia/cache-common': 4.14.3 + '@algolia/logger-common': 4.14.3 + '@algolia/requester-common': 4.14.3 dev: false /@ampproject/remapping/2.2.0: @@ -245,8 +244,8 @@ packages: dependencies: '@babel/highlight': 7.18.6 - /@babel/compat-data/7.20.5: - resolution: {integrity: sha512-KZXo2t10+/jxmkhNXc7pZTqRvSOIvVv/+lJwHS+B2rErwOyjuVRh60yVpb7liQ1U5t7lLJ1bz+t8tSypUZdm0g==} + /@babel/compat-data/7.20.10: + resolution: {integrity: sha512-sEnuDPpOJR/fcafHMjpcpGN5M2jbUGUHwmuWKM/YdPzeEDJg8bgmbcWQFUfE32MQjti1koACvoPVsDe8Uq+idg==} engines: {node: '>=6.9.0'} /@babel/core/7.12.9: @@ -254,17 +253,17 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.18.6 - '@babel/generator': 7.20.5 - '@babel/helper-module-transforms': 7.20.2 - '@babel/helpers': 7.20.6 - '@babel/parser': 7.20.5 - '@babel/template': 7.18.10 - '@babel/traverse': 7.20.5 - '@babel/types': 7.20.5 + '@babel/generator': 7.20.7 + '@babel/helper-module-transforms': 7.20.11 + '@babel/helpers': 7.20.7 + '@babel/parser': 7.20.7 + '@babel/template': 7.20.7 + '@babel/traverse': 7.20.10 + '@babel/types': 7.20.7 convert-source-map: 1.9.0 debug: 4.3.4 gensync: 1.0.0-beta.2 - json5: 2.2.1 + json5: 2.2.3 lodash: 4.17.21 resolve: 1.22.1 semver: 5.7.1 @@ -273,33 +272,33 @@ packages: - supports-color dev: false - /@babel/core/7.20.5: - resolution: {integrity: sha512-UdOWmk4pNWTm/4DlPUl/Pt4Gz4rcEMb7CY0Y3eJl5Yz1vI8ZJGmHWaVE55LoxRjdpx0z259GE9U5STA9atUinQ==} + /@babel/core/7.20.7: + resolution: {integrity: sha512-t1ZjCluspe5DW24bn2Rr1CDb2v9rn/hROtg9a2tmd0+QYf4bsloYfLQzjG4qHPNMhWtKdGC33R5AxGR2Af2cBw==} engines: {node: '>=6.9.0'} dependencies: '@ampproject/remapping': 2.2.0 '@babel/code-frame': 7.18.6 - '@babel/generator': 7.20.5 - '@babel/helper-compilation-targets': 7.20.0_@babel+core@7.20.5 - '@babel/helper-module-transforms': 7.20.2 - '@babel/helpers': 7.20.6 - '@babel/parser': 7.20.5 - '@babel/template': 7.18.10 - '@babel/traverse': 7.20.5 - '@babel/types': 7.20.5 + '@babel/generator': 7.20.7 + '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.20.7 + '@babel/helper-module-transforms': 7.20.11 + '@babel/helpers': 7.20.7 + '@babel/parser': 7.20.7 + '@babel/template': 7.20.7 + '@babel/traverse': 7.20.10 + '@babel/types': 7.20.7 convert-source-map: 1.9.0 debug: 4.3.4 gensync: 1.0.0-beta.2 - json5: 2.2.1 + json5: 2.2.3 semver: 6.3.0 transitivePeerDependencies: - supports-color - /@babel/generator/7.20.5: - resolution: {integrity: sha512-jl7JY2Ykn9S0yj4DQP82sYvPU+T3g0HFcWTqDLqiuA9tGRNIj9VfbtXGAYTTkyNEnQk1jkMGOdYka8aG/lulCA==} + /@babel/generator/7.20.7: + resolution: {integrity: sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.20.5 + '@babel/types': 7.20.7 '@jridgewell/gen-mapping': 0.3.2 jsesc: 2.5.2 @@ -307,7 +306,7 @@ packages: resolution: {integrity: sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.20.5 + '@babel/types': 7.20.7 dev: false /@babel/helper-builder-binary-assignment-operator-visitor/7.18.9: @@ -315,57 +314,58 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/helper-explode-assignable-expression': 7.18.6 - '@babel/types': 7.20.5 + '@babel/types': 7.20.7 dev: false - /@babel/helper-compilation-targets/7.20.0_@babel+core@7.20.5: - resolution: {integrity: sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==} + /@babel/helper-compilation-targets/7.20.7_@babel+core@7.20.7: + resolution: {integrity: sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/compat-data': 7.20.5 - '@babel/core': 7.20.5 + '@babel/compat-data': 7.20.10 + '@babel/core': 7.20.7 '@babel/helper-validator-option': 7.18.6 browserslist: 4.21.4 + lru-cache: 5.1.1 semver: 6.3.0 - /@babel/helper-create-class-features-plugin/7.20.5_@babel+core@7.20.5: - resolution: {integrity: sha512-3RCdA/EmEaikrhayahwToF0fpweU/8o2p8vhc1c/1kftHOdTKuC65kik/TLc+qfbS8JKw4qqJbne4ovICDhmww==} + /@babel/helper-create-class-features-plugin/7.20.7_@babel+core@7.20.7: + resolution: {integrity: sha512-LtoWbDXOaidEf50hmdDqn9g8VEzsorMexoWMQdQODbvmqYmaF23pBP5VNPAGIFHsFQCIeKokDiz3CH5Y2jlY6w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.7 '@babel/helper-annotate-as-pure': 7.18.6 '@babel/helper-environment-visitor': 7.18.9 '@babel/helper-function-name': 7.19.0 - '@babel/helper-member-expression-to-functions': 7.18.9 + '@babel/helper-member-expression-to-functions': 7.20.7 '@babel/helper-optimise-call-expression': 7.18.6 - '@babel/helper-replace-supers': 7.19.1 + '@babel/helper-replace-supers': 7.20.7 '@babel/helper-split-export-declaration': 7.18.6 transitivePeerDependencies: - supports-color dev: false - /@babel/helper-create-regexp-features-plugin/7.20.5_@babel+core@7.20.5: + /@babel/helper-create-regexp-features-plugin/7.20.5_@babel+core@7.20.7: resolution: {integrity: sha512-m68B1lkg3XDGX5yCvGO0kPx3v9WIYLnzjKfPcQiwntEQa5ZeRkPmo2X/ISJc8qxWGfwUr+kvZAeEzAwLec2r2w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.7 '@babel/helper-annotate-as-pure': 7.18.6 regexpu-core: 5.2.2 dev: false - /@babel/helper-define-polyfill-provider/0.3.3_@babel+core@7.20.5: + /@babel/helper-define-polyfill-provider/0.3.3_@babel+core@7.20.7: resolution: {integrity: sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==} peerDependencies: '@babel/core': ^7.4.0-0 dependencies: - '@babel/core': 7.20.5 - '@babel/helper-compilation-targets': 7.20.0_@babel+core@7.20.5 + '@babel/core': 7.20.7 + '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.20.7 '@babel/helper-plugin-utils': 7.20.2 debug: 4.3.4 lodash.debounce: 4.0.8 @@ -383,37 +383,37 @@ packages: resolution: {integrity: sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.20.5 + '@babel/types': 7.20.7 dev: false /@babel/helper-function-name/7.19.0: resolution: {integrity: sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/template': 7.18.10 - '@babel/types': 7.20.5 + '@babel/template': 7.20.7 + '@babel/types': 7.20.7 /@babel/helper-hoist-variables/7.18.6: resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.20.5 + '@babel/types': 7.20.7 - /@babel/helper-member-expression-to-functions/7.18.9: - resolution: {integrity: sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==} + /@babel/helper-member-expression-to-functions/7.20.7: + resolution: {integrity: sha512-9J0CxJLq315fEdi4s7xK5TQaNYjZw+nDVpVqr1axNGKzdrdwYBD5b4uKv3n75aABG0rCCTK8Im8Ww7eYfMrZgw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.20.5 + '@babel/types': 7.20.7 dev: false /@babel/helper-module-imports/7.18.6: resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.20.5 + '@babel/types': 7.20.7 - /@babel/helper-module-transforms/7.20.2: - resolution: {integrity: sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==} + /@babel/helper-module-transforms/7.20.11: + resolution: {integrity: sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg==} engines: {node: '>=6.9.0'} dependencies: '@babel/helper-environment-visitor': 7.18.9 @@ -421,9 +421,9 @@ packages: '@babel/helper-simple-access': 7.20.2 '@babel/helper-split-export-declaration': 7.18.6 '@babel/helper-validator-identifier': 7.19.1 - '@babel/template': 7.18.10 - '@babel/traverse': 7.20.5 - '@babel/types': 7.20.5 + '@babel/template': 7.20.7 + '@babel/traverse': 7.20.10 + '@babel/types': 7.20.7 transitivePeerDependencies: - supports-color @@ -431,7 +431,7 @@ packages: resolution: {integrity: sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.20.5 + '@babel/types': 7.20.7 dev: false /@babel/helper-plugin-utils/7.10.4: @@ -442,30 +442,31 @@ packages: resolution: {integrity: sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==} engines: {node: '>=6.9.0'} - /@babel/helper-remap-async-to-generator/7.18.9_@babel+core@7.20.5: + /@babel/helper-remap-async-to-generator/7.18.9_@babel+core@7.20.7: resolution: {integrity: sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.7 '@babel/helper-annotate-as-pure': 7.18.6 '@babel/helper-environment-visitor': 7.18.9 '@babel/helper-wrap-function': 7.20.5 - '@babel/types': 7.20.5 + '@babel/types': 7.20.7 transitivePeerDependencies: - supports-color dev: false - /@babel/helper-replace-supers/7.19.1: - resolution: {integrity: sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw==} + /@babel/helper-replace-supers/7.20.7: + resolution: {integrity: sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==} engines: {node: '>=6.9.0'} dependencies: '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-member-expression-to-functions': 7.18.9 + '@babel/helper-member-expression-to-functions': 7.20.7 '@babel/helper-optimise-call-expression': 7.18.6 - '@babel/traverse': 7.20.5 - '@babel/types': 7.20.5 + '@babel/template': 7.20.7 + '@babel/traverse': 7.20.10 + '@babel/types': 7.20.7 transitivePeerDependencies: - supports-color dev: false @@ -474,20 +475,20 @@ packages: resolution: {integrity: sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.20.5 + '@babel/types': 7.20.7 /@babel/helper-skip-transparent-expression-wrappers/7.20.0: resolution: {integrity: sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.20.5 + '@babel/types': 7.20.7 dev: false /@babel/helper-split-export-declaration/7.18.6: resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.20.5 + '@babel/types': 7.20.7 /@babel/helper-string-parser/7.19.4: resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==} @@ -506,20 +507,20 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/helper-function-name': 7.19.0 - '@babel/template': 7.18.10 - '@babel/traverse': 7.20.5 - '@babel/types': 7.20.5 + '@babel/template': 7.20.7 + '@babel/traverse': 7.20.10 + '@babel/types': 7.20.7 transitivePeerDependencies: - supports-color dev: false - /@babel/helpers/7.20.6: - resolution: {integrity: sha512-Pf/OjgfgFRW5bApskEz5pvidpim7tEDPlFtKcNRXWmfHGn9IEI2W2flqRQXTFb7gIPTyK++N6rVHuwKut4XK6w==} + /@babel/helpers/7.20.7: + resolution: {integrity: sha512-PBPjs5BppzsGaxHQCDKnZ6Gd9s6xl8bBCluz3vEInLGRJmnZan4F6BYCeqtyXqkk4W5IlPmjK4JlOuZkpJ3xZA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/template': 7.18.10 - '@babel/traverse': 7.20.5 - '@babel/types': 7.20.5 + '@babel/template': 7.20.7 + '@babel/traverse': 7.20.10 + '@babel/types': 7.20.7 transitivePeerDependencies: - supports-color @@ -531,141 +532,141 @@ packages: chalk: 2.4.2 js-tokens: 4.0.0 - /@babel/parser/7.20.5: - resolution: {integrity: sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA==} + /@babel/parser/7.20.7: + resolution: {integrity: sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg==} engines: {node: '>=6.0.0'} hasBin: true dependencies: - '@babel/types': 7.20.5 + '@babel/types': 7.20.7 - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.18.6_@babel+core@7.20.5: + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.18.6_@babel+core@7.20.7: resolution: {integrity: sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.7 '@babel/helper-plugin-utils': 7.20.2 dev: false - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.18.9_@babel+core@7.20.5: - resolution: {integrity: sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==} + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.20.7_@babel+core@7.20.7: + resolution: {integrity: sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.13.0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.7 '@babel/helper-plugin-utils': 7.20.2 '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 - '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.20.5 + '@babel/plugin-proposal-optional-chaining': 7.20.7_@babel+core@7.20.7 dev: false - /@babel/plugin-proposal-async-generator-functions/7.20.1_@babel+core@7.20.5: - resolution: {integrity: sha512-Gh5rchzSwE4kC+o/6T8waD0WHEQIsDmjltY8WnWRXHUdH8axZhuH86Ov9M72YhJfDrZseQwuuWaaIT/TmePp3g==} + /@babel/plugin-proposal-async-generator-functions/7.20.7_@babel+core@7.20.7: + resolution: {integrity: sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.7 '@babel/helper-environment-visitor': 7.18.9 '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-remap-async-to-generator': 7.18.9_@babel+core@7.20.5 - '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.20.5 + '@babel/helper-remap-async-to-generator': 7.18.9_@babel+core@7.20.7 + '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.20.7 transitivePeerDependencies: - supports-color dev: false - /@babel/plugin-proposal-class-properties/7.18.6_@babel+core@7.20.5: + /@babel/plugin-proposal-class-properties/7.18.6_@babel+core@7.20.7: resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 - '@babel/helper-create-class-features-plugin': 7.20.5_@babel+core@7.20.5 + '@babel/core': 7.20.7 + '@babel/helper-create-class-features-plugin': 7.20.7_@babel+core@7.20.7 '@babel/helper-plugin-utils': 7.20.2 transitivePeerDependencies: - supports-color dev: false - /@babel/plugin-proposal-class-static-block/7.18.6_@babel+core@7.20.5: - resolution: {integrity: sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==} + /@babel/plugin-proposal-class-static-block/7.20.7_@babel+core@7.20.7: + resolution: {integrity: sha512-AveGOoi9DAjUYYuUAG//Ig69GlazLnoyzMw68VCDux+c1tsnnH/OkYcpz/5xzMkEFC6UxjR5Gw1c+iY2wOGVeQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.12.0 dependencies: - '@babel/core': 7.20.5 - '@babel/helper-create-class-features-plugin': 7.20.5_@babel+core@7.20.5 + '@babel/core': 7.20.7 + '@babel/helper-create-class-features-plugin': 7.20.7_@babel+core@7.20.7 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.20.5 + '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.20.7 transitivePeerDependencies: - supports-color dev: false - /@babel/plugin-proposal-dynamic-import/7.18.6_@babel+core@7.20.5: + /@babel/plugin-proposal-dynamic-import/7.18.6_@babel+core@7.20.7: resolution: {integrity: sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.7 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.20.5 + '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.20.7 dev: false - /@babel/plugin-proposal-export-namespace-from/7.18.9_@babel+core@7.20.5: + /@babel/plugin-proposal-export-namespace-from/7.18.9_@babel+core@7.20.7: resolution: {integrity: sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.7 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.20.5 + '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.20.7 dev: false - /@babel/plugin-proposal-json-strings/7.18.6_@babel+core@7.20.5: + /@babel/plugin-proposal-json-strings/7.18.6_@babel+core@7.20.7: resolution: {integrity: sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.7 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.20.5 + '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.20.7 dev: false - /@babel/plugin-proposal-logical-assignment-operators/7.18.9_@babel+core@7.20.5: - resolution: {integrity: sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==} + /@babel/plugin-proposal-logical-assignment-operators/7.20.7_@babel+core@7.20.7: + resolution: {integrity: sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.7 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.20.5 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.20.7 dev: false - /@babel/plugin-proposal-nullish-coalescing-operator/7.18.6_@babel+core@7.20.5: + /@babel/plugin-proposal-nullish-coalescing-operator/7.18.6_@babel+core@7.20.7: resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.7 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.20.5 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.20.7 dev: false - /@babel/plugin-proposal-numeric-separator/7.18.6_@babel+core@7.20.5: + /@babel/plugin-proposal-numeric-separator/7.18.6_@babel+core@7.20.7: resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.7 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.20.5 + '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.20.7 dev: false /@babel/plugin-proposal-object-rest-spread/7.12.1_@babel+core@7.12.9: @@ -674,165 +675,165 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-plugin-utils': 7.10.4 '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.12.9 - '@babel/plugin-transform-parameters': 7.20.5_@babel+core@7.12.9 + '@babel/plugin-transform-parameters': 7.20.7_@babel+core@7.12.9 dev: false - /@babel/plugin-proposal-object-rest-spread/7.20.2_@babel+core@7.20.5: - resolution: {integrity: sha512-Ks6uej9WFK+fvIMesSqbAto5dD8Dz4VuuFvGJFKgIGSkJuRGcrwGECPA1fDgQK3/DbExBJpEkTeYeB8geIFCSQ==} + /@babel/plugin-proposal-object-rest-spread/7.20.7_@babel+core@7.20.7: + resolution: {integrity: sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.20.5 - '@babel/core': 7.20.5 - '@babel/helper-compilation-targets': 7.20.0_@babel+core@7.20.5 + '@babel/compat-data': 7.20.10 + '@babel/core': 7.20.7 + '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.20.7 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.20.5 - '@babel/plugin-transform-parameters': 7.20.5_@babel+core@7.20.5 + '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.20.7 + '@babel/plugin-transform-parameters': 7.20.7_@babel+core@7.20.7 dev: false - /@babel/plugin-proposal-optional-catch-binding/7.18.6_@babel+core@7.20.5: + /@babel/plugin-proposal-optional-catch-binding/7.18.6_@babel+core@7.20.7: resolution: {integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.7 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.20.5 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.20.7 dev: false - /@babel/plugin-proposal-optional-chaining/7.18.9_@babel+core@7.20.5: - resolution: {integrity: sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==} + /@babel/plugin-proposal-optional-chaining/7.20.7_@babel+core@7.20.7: + resolution: {integrity: sha512-T+A7b1kfjtRM51ssoOfS1+wbyCVqorfyZhT99TvxxLMirPShD8CzKMRepMlCBGM5RpHMbn8s+5MMHnPstJH6mQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.7 '@babel/helper-plugin-utils': 7.20.2 '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 - '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.20.5 + '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.20.7 dev: false - /@babel/plugin-proposal-private-methods/7.18.6_@babel+core@7.20.5: + /@babel/plugin-proposal-private-methods/7.18.6_@babel+core@7.20.7: resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 - '@babel/helper-create-class-features-plugin': 7.20.5_@babel+core@7.20.5 + '@babel/core': 7.20.7 + '@babel/helper-create-class-features-plugin': 7.20.7_@babel+core@7.20.7 '@babel/helper-plugin-utils': 7.20.2 transitivePeerDependencies: - supports-color dev: false - /@babel/plugin-proposal-private-property-in-object/7.20.5_@babel+core@7.20.5: + /@babel/plugin-proposal-private-property-in-object/7.20.5_@babel+core@7.20.7: resolution: {integrity: sha512-Vq7b9dUA12ByzB4EjQTPo25sFhY+08pQDBSZRtUAkj7lb7jahaHR5igera16QZ+3my1nYR4dKsNdYj5IjPHilQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.7 '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-create-class-features-plugin': 7.20.5_@babel+core@7.20.5 + '@babel/helper-create-class-features-plugin': 7.20.7_@babel+core@7.20.7 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.20.5 + '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.20.7 transitivePeerDependencies: - supports-color dev: false - /@babel/plugin-proposal-unicode-property-regex/7.18.6_@babel+core@7.20.5: + /@babel/plugin-proposal-unicode-property-regex/7.18.6_@babel+core@7.20.7: resolution: {integrity: sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==} engines: {node: '>=4'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 - '@babel/helper-create-regexp-features-plugin': 7.20.5_@babel+core@7.20.5 + '@babel/core': 7.20.7 + '@babel/helper-create-regexp-features-plugin': 7.20.5_@babel+core@7.20.7 '@babel/helper-plugin-utils': 7.20.2 dev: false - /@babel/plugin-syntax-async-generators/7.8.4_@babel+core@7.20.5: + /@babel/plugin-syntax-async-generators/7.8.4_@babel+core@7.20.7: resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.7 '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-syntax-bigint/7.8.3_@babel+core@7.20.5: + /@babel/plugin-syntax-bigint/7.8.3_@babel+core@7.20.7: resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.7 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-class-properties/7.12.13_@babel+core@7.20.5: + /@babel/plugin-syntax-class-properties/7.12.13_@babel+core@7.20.7: resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.7 '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-syntax-class-static-block/7.14.5_@babel+core@7.20.5: + /@babel/plugin-syntax-class-static-block/7.14.5_@babel+core@7.20.7: resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.7 '@babel/helper-plugin-utils': 7.20.2 dev: false - /@babel/plugin-syntax-dynamic-import/7.8.3_@babel+core@7.20.5: + /@babel/plugin-syntax-dynamic-import/7.8.3_@babel+core@7.20.7: resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.7 '@babel/helper-plugin-utils': 7.20.2 dev: false - /@babel/plugin-syntax-export-namespace-from/7.8.3_@babel+core@7.20.5: + /@babel/plugin-syntax-export-namespace-from/7.8.3_@babel+core@7.20.7: resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.7 '@babel/helper-plugin-utils': 7.20.2 dev: false - /@babel/plugin-syntax-import-assertions/7.20.0_@babel+core@7.20.5: + /@babel/plugin-syntax-import-assertions/7.20.0_@babel+core@7.20.7: resolution: {integrity: sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.7 '@babel/helper-plugin-utils': 7.20.2 dev: false - /@babel/plugin-syntax-import-meta/7.10.4_@babel+core@7.20.5: + /@babel/plugin-syntax-import-meta/7.10.4_@babel+core@7.20.7: resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.7 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-json-strings/7.8.3_@babel+core@7.20.5: + /@babel/plugin-syntax-json-strings/7.8.3_@babel+core@7.20.7: resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.7 '@babel/helper-plugin-utils': 7.20.2 /@babel/plugin-syntax-jsx/7.12.1_@babel+core@7.12.9: @@ -844,37 +845,37 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: false - /@babel/plugin-syntax-jsx/7.18.6_@babel+core@7.20.5: + /@babel/plugin-syntax-jsx/7.18.6_@babel+core@7.20.7: resolution: {integrity: sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.7 '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-syntax-logical-assignment-operators/7.10.4_@babel+core@7.20.5: + /@babel/plugin-syntax-logical-assignment-operators/7.10.4_@babel+core@7.20.7: resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.7 '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-syntax-nullish-coalescing-operator/7.8.3_@babel+core@7.20.5: + /@babel/plugin-syntax-nullish-coalescing-operator/7.8.3_@babel+core@7.20.7: resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.7 '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-syntax-numeric-separator/7.10.4_@babel+core@7.20.5: + /@babel/plugin-syntax-numeric-separator/7.10.4_@babel+core@7.20.7: resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.7 '@babel/helper-plugin-utils': 7.20.2 /@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.12.9: @@ -886,307 +887,308 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: false - /@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.20.5: + /@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.20.7: resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.7 '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-syntax-optional-catch-binding/7.8.3_@babel+core@7.20.5: + /@babel/plugin-syntax-optional-catch-binding/7.8.3_@babel+core@7.20.7: resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.7 '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-syntax-optional-chaining/7.8.3_@babel+core@7.20.5: + /@babel/plugin-syntax-optional-chaining/7.8.3_@babel+core@7.20.7: resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.7 '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-syntax-private-property-in-object/7.14.5_@babel+core@7.20.5: + /@babel/plugin-syntax-private-property-in-object/7.14.5_@babel+core@7.20.7: resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.7 '@babel/helper-plugin-utils': 7.20.2 dev: false - /@babel/plugin-syntax-top-level-await/7.14.5_@babel+core@7.20.5: + /@babel/plugin-syntax-top-level-await/7.14.5_@babel+core@7.20.7: resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.7 '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-syntax-typescript/7.20.0_@babel+core@7.20.5: + /@babel/plugin-syntax-typescript/7.20.0_@babel+core@7.20.7: resolution: {integrity: sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.7 '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-transform-arrow-functions/7.18.6_@babel+core@7.20.5: - resolution: {integrity: sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==} + /@babel/plugin-transform-arrow-functions/7.20.7_@babel+core@7.20.7: + resolution: {integrity: sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.7 '@babel/helper-plugin-utils': 7.20.2 dev: false - /@babel/plugin-transform-async-to-generator/7.18.6_@babel+core@7.20.5: - resolution: {integrity: sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==} + /@babel/plugin-transform-async-to-generator/7.20.7_@babel+core@7.20.7: + resolution: {integrity: sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.7 '@babel/helper-module-imports': 7.18.6 '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-remap-async-to-generator': 7.18.9_@babel+core@7.20.5 + '@babel/helper-remap-async-to-generator': 7.18.9_@babel+core@7.20.7 transitivePeerDependencies: - supports-color dev: false - /@babel/plugin-transform-block-scoped-functions/7.18.6_@babel+core@7.20.5: + /@babel/plugin-transform-block-scoped-functions/7.18.6_@babel+core@7.20.7: resolution: {integrity: sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.7 '@babel/helper-plugin-utils': 7.20.2 dev: false - /@babel/plugin-transform-block-scoping/7.20.5_@babel+core@7.20.5: - resolution: {integrity: sha512-WvpEIW9Cbj9ApF3yJCjIEEf1EiNJLtXagOrL5LNWEZOo3jv8pmPoYTSNJQvqej8OavVlgOoOPw6/htGZro6IkA==} + /@babel/plugin-transform-block-scoping/7.20.11_@babel+core@7.20.7: + resolution: {integrity: sha512-tA4N427a7fjf1P0/2I4ScsHGc5jcHPbb30xMbaTke2gxDuWpUfXDuX1FEymJwKk4tuGUvGcejAR6HdZVqmmPyw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.7 '@babel/helper-plugin-utils': 7.20.2 dev: false - /@babel/plugin-transform-classes/7.20.2_@babel+core@7.20.5: - resolution: {integrity: sha512-9rbPp0lCVVoagvtEyQKSo5L8oo0nQS/iif+lwlAz29MccX2642vWDlSZK+2T2buxbopotId2ld7zZAzRfz9j1g==} + /@babel/plugin-transform-classes/7.20.7_@babel+core@7.20.7: + resolution: {integrity: sha512-LWYbsiXTPKl+oBlXUGlwNlJZetXD5Am+CyBdqhPsDVjM9Jc8jwBJFrKhHf900Kfk2eZG1y9MAG3UNajol7A4VQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.7 '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-compilation-targets': 7.20.0_@babel+core@7.20.5 + '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.20.7 '@babel/helper-environment-visitor': 7.18.9 '@babel/helper-function-name': 7.19.0 '@babel/helper-optimise-call-expression': 7.18.6 '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-replace-supers': 7.19.1 + '@babel/helper-replace-supers': 7.20.7 '@babel/helper-split-export-declaration': 7.18.6 globals: 11.12.0 transitivePeerDependencies: - supports-color dev: false - /@babel/plugin-transform-computed-properties/7.18.9_@babel+core@7.20.5: - resolution: {integrity: sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==} + /@babel/plugin-transform-computed-properties/7.20.7_@babel+core@7.20.7: + resolution: {integrity: sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.7 '@babel/helper-plugin-utils': 7.20.2 + '@babel/template': 7.20.7 dev: false - /@babel/plugin-transform-destructuring/7.20.2_@babel+core@7.20.5: - resolution: {integrity: sha512-mENM+ZHrvEgxLTBXUiQ621rRXZes3KWUv6NdQlrnr1TkWVw+hUjQBZuP2X32qKlrlG2BzgR95gkuCRSkJl8vIw==} + /@babel/plugin-transform-destructuring/7.20.7_@babel+core@7.20.7: + resolution: {integrity: sha512-Xwg403sRrZb81IVB79ZPqNQME23yhugYVqgTxAhT99h485F4f+GMELFhhOsscDUB7HCswepKeCKLn/GZvUKoBA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.7 '@babel/helper-plugin-utils': 7.20.2 dev: false - /@babel/plugin-transform-dotall-regex/7.18.6_@babel+core@7.20.5: + /@babel/plugin-transform-dotall-regex/7.18.6_@babel+core@7.20.7: resolution: {integrity: sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 - '@babel/helper-create-regexp-features-plugin': 7.20.5_@babel+core@7.20.5 + '@babel/core': 7.20.7 + '@babel/helper-create-regexp-features-plugin': 7.20.5_@babel+core@7.20.7 '@babel/helper-plugin-utils': 7.20.2 dev: false - /@babel/plugin-transform-duplicate-keys/7.18.9_@babel+core@7.20.5: + /@babel/plugin-transform-duplicate-keys/7.18.9_@babel+core@7.20.7: resolution: {integrity: sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.7 '@babel/helper-plugin-utils': 7.20.2 dev: false - /@babel/plugin-transform-exponentiation-operator/7.18.6_@babel+core@7.20.5: + /@babel/plugin-transform-exponentiation-operator/7.18.6_@babel+core@7.20.7: resolution: {integrity: sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.7 '@babel/helper-builder-binary-assignment-operator-visitor': 7.18.9 '@babel/helper-plugin-utils': 7.20.2 dev: false - /@babel/plugin-transform-for-of/7.18.8_@babel+core@7.20.5: + /@babel/plugin-transform-for-of/7.18.8_@babel+core@7.20.7: resolution: {integrity: sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.7 '@babel/helper-plugin-utils': 7.20.2 dev: false - /@babel/plugin-transform-function-name/7.18.9_@babel+core@7.20.5: + /@babel/plugin-transform-function-name/7.18.9_@babel+core@7.20.7: resolution: {integrity: sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 - '@babel/helper-compilation-targets': 7.20.0_@babel+core@7.20.5 + '@babel/core': 7.20.7 + '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.20.7 '@babel/helper-function-name': 7.19.0 '@babel/helper-plugin-utils': 7.20.2 dev: false - /@babel/plugin-transform-literals/7.18.9_@babel+core@7.20.5: + /@babel/plugin-transform-literals/7.18.9_@babel+core@7.20.7: resolution: {integrity: sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.7 '@babel/helper-plugin-utils': 7.20.2 dev: false - /@babel/plugin-transform-member-expression-literals/7.18.6_@babel+core@7.20.5: + /@babel/plugin-transform-member-expression-literals/7.18.6_@babel+core@7.20.7: resolution: {integrity: sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.7 '@babel/helper-plugin-utils': 7.20.2 dev: false - /@babel/plugin-transform-modules-amd/7.19.6_@babel+core@7.20.5: - resolution: {integrity: sha512-uG3od2mXvAtIFQIh0xrpLH6r5fpSQN04gIVovl+ODLdUMANokxQLZnPBHcjmv3GxRjnqwLuHvppjjcelqUFZvg==} + /@babel/plugin-transform-modules-amd/7.20.11_@babel+core@7.20.7: + resolution: {integrity: sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 - '@babel/helper-module-transforms': 7.20.2 + '@babel/core': 7.20.7 + '@babel/helper-module-transforms': 7.20.11 '@babel/helper-plugin-utils': 7.20.2 transitivePeerDependencies: - supports-color dev: false - /@babel/plugin-transform-modules-commonjs/7.19.6_@babel+core@7.20.5: - resolution: {integrity: sha512-8PIa1ym4XRTKuSsOUXqDG0YaOlEuTVvHMe5JCfgBMOtHvJKw/4NGovEGN33viISshG/rZNVrACiBmPQLvWN8xQ==} + /@babel/plugin-transform-modules-commonjs/7.20.11_@babel+core@7.20.7: + resolution: {integrity: sha512-S8e1f7WQ7cimJQ51JkAaDrEtohVEitXjgCGAS2N8S31Y42E+kWwfSz83LYz57QdBm7q9diARVqanIaH2oVgQnw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 - '@babel/helper-module-transforms': 7.20.2 + '@babel/core': 7.20.7 + '@babel/helper-module-transforms': 7.20.11 '@babel/helper-plugin-utils': 7.20.2 '@babel/helper-simple-access': 7.20.2 transitivePeerDependencies: - supports-color dev: false - /@babel/plugin-transform-modules-systemjs/7.19.6_@babel+core@7.20.5: - resolution: {integrity: sha512-fqGLBepcc3kErfR9R3DnVpURmckXP7gj7bAlrTQyBxrigFqszZCkFkcoxzCp2v32XmwXLvbw+8Yq9/b+QqksjQ==} + /@babel/plugin-transform-modules-systemjs/7.20.11_@babel+core@7.20.7: + resolution: {integrity: sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.7 '@babel/helper-hoist-variables': 7.18.6 - '@babel/helper-module-transforms': 7.20.2 + '@babel/helper-module-transforms': 7.20.11 '@babel/helper-plugin-utils': 7.20.2 '@babel/helper-validator-identifier': 7.19.1 transitivePeerDependencies: - supports-color dev: false - /@babel/plugin-transform-modules-umd/7.18.6_@babel+core@7.20.5: + /@babel/plugin-transform-modules-umd/7.18.6_@babel+core@7.20.7: resolution: {integrity: sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 - '@babel/helper-module-transforms': 7.20.2 + '@babel/core': 7.20.7 + '@babel/helper-module-transforms': 7.20.11 '@babel/helper-plugin-utils': 7.20.2 transitivePeerDependencies: - supports-color dev: false - /@babel/plugin-transform-named-capturing-groups-regex/7.20.5_@babel+core@7.20.5: + /@babel/plugin-transform-named-capturing-groups-regex/7.20.5_@babel+core@7.20.7: resolution: {integrity: sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.20.5 - '@babel/helper-create-regexp-features-plugin': 7.20.5_@babel+core@7.20.5 + '@babel/core': 7.20.7 + '@babel/helper-create-regexp-features-plugin': 7.20.5_@babel+core@7.20.7 '@babel/helper-plugin-utils': 7.20.2 dev: false - /@babel/plugin-transform-new-target/7.18.6_@babel+core@7.20.5: + /@babel/plugin-transform-new-target/7.18.6_@babel+core@7.20.7: resolution: {integrity: sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.7 '@babel/helper-plugin-utils': 7.20.2 dev: false - /@babel/plugin-transform-object-super/7.18.6_@babel+core@7.20.5: + /@babel/plugin-transform-object-super/7.18.6_@babel+core@7.20.7: resolution: {integrity: sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.7 '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-replace-supers': 7.19.1 + '@babel/helper-replace-supers': 7.20.7 transitivePeerDependencies: - supports-color dev: false - /@babel/plugin-transform-parameters/7.20.5_@babel+core@7.12.9: - resolution: {integrity: sha512-h7plkOmcndIUWXZFLgpbrh2+fXAi47zcUX7IrOQuZdLD0I0KvjJ6cvo3BEcAOsDOcZhVKGJqv07mkSqK0y2isQ==} + /@babel/plugin-transform-parameters/7.20.7_@babel+core@7.12.9: + resolution: {integrity: sha512-WiWBIkeHKVOSYPO0pWkxGPfKeWrCJyD3NJ53+Lrp/QMSZbsVPovrVl2aWZ19D/LTVnaDv5Ap7GJ/B2CTOZdrfA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1195,374 +1197,374 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: false - /@babel/plugin-transform-parameters/7.20.5_@babel+core@7.20.5: - resolution: {integrity: sha512-h7plkOmcndIUWXZFLgpbrh2+fXAi47zcUX7IrOQuZdLD0I0KvjJ6cvo3BEcAOsDOcZhVKGJqv07mkSqK0y2isQ==} + /@babel/plugin-transform-parameters/7.20.7_@babel+core@7.20.7: + resolution: {integrity: sha512-WiWBIkeHKVOSYPO0pWkxGPfKeWrCJyD3NJ53+Lrp/QMSZbsVPovrVl2aWZ19D/LTVnaDv5Ap7GJ/B2CTOZdrfA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.7 '@babel/helper-plugin-utils': 7.20.2 dev: false - /@babel/plugin-transform-property-literals/7.18.6_@babel+core@7.20.5: + /@babel/plugin-transform-property-literals/7.18.6_@babel+core@7.20.7: resolution: {integrity: sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.7 '@babel/helper-plugin-utils': 7.20.2 dev: false - /@babel/plugin-transform-react-constant-elements/7.20.2_@babel+core@7.20.5: + /@babel/plugin-transform-react-constant-elements/7.20.2_@babel+core@7.20.7: resolution: {integrity: sha512-KS/G8YI8uwMGKErLFOHS/ekhqdHhpEloxs43NecQHVgo2QuQSyJhGIY1fL8UGl9wy5ItVwwoUL4YxVqsplGq2g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.7 '@babel/helper-plugin-utils': 7.20.2 dev: false - /@babel/plugin-transform-react-display-name/7.18.6_@babel+core@7.20.5: + /@babel/plugin-transform-react-display-name/7.18.6_@babel+core@7.20.7: resolution: {integrity: sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.7 '@babel/helper-plugin-utils': 7.20.2 dev: false - /@babel/plugin-transform-react-jsx-development/7.18.6_@babel+core@7.20.5: + /@babel/plugin-transform-react-jsx-development/7.18.6_@babel+core@7.20.7: resolution: {integrity: sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 - '@babel/plugin-transform-react-jsx': 7.19.0_@babel+core@7.20.5 + '@babel/core': 7.20.7 + '@babel/plugin-transform-react-jsx': 7.20.7_@babel+core@7.20.7 dev: false - /@babel/plugin-transform-react-jsx/7.19.0_@babel+core@7.20.5: - resolution: {integrity: sha512-UVEvX3tXie3Szm3emi1+G63jyw1w5IcMY0FSKM+CRnKRI5Mr1YbCNgsSTwoTwKphQEG9P+QqmuRFneJPZuHNhg==} + /@babel/plugin-transform-react-jsx/7.20.7_@babel+core@7.20.7: + resolution: {integrity: sha512-Tfq7qqD+tRj3EoDhY00nn2uP2hsRxgYGi5mLQ5TimKav0a9Lrpd4deE+fcLXU8zFYRjlKPHZhpCvfEA6qnBxqQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.7 '@babel/helper-annotate-as-pure': 7.18.6 '@babel/helper-module-imports': 7.18.6 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-jsx': 7.18.6_@babel+core@7.20.5 - '@babel/types': 7.20.5 + '@babel/plugin-syntax-jsx': 7.18.6_@babel+core@7.20.7 + '@babel/types': 7.20.7 dev: false - /@babel/plugin-transform-react-pure-annotations/7.18.6_@babel+core@7.20.5: + /@babel/plugin-transform-react-pure-annotations/7.18.6_@babel+core@7.20.7: resolution: {integrity: sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.7 '@babel/helper-annotate-as-pure': 7.18.6 '@babel/helper-plugin-utils': 7.20.2 dev: false - /@babel/plugin-transform-regenerator/7.20.5_@babel+core@7.20.5: + /@babel/plugin-transform-regenerator/7.20.5_@babel+core@7.20.7: resolution: {integrity: sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.7 '@babel/helper-plugin-utils': 7.20.2 regenerator-transform: 0.15.1 dev: false - /@babel/plugin-transform-reserved-words/7.18.6_@babel+core@7.20.5: + /@babel/plugin-transform-reserved-words/7.18.6_@babel+core@7.20.7: resolution: {integrity: sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.7 '@babel/helper-plugin-utils': 7.20.2 dev: false - /@babel/plugin-transform-runtime/7.19.6_@babel+core@7.20.5: + /@babel/plugin-transform-runtime/7.19.6_@babel+core@7.20.7: resolution: {integrity: sha512-PRH37lz4JU156lYFW1p8OxE5i7d6Sl/zV58ooyr+q1J1lnQPyg5tIiXlIwNVhJaY4W3TmOtdc8jqdXQcB1v5Yw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.7 '@babel/helper-module-imports': 7.18.6 '@babel/helper-plugin-utils': 7.20.2 - babel-plugin-polyfill-corejs2: 0.3.3_@babel+core@7.20.5 - babel-plugin-polyfill-corejs3: 0.6.0_@babel+core@7.20.5 - babel-plugin-polyfill-regenerator: 0.4.1_@babel+core@7.20.5 + babel-plugin-polyfill-corejs2: 0.3.3_@babel+core@7.20.7 + babel-plugin-polyfill-corejs3: 0.6.0_@babel+core@7.20.7 + babel-plugin-polyfill-regenerator: 0.4.1_@babel+core@7.20.7 semver: 6.3.0 transitivePeerDependencies: - supports-color dev: false - /@babel/plugin-transform-shorthand-properties/7.18.6_@babel+core@7.20.5: + /@babel/plugin-transform-shorthand-properties/7.18.6_@babel+core@7.20.7: resolution: {integrity: sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.7 '@babel/helper-plugin-utils': 7.20.2 dev: false - /@babel/plugin-transform-spread/7.19.0_@babel+core@7.20.5: - resolution: {integrity: sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w==} + /@babel/plugin-transform-spread/7.20.7_@babel+core@7.20.7: + resolution: {integrity: sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.7 '@babel/helper-plugin-utils': 7.20.2 '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 dev: false - /@babel/plugin-transform-sticky-regex/7.18.6_@babel+core@7.20.5: + /@babel/plugin-transform-sticky-regex/7.18.6_@babel+core@7.20.7: resolution: {integrity: sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.7 '@babel/helper-plugin-utils': 7.20.2 dev: false - /@babel/plugin-transform-template-literals/7.18.9_@babel+core@7.20.5: + /@babel/plugin-transform-template-literals/7.18.9_@babel+core@7.20.7: resolution: {integrity: sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.7 '@babel/helper-plugin-utils': 7.20.2 dev: false - /@babel/plugin-transform-typeof-symbol/7.18.9_@babel+core@7.20.5: + /@babel/plugin-transform-typeof-symbol/7.18.9_@babel+core@7.20.7: resolution: {integrity: sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.7 '@babel/helper-plugin-utils': 7.20.2 dev: false - /@babel/plugin-transform-typescript/7.20.2_@babel+core@7.20.5: - resolution: {integrity: sha512-jvS+ngBfrnTUBfOQq8NfGnSbF9BrqlR6hjJ2yVxMkmO5nL/cdifNbI30EfjRlN4g5wYWNnMPyj5Sa6R1pbLeag==} + /@babel/plugin-transform-typescript/7.20.7_@babel+core@7.20.7: + resolution: {integrity: sha512-m3wVKEvf6SoszD8pu4NZz3PvfKRCMgk6D6d0Qi9hNnlM5M6CFS92EgF4EiHVLKbU0r/r7ty1hg7NPZwE7WRbYw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 - '@babel/helper-create-class-features-plugin': 7.20.5_@babel+core@7.20.5 + '@babel/core': 7.20.7 + '@babel/helper-create-class-features-plugin': 7.20.7_@babel+core@7.20.7 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-typescript': 7.20.0_@babel+core@7.20.5 + '@babel/plugin-syntax-typescript': 7.20.0_@babel+core@7.20.7 transitivePeerDependencies: - supports-color dev: false - /@babel/plugin-transform-unicode-escapes/7.18.10_@babel+core@7.20.5: + /@babel/plugin-transform-unicode-escapes/7.18.10_@babel+core@7.20.7: resolution: {integrity: sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.7 '@babel/helper-plugin-utils': 7.20.2 dev: false - /@babel/plugin-transform-unicode-regex/7.18.6_@babel+core@7.20.5: + /@babel/plugin-transform-unicode-regex/7.18.6_@babel+core@7.20.7: resolution: {integrity: sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 - '@babel/helper-create-regexp-features-plugin': 7.20.5_@babel+core@7.20.5 + '@babel/core': 7.20.7 + '@babel/helper-create-regexp-features-plugin': 7.20.5_@babel+core@7.20.7 '@babel/helper-plugin-utils': 7.20.2 dev: false - /@babel/preset-env/7.20.2_@babel+core@7.20.5: + /@babel/preset-env/7.20.2_@babel+core@7.20.7: resolution: {integrity: sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.20.5 - '@babel/core': 7.20.5 - '@babel/helper-compilation-targets': 7.20.0_@babel+core@7.20.5 + '@babel/compat-data': 7.20.10 + '@babel/core': 7.20.7 + '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.20.7 '@babel/helper-plugin-utils': 7.20.2 '@babel/helper-validator-option': 7.18.6 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.18.6_@babel+core@7.20.5 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.18.9_@babel+core@7.20.5 - '@babel/plugin-proposal-async-generator-functions': 7.20.1_@babel+core@7.20.5 - '@babel/plugin-proposal-class-properties': 7.18.6_@babel+core@7.20.5 - '@babel/plugin-proposal-class-static-block': 7.18.6_@babel+core@7.20.5 - '@babel/plugin-proposal-dynamic-import': 7.18.6_@babel+core@7.20.5 - '@babel/plugin-proposal-export-namespace-from': 7.18.9_@babel+core@7.20.5 - '@babel/plugin-proposal-json-strings': 7.18.6_@babel+core@7.20.5 - '@babel/plugin-proposal-logical-assignment-operators': 7.18.9_@babel+core@7.20.5 - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6_@babel+core@7.20.5 - '@babel/plugin-proposal-numeric-separator': 7.18.6_@babel+core@7.20.5 - '@babel/plugin-proposal-object-rest-spread': 7.20.2_@babel+core@7.20.5 - '@babel/plugin-proposal-optional-catch-binding': 7.18.6_@babel+core@7.20.5 - '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.20.5 - '@babel/plugin-proposal-private-methods': 7.18.6_@babel+core@7.20.5 - '@babel/plugin-proposal-private-property-in-object': 7.20.5_@babel+core@7.20.5 - '@babel/plugin-proposal-unicode-property-regex': 7.18.6_@babel+core@7.20.5 - '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.20.5 - '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.20.5 - '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.20.5 - '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.20.5 - '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.20.5 - '@babel/plugin-syntax-import-assertions': 7.20.0_@babel+core@7.20.5 - '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.20.5 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.20.5 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.20.5 - '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.20.5 - '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.20.5 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.20.5 - '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.20.5 - '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.20.5 - '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.20.5 - '@babel/plugin-transform-arrow-functions': 7.18.6_@babel+core@7.20.5 - '@babel/plugin-transform-async-to-generator': 7.18.6_@babel+core@7.20.5 - '@babel/plugin-transform-block-scoped-functions': 7.18.6_@babel+core@7.20.5 - '@babel/plugin-transform-block-scoping': 7.20.5_@babel+core@7.20.5 - '@babel/plugin-transform-classes': 7.20.2_@babel+core@7.20.5 - '@babel/plugin-transform-computed-properties': 7.18.9_@babel+core@7.20.5 - '@babel/plugin-transform-destructuring': 7.20.2_@babel+core@7.20.5 - '@babel/plugin-transform-dotall-regex': 7.18.6_@babel+core@7.20.5 - '@babel/plugin-transform-duplicate-keys': 7.18.9_@babel+core@7.20.5 - '@babel/plugin-transform-exponentiation-operator': 7.18.6_@babel+core@7.20.5 - '@babel/plugin-transform-for-of': 7.18.8_@babel+core@7.20.5 - '@babel/plugin-transform-function-name': 7.18.9_@babel+core@7.20.5 - '@babel/plugin-transform-literals': 7.18.9_@babel+core@7.20.5 - '@babel/plugin-transform-member-expression-literals': 7.18.6_@babel+core@7.20.5 - '@babel/plugin-transform-modules-amd': 7.19.6_@babel+core@7.20.5 - '@babel/plugin-transform-modules-commonjs': 7.19.6_@babel+core@7.20.5 - '@babel/plugin-transform-modules-systemjs': 7.19.6_@babel+core@7.20.5 - '@babel/plugin-transform-modules-umd': 7.18.6_@babel+core@7.20.5 - '@babel/plugin-transform-named-capturing-groups-regex': 7.20.5_@babel+core@7.20.5 - '@babel/plugin-transform-new-target': 7.18.6_@babel+core@7.20.5 - '@babel/plugin-transform-object-super': 7.18.6_@babel+core@7.20.5 - '@babel/plugin-transform-parameters': 7.20.5_@babel+core@7.20.5 - '@babel/plugin-transform-property-literals': 7.18.6_@babel+core@7.20.5 - '@babel/plugin-transform-regenerator': 7.20.5_@babel+core@7.20.5 - '@babel/plugin-transform-reserved-words': 7.18.6_@babel+core@7.20.5 - '@babel/plugin-transform-shorthand-properties': 7.18.6_@babel+core@7.20.5 - '@babel/plugin-transform-spread': 7.19.0_@babel+core@7.20.5 - '@babel/plugin-transform-sticky-regex': 7.18.6_@babel+core@7.20.5 - '@babel/plugin-transform-template-literals': 7.18.9_@babel+core@7.20.5 - '@babel/plugin-transform-typeof-symbol': 7.18.9_@babel+core@7.20.5 - '@babel/plugin-transform-unicode-escapes': 7.18.10_@babel+core@7.20.5 - '@babel/plugin-transform-unicode-regex': 7.18.6_@babel+core@7.20.5 - '@babel/preset-modules': 0.1.5_@babel+core@7.20.5 - '@babel/types': 7.20.5 - babel-plugin-polyfill-corejs2: 0.3.3_@babel+core@7.20.5 - babel-plugin-polyfill-corejs3: 0.6.0_@babel+core@7.20.5 - babel-plugin-polyfill-regenerator: 0.4.1_@babel+core@7.20.5 - core-js-compat: 3.26.1 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.18.6_@babel+core@7.20.7 + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.20.7_@babel+core@7.20.7 + '@babel/plugin-proposal-async-generator-functions': 7.20.7_@babel+core@7.20.7 + '@babel/plugin-proposal-class-properties': 7.18.6_@babel+core@7.20.7 + '@babel/plugin-proposal-class-static-block': 7.20.7_@babel+core@7.20.7 + '@babel/plugin-proposal-dynamic-import': 7.18.6_@babel+core@7.20.7 + '@babel/plugin-proposal-export-namespace-from': 7.18.9_@babel+core@7.20.7 + '@babel/plugin-proposal-json-strings': 7.18.6_@babel+core@7.20.7 + '@babel/plugin-proposal-logical-assignment-operators': 7.20.7_@babel+core@7.20.7 + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6_@babel+core@7.20.7 + '@babel/plugin-proposal-numeric-separator': 7.18.6_@babel+core@7.20.7 + '@babel/plugin-proposal-object-rest-spread': 7.20.7_@babel+core@7.20.7 + '@babel/plugin-proposal-optional-catch-binding': 7.18.6_@babel+core@7.20.7 + '@babel/plugin-proposal-optional-chaining': 7.20.7_@babel+core@7.20.7 + '@babel/plugin-proposal-private-methods': 7.18.6_@babel+core@7.20.7 + '@babel/plugin-proposal-private-property-in-object': 7.20.5_@babel+core@7.20.7 + '@babel/plugin-proposal-unicode-property-regex': 7.18.6_@babel+core@7.20.7 + '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.20.7 + '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.20.7 + '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.20.7 + '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.20.7 + '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.20.7 + '@babel/plugin-syntax-import-assertions': 7.20.0_@babel+core@7.20.7 + '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.20.7 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.20.7 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.20.7 + '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.20.7 + '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.20.7 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.20.7 + '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.20.7 + '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.20.7 + '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.20.7 + '@babel/plugin-transform-arrow-functions': 7.20.7_@babel+core@7.20.7 + '@babel/plugin-transform-async-to-generator': 7.20.7_@babel+core@7.20.7 + '@babel/plugin-transform-block-scoped-functions': 7.18.6_@babel+core@7.20.7 + '@babel/plugin-transform-block-scoping': 7.20.11_@babel+core@7.20.7 + '@babel/plugin-transform-classes': 7.20.7_@babel+core@7.20.7 + '@babel/plugin-transform-computed-properties': 7.20.7_@babel+core@7.20.7 + '@babel/plugin-transform-destructuring': 7.20.7_@babel+core@7.20.7 + '@babel/plugin-transform-dotall-regex': 7.18.6_@babel+core@7.20.7 + '@babel/plugin-transform-duplicate-keys': 7.18.9_@babel+core@7.20.7 + '@babel/plugin-transform-exponentiation-operator': 7.18.6_@babel+core@7.20.7 + '@babel/plugin-transform-for-of': 7.18.8_@babel+core@7.20.7 + '@babel/plugin-transform-function-name': 7.18.9_@babel+core@7.20.7 + '@babel/plugin-transform-literals': 7.18.9_@babel+core@7.20.7 + '@babel/plugin-transform-member-expression-literals': 7.18.6_@babel+core@7.20.7 + '@babel/plugin-transform-modules-amd': 7.20.11_@babel+core@7.20.7 + '@babel/plugin-transform-modules-commonjs': 7.20.11_@babel+core@7.20.7 + '@babel/plugin-transform-modules-systemjs': 7.20.11_@babel+core@7.20.7 + '@babel/plugin-transform-modules-umd': 7.18.6_@babel+core@7.20.7 + '@babel/plugin-transform-named-capturing-groups-regex': 7.20.5_@babel+core@7.20.7 + '@babel/plugin-transform-new-target': 7.18.6_@babel+core@7.20.7 + '@babel/plugin-transform-object-super': 7.18.6_@babel+core@7.20.7 + '@babel/plugin-transform-parameters': 7.20.7_@babel+core@7.20.7 + '@babel/plugin-transform-property-literals': 7.18.6_@babel+core@7.20.7 + '@babel/plugin-transform-regenerator': 7.20.5_@babel+core@7.20.7 + '@babel/plugin-transform-reserved-words': 7.18.6_@babel+core@7.20.7 + '@babel/plugin-transform-shorthand-properties': 7.18.6_@babel+core@7.20.7 + '@babel/plugin-transform-spread': 7.20.7_@babel+core@7.20.7 + '@babel/plugin-transform-sticky-regex': 7.18.6_@babel+core@7.20.7 + '@babel/plugin-transform-template-literals': 7.18.9_@babel+core@7.20.7 + '@babel/plugin-transform-typeof-symbol': 7.18.9_@babel+core@7.20.7 + '@babel/plugin-transform-unicode-escapes': 7.18.10_@babel+core@7.20.7 + '@babel/plugin-transform-unicode-regex': 7.18.6_@babel+core@7.20.7 + '@babel/preset-modules': 0.1.5_@babel+core@7.20.7 + '@babel/types': 7.20.7 + babel-plugin-polyfill-corejs2: 0.3.3_@babel+core@7.20.7 + babel-plugin-polyfill-corejs3: 0.6.0_@babel+core@7.20.7 + babel-plugin-polyfill-regenerator: 0.4.1_@babel+core@7.20.7 + core-js-compat: 3.27.1 semver: 6.3.0 transitivePeerDependencies: - supports-color dev: false - /@babel/preset-modules/0.1.5_@babel+core@7.20.5: + /@babel/preset-modules/0.1.5_@babel+core@7.20.7: resolution: {integrity: sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.7 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-proposal-unicode-property-regex': 7.18.6_@babel+core@7.20.5 - '@babel/plugin-transform-dotall-regex': 7.18.6_@babel+core@7.20.5 - '@babel/types': 7.20.5 + '@babel/plugin-proposal-unicode-property-regex': 7.18.6_@babel+core@7.20.7 + '@babel/plugin-transform-dotall-regex': 7.18.6_@babel+core@7.20.7 + '@babel/types': 7.20.7 esutils: 2.0.3 dev: false - /@babel/preset-react/7.18.6_@babel+core@7.20.5: + /@babel/preset-react/7.18.6_@babel+core@7.20.7: resolution: {integrity: sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.7 '@babel/helper-plugin-utils': 7.20.2 '@babel/helper-validator-option': 7.18.6 - '@babel/plugin-transform-react-display-name': 7.18.6_@babel+core@7.20.5 - '@babel/plugin-transform-react-jsx': 7.19.0_@babel+core@7.20.5 - '@babel/plugin-transform-react-jsx-development': 7.18.6_@babel+core@7.20.5 - '@babel/plugin-transform-react-pure-annotations': 7.18.6_@babel+core@7.20.5 + '@babel/plugin-transform-react-display-name': 7.18.6_@babel+core@7.20.7 + '@babel/plugin-transform-react-jsx': 7.20.7_@babel+core@7.20.7 + '@babel/plugin-transform-react-jsx-development': 7.18.6_@babel+core@7.20.7 + '@babel/plugin-transform-react-pure-annotations': 7.18.6_@babel+core@7.20.7 dev: false - /@babel/preset-typescript/7.18.6_@babel+core@7.20.5: + /@babel/preset-typescript/7.18.6_@babel+core@7.20.7: resolution: {integrity: sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.7 '@babel/helper-plugin-utils': 7.20.2 '@babel/helper-validator-option': 7.18.6 - '@babel/plugin-transform-typescript': 7.20.2_@babel+core@7.20.5 + '@babel/plugin-transform-typescript': 7.20.7_@babel+core@7.20.7 transitivePeerDependencies: - supports-color dev: false - /@babel/runtime-corejs3/7.20.6: - resolution: {integrity: sha512-tqeujPiuEfcH067mx+7otTQWROVMKHXEaOQcAeNV5dDdbPWvPcFA8/W9LXw2NfjNmOetqLl03dfnG2WALPlsRQ==} + /@babel/runtime-corejs3/7.20.7: + resolution: {integrity: sha512-jr9lCZ4RbRQmCR28Q8U8Fu49zvFqLxTY9AMOUz+iyMohMoAgpEcVxY+wJNay99oXOpOcCTODkk70NDN2aaJEeg==} engines: {node: '>=6.9.0'} dependencies: - core-js-pure: 3.26.1 + core-js-pure: 3.27.1 regenerator-runtime: 0.13.11 dev: false - /@babel/runtime/7.20.6: - resolution: {integrity: sha512-Q+8MqP7TiHMWzSfwiJwXCjyf4GYA4Dgw3emg/7xmwsdLJOZUp+nMqcOwOzzYheuM1rhDu8FSj2l0aoMygEuXuA==} + /@babel/runtime/7.20.7: + resolution: {integrity: sha512-UF0tvkUtxwAgZ5W/KrkHf0Rn0fdnLDU9ScxBrEVNUprE/MzirjK4MJUX1/BVDv00Sv8cljtukVK1aky++X1SjQ==} engines: {node: '>=6.9.0'} dependencies: regenerator-runtime: 0.13.11 - /@babel/template/7.18.10: - resolution: {integrity: sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==} + /@babel/template/7.20.7: + resolution: {integrity: sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==} engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.18.6 - '@babel/parser': 7.20.5 - '@babel/types': 7.20.5 + '@babel/parser': 7.20.7 + '@babel/types': 7.20.7 - /@babel/traverse/7.20.5: - resolution: {integrity: sha512-WM5ZNN3JITQIq9tFZaw1ojLU3WgWdtkxnhM1AegMS+PvHjkM5IXjmYEGY7yukz5XS4sJyEf2VzWjI8uAavhxBQ==} + /@babel/traverse/7.20.10: + resolution: {integrity: sha512-oSf1juCgymrSez8NI4A2sr4+uB/mFd9MXplYGPEBnfAuWmmyeVcHa6xLPiaRBcXkcb/28bgxmQLTVwFKE1yfsg==} engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.18.6 - '@babel/generator': 7.20.5 + '@babel/generator': 7.20.7 '@babel/helper-environment-visitor': 7.18.9 '@babel/helper-function-name': 7.19.0 '@babel/helper-hoist-variables': 7.18.6 '@babel/helper-split-export-declaration': 7.18.6 - '@babel/parser': 7.20.5 - '@babel/types': 7.20.5 + '@babel/parser': 7.20.7 + '@babel/types': 7.20.7 debug: 4.3.4 globals: 11.12.0 transitivePeerDependencies: - supports-color - /@babel/types/7.20.5: - resolution: {integrity: sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg==} + /@babel/types/7.20.7: + resolution: {integrity: sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==} engines: {node: '>=6.9.0'} dependencies: '@babel/helper-string-parser': 7.19.4 @@ -1587,12 +1589,12 @@ packages: '@jridgewell/trace-mapping': 0.3.9 dev: true - /@docsearch/css/3.3.0: - resolution: {integrity: sha512-rODCdDtGyudLj+Va8b6w6Y85KE85bXRsps/R4Yjwt5vueXKXZQKYw0aA9knxLBT6a/bI/GMrAcmCR75KYOM6hg==} + /@docsearch/css/3.3.1: + resolution: {integrity: sha512-nznHXeFHpAYjyaSNFNFpU+IJPjQA7AINM8ONjDx/Zx4O/pGAvqwgmcLNc7zR8qXRutqnzLo06yN63xFn36KFBw==} dev: false - /@docsearch/react/3.3.0_2oftdjc235pafh5xn5kpmut4wm: - resolution: {integrity: sha512-fhS5adZkae2SSdMYEMVg6pxI5a/cE+tW16ki1V0/ur4Fdok3hBRkmN/H8VvlXnxzggkQIIRIVvYPn00JPjen3A==} + /@docsearch/react/3.3.1_p2wvewccyj6enzdqwvxe7poqlq: + resolution: {integrity: sha512-wdeQBODPkue6yVEEg4ntt+TiGJ6iXMBUNjBQJ0s1WVoc1OdcCnks/lkQ5LEfXETYR/q9QSbCCBnMjvnSoILaag==} peerDependencies: '@types/react': '>= 16.8.0 < 19.0.0' react: '>= 16.8.0 < 19.0.0' @@ -1606,16 +1608,16 @@ packages: optional: true dependencies: '@algolia/autocomplete-core': 1.7.2 - '@algolia/autocomplete-preset-algolia': 1.7.2_qs6lk5nhygj2o3hj4sf6xnr724 - '@docsearch/css': 3.3.0 - algoliasearch: 4.14.2 + '@algolia/autocomplete-preset-algolia': 1.7.2_dk4ct527ug5whbfokpeal2wzha + '@docsearch/css': 3.3.1 + algoliasearch: 4.14.3 react: 17.0.2 react-dom: 17.0.2_react@17.0.2 transitivePeerDependencies: - '@algolia/client-search' dev: false - /@docusaurus/core/2.2.0_aeigrxhfhc4abyd45ix2hknizy: + /@docusaurus/core/2.2.0_vukvsfkp4hxnee7vteliqou2xy: resolution: {integrity: sha512-Vd6XOluKQqzG12fEs9prJgDtyn6DPok9vmUWDR2E6/nV5Fl9SVkhEQOBxwObjk3kQh7OY7vguFaLh0jqdApWsA==} engines: {node: '>=16.14'} hasBin: true @@ -1623,16 +1625,16 @@ packages: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 dependencies: - '@babel/core': 7.20.5 - '@babel/generator': 7.20.5 - '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.20.5 - '@babel/plugin-transform-runtime': 7.19.6_@babel+core@7.20.5 - '@babel/preset-env': 7.20.2_@babel+core@7.20.5 - '@babel/preset-react': 7.18.6_@babel+core@7.20.5 - '@babel/preset-typescript': 7.18.6_@babel+core@7.20.5 - '@babel/runtime': 7.20.6 - '@babel/runtime-corejs3': 7.20.6 - '@babel/traverse': 7.20.5 + '@babel/core': 7.20.7 + '@babel/generator': 7.20.7 + '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.20.7 + '@babel/plugin-transform-runtime': 7.19.6_@babel+core@7.20.7 + '@babel/preset-env': 7.20.2_@babel+core@7.20.7 + '@babel/preset-react': 7.18.6_@babel+core@7.20.7 + '@babel/preset-typescript': 7.18.6_@babel+core@7.20.7 + '@babel/runtime': 7.20.7 + '@babel/runtime-corejs3': 7.20.7 + '@babel/traverse': 7.20.10 '@docusaurus/cssnano-preset': 2.2.0 '@docusaurus/logger': 2.2.0 '@docusaurus/mdx-loader': 2.2.0_zneentkx4scexj4pzosurqq55y @@ -1642,8 +1644,8 @@ packages: '@docusaurus/utils-validation': 2.2.0_@docusaurus+types@2.2.0 '@slorber/static-site-generator-webpack-plugin': 4.0.7 '@svgr/webpack': 6.5.1 - autoprefixer: 10.4.13_postcss@8.4.14 - babel-loader: 8.3.0_ztqwsvkb6z73luspkai6ilstpu + autoprefixer: 10.4.13_postcss@8.4.20 + babel-loader: 8.3.0_lkd654lvpl423ugsqn5olungie babel-plugin-dynamic-import-node: 2.3.3 boxen: 6.2.1 chalk: 4.1.2 @@ -1653,10 +1655,10 @@ packages: combine-promises: 1.1.0 commander: 5.1.0 copy-webpack-plugin: 11.0.0_webpack@5.75.0 - core-js: 3.26.1 - css-loader: 6.7.2_webpack@5.75.0 + core-js: 3.27.1 + css-loader: 6.7.3_webpack@5.75.0 css-minimizer-webpack-plugin: 4.2.2_2xq5u4vuzw4op42d4uqzx2gxfa - cssnano: 5.1.14_postcss@8.4.14 + cssnano: 5.1.14_postcss@8.4.20 del: 6.1.1 detect-port: 1.5.1 escape-html: 1.0.3 @@ -1670,11 +1672,11 @@ packages: leven: 3.1.0 lodash: 4.17.21 mini-css-extract-plugin: 2.7.2_webpack@5.75.0 - postcss: 8.4.14 - postcss-loader: 7.0.2_yr6womevqv5t3aet2t3y7pv3ua + postcss: 8.4.20 + postcss-loader: 7.0.2_qxxfhhrl3yknjjmta266mo3u64 prompts: 2.4.2 react: 17.0.2 - react-dev-utils: 12.0.1_vfotqvx6lgcbf3upbs6hgaza4q + react-dev-utils: 12.0.1_3fkjkrd3audxnith3e7fo4fnxi react-dom: 17.0.2_react@17.0.2 react-helmet-async: 1.3.0_sfoxds7t5ydpegc3knd667wn6m react-loadable: /@docusaurus/react-loadable/5.5.2_react@17.0.2 @@ -1719,9 +1721,9 @@ packages: resolution: {integrity: sha512-mAAwCo4n66TMWBH1kXnHVZsakW9VAXJzTO4yZukuL3ro4F+JtkMwKfh42EG75K/J/YIFQG5I/Bzy0UH/hFxaTg==} engines: {node: '>=16.14'} dependencies: - cssnano-preset-advanced: 5.3.9_postcss@8.4.14 - postcss: 8.4.14 - postcss-sort-media-queries: 4.3.0_postcss@8.4.14 + cssnano-preset-advanced: 5.3.9_postcss@8.4.20 + postcss: 8.4.20 + postcss-sort-media-queries: 4.3.0_postcss@8.4.20 tslib: 2.4.1 dev: false @@ -1740,8 +1742,8 @@ packages: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 dependencies: - '@babel/parser': 7.20.5 - '@babel/traverse': 7.20.5 + '@babel/parser': 7.20.7 + '@babel/traverse': 7.20.10 '@docusaurus/logger': 2.2.0 '@docusaurus/utils': 2.2.0_@docusaurus+types@2.2.0 '@mdx-js/mdx': 1.6.22 @@ -1777,7 +1779,7 @@ packages: '@docusaurus/react-loadable': 5.5.2_react@17.0.2 '@docusaurus/types': 2.2.0_sfoxds7t5ydpegc3knd667wn6m '@types/history': 4.7.11 - '@types/react': 18.0.25 + '@types/react': 18.0.26 '@types/react-router-config': 5.0.6 '@types/react-router-dom': 5.3.3 react: 17.0.2 @@ -1790,14 +1792,14 @@ packages: - uglify-js - webpack-cli - /@docusaurus/plugin-content-blog/2.2.0_wfh3mw2ke2bdr53qfq544ltemu: + /@docusaurus/plugin-content-blog/2.2.0_lhsnqlb35hvawm3f6bviuzo2eu: resolution: {integrity: sha512-0mWBinEh0a5J2+8ZJXJXbrCk1tSTNf7Nm4tYAl5h2/xx+PvH/Bnu0V+7mMljYm/1QlDYALNIIaT/JcoZQFUN3w==} engines: {node: '>=16.14'} peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 dependencies: - '@docusaurus/core': 2.2.0_aeigrxhfhc4abyd45ix2hknizy + '@docusaurus/core': 2.2.0_vukvsfkp4hxnee7vteliqou2xy '@docusaurus/logger': 2.2.0 '@docusaurus/mdx-loader': 2.2.0_zneentkx4scexj4pzosurqq55y '@docusaurus/types': 2.2.0_sfoxds7t5ydpegc3knd667wn6m @@ -1833,14 +1835,14 @@ packages: - webpack-cli dev: false - /@docusaurus/plugin-content-docs/2.2.0_wfh3mw2ke2bdr53qfq544ltemu: + /@docusaurus/plugin-content-docs/2.2.0_lhsnqlb35hvawm3f6bviuzo2eu: resolution: {integrity: sha512-BOazBR0XjzsHE+2K1wpNxz5QZmrJgmm3+0Re0EVPYFGW8qndCWGNtXW/0lGKhecVPML8yyFeAmnUCIs7xM2wPw==} engines: {node: '>=16.14'} peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 dependencies: - '@docusaurus/core': 2.2.0_aeigrxhfhc4abyd45ix2hknizy + '@docusaurus/core': 2.2.0_vukvsfkp4hxnee7vteliqou2xy '@docusaurus/logger': 2.2.0 '@docusaurus/mdx-loader': 2.2.0_zneentkx4scexj4pzosurqq55y '@docusaurus/module-type-aliases': 2.2.0_sfoxds7t5ydpegc3knd667wn6m @@ -1876,14 +1878,14 @@ packages: - webpack-cli dev: false - /@docusaurus/plugin-content-pages/2.2.0_wfh3mw2ke2bdr53qfq544ltemu: + /@docusaurus/plugin-content-pages/2.2.0_lhsnqlb35hvawm3f6bviuzo2eu: resolution: {integrity: sha512-+OTK3FQHk5WMvdelz8v19PbEbx+CNT6VSpx7nVOvMNs5yJCKvmqBJBQ2ZSxROxhVDYn+CZOlmyrC56NSXzHf6g==} engines: {node: '>=16.14'} peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 dependencies: - '@docusaurus/core': 2.2.0_aeigrxhfhc4abyd45ix2hknizy + '@docusaurus/core': 2.2.0_vukvsfkp4hxnee7vteliqou2xy '@docusaurus/mdx-loader': 2.2.0_zneentkx4scexj4pzosurqq55y '@docusaurus/types': 2.2.0_sfoxds7t5ydpegc3knd667wn6m '@docusaurus/utils': 2.2.0_@docusaurus+types@2.2.0 @@ -1911,14 +1913,14 @@ packages: - webpack-cli dev: false - /@docusaurus/plugin-debug/2.2.0_wfh3mw2ke2bdr53qfq544ltemu: + /@docusaurus/plugin-debug/2.2.0_lhsnqlb35hvawm3f6bviuzo2eu: resolution: {integrity: sha512-p9vOep8+7OVl6r/NREEYxf4HMAjV8JMYJ7Bos5fCFO0Wyi9AZEo0sCTliRd7R8+dlJXZEgcngSdxAUo/Q+CJow==} engines: {node: '>=16.14'} peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 dependencies: - '@docusaurus/core': 2.2.0_aeigrxhfhc4abyd45ix2hknizy + '@docusaurus/core': 2.2.0_vukvsfkp4hxnee7vteliqou2xy '@docusaurus/types': 2.2.0_sfoxds7t5ydpegc3knd667wn6m '@docusaurus/utils': 2.2.0_@docusaurus+types@2.2.0 fs-extra: 10.1.0 @@ -1946,14 +1948,14 @@ packages: - webpack-cli dev: false - /@docusaurus/plugin-google-analytics/2.2.0_wfh3mw2ke2bdr53qfq544ltemu: + /@docusaurus/plugin-google-analytics/2.2.0_lhsnqlb35hvawm3f6bviuzo2eu: resolution: {integrity: sha512-+eZVVxVeEnV5nVQJdey9ZsfyEVMls6VyWTIj8SmX0k5EbqGvnIfET+J2pYEuKQnDIHxy+syRMoRM6AHXdHYGIg==} engines: {node: '>=16.14'} peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 dependencies: - '@docusaurus/core': 2.2.0_aeigrxhfhc4abyd45ix2hknizy + '@docusaurus/core': 2.2.0_vukvsfkp4hxnee7vteliqou2xy '@docusaurus/types': 2.2.0_sfoxds7t5ydpegc3knd667wn6m '@docusaurus/utils-validation': 2.2.0_@docusaurus+types@2.2.0 react: 17.0.2 @@ -1977,14 +1979,14 @@ packages: - webpack-cli dev: false - /@docusaurus/plugin-google-gtag/2.2.0_wfh3mw2ke2bdr53qfq544ltemu: + /@docusaurus/plugin-google-gtag/2.2.0_lhsnqlb35hvawm3f6bviuzo2eu: resolution: {integrity: sha512-6SOgczP/dYdkqUMGTRqgxAS1eTp6MnJDAQMy8VCF1QKbWZmlkx4agHDexihqmYyCujTYHqDAhm1hV26EET54NQ==} engines: {node: '>=16.14'} peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 dependencies: - '@docusaurus/core': 2.2.0_aeigrxhfhc4abyd45ix2hknizy + '@docusaurus/core': 2.2.0_vukvsfkp4hxnee7vteliqou2xy '@docusaurus/types': 2.2.0_sfoxds7t5ydpegc3knd667wn6m '@docusaurus/utils-validation': 2.2.0_@docusaurus+types@2.2.0 react: 17.0.2 @@ -2008,14 +2010,14 @@ packages: - webpack-cli dev: false - /@docusaurus/plugin-sitemap/2.2.0_wfh3mw2ke2bdr53qfq544ltemu: + /@docusaurus/plugin-sitemap/2.2.0_lhsnqlb35hvawm3f6bviuzo2eu: resolution: {integrity: sha512-0jAmyRDN/aI265CbWZNZuQpFqiZuo+5otk2MylU9iVrz/4J7gSc+ZJ9cy4EHrEsW7PV8s1w18hIEsmcA1YgkKg==} engines: {node: '>=16.14'} peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 dependencies: - '@docusaurus/core': 2.2.0_aeigrxhfhc4abyd45ix2hknizy + '@docusaurus/core': 2.2.0_vukvsfkp4hxnee7vteliqou2xy '@docusaurus/logger': 2.2.0 '@docusaurus/types': 2.2.0_sfoxds7t5ydpegc3knd667wn6m '@docusaurus/utils': 2.2.0_@docusaurus+types@2.2.0 @@ -2044,24 +2046,24 @@ packages: - webpack-cli dev: false - /@docusaurus/preset-classic/2.2.0_mxv5mfbuokwbf4v23zvtcqiixm: + /@docusaurus/preset-classic/2.2.0_65e6vsojdhusq2wqqiy3kus3ju: resolution: {integrity: sha512-yKIWPGNx7BT8v2wjFIWvYrS+nvN04W+UameSFf8lEiJk6pss0kL6SG2MRvyULiI3BDxH+tj6qe02ncpSPGwumg==} engines: {node: '>=16.14'} peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 dependencies: - '@docusaurus/core': 2.2.0_aeigrxhfhc4abyd45ix2hknizy - '@docusaurus/plugin-content-blog': 2.2.0_wfh3mw2ke2bdr53qfq544ltemu - '@docusaurus/plugin-content-docs': 2.2.0_wfh3mw2ke2bdr53qfq544ltemu - '@docusaurus/plugin-content-pages': 2.2.0_wfh3mw2ke2bdr53qfq544ltemu - '@docusaurus/plugin-debug': 2.2.0_wfh3mw2ke2bdr53qfq544ltemu - '@docusaurus/plugin-google-analytics': 2.2.0_wfh3mw2ke2bdr53qfq544ltemu - '@docusaurus/plugin-google-gtag': 2.2.0_wfh3mw2ke2bdr53qfq544ltemu - '@docusaurus/plugin-sitemap': 2.2.0_wfh3mw2ke2bdr53qfq544ltemu - '@docusaurus/theme-classic': 2.2.0_wfh3mw2ke2bdr53qfq544ltemu - '@docusaurus/theme-common': 2.2.0_aeigrxhfhc4abyd45ix2hknizy - '@docusaurus/theme-search-algolia': 2.2.0_vlw7szqkoyna7gbw5rhfdt37ei + '@docusaurus/core': 2.2.0_vukvsfkp4hxnee7vteliqou2xy + '@docusaurus/plugin-content-blog': 2.2.0_lhsnqlb35hvawm3f6bviuzo2eu + '@docusaurus/plugin-content-docs': 2.2.0_lhsnqlb35hvawm3f6bviuzo2eu + '@docusaurus/plugin-content-pages': 2.2.0_lhsnqlb35hvawm3f6bviuzo2eu + '@docusaurus/plugin-debug': 2.2.0_lhsnqlb35hvawm3f6bviuzo2eu + '@docusaurus/plugin-google-analytics': 2.2.0_lhsnqlb35hvawm3f6bviuzo2eu + '@docusaurus/plugin-google-gtag': 2.2.0_lhsnqlb35hvawm3f6bviuzo2eu + '@docusaurus/plugin-sitemap': 2.2.0_lhsnqlb35hvawm3f6bviuzo2eu + '@docusaurus/theme-classic': 2.2.0_lhsnqlb35hvawm3f6bviuzo2eu + '@docusaurus/theme-common': 2.2.0_vukvsfkp4hxnee7vteliqou2xy + '@docusaurus/theme-search-algolia': 2.2.0_yov7hf7zrbhu4gxl7psaulskqy '@docusaurus/types': 2.2.0_sfoxds7t5ydpegc3knd667wn6m react: 17.0.2 react-dom: 17.0.2_react@17.0.2 @@ -2091,24 +2093,24 @@ packages: peerDependencies: react: '*' dependencies: - '@types/react': 18.0.25 + '@types/react': 18.0.26 prop-types: 15.8.1 react: 17.0.2 - /@docusaurus/theme-classic/2.2.0_wfh3mw2ke2bdr53qfq544ltemu: + /@docusaurus/theme-classic/2.2.0_lhsnqlb35hvawm3f6bviuzo2eu: resolution: {integrity: sha512-kjbg/qJPwZ6H1CU/i9d4l/LcFgnuzeiGgMQlt6yPqKo0SOJIBMPuz7Rnu3r/WWbZFPi//o8acclacOzmXdUUEg==} engines: {node: '>=16.14'} peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 dependencies: - '@docusaurus/core': 2.2.0_aeigrxhfhc4abyd45ix2hknizy + '@docusaurus/core': 2.2.0_vukvsfkp4hxnee7vteliqou2xy '@docusaurus/mdx-loader': 2.2.0_zneentkx4scexj4pzosurqq55y '@docusaurus/module-type-aliases': 2.2.0_sfoxds7t5ydpegc3knd667wn6m - '@docusaurus/plugin-content-blog': 2.2.0_wfh3mw2ke2bdr53qfq544ltemu - '@docusaurus/plugin-content-docs': 2.2.0_wfh3mw2ke2bdr53qfq544ltemu - '@docusaurus/plugin-content-pages': 2.2.0_wfh3mw2ke2bdr53qfq544ltemu - '@docusaurus/theme-common': 2.2.0_aeigrxhfhc4abyd45ix2hknizy + '@docusaurus/plugin-content-blog': 2.2.0_lhsnqlb35hvawm3f6bviuzo2eu + '@docusaurus/plugin-content-docs': 2.2.0_lhsnqlb35hvawm3f6bviuzo2eu + '@docusaurus/plugin-content-pages': 2.2.0_lhsnqlb35hvawm3f6bviuzo2eu + '@docusaurus/theme-common': 2.2.0_vukvsfkp4hxnee7vteliqou2xy '@docusaurus/theme-translations': 2.2.0 '@docusaurus/types': 2.2.0_sfoxds7t5ydpegc3knd667wn6m '@docusaurus/utils': 2.2.0_@docusaurus+types@2.2.0 @@ -2120,7 +2122,7 @@ packages: infima: 0.2.0-alpha.42 lodash: 4.17.21 nprogress: 0.2.0 - postcss: 8.4.14 + postcss: 8.4.20 prism-react-renderer: 1.3.5_react@17.0.2 prismjs: 1.29.0 react: 17.0.2 @@ -2147,7 +2149,7 @@ packages: - webpack-cli dev: false - /@docusaurus/theme-common/2.2.0_aeigrxhfhc4abyd45ix2hknizy: + /@docusaurus/theme-common/2.2.0_vukvsfkp4hxnee7vteliqou2xy: resolution: {integrity: sha512-R8BnDjYoN90DCL75gP7qYQfSjyitXuP9TdzgsKDmSFPNyrdE3twtPNa2dIN+h+p/pr+PagfxwWbd6dn722A1Dw==} engines: {node: '>=16.14'} peerDependencies: @@ -2156,12 +2158,12 @@ packages: dependencies: '@docusaurus/mdx-loader': 2.2.0_zneentkx4scexj4pzosurqq55y '@docusaurus/module-type-aliases': 2.2.0_sfoxds7t5ydpegc3knd667wn6m - '@docusaurus/plugin-content-blog': 2.2.0_wfh3mw2ke2bdr53qfq544ltemu - '@docusaurus/plugin-content-docs': 2.2.0_wfh3mw2ke2bdr53qfq544ltemu - '@docusaurus/plugin-content-pages': 2.2.0_wfh3mw2ke2bdr53qfq544ltemu + '@docusaurus/plugin-content-blog': 2.2.0_lhsnqlb35hvawm3f6bviuzo2eu + '@docusaurus/plugin-content-docs': 2.2.0_lhsnqlb35hvawm3f6bviuzo2eu + '@docusaurus/plugin-content-pages': 2.2.0_lhsnqlb35hvawm3f6bviuzo2eu '@docusaurus/utils': 2.2.0_@docusaurus+types@2.2.0 '@types/history': 4.7.11 - '@types/react': 18.0.25 + '@types/react': 18.0.26 '@types/react-router-config': 5.0.6 clsx: 1.2.1 parse-numeric-range: 1.3.0 @@ -2189,23 +2191,23 @@ packages: - webpack-cli dev: false - /@docusaurus/theme-search-algolia/2.2.0_vlw7szqkoyna7gbw5rhfdt37ei: + /@docusaurus/theme-search-algolia/2.2.0_yov7hf7zrbhu4gxl7psaulskqy: resolution: {integrity: sha512-2h38B0tqlxgR2FZ9LpAkGrpDWVdXZ7vltfmTdX+4RsDs3A7khiNsmZB+x/x6sA4+G2V2CvrsPMlsYBy5X+cY1w==} engines: {node: '>=16.14'} peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 dependencies: - '@docsearch/react': 3.3.0_2oftdjc235pafh5xn5kpmut4wm - '@docusaurus/core': 2.2.0_aeigrxhfhc4abyd45ix2hknizy + '@docsearch/react': 3.3.1_p2wvewccyj6enzdqwvxe7poqlq + '@docusaurus/core': 2.2.0_vukvsfkp4hxnee7vteliqou2xy '@docusaurus/logger': 2.2.0 - '@docusaurus/plugin-content-docs': 2.2.0_wfh3mw2ke2bdr53qfq544ltemu - '@docusaurus/theme-common': 2.2.0_aeigrxhfhc4abyd45ix2hknizy + '@docusaurus/plugin-content-docs': 2.2.0_lhsnqlb35hvawm3f6bviuzo2eu + '@docusaurus/theme-common': 2.2.0_vukvsfkp4hxnee7vteliqou2xy '@docusaurus/theme-translations': 2.2.0 '@docusaurus/utils': 2.2.0_@docusaurus+types@2.2.0 '@docusaurus/utils-validation': 2.2.0_@docusaurus+types@2.2.0 - algoliasearch: 4.14.2 - algoliasearch-helper: 3.11.1_algoliasearch@4.14.2 + algoliasearch: 4.14.3 + algoliasearch-helper: 3.11.1_algoliasearch@4.14.3 clsx: 1.2.1 eta: 1.12.3 fs-extra: 10.1.0 @@ -2250,7 +2252,7 @@ packages: react-dom: ^16.8.4 || ^17.0.0 dependencies: '@types/history': 4.7.11 - '@types/react': 18.0.25 + '@types/react': 18.0.26 commander: 5.1.0 joi: 17.7.0 react: 17.0.2 @@ -2329,15 +2331,15 @@ packages: - webpack-cli dev: false - /@eslint/eslintrc/1.3.3: - resolution: {integrity: sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==} + /@eslint/eslintrc/1.4.1: + resolution: {integrity: sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: ajv: 6.12.6 debug: 4.3.4 espree: 9.4.1 - globals: 13.18.0 - ignore: 5.2.1 + globals: 13.19.0 + ignore: 5.2.4 import-fresh: 3.3.0 js-yaml: 4.1.0 minimatch: 3.1.2 @@ -2390,7 +2392,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.3.1 - '@types/node': 18.11.9 + '@types/node': 18.11.18 chalk: 4.1.2 jest-message-util: 29.3.1 jest-util: 29.3.1 @@ -2411,14 +2413,14 @@ packages: '@jest/test-result': 29.3.1 '@jest/transform': 29.3.1 '@jest/types': 29.3.1 - '@types/node': 18.11.9 + '@types/node': 18.11.18 ansi-escapes: 4.3.2 chalk: 4.1.2 - ci-info: 3.7.0 + ci-info: 3.7.1 exit: 0.1.2 graceful-fs: 4.2.10 jest-changed-files: 29.2.0 - jest-config: 29.3.1_odkjkoia5xunhxkdrka32ib6vi + jest-config: 29.3.1_zfha7dvnw4nti6zkbsmhmn6xo4 jest-haste-map: 29.3.1 jest-message-util: 29.3.1 jest-regex-util: 29.2.0 @@ -2445,7 +2447,7 @@ packages: dependencies: '@jest/fake-timers': 29.3.1 '@jest/types': 29.3.1 - '@types/node': 18.11.9 + '@types/node': 18.11.18 jest-mock: 29.3.1 dev: true @@ -2472,7 +2474,7 @@ packages: dependencies: '@jest/types': 29.3.1 '@sinonjs/fake-timers': 9.1.2 - '@types/node': 18.11.9 + '@types/node': 18.11.18 jest-message-util: 29.3.1 jest-mock: 29.3.1 jest-util: 29.3.1 @@ -2505,7 +2507,7 @@ packages: '@jest/transform': 29.3.1 '@jest/types': 29.3.1 '@jridgewell/trace-mapping': 0.3.17 - '@types/node': 18.11.9 + '@types/node': 18.11.18 chalk: 4.1.2 collect-v8-coverage: 1.0.1 exit: 0.1.2 @@ -2566,7 +2568,7 @@ packages: resolution: {integrity: sha512-8wmCFBTVGYqFNLWfcOWoVuMuKYPUBTnTMDkdvFtAYELwDOl9RGwOsvQWGPFxDJ8AWY9xM/8xCXdqmPK3+Q5Lug==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.7 '@jest/types': 29.3.1 '@jridgewell/trace-mapping': 0.3.17 babel-plugin-istanbul: 6.1.1 @@ -2592,8 +2594,8 @@ packages: '@jest/schemas': 29.0.0 '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 - '@types/node': 18.11.9 - '@types/yargs': 17.0.15 + '@types/node': 18.11.18 + '@types/yargs': 17.0.18 chalk: 4.1.2 /@jridgewell/gen-mapping/0.1.1: @@ -2820,7 +2822,7 @@ packages: engines: {node: '>= 8'} dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.13.0 + fastq: 1.15.0 /@polka/url/1.0.0-next.21: resolution: {integrity: sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==} @@ -2831,8 +2833,8 @@ packages: dependencies: '@hapi/hoek': 9.3.0 - /@sideway/formula/3.0.0: - resolution: {integrity: sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg==} + /@sideway/formula/3.0.1: + resolution: {integrity: sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==} /@sideway/pinpoint/2.0.0: resolution: {integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==} @@ -2866,107 +2868,101 @@ packages: webpack-sources: 3.2.3 dev: false - /@sodaru/yup-to-json-schema/1.0.5: - resolution: {integrity: sha512-Iy9NJlL5G0jZa4Ox7oiu9Wvf2hnzFCBRsUwr/Q3YZRpXm2KDVBGHjdZx3BE5hGFwe0v9UsismOV0CGr4gEF3IA==} - dependencies: - lodash: 4.17.21 - dev: false - - /@svgr/babel-plugin-add-jsx-attribute/6.5.1_@babel+core@7.20.5: + /@svgr/babel-plugin-add-jsx-attribute/6.5.1_@babel+core@7.20.7: resolution: {integrity: sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ==} engines: {node: '>=10'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.7 dev: false - /@svgr/babel-plugin-remove-jsx-attribute/6.5.0_@babel+core@7.20.5: + /@svgr/babel-plugin-remove-jsx-attribute/6.5.0_@babel+core@7.20.7: resolution: {integrity: sha512-8zYdkym7qNyfXpWvu4yq46k41pyNM9SOstoWhKlm+IfdCE1DdnRKeMUPsWIEO/DEkaWxJ8T9esNdG3QwQ93jBA==} engines: {node: '>=10'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.7 dev: false - /@svgr/babel-plugin-remove-jsx-empty-expression/6.5.0_@babel+core@7.20.5: + /@svgr/babel-plugin-remove-jsx-empty-expression/6.5.0_@babel+core@7.20.7: resolution: {integrity: sha512-NFdxMq3xA42Kb1UbzCVxplUc0iqSyM9X8kopImvFnB+uSDdzIHOdbs1op8ofAvVRtbg4oZiyRl3fTYeKcOe9Iw==} engines: {node: '>=10'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.7 dev: false - /@svgr/babel-plugin-replace-jsx-attribute-value/6.5.1_@babel+core@7.20.5: + /@svgr/babel-plugin-replace-jsx-attribute-value/6.5.1_@babel+core@7.20.7: resolution: {integrity: sha512-8DPaVVE3fd5JKuIC29dqyMB54sA6mfgki2H2+swh+zNJoynC8pMPzOkidqHOSc6Wj032fhl8Z0TVn1GiPpAiJg==} engines: {node: '>=10'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.7 dev: false - /@svgr/babel-plugin-svg-dynamic-title/6.5.1_@babel+core@7.20.5: + /@svgr/babel-plugin-svg-dynamic-title/6.5.1_@babel+core@7.20.7: resolution: {integrity: sha512-FwOEi0Il72iAzlkaHrlemVurgSQRDFbk0OC8dSvD5fSBPHltNh7JtLsxmZUhjYBZo2PpcU/RJvvi6Q0l7O7ogw==} engines: {node: '>=10'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.7 dev: false - /@svgr/babel-plugin-svg-em-dimensions/6.5.1_@babel+core@7.20.5: + /@svgr/babel-plugin-svg-em-dimensions/6.5.1_@babel+core@7.20.7: resolution: {integrity: sha512-gWGsiwjb4tw+ITOJ86ndY/DZZ6cuXMNE/SjcDRg+HLuCmwpcjOktwRF9WgAiycTqJD/QXqL2f8IzE2Rzh7aVXA==} engines: {node: '>=10'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.7 dev: false - /@svgr/babel-plugin-transform-react-native-svg/6.5.1_@babel+core@7.20.5: + /@svgr/babel-plugin-transform-react-native-svg/6.5.1_@babel+core@7.20.7: resolution: {integrity: sha512-2jT3nTayyYP7kI6aGutkyfJ7UMGtuguD72OjeGLwVNyfPRBD8zQthlvL+fAbAKk5n9ZNcvFkp/b1lZ7VsYqVJg==} engines: {node: '>=10'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.7 dev: false - /@svgr/babel-plugin-transform-svg-component/6.5.1_@babel+core@7.20.5: + /@svgr/babel-plugin-transform-svg-component/6.5.1_@babel+core@7.20.7: resolution: {integrity: sha512-a1p6LF5Jt33O3rZoVRBqdxL350oge54iZWHNI6LJB5tQ7EelvD/Mb1mfBiZNAan0dt4i3VArkFRjA4iObuNykQ==} engines: {node: '>=12'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.7 dev: false - /@svgr/babel-preset/6.5.1_@babel+core@7.20.5: + /@svgr/babel-preset/6.5.1_@babel+core@7.20.7: resolution: {integrity: sha512-6127fvO/FF2oi5EzSQOAjo1LE3OtNVh11R+/8FXa+mHx1ptAaS4cknIjnUA7e6j6fwGGJ17NzaTJFUwOV2zwCw==} engines: {node: '>=10'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 - '@svgr/babel-plugin-add-jsx-attribute': 6.5.1_@babel+core@7.20.5 - '@svgr/babel-plugin-remove-jsx-attribute': 6.5.0_@babel+core@7.20.5 - '@svgr/babel-plugin-remove-jsx-empty-expression': 6.5.0_@babel+core@7.20.5 - '@svgr/babel-plugin-replace-jsx-attribute-value': 6.5.1_@babel+core@7.20.5 - '@svgr/babel-plugin-svg-dynamic-title': 6.5.1_@babel+core@7.20.5 - '@svgr/babel-plugin-svg-em-dimensions': 6.5.1_@babel+core@7.20.5 - '@svgr/babel-plugin-transform-react-native-svg': 6.5.1_@babel+core@7.20.5 - '@svgr/babel-plugin-transform-svg-component': 6.5.1_@babel+core@7.20.5 + '@babel/core': 7.20.7 + '@svgr/babel-plugin-add-jsx-attribute': 6.5.1_@babel+core@7.20.7 + '@svgr/babel-plugin-remove-jsx-attribute': 6.5.0_@babel+core@7.20.7 + '@svgr/babel-plugin-remove-jsx-empty-expression': 6.5.0_@babel+core@7.20.7 + '@svgr/babel-plugin-replace-jsx-attribute-value': 6.5.1_@babel+core@7.20.7 + '@svgr/babel-plugin-svg-dynamic-title': 6.5.1_@babel+core@7.20.7 + '@svgr/babel-plugin-svg-em-dimensions': 6.5.1_@babel+core@7.20.7 + '@svgr/babel-plugin-transform-react-native-svg': 6.5.1_@babel+core@7.20.7 + '@svgr/babel-plugin-transform-svg-component': 6.5.1_@babel+core@7.20.7 dev: false /@svgr/core/6.5.1: resolution: {integrity: sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw==} engines: {node: '>=10'} dependencies: - '@babel/core': 7.20.5 - '@svgr/babel-preset': 6.5.1_@babel+core@7.20.5 + '@babel/core': 7.20.7 + '@svgr/babel-preset': 6.5.1_@babel+core@7.20.7 '@svgr/plugin-jsx': 6.5.1_@svgr+core@6.5.1 camelcase: 6.3.0 cosmiconfig: 7.1.0 @@ -2978,7 +2974,7 @@ packages: resolution: {integrity: sha512-1hnUxxjd83EAxbL4a0JDJoD3Dao3hmjvyvyEV8PzWmLK3B9m9NPlW7GKjFyoWE8nM7HnXzPcmmSyOW8yOddSXw==} engines: {node: '>=10'} dependencies: - '@babel/types': 7.20.5 + '@babel/types': 7.20.7 entities: 4.4.0 dev: false @@ -2988,8 +2984,8 @@ packages: peerDependencies: '@svgr/core': ^6.0.0 dependencies: - '@babel/core': 7.20.5 - '@svgr/babel-preset': 6.5.1_@babel+core@7.20.5 + '@babel/core': 7.20.7 + '@svgr/babel-preset': 6.5.1_@babel+core@7.20.7 '@svgr/core': 6.5.1 '@svgr/hast-util-to-babel-ast': 6.5.1 svg-parser: 2.0.4 @@ -3013,11 +3009,11 @@ packages: resolution: {integrity: sha512-cQ/AsnBkXPkEK8cLbv4Dm7JGXq2XrumKnL1dRpJD9rIO2fTIlJI9a1uCciYG1F2aUsox/hJQyNGbt3soDxSRkA==} engines: {node: '>=10'} dependencies: - '@babel/core': 7.20.5 - '@babel/plugin-transform-react-constant-elements': 7.20.2_@babel+core@7.20.5 - '@babel/preset-env': 7.20.2_@babel+core@7.20.5 - '@babel/preset-react': 7.18.6_@babel+core@7.20.5 - '@babel/preset-typescript': 7.18.6_@babel+core@7.20.5 + '@babel/core': 7.20.7 + '@babel/plugin-transform-react-constant-elements': 7.20.2_@babel+core@7.20.7 + '@babel/preset-env': 7.20.2_@babel+core@7.20.7 + '@babel/preset-react': 7.18.6_@babel+core@7.20.7 + '@babel/preset-typescript': 7.18.6_@babel+core@7.20.7 '@svgr/core': 6.5.1 '@svgr/plugin-jsx': 6.5.1_@svgr+core@6.5.1 '@svgr/plugin-svgo': 6.5.1_@svgr+core@6.5.1 @@ -3066,8 +3062,8 @@ packages: /@types/babel__core/7.1.20: resolution: {integrity: sha512-PVb6Bg2QuscZ30FvOU7z4guG6c926D9YRvOxEaelzndpMsvP+YM74Q/dAFASpg2l6+XLalxSGxcq/lrgYWZtyQ==} dependencies: - '@babel/parser': 7.20.5 - '@babel/types': 7.20.5 + '@babel/parser': 7.20.7 + '@babel/types': 7.20.7 '@types/babel__generator': 7.6.4 '@types/babel__template': 7.4.1 '@types/babel__traverse': 7.18.3 @@ -3076,46 +3072,46 @@ packages: /@types/babel__generator/7.6.4: resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==} dependencies: - '@babel/types': 7.20.5 + '@babel/types': 7.20.7 dev: true /@types/babel__template/7.4.1: resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} dependencies: - '@babel/parser': 7.20.5 - '@babel/types': 7.20.5 + '@babel/parser': 7.20.7 + '@babel/types': 7.20.7 dev: true /@types/babel__traverse/7.18.3: resolution: {integrity: sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==} dependencies: - '@babel/types': 7.20.5 + '@babel/types': 7.20.7 dev: true /@types/body-parser/1.19.2: resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} dependencies: '@types/connect': 3.4.35 - '@types/node': 18.11.9 + '@types/node': 18.11.18 dev: false /@types/bonjour/3.5.10: resolution: {integrity: sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==} dependencies: - '@types/node': 18.11.9 + '@types/node': 18.11.18 dev: false /@types/connect-history-api-fallback/1.3.5: resolution: {integrity: sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==} dependencies: - '@types/express-serve-static-core': 4.17.31 - '@types/node': 18.11.9 + '@types/express-serve-static-core': 4.17.32 + '@types/node': 18.11.18 dev: false /@types/connect/3.4.35: resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} dependencies: - '@types/node': 18.11.9 + '@types/node': 18.11.18 dev: false /@types/eslint-scope/3.7.4: @@ -3133,19 +3129,19 @@ packages: /@types/estree/0.0.51: resolution: {integrity: sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==} - /@types/express-serve-static-core/4.17.31: - resolution: {integrity: sha512-DxMhY+NAsTwMMFHBTtJFNp5qiHKJ7TeqOo23zVEM9alT1Ml27Q3xcTH0xwxn7Q0BbMcVEJOs/7aQtUWupUQN3Q==} + /@types/express-serve-static-core/4.17.32: + resolution: {integrity: sha512-aI5h/VOkxOF2Z1saPy0Zsxs5avets/iaiAJYznQFm5By/pamU31xWKL//epiF4OfUA2qTOc9PV6tCUjhO8wlZA==} dependencies: - '@types/node': 18.11.9 + '@types/node': 18.11.18 '@types/qs': 6.9.7 '@types/range-parser': 1.2.4 dev: false - /@types/express/4.17.14: - resolution: {integrity: sha512-TEbt+vaPFQ+xpxFLFssxUDXj5cWCxZJjIcB7Yg0k0GMHGtgtQgpvx/MUQUeAkNbA9AAGrwkAsoeItdTgS7FMyg==} + /@types/express/4.17.15: + resolution: {integrity: sha512-Yv0k4bXGOH+8a+7bELd2PqHQsuiANB+A8a4gnQrkRWzrkKlb6KHaVvyXhqs04sVW/OWlbPyYxRgYlIXLfrufMQ==} dependencies: '@types/body-parser': 1.19.2 - '@types/express-serve-static-core': 4.17.31 + '@types/express-serve-static-core': 4.17.32 '@types/qs': 6.9.7 '@types/serve-static': 1.15.0 dev: false @@ -3153,7 +3149,7 @@ packages: /@types/graceful-fs/4.1.5: resolution: {integrity: sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==} dependencies: - '@types/node': 18.11.9 + '@types/node': 18.11.18 dev: true /@types/hast/2.3.4: @@ -3172,7 +3168,7 @@ packages: /@types/http-proxy/1.17.9: resolution: {integrity: sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw==} dependencies: - '@types/node': 18.11.9 + '@types/node': 18.11.18 dev: false /@types/istanbul-lib-coverage/2.0.4: @@ -3209,23 +3205,23 @@ packages: /@types/keyv/3.1.4: resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} dependencies: - '@types/node': 18.11.9 + '@types/node': 18.11.18 dev: false /@types/lodash.isequalwith/4.4.7: resolution: {integrity: sha512-GdI984QbZw+LGAd3jcFIIhaMwhlVasTMIT3nmE1rOcACjyzp9J9VjTENVkl9aJLOiPZt6RYSJFVEEsRHKbdh3w==} dependencies: - '@types/lodash': 4.14.190 + '@types/lodash': 4.14.191 dev: true /@types/lodash.merge/4.6.7: resolution: {integrity: sha512-OwxUJ9E50gw3LnAefSHJPHaBLGEKmQBQ7CZe/xflHkyy/wH2zVyEIAKReHvVrrn7zKdF58p16We9kMfh7v0RRQ==} dependencies: - '@types/lodash': 4.14.190 + '@types/lodash': 4.14.191 dev: true - /@types/lodash/4.14.190: - resolution: {integrity: sha512-5iJ3FBJBvQHQ8sFhEhJfjUP+G+LalhavTkYyrAYqz5MEJG+erSv0k9KJLb6q7++17Lafk1scaTIFXcMJlwK8Mw==} + /@types/lodash/4.14.191: + resolution: {integrity: sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ==} dev: true /@types/mdast/3.0.10: @@ -3242,8 +3238,12 @@ packages: resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} dev: false + /@types/node/18.11.18: + resolution: {integrity: sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==} + /@types/node/18.11.9: resolution: {integrity: sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==} + dev: true /@types/parse-json/4.0.0: resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==} @@ -3253,8 +3253,8 @@ packages: resolution: {integrity: sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw==} dev: false - /@types/prettier/2.7.1: - resolution: {integrity: sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow==} + /@types/prettier/2.7.2: + resolution: {integrity: sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==} dev: true /@types/prop-types/15.7.5: @@ -3278,21 +3278,21 @@ packages: resolution: {integrity: sha512-db1mx37a1EJDf1XeX8jJN7R3PZABmJQXR8r28yUjVMFSjkmnQo6X6pOEEmNl+Tp2gYQOGPdYbFIipBtdElZ3Yg==} dependencies: '@types/history': 4.7.11 - '@types/react': 18.0.25 - '@types/react-router': 5.1.19 + '@types/react': 18.0.26 + '@types/react-router': 5.1.20 /@types/react-router-dom/5.3.3: resolution: {integrity: sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==} dependencies: '@types/history': 4.7.11 - '@types/react': 18.0.25 - '@types/react-router': 5.1.19 + '@types/react': 18.0.26 + '@types/react-router': 5.1.20 - /@types/react-router/5.1.19: - resolution: {integrity: sha512-Fv/5kb2STAEMT3wHzdKQK2z8xKq38EDIGVrutYLmQVVLe+4orDFquU52hQrULnEHinMKv9FSA6lf9+uNT1ITtA==} + /@types/react-router/5.1.20: + resolution: {integrity: sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==} dependencies: '@types/history': 4.7.11 - '@types/react': 18.0.25 + '@types/react': 18.0.26 /@types/react/18.0.25: resolution: {integrity: sha512-xD6c0KDT4m7n9uD4ZHi02lzskaiqcBxf4zi+tXZY98a04wvc0hi/TcCPC2FOESZi51Nd7tlUeOJY8RofL799/g==} @@ -3300,11 +3300,19 @@ packages: '@types/prop-types': 15.7.5 '@types/scheduler': 0.16.2 csstype: 3.1.1 + dev: true + + /@types/react/18.0.26: + resolution: {integrity: sha512-hCR3PJQsAIXyxhTNSiDFY//LhnMZWpNNr5etoCqx/iUfGc5gXWtQR2Phl908jVR6uPXacojQWTg4qRpkxTuGug==} + dependencies: + '@types/prop-types': 15.7.5 + '@types/scheduler': 0.16.2 + csstype: 3.1.1 /@types/responselike/1.0.0: resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} dependencies: - '@types/node': 18.11.9 + '@types/node': 18.11.18 dev: false /@types/retry/0.12.0: @@ -3314,7 +3322,7 @@ packages: /@types/sax/1.2.4: resolution: {integrity: sha512-pSAff4IAxJjfAXUG6tFkO7dsSbTmf8CtUpfhhZ5VhkRpC4628tJhh3+V6H1E+/Gs9piSzYKT5yzHO5M4GG9jkw==} dependencies: - '@types/node': 18.11.9 + '@types/node': 17.0.45 dev: false /@types/scheduler/0.16.2: @@ -3323,20 +3331,20 @@ packages: /@types/serve-index/1.9.1: resolution: {integrity: sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==} dependencies: - '@types/express': 4.17.14 + '@types/express': 4.17.15 dev: false /@types/serve-static/1.15.0: resolution: {integrity: sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==} dependencies: '@types/mime': 3.0.1 - '@types/node': 18.11.9 + '@types/node': 18.11.18 dev: false /@types/sockjs/0.3.33: resolution: {integrity: sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==} dependencies: - '@types/node': 18.11.9 + '@types/node': 18.11.18 dev: false /@types/stack-utils/2.0.1: @@ -3347,21 +3355,21 @@ packages: resolution: {integrity: sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==} dev: false - /@types/ws/8.5.3: - resolution: {integrity: sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==} + /@types/ws/8.5.4: + resolution: {integrity: sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==} dependencies: - '@types/node': 18.11.9 + '@types/node': 18.11.18 dev: false /@types/yargs-parser/21.0.0: resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==} - /@types/yargs/17.0.15: - resolution: {integrity: sha512-ZHc4W2dnEQPfhn06TBEdWaiUHEZAocYaiVMfwOipY5jcJt/251wVrKCBWBetGZWO5CF8tdb7L3DmdxVlZ2BOIg==} + /@types/yargs/17.0.18: + resolution: {integrity: sha512-eIJR1UER6ur3EpKM3d+2Pgd+ET+k6Kn9B4ZItX0oPjjVI5PrfaRjKyLT5UYendDpLuoiJMNJvovLQbEXqhsPaw==} dependencies: '@types/yargs-parser': 21.0.0 - /@typescript-eslint/eslint-plugin/5.0.0_6smm3ppkqcrhrv2tlnxbs2d6xe: + /@typescript-eslint/eslint-plugin/5.0.0_sk6dheeoswfazfunrkzs65l6ae: resolution: {integrity: sha512-T6V6fCD2U0YesOedvydTnrNtsC8E+c2QzpawIpDdlaObX0OX5dLo7tLU5c64FhTZvA1Xrdim+cXDI7NPsVx8Cg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -3373,12 +3381,12 @@ packages: optional: true dependencies: '@typescript-eslint/experimental-utils': 5.0.0_lwgdip2owqocwo775iybo4kzdi - '@typescript-eslint/parser': 5.45.0_lwgdip2owqocwo775iybo4kzdi + '@typescript-eslint/parser': 5.48.0_lwgdip2owqocwo775iybo4kzdi '@typescript-eslint/scope-manager': 5.0.0 debug: 4.3.4 eslint: 8.0.1 functional-red-black-tree: 1.0.1 - ignore: 5.2.1 + ignore: 5.2.4 regexpp: 3.2.0 semver: 7.3.8 tsutils: 3.21.0_typescript@4.9.3 @@ -3405,8 +3413,8 @@ packages: - typescript dev: true - /@typescript-eslint/parser/5.45.0_lwgdip2owqocwo775iybo4kzdi: - resolution: {integrity: sha512-brvs/WSM4fKUmF5Ot/gEve6qYiCMjm6w4HkHPfS6ZNmxTS0m0iNN4yOChImaCkqc1hRwFGqUyanMXuGal6oyyQ==} + /@typescript-eslint/parser/5.48.0_lwgdip2owqocwo775iybo4kzdi: + resolution: {integrity: sha512-1mxNA8qfgxX8kBvRDIHEzrRGrKHQfQlbW6iHyfHYS0Q4X1af+S6mkLNtgCOsGVl8+/LUPrqdHMssAemkrQ01qg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -3415,9 +3423,9 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 5.45.0 - '@typescript-eslint/types': 5.45.0 - '@typescript-eslint/typescript-estree': 5.45.0_typescript@4.9.3 + '@typescript-eslint/scope-manager': 5.48.0 + '@typescript-eslint/types': 5.48.0 + '@typescript-eslint/typescript-estree': 5.48.0_typescript@4.9.3 debug: 4.3.4 eslint: 8.0.1 typescript: 4.9.3 @@ -3433,12 +3441,12 @@ packages: '@typescript-eslint/visitor-keys': 5.0.0 dev: true - /@typescript-eslint/scope-manager/5.45.0: - resolution: {integrity: sha512-noDMjr87Arp/PuVrtvN3dXiJstQR1+XlQ4R1EvzG+NMgXi8CuMCXpb8JqNtFHKceVSQ985BZhfRdowJzbv4yKw==} + /@typescript-eslint/scope-manager/5.48.0: + resolution: {integrity: sha512-0AA4LviDtVtZqlyUQnZMVHydDATpD9SAX/RC5qh6cBd3xmyWvmXYF+WT1oOmxkeMnWDlUVTwdODeucUnjz3gow==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - '@typescript-eslint/types': 5.45.0 - '@typescript-eslint/visitor-keys': 5.45.0 + '@typescript-eslint/types': 5.48.0 + '@typescript-eslint/visitor-keys': 5.48.0 dev: true /@typescript-eslint/types/5.0.0: @@ -3446,8 +3454,8 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /@typescript-eslint/types/5.45.0: - resolution: {integrity: sha512-QQij+u/vgskA66azc9dCmx+rev79PzX8uDHpsqSjEFtfF2gBUTRCpvYMh2gw2ghkJabNkPlSUCimsyBEQZd1DA==} + /@typescript-eslint/types/5.48.0: + resolution: {integrity: sha512-UTe67B0Ypius0fnEE518NB2N8gGutIlTojeTg4nt0GQvikReVkurqxd2LvYa9q9M5MQ6rtpNyWTBxdscw40Xhw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true @@ -3472,8 +3480,8 @@ packages: - supports-color dev: true - /@typescript-eslint/typescript-estree/5.45.0_typescript@4.9.3: - resolution: {integrity: sha512-maRhLGSzqUpFcZgXxg1qc/+H0bT36lHK4APhp0AEUVrpSwXiRAomm/JGjSG+kNUio5kAa3uekCYu/47cnGn5EQ==} + /@typescript-eslint/typescript-estree/5.48.0_typescript@4.9.3: + resolution: {integrity: sha512-7pjd94vvIjI1zTz6aq/5wwE/YrfIyEPLtGJmRfyNR9NYIW+rOvzzUv3Cmq2hRKpvt6e9vpvPUQ7puzX7VSmsEw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: typescript: '*' @@ -3481,8 +3489,8 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/types': 5.45.0 - '@typescript-eslint/visitor-keys': 5.45.0 + '@typescript-eslint/types': 5.48.0 + '@typescript-eslint/visitor-keys': 5.48.0 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 @@ -3501,11 +3509,11 @@ packages: eslint-visitor-keys: 3.3.0 dev: true - /@typescript-eslint/visitor-keys/5.45.0: - resolution: {integrity: sha512-jc6Eccbn2RtQPr1s7th6jJWQHBHI6GBVQkCHoJFQ5UreaKm59Vxw+ynQUPPY2u2Amquc+7tmEoC2G52ApsGNNg==} + /@typescript-eslint/visitor-keys/5.48.0: + resolution: {integrity: sha512-5motVPz5EgxQ0bHjut3chzBkJ3Z3sheYVcSwS5BpHZpLqSptSmELNtGixmgj65+rIfhvtQTz5i9OP2vtzdDH7Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - '@typescript-eslint/types': 5.45.0 + '@typescript-eslint/types': 5.48.0 eslint-visitor-keys: 3.3.0 dev: true @@ -3637,8 +3645,8 @@ packages: engines: {node: '>=0.4.0'} hasBin: true - /address/1.2.1: - resolution: {integrity: sha512-B+6bi5D34+fDYENiH5qOlA0cV2rAGKuWZ9LeyUUehbXy8e0VS9e498yO0Jeeh+iM+6KbfudHTFjXw2MmJD4QRA==} + /address/1.2.2: + resolution: {integrity: sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==} engines: {node: '>= 10.0.0'} dev: false @@ -3694,32 +3702,32 @@ packages: uri-js: 4.4.1 dev: false - /algoliasearch-helper/3.11.1_algoliasearch@4.14.2: + /algoliasearch-helper/3.11.1_algoliasearch@4.14.3: resolution: {integrity: sha512-mvsPN3eK4E0bZG0/WlWJjeqe/bUD2KOEVOl0GyL/TGXn6wcpZU8NOuztGHCUKXkyg5gq6YzUakVTmnmSSO5Yiw==} peerDependencies: algoliasearch: '>= 3.1 < 6' dependencies: '@algolia/events': 4.0.1 - algoliasearch: 4.14.2 + algoliasearch: 4.14.3 dev: false - /algoliasearch/4.14.2: - resolution: {integrity: sha512-ngbEQonGEmf8dyEh5f+uOIihv4176dgbuOZspiuhmTTBRBuzWu3KCGHre6uHj5YyuC7pNvQGzB6ZNJyZi0z+Sg==} + /algoliasearch/4.14.3: + resolution: {integrity: sha512-GZTEuxzfWbP/vr7ZJfGzIl8fOsoxN916Z6FY2Egc9q2TmZ6hvq5KfAxY89pPW01oW/2HDEKA8d30f9iAH9eXYg==} dependencies: - '@algolia/cache-browser-local-storage': 4.14.2 - '@algolia/cache-common': 4.14.2 - '@algolia/cache-in-memory': 4.14.2 - '@algolia/client-account': 4.14.2 - '@algolia/client-analytics': 4.14.2 - '@algolia/client-common': 4.14.2 - '@algolia/client-personalization': 4.14.2 - '@algolia/client-search': 4.14.2 - '@algolia/logger-common': 4.14.2 - '@algolia/logger-console': 4.14.2 - '@algolia/requester-browser-xhr': 4.14.2 - '@algolia/requester-common': 4.14.2 - '@algolia/requester-node-http': 4.14.2 - '@algolia/transporter': 4.14.2 + '@algolia/cache-browser-local-storage': 4.14.3 + '@algolia/cache-common': 4.14.3 + '@algolia/cache-in-memory': 4.14.3 + '@algolia/client-account': 4.14.3 + '@algolia/client-analytics': 4.14.3 + '@algolia/client-common': 4.14.3 + '@algolia/client-personalization': 4.14.3 + '@algolia/client-search': 4.14.3 + '@algolia/logger-common': 4.14.3 + '@algolia/logger-console': 4.14.3 + '@algolia/requester-browser-xhr': 4.14.3 + '@algolia/requester-common': 4.14.3 + '@algolia/requester-node-http': 4.14.3 + '@algolia/transporter': 4.14.3 dev: false /ansi-align/3.0.1: @@ -3814,7 +3822,7 @@ packages: dependencies: call-bind: 1.0.2 define-properties: 1.1.4 - es-abstract: 1.20.4 + es-abstract: 1.20.5 get-intrinsic: 1.1.3 is-string: 1.0.7 dev: true @@ -3829,7 +3837,7 @@ packages: dependencies: call-bind: 1.0.2 define-properties: 1.1.4 - es-abstract: 1.20.4 + es-abstract: 1.20.5 es-shim-unscopables: 1.0.0 dev: true @@ -3842,7 +3850,7 @@ packages: engines: {node: '>= 4.0.0'} dev: false - /autoprefixer/10.4.13_postcss@8.4.14: + /autoprefixer/10.4.13_postcss@8.4.20: resolution: {integrity: sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==} engines: {node: ^10 || ^12 || >=14} hasBin: true @@ -3850,11 +3858,11 @@ packages: postcss: ^8.1.0 dependencies: browserslist: 4.21.4 - caniuse-lite: 1.0.30001434 + caniuse-lite: 1.0.30001441 fraction.js: 4.2.0 normalize-range: 0.1.2 picocolors: 1.0.0 - postcss: 8.4.14 + postcss: 8.4.20 postcss-value-parser: 4.2.0 dev: false @@ -3866,17 +3874,17 @@ packages: - debug dev: false - /babel-jest/29.3.1_@babel+core@7.20.5: + /babel-jest/29.3.1_@babel+core@7.20.7: resolution: {integrity: sha512-aard+xnMoxgjwV70t0L6wkW/3HQQtV+O0PEimxKgzNqCJnbYmroPojdP2tqKSOAt8QAKV/uSZU8851M7B5+fcA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@babel/core': ^7.8.0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.7 '@jest/transform': 29.3.1 '@types/babel__core': 7.1.20 babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 29.2.0_@babel+core@7.20.5 + babel-preset-jest: 29.2.0_@babel+core@7.20.7 chalk: 4.1.2 graceful-fs: 4.2.10 slash: 3.0.0 @@ -3884,14 +3892,14 @@ packages: - supports-color dev: true - /babel-loader/8.3.0_ztqwsvkb6z73luspkai6ilstpu: + /babel-loader/8.3.0_lkd654lvpl423ugsqn5olungie: resolution: {integrity: sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==} engines: {node: '>= 8.9'} peerDependencies: '@babel/core': ^7.0.0 webpack: '>=2' dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.7 find-cache-dir: 3.3.2 loader-utils: 2.0.4 make-dir: 3.1.0 @@ -3938,77 +3946,77 @@ packages: resolution: {integrity: sha512-TnspP2WNiR3GLfCsUNHqeXw0RoQ2f9U5hQ5L3XFpwuO8htQmSrhh8qsB6vi5Yi8+kuynN1yjDjQsPfkebmB6ZA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/template': 7.18.10 - '@babel/types': 7.20.5 + '@babel/template': 7.20.7 + '@babel/types': 7.20.7 '@types/babel__core': 7.1.20 '@types/babel__traverse': 7.18.3 dev: true - /babel-plugin-polyfill-corejs2/0.3.3_@babel+core@7.20.5: + /babel-plugin-polyfill-corejs2/0.3.3_@babel+core@7.20.7: resolution: {integrity: sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.20.5 - '@babel/core': 7.20.5 - '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.20.5 + '@babel/compat-data': 7.20.10 + '@babel/core': 7.20.7 + '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.20.7 semver: 6.3.0 transitivePeerDependencies: - supports-color dev: false - /babel-plugin-polyfill-corejs3/0.6.0_@babel+core@7.20.5: + /babel-plugin-polyfill-corejs3/0.6.0_@babel+core@7.20.7: resolution: {integrity: sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 - '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.20.5 - core-js-compat: 3.26.1 + '@babel/core': 7.20.7 + '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.20.7 + core-js-compat: 3.27.1 transitivePeerDependencies: - supports-color dev: false - /babel-plugin-polyfill-regenerator/0.4.1_@babel+core@7.20.5: + /babel-plugin-polyfill-regenerator/0.4.1_@babel+core@7.20.7: resolution: {integrity: sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 - '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.20.5 + '@babel/core': 7.20.7 + '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.20.7 transitivePeerDependencies: - supports-color dev: false - /babel-preset-current-node-syntax/1.0.1_@babel+core@7.20.5: + /babel-preset-current-node-syntax/1.0.1_@babel+core@7.20.7: resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.20.5 - '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.20.5 - '@babel/plugin-syntax-bigint': 7.8.3_@babel+core@7.20.5 - '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.20.5 - '@babel/plugin-syntax-import-meta': 7.10.4_@babel+core@7.20.5 - '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.20.5 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.20.5 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.20.5 - '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.20.5 - '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.20.5 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.20.5 - '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.20.5 - '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.20.5 - dev: true - - /babel-preset-jest/29.2.0_@babel+core@7.20.5: + '@babel/core': 7.20.7 + '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.20.7 + '@babel/plugin-syntax-bigint': 7.8.3_@babel+core@7.20.7 + '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.20.7 + '@babel/plugin-syntax-import-meta': 7.10.4_@babel+core@7.20.7 + '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.20.7 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.20.7 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.20.7 + '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.20.7 + '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.20.7 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.20.7 + '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.20.7 + '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.20.7 + dev: true + + /babel-preset-jest/29.2.0_@babel+core@7.20.7: resolution: {integrity: sha512-z9JmMJppMxNv8N7fNRHvhMg9cvIkMxQBXgFkane3yKVEvEOP+kB50lk8DFRvF9PGqbyXxlmebKWhuDORO8RgdA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.7 babel-plugin-jest-hoist: 29.2.0 - babel-preset-current-node-syntax: 1.0.1_@babel+core@7.20.5 + babel-preset-current-node-syntax: 1.0.1_@babel+core@7.20.7 dev: true /bail/1.0.5: @@ -4113,9 +4121,9 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001434 + caniuse-lite: 1.0.30001441 electron-to-chromium: 1.4.284 - node-releases: 2.0.6 + node-releases: 2.0.8 update-browserslist-db: 1.0.10_browserslist@4.21.4 /bs-logger/0.2.6: @@ -4192,13 +4200,13 @@ packages: resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} dependencies: browserslist: 4.21.4 - caniuse-lite: 1.0.30001434 + caniuse-lite: 1.0.30001441 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 dev: false - /caniuse-lite/1.0.30001434: - resolution: {integrity: sha512-aOBHrLmTQw//WFa2rcF1If9fa3ypkC1wzqqiKHgfdrXTWcU8C4gKVZT77eQAPWN1APys3+uQ0Df07rKauXGEYA==} + /caniuse-lite/1.0.30001441: + resolution: {integrity: sha512-OyxRR4Vof59I3yGWXws6i908EtGbMzVUi3ganaZQHmydk1iwDhRnvaPG2WaR0KcqrDFKrxVZHULT396LEPhXfg==} /ccount/1.1.0: resolution: {integrity: sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==} @@ -4283,8 +4291,8 @@ packages: resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} dev: false - /ci-info/3.7.0: - resolution: {integrity: sha512-2CpRNYmImPx+RXKLq6jko/L07phmS9I02TyqkcNU20GCF/GgaWvc58hPtjxDX8lPpkdwc9sNh72V9k00S7ezog==} + /ci-info/3.7.1: + resolution: {integrity: sha512-4jYS4MOAaCIStSRwiuxc4B8MYhIe676yO1sYGzARnjXkWpmzZMMYxY6zu8WYWDhSuth5zhrQ1rhNSibyyvv4/w==} engines: {node: '>=8'} /cjs-module-lexer/1.2.2: @@ -4520,19 +4528,19 @@ packages: webpack: 5.75.0 dev: false - /core-js-compat/3.26.1: - resolution: {integrity: sha512-622/KzTudvXCDLRw70iHW4KKs1aGpcRcowGWyYJr2DEBfRrd6hNJybxSWJFuZYD4ma86xhrwDDHxmDaIq4EA8A==} + /core-js-compat/3.27.1: + resolution: {integrity: sha512-Dg91JFeCDA17FKnneN7oCMz4BkQ4TcffkgHP4OWwp9yx3pi7ubqMDXXSacfNak1PQqjc95skyt+YBLHQJnkJwA==} dependencies: browserslist: 4.21.4 dev: false - /core-js-pure/3.26.1: - resolution: {integrity: sha512-VVXcDpp/xJ21KdULRq/lXdLzQAtX7+37LzpyfFM973il0tWSsDEoyzG38G14AjTpK9VTfiNM9jnFauq/CpaWGQ==} + /core-js-pure/3.27.1: + resolution: {integrity: sha512-BS2NHgwwUppfeoqOXqi08mUqS5FiZpuRuJJpKsaME7kJz0xxuk0xkhDdfMIlP/zLa80krBqss1LtD7f889heAw==} requiresBuild: true dev: false - /core-js/3.26.1: - resolution: {integrity: sha512-21491RRQVzUn0GGM9Z1Jrpr6PNPxPi+Za8OM9q4tksTSnlbXXGKK1nXNg/QvwFYettXvSX6zWKCtHHfjN4puyA==} + /core-js/3.27.1: + resolution: {integrity: sha512-GutwJLBChfGCpwwhbYoqfv03LAfmiz7e7D/BNxzeMxwQf10GRSzqiOjx7AmtEk+heiD/JWmBuyBPgFtx0Sg1ww==} requiresBuild: true dev: false @@ -4587,15 +4595,6 @@ packages: engines: {node: '>=8'} dev: false - /css-declaration-sorter/6.3.1_postcss@8.4.14: - resolution: {integrity: sha512-fBffmak0bPAnyqc/HO8C3n2sHrp9wcqQz6ES9koRF2/mLOVAx9zIQ3Y7R29sYCteTPqMCwns4WYQoCX91Xl3+w==} - engines: {node: ^10 || ^12 || >=14} - peerDependencies: - postcss: ^8.0.9 - dependencies: - postcss: 8.4.14 - dev: false - /css-declaration-sorter/6.3.1_postcss@8.4.20: resolution: {integrity: sha512-fBffmak0bPAnyqc/HO8C3n2sHrp9wcqQz6ES9koRF2/mLOVAx9zIQ3Y7R29sYCteTPqMCwns4WYQoCX91Xl3+w==} engines: {node: ^10 || ^12 || >=14} @@ -4605,8 +4604,8 @@ packages: postcss: 8.4.20 dev: false - /css-loader/6.7.2_webpack@5.75.0: - resolution: {integrity: sha512-oqGbbVcBJkm8QwmnNzrFrWTnudnRZC+1eXikLJl0n4ljcfotgRifpg2a1lKy8jTrc4/d9A/ap1GFq1jDKG7J+Q==} + /css-loader/6.7.3_webpack@5.75.0: + resolution: {integrity: sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ==} engines: {node: '>= 12.13.0'} peerDependencies: webpack: ^5.0.0 @@ -4696,57 +4695,19 @@ packages: hasBin: true dev: false - /cssnano-preset-advanced/5.3.9_postcss@8.4.14: + /cssnano-preset-advanced/5.3.9_postcss@8.4.20: resolution: {integrity: sha512-njnh4pp1xCsibJcEHnWZb4EEzni0ePMqPuPNyuWT4Z+YeXmsgqNuTPIljXFEXhxGsWs9183JkXgHxc1TcsahIg==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - autoprefixer: 10.4.13_postcss@8.4.14 - cssnano-preset-default: 5.2.13_postcss@8.4.14 - postcss: 8.4.14 - postcss-discard-unused: 5.1.0_postcss@8.4.14 - postcss-merge-idents: 5.1.1_postcss@8.4.14 - postcss-reduce-idents: 5.2.0_postcss@8.4.14 - postcss-zindex: 5.1.0_postcss@8.4.14 - dev: false - - /cssnano-preset-default/5.2.13_postcss@8.4.14: - resolution: {integrity: sha512-PX7sQ4Pb+UtOWuz8A1d+Rbi+WimBIxJTRyBdgGp1J75VU0r/HFQeLnMYgHiCAp6AR4rqrc7Y4R+1Rjk3KJz6DQ==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - css-declaration-sorter: 6.3.1_postcss@8.4.14 - cssnano-utils: 3.1.0_postcss@8.4.14 - postcss: 8.4.14 - postcss-calc: 8.2.4_postcss@8.4.14 - postcss-colormin: 5.3.0_postcss@8.4.14 - postcss-convert-values: 5.1.3_postcss@8.4.14 - postcss-discard-comments: 5.1.2_postcss@8.4.14 - postcss-discard-duplicates: 5.1.0_postcss@8.4.14 - postcss-discard-empty: 5.1.1_postcss@8.4.14 - postcss-discard-overridden: 5.1.0_postcss@8.4.14 - postcss-merge-longhand: 5.1.7_postcss@8.4.14 - postcss-merge-rules: 5.1.3_postcss@8.4.14 - postcss-minify-font-values: 5.1.0_postcss@8.4.14 - postcss-minify-gradients: 5.1.1_postcss@8.4.14 - postcss-minify-params: 5.1.4_postcss@8.4.14 - postcss-minify-selectors: 5.2.1_postcss@8.4.14 - postcss-normalize-charset: 5.1.0_postcss@8.4.14 - postcss-normalize-display-values: 5.1.0_postcss@8.4.14 - postcss-normalize-positions: 5.1.1_postcss@8.4.14 - postcss-normalize-repeat-style: 5.1.1_postcss@8.4.14 - postcss-normalize-string: 5.1.0_postcss@8.4.14 - postcss-normalize-timing-functions: 5.1.0_postcss@8.4.14 - postcss-normalize-unicode: 5.1.1_postcss@8.4.14 - postcss-normalize-url: 5.1.0_postcss@8.4.14 - postcss-normalize-whitespace: 5.1.1_postcss@8.4.14 - postcss-ordered-values: 5.1.3_postcss@8.4.14 - postcss-reduce-initial: 5.1.1_postcss@8.4.14 - postcss-reduce-transforms: 5.1.0_postcss@8.4.14 - postcss-svgo: 5.1.0_postcss@8.4.14 - postcss-unique-selectors: 5.1.1_postcss@8.4.14 + autoprefixer: 10.4.13_postcss@8.4.20 + cssnano-preset-default: 5.2.13_postcss@8.4.20 + postcss: 8.4.20 + postcss-discard-unused: 5.1.0_postcss@8.4.20 + postcss-merge-idents: 5.1.1_postcss@8.4.20 + postcss-reduce-idents: 5.2.0_postcss@8.4.20 + postcss-zindex: 5.1.0_postcss@8.4.20 dev: false /cssnano-preset-default/5.2.13_postcss@8.4.20: @@ -4787,15 +4748,6 @@ packages: postcss-unique-selectors: 5.1.1_postcss@8.4.20 dev: false - /cssnano-utils/3.1.0_postcss@8.4.14: - resolution: {integrity: sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - postcss: 8.4.14 - dev: false - /cssnano-utils/3.1.0_postcss@8.4.20: resolution: {integrity: sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==} engines: {node: ^10 || ^12 || >=14.0} @@ -4805,18 +4757,6 @@ packages: postcss: 8.4.20 dev: false - /cssnano/5.1.14_postcss@8.4.14: - resolution: {integrity: sha512-Oou7ihiTocbKqi0J1bB+TRJIQX5RMR3JghA8hcWSw9mjBLQ5Y3RWqEDoYG3sRNlAbCIXpqMoZGbq5KDR3vdzgw==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - cssnano-preset-default: 5.2.13_postcss@8.4.14 - lilconfig: 2.0.6 - postcss: 8.4.14 - yaml: 1.10.2 - dev: false - /cssnano/5.1.14_postcss@8.4.20: resolution: {integrity: sha512-Oou7ihiTocbKqi0J1bB+TRJIQX5RMR3JghA8hcWSw9mjBLQ5Y3RWqEDoYG3sRNlAbCIXpqMoZGbq5KDR3vdzgw==} engines: {node: ^10 || ^12 || >=14.0} @@ -4966,7 +4906,7 @@ packages: engines: {node: '>= 4.2.1'} hasBin: true dependencies: - address: 1.2.1 + address: 1.2.2 debug: 2.6.9 transitivePeerDependencies: - supports-color @@ -4976,7 +4916,7 @@ packages: resolution: {integrity: sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==} hasBin: true dependencies: - address: 1.2.1 + address: 1.2.2 debug: 4.3.4 transitivePeerDependencies: - supports-color @@ -5172,8 +5112,8 @@ packages: dependencies: is-arrayish: 0.2.1 - /es-abstract/1.20.4: - resolution: {integrity: sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==} + /es-abstract/1.20.5: + resolution: {integrity: sha512-7h8MM2EQhsCA7pU/Nv78qOXFpD8Rhqd12gYiSJVkrH9+e8VuA8JlPJK/hQjjlLv6pJvx/z1iRFKzYb0XT/RuAQ==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 @@ -5182,10 +5122,11 @@ packages: function.prototype.name: 1.1.5 get-intrinsic: 1.1.3 get-symbol-description: 1.0.0 + gopd: 1.0.1 has: 1.0.3 has-property-descriptors: 1.0.0 has-symbols: 1.0.3 - internal-slot: 1.0.3 + internal-slot: 1.0.4 is-callable: 1.2.7 is-negative-zero: 2.0.2 is-regex: 1.1.4 @@ -5265,11 +5206,11 @@ packages: eslint-plugin-promise: ^6.0.0 typescript: '*' dependencies: - '@typescript-eslint/eslint-plugin': 5.0.0_6smm3ppkqcrhrv2tlnxbs2d6xe - '@typescript-eslint/parser': 5.45.0_lwgdip2owqocwo775iybo4kzdi + '@typescript-eslint/eslint-plugin': 5.0.0_sk6dheeoswfazfunrkzs65l6ae + '@typescript-eslint/parser': 5.48.0_lwgdip2owqocwo775iybo4kzdi eslint: 8.0.1 eslint-config-standard: 17.0.0_e6qfl5pmxsyfuxbbac4tyvigc4 - eslint-plugin-import: 2.25.2_nrmdsx6ad244zymq7ioo53a7zy + eslint-plugin-import: 2.25.2_uhrjhsy2b3ck2b4sjj2nhiqd4m eslint-plugin-n: 15.0.0_eslint@8.0.1 eslint-plugin-promise: 6.0.0_eslint@8.0.1 typescript: 4.9.3 @@ -5286,7 +5227,7 @@ packages: eslint-plugin-promise: ^6.0.0 dependencies: eslint: 8.0.1 - eslint-plugin-import: 2.25.2_nrmdsx6ad244zymq7ioo53a7zy + eslint-plugin-import: 2.25.2_uhrjhsy2b3ck2b4sjj2nhiqd4m eslint-plugin-n: 15.0.0_eslint@8.0.1 eslint-plugin-promise: 6.0.0_eslint@8.0.1 dev: true @@ -5300,7 +5241,7 @@ packages: - supports-color dev: true - /eslint-module-utils/2.7.4_ojjywdimqnmz53a7r5tx57ph3m: + /eslint-module-utils/2.7.4_b24m3ygepczo6ykudd2uueii74: resolution: {integrity: sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==} engines: {node: '>=4'} peerDependencies: @@ -5321,7 +5262,7 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 5.45.0_lwgdip2owqocwo775iybo4kzdi + '@typescript-eslint/parser': 5.48.0_lwgdip2owqocwo775iybo4kzdi debug: 3.2.7 eslint: 8.0.1 eslint-import-resolver-node: 0.3.6 @@ -5340,7 +5281,7 @@ packages: regexpp: 3.2.0 dev: true - /eslint-plugin-import/2.25.2_nrmdsx6ad244zymq7ioo53a7zy: + /eslint-plugin-import/2.25.2_uhrjhsy2b3ck2b4sjj2nhiqd4m: resolution: {integrity: sha512-qCwQr9TYfoBHOFcVGKY9C9unq05uOxxdklmBXLVvcwo68y5Hta6/GzCZEMx2zQiu0woKNEER0LE7ZgaOfBU14g==} engines: {node: '>=4'} peerDependencies: @@ -5350,14 +5291,14 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 5.45.0_lwgdip2owqocwo775iybo4kzdi + '@typescript-eslint/parser': 5.48.0_lwgdip2owqocwo775iybo4kzdi array-includes: 3.1.6 array.prototype.flat: 1.3.1 debug: 2.6.9 doctrine: 2.1.0 eslint: 8.0.1 eslint-import-resolver-node: 0.3.6 - eslint-module-utils: 2.7.4_ojjywdimqnmz53a7r5tx57ph3m + eslint-module-utils: 2.7.4_b24m3ygepczo6ykudd2uueii74 has: 1.0.3 is-core-module: 2.11.0 is-glob: 4.0.3 @@ -5380,7 +5321,7 @@ packages: eslint: 8.0.1 eslint-plugin-es: 4.1.0_eslint@8.0.1 eslint-utils: 3.0.0_eslint@8.0.1 - ignore: 5.2.1 + ignore: 5.2.4 is-core-module: 2.11.0 minimatch: 3.1.2 resolve: 1.22.1 @@ -5448,7 +5389,7 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true dependencies: - '@eslint/eslintrc': 1.3.3 + '@eslint/eslintrc': 1.4.1 '@humanwhocodes/config-array': 0.6.0 ajv: 6.12.6 chalk: 4.1.2 @@ -5467,7 +5408,7 @@ packages: file-entry-cache: 6.0.1 functional-red-black-tree: 1.0.1 glob-parent: 6.0.2 - globals: 13.18.0 + globals: 13.19.0 ignore: 4.0.6 import-fresh: 3.3.0 imurmurhash: 0.1.4 @@ -5543,7 +5484,7 @@ packages: resolution: {integrity: sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==} engines: {node: '>= 0.8'} dependencies: - '@types/node': 18.11.9 + '@types/node': 18.11.18 require-like: 0.1.2 dev: false @@ -5661,8 +5602,8 @@ packages: punycode: 1.4.1 dev: false - /fastq/1.13.0: - resolution: {integrity: sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==} + /fastq/1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} dependencies: reusify: 1.0.4 @@ -5821,7 +5762,7 @@ packages: optional: true dev: false - /fork-ts-checker-webpack-plugin/6.5.2_vfotqvx6lgcbf3upbs6hgaza4q: + /fork-ts-checker-webpack-plugin/6.5.2_3fkjkrd3audxnith3e7fo4fnxi: resolution: {integrity: sha512-m5cUmF30xkZ7h4tWUgTAcEaKmUW7tfyUyTqNNOz7OxWJ0v1VWKTcOvH8FWHUwSjlW/356Ijc9vi3XfcPstpQKA==} engines: {node: '>=10', yarn: '>=1.0.0'} peerDependencies: @@ -5848,7 +5789,7 @@ packages: schema-utils: 2.7.0 semver: 7.3.8 tapable: 1.1.3 - typescript: 4.9.3 + typescript: 4.9.4 webpack: 5.75.0 dev: false @@ -5907,7 +5848,7 @@ packages: dependencies: call-bind: 1.0.2 define-properties: 1.1.4 - es-abstract: 1.20.4 + es-abstract: 1.20.5 functions-have-names: 1.2.3 dev: true @@ -6026,8 +5967,8 @@ packages: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} - /globals/13.18.0: - resolution: {integrity: sha512-/mR4KI8Ps2spmoc0Ulu9L7agOF0du1CZNQ3dke8yItYlyKNmGrkONemBbd6V8UTc1Wgcqn21t3WYB7dbRmh6/A==} + /globals/13.19.0: + resolution: {integrity: sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==} engines: {node: '>=8'} dependencies: type-fest: 0.20.2 @@ -6040,7 +5981,7 @@ packages: array-union: 2.1.0 dir-glob: 3.0.1 fast-glob: 3.2.12 - ignore: 5.2.1 + ignore: 5.2.4 merge2: 1.4.1 slash: 3.0.0 @@ -6050,11 +5991,17 @@ packages: dependencies: dir-glob: 3.0.1 fast-glob: 3.2.12 - ignore: 5.2.1 + ignore: 5.2.4 merge2: 1.4.1 slash: 4.0.0 dev: false + /gopd/1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + dependencies: + get-intrinsic: 1.1.3 + dev: true + /got/9.6.0: resolution: {integrity: sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==} engines: {node: '>=8.6'} @@ -6207,7 +6154,7 @@ packages: /history/4.10.1: resolution: {integrity: sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==} dependencies: - '@babel/runtime': 7.20.6 + '@babel/runtime': 7.20.7 loose-envify: 1.4.0 resolve-pathname: 3.0.0 tiny-invariant: 1.3.1 @@ -6326,7 +6273,7 @@ packages: resolution: {integrity: sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==} dev: false - /http-proxy-middleware/2.0.6_@types+express@4.17.14: + /http-proxy-middleware/2.0.6_@types+express@4.17.15: resolution: {integrity: sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==} engines: {node: '>=12.0.0'} peerDependencies: @@ -6335,7 +6282,7 @@ packages: '@types/express': optional: true dependencies: - '@types/express': 4.17.14 + '@types/express': 4.17.15 '@types/http-proxy': 1.17.9 http-proxy: 1.18.1 is-glob: 4.0.3 @@ -6381,8 +6328,8 @@ packages: engines: {node: '>= 4'} dev: true - /ignore/5.2.1: - resolution: {integrity: sha512-d2qQLzTJ9WxQftPAuEQpSPmKqzxePjzVbpAVv62AQ64NTL+wR4JkrVqR/LqFsFEUsHDAiId52mJteHDFuDkElA==} + /ignore/5.2.4: + resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} engines: {node: '>= 4'} /image-size/1.0.2: @@ -6393,8 +6340,8 @@ packages: queue: 6.0.2 dev: false - /immer/9.0.16: - resolution: {integrity: sha512-qenGE7CstVm1NrHQbMh8YaSzTZTFNP3zPqr3YU0S0UY441j4bJTg4A2Hh5KAhwgaiU6ZZ1Ar6y/2f4TblnMReQ==} + /immer/9.0.17: + resolution: {integrity: sha512-+hBruaLSQvkPfxRiTLK/mi4vLH+/VQS6z2KJahdoxlleFOI8ARqzOF17uy12eFDlqWmPoygwc5evgwcp+dlHhg==} dev: false /import-fresh/3.3.0: @@ -6458,8 +6405,8 @@ packages: resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} dev: false - /internal-slot/1.0.3: - resolution: {integrity: sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==} + /internal-slot/1.0.4: + resolution: {integrity: sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ==} engines: {node: '>= 0.4'} dependencies: get-intrinsic: 1.1.3 @@ -6749,8 +6696,8 @@ packages: resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} engines: {node: '>=8'} dependencies: - '@babel/core': 7.20.5 - '@babel/parser': 7.20.5 + '@babel/core': 7.20.7 + '@babel/parser': 7.20.7 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.0 semver: 6.3.0 @@ -6802,7 +6749,7 @@ packages: '@jest/expect': 29.3.1 '@jest/test-result': 29.3.1 '@jest/types': 29.3.1 - '@types/node': 18.11.9 + '@types/node': 18.11.18 chalk: 4.1.2 co: 4.6.0 dedent: 0.7.0 @@ -6821,7 +6768,7 @@ packages: - supports-color dev: true - /jest-cli/29.3.1_odkjkoia5xunhxkdrka32ib6vi: + /jest-cli/29.3.1_zfha7dvnw4nti6zkbsmhmn6xo4: resolution: {integrity: sha512-TO/ewvwyvPOiBBuWZ0gm04z3WWP8TIK8acgPzE4IxgsLKQgb377NYGrQLc3Wl/7ndWzIH2CDNNsUjGxwLL43VQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -6838,7 +6785,7 @@ packages: exit: 0.1.2 graceful-fs: 4.2.10 import-local: 3.1.0 - jest-config: 29.3.1_odkjkoia5xunhxkdrka32ib6vi + jest-config: 29.3.1_zfha7dvnw4nti6zkbsmhmn6xo4 jest-util: 29.3.1 jest-validate: 29.3.1 prompts: 2.4.2 @@ -6849,7 +6796,7 @@ packages: - ts-node dev: true - /jest-config/29.3.1_odkjkoia5xunhxkdrka32ib6vi: + /jest-config/29.3.1_zfha7dvnw4nti6zkbsmhmn6xo4: resolution: {integrity: sha512-y0tFHdj2WnTEhxmGUK1T7fgLen7YK4RtfvpLFBXfQkh2eMJAQq24Vx9472lvn5wg0MAO6B+iPfJfzdR9hJYalg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -6861,13 +6808,13 @@ packages: ts-node: optional: true dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.7 '@jest/test-sequencer': 29.3.1 '@jest/types': 29.3.1 - '@types/node': 18.11.9 - babel-jest: 29.3.1_@babel+core@7.20.5 + '@types/node': 18.11.18 + babel-jest: 29.3.1_@babel+core@7.20.7 chalk: 4.1.2 - ci-info: 3.7.0 + ci-info: 3.7.1 deepmerge: 4.2.2 glob: 7.2.3 graceful-fs: 4.2.10 @@ -6884,7 +6831,7 @@ packages: pretty-format: 29.3.1 slash: 3.0.0 strip-json-comments: 3.1.1 - ts-node: 10.9.1_wup25etrarvlqkprac7h35hj7u + ts-node: 10.9.1_awa2wsr5thmg3i7jqycphctjfq transitivePeerDependencies: - supports-color dev: true @@ -6924,7 +6871,7 @@ packages: '@jest/environment': 29.3.1 '@jest/fake-timers': 29.3.1 '@jest/types': 29.3.1 - '@types/node': 18.11.9 + '@types/node': 18.11.18 jest-mock: 29.3.1 jest-util: 29.3.1 dev: true @@ -6940,7 +6887,7 @@ packages: dependencies: '@jest/types': 29.3.1 '@types/graceful-fs': 4.1.5 - '@types/node': 18.11.9 + '@types/node': 18.11.18 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.10 @@ -6991,7 +6938,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.3.1 - '@types/node': 18.11.9 + '@types/node': 18.11.18 jest-util: 29.3.1 dev: true @@ -7046,7 +6993,7 @@ packages: '@jest/test-result': 29.3.1 '@jest/transform': 29.3.1 '@jest/types': 29.3.1 - '@types/node': 18.11.9 + '@types/node': 18.11.18 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.10 @@ -7077,7 +7024,7 @@ packages: '@jest/test-result': 29.3.1 '@jest/transform': 29.3.1 '@jest/types': 29.3.1 - '@types/node': 18.11.9 + '@types/node': 18.11.18 chalk: 4.1.2 cjs-module-lexer: 1.2.2 collect-v8-coverage: 1.0.1 @@ -7100,18 +7047,18 @@ packages: resolution: {integrity: sha512-+3JOc+s28upYLI2OJM4PWRGK9AgpsMs/ekNryUV0yMBClT9B1DF2u2qay8YxcQd338PPYSFNb0lsar1B49sLDA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/core': 7.20.5 - '@babel/generator': 7.20.5 - '@babel/plugin-syntax-jsx': 7.18.6_@babel+core@7.20.5 - '@babel/plugin-syntax-typescript': 7.20.0_@babel+core@7.20.5 - '@babel/traverse': 7.20.5 - '@babel/types': 7.20.5 + '@babel/core': 7.20.7 + '@babel/generator': 7.20.7 + '@babel/plugin-syntax-jsx': 7.18.6_@babel+core@7.20.7 + '@babel/plugin-syntax-typescript': 7.20.0_@babel+core@7.20.7 + '@babel/traverse': 7.20.10 + '@babel/types': 7.20.7 '@jest/expect-utils': 29.3.1 '@jest/transform': 29.3.1 '@jest/types': 29.3.1 '@types/babel__traverse': 7.18.3 - '@types/prettier': 2.7.1 - babel-preset-current-node-syntax: 1.0.1_@babel+core@7.20.5 + '@types/prettier': 2.7.2 + babel-preset-current-node-syntax: 1.0.1_@babel+core@7.20.7 chalk: 4.1.2 expect: 29.3.1 graceful-fs: 4.2.10 @@ -7133,9 +7080,9 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.3.1 - '@types/node': 18.11.9 + '@types/node': 18.11.18 chalk: 4.1.2 - ci-info: 3.7.0 + ci-info: 3.7.1 graceful-fs: 4.2.10 picomatch: 2.3.1 @@ -7157,7 +7104,7 @@ packages: dependencies: '@jest/test-result': 29.3.1 '@jest/types': 29.3.1 - '@types/node': 18.11.9 + '@types/node': 18.11.18 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -7169,7 +7116,7 @@ packages: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 18.11.9 + '@types/node': 18.11.18 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -7177,12 +7124,12 @@ packages: resolution: {integrity: sha512-lY4AnnmsEWeiXirAIA0c9SDPbuCBq8IYuDVL8PMm0MZ2PEs2yPvRA/J64QBXuZp7CYKrDM/rmNrc9/i3KJQncw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@types/node': 18.11.9 + '@types/node': 18.11.18 jest-util: 29.3.1 merge-stream: 2.0.0 supports-color: 8.1.1 - /jest/29.3.1_odkjkoia5xunhxkdrka32ib6vi: + /jest/29.3.1_zfha7dvnw4nti6zkbsmhmn6xo4: resolution: {integrity: sha512-6iWfL5DTT0Np6UYs/y5Niu7WIfNv/wRTtN5RSXt2DIEft3dx3zPuw/3WJQBCJfmEzvDiEKwoqMbGD9n49+qLSA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -7195,7 +7142,7 @@ packages: '@jest/core': 29.3.1_ts-node@10.9.1 '@jest/types': 29.3.1 import-local: 3.1.0 - jest-cli: 29.3.1_odkjkoia5xunhxkdrka32ib6vi + jest-cli: 29.3.1_zfha7dvnw4nti6zkbsmhmn6xo4 transitivePeerDependencies: - '@types/node' - supports-color @@ -7208,7 +7155,7 @@ packages: '@hapi/hoek': 9.3.0 '@hapi/topo': 5.1.0 '@sideway/address': 4.1.4 - '@sideway/formula': 3.0.0 + '@sideway/formula': 3.0.1 '@sideway/pinpoint': 2.0.0 /js-tokens/4.0.0: @@ -7255,22 +7202,15 @@ packages: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} dev: true - /json-to-zod/1.1.2: - resolution: {integrity: sha512-6YDvnY8oOS5v1H1CWUvfNJkCI3SGbmCwWMytndPHzwyrr1K9ayNXL4rvOSf7WCy3c3Pxu2brvt4idZCkKh9gfQ==} - hasBin: true - dependencies: - prettier: 2.8.0 - dev: false - - /json5/1.0.1: - resolution: {integrity: sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==} + /json5/1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} hasBin: true dependencies: minimist: 1.2.7 dev: true - /json5/2.2.1: - resolution: {integrity: sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==} + /json5/2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} hasBin: true @@ -7338,7 +7278,7 @@ packages: dependencies: big.js: 5.2.2 emojis-list: 3.0.0 - json5: 2.2.1 + json5: 2.2.3 dev: false /loader-utils/3.2.1: @@ -7422,6 +7362,11 @@ packages: engines: {node: '>=8'} dev: false + /lru-cache/5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + dependencies: + yallist: 3.1.1 + /lru-cache/6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} @@ -7637,7 +7582,7 @@ packages: dependencies: '@next/env': 13.0.2 '@swc/helpers': 0.4.11 - caniuse-lite: 1.0.30001434 + caniuse-lite: 1.0.30001441 postcss: 8.4.14 react: 18.2.0 react-dom: 18.2.0_react@18.2.0 @@ -7712,8 +7657,8 @@ packages: type-is: 1.6.18 dev: true - /node-releases/2.0.6: - resolution: {integrity: sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==} + /node-releases/2.0.8: + resolution: {integrity: sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A==} /normalize-path/3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} @@ -7776,7 +7721,7 @@ packages: dependencies: call-bind: 1.0.2 define-properties: 1.1.4 - es-abstract: 1.20.4 + es-abstract: 1.20.5 dev: true /obuf/1.1.2: @@ -8034,16 +7979,6 @@ packages: find-up: 3.0.0 dev: false - /postcss-calc/8.2.4_postcss@8.4.14: - resolution: {integrity: sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==} - peerDependencies: - postcss: ^8.2.2 - dependencies: - postcss: 8.4.14 - postcss-selector-parser: 6.0.11 - postcss-value-parser: 4.2.0 - dev: false - /postcss-calc/8.2.4_postcss@8.4.20: resolution: {integrity: sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==} peerDependencies: @@ -8054,19 +7989,6 @@ packages: postcss-value-parser: 4.2.0 dev: false - /postcss-colormin/5.3.0_postcss@8.4.14: - resolution: {integrity: sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - browserslist: 4.21.4 - caniuse-api: 3.0.0 - colord: 2.9.3 - postcss: 8.4.14 - postcss-value-parser: 4.2.0 - dev: false - /postcss-colormin/5.3.0_postcss@8.4.20: resolution: {integrity: sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg==} engines: {node: ^10 || ^12 || >=14.0} @@ -8080,17 +8002,6 @@ packages: postcss-value-parser: 4.2.0 dev: false - /postcss-convert-values/5.1.3_postcss@8.4.14: - resolution: {integrity: sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - browserslist: 4.21.4 - postcss: 8.4.14 - postcss-value-parser: 4.2.0 - dev: false - /postcss-convert-values/5.1.3_postcss@8.4.20: resolution: {integrity: sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==} engines: {node: ^10 || ^12 || >=14.0} @@ -8102,15 +8013,6 @@ packages: postcss-value-parser: 4.2.0 dev: false - /postcss-discard-comments/5.1.2_postcss@8.4.14: - resolution: {integrity: sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - postcss: 8.4.14 - dev: false - /postcss-discard-comments/5.1.2_postcss@8.4.20: resolution: {integrity: sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==} engines: {node: ^10 || ^12 || >=14.0} @@ -8120,15 +8022,6 @@ packages: postcss: 8.4.20 dev: false - /postcss-discard-duplicates/5.1.0_postcss@8.4.14: - resolution: {integrity: sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - postcss: 8.4.14 - dev: false - /postcss-discard-duplicates/5.1.0_postcss@8.4.20: resolution: {integrity: sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==} engines: {node: ^10 || ^12 || >=14.0} @@ -8138,15 +8031,6 @@ packages: postcss: 8.4.20 dev: false - /postcss-discard-empty/5.1.1_postcss@8.4.14: - resolution: {integrity: sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - postcss: 8.4.14 - dev: false - /postcss-discard-empty/5.1.1_postcss@8.4.20: resolution: {integrity: sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==} engines: {node: ^10 || ^12 || >=14.0} @@ -8156,15 +8040,6 @@ packages: postcss: 8.4.20 dev: false - /postcss-discard-overridden/5.1.0_postcss@8.4.14: - resolution: {integrity: sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - postcss: 8.4.14 - dev: false - /postcss-discard-overridden/5.1.0_postcss@8.4.20: resolution: {integrity: sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==} engines: {node: ^10 || ^12 || >=14.0} @@ -8174,17 +8049,17 @@ packages: postcss: 8.4.20 dev: false - /postcss-discard-unused/5.1.0_postcss@8.4.14: + /postcss-discard-unused/5.1.0_postcss@8.4.20: resolution: {integrity: sha512-KwLWymI9hbwXmJa0dkrzpRbSJEh0vVUd7r8t0yOGPcfKzyJJxFM8kLyC5Ev9avji6nY95pOp1W6HqIrfT+0VGw==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.14 + postcss: 8.4.20 postcss-selector-parser: 6.0.11 dev: false - /postcss-loader/7.0.2_yr6womevqv5t3aet2t3y7pv3ua: + /postcss-loader/7.0.2_qxxfhhrl3yknjjmta266mo3u64: resolution: {integrity: sha512-fUJzV/QH7NXUAqV8dWJ9Lg4aTkDCezpTS5HgJ2DvqznexTbSTxgi/dTECvTZ15BwKTtk8G/bqI/QTu2HPd3ZCg==} engines: {node: '>= 14.15.0'} peerDependencies: @@ -8193,31 +8068,20 @@ packages: dependencies: cosmiconfig: 7.1.0 klona: 2.0.5 - postcss: 8.4.14 + postcss: 8.4.20 semver: 7.3.8 webpack: 5.75.0 dev: false - /postcss-merge-idents/5.1.1_postcss@8.4.14: + /postcss-merge-idents/5.1.1_postcss@8.4.20: resolution: {integrity: sha512-pCijL1TREiCoog5nQp7wUe+TUonA2tC2sQ54UGeMmryK3UFGIYKqDyjnqd6RcuI4znFn9hWSLNN8xKE/vWcUQw==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - cssnano-utils: 3.1.0_postcss@8.4.14 - postcss: 8.4.14 - postcss-value-parser: 4.2.0 - dev: false - - /postcss-merge-longhand/5.1.7_postcss@8.4.14: - resolution: {integrity: sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - postcss: 8.4.14 + cssnano-utils: 3.1.0_postcss@8.4.20 + postcss: 8.4.20 postcss-value-parser: 4.2.0 - stylehacks: 5.1.1_postcss@8.4.14 dev: false /postcss-merge-longhand/5.1.7_postcss@8.4.20: @@ -8231,19 +8095,6 @@ packages: stylehacks: 5.1.1_postcss@8.4.20 dev: false - /postcss-merge-rules/5.1.3_postcss@8.4.14: - resolution: {integrity: sha512-LbLd7uFC00vpOuMvyZop8+vvhnfRGpp2S+IMQKeuOZZapPRY4SMq5ErjQeHbHsjCUgJkRNrlU+LmxsKIqPKQlA==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - browserslist: 4.21.4 - caniuse-api: 3.0.0 - cssnano-utils: 3.1.0_postcss@8.4.14 - postcss: 8.4.14 - postcss-selector-parser: 6.0.11 - dev: false - /postcss-merge-rules/5.1.3_postcss@8.4.20: resolution: {integrity: sha512-LbLd7uFC00vpOuMvyZop8+vvhnfRGpp2S+IMQKeuOZZapPRY4SMq5ErjQeHbHsjCUgJkRNrlU+LmxsKIqPKQlA==} engines: {node: ^10 || ^12 || >=14.0} @@ -8257,16 +8108,6 @@ packages: postcss-selector-parser: 6.0.11 dev: false - /postcss-minify-font-values/5.1.0_postcss@8.4.14: - resolution: {integrity: sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - postcss: 8.4.14 - postcss-value-parser: 4.2.0 - dev: false - /postcss-minify-font-values/5.1.0_postcss@8.4.20: resolution: {integrity: sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==} engines: {node: ^10 || ^12 || >=14.0} @@ -8277,18 +8118,6 @@ packages: postcss-value-parser: 4.2.0 dev: false - /postcss-minify-gradients/5.1.1_postcss@8.4.14: - resolution: {integrity: sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - colord: 2.9.3 - cssnano-utils: 3.1.0_postcss@8.4.14 - postcss: 8.4.14 - postcss-value-parser: 4.2.0 - dev: false - /postcss-minify-gradients/5.1.1_postcss@8.4.20: resolution: {integrity: sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==} engines: {node: ^10 || ^12 || >=14.0} @@ -8301,18 +8130,6 @@ packages: postcss-value-parser: 4.2.0 dev: false - /postcss-minify-params/5.1.4_postcss@8.4.14: - resolution: {integrity: sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - browserslist: 4.21.4 - cssnano-utils: 3.1.0_postcss@8.4.14 - postcss: 8.4.14 - postcss-value-parser: 4.2.0 - dev: false - /postcss-minify-params/5.1.4_postcss@8.4.20: resolution: {integrity: sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==} engines: {node: ^10 || ^12 || >=14.0} @@ -8325,16 +8142,6 @@ packages: postcss-value-parser: 4.2.0 dev: false - /postcss-minify-selectors/5.2.1_postcss@8.4.14: - resolution: {integrity: sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - postcss: 8.4.14 - postcss-selector-parser: 6.0.11 - dev: false - /postcss-minify-selectors/5.2.1_postcss@8.4.20: resolution: {integrity: sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==} engines: {node: ^10 || ^12 || >=14.0} @@ -8386,15 +8193,6 @@ packages: postcss: 8.4.20 dev: false - /postcss-normalize-charset/5.1.0_postcss@8.4.14: - resolution: {integrity: sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - postcss: 8.4.14 - dev: false - /postcss-normalize-charset/5.1.0_postcss@8.4.20: resolution: {integrity: sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==} engines: {node: ^10 || ^12 || >=14.0} @@ -8404,16 +8202,6 @@ packages: postcss: 8.4.20 dev: false - /postcss-normalize-display-values/5.1.0_postcss@8.4.14: - resolution: {integrity: sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - postcss: 8.4.14 - postcss-value-parser: 4.2.0 - dev: false - /postcss-normalize-display-values/5.1.0_postcss@8.4.20: resolution: {integrity: sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==} engines: {node: ^10 || ^12 || >=14.0} @@ -8424,16 +8212,6 @@ packages: postcss-value-parser: 4.2.0 dev: false - /postcss-normalize-positions/5.1.1_postcss@8.4.14: - resolution: {integrity: sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - postcss: 8.4.14 - postcss-value-parser: 4.2.0 - dev: false - /postcss-normalize-positions/5.1.1_postcss@8.4.20: resolution: {integrity: sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==} engines: {node: ^10 || ^12 || >=14.0} @@ -8444,16 +8222,6 @@ packages: postcss-value-parser: 4.2.0 dev: false - /postcss-normalize-repeat-style/5.1.1_postcss@8.4.14: - resolution: {integrity: sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - postcss: 8.4.14 - postcss-value-parser: 4.2.0 - dev: false - /postcss-normalize-repeat-style/5.1.1_postcss@8.4.20: resolution: {integrity: sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==} engines: {node: ^10 || ^12 || >=14.0} @@ -8464,16 +8232,6 @@ packages: postcss-value-parser: 4.2.0 dev: false - /postcss-normalize-string/5.1.0_postcss@8.4.14: - resolution: {integrity: sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - postcss: 8.4.14 - postcss-value-parser: 4.2.0 - dev: false - /postcss-normalize-string/5.1.0_postcss@8.4.20: resolution: {integrity: sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==} engines: {node: ^10 || ^12 || >=14.0} @@ -8484,16 +8242,6 @@ packages: postcss-value-parser: 4.2.0 dev: false - /postcss-normalize-timing-functions/5.1.0_postcss@8.4.14: - resolution: {integrity: sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - postcss: 8.4.14 - postcss-value-parser: 4.2.0 - dev: false - /postcss-normalize-timing-functions/5.1.0_postcss@8.4.20: resolution: {integrity: sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==} engines: {node: ^10 || ^12 || >=14.0} @@ -8504,17 +8252,6 @@ packages: postcss-value-parser: 4.2.0 dev: false - /postcss-normalize-unicode/5.1.1_postcss@8.4.14: - resolution: {integrity: sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - browserslist: 4.21.4 - postcss: 8.4.14 - postcss-value-parser: 4.2.0 - dev: false - /postcss-normalize-unicode/5.1.1_postcss@8.4.20: resolution: {integrity: sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==} engines: {node: ^10 || ^12 || >=14.0} @@ -8526,17 +8263,6 @@ packages: postcss-value-parser: 4.2.0 dev: false - /postcss-normalize-url/5.1.0_postcss@8.4.14: - resolution: {integrity: sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - normalize-url: 6.1.0 - postcss: 8.4.14 - postcss-value-parser: 4.2.0 - dev: false - /postcss-normalize-url/5.1.0_postcss@8.4.20: resolution: {integrity: sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==} engines: {node: ^10 || ^12 || >=14.0} @@ -8548,16 +8274,6 @@ packages: postcss-value-parser: 4.2.0 dev: false - /postcss-normalize-whitespace/5.1.1_postcss@8.4.14: - resolution: {integrity: sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - postcss: 8.4.14 - postcss-value-parser: 4.2.0 - dev: false - /postcss-normalize-whitespace/5.1.1_postcss@8.4.20: resolution: {integrity: sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==} engines: {node: ^10 || ^12 || >=14.0} @@ -8568,17 +8284,6 @@ packages: postcss-value-parser: 4.2.0 dev: false - /postcss-ordered-values/5.1.3_postcss@8.4.14: - resolution: {integrity: sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - cssnano-utils: 3.1.0_postcss@8.4.14 - postcss: 8.4.14 - postcss-value-parser: 4.2.0 - dev: false - /postcss-ordered-values/5.1.3_postcss@8.4.20: resolution: {integrity: sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==} engines: {node: ^10 || ^12 || >=14.0} @@ -8590,27 +8295,16 @@ packages: postcss-value-parser: 4.2.0 dev: false - /postcss-reduce-idents/5.2.0_postcss@8.4.14: + /postcss-reduce-idents/5.2.0_postcss@8.4.20: resolution: {integrity: sha512-BTrLjICoSB6gxbc58D5mdBK8OhXRDqud/zodYfdSi52qvDHdMwk+9kB9xsM8yJThH/sZU5A6QVSmMmaN001gIg==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.14 + postcss: 8.4.20 postcss-value-parser: 4.2.0 dev: false - /postcss-reduce-initial/5.1.1_postcss@8.4.14: - resolution: {integrity: sha512-//jeDqWcHPuXGZLoolFrUXBDyuEGbr9S2rMo19bkTIjBQ4PqkaO+oI8wua5BOUxpfi97i3PCoInsiFIEBfkm9w==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - browserslist: 4.21.4 - caniuse-api: 3.0.0 - postcss: 8.4.14 - dev: false - /postcss-reduce-initial/5.1.1_postcss@8.4.20: resolution: {integrity: sha512-//jeDqWcHPuXGZLoolFrUXBDyuEGbr9S2rMo19bkTIjBQ4PqkaO+oI8wua5BOUxpfi97i3PCoInsiFIEBfkm9w==} engines: {node: ^10 || ^12 || >=14.0} @@ -8622,16 +8316,6 @@ packages: postcss: 8.4.20 dev: false - /postcss-reduce-transforms/5.1.0_postcss@8.4.14: - resolution: {integrity: sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - postcss: 8.4.14 - postcss-value-parser: 4.2.0 - dev: false - /postcss-reduce-transforms/5.1.0_postcss@8.4.20: resolution: {integrity: sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==} engines: {node: ^10 || ^12 || >=14.0} @@ -8650,27 +8334,16 @@ packages: util-deprecate: 1.0.2 dev: false - /postcss-sort-media-queries/4.3.0_postcss@8.4.14: + /postcss-sort-media-queries/4.3.0_postcss@8.4.20: resolution: {integrity: sha512-jAl8gJM2DvuIJiI9sL1CuiHtKM4s5aEIomkU8G3LFvbP+p8i7Sz8VV63uieTgoewGqKbi+hxBTiOKJlB35upCg==} engines: {node: '>=10.0.0'} peerDependencies: postcss: ^8.4.16 dependencies: - postcss: 8.4.14 + postcss: 8.4.20 sort-css-media-queries: 2.1.0 dev: false - /postcss-svgo/5.1.0_postcss@8.4.14: - resolution: {integrity: sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - postcss: 8.4.14 - postcss-value-parser: 4.2.0 - svgo: 2.8.0 - dev: false - /postcss-svgo/5.1.0_postcss@8.4.20: resolution: {integrity: sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==} engines: {node: ^10 || ^12 || >=14.0} @@ -8682,16 +8355,6 @@ packages: svgo: 2.8.0 dev: false - /postcss-unique-selectors/5.1.1_postcss@8.4.14: - resolution: {integrity: sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - postcss: 8.4.14 - postcss-selector-parser: 6.0.11 - dev: false - /postcss-unique-selectors/5.1.1_postcss@8.4.20: resolution: {integrity: sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==} engines: {node: ^10 || ^12 || >=14.0} @@ -8706,13 +8369,13 @@ packages: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} dev: false - /postcss-zindex/5.1.0_postcss@8.4.14: + /postcss-zindex/5.1.0_postcss@8.4.20: resolution: {integrity: sha512-fgFMf0OtVSBR1va1JNHYgMxYk73yhn/qb4uQDq1DLGYolz8gHCyr/sesEuGUaYs58E3ZJRcpoGuPVoB7Meiq9A==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.14 + postcss: 8.4.20 dev: false /postcss/8.4.14: @@ -8722,6 +8385,7 @@ packages: nanoid: 3.3.4 picocolors: 1.0.0 source-map-js: 1.0.2 + dev: true /postcss/8.4.20: resolution: {integrity: sha512-6Q04AXR1212bXr5fh03u8aAwbLxAQNGQ/Q1LNa0VfOI06ZAlhPHtQvE4OIdpj4kLThXilalPnmDSOD65DcHt+g==} @@ -8748,12 +8412,6 @@ packages: hasBin: true dev: true - /prettier/2.8.0: - resolution: {integrity: sha512-9Lmg8hTFZKG0Asr/kW9Bp8tJjRVluO8EJQVfY2T7FMw9T5jy4I/Uvx0Rca/XWf50QQ1/SS48+6IJWnrb+2yemA==} - engines: {node: '>=10.13.0'} - hasBin: true - dev: false - /pretty-error/4.0.0: resolution: {integrity: sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==} dependencies: @@ -8920,7 +8578,7 @@ packages: pure-color: 1.3.0 dev: false - /react-dev-utils/12.0.1_vfotqvx6lgcbf3upbs6hgaza4q: + /react-dev-utils/12.0.1_3fkjkrd3audxnith3e7fo4fnxi: resolution: {integrity: sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==} engines: {node: '>=14'} peerDependencies: @@ -8931,7 +8589,7 @@ packages: optional: true dependencies: '@babel/code-frame': 7.18.6 - address: 1.2.1 + address: 1.2.2 browserslist: 4.21.4 chalk: 4.1.2 cross-spawn: 7.0.3 @@ -8939,11 +8597,11 @@ packages: escape-string-regexp: 4.0.0 filesize: 8.0.7 find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 6.5.2_vfotqvx6lgcbf3upbs6hgaza4q + fork-ts-checker-webpack-plugin: 6.5.2_3fkjkrd3audxnith3e7fo4fnxi global-modules: 2.0.0 globby: 11.1.0 gzip-size: 6.0.0 - immer: 9.0.16 + immer: 9.0.17 is-root: 2.1.0 loader-utils: 3.2.1 open: 8.4.0 @@ -8954,7 +8612,7 @@ packages: shell-quote: 1.7.4 strip-ansi: 6.0.1 text-table: 0.2.0 - typescript: 4.9.3 + typescript: 4.9.4 webpack: 5.75.0 transitivePeerDependencies: - eslint @@ -8994,7 +8652,7 @@ packages: react: ^16.6.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.6.0 || ^17.0.0 || ^18.0.0 dependencies: - '@babel/runtime': 7.20.6 + '@babel/runtime': 7.20.7 invariant: 2.2.4 prop-types: 15.8.1 react: 17.0.2 @@ -9037,7 +8695,7 @@ packages: react-loadable: '*' webpack: '>=4.41.1 || 5.x' dependencies: - '@babel/runtime': 7.20.6 + '@babel/runtime': 7.20.7 react-loadable: /@docusaurus/react-loadable/5.5.2_react@17.0.2 webpack: 5.75.0 dev: false @@ -9048,7 +8706,7 @@ packages: react: '>=15' react-router: '>=5' dependencies: - '@babel/runtime': 7.20.6 + '@babel/runtime': 7.20.7 react: 17.0.2 react-router: 5.3.4_react@17.0.2 dev: false @@ -9058,7 +8716,7 @@ packages: peerDependencies: react: '>=15' dependencies: - '@babel/runtime': 7.20.6 + '@babel/runtime': 7.20.7 history: 4.10.1 loose-envify: 1.4.0 prop-types: 15.8.1 @@ -9073,7 +8731,7 @@ packages: peerDependencies: react: '>=15' dependencies: - '@babel/runtime': 7.20.6 + '@babel/runtime': 7.20.7 history: 4.10.1 hoist-non-react-statics: 3.3.2 loose-envify: 1.4.0 @@ -9091,7 +8749,7 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: - '@babel/runtime': 7.20.6 + '@babel/runtime': 7.20.7 react: 17.0.2 use-composed-ref: 1.3.0_react@17.0.2 use-latest: 1.2.1_react@17.0.2 @@ -9175,7 +8833,7 @@ packages: /regenerator-transform/0.15.1: resolution: {integrity: sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==} dependencies: - '@babel/runtime': 7.20.6 + '@babel/runtime': 7.20.7 dev: false /regexp.prototype.flags/1.4.3: @@ -9385,7 +9043,7 @@ packages: dependencies: find-up: 5.0.0 picocolors: 1.0.0 - postcss: 8.4.14 + postcss: 8.4.20 strip-json-comments: 3.1.1 dev: false @@ -9394,8 +9052,8 @@ packages: dependencies: queue-microtask: 1.2.3 - /rxjs/7.6.0: - resolution: {integrity: sha512-DDa7d8TFNUalGC9VqXvQ1euWNN7sc63TrUCuM9J998+ViviahMIjKSOU7rfcgFOF+FCD71BhDRv4hrFz+ImDLQ==} + /rxjs/7.8.0: + resolution: {integrity: sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==} dependencies: tslib: 2.4.1 dev: false @@ -9797,7 +9455,7 @@ packages: dependencies: call-bind: 1.0.2 define-properties: 1.1.4 - es-abstract: 1.20.4 + es-abstract: 1.20.5 dev: true /string.prototype.trimstart/1.0.6: @@ -9805,7 +9463,7 @@ packages: dependencies: call-bind: 1.0.2 define-properties: 1.1.4 - es-abstract: 1.20.4 + es-abstract: 1.20.5 dev: true /string_decoder/1.1.1: @@ -9893,17 +9551,6 @@ packages: react: 18.2.0 dev: true - /stylehacks/5.1.1_postcss@8.4.14: - resolution: {integrity: sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - browserslist: 4.21.4 - postcss: 8.4.14 - postcss-selector-parser: 6.0.11 - dev: false - /stylehacks/5.1.1_postcss@8.4.20: resolution: {integrity: sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==} engines: {node: ^10 || ^12 || >=14.0} @@ -10070,7 +9717,7 @@ packages: resolution: {integrity: sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==} dev: false - /ts-jest/29.0.3_gruvivcimsmdfhnjphbo3uejz4: + /ts-jest/29.0.3_jgcrazg63n7mkdjrxsk5jv2npy: resolution: {integrity: sha512-Ibygvmuyq1qp/z3yTh9QTwVVAbFdDy/+4BtIQR2sp6baF2SJU/8CKK/hhnGIDY2L90Az2jIqTwZPnN2p+BweiQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -10091,20 +9738,20 @@ packages: esbuild: optional: true dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.7 bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 - jest: 29.3.1_odkjkoia5xunhxkdrka32ib6vi + jest: 29.3.1_zfha7dvnw4nti6zkbsmhmn6xo4 jest-util: 29.3.1 - json5: 2.2.1 + json5: 2.2.3 lodash.memoize: 4.1.2 make-error: 1.3.6 semver: 7.3.8 - typescript: 4.9.3 + typescript: 4.9.4 yargs-parser: 21.1.1 dev: true - /ts-node/10.9.1_wup25etrarvlqkprac7h35hj7u: + /ts-node/10.9.1_awa2wsr5thmg3i7jqycphctjfq: resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true peerDependencies: @@ -10123,14 +9770,14 @@ packages: '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.3 - '@types/node': 18.11.9 + '@types/node': 18.11.18 acorn: 8.8.1 acorn-walk: 8.2.0 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 4.9.3 + typescript: 4.9.4 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 dev: true @@ -10139,7 +9786,7 @@ packages: resolution: {integrity: sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==} dependencies: '@types/json5': 0.0.29 - json5: 1.0.1 + json5: 1.0.2 minimist: 1.2.7 strip-bom: 3.0.0 dev: true @@ -10204,6 +9851,12 @@ packages: resolution: {integrity: sha512-CIfGzTelbKNEnLpLdGFgdyKhG23CKdKgQPOBc+OUNrkJ2vr+KSzsSV5kq5iWhEQbok+quxgGzrAtGWCyU7tHnA==} engines: {node: '>=4.2.0'} hasBin: true + dev: true + + /typescript/4.9.4: + resolution: {integrity: sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==} + engines: {node: '>=4.2.0'} + hasBin: true /ua-parser-js/0.7.32: resolution: {integrity: sha512-f9BESNVhzlhEFf2CHMSj40NWOjYPl1YKYbrvIr/hFTDEmLq7SRbWvm7FcdcpCYT95zrOhC7gZSxjdnnTpBcwVw==} @@ -10515,7 +10168,7 @@ packages: joi: 17.7.0 lodash: 4.17.21 minimist: 1.2.7 - rxjs: 7.6.0 + rxjs: 7.8.0 transitivePeerDependencies: - debug dev: false @@ -10593,11 +10246,11 @@ packages: dependencies: '@types/bonjour': 3.5.10 '@types/connect-history-api-fallback': 1.3.5 - '@types/express': 4.17.14 + '@types/express': 4.17.15 '@types/serve-index': 1.9.1 '@types/serve-static': 1.15.0 '@types/sockjs': 0.3.33 - '@types/ws': 8.5.3 + '@types/ws': 8.5.4 ansi-html-community: 0.0.8 bonjour-service: 1.0.14 chokidar: 3.5.3 @@ -10608,7 +10261,7 @@ packages: express: 4.18.2 graceful-fs: 4.2.10 html-entities: 2.3.3 - http-proxy-middleware: 2.0.6_@types+express@4.17.14 + http-proxy-middleware: 2.0.6_@types+express@4.17.15 ipaddr.js: 2.0.1 open: 8.4.0 p-retry: 4.6.2 @@ -10843,6 +10496,9 @@ packages: engines: {node: '>=10'} dev: true + /yallist/3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + /yallist/4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} @@ -10882,8 +10538,8 @@ packages: resolution: {integrity: sha512-Z2Fe1bn+eLstG8DRR6FTavGD+MeAwyfmouhHsIUgaADz8jvFKbO/fXc2trJKZg+5EBjh4gGm3iU/t3onKlXHIg==} engines: {node: '>=10'} dependencies: - '@babel/runtime': 7.20.6 - '@types/lodash': 4.14.190 + '@babel/runtime': 7.20.7 + '@types/lodash': 4.14.191 lodash: 4.17.21 lodash-es: 4.17.21 nanoclone: 0.2.1 @@ -10891,16 +10547,9 @@ packages: toposort: 2.0.2 dev: true - /zod-to-json-schema/3.19.0_zod@3.19.1: - resolution: {integrity: sha512-ChPYAl3MWnZwKgNMMYP+/MgYWekL4Ef6n0ot/PBURTUfBpzjnSFB8unZaL3MDwH0YcAwQW63n2pnPJi/dqHfwg==} - peerDependencies: - zod: ^3.19.0 - dependencies: - zod: 3.19.1 - dev: false - /zod/3.19.1: resolution: {integrity: sha512-LYjZsEDhCdYET9ikFu6dVPGp2YH9DegXjdJToSzD9rO6fy4qiRYFoyEYwps88OseJlPyl2NOe2iJuhEhL7IpEA==} + dev: true /zwitch/1.0.5: resolution: {integrity: sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==}