From 4799f2a1f5fd538e16f28a0490a06a6fe89caee1 Mon Sep 17 00:00:00 2001 From: Jonas Lagoni Date: Thu, 30 Nov 2023 23:40:02 -1000 Subject: [PATCH] feat!: add support for AsyncAPI v3 (#526) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Sergio Moya <1083296+smoya@users.noreply.github.com>%0ACo-authored-by: asyncapi-bot %0ACo-authored-by: Fran Mendez %0ACo-authored-by: Fran Méndez %0ACo-authored-by: Heiko Henning %0ACo-authored-by: souvik %0ACo-authored-by: Maciej Urbańczyk %0ACo-authored-by: Matatjahu --- .sonarcloud.properties | 2 +- README.md | 9 +- docs/migrations/v2-to-v3.md | 26 + package-lock.json | 5858 ++++++++--------- package.json | 4 +- src/constants.ts | 1 + src/custom-operations/anonymous-naming.ts | 9 +- src/custom-operations/apply-traits.ts | 79 +- src/custom-operations/apply-unique-ids.ts | 25 + src/custom-operations/index.ts | 30 +- src/custom-operations/parse-schema.ts | 80 + src/document.ts | 11 +- src/models/asyncapi.ts | 7 +- src/models/channel.ts | 2 +- src/models/external-documentation.ts | 9 + src/models/external-documentations.ts | 11 + src/models/index.ts | 6 +- src/models/message-trait.ts | 4 +- src/models/mixins.ts | 14 +- src/models/operation-replies.ts | 5 + src/models/operation-reply-address.ts | 7 + src/models/operation-reply-addresses.ts | 4 + src/models/operation-reply.ts | 15 + src/models/operation-trait.ts | 2 +- src/models/operation.ts | 2 + src/models/schema.ts | 1 + src/models/server.ts | 3 + src/models/utils.ts | 27 +- src/models/v2/asyncapi.ts | 27 +- src/models/v2/info.ts | 9 +- src/models/v2/message-trait.ts | 14 +- src/models/v2/message.ts | 2 +- src/models/v2/operation.ts | 5 + src/models/v2/schema.ts | 7 +- src/models/v2/server.ts | 14 + src/models/v3/asyncapi.ts | 142 +- src/models/v3/binding.ts | 28 + src/models/v3/bindings.ts | 31 + src/models/v3/channel-parameter.ts | 48 + src/models/v3/channel-parameters.ts | 10 + src/models/v3/channel.ts | 72 + src/models/v3/channels.ts | 18 + src/models/v3/components.ts | 168 + src/models/v3/contact.ts | 38 + src/models/v3/correlation-id.ts | 30 + src/models/v3/correlation-ids.ts | 10 + src/models/v3/extension.ts | 19 + src/models/v3/extensions.ts | 11 + src/models/v3/external-docs.ts | 30 + src/models/v3/index.ts | 42 +- src/models/v3/info.ts | 82 + src/models/v3/license.ts | 26 + src/models/v3/message-example.ts | 46 + src/models/v3/message-examples.ts | 10 + src/models/v3/message-trait.ts | 74 + src/models/v3/message-traits.ts | 10 + src/models/v3/message.ts | 111 + src/models/v3/messages.ts | 18 + src/models/v3/mixins.ts | 129 + src/models/v3/oauth-flow.ts | 42 + src/models/v3/oauth-flows.ts | 52 + src/models/v3/operation-replies.ts | 10 + src/models/v3/operation-reply-address.ts | 30 + src/models/v3/operation-reply-addresses.ts | 10 + src/models/v3/operation-reply.ts | 54 + src/models/v3/operation-trait.ts | 31 + src/models/v3/operation-traits.ts | 10 + src/models/v3/operation.ts | 95 + src/models/v3/operations.ts | 18 + src/models/v3/schema.ts | 329 + src/models/v3/schemas.ts | 10 + src/models/v3/security-requirement.ts | 14 + src/models/v3/security-requirements.ts | 10 + src/models/v3/security-scheme.ts | 81 + src/models/v3/security-schemes.ts | 10 + src/models/v3/server-variable.ts | 46 + src/models/v3/server-variables.ts | 10 + src/models/v3/server.ts | 125 + src/models/v3/servers.ts | 17 + src/models/v3/tag.ts | 39 + src/models/v3/tags.ts | 10 + src/parse.ts | 27 +- src/ruleset/functions/documentStructure.ts | 60 +- src/ruleset/index.ts | 2 + src/ruleset/ruleset.ts | 7 +- .../functions/operationMessagesUnambiguity.ts | 44 + src/ruleset/v3/index.ts | 1 + src/ruleset/v3/ruleset.ts | 61 + src/spec-types/index.ts | 1 + src/spec-types/v2.ts | 2 +- src/spec-types/v3.ts | 495 ++ src/types.ts | 6 +- src/utils.ts | 22 +- .../custom-operations/apply-traits-v2.spec.ts | 189 + .../custom-operations/apply-traits-v3.spec.ts | 321 + .../apply-unique-ids.spec.ts | 30 + .../check-circular-refs.spec.ts | 61 + ...schema.spec.ts => parse-schema-v2.spec.ts} | 2 +- .../custom-operations/parse-schema-v3.spec.ts | 135 + test/document.spec.ts | 25 +- test/models/v2/asyncapi.spec.ts | 19 + test/models/v2/channel.spec.ts | 6 +- test/models/v2/external-documentation.spec.ts | 20 + test/models/v2/info.spec.ts | 24 +- test/models/v2/message-trait.spec.ts | 4 +- test/models/v2/message.spec.ts | 4 +- test/models/v2/operation.spec.ts | 8 + test/models/v2/schema.spec.ts | 16 + test/models/v2/server.spec.ts | 14 +- test/models/v3/asyncapi.spec.ts | 316 + test/models/v3/bindings.spec.ts | 64 + test/models/v3/channel-parameter.spec.ts | 108 + test/models/v3/channel.spec.ts | 140 + test/models/v3/components.spec.ts | 379 ++ test/models/v3/contact.spec.ts | 95 + test/models/v3/correlation-id.spec.ts | 40 + test/models/v3/external-documentation.spec.ts | 20 + test/models/v3/info.spec.ts | 149 + test/models/v3/license.spec.ts | 47 + test/models/v3/message-example.spec.ts | 121 + test/models/v3/message-trait.spec.ts | 186 + test/models/v3/message.spec.ts | 185 + test/models/v3/oauth-flow.spec.ts | 39 + test/models/v3/oauth-flows.spec.ts | 42 + .../models/v3/operation-reply-address.spec.ts | 17 + test/models/v3/operation-reply.spec.ts | 93 + test/models/v3/operation-trait.spec.ts | 61 + test/models/v3/operation.spec.ts | 156 + test/models/v3/schema.spec.ts | 839 +++ test/models/v3/server-variable.spec.ts | 34 + test/models/v3/server.spec.ts | 237 + test/models/v3/tag.spec.ts | 19 + test/models/v3/utils.ts | 230 + test/parse.spec.ts | 23 +- test/ruleset/formats.spec.ts | 6 +- .../rules/asyncapi-document-resolved.spec.ts | 89 +- .../asyncapi-document-unresolved.spec.ts | 45 +- ...ion-messages-from-referred-channel.spec.ts | 323 + ...quired-channel-servers-unambiguity.spec.ts | 210 + ...ired-operation-channel-unambiguity.spec.ts | 261 + test/ruleset/tester.ts | 11 +- test/sample_browser/refs/refed2.yaml | 1 - test/schema-parser/spectral-rule-v2.spec.ts | 288 + 143 files changed, 11811 insertions(+), 3256 deletions(-) create mode 100644 docs/migrations/v2-to-v3.md create mode 100644 src/custom-operations/apply-unique-ids.ts create mode 100644 src/models/external-documentation.ts create mode 100644 src/models/external-documentations.ts create mode 100644 src/models/operation-replies.ts create mode 100644 src/models/operation-reply-address.ts create mode 100644 src/models/operation-reply-addresses.ts create mode 100644 src/models/operation-reply.ts create mode 100644 src/models/v3/binding.ts create mode 100644 src/models/v3/bindings.ts create mode 100644 src/models/v3/channel-parameter.ts create mode 100644 src/models/v3/channel-parameters.ts create mode 100644 src/models/v3/channel.ts create mode 100644 src/models/v3/channels.ts create mode 100644 src/models/v3/components.ts create mode 100644 src/models/v3/contact.ts create mode 100644 src/models/v3/correlation-id.ts create mode 100644 src/models/v3/correlation-ids.ts create mode 100644 src/models/v3/extension.ts create mode 100644 src/models/v3/extensions.ts create mode 100644 src/models/v3/external-docs.ts create mode 100644 src/models/v3/info.ts create mode 100644 src/models/v3/license.ts create mode 100644 src/models/v3/message-example.ts create mode 100644 src/models/v3/message-examples.ts create mode 100644 src/models/v3/message-trait.ts create mode 100644 src/models/v3/message-traits.ts create mode 100644 src/models/v3/message.ts create mode 100644 src/models/v3/messages.ts create mode 100644 src/models/v3/mixins.ts create mode 100644 src/models/v3/oauth-flow.ts create mode 100644 src/models/v3/oauth-flows.ts create mode 100644 src/models/v3/operation-replies.ts create mode 100644 src/models/v3/operation-reply-address.ts create mode 100644 src/models/v3/operation-reply-addresses.ts create mode 100644 src/models/v3/operation-reply.ts create mode 100644 src/models/v3/operation-trait.ts create mode 100644 src/models/v3/operation-traits.ts create mode 100644 src/models/v3/operation.ts create mode 100644 src/models/v3/operations.ts create mode 100644 src/models/v3/schema.ts create mode 100644 src/models/v3/schemas.ts create mode 100644 src/models/v3/security-requirement.ts create mode 100644 src/models/v3/security-requirements.ts create mode 100644 src/models/v3/security-scheme.ts create mode 100644 src/models/v3/security-schemes.ts create mode 100644 src/models/v3/server-variable.ts create mode 100644 src/models/v3/server-variables.ts create mode 100644 src/models/v3/server.ts create mode 100644 src/models/v3/servers.ts create mode 100644 src/models/v3/tag.ts create mode 100644 src/models/v3/tags.ts create mode 100644 src/ruleset/v3/functions/operationMessagesUnambiguity.ts create mode 100644 src/ruleset/v3/index.ts create mode 100644 src/ruleset/v3/ruleset.ts create mode 100644 src/spec-types/v3.ts create mode 100644 test/custom-operations/apply-traits-v2.spec.ts create mode 100644 test/custom-operations/apply-traits-v3.spec.ts create mode 100644 test/custom-operations/apply-unique-ids.spec.ts create mode 100644 test/custom-operations/check-circular-refs.spec.ts rename test/custom-operations/{parse-schema.spec.ts => parse-schema-v2.spec.ts} (98%) create mode 100644 test/custom-operations/parse-schema-v3.spec.ts create mode 100644 test/models/v2/external-documentation.spec.ts create mode 100644 test/models/v3/asyncapi.spec.ts create mode 100644 test/models/v3/bindings.spec.ts create mode 100644 test/models/v3/channel-parameter.spec.ts create mode 100644 test/models/v3/channel.spec.ts create mode 100644 test/models/v3/components.spec.ts create mode 100644 test/models/v3/contact.spec.ts create mode 100644 test/models/v3/correlation-id.spec.ts create mode 100644 test/models/v3/external-documentation.spec.ts create mode 100644 test/models/v3/info.spec.ts create mode 100644 test/models/v3/license.spec.ts create mode 100644 test/models/v3/message-example.spec.ts create mode 100644 test/models/v3/message-trait.spec.ts create mode 100644 test/models/v3/message.spec.ts create mode 100644 test/models/v3/oauth-flow.spec.ts create mode 100644 test/models/v3/oauth-flows.spec.ts create mode 100644 test/models/v3/operation-reply-address.spec.ts create mode 100644 test/models/v3/operation-reply.spec.ts create mode 100644 test/models/v3/operation-trait.spec.ts create mode 100644 test/models/v3/operation.spec.ts create mode 100644 test/models/v3/schema.spec.ts create mode 100644 test/models/v3/server-variable.spec.ts create mode 100644 test/models/v3/server.spec.ts create mode 100644 test/models/v3/tag.spec.ts create mode 100644 test/models/v3/utils.ts create mode 100644 test/ruleset/rules/v3/asyncapi3-operation-messages-from-referred-channel.spec.ts create mode 100644 test/ruleset/rules/v3/asyncapi3-required-channel-servers-unambiguity.spec.ts create mode 100644 test/ruleset/rules/v3/asyncapi3-required-operation-channel-unambiguity.spec.ts delete mode 100644 test/sample_browser/refs/refed2.yaml create mode 100644 test/schema-parser/spectral-rule-v2.spec.ts diff --git a/.sonarcloud.properties b/.sonarcloud.properties index 98a487f3c..3a9937a7b 100644 --- a/.sonarcloud.properties +++ b/.sonarcloud.properties @@ -1,3 +1,3 @@ # Disable specific duplicate code since it would introduce more complexity to reduce it. -sonar.cpd.exclusions=src/models/**/*.ts +sonar.cpd.exclusions=src/models/**/*.ts,src/spec-types/*.ts sonar.exclusions=test/**/* diff --git a/README.md b/README.md index 95f617e03..1e322c366 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ Updated bundle for the browser is always attached to the GitHub Release. > This package has rewrote the Model API (old one) to [Intent API](https://github.com/asyncapi/parser-api). If you still need to use the old API, read the [Convert to the old API](#convert-to-the-old-api) section. > **Note** -> Read the [migration guide from v1 to v2](./docs/migrations/v1-to-v2.md). +> Read the [migration guide from v2 to v3](./docs/migrations/v2-to-v3.md). @@ -214,9 +214,10 @@ Parser-JS API implements a global API definition for all AsyncAPI parser impleme The following table shows a compatibility matrix between this parser, and the [Parser-API](https://github.com/asyncapi/parser-api), as well as the AsyncAPI spec version supported by each release of this parser. -| Parser-JS | Parser-API | Spec 2.x | -|-----------|----------------------------------------------------------------------|----------| -| 2.x | [1.x](https://github.com/asyncapi/parser-api/blob/master/docs/v1.md) | ✓ | +| Parser-JS | Parser-API | Spec 2.x | Spec 3.x | +|-----------|-----------------------------------------------------------------------|----------|----------| +| 2.x | [1.x](https://github.com/asyncapi/parser-api/blob/v1.0.0/docs/v1.md) | ✓ | | +| 3.x | [3.x](https://github.com/asyncapi/parser-api/blob/v3.0.0/docs/api.md) | ✓ | ✓ | - `✓` Fully supported version. - `-` The AsyncAPI Spec version has features the Parser-JS can't use but the rest are fully supported. diff --git a/docs/migrations/v2-to-v3.md b/docs/migrations/v2-to-v3.md new file mode 100644 index 000000000..0441cb270 --- /dev/null +++ b/docs/migrations/v2-to-v3.md @@ -0,0 +1,26 @@ +# Migrating from v2 to v3 + +The ONLY thing that changes between v2 and v3 is that we now use [parser API v3](https://github.com/asyncapi/parser-api/commit/954a59e41ccdb70de51eb43901f61b79198fbb51) where v2 used [parser API v1](https://github.com/asyncapi/parser-api/commit/7dab1eeb796f8c8c079e5d0c4d671d55a60bc8ca). + +## Parser API v1 to v3 +There are only very few changes, for message and message traits. + +## Message + +```diff +- - messageId(): `string` | `undefined` +- - schemaFormat(): `string` ++ - schemaFormat(): `string` | `undefined` +``` + +Since `messageId` have been removed, you need to use `id` instead. + +## MessageTrait + +```diff +- - messageId(): `string` | `undefined` +- - schemaFormat(): `string` ++ - schemaFormat(): `string` | `undefined` +``` + +Since `messageId` have been removed, you need to use `id` instead. diff --git a/package-lock.json b/package-lock.json index de7e05354..f8b6f251d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,15 +1,15 @@ { "name": "@asyncapi/parser", - "version": "2.1.2", + "version": "3.0.0-next-major-spec.16", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@asyncapi/parser", - "version": "2.1.2", + "version": "3.0.0-next-major-spec.16", "license": "Apache-2.0", "dependencies": { - "@asyncapi/specs": "^5.1.0", + "@asyncapi/specs": "^6.0.0", "@openapi-contrib/openapi-schema-to-json-schema": "~3.2.0", "@stoplight/json": "^3.20.2", "@stoplight/json-ref-readers": "^1.2.2", @@ -59,13 +59,22 @@ "webpack-cli": "^4.10.0" } }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", "dev": true, "dependencies": { - "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" }, "engines": { @@ -110,10 +119,19 @@ "node-fetch": "2.6.7" } }, - "node_modules/@asyncapi/specs": { + "node_modules/@asyncapi/parser/node_modules/@asyncapi/specs": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/@asyncapi/specs/-/specs-5.1.0.tgz", "integrity": "sha512-yffhETqehkim43luMnPKOwzY0D0YtU4bKpORIXIaid6p5Y5kDLrMGJaEPkNieQp03HMjhjFrnUPtT8kvqe0+aQ==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.11" + } + }, + "node_modules/@asyncapi/specs": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@asyncapi/specs/-/specs-6.0.0.tgz", + "integrity": "sha512-/HikjNcrTR/OgZmXWHYkdLdoJQUm80zcM5dnr1dx2R92WRmMQ0wweEJyFXCZwwyzoRkPHMD3RU4h3ppM8pYHRQ==", "dependencies": { "@types/json-schema": "^7.0.11" } @@ -203,35 +221,35 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.19.3", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.19.3.tgz", - "integrity": "sha512-prBHMK4JYYK+wDjJF1q99KK4JLL+egWS4nmNqdlMUgCExMZ+iZW0hGhyC3VEbsPjvaN0TBhW//VIFwBrk8sEiw==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz", + "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.19.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.3.tgz", - "integrity": "sha512-WneDJxdsjEvyKtXKsaBGbDeiyOjR5vYq4HcShxnIbG0qixpoHjI3MqeZM9NDvsojNCEBItQE4juOo/bU6e72gQ==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.19.3", - "@babel/helper-compilation-targets": "^7.19.3", - "@babel/helper-module-transforms": "^7.19.0", - "@babel/helpers": "^7.19.0", - "@babel/parser": "^7.19.3", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.3", - "@babel/types": "^7.19.3", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.9.tgz", + "integrity": "sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.9", + "@babel/helper-compilation-targets": "^7.22.9", + "@babel/helper-module-transforms": "^7.22.9", + "@babel/helpers": "^7.22.6", + "@babel/parser": "^7.22.7", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.8", + "@babel/types": "^7.22.5", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" + "json5": "^2.2.2", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -242,24 +260,27 @@ } }, "node_modules/@babel/core/node_modules/convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "node_modules/@babel/core/node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, - "dependencies": { - "safe-buffer": "~5.1.1" + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" } }, - "node_modules/@babel/core/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -280,30 +301,17 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.19.3", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.19.3.tgz", - "integrity": "sha512-65ESqLGyGmLvgR0mst5AdW1FkNlj9rQsCKduzEoEPhBCDFGXvz2jW6bXFG6i0/MrV2s7hhXjjb2yAzcPuQlLwg==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.9.tgz", + "integrity": "sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.19.3", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.21.3", - "semver": "^6.3.0" + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.5", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -312,15 +320,30 @@ "@babel/core": "^7.0.0" } }, + "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" } }, + "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, "node_modules/@babel/helper-environment-visitor": { "version": "7.22.20", "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", @@ -356,52 +379,52 @@ } }, "node_modules/@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", + "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.19.0.tgz", - "integrity": "sha512-3HBZ377Fe14RbLIA+ac3sY4PTgpxHVkFrESaWhoI5PuyXPBBX8+C34qblV9G89ZtycGJCmCI/Ut+VUDK4bltNQ==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz", + "integrity": "sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.18.6", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.0", - "@babel/types": "^7.19.0" + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.5" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", - "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-simple-access": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz", - "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -438,23 +461,23 @@ } }, "node_modules/@babel/helper-validator-option": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", - "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", + "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.19.0.tgz", - "integrity": "sha512-DRBCKGwIEdqY3+rPJgG/dKfQy9+08rHIAJx8q2p+HSWP87s2HCrQmaAMMyMll2kIXKCW0cO1RdQskx15Xakftg==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.6.tgz", + "integrity": "sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==", "dev": true, "dependencies": { - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.0", - "@babel/types": "^7.19.0" + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.6", + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -515,15 +538,6 @@ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/@babel/highlight/node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -618,12 +632,12 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.21.4.tgz", - "integrity": "sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", + "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -720,12 +734,12 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.21.4.tgz", - "integrity": "sha512-xz0D39NvhQn4t4RNsHmDnnsaQizIlUkdtYvLs8La1BlfjQ6JEwxkJGeqJMW2tAXx+q6H+WFuUTXNdYVpEya0YA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz", + "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -735,9 +749,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", - "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz", + "integrity": "sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==", "dev": true, "dependencies": { "regenerator-runtime": "^0.13.11" @@ -857,23 +871,23 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.0.tgz", - "integrity": "sha512-vITaYzIcNmjn5tF5uxcZ/ft7/RXGrMUIS9HalWckEOF6ESiwXKoMzAQf2UW0aVd6rnOeExTJVd5hmWXucBKGXQ==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz", + "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, "node_modules/@eslint/eslintrc": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.2.tgz", - "integrity": "sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.0.tgz", + "integrity": "sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.5.1", + "espree": "^9.6.0", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -911,9 +925,9 @@ "dev": true }, "node_modules/@eslint/js": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.38.0.tgz", - "integrity": "sha512-IoD2MfUnOV58ghIHCiil01PcohxjbYR/qCxsoC+xNgUwh1EY8jOOrYmu3d3a71+tJJ23uscEV4X2HJWMsPJu4g==", + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.44.0.tgz", + "integrity": "sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -926,9 +940,9 @@ "dev": true }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", - "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", + "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", "dev": true, "dependencies": { "@humanwhocodes/object-schema": "^1.2.1", @@ -974,6 +988,15 @@ "node": ">=8" } }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -1012,6 +1035,21 @@ "node": ">=8" } }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", @@ -1024,15 +1062,6 @@ "node": ">=8" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", @@ -1052,16 +1081,16 @@ } }, "node_modules/@jest/console": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.5.0.tgz", - "integrity": "sha512-NEpkObxPwyw/XxZVLPmAGKE89IQRp4puc6IQRPru6JKd1M3fW9v1xM1AnzIJE65hbCkzQAdnL8P47e9hzhiYLQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.1.tgz", + "integrity": "sha512-Aj772AYgwTSr5w8qnyoJ0eDYvN6bMsH3ORH1ivMotrInHLKdUz6BDlaEXHdM6kODaBIkNIyQGzsMvRdOv7VG7Q==", "dev": true, "dependencies": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.1", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^29.5.0", - "jest-util": "^29.5.0", + "jest-message-util": "^29.6.1", + "jest-util": "^29.6.1", "slash": "^3.0.0" }, "engines": { @@ -1069,16 +1098,16 @@ } }, "node_modules/@jest/core": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.5.0.tgz", - "integrity": "sha512-28UzQc7ulUrOQw1IsN/kv1QES3q2kkbl/wGslyhAclqZ/8cMdB5M68BffkIdSJgKBUt50d3hbwJ92XESlE7LiQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.1.tgz", + "integrity": "sha512-CcowHypRSm5oYQ1obz1wfvkjZZ2qoQlrKKvlfPwh5jUXVU12TWr2qMeH8chLMuTFzHh5a1g2yaqlqDICbr+ukQ==", "dev": true, "dependencies": { - "@jest/console": "^29.5.0", - "@jest/reporters": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/console": "^29.6.1", + "@jest/reporters": "^29.6.1", + "@jest/test-result": "^29.6.1", + "@jest/transform": "^29.6.1", + "@jest/types": "^29.6.1", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", @@ -1086,20 +1115,20 @@ "exit": "^0.1.2", "graceful-fs": "^4.2.9", "jest-changed-files": "^29.5.0", - "jest-config": "^29.5.0", - "jest-haste-map": "^29.5.0", - "jest-message-util": "^29.5.0", + "jest-config": "^29.6.1", + "jest-haste-map": "^29.6.1", + "jest-message-util": "^29.6.1", "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.5.0", - "jest-resolve-dependencies": "^29.5.0", - "jest-runner": "^29.5.0", - "jest-runtime": "^29.5.0", - "jest-snapshot": "^29.5.0", - "jest-util": "^29.5.0", - "jest-validate": "^29.5.0", - "jest-watcher": "^29.5.0", + "jest-resolve": "^29.6.1", + "jest-resolve-dependencies": "^29.6.1", + "jest-runner": "^29.6.1", + "jest-runtime": "^29.6.1", + "jest-snapshot": "^29.6.1", + "jest-util": "^29.6.1", + "jest-validate": "^29.6.1", + "jest-watcher": "^29.6.1", "micromatch": "^4.0.4", - "pretty-format": "^29.5.0", + "pretty-format": "^29.6.1", "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, @@ -1128,12 +1157,12 @@ } }, "node_modules/@jest/core/node_modules/pretty-format": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz", + "integrity": "sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==", "dev": true, "dependencies": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.0", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, @@ -1185,37 +1214,37 @@ } }, "node_modules/@jest/environment": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.5.0.tgz", - "integrity": "sha512-5FXw2+wD29YU1d4I2htpRX7jYnAyTRjP2CsXQdo9SAM8g3ifxWPSV0HnClSn71xwctr0U3oZIIH+dtbfmnbXVQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.1.tgz", + "integrity": "sha512-RMMXx4ws+Gbvw3DfLSuo2cfQlK7IwGbpuEWXCqyYDcqYTI+9Ju3a5hDnXaxjNsa6uKh9PQF2v+qg+RLe63tz5A==", "dev": true, "dependencies": { - "@jest/fake-timers": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/fake-timers": "^29.6.1", + "@jest/types": "^29.6.1", "@types/node": "*", - "jest-mock": "^29.5.0" + "jest-mock": "^29.6.1" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.5.0.tgz", - "integrity": "sha512-PueDR2HGihN3ciUNGr4uelropW7rqUfTiOn+8u0leg/42UhblPxHkfoh0Ruu3I9Y1962P3u2DY4+h7GVTSVU6g==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.1.tgz", + "integrity": "sha512-N5xlPrAYaRNyFgVf2s9Uyyvr795jnB6rObuPx4QFvNJz8aAjpZUDfO4bh5G/xuplMID8PrnuF1+SfSyDxhsgYg==", "dev": true, "dependencies": { - "expect": "^29.5.0", - "jest-snapshot": "^29.5.0" + "expect": "^29.6.1", + "jest-snapshot": "^29.6.1" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect-utils": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.5.0.tgz", - "integrity": "sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.1.tgz", + "integrity": "sha512-o319vIf5pEMx0LmzSxxkYYxo4wrRLKHq9dP1yJU7FoPTB0LfAKSz8SWD6D/6U3v/O52t9cF5t+MeJiRsfk7zMw==", "dev": true, "dependencies": { "jest-get-type": "^29.4.3" @@ -1224,50 +1253,59 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/@jest/expect-utils/node_modules/jest-get-type": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz", + "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, "node_modules/@jest/fake-timers": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.5.0.tgz", - "integrity": "sha512-9ARvuAAQcBwDAqOnglWq2zwNIRUDtk/SCkp/ToGEhFv5r86K21l+VEs0qNTaXtyiY0lEePl3kylijSYJQqdbDg==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.1.tgz", + "integrity": "sha512-RdgHgbXyosCDMVYmj7lLpUwXA4c69vcNzhrt69dJJdf8azUrpRh3ckFCaTPNjsEeRi27Cig0oKDGxy5j7hOgHg==", "dev": true, "dependencies": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.1", "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", - "jest-message-util": "^29.5.0", - "jest-mock": "^29.5.0", - "jest-util": "^29.5.0" + "jest-message-util": "^29.6.1", + "jest-mock": "^29.6.1", + "jest-util": "^29.6.1" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/globals": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.5.0.tgz", - "integrity": "sha512-S02y0qMWGihdzNbUiqSAiKSpSozSuHX5UYc7QbnHP+D9Lyw8DgGGCinrN9uSuHPeKgSSzvPom2q1nAtBvUsvPQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.1.tgz", + "integrity": "sha512-2VjpaGy78JY9n9370H8zGRCFbYVWwjY6RdDMhoJHa1sYfwe6XM/azGN0SjY8kk7BOZApIejQ1BFPyH7FPG0w3A==", "dev": true, "dependencies": { - "@jest/environment": "^29.5.0", - "@jest/expect": "^29.5.0", - "@jest/types": "^29.5.0", - "jest-mock": "^29.5.0" + "@jest/environment": "^29.6.1", + "@jest/expect": "^29.6.1", + "@jest/types": "^29.6.1", + "jest-mock": "^29.6.1" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/reporters": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.5.0.tgz", - "integrity": "sha512-D05STXqj/M8bP9hQNSICtPqz97u7ffGzZu+9XLucXhkOFBqKcXe04JLZOgIekOxdb73MAoBUFnqvf7MCpKk5OA==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.1.tgz", + "integrity": "sha512-9zuaI9QKr9JnoZtFQlw4GREQbxgmNYXU6QuWtmuODvk5nvPUeBYapVR/VYMyi2WSx3jXTLJTJji8rN6+Cm4+FA==", "dev": true, "dependencies": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", - "@jridgewell/trace-mapping": "^0.3.15", + "@jest/console": "^29.6.1", + "@jest/test-result": "^29.6.1", + "@jest/transform": "^29.6.1", + "@jest/types": "^29.6.1", + "@jridgewell/trace-mapping": "^0.3.18", "@types/node": "*", "chalk": "^4.0.0", "collect-v8-coverage": "^1.0.0", @@ -1279,9 +1317,9 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.5.0", - "jest-util": "^29.5.0", - "jest-worker": "^29.5.0", + "jest-message-util": "^29.6.1", + "jest-util": "^29.6.1", + "jest-worker": "^29.6.1", "slash": "^3.0.0", "string-length": "^4.0.1", "strip-ansi": "^6.0.0", @@ -1299,50 +1337,25 @@ } } }, - "node_modules/@jest/reporters/node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dev": true, - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/reporters/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@jest/schemas": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", - "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.0.tgz", + "integrity": "sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==", "dev": true, "dependencies": { - "@sinclair/typebox": "^0.25.16" + "@sinclair/typebox": "^0.27.8" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/source-map": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.4.3.tgz", - "integrity": "sha512-qyt/mb6rLyd9j1jUts4EQncvS6Yy3PM9HghnNv86QBlV+zdL2inCdK1tuVlL+J+lpiw2BI67qXOrX3UurBqQ1w==", + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.0.tgz", + "integrity": "sha512-oA+I2SHHQGxDCZpbrsCQSoMLb3Bz547JnM+jUr9qEbuw0vQlWZfpPS7CO9J7XiwKicEz9OFn/IYoLkkiUD7bzA==", "dev": true, "dependencies": { - "@jridgewell/trace-mapping": "^0.3.15", + "@jridgewell/trace-mapping": "^0.3.18", "callsites": "^3.0.0", "graceful-fs": "^4.2.9" }, @@ -1351,13 +1364,13 @@ } }, "node_modules/@jest/test-result": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.5.0.tgz", - "integrity": "sha512-fGl4rfitnbfLsrfx1uUpDEESS7zM8JdgZgOCQuxQvL1Sn/I6ijeAVQWGfXI9zb1i9Mzo495cIpVZhA0yr60PkQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.1.tgz", + "integrity": "sha512-Ynr13ZRcpX6INak0TPUukU8GWRfm/vAytE3JbJNGAvINySWYdfE7dGZMbk36oVuK4CigpbhMn8eg1dixZ7ZJOw==", "dev": true, "dependencies": { - "@jest/console": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/console": "^29.6.1", + "@jest/types": "^29.6.1", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" }, @@ -1366,14 +1379,14 @@ } }, "node_modules/@jest/test-sequencer": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.5.0.tgz", - "integrity": "sha512-yPafQEcKjkSfDXyvtgiV4pevSeyuA6MQr6ZIdVkWJly9vkqjnFfcfhRQqpD5whjoU8EORki752xQmjaqoFjzMQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.1.tgz", + "integrity": "sha512-oBkC36PCDf/wb6dWeQIhaviU0l5u6VCsXa119yqdUosYAt7/FbQU2M2UoziO3igj/HBDEgp57ONQ3fm0v9uyyg==", "dev": true, "dependencies": { - "@jest/test-result": "^29.5.0", + "@jest/test-result": "^29.6.1", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.5.0", + "jest-haste-map": "^29.6.1", "slash": "^3.0.0" }, "engines": { @@ -1381,22 +1394,22 @@ } }, "node_modules/@jest/transform": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.5.0.tgz", - "integrity": "sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.1.tgz", + "integrity": "sha512-URnTneIU3ZjRSaf906cvf6Hpox3hIeJXRnz3VDSw5/X93gR8ycdfSIEy19FlVx8NFmpN7fe3Gb1xF+NjXaQLWg==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", - "@jest/types": "^29.5.0", - "@jridgewell/trace-mapping": "^0.3.15", + "@jest/types": "^29.6.1", + "@jridgewell/trace-mapping": "^0.3.18", "babel-plugin-istanbul": "^6.1.1", "chalk": "^4.0.0", "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.5.0", + "jest-haste-map": "^29.6.1", "jest-regex-util": "^29.4.3", - "jest-util": "^29.5.0", + "jest-util": "^29.6.1", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", @@ -1412,26 +1425,13 @@ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true }, - "node_modules/@jest/transform/node_modules/write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, "node_modules/@jest/types": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.5.0.tgz", - "integrity": "sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.1.tgz", + "integrity": "sha512-tPKQNMPuXgvdOn2/Lg9HNfUvjYVGolt04Hp03f5hAk878uwOLikN+JzeLY0HcVgKgFl9Hs3EIqpu3WX27XNhnw==", "dev": true, "dependencies": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.0", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", @@ -1443,13 +1443,14 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", "dev": true, "dependencies": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" }, "engines": { "node": ">=6.0.0" @@ -1474,33 +1475,19 @@ } }, "node_modules/@jridgewell/source-map": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.3.tgz", - "integrity": "sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", "dev": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" } }, - "node_modules/@jridgewell/source-map/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", "dev": true }, "node_modules/@jridgewell/trace-mapping": { @@ -1513,6 +1500,12 @@ "@jridgewell/sourcemap-codec": "1.4.14" } }, + "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, "node_modules/@jsep-plugin/regex": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@jsep-plugin/regex/-/regex-1.0.3.tgz", @@ -1585,27 +1578,27 @@ "dev": true }, "node_modules/@sinclair/typebox": { - "version": "0.25.24", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", - "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==", + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", "dev": true }, "node_modules/@sinonjs/commons": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", - "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", + "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", "dev": true, "dependencies": { "type-detect": "4.0.8" } }, "node_modules/@sinonjs/fake-timers": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz", - "integrity": "sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dev": true, "dependencies": { - "@sinonjs/commons": "^2.0.0" + "@sinonjs/commons": "^3.0.0" } }, "node_modules/@stoplight/better-ajv-errors": { @@ -1624,9 +1617,9 @@ } }, "node_modules/@stoplight/json": { - "version": "3.20.2", - "resolved": "https://registry.npmjs.org/@stoplight/json/-/json-3.20.2.tgz", - "integrity": "sha512-e3Eb/DdLSpJVAsxAG1jKSnl4TVZLl2pH8KsJBWKf5GPCeI58Eo0ZpRTX3HcZ0gBaHWH6CnEHJkCRCONhoFbDIA==", + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/@stoplight/json/-/json-3.21.0.tgz", + "integrity": "sha512-5O0apqJ/t4sIevXCO3SBN9AHCEKKR/Zb4gaj7wYe5863jme9g02Q0n/GhM7ZCALkL+vGPTe4ZzTETP8TFtsw3g==", "dependencies": { "@stoplight/ordered-object-literal": "^1.0.3", "@stoplight/path": "^1.3.2", @@ -1657,11 +1650,11 @@ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, "node_modules/@stoplight/json-ref-resolver": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@stoplight/json-ref-resolver/-/json-ref-resolver-3.1.5.tgz", - "integrity": "sha512-uaKLITor7UF+JBtI84zs3aOWM0L79zp7w9TrBTwPtx5SLbaQQ4HadDKgX5yhFOLMApLdhwhiftF4c0GFanOxGg==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@stoplight/json-ref-resolver/-/json-ref-resolver-3.1.6.tgz", + "integrity": "sha512-YNcWv3R3n3U6iQYBsFOiWSuRGE5su1tJSiX6pAPRVk7dP0L7lqCteXGzuVRQ0gMZqUl8v1P0+fAKxF6PLo9B5A==", "dependencies": { - "@stoplight/json": "^3.17.0", + "@stoplight/json": "^3.21.0", "@stoplight/path": "^1.3.2", "@stoplight/types": "^12.3.0 || ^13.0.0", "@types/urijs": "^1.19.19", @@ -1669,7 +1662,7 @@ "fast-memoize": "^2.5.2", "immer": "^9.0.6", "lodash": "^4.17.21", - "tslib": "^2.3.1", + "tslib": "^2.6.0", "urijs": "^1.19.11" }, "engines": { @@ -1693,12 +1686,12 @@ } }, "node_modules/@stoplight/spectral-core": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/@stoplight/spectral-core/-/spectral-core-1.17.0.tgz", - "integrity": "sha512-7D9og+iX2bCJMGPY7cvt2YdevFGDeSI7S2jPo7HWeGGitkef1FDSQ9AEapdwmCYvOJ7ztUlQdCCLTOb6Aani8w==", + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/@stoplight/spectral-core/-/spectral-core-1.18.2.tgz", + "integrity": "sha512-bjNXo0VzXTDdFB3oKvVCAHW5rJ1/eMQzN6k1N5RW8tdEXMcEnI56MByRzADniVa+SvrutApK2u+9XwUZtIIT3w==", "dependencies": { "@stoplight/better-ajv-errors": "1.0.3", - "@stoplight/json": "~3.20.1", + "@stoplight/json": "~3.21.0", "@stoplight/path": "1.3.2", "@stoplight/spectral-parsers": "^1.0.0", "@stoplight/spectral-ref-resolver": "^1.0.0", @@ -1779,17 +1772,17 @@ } }, "node_modules/@stoplight/spectral-parsers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@stoplight/spectral-parsers/-/spectral-parsers-1.0.2.tgz", - "integrity": "sha512-ZQXknJ+BM5Re4Opj4cgVlHgG2qyOk/wznKJq3Vf1qsBEg2CNzN0pJmSB0deRqW0kArqm44qpb8c+cz3F2rgMtw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@stoplight/spectral-parsers/-/spectral-parsers-1.0.3.tgz", + "integrity": "sha512-J0KW5Rh5cHWnJQ3yN+cr/ijNFVirPSR0pkQbdrNX30VboEl083UEDrQ3yov9kjLVIWEk9t9kKE7Eo3QT/k4JLA==", "dependencies": { - "@stoplight/json": "~3.20.1", + "@stoplight/json": "~3.21.0", "@stoplight/types": "^13.6.0", "@stoplight/yaml": "~4.2.3", "tslib": "^2.3.1" }, "engines": { - "node": ">=12" + "node": "^12.20 || >=14.13" } }, "node_modules/@stoplight/spectral-ref-resolver": { @@ -1837,9 +1830,9 @@ } }, "node_modules/@stoplight/types": { - "version": "13.12.0", - "resolved": "https://registry.npmjs.org/@stoplight/types/-/types-13.12.0.tgz", - "integrity": "sha512-lpyB8b5cNcg/CyQ9W7Q2BxPkHhBA8+9byviGT6uL2Ok/5iao0poCnFUH++Cd7VN1/RaXrv0LT9fyOg4fJIl0iA==", + "version": "13.15.0", + "resolved": "https://registry.npmjs.org/@stoplight/types/-/types-13.15.0.tgz", + "integrity": "sha512-pBLjVRrWGVd+KzTbL3qrmufSKIEp0UfziDBdt/nrTHPKrlrtVwaHdrrQMcpM23yJDU1Wcg4cHvhIuGtKCT5OmA==", "dependencies": { "@types/json-schema": "^7.0.4", "utility-types": "^3.10.0" @@ -1868,9 +1861,9 @@ "integrity": "sha512-sV+51I7WYnLJnKPn2EMWgS4EUfoP4iWEbrWwbXsj0MZCB/xOK8j6+C9fntIdOM50kpx45ZLC3s6kwKivWuqvyg==" }, "node_modules/@swc/core": { - "version": "1.3.52", - "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.3.52.tgz", - "integrity": "sha512-2LOkkl5Ebyzg1e2pu/tqz5zAAiNAtSR99KZDJz4+FTpo6lYwr+SRkeXSNFrYAReHBMb5VJoimrLDLHJ2X1E7Lg==", + "version": "1.3.69", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.3.69.tgz", + "integrity": "sha512-Khc/DE9D5+2tYTHgAIp5DZARbs8kldWg3b0Jp6l8FQLjelcLFmlQWSwKhVZrgv4oIbgZydIp8jInsvTalMHqnQ==", "dev": true, "hasInstallScript": true, "engines": { @@ -1881,16 +1874,16 @@ "url": "https://opencollective.com/swc" }, "optionalDependencies": { - "@swc/core-darwin-arm64": "1.3.52", - "@swc/core-darwin-x64": "1.3.52", - "@swc/core-linux-arm-gnueabihf": "1.3.52", - "@swc/core-linux-arm64-gnu": "1.3.52", - "@swc/core-linux-arm64-musl": "1.3.52", - "@swc/core-linux-x64-gnu": "1.3.52", - "@swc/core-linux-x64-musl": "1.3.52", - "@swc/core-win32-arm64-msvc": "1.3.52", - "@swc/core-win32-ia32-msvc": "1.3.52", - "@swc/core-win32-x64-msvc": "1.3.52" + "@swc/core-darwin-arm64": "1.3.69", + "@swc/core-darwin-x64": "1.3.69", + "@swc/core-linux-arm-gnueabihf": "1.3.69", + "@swc/core-linux-arm64-gnu": "1.3.69", + "@swc/core-linux-arm64-musl": "1.3.69", + "@swc/core-linux-x64-gnu": "1.3.69", + "@swc/core-linux-x64-musl": "1.3.69", + "@swc/core-win32-arm64-msvc": "1.3.69", + "@swc/core-win32-ia32-msvc": "1.3.69", + "@swc/core-win32-x64-msvc": "1.3.69" }, "peerDependencies": { "@swc/helpers": "^0.5.0" @@ -1902,9 +1895,9 @@ } }, "node_modules/@swc/core-darwin-arm64": { - "version": "1.3.52", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.52.tgz", - "integrity": "sha512-Y+4YDN7mAhMgqLVMjpIOagFg93uWdQRsJXd3NAXo24CAJXLBuXsiXQdJVdhGavQkF0+NuhFSTGrzB8TknzWQkg==", + "version": "1.3.69", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.69.tgz", + "integrity": "sha512-IjZTf12zIPWkV3D7toaLDoJPSkLhQ4fDH8G6/yCJUI27cBFOI3L8LXqptYmISoN5yYdrcnNpdqdapD09JPuNJg==", "cpu": [ "arm64" ], @@ -1918,9 +1911,9 @@ } }, "node_modules/@swc/core-darwin-x64": { - "version": "1.3.52", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.3.52.tgz", - "integrity": "sha512-XbvBA+DwTedleh/smYA6E1Z1L1tVnF+ULhpszAAW4YYDzH47R73ucCdcSH/aHs4swv+uyvRquKoDtTTNZFvD4A==", + "version": "1.3.69", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.3.69.tgz", + "integrity": "sha512-/wBO0Rn5oS5dJI/L9kJRkPAdksVwl5H9nleW/NM3A40N98VV8T7h/i1nO051mxIjq0R6qXVGOWFbBoLrPYucJg==", "cpu": [ "x64" ], @@ -1934,9 +1927,9 @@ } }, "node_modules/@swc/core-linux-arm-gnueabihf": { - "version": "1.3.52", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.52.tgz", - "integrity": "sha512-YRTLjZcoGH09q0vjg5s6vxOryzAGlMx2Ly6Hq8+8ruBtG3QTsCN3y7MI8mX254xdFCJiTX5YwQheGjRXS7FF9A==", + "version": "1.3.69", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.69.tgz", + "integrity": "sha512-NShCjMv6Xn8ckMKBRqmprXvUF14+jXY0TcNKXwjYErzoIUFOnG72M36HxT4QEeAtKZ4Eg4CZFE4zlJ27fDp1gg==", "cpu": [ "arm" ], @@ -1950,9 +1943,9 @@ } }, "node_modules/@swc/core-linux-arm64-gnu": { - "version": "1.3.52", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.52.tgz", - "integrity": "sha512-B0HKtj0XpqpqflGKMxFlyXyORN0xshF8TVzUBD/2FgF7o8fE2RM1eqtdf1EzmZTT1hwxLpJXrEj+0gSXfWPW4A==", + "version": "1.3.69", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.69.tgz", + "integrity": "sha512-VRPOJj4idopSHIj1bOVXX0SgaB18R8yZNunb7eXS5ZcjVxAcdvqyIz3RdQX1zaJFCGzcdPLzBRP32DZWWGE8Ng==", "cpu": [ "arm64" ], @@ -1966,9 +1959,9 @@ } }, "node_modules/@swc/core-linux-arm64-musl": { - "version": "1.3.52", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.52.tgz", - "integrity": "sha512-GCxNjTAborAmv4VV1AMZLyejHLGgIzu13tvLUFqybtU4jFxVbE2ZK4ZnPCfDlWN+eBwyRWk1oNFR2hH+66vaUQ==", + "version": "1.3.69", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.69.tgz", + "integrity": "sha512-QxeSiZqo5x1X8vq8oUWLibq+IZJcxl9vy0sLUmzdjF2b/Z+qxKP3gutxnb2tzJaHqPVBbEZaILERIGy1qWdumQ==", "cpu": [ "arm64" ], @@ -1982,9 +1975,9 @@ } }, "node_modules/@swc/core-linux-x64-gnu": { - "version": "1.3.52", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.52.tgz", - "integrity": "sha512-mrvDBSkLI3Mza2qcu3uzB5JGwMBYDb1++UQ1VB0RXf2AR21/cCper4P44IpfdeqFz9XyXq18Sh3gblICUCGvig==", + "version": "1.3.69", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.69.tgz", + "integrity": "sha512-b+DUlVxYox3BwD3PyTwhLvqtu6TYZtW+S6O0FnttH11o4skHN0XyJ/cUZSI0X2biSmfDsizRDUt1PWPFM+F7SA==", "cpu": [ "x64" ], @@ -1998,9 +1991,9 @@ } }, "node_modules/@swc/core-linux-x64-musl": { - "version": "1.3.52", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.52.tgz", - "integrity": "sha512-r9RIvKUQv7yBkpXz+QxPAucdoj8ymBlgIm5rLE0b5VmU7dlKBnpAmRBYaITdH6IXhF0pwuG+FHAd5elBcrkIwA==", + "version": "1.3.69", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.69.tgz", + "integrity": "sha512-QXjsI+f8n9XPZHUvmGgkABpzN4M9kdSbhqBOZmv3o0AsDGNCA4uVowQqgZoPFAqlJTpwHeDmrv5sQ13HN+LOGw==", "cpu": [ "x64" ], @@ -2014,9 +2007,9 @@ } }, "node_modules/@swc/core-win32-arm64-msvc": { - "version": "1.3.52", - "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.52.tgz", - "integrity": "sha512-YRtEr7tDo0Wes3M2ZhigF4erUjWBXeFP+O+iz6ELBBmPG7B7m/lrA21eiW9/90YGnzi0iNo46shK6PfXuPhP+Q==", + "version": "1.3.69", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.69.tgz", + "integrity": "sha512-wn7A8Ws1fyviuCUB2Vg6IotiZeuqiO1Mz3d+YDae2EYyNpj1kNHvjBip8GHkfGzZG+jVrvG6NHsDo0KO/pGb8A==", "cpu": [ "arm64" ], @@ -2030,9 +2023,9 @@ } }, "node_modules/@swc/core-win32-ia32-msvc": { - "version": "1.3.52", - "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.52.tgz", - "integrity": "sha512-t1x6EdYg3nnnmZBkEtmdXwGpVFTnkNCYyTILcn4367tKI6NpcNe75tz6wBUZAWAmol6Bn75je9KHDNC9uBcO2A==", + "version": "1.3.69", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.69.tgz", + "integrity": "sha512-LsFBXtXqxEcVaaOGEZ9X3qdMzobVoJqKv8DnksuDsWcBk+9WCeTz2u/iB+7yZ2HGuPXkCqTRqhFo6FX9aC00kQ==", "cpu": [ "ia32" ], @@ -2046,9 +2039,9 @@ } }, "node_modules/@swc/core-win32-x64-msvc": { - "version": "1.3.52", - "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.52.tgz", - "integrity": "sha512-ef0KzcHxWgRii0EyUlgzNA0ycqaRRKxSb6QCO9Ev3tib4SSjbPy0MAndU7f82Ndm/pPmXT+7cciRtZ083vzjZA==", + "version": "1.3.69", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.69.tgz", + "integrity": "sha512-ieBscU0gUgKjaseFI07tAaGqHvKyweNknPeSYEZOasVZUczhD6fK2GRnVREhv2RB2qdKC/VGFBsgRDMgzq1VLw==", "cpu": [ "x64" ], @@ -2102,15 +2095,15 @@ "dev": true }, "node_modules/@tsconfig/node16": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", - "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", "dev": true }, "node_modules/@types/babel__core": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.0.tgz", - "integrity": "sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==", + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.1.tgz", + "integrity": "sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==", "dev": true, "dependencies": { "@babel/parser": "^7.20.7", @@ -2140,12 +2133,12 @@ } }, "node_modules/@types/babel__traverse": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.3.tgz", - "integrity": "sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==", + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.1.tgz", + "integrity": "sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==", "dev": true, "dependencies": { - "@babel/types": "^7.3.0" + "@babel/types": "^7.20.7" } }, "node_modules/@types/es-aggregate-error": { @@ -2156,10 +2149,15 @@ "@types/node": "*" } }, + "node_modules/@types/es-aggregate-error/node_modules/@types/node": { + "version": "20.4.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.4.2.tgz", + "integrity": "sha512-Dd0BYtWgnWJKwO1jkmTrzofjK2QXXcai0dmtzvIBhcA+RsG5h8R3xlyta0kGOZRNfL9GuRtb1knmPEhQrePCEw==" + }, "node_modules/@types/eslint": { - "version": "8.37.0", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.37.0.tgz", - "integrity": "sha512-Piet7dG2JBuDIfohBngQ3rCt7MgO9xCO4xIMKxBThCq5PNRB91IjlJ10eJVwfoNtvTErmxLzwBZ7rHZtbOMmFQ==", + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.0.tgz", + "integrity": "sha512-gsF+c/0XOguWgaOgvFs+xnnRqt9GwgTvIks36WpE6ueeI4KCEHHd8K/CKHqhOqrJKsYH8m27kRzQEvWXAwXUTw==", "dev": true, "dependencies": { "@types/estree": "*", @@ -2232,9 +2230,9 @@ "dev": true }, "node_modules/@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==" + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==" }, "node_modules/@types/json5": { "version": "0.0.29", @@ -2243,14 +2241,15 @@ "dev": true }, "node_modules/@types/node": { - "version": "18.16.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.1.tgz", - "integrity": "sha512-DZxSZWXxFfOlx7k7Rv4LAyiMroaxa3Ly/7OOzZO8cBNho0YzAi4qlbrx8W27JGqG57IgR/6J7r+nOJWw6kcvZA==" + "version": "18.16.19", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.19.tgz", + "integrity": "sha512-IXl7o+R9iti9eBW4Wg2hx1xQDig183jj7YLn8F7udNceyfkbn1ZxmzZXuak20gR40D7pIkIY1kYGx5VIGbaHKA==", + "dev": true }, "node_modules/@types/node-fetch": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.3.tgz", - "integrity": "sha512-ETTL1mOEdq/sxUtgtOhKjyB2Irra4cjxksvcMUR5Zr4n+PxVhsCD9WS46oPbHL3et9Zde7CNRr+WUNlcHvsX+w==", + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.4.tgz", + "integrity": "sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg==", "dev": true, "dependencies": { "@types/node": "*", @@ -2258,15 +2257,15 @@ } }, "node_modules/@types/prettier": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz", - "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==", + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", + "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", "dev": true }, "node_modules/@types/semver": { - "version": "7.3.13", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", - "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", "dev": true }, "node_modules/@types/stack-utils": { @@ -2306,17 +2305,17 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.0.tgz", - "integrity": "sha512-p0QgrEyrxAWBecR56gyn3wkG15TJdI//eetInP3zYRewDh0XS+DhB3VUAd3QqvziFsfaQIoIuZMxZRB7vXYaYw==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", + "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.59.0", - "@typescript-eslint/type-utils": "5.59.0", - "@typescript-eslint/utils": "5.59.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/type-utils": "5.62.0", + "@typescript-eslint/utils": "5.62.0", "debug": "^4.3.4", - "grapheme-splitter": "^1.0.4", + "graphemer": "^1.4.0", "ignore": "^5.2.0", "natural-compare-lite": "^1.4.0", "semver": "^7.3.7", @@ -2340,14 +2339,14 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.0.tgz", - "integrity": "sha512-qK9TZ70eJtjojSUMrrEwA9ZDQ4N0e/AuoOIgXuNBorXYcBDk397D2r5MIe1B3cok/oCtdNC5j+lUUpVB+Dpb+w==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", + "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.59.0", - "@typescript-eslint/types": "5.59.0", - "@typescript-eslint/typescript-estree": "5.59.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", "debug": "^4.3.4" }, "engines": { @@ -2367,13 +2366,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.0.tgz", - "integrity": "sha512-tsoldKaMh7izN6BvkK6zRMINj4Z2d6gGhO2UsI8zGZY3XhLq1DndP3Ycjhi1JwdwPRwtLMW4EFPgpuKhbCGOvQ==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.0", - "@typescript-eslint/visitor-keys": "5.59.0" + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -2384,13 +2383,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.0.tgz", - "integrity": "sha512-d/B6VSWnZwu70kcKQSCqjcXpVH+7ABKH8P1KNn4K7j5PXXuycZTPXF44Nui0TEm6rbWGi8kc78xRgOC4n7xFgA==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", + "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.59.0", - "@typescript-eslint/utils": "5.59.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "@typescript-eslint/utils": "5.62.0", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -2411,9 +2410,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.0.tgz", - "integrity": "sha512-yR2h1NotF23xFFYKHZs17QJnB51J/s+ud4PYU4MqdZbzeNxpgUr05+dNeCN/bb6raslHvGdd6BFCkVhpPk/ZeA==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -2424,13 +2423,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.0.tgz", - "integrity": "sha512-sUNnktjmI8DyGzPdZ8dRwW741zopGxltGs/SAPgGL/AAgDpiLsCFLcMNSpbfXfmnNeHmK9h3wGmCkGRGAoUZAg==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.0", - "@typescript-eslint/visitor-keys": "5.59.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -2451,17 +2450,17 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.0.tgz", - "integrity": "sha512-GGLFd+86drlHSvPgN/el6dRQNYYGOvRSDVydsUaQluwIW3HvbXuxyuD5JETvBt/9qGYe+lOrDk6gRrWOHb/FvA==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.59.0", - "@typescript-eslint/types": "5.59.0", - "@typescript-eslint/typescript-estree": "5.59.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", "eslint-scope": "^5.1.1", "semver": "^7.3.7" }, @@ -2477,12 +2476,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.0.tgz", - "integrity": "sha512-qZ3iXxQhanchCeaExlKPV3gDQFxMUmU35xfd5eCXB6+kUw1TUAbIy2n7QIrwz9s98DQLzNWyHp61fY0da4ZcbA==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.0", + "@typescript-eslint/types": "5.62.0", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -2494,148 +2493,148 @@ } }, "node_modules/@webassemblyjs/ast": { - "version": "1.11.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.5.tgz", - "integrity": "sha512-LHY/GSAZZRpsNQH+/oHqhRQ5FT7eoULcBqgfyTB5nQHogFnK3/7QoN7dLnwSE/JkUAF0SrRuclT7ODqMFtWxxQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", + "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", "dev": true, "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.5", - "@webassemblyjs/helper-wasm-bytecode": "1.11.5" + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" } }, "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.5.tgz", - "integrity": "sha512-1j1zTIC5EZOtCplMBG/IEwLtUojtwFVwdyVMbL/hwWqbzlQoJsWCOavrdnLkemwNoC/EOwtUFch3fuo+cbcXYQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", "dev": true }, "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.5.tgz", - "integrity": "sha512-L65bDPmfpY0+yFrsgz8b6LhXmbbs38OnwDCf6NpnMUYqa+ENfE5Dq9E42ny0qz/PdR0LJyq/T5YijPnU8AXEpA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", "dev": true }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.5.tgz", - "integrity": "sha512-fDKo1gstwFFSfacIeH5KfwzjykIE6ldh1iH9Y/8YkAZrhmu4TctqYjSh7t0K2VyDSXOZJ1MLhht/k9IvYGcIxg==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", "dev": true }, "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.5.tgz", - "integrity": "sha512-DhykHXM0ZABqfIGYNv93A5KKDw/+ywBFnuWybZZWcuzWHfbp21wUfRkbtz7dMGwGgT4iXjWuhRMA2Mzod6W4WA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", "dev": true, "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.5", - "@webassemblyjs/helper-api-error": "1.11.5", + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.5.tgz", - "integrity": "sha512-oC4Qa0bNcqnjAowFn7MPCETQgDYytpsfvz4ujZz63Zu/a/v71HeCAAmZsgZ3YVKec3zSPYytG3/PrRCqbtcAvA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", "dev": true }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.5.tgz", - "integrity": "sha512-uEoThA1LN2NA+K3B9wDo3yKlBfVtC6rh0i4/6hvbz071E8gTNZD/pT0MsBf7MeD6KbApMSkaAK0XeKyOZC7CIA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", + "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.5", - "@webassemblyjs/helper-buffer": "1.11.5", - "@webassemblyjs/helper-wasm-bytecode": "1.11.5", - "@webassemblyjs/wasm-gen": "1.11.5" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" } }, "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.5.tgz", - "integrity": "sha512-37aGq6qVL8A8oPbPrSGMBcp38YZFXcHfiROflJn9jxSdSMMM5dS5P/9e2/TpaJuhE+wFrbukN2WI6Hw9MH5acg==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", "dev": true, "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "node_modules/@webassemblyjs/leb128": { - "version": "1.11.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.5.tgz", - "integrity": "sha512-ajqrRSXaTJoPW+xmkfYN6l8VIeNnR4vBOTQO9HzR7IygoCcKWkICbKFbVTNMjMgMREqXEr0+2M6zukzM47ZUfQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", "dev": true, "dependencies": { "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/utf8": { - "version": "1.11.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.5.tgz", - "integrity": "sha512-WiOhulHKTZU5UPlRl53gHR8OxdGsSOxqfpqWeA2FmcwBMaoEdz6b2x2si3IwC9/fSPLfe8pBMRTHVMk5nlwnFQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", "dev": true }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.5.tgz", - "integrity": "sha512-C0p9D2fAu3Twwqvygvf42iGCQ4av8MFBLiTb+08SZ4cEdwzWx9QeAHDo1E2k+9s/0w1DM40oflJOpkZ8jW4HCQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", + "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.5", - "@webassemblyjs/helper-buffer": "1.11.5", - "@webassemblyjs/helper-wasm-bytecode": "1.11.5", - "@webassemblyjs/helper-wasm-section": "1.11.5", - "@webassemblyjs/wasm-gen": "1.11.5", - "@webassemblyjs/wasm-opt": "1.11.5", - "@webassemblyjs/wasm-parser": "1.11.5", - "@webassemblyjs/wast-printer": "1.11.5" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" } }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.5.tgz", - "integrity": "sha512-14vteRlRjxLK9eSyYFvw1K8Vv+iPdZU0Aebk3j6oB8TQiQYuO6hj9s4d7qf6f2HJr2khzvNldAFG13CgdkAIfA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", + "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.5", - "@webassemblyjs/helper-wasm-bytecode": "1.11.5", - "@webassemblyjs/ieee754": "1.11.5", - "@webassemblyjs/leb128": "1.11.5", - "@webassemblyjs/utf8": "1.11.5" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.5.tgz", - "integrity": "sha512-tcKwlIXstBQgbKy1MlbDMlXaxpucn42eb17H29rawYLxm5+MsEmgPzeCP8B1Cl69hCice8LeKgZpRUAPtqYPgw==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", + "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.5", - "@webassemblyjs/helper-buffer": "1.11.5", - "@webassemblyjs/wasm-gen": "1.11.5", - "@webassemblyjs/wasm-parser": "1.11.5" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.5.tgz", - "integrity": "sha512-SVXUIwsLQlc8srSD7jejsfTU83g7pIGr2YYNb9oHdtldSxaOhvA5xwvIiWIfcX8PlSakgqMXsLpLfbbJ4cBYew==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", + "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.5", - "@webassemblyjs/helper-api-error": "1.11.5", - "@webassemblyjs/helper-wasm-bytecode": "1.11.5", - "@webassemblyjs/ieee754": "1.11.5", - "@webassemblyjs/leb128": "1.11.5", - "@webassemblyjs/utf8": "1.11.5" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.5.tgz", - "integrity": "sha512-f7Pq3wvg3GSPUPzR0F6bmI89Hdb+u9WXrSKc4v+N0aV0q6r42WoF92Jp2jEorBEBRoRNXgjp53nBniDXcqZYPA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", + "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.5", + "@webassemblyjs/ast": "1.11.6", "@xtuc/long": "4.2.2" } }, @@ -2709,10 +2708,16 @@ "dot-parts": "~1.0.0" } }, + "node_modules/accessory/node_modules/balanced-match": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.2.1.tgz", + "integrity": "sha512-euSOvfze1jPOf85KQOmZ2UcWDJ/dUJukTJdj4o9ZZLyjl7IjdIyE4fAQRSuGrxAjB9nvvvrl4N3bPtRq+W+SyQ==", + "dev": true + }, "node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -2721,6 +2726,15 @@ "node": ">=0.4.0" } }, + "node_modules/acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "dev": true, + "peerDependencies": { + "acorn": "^8" + } + }, "node_modules/acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", @@ -2741,6 +2755,18 @@ "xtend": "^4.0.2" } }, + "node_modules/acorn-node/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/acorn-walk": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", @@ -2814,6 +2840,15 @@ } } }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, "node_modules/amdefine": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", @@ -2922,21 +2957,17 @@ "dev": true }, "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "node_modules/aria-query": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", - "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", "dev": true, "dependencies": { - "deep-equal": "^2.0.5" + "dequal": "^2.0.3" } }, "node_modules/array-buffer-byte-length": { @@ -3065,9 +3096,9 @@ "dev": true }, "node_modules/astring": { - "version": "1.8.4", - "resolved": "https://registry.npmjs.org/astring/-/astring-1.8.4.tgz", - "integrity": "sha512-97a+l2LBU3Op3bBQEff79i/E4jMD2ZLFD8rHx9B6mXyB2uQwhJQYfiDqUwtfjF4QA1F2qs//N6Cw8LetMbQjcw==", + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/astring/-/astring-1.8.6.tgz", + "integrity": "sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==", "bin": { "astring": "bin/astring" } @@ -3107,30 +3138,30 @@ } }, "node_modules/axe-core": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.0.tgz", - "integrity": "sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==", + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.2.tgz", + "integrity": "sha512-zIURGIS1E1Q4pcrMjp+nnEh+16G56eG/MUllJH8yEvw7asDo7Ac9uhC9KIH5jzpITueEZolfYglnCGIuSBz39g==", "dev": true, "engines": { "node": ">=4" } }, "node_modules/axobject-query": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.1.1.tgz", - "integrity": "sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz", + "integrity": "sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==", "dev": true, "dependencies": { - "deep-equal": "^2.0.5" + "dequal": "^2.0.3" } }, "node_modules/babel-jest": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.5.0.tgz", - "integrity": "sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.1.tgz", + "integrity": "sha512-qu+3bdPEQC6KZSPz+4Fyjbga5OODNcp49j6GKzG1EKbkfyJBxEYGVUmVGpwCSeGouG52R4EgYMLb6p9YeEEQ4A==", "dev": true, "dependencies": { - "@jest/transform": "^29.5.0", + "@jest/transform": "^29.6.1", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", "babel-preset-jest": "^29.5.0", @@ -3161,31 +3192,6 @@ "node": ">=8" } }, - "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dev": true, - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-istanbul/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/babel-plugin-jest-hoist": { "version": "29.5.0", "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.5.0.tgz", @@ -3241,10 +3247,9 @@ } }, "node_modules/balanced-match": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.2.1.tgz", - "integrity": "sha512-euSOvfze1jPOf85KQOmZ2UcWDJ/dUJukTJdj4o9ZZLyjl7IjdIyE4fAQRSuGrxAjB9nvvvrl4N3bPtRq+W+SyQ==", - "dev": true + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "node_modules/base64-js": { "version": "1.5.1", @@ -3302,9 +3307,9 @@ } }, "node_modules/bl/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, "dependencies": { "inherits": "^2.0.3", @@ -3330,11 +3335,6 @@ "concat-map": "0.0.1" } }, - "node_modules/brace-expansion/node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, "node_modules/braces": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", @@ -3347,18 +3347,6 @@ "node": ">=8" } }, - "node_modules/braces/node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/brorand": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", @@ -3501,9 +3489,9 @@ } }, "node_modules/browserify-shim": { - "version": "3.8.15", - "resolved": "https://registry.npmjs.org/browserify-shim/-/browserify-shim-3.8.15.tgz", - "integrity": "sha512-wACWQv56oVuxIID3JHFg2SCk40grlWUVX1QKKH14czQXE84WCOmbydcGKYt/IQZTGbBBzH+4uWr3wNNQRnak3Q==", + "version": "3.8.16", + "resolved": "https://registry.npmjs.org/browserify-shim/-/browserify-shim-3.8.16.tgz", + "integrity": "sha512-+Ap0xOKUC5Hz8sdUROxCJHgzA5IeU7pgUquCdlbBxyxkexzU4kpU6u1TsIvnFJcdx1bxO902J08AEjbMqDbA3g==", "dev": true, "dependencies": { "exposify": "~0.5.0", @@ -3571,10 +3559,16 @@ "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", "dev": true }, + "node_modules/browserify/node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", + "dev": true + }, "node_modules/browserslist": { - "version": "4.21.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", - "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "version": "4.21.9", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", + "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", "dev": true, "funding": [ { @@ -3584,13 +3578,17 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "caniuse-lite": "^1.0.30001400", - "electron-to-chromium": "^1.4.251", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.9" + "caniuse-lite": "^1.0.30001503", + "electron-to-chromium": "^1.4.431", + "node-releases": "^2.0.12", + "update-browserslist-db": "^1.0.11" }, "bin": { "browserslist": "cli.js" @@ -3682,9 +3680,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001414", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001414.tgz", - "integrity": "sha512-t55jfSaWjCdocnFdKQoO+d2ct9C59UZg4dY3OnUlSZ447r8pUtIKdp0hpAzrGFultmTC+Us+KpKi4GZl/LXlFg==", + "version": "1.0.30001515", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001515.tgz", + "integrity": "sha512-eEFDwUOZbE24sb+Ecsx3+OvNETqjWIdabMy52oOkIgcUtAsQifjUG9q4U9dgTHJM2mfk4uEPxc0+xuFdJ629QA==", "dev": true, "funding": [ { @@ -3694,6 +3692,10 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ] }, @@ -3763,9 +3765,9 @@ } }, "node_modules/cjs-module-lexer": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", - "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", + "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", "dev": true }, "node_modules/cliui": { @@ -3796,27 +3798,6 @@ "node": ">=6" } }, - "node_modules/clone-deep/node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/clone-deep/node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/clone-deep/node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -3851,9 +3832,9 @@ } }, "node_modules/collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", "dev": true }, "node_modules/color-convert": { @@ -4113,40 +4094,6 @@ "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", "dev": true }, - "node_modules/deep-equal": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.0.tgz", - "integrity": "sha512-RdpzE0Hv4lhowpIUKKMJfeH6C1pXdtT1/it80ubgWqwI3qpuxUBpC1S4hnHg+zjnuOoDkzUtUCEEkG+XG5l3Mw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "es-get-iterator": "^1.1.2", - "get-intrinsic": "^1.1.3", - "is-arguments": "^1.1.1", - "is-array-buffer": "^3.0.1", - "is-date-object": "^1.0.5", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "isarray": "^2.0.5", - "object-is": "^1.1.5", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", - "side-channel": "^1.0.4", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.9" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/deep-equal/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -4178,10 +4125,13 @@ } }, "node_modules/defined": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "integrity": "sha512-Y2caI5+ZwS5c3RiNDJ6u53VhQHv+hHKwhkI1iHvceKUHw9Df6EK2zRLfjejRgMuCuxK7PfSWIMwWecceVvThjQ==", - "dev": true + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz", + "integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/delayed-stream": { "version": "1.0.0", @@ -4215,10 +4165,19 @@ "deps-sort": "bin/cmd.js" } }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/des.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", - "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz", + "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==", "dev": true, "dependencies": { "inherits": "^2.0.1", @@ -4266,6 +4225,15 @@ "node": ">=0.8.0" } }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, "node_modules/diff-sequences": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", @@ -4316,6 +4284,15 @@ "node": ">=6.0.0" } }, + "node_modules/doctrine/node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/domain-browser": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", @@ -4348,9 +4325,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.268", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.268.tgz", - "integrity": "sha512-PO90Bv++vEzdln+eA9qLg1IRnh0rKETus6QkTzcFm5P3Wg3EQBZud5dcnzkpYXuIKWBjKe5CO8zjz02cicvn1g==", + "version": "1.4.460", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.460.tgz", + "integrity": "sha512-kKiHnbrHME7z8E6AYaw0ehyxY5+hdaRmeUbjBO22LZMdqTYCO29EvF0T1cQ3pJ1RN5fyMcHl1Lmcsdt9WWJpJQ==", "dev": true }, "node_modules/elliptic": { @@ -4387,9 +4364,9 @@ } }, "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "dev": true }, "node_modules/end-of-stream": { @@ -4402,9 +4379,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.13.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.13.0.tgz", - "integrity": "sha512-eyV8f0y1+bzyfh8xAwW/WTSZpLbjhqc4ne9eGSH4Zo2ejdyiNG9pU6mf9DG8a7+Auk6MFTlNOT4Y2y/9k8GKVg==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", "dev": true, "dependencies": { "graceful-fs": "^4.2.4", @@ -4415,9 +4392,9 @@ } }, "node_modules/envinfo": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", - "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.10.0.tgz", + "integrity": "sha512-ZtUjZO6l5mwTHvc1L9+1q5p/R3wTopcfqMW8r5t8SJSKqeVI/LtajORwRFEKpEFuekjD0VBjwu1HMxL4UalIRw==", "dev": true, "bin": { "envinfo": "dist/cli.js" @@ -4436,9 +4413,9 @@ } }, "node_modules/es-abstract": { - "version": "1.21.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz", - "integrity": "sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==", + "version": "1.21.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.3.tgz", + "integrity": "sha512-ZU4miiY1j3sGPFLJ34VJXEqhpmL+HGByCinGHv4HC+Fxl2fI2Z4yR6tl0mORnDr6PA8eihWo4LmSWDbvhALckg==", "dependencies": { "array-buffer-byte-length": "^1.0.0", "available-typed-arrays": "^1.0.5", @@ -4446,7 +4423,7 @@ "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.2.0", + "get-intrinsic": "^1.2.1", "get-symbol-description": "^1.0.0", "globalthis": "^1.0.3", "gopd": "^1.0.1", @@ -4466,14 +4443,15 @@ "object-inspect": "^1.12.3", "object-keys": "^1.1.1", "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", + "regexp.prototype.flags": "^1.5.0", "safe-regex-test": "^1.0.0", "string.prototype.trim": "^1.2.7", "string.prototype.trimend": "^1.0.6", "string.prototype.trimstart": "^1.0.6", + "typed-array-byte-offset": "^1.0.0", "typed-array-length": "^1.0.4", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.9" + "which-typed-array": "^1.1.10" }, "engines": { "node": ">= 0.4" @@ -4502,36 +4480,10 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/es-get-iterator": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", - "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "is-arguments": "^1.1.1", - "is-map": "^2.0.2", - "is-set": "^2.0.2", - "is-string": "^1.0.7", - "isarray": "^2.0.5", - "stop-iteration-iterator": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-get-iterator/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, "node_modules/es-module-lexer": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.2.1.tgz", - "integrity": "sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz", + "integrity": "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==", "dev": true }, "node_modules/es-set-tostringtag": { @@ -4582,15 +4534,12 @@ } }, "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.8.0" } }, "node_modules/escodegen": { @@ -4636,15 +4585,6 @@ "node": ">=0.4.0" } }, - "node_modules/escodegen/node_modules/esutils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-1.0.0.tgz", - "integrity": "sha512-x/iYH53X3quDwfHRz4y8rn4XcEwwCJeWsul9pF1zldMbGtgOtMNBEOuYWwB1EQlK2LRa1fev3YAgym/RElp5Cg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/escodegen/node_modules/source-map": { "version": "0.1.43", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", @@ -4659,16 +4599,16 @@ } }, "node_modules/eslint": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.38.0.tgz", - "integrity": "sha512-pIdsD2jwlUGf/U38Jv97t8lq6HpaU/G9NKbYmpWpZGw3LdTNhZLbJePqxOXGB5+JEKfOPU/XLxYxFh03nr1KTg==", + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.44.0.tgz", + "integrity": "sha512-0wpHoUbDUHgNCyvFB5aXLiQVfK9B0at6gUvzy83k4kAsQ/u769TQDX6iKC+aO4upIHO9WSaA3QoXYQDHbNwf1A==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.2", - "@eslint/js": "8.38.0", - "@humanwhocodes/config-array": "^0.11.8", + "@eslint/eslintrc": "^2.1.0", + "@eslint/js": "8.44.0", + "@humanwhocodes/config-array": "^0.11.10", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.10.0", @@ -4677,9 +4617,9 @@ "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-visitor-keys": "^3.4.0", - "espree": "^9.5.1", + "eslint-scope": "^7.2.0", + "eslint-visitor-keys": "^3.4.1", + "espree": "^9.6.0", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -4687,20 +4627,19 @@ "find-up": "^5.0.0", "glob-parent": "^6.0.2", "globals": "^13.19.0", - "grapheme-splitter": "^1.0.4", + "graphemer": "^1.4.0", "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.1", + "optionator": "^0.9.3", "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" @@ -4804,15 +4743,6 @@ "eslint": ">=4.19.1" } }, - "node_modules/eslint-plugin-eslint-comments/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/eslint-plugin-filenames": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/eslint-plugin-filenames/-/eslint-plugin-filenames-1.3.2.tgz", @@ -4829,15 +4759,15 @@ } }, "node_modules/eslint-plugin-github": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-github/-/eslint-plugin-github-4.7.0.tgz", - "integrity": "sha512-SIFSy6IXtN3aGQ6YyFWg/oxRUyAcYwg5G0wh+ov1HQCvmp+Pzs1GzeVjU8QcIQSSJfverQzuxWrJCAln/d2PuQ==", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-github/-/eslint-plugin-github-4.9.0.tgz", + "integrity": "sha512-c4jnJXJzHy8lzdYjOXlXcY7jX4b2ciGh+ugZM5b6vs6q2+m+6BrNl20u5WxloJvH6Q8CbZ0+Lnh7lDJxUd3WkQ==", "dev": true, "dependencies": { "@github/browserslist-config": "^1.0.0", "@typescript-eslint/eslint-plugin": "^5.1.0", "@typescript-eslint/parser": "^5.1.0", - "aria-query": "^5.1.3", + "aria-query": "^5.3.0", "eslint-config-prettier": ">=8.0.0", "eslint-plugin-escompat": "^3.3.3", "eslint-plugin-eslint-comments": "^3.2.0", @@ -4918,10 +4848,19 @@ "node": ">=0.10.0" } }, + "node_modules/eslint-plugin-import/node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/eslint-plugin-import/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -4957,16 +4896,10 @@ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" } }, - "node_modules/eslint-plugin-jsx-a11y/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, "node_modules/eslint-plugin-jsx-a11y/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -5003,9 +4936,9 @@ } }, "node_modules/eslint-plugin-security": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-security/-/eslint-plugin-security-1.5.0.tgz", - "integrity": "sha512-hAFVwLZ/UeXrlyVD2TDarv/x00CoFVpaY0IUZhKjPjiFxqkuQVixsK4f2rxngeQOqSxi6OUjzJM/jMwKEVjJ8g==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-security/-/eslint-plugin-security-1.7.1.tgz", + "integrity": "sha512-sMStceig8AFglhhT2LqlU5r+/fn9OwsA72O5bBuQVTssPCdQAOQzL+oMn/ZcpeUY6KcNfLJArgcrsSULNjYYdQ==", "dev": true, "dependencies": { "safe-regex": "^2.1.1" @@ -5046,9 +4979,9 @@ } }, "node_modules/eslint-visitor-keys": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz", - "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -5073,6 +5006,18 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/eslint/node_modules/eslint-scope": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", @@ -5098,6 +5043,15 @@ "node": ">=4.0" } }, + "node_modules/eslint/node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/eslint/node_modules/glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", @@ -5117,14 +5071,14 @@ "dev": true }, "node_modules/espree": { - "version": "9.5.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.1.tgz", - "integrity": "sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==", + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.0.tgz", + "integrity": "sha512-1FH/IiruXZ84tpUlm0aCUEwMl2Ho5ilqVh0VvQXw+byAz/4SAciyHLlfmL5WYqsvD38oymdUwBss0LtK8m4s/A==", "dev": true, "dependencies": { - "acorn": "^8.8.0", + "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.0" + "eslint-visitor-keys": "^3.4.1" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -5133,18 +5087,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/espree/node_modules/acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", @@ -5158,19 +5100,6 @@ "node": ">=4" } }, - "node_modules/esprima-fb": { - "version": "3001.1.0-dev-harmony-fb", - "resolved": "https://registry.npmjs.org/esprima-fb/-/esprima-fb-3001.0001.0000-dev-harmony-fb.tgz", - "integrity": "sha512-a3RFiCVBiy8KdO6q/C+8BQiP/sRk8XshBU3QHHDP8tNzjYwR3FKBOImu+PXfVhPoZL0JKtJLBAOWlDMCCFY8SQ==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/esquery": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", @@ -5223,9 +5152,9 @@ } }, "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-1.0.0.tgz", + "integrity": "sha512-x/iYH53X3quDwfHRz4y8rn4XcEwwCJeWsul9pF1zldMbGtgOtMNBEOuYWwB1EQlK2LRa1fev3YAgym/RElp5Cg==", "dev": true, "engines": { "node": ">=0.10.0" @@ -5302,17 +5231,46 @@ "node": ">=0.10.0" } }, - "node_modules/expect": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.5.0.tgz", - "integrity": "sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg==", + "node_modules/expand-range/node_modules/fill-range": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", + "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", "dev": true, "dependencies": { - "@jest/expect-utils": "^29.5.0", - "jest-get-type": "^29.4.3", - "jest-matcher-utils": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-util": "^29.5.0" + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^3.0.0", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-range/node_modules/is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha512-QUzH43Gfb9+5yckcrSA0VBDwEtDUchrk4F6tfJZQuNzDJbEDB9cZNzSfXGQ1jqmdDY/kl41lUOWM9syA8z8jlg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expect": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.1.tgz", + "integrity": "sha512-XEdDLonERCU1n9uR56/Stx9OqojaLAQtZf9PrCHH9Hl8YXiEIka3H4NXJ3NOIBmQJTg7+j7buh34PMHfJujc8g==", + "dev": true, + "dependencies": { + "@jest/expect-utils": "^29.6.1", + "@types/node": "*", + "jest-get-type": "^29.4.3", + "jest-matcher-utils": "^29.6.1", + "jest-message-util": "^29.6.1", + "jest-util": "^29.6.1" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -5340,42 +5298,51 @@ } }, "node_modules/expect/node_modules/jest-diff": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.5.0.tgz", - "integrity": "sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.1.tgz", + "integrity": "sha512-FsNCvinvl8oVxpNLttNQX7FAq7vR+gMDGj90tiP7siWw1UdakWUGqrylpsYrpvj908IYckm5Y0Q7azNAozU1Kg==", "dev": true, "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^29.4.3", "jest-get-type": "^29.4.3", - "pretty-format": "^29.5.0" + "pretty-format": "^29.6.1" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/expect/node_modules/jest-get-type": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz", + "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, "node_modules/expect/node_modules/jest-matcher-utils": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz", - "integrity": "sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.1.tgz", + "integrity": "sha512-SLaztw9d2mfQQKHmJXKM0HCbl2PPVld/t9Xa6P9sgiExijviSp7TnZZpw2Fpt+OI3nwUO/slJbOfzfUMKKC5QA==", "dev": true, "dependencies": { "chalk": "^4.0.0", - "jest-diff": "^29.5.0", + "jest-diff": "^29.6.1", "jest-get-type": "^29.4.3", - "pretty-format": "^29.5.0" + "pretty-format": "^29.6.1" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/expect/node_modules/pretty-format": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz", + "integrity": "sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==", "dev": true, "dependencies": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.0", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, @@ -5507,15 +5474,15 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "node_modules/fast-diff": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", "dev": true }, "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz", + "integrity": "sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -5600,19 +5567,15 @@ } }, "node_modules/fill-range": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", - "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, "dependencies": { - "is-number": "^2.1.0", - "isobject": "^2.0.0", - "randomatic": "^3.0.0", - "repeat-element": "^1.1.2", - "repeat-string": "^1.5.2" + "to-regex-range": "^5.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/find-parent-dir": { @@ -5637,15 +5600,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/find-up/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/flat-cache": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", @@ -5777,12 +5731,13 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", "dependencies": { "function-bind": "^1.1.1", "has": "^1.0.3", + "has-proto": "^1.0.1", "has-symbols": "^1.0.3" }, "funding": { @@ -5938,15 +5893,15 @@ } }, "node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true }, - "node_modules/grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true }, "node_modules/gray-matter": { @@ -5965,6 +5920,15 @@ "node": ">=0.10.0" } }, + "node_modules/gray-matter/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, "node_modules/gray-matter/node_modules/js-yaml": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", @@ -6064,15 +6028,6 @@ "escape-string-regexp": "^1.0.3" } }, - "node_modules/has-require/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", @@ -6113,9 +6068,9 @@ } }, "node_modules/hash-base/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, "dependencies": { "inherits": "^2.0.3", @@ -6331,20 +6286,13 @@ "node": ">= 0.4" } }, - "node_modules/is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "node_modules/interpret": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", + "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 0.10" } }, "node_modules/is-array-buffer": { @@ -6410,9 +6358,9 @@ } }, "node_modules/is-core-module": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.0.tgz", - "integrity": "sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==", + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", "dev": true, "dependencies": { "has": "^1.0.3" @@ -6489,15 +6437,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", - "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-negative-zero": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", @@ -6510,15 +6449,12 @@ } }, "node_modules/is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha512-QUzH43Gfb9+5yckcrSA0VBDwEtDUchrk4F6tfJZQuNzDJbEDB9cZNzSfXGQ1jqmdDY/kl41lUOWM9syA8z8jlg==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, "engines": { - "node": ">=0.10.0" + "node": ">=0.12.0" } }, "node_modules/is-number-object": { @@ -6544,6 +6480,27 @@ "node": ">=8" } }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-plain-object/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-regex": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", @@ -6559,15 +6516,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-set": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", - "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-shared-array-buffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", @@ -6637,15 +6585,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-weakmap": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", - "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", @@ -6657,19 +6596,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-weakset": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", - "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -6703,6 +6629,31 @@ "node": ">=8" } }, + "node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/istanbul-lib-report": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", @@ -6754,15 +6705,15 @@ } }, "node_modules/jest": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.5.0.tgz", - "integrity": "sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.6.1.tgz", + "integrity": "sha512-Nirw5B4nn69rVUZtemCQhwxOBhm0nsp3hmtF4rzCeWD7BkjAXRIji7xWQfnTNbz9g0aVsBX6aZK3n+23LM6uDw==", "dev": true, "dependencies": { - "@jest/core": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/core": "^29.6.1", + "@jest/types": "^29.6.1", "import-local": "^3.0.2", - "jest-cli": "^29.5.0" + "jest-cli": "^29.6.1" }, "bin": { "jest": "bin/jest.js" @@ -6792,44 +6743,29 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-changed-files/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/jest-circus": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.5.0.tgz", - "integrity": "sha512-gq/ongqeQKAplVxqJmbeUOJJKkW3dDNPY8PjhJ5G0lBRvu0e3EWGxGy5cI4LAGA7gV2UHCtWBI4EMXK8c9nQKA==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.1.tgz", + "integrity": "sha512-tPbYLEiBU4MYAL2XoZme/bgfUeotpDBd81lgHLCbDZZFaGmECk0b+/xejPFtmiBP87GgP/y4jplcRpbH+fgCzQ==", "dev": true, "dependencies": { - "@jest/environment": "^29.5.0", - "@jest/expect": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/environment": "^29.6.1", + "@jest/expect": "^29.6.1", + "@jest/test-result": "^29.6.1", + "@jest/types": "^29.6.1", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "dedent": "^0.7.0", "is-generator-fn": "^2.0.0", - "jest-each": "^29.5.0", - "jest-matcher-utils": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-runtime": "^29.5.0", - "jest-snapshot": "^29.5.0", - "jest-util": "^29.5.0", + "jest-each": "^29.6.1", + "jest-matcher-utils": "^29.6.1", + "jest-message-util": "^29.6.1", + "jest-runtime": "^29.6.1", + "jest-snapshot": "^29.6.1", + "jest-util": "^29.6.1", "p-limit": "^3.1.0", - "pretty-format": "^29.5.0", + "pretty-format": "^29.6.1", "pure-rand": "^6.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" @@ -6860,57 +6796,51 @@ } }, "node_modules/jest-circus/node_modules/jest-diff": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.5.0.tgz", - "integrity": "sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.1.tgz", + "integrity": "sha512-FsNCvinvl8oVxpNLttNQX7FAq7vR+gMDGj90tiP7siWw1UdakWUGqrylpsYrpvj908IYckm5Y0Q7azNAozU1Kg==", "dev": true, "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^29.4.3", "jest-get-type": "^29.4.3", - "pretty-format": "^29.5.0" + "pretty-format": "^29.6.1" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-circus/node_modules/jest-matcher-utils": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz", - "integrity": "sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw==", + "node_modules/jest-circus/node_modules/jest-get-type": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz", + "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==", "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^29.5.0", - "jest-get-type": "^29.4.3", - "pretty-format": "^29.5.0" - }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-circus/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "node_modules/jest-circus/node_modules/jest-matcher-utils": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.1.tgz", + "integrity": "sha512-SLaztw9d2mfQQKHmJXKM0HCbl2PPVld/t9Xa6P9sgiExijviSp7TnZZpw2Fpt+OI3nwUO/slJbOfzfUMKKC5QA==", "dev": true, "dependencies": { - "yocto-queue": "^0.1.0" + "chalk": "^4.0.0", + "jest-diff": "^29.6.1", + "jest-get-type": "^29.4.3", + "pretty-format": "^29.6.1" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-circus/node_modules/pretty-format": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz", + "integrity": "sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==", "dev": true, "dependencies": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.0", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, @@ -6924,66 +6854,32 @@ "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", "dev": true }, - "node_modules/jest-cli": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.5.0.tgz", - "integrity": "sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw==", - "dev": true, - "dependencies": { - "@jest/core": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/types": "^29.5.0", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "import-local": "^3.0.2", - "jest-config": "^29.5.0", - "jest-util": "^29.5.0", - "jest-validate": "^29.5.0", - "prompts": "^2.0.1", - "yargs": "^17.3.1" - }, - "bin": { - "jest": "bin/jest.js" - }, - "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/jest-config": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.5.0.tgz", - "integrity": "sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.6.1.tgz", + "integrity": "sha512-XdjYV2fy2xYixUiV2Wc54t3Z4oxYPAELUzWnV6+mcbq0rh742X2p52pii5A3oeRzYjLnQxCsZmp0qpI6klE2cQ==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.5.0", - "@jest/types": "^29.5.0", - "babel-jest": "^29.5.0", + "@jest/test-sequencer": "^29.6.1", + "@jest/types": "^29.6.1", + "babel-jest": "^29.6.1", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-circus": "^29.5.0", - "jest-environment-node": "^29.5.0", + "jest-circus": "^29.6.1", + "jest-environment-node": "^29.6.1", "jest-get-type": "^29.4.3", "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.5.0", - "jest-runner": "^29.5.0", - "jest-util": "^29.5.0", - "jest-validate": "^29.5.0", + "jest-resolve": "^29.6.1", + "jest-runner": "^29.6.1", + "jest-util": "^29.6.1", + "jest-validate": "^29.6.1", "micromatch": "^4.0.4", "parse-json": "^5.2.0", - "pretty-format": "^29.5.0", + "pretty-format": "^29.6.1", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, @@ -7015,13 +6911,22 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/jest-config/node_modules/jest-get-type": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz", + "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, "node_modules/jest-config/node_modules/pretty-format": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz", + "integrity": "sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==", "dev": true, "dependencies": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.0", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, @@ -7050,15 +6955,6 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/jest-diff/node_modules/jest-get-type": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", - "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", - "dev": true, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, "node_modules/jest-docblock": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.4.3.tgz", @@ -7072,16 +6968,16 @@ } }, "node_modules/jest-each": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.5.0.tgz", - "integrity": "sha512-HM5kIJ1BTnVt+DQZ2ALp3rzXEl+g726csObrW/jpEGl+CDSSQpOJJX2KE/vEg8cxcMXdyEPu6U4QX5eruQv5hA==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.6.1.tgz", + "integrity": "sha512-n5eoj5eiTHpKQCAVcNTT7DRqeUmJ01hsAL0Q1SMiBHcBcvTKDELixQOGMCpqhbIuTcfC4kMfSnpmDqRgRJcLNQ==", "dev": true, "dependencies": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.1", "chalk": "^4.0.0", "jest-get-type": "^29.4.3", - "jest-util": "^29.5.0", - "pretty-format": "^29.5.0" + "jest-util": "^29.6.1", + "pretty-format": "^29.6.1" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -7099,13 +6995,22 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/jest-each/node_modules/jest-get-type": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz", + "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, "node_modules/jest-each/node_modules/pretty-format": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz", + "integrity": "sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==", "dev": true, "dependencies": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.0", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, @@ -7120,46 +7025,46 @@ "dev": true }, "node_modules/jest-environment-node": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.5.0.tgz", - "integrity": "sha512-ExxuIK/+yQ+6PRGaHkKewYtg6hto2uGCgvKdb2nfJfKXgZ17DfXjvbZ+jA1Qt9A8EQSfPnt5FKIfnOO3u1h9qw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.1.tgz", + "integrity": "sha512-ZNIfAiE+foBog24W+2caIldl4Irh8Lx1PUhg/GZ0odM1d/h2qORAsejiFc7zb+SEmYPn1yDZzEDSU5PmDkmVLQ==", "dev": true, "dependencies": { - "@jest/environment": "^29.5.0", - "@jest/fake-timers": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/environment": "^29.6.1", + "@jest/fake-timers": "^29.6.1", + "@jest/types": "^29.6.1", "@types/node": "*", - "jest-mock": "^29.5.0", - "jest-util": "^29.5.0" + "jest-mock": "^29.6.1", + "jest-util": "^29.6.1" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-get-type": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz", - "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", + "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", "dev": true, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-haste-map": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.5.0.tgz", - "integrity": "sha512-IspOPnnBro8YfVYSw6yDRKh/TiCdRngjxeacCps1cQ9cgVN6+10JUcuJ1EabrgYLOATsIAigxA0rLR9x/YlrSA==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.1.tgz", + "integrity": "sha512-0m7f9PZXxOCk1gRACiVgX85knUKPKLPg4oRCjLoqIm9brTHXaorMA0JpmtmVkQiT8nmXyIVoZd/nnH1cfC33ig==", "dev": true, "dependencies": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.1", "@types/graceful-fs": "^4.1.3", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", "jest-regex-util": "^29.4.3", - "jest-util": "^29.5.0", - "jest-worker": "^29.5.0", + "jest-util": "^29.6.1", + "jest-worker": "^29.6.1", "micromatch": "^4.0.4", "walker": "^1.0.8" }, @@ -7171,13 +7076,13 @@ } }, "node_modules/jest-leak-detector": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.5.0.tgz", - "integrity": "sha512-u9YdeeVnghBUtpN5mVxjID7KbkKE1QU4f6uUwuxiY0vYRi9BUCLKlPEZfDGR67ofdFmDz9oPAy2G92Ujrntmow==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.6.1.tgz", + "integrity": "sha512-OrxMNyZirpOEwkF3UHnIkAiZbtkBWiye+hhBweCHkVbCgyEy71Mwbb5zgeTNYWJBi1qgDVfPC1IwO9dVEeTLwQ==", "dev": true, "dependencies": { "jest-get-type": "^29.4.3", - "pretty-format": "^29.5.0" + "pretty-format": "^29.6.1" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -7195,13 +7100,22 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/jest-leak-detector/node_modules/jest-get-type": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz", + "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, "node_modules/jest-leak-detector/node_modules/pretty-format": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz", + "integrity": "sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==", "dev": true, "dependencies": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.0", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, @@ -7230,28 +7144,19 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/jest-matcher-utils/node_modules/jest-get-type": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", - "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", - "dev": true, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, "node_modules/jest-message-util": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.5.0.tgz", - "integrity": "sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.1.tgz", + "integrity": "sha512-KoAW2zAmNSd3Gk88uJ56qXUWbFk787QKmjjJVOjtGFmmGSZgDBrlIL4AfQw1xyMYPNVD7dNInfIbur9B2rd/wQ==", "dev": true, "dependencies": { "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.1", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", - "pretty-format": "^29.5.0", + "pretty-format": "^29.6.1", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, @@ -7272,12 +7177,12 @@ } }, "node_modules/jest-message-util/node_modules/pretty-format": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz", + "integrity": "sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==", "dev": true, "dependencies": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.0", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, @@ -7292,14 +7197,14 @@ "dev": true }, "node_modules/jest-mock": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.5.0.tgz", - "integrity": "sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.6.1.tgz", + "integrity": "sha512-brovyV9HBkjXAEdRooaTQK42n8usKoSRR3gihzUpYeV/vwqgSoNfrksO7UfSACnPmxasO/8TmHM3w9Hp3G1dgw==", "dev": true, "dependencies": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.1", "@types/node": "*", - "jest-util": "^29.5.0" + "jest-util": "^29.6.1" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -7332,17 +7237,17 @@ } }, "node_modules/jest-resolve": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.5.0.tgz", - "integrity": "sha512-1TzxJ37FQq7J10jPtQjcc+MkCkE3GBpBecsSUWJ0qZNJpmg6m0D9/7II03yJulm3H/fvVjgqLh/k2eYg+ui52w==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.1.tgz", + "integrity": "sha512-AeRkyS8g37UyJiP9w3mmI/VXU/q8l/IH52vj/cDAyScDcemRbSBhfX/NMYIGilQgSVwsjxrCHf3XJu4f+lxCMg==", "dev": true, "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.5.0", + "jest-haste-map": "^29.6.1", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.5.0", - "jest-validate": "^29.5.0", + "jest-util": "^29.6.1", + "jest-validate": "^29.6.1", "resolve": "^1.20.0", "resolve.exports": "^2.0.0", "slash": "^3.0.0" @@ -7352,43 +7257,43 @@ } }, "node_modules/jest-resolve-dependencies": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.5.0.tgz", - "integrity": "sha512-sjV3GFr0hDJMBpYeUuGduP+YeCRbd7S/ck6IvL3kQ9cpySYKqcqhdLLC2rFwrcL7tz5vYibomBrsFYWkIGGjOg==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.1.tgz", + "integrity": "sha512-BbFvxLXtcldaFOhNMXmHRWx1nXQO5LoXiKSGQcA1LxxirYceZT6ch8KTE1bK3X31TNG/JbkI7OkS/ABexVahiw==", "dev": true, "dependencies": { "jest-regex-util": "^29.4.3", - "jest-snapshot": "^29.5.0" + "jest-snapshot": "^29.6.1" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-runner": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.5.0.tgz", - "integrity": "sha512-m7b6ypERhFghJsslMLhydaXBiLf7+jXy8FwGRHO3BGV1mcQpPbwiqiKUR2zU2NJuNeMenJmlFZCsIqzJCTeGLQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.1.tgz", + "integrity": "sha512-tw0wb2Q9yhjAQ2w8rHRDxteryyIck7gIzQE4Reu3JuOBpGp96xWgF0nY8MDdejzrLCZKDcp8JlZrBN/EtkQvPQ==", "dev": true, "dependencies": { - "@jest/console": "^29.5.0", - "@jest/environment": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/console": "^29.6.1", + "@jest/environment": "^29.6.1", + "@jest/test-result": "^29.6.1", + "@jest/transform": "^29.6.1", + "@jest/types": "^29.6.1", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.13.1", "graceful-fs": "^4.2.9", "jest-docblock": "^29.4.3", - "jest-environment-node": "^29.5.0", - "jest-haste-map": "^29.5.0", - "jest-leak-detector": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-resolve": "^29.5.0", - "jest-runtime": "^29.5.0", - "jest-util": "^29.5.0", - "jest-watcher": "^29.5.0", - "jest-worker": "^29.5.0", + "jest-environment-node": "^29.6.1", + "jest-haste-map": "^29.6.1", + "jest-leak-detector": "^29.6.1", + "jest-message-util": "^29.6.1", + "jest-resolve": "^29.6.1", + "jest-runtime": "^29.6.1", + "jest-util": "^29.6.1", + "jest-watcher": "^29.6.1", + "jest-worker": "^29.6.1", "p-limit": "^3.1.0", "source-map-support": "0.5.13" }, @@ -7396,83 +7301,75 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-runner/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/jest-runtime": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.5.0.tgz", - "integrity": "sha512-1Hr6Hh7bAgXQP+pln3homOiEZtCDZFqwmle7Ew2j8OlbkIu6uE3Y/etJQG8MLQs3Zy90xrp2C0BRrtPHG4zryw==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.5.0", - "@jest/fake-timers": "^29.5.0", - "@jest/globals": "^29.5.0", - "@jest/source-map": "^29.4.3", - "@jest/test-result": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.1.tgz", + "integrity": "sha512-D6/AYOA+Lhs5e5il8+5pSLemjtJezUr+8zx+Sn8xlmOux3XOqx4d8l/2udBea8CRPqqrzhsKUsN/gBDE/IcaPQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.6.1", + "@jest/fake-timers": "^29.6.1", + "@jest/globals": "^29.6.1", + "@jest/source-map": "^29.6.0", + "@jest/test-result": "^29.6.1", + "@jest/transform": "^29.6.1", + "@jest/types": "^29.6.1", "@types/node": "*", "chalk": "^4.0.0", "cjs-module-lexer": "^1.0.0", "collect-v8-coverage": "^1.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-mock": "^29.5.0", + "jest-haste-map": "^29.6.1", + "jest-message-util": "^29.6.1", + "jest-mock": "^29.6.1", "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.5.0", - "jest-snapshot": "^29.5.0", - "jest-util": "^29.5.0", + "jest-resolve": "^29.6.1", + "jest-snapshot": "^29.6.1", + "jest-util": "^29.6.1", "slash": "^3.0.0", "strip-bom": "^4.0.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime/node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" } }, "node_modules/jest-snapshot": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.5.0.tgz", - "integrity": "sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.1.tgz", + "integrity": "sha512-G4UQE1QQ6OaCgfY+A0uR1W2AY0tGXUPQpoUClhWHq1Xdnx1H6JOrC2nH5lqnOEqaDgbHFgIwZ7bNq24HpB180A==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", "@babel/generator": "^7.7.2", "@babel/plugin-syntax-jsx": "^7.7.2", "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", - "@types/babel__traverse": "^7.0.6", + "@jest/expect-utils": "^29.6.1", + "@jest/transform": "^29.6.1", + "@jest/types": "^29.6.1", "@types/prettier": "^2.1.5", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^29.5.0", + "expect": "^29.6.1", "graceful-fs": "^4.2.9", - "jest-diff": "^29.5.0", + "jest-diff": "^29.6.1", "jest-get-type": "^29.4.3", - "jest-matcher-utils": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-util": "^29.5.0", + "jest-matcher-utils": "^29.6.1", + "jest-message-util": "^29.6.1", + "jest-util": "^29.6.1", "natural-compare": "^1.4.0", - "pretty-format": "^29.5.0", - "semver": "^7.3.5" + "pretty-format": "^29.6.1", + "semver": "^7.5.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -7500,42 +7397,51 @@ } }, "node_modules/jest-snapshot/node_modules/jest-diff": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.5.0.tgz", - "integrity": "sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.1.tgz", + "integrity": "sha512-FsNCvinvl8oVxpNLttNQX7FAq7vR+gMDGj90tiP7siWw1UdakWUGqrylpsYrpvj908IYckm5Y0Q7azNAozU1Kg==", "dev": true, "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^29.4.3", "jest-get-type": "^29.4.3", - "pretty-format": "^29.5.0" + "pretty-format": "^29.6.1" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-snapshot/node_modules/jest-get-type": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz", + "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, "node_modules/jest-snapshot/node_modules/jest-matcher-utils": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz", - "integrity": "sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.1.tgz", + "integrity": "sha512-SLaztw9d2mfQQKHmJXKM0HCbl2PPVld/t9Xa6P9sgiExijviSp7TnZZpw2Fpt+OI3nwUO/slJbOfzfUMKKC5QA==", "dev": true, "dependencies": { "chalk": "^4.0.0", - "jest-diff": "^29.5.0", + "jest-diff": "^29.6.1", "jest-get-type": "^29.4.3", - "pretty-format": "^29.5.0" + "pretty-format": "^29.6.1" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-snapshot/node_modules/pretty-format": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz", + "integrity": "sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==", "dev": true, "dependencies": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.0", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, @@ -7550,12 +7456,12 @@ "dev": true }, "node_modules/jest-util": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.5.0.tgz", - "integrity": "sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.1.tgz", + "integrity": "sha512-NRFCcjc+/uO3ijUVyNOQJluf8PtGCe/W6cix36+M3cTFgiYqFOOW5MgN4JOOcvbUhcKTYVd1CvHz/LWi8d16Mg==", "dev": true, "dependencies": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.1", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", @@ -7567,17 +7473,17 @@ } }, "node_modules/jest-validate": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.5.0.tgz", - "integrity": "sha512-pC26etNIi+y3HV8A+tUGr/lph9B18GnzSRAkPaaZJIE1eFdiYm6/CewuiJQ8/RlfHd1u/8Ioi8/sJ+CmbA+zAQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.1.tgz", + "integrity": "sha512-r3Ds69/0KCN4vx4sYAbGL1EVpZ7MSS0vLmd3gV78O+NAx3PDQQukRU5hNHPXlyqCgFY8XUk7EuTMLugh0KzahA==", "dev": true, "dependencies": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.1", "camelcase": "^6.2.0", "chalk": "^4.0.0", "jest-get-type": "^29.4.3", "leven": "^3.1.0", - "pretty-format": "^29.5.0" + "pretty-format": "^29.6.1" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -7607,13 +7513,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/jest-validate/node_modules/jest-get-type": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz", + "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, "node_modules/jest-validate/node_modules/pretty-format": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz", + "integrity": "sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==", "dev": true, "dependencies": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.0", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, @@ -7628,18 +7543,18 @@ "dev": true }, "node_modules/jest-watcher": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.5.0.tgz", - "integrity": "sha512-KmTojKcapuqYrKDpRwfqcQ3zjMlwu27SYext9pt4GlF5FUgB+7XE1mcCnSm6a4uUpFyQIkb6ZhzZvHl+jiBCiA==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.1.tgz", + "integrity": "sha512-d4wpjWTS7HEZPaaj8m36QiaP856JthRZkrgcIY/7ISoUWPIillrXM23WPboZVLbiwZBt4/qn2Jke84Sla6JhFA==", "dev": true, "dependencies": { - "@jest/test-result": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/test-result": "^29.6.1", + "@jest/types": "^29.6.1", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "emittery": "^0.13.1", - "jest-util": "^29.5.0", + "jest-util": "^29.6.1", "string-length": "^4.0.1" }, "engines": { @@ -7647,13 +7562,13 @@ } }, "node_modules/jest-worker": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.5.0.tgz", - "integrity": "sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.1.tgz", + "integrity": "sha512-U+Wrbca7S8ZAxAe9L6nb6g8kPdia5hj32Puu5iOqBCMTMWFHXuK6dOV2IFrpedbTV8fjMFLdWNttQTBL6u2MRA==", "dev": true, "dependencies": { "@types/node": "*", - "jest-util": "^29.5.0", + "jest-util": "^29.6.1", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, @@ -7676,14 +7591,38 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/js-sdsl": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.0.tgz", - "integrity": "sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==", + "node_modules/jest/node_modules/jest-cli": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.1.tgz", + "integrity": "sha512-607dSgTA4ODIN6go9w6xY3EYkyPFGicx51a69H7yfvt7lN53xNswEVLovq+E77VsTRi5fWprLH0yl4DJgE8Ing==", "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/js-sdsl" + "dependencies": { + "@jest/core": "^29.6.1", + "@jest/test-result": "^29.6.1", + "@jest/types": "^29.6.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "import-local": "^3.0.2", + "jest-config": "^29.6.1", + "jest-util": "^29.6.1", + "jest-validate": "^29.6.1", + "prompts": "^2.0.1", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "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/js-tokens": { @@ -7703,11 +7642,6 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/js-yaml/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, "node_modules/jsep": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/jsep/-/jsep-1.3.8.tgz", @@ -7755,15 +7689,15 @@ "dev": true }, "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, "bin": { "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" } }, "node_modules/jsonc-parser": { @@ -7772,12 +7706,12 @@ "integrity": "sha512-o6/yDBYccGvTz1+QFevz6l6OBZ2+fMVu2JZ9CIhzsYRX4mjaK5IyX9eldUdCmga16zlgQxyrj5pt9kzuj2C02w==" }, "node_modules/jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha512-trvBk1ki43VZptdBI5rIlG4YOzyeH/WefQt5rj1grasPn4iiZWKet8nkgc4GlsAylaztn0qZfUYOiTsASJFdNA==", + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz", + "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==", "dev": true, - "engines": { - "node": "*" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/jsonparse": { @@ -7822,13 +7756,15 @@ } }, "node_modules/jsx-ast-utils": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", - "integrity": "sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.4.tgz", + "integrity": "sha512-fX2TVdCViod6HwKEtSWGHs57oFhVfCMwieb9PuRDgjDPh5XeqJiHFFFJCHxU5cnTc3Bu/GRL+kPiFmw8XWOfKw==", "dev": true, "dependencies": { - "array-includes": "^3.1.5", - "object.assign": "^4.1.3" + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" }, "engines": { "node": ">=4.0" @@ -7934,6 +7870,18 @@ "node": ">=0.10.0" } }, + "node_modules/list-item/node_modules/is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha512-QUzH43Gfb9+5yckcrSA0VBDwEtDUchrk4F6tfJZQuNzDJbEDB9cZNzSfXGQ1jqmdDY/kl41lUOWM9syA8z8jlg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/loader-runner": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", @@ -8057,9 +8005,9 @@ } }, "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -8242,10 +8190,13 @@ } }, "node_modules/minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/mixin-deep": { "version": "1.3.2", @@ -8272,27 +8223,6 @@ "node": ">=0.10.0" } }, - "node_modules/mixin-deep/node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/mixin-deep/node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/mkdirp-classic": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", @@ -8423,9 +8353,9 @@ "dev": true }, "node_modules/node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", "dev": true }, "node_modules/normalize-path": { @@ -8466,22 +8396,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", @@ -8610,17 +8524,17 @@ } }, "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", "dev": true, "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" + "type-check": "^0.4.0" }, "engines": { "node": ">= 0.8.0" @@ -8633,15 +8547,15 @@ "dev": true }, "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "dependencies": { - "p-try": "^2.0.0" + "yocto-queue": "^0.1.0" }, "engines": { - "node": ">=6" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -8662,21 +8576,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-locate/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", @@ -8759,6 +8658,15 @@ "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", "dev": true }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -8842,9 +8750,9 @@ } }, "node_modules/pirates": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", - "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", "dev": true, "engines": { "node": ">= 6" @@ -8887,6 +8795,21 @@ "node": ">=8" } }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/pkg-dir/node_modules/p-locate": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", @@ -8899,15 +8822,6 @@ "node": ">=8" } }, - "node_modules/pkg-dir/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/pony-cause": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/pony-cause/-/pony-cause-1.1.1.tgz", @@ -8926,9 +8840,9 @@ } }, "node_modules/prettier": { - "version": "2.8.7", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.7.tgz", - "integrity": "sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==", + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", "dev": true, "bin": { "prettier": "bin-prettier.js" @@ -9052,10 +8966,12 @@ } }, "node_modules/punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", - "dev": true + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "engines": { + "node": ">=6" + } }, "node_modules/puppeteer": { "version": "17.1.3", @@ -9082,9 +8998,9 @@ } }, "node_modules/pure-rand": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.1.tgz", - "integrity": "sha512-t+x1zEHDjBwkDGY5v5ApnZ/utcd4XYDiJsaQQoptTXgUXX95sDg1elCdJghzicm7n2mbCBJ3uYWr6M22SO19rg==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.2.tgz", + "integrity": "sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ==", "dev": true, "funding": [ { @@ -9097,14 +9013,19 @@ } ] }, - "node_modules/querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", - "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", + "node_modules/qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, "engines": { - "node": ">=0.4.x" + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/querystring-es3": { @@ -9203,9 +9124,9 @@ } }, "node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, "dependencies": { "core-util-is": "~1.0.0", @@ -9232,6 +9153,18 @@ "safe-buffer": "~5.1.0" } }, + "node_modules/rechoir": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", + "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", + "dev": true, + "dependencies": { + "resolve": "^1.9.0" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/regenerator-runtime": { "version": "0.13.11", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", @@ -9239,9 +9172,9 @@ "dev": true }, "node_modules/regexp-tree": { - "version": "0.1.24", - "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.24.tgz", - "integrity": "sha512-s2aEVuLhvnVJW6s/iPgEGK6R+/xngd2jNQ+xy4bXNDKxZKJH6jpPHY6kVeVv1IeLCHgswRj+Kl3ELaDjG6V1iw==", + "version": "0.1.27", + "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz", + "integrity": "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==", "dev": true, "bin": { "regexp-tree": "bin/regexp-tree" @@ -9279,6 +9212,15 @@ "node": ">= 0.10.0" } }, + "node_modules/remarkable/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, "node_modules/rename-function-calls": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/rename-function-calls/-/rename-function-calls-0.1.1.tgz", @@ -9298,6 +9240,19 @@ "esprima-fb": "3001.1.0-dev-harmony-fb" } }, + "node_modules/rename-function-calls/node_modules/esprima-fb": { + "version": "3001.1.0-dev-harmony-fb", + "resolved": "https://registry.npmjs.org/esprima-fb/-/esprima-fb-3001.0001.0000-dev-harmony-fb.tgz", + "integrity": "sha512-a3RFiCVBiy8KdO6q/C+8BQiP/sRk8XshBU3QHHDP8tNzjYwR3FKBOImu+PXfVhPoZL0JKtJLBAOWlDMCCFY8SQ==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/repeat-element": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", @@ -9371,12 +9326,12 @@ } }, "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", "dev": true, "dependencies": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.11.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -9538,9 +9493,9 @@ "dev": true }, "node_modules/schema-utils": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz", - "integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.8", @@ -9571,15 +9526,6 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/schema-utils/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "peerDependencies": { - "ajv": "^6.9.1" - } - }, "node_modules/schema-utils/node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -9587,9 +9533,9 @@ "dev": true }, "node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -9601,6 +9547,15 @@ "node": ">=10" } }, + "node_modules/serialize-javascript": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, "node_modules/set-getter": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/set-getter/-/set-getter-0.1.1.tgz", @@ -9688,10 +9643,13 @@ } }, "node_modules/shell-quote": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz", - "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==", - "dev": true + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/side-channel": { "version": "1.0.4", @@ -9827,18 +9785,6 @@ "node": ">=8" } }, - "node_modules/stop-iteration-iterator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", - "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", - "dev": true, - "dependencies": { - "internal-slot": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/stream-browserify": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", @@ -9872,9 +9818,9 @@ } }, "node_modules/stream-http/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, "dependencies": { "inherits": "^2.0.3", @@ -9931,6 +9877,12 @@ "node": ">=8" } }, + "node_modules/string-width/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, "node_modules/string.prototype.trim": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", @@ -9986,12 +9938,12 @@ } }, "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, "engines": { - "node": ">=8" + "node": ">=4" } }, "node_modules/strip-color": { @@ -10114,9 +10066,9 @@ } }, "node_modules/tar-stream/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, "dependencies": { "inherits": "^2.0.3", @@ -10134,13 +10086,13 @@ "dev": true }, "node_modules/terser": { - "version": "5.17.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.17.1.tgz", - "integrity": "sha512-hVl35zClmpisy6oaoKALOpS0rDYLxRFLHhRuDlEGTKey9qHjS1w9GMORjuwIMt70Wan4lwsLYyWDVnWgF+KUEw==", + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.0.tgz", + "integrity": "sha512-JpcpGOQLOXm2jsomozdMDpd5f8ZHh1rR48OFgWUH3QsyZcfPgv2qDCYbcDEAYNd4OZRj2bWYKpwdll/udZCk/Q==", "dev": true, "dependencies": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, @@ -10152,16 +10104,16 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.7", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.7.tgz", - "integrity": "sha512-AfKwIktyP7Cu50xNjXF/6Qb5lBNzYaWpU6YfoX3uZicTx0zTy0stDDCsvjDapKsSDvOeWo5MEq4TmdBy2cNoHw==", + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", + "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", "dev": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.17", "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", "serialize-javascript": "^6.0.1", - "terser": "^5.16.5" + "terser": "^5.16.8" }, "engines": { "node": ">= 10.13.0" @@ -10199,15 +10151,6 @@ "node": ">= 10.13.0" } }, - "node_modules/terser-webpack-plugin/node_modules/serialize-javascript": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", - "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", - "dev": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, "node_modules/terser-webpack-plugin/node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -10223,18 +10166,6 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/terser/node_modules/acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/terser/node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -10347,15 +10278,6 @@ "node": ">=8.0" } }, - "node_modules/to-regex-range/node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, "node_modules/toml": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/toml/-/toml-2.3.6.tgz", @@ -10410,9 +10332,9 @@ "dev": true }, "node_modules/ts-loader": { - "version": "9.4.2", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.2.tgz", - "integrity": "sha512-OmlC4WVmFv5I0PpaxYb+qGeGOdm5giHU7HwDDUjw59emP2UYMHy9fFSDcYgSNoH8sXcj4hGCSEhlDZ9ULeDraA==", + "version": "9.4.4", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.4.tgz", + "integrity": "sha512-MLukxDHBl8OJ5Dk3y69IsKVFRA/6MwzEqBgh+OXMPB/OD01KQuWPFd1WAQP8a5PeSCAxfnkhiuWqfmFJzJQt9w==", "dev": true, "dependencies": { "chalk": "^4.1.0", @@ -10471,18 +10393,6 @@ } } }, - "node_modules/ts-node/node_modules/acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/ts-node/node_modules/acorn-walk": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", @@ -10492,15 +10402,6 @@ "node": ">=0.4.0" } }, - "node_modules/ts-node/node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, "node_modules/tsconfig-paths": { "version": "3.14.2", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", @@ -10513,31 +10414,10 @@ "strip-bom": "^3.0.0" } }, - "node_modules/tsconfig-paths/node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/tsconfig-paths/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", + "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==" }, "node_modules/tsutils": { "version": "3.21.0", @@ -10599,6 +10479,24 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/typed-array-length": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", @@ -10681,9 +10579,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.9.tgz", - "integrity": "sha512-/xsqn21EGVdXI3EXSum1Yckj3ZVZugqyOZQ/CxYPBD/R+ko9NSUScf8tFF4dOKY+2pvSSJA/S+5B8s4Zr4kyvg==", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", "dev": true, "funding": [ { @@ -10693,6 +10591,10 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { @@ -10700,7 +10602,7 @@ "picocolors": "^1.0.0" }, "bin": { - "browserslist-lint": "cli.js" + "update-browserslist-db": "cli.js" }, "peerDependencies": { "browserslist": ">= 4.21.0" @@ -10714,33 +10616,25 @@ "punycode": "^2.1.0" } }, - "node_modules/uri-js/node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "engines": { - "node": ">=6" - } - }, "node_modules/urijs": { "version": "1.19.11", "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.11.tgz", "integrity": "sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ==" }, "node_modules/url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==", + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.1.tgz", + "integrity": "sha512-rWS3H04/+mzzJkv0eZ7vEDGiQbgquI1fGfOad6zKvgYQi1SzMmhl7c/DdRGxhaWrVH6z0qWITo8rpnxK/RfEhA==", "dev": true, "dependencies": { - "punycode": "1.3.2", - "querystring": "0.2.0" + "punycode": "^1.4.1", + "qs": "^6.11.0" } }, "node_modules/url/node_modules/punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", "dev": true }, "node_modules/util": { @@ -10832,9 +10726,9 @@ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "node_modules/webpack": { - "version": "5.80.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.80.0.tgz", - "integrity": "sha512-OIMiq37XK1rWO8mH9ssfFKZsXg4n6klTEDL7S8/HqbAOBBaiy8ABvXvz0dDCXeEF9gqwxSvVk611zFPjS8hJxA==", + "version": "5.88.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.1.tgz", + "integrity": "sha512-FROX3TxQnC/ox4N+3xQoWZzvGXSuscxR32rbzjpXgEzWudJFEJBpdlkkob2ylrv5yzzufD1zph1OoFsLtm6stQ==", "dev": true, "dependencies": { "@types/eslint-scope": "^3.7.3", @@ -10843,10 +10737,10 @@ "@webassemblyjs/wasm-edit": "^1.11.5", "@webassemblyjs/wasm-parser": "^1.11.5", "acorn": "^8.7.1", - "acorn-import-assertions": "^1.7.6", + "acorn-import-assertions": "^1.9.0", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.13.0", + "enhanced-resolve": "^5.15.0", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", @@ -10856,7 +10750,7 @@ "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.1.2", + "schema-utils": "^3.2.0", "tapable": "^2.1.1", "terser-webpack-plugin": "^5.3.7", "watchpack": "^2.4.0", @@ -10879,9 +10773,9 @@ } }, "node_modules/webpack-bundle-analyzer": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.8.0.tgz", - "integrity": "sha512-ZzoSBePshOKhr+hd8u6oCkZVwpVaXgpw23ScGLFpR6SjYI7+7iIWYarjN6OEYOfRt8o7ZyZZQk0DuMizJ+LEIg==", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.9.0.tgz", + "integrity": "sha512-+bXGmO1LyiNx0i9enBu3H8mv42sj/BJWhZNFwjz92tVnBa9J3JMGo2an2IXlEleoDOPn/Hofl5hr/xCpObUDtw==", "dev": true, "dependencies": { "@discoveryjs/json-ext": "0.5.7", @@ -10902,18 +10796,6 @@ "node": ">= 10.13.0" } }, - "node_modules/webpack-bundle-analyzer/node_modules/acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/webpack-bundle-analyzer/node_modules/acorn-walk": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", @@ -11009,31 +10891,10 @@ "node": ">= 10" } }, - "node_modules/webpack-cli/node_modules/interpret": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", - "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/webpack-cli/node_modules/rechoir": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", - "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", - "dev": true, - "dependencies": { - "resolve": "^1.9.0" - }, - "engines": { - "node": ">= 0.10" - } - }, "node_modules/webpack-merge": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", - "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.9.0.tgz", + "integrity": "sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg==", "dev": true, "dependencies": { "clone-deep": "^4.0.1", @@ -11052,27 +10913,6 @@ "node": ">=10.13.0" } }, - "node_modules/webpack/node_modules/acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/webpack/node_modules/acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", - "dev": true, - "peerDependencies": { - "acorn": "^8" - } - }, "node_modules/webpack/node_modules/events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", @@ -11121,25 +10961,10 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/which-collection": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", - "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", - "dev": true, - "dependencies": { - "is-map": "^2.0.1", - "is-set": "^2.0.1", - "is-weakmap": "^2.0.1", - "is-weakset": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/which-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.10.tgz", + "integrity": "sha512-uxoA5vLUfRPdjCuJ1h5LlYdmTLbYfums398v3WLkM+i/Wltl2/XyZpQWKbN++ck5L64SR/grOHqtXCUKmlZPNA==", "dependencies": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", @@ -11156,20 +10981,11 @@ } }, "node_modules/wildcard": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", - "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", "dev": true }, - "node_modules/word-wrap": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.4.tgz", - "integrity": "sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -11193,6 +11009,19 @@ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, "node_modules/ws": { "version": "8.8.1", "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.1.tgz", @@ -11239,9 +11068,9 @@ "dev": true }, "node_modules/yargs": { - "version": "17.7.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", - "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, "dependencies": { "cliui": "^8.0.1", @@ -11256,7 +11085,7 @@ "node": ">=12" } }, - "node_modules/yargs/node_modules/yargs-parser": { + "node_modules/yargs-parser": { "version": "21.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", @@ -11298,13 +11127,19 @@ } }, "dependencies": { + "@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true + }, "@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", "dev": true, "requires": { - "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" } }, @@ -11344,12 +11179,23 @@ "js-yaml": "^4.1.0", "jsonpath-plus": "^7.2.0", "node-fetch": "2.6.7" + }, + "dependencies": { + "@asyncapi/specs": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@asyncapi/specs/-/specs-5.1.0.tgz", + "integrity": "sha512-yffhETqehkim43luMnPKOwzY0D0YtU4bKpORIXIaid6p5Y5kDLrMGJaEPkNieQp03HMjhjFrnUPtT8kvqe0+aQ==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.11" + } + } } }, "@asyncapi/specs": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@asyncapi/specs/-/specs-5.1.0.tgz", - "integrity": "sha512-yffhETqehkim43luMnPKOwzY0D0YtU4bKpORIXIaid6p5Y5kDLrMGJaEPkNieQp03HMjhjFrnUPtT8kvqe0+aQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@asyncapi/specs/-/specs-6.0.0.tgz", + "integrity": "sha512-/HikjNcrTR/OgZmXWHYkdLdoJQUm80zcM5dnr1dx2R92WRmMQ0wweEJyFXCZwwyzoRkPHMD3RU4h3ppM8pYHRQ==", "requires": { "@types/json-schema": "^7.0.11" } @@ -11423,53 +11269,50 @@ } }, "@babel/compat-data": { - "version": "7.19.3", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.19.3.tgz", - "integrity": "sha512-prBHMK4JYYK+wDjJF1q99KK4JLL+egWS4nmNqdlMUgCExMZ+iZW0hGhyC3VEbsPjvaN0TBhW//VIFwBrk8sEiw==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz", + "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==", "dev": true }, "@babel/core": { - "version": "7.19.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.3.tgz", - "integrity": "sha512-WneDJxdsjEvyKtXKsaBGbDeiyOjR5vYq4HcShxnIbG0qixpoHjI3MqeZM9NDvsojNCEBItQE4juOo/bU6e72gQ==", - "dev": true, - "requires": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.19.3", - "@babel/helper-compilation-targets": "^7.19.3", - "@babel/helper-module-transforms": "^7.19.0", - "@babel/helpers": "^7.19.0", - "@babel/parser": "^7.19.3", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.3", - "@babel/types": "^7.19.3", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.9.tgz", + "integrity": "sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w==", + "dev": true, + "requires": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.9", + "@babel/helper-compilation-targets": "^7.22.9", + "@babel/helper-module-transforms": "^7.22.9", + "@babel/helpers": "^7.22.6", + "@babel/parser": "^7.22.7", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.8", + "@babel/types": "^7.22.5", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" + "json5": "^2.2.2", + "semver": "^6.3.1" }, "dependencies": { "convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true }, "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true } } @@ -11484,37 +11327,40 @@ "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" - }, - "dependencies": { - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - } } }, "@babel/helper-compilation-targets": { - "version": "7.19.3", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.19.3.tgz", - "integrity": "sha512-65ESqLGyGmLvgR0mst5AdW1FkNlj9rQsCKduzEoEPhBCDFGXvz2jW6bXFG6i0/MrV2s7hhXjjb2yAzcPuQlLwg==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.9.tgz", + "integrity": "sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw==", "dev": true, "requires": { - "@babel/compat-data": "^7.19.3", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.21.3", - "semver": "^6.3.0" + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.5", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" }, "dependencies": { + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true } } @@ -11545,43 +11391,40 @@ } }, "@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", + "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", "dev": true, "requires": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" } }, "@babel/helper-module-transforms": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.19.0.tgz", - "integrity": "sha512-3HBZ377Fe14RbLIA+ac3sY4PTgpxHVkFrESaWhoI5PuyXPBBX8+C34qblV9G89ZtycGJCmCI/Ut+VUDK4bltNQ==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz", + "integrity": "sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==", "dev": true, "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.18.6", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.0", - "@babel/types": "^7.19.0" + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.5" } }, "@babel/helper-plugin-utils": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", - "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", "dev": true }, "@babel/helper-simple-access": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz", - "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", "dev": true, "requires": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" } }, "@babel/helper-split-export-declaration": { @@ -11606,20 +11449,20 @@ "dev": true }, "@babel/helper-validator-option": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", - "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", + "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", "dev": true }, "@babel/helpers": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.19.0.tgz", - "integrity": "sha512-DRBCKGwIEdqY3+rPJgG/dKfQy9+08rHIAJx8q2p+HSWP87s2HCrQmaAMMyMll2kIXKCW0cO1RdQskx15Xakftg==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.6.tgz", + "integrity": "sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==", "dev": true, "requires": { - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.0", - "@babel/types": "^7.19.0" + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.6", + "@babel/types": "^7.22.5" } }, "@babel/highlight": { @@ -11668,12 +11511,6 @@ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -11743,12 +11580,12 @@ } }, "@babel/plugin-syntax-jsx": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.21.4.tgz", - "integrity": "sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", + "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-syntax-logical-assignment-operators": { @@ -11815,18 +11652,18 @@ } }, "@babel/plugin-syntax-typescript": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.21.4.tgz", - "integrity": "sha512-xz0D39NvhQn4t4RNsHmDnnsaQizIlUkdtYvLs8La1BlfjQ6JEwxkJGeqJMW2tAXx+q6H+WFuUTXNdYVpEya0YA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz", + "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/runtime": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", - "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz", + "integrity": "sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==", "dev": true, "requires": { "regenerator-runtime": "^0.13.11" @@ -11923,20 +11760,20 @@ } }, "@eslint-community/regexpp": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.0.tgz", - "integrity": "sha512-vITaYzIcNmjn5tF5uxcZ/ft7/RXGrMUIS9HalWckEOF6ESiwXKoMzAQf2UW0aVd6rnOeExTJVd5hmWXucBKGXQ==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz", + "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==", "dev": true }, "@eslint/eslintrc": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.2.tgz", - "integrity": "sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.0.tgz", + "integrity": "sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==", "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.5.1", + "espree": "^9.6.0", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -11966,9 +11803,9 @@ } }, "@eslint/js": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.38.0.tgz", - "integrity": "sha512-IoD2MfUnOV58ghIHCiil01PcohxjbYR/qCxsoC+xNgUwh1EY8jOOrYmu3d3a71+tJJ23uscEV4X2HJWMsPJu4g==", + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.44.0.tgz", + "integrity": "sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==", "dev": true }, "@github/browserslist-config": { @@ -11978,9 +11815,9 @@ "dev": true }, "@humanwhocodes/config-array": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", - "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", + "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", "dev": true, "requires": { "@humanwhocodes/object-schema": "^1.2.1", @@ -12013,6 +11850,15 @@ "resolve-from": "^5.0.0" }, "dependencies": { + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, "find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -12042,6 +11888,15 @@ "p-locate": "^4.1.0" } }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, "p-locate": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", @@ -12051,12 +11906,6 @@ "p-limit": "^2.2.0" } }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, "resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", @@ -12072,30 +11921,30 @@ "dev": true }, "@jest/console": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.5.0.tgz", - "integrity": "sha512-NEpkObxPwyw/XxZVLPmAGKE89IQRp4puc6IQRPru6JKd1M3fW9v1xM1AnzIJE65hbCkzQAdnL8P47e9hzhiYLQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.1.tgz", + "integrity": "sha512-Aj772AYgwTSr5w8qnyoJ0eDYvN6bMsH3ORH1ivMotrInHLKdUz6BDlaEXHdM6kODaBIkNIyQGzsMvRdOv7VG7Q==", "dev": true, "requires": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.1", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^29.5.0", - "jest-util": "^29.5.0", + "jest-message-util": "^29.6.1", + "jest-util": "^29.6.1", "slash": "^3.0.0" } }, "@jest/core": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.5.0.tgz", - "integrity": "sha512-28UzQc7ulUrOQw1IsN/kv1QES3q2kkbl/wGslyhAclqZ/8cMdB5M68BffkIdSJgKBUt50d3hbwJ92XESlE7LiQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.1.tgz", + "integrity": "sha512-CcowHypRSm5oYQ1obz1wfvkjZZ2qoQlrKKvlfPwh5jUXVU12TWr2qMeH8chLMuTFzHh5a1g2yaqlqDICbr+ukQ==", "dev": true, "requires": { - "@jest/console": "^29.5.0", - "@jest/reporters": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/console": "^29.6.1", + "@jest/reporters": "^29.6.1", + "@jest/test-result": "^29.6.1", + "@jest/transform": "^29.6.1", + "@jest/types": "^29.6.1", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", @@ -12103,20 +11952,20 @@ "exit": "^0.1.2", "graceful-fs": "^4.2.9", "jest-changed-files": "^29.5.0", - "jest-config": "^29.5.0", - "jest-haste-map": "^29.5.0", - "jest-message-util": "^29.5.0", + "jest-config": "^29.6.1", + "jest-haste-map": "^29.6.1", + "jest-message-util": "^29.6.1", "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.5.0", - "jest-resolve-dependencies": "^29.5.0", - "jest-runner": "^29.5.0", - "jest-runtime": "^29.5.0", - "jest-snapshot": "^29.5.0", - "jest-util": "^29.5.0", - "jest-validate": "^29.5.0", - "jest-watcher": "^29.5.0", + "jest-resolve": "^29.6.1", + "jest-resolve-dependencies": "^29.6.1", + "jest-runner": "^29.6.1", + "jest-runtime": "^29.6.1", + "jest-snapshot": "^29.6.1", + "jest-util": "^29.6.1", + "jest-validate": "^29.6.1", + "jest-watcher": "^29.6.1", "micromatch": "^4.0.4", - "pretty-format": "^29.5.0", + "pretty-format": "^29.6.1", "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, @@ -12128,12 +11977,12 @@ "dev": true }, "pretty-format": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz", + "integrity": "sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==", "dev": true, "requires": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.0", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" } @@ -12180,74 +12029,82 @@ } }, "@jest/environment": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.5.0.tgz", - "integrity": "sha512-5FXw2+wD29YU1d4I2htpRX7jYnAyTRjP2CsXQdo9SAM8g3ifxWPSV0HnClSn71xwctr0U3oZIIH+dtbfmnbXVQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.1.tgz", + "integrity": "sha512-RMMXx4ws+Gbvw3DfLSuo2cfQlK7IwGbpuEWXCqyYDcqYTI+9Ju3a5hDnXaxjNsa6uKh9PQF2v+qg+RLe63tz5A==", "dev": true, "requires": { - "@jest/fake-timers": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/fake-timers": "^29.6.1", + "@jest/types": "^29.6.1", "@types/node": "*", - "jest-mock": "^29.5.0" + "jest-mock": "^29.6.1" } }, "@jest/expect": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.5.0.tgz", - "integrity": "sha512-PueDR2HGihN3ciUNGr4uelropW7rqUfTiOn+8u0leg/42UhblPxHkfoh0Ruu3I9Y1962P3u2DY4+h7GVTSVU6g==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.1.tgz", + "integrity": "sha512-N5xlPrAYaRNyFgVf2s9Uyyvr795jnB6rObuPx4QFvNJz8aAjpZUDfO4bh5G/xuplMID8PrnuF1+SfSyDxhsgYg==", "dev": true, "requires": { - "expect": "^29.5.0", - "jest-snapshot": "^29.5.0" + "expect": "^29.6.1", + "jest-snapshot": "^29.6.1" } }, "@jest/expect-utils": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.5.0.tgz", - "integrity": "sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.1.tgz", + "integrity": "sha512-o319vIf5pEMx0LmzSxxkYYxo4wrRLKHq9dP1yJU7FoPTB0LfAKSz8SWD6D/6U3v/O52t9cF5t+MeJiRsfk7zMw==", "dev": true, "requires": { "jest-get-type": "^29.4.3" + }, + "dependencies": { + "jest-get-type": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz", + "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==", + "dev": true + } } }, "@jest/fake-timers": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.5.0.tgz", - "integrity": "sha512-9ARvuAAQcBwDAqOnglWq2zwNIRUDtk/SCkp/ToGEhFv5r86K21l+VEs0qNTaXtyiY0lEePl3kylijSYJQqdbDg==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.1.tgz", + "integrity": "sha512-RdgHgbXyosCDMVYmj7lLpUwXA4c69vcNzhrt69dJJdf8azUrpRh3ckFCaTPNjsEeRi27Cig0oKDGxy5j7hOgHg==", "dev": true, "requires": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.1", "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", - "jest-message-util": "^29.5.0", - "jest-mock": "^29.5.0", - "jest-util": "^29.5.0" + "jest-message-util": "^29.6.1", + "jest-mock": "^29.6.1", + "jest-util": "^29.6.1" } }, "@jest/globals": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.5.0.tgz", - "integrity": "sha512-S02y0qMWGihdzNbUiqSAiKSpSozSuHX5UYc7QbnHP+D9Lyw8DgGGCinrN9uSuHPeKgSSzvPom2q1nAtBvUsvPQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.1.tgz", + "integrity": "sha512-2VjpaGy78JY9n9370H8zGRCFbYVWwjY6RdDMhoJHa1sYfwe6XM/azGN0SjY8kk7BOZApIejQ1BFPyH7FPG0w3A==", "dev": true, "requires": { - "@jest/environment": "^29.5.0", - "@jest/expect": "^29.5.0", - "@jest/types": "^29.5.0", - "jest-mock": "^29.5.0" + "@jest/environment": "^29.6.1", + "@jest/expect": "^29.6.1", + "@jest/types": "^29.6.1", + "jest-mock": "^29.6.1" } }, "@jest/reporters": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.5.0.tgz", - "integrity": "sha512-D05STXqj/M8bP9hQNSICtPqz97u7ffGzZu+9XLucXhkOFBqKcXe04JLZOgIekOxdb73MAoBUFnqvf7MCpKk5OA==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.1.tgz", + "integrity": "sha512-9zuaI9QKr9JnoZtFQlw4GREQbxgmNYXU6QuWtmuODvk5nvPUeBYapVR/VYMyi2WSx3jXTLJTJji8rN6+Cm4+FA==", "dev": true, "requires": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", - "@jridgewell/trace-mapping": "^0.3.15", + "@jest/console": "^29.6.1", + "@jest/test-result": "^29.6.1", + "@jest/transform": "^29.6.1", + "@jest/types": "^29.6.1", + "@jridgewell/trace-mapping": "^0.3.18", "@types/node": "*", "chalk": "^4.0.0", "collect-v8-coverage": "^1.0.0", @@ -12259,97 +12116,76 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.5.0", - "jest-util": "^29.5.0", - "jest-worker": "^29.5.0", + "jest-message-util": "^29.6.1", + "jest-util": "^29.6.1", + "jest-worker": "^29.6.1", "slash": "^3.0.0", "string-length": "^4.0.1", "strip-ansi": "^6.0.0", "v8-to-istanbul": "^9.0.1" - }, - "dependencies": { - "istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dev": true, - "requires": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } } }, "@jest/schemas": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", - "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.0.tgz", + "integrity": "sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==", "dev": true, "requires": { - "@sinclair/typebox": "^0.25.16" + "@sinclair/typebox": "^0.27.8" } }, "@jest/source-map": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.4.3.tgz", - "integrity": "sha512-qyt/mb6rLyd9j1jUts4EQncvS6Yy3PM9HghnNv86QBlV+zdL2inCdK1tuVlL+J+lpiw2BI67qXOrX3UurBqQ1w==", + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.0.tgz", + "integrity": "sha512-oA+I2SHHQGxDCZpbrsCQSoMLb3Bz547JnM+jUr9qEbuw0vQlWZfpPS7CO9J7XiwKicEz9OFn/IYoLkkiUD7bzA==", "dev": true, "requires": { - "@jridgewell/trace-mapping": "^0.3.15", + "@jridgewell/trace-mapping": "^0.3.18", "callsites": "^3.0.0", "graceful-fs": "^4.2.9" } }, "@jest/test-result": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.5.0.tgz", - "integrity": "sha512-fGl4rfitnbfLsrfx1uUpDEESS7zM8JdgZgOCQuxQvL1Sn/I6ijeAVQWGfXI9zb1i9Mzo495cIpVZhA0yr60PkQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.1.tgz", + "integrity": "sha512-Ynr13ZRcpX6INak0TPUukU8GWRfm/vAytE3JbJNGAvINySWYdfE7dGZMbk36oVuK4CigpbhMn8eg1dixZ7ZJOw==", "dev": true, "requires": { - "@jest/console": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/console": "^29.6.1", + "@jest/types": "^29.6.1", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" } }, "@jest/test-sequencer": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.5.0.tgz", - "integrity": "sha512-yPafQEcKjkSfDXyvtgiV4pevSeyuA6MQr6ZIdVkWJly9vkqjnFfcfhRQqpD5whjoU8EORki752xQmjaqoFjzMQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.1.tgz", + "integrity": "sha512-oBkC36PCDf/wb6dWeQIhaviU0l5u6VCsXa119yqdUosYAt7/FbQU2M2UoziO3igj/HBDEgp57ONQ3fm0v9uyyg==", "dev": true, "requires": { - "@jest/test-result": "^29.5.0", + "@jest/test-result": "^29.6.1", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.5.0", + "jest-haste-map": "^29.6.1", "slash": "^3.0.0" } }, "@jest/transform": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.5.0.tgz", - "integrity": "sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.1.tgz", + "integrity": "sha512-URnTneIU3ZjRSaf906cvf6Hpox3hIeJXRnz3VDSw5/X93gR8ycdfSIEy19FlVx8NFmpN7fe3Gb1xF+NjXaQLWg==", "dev": true, "requires": { "@babel/core": "^7.11.6", - "@jest/types": "^29.5.0", - "@jridgewell/trace-mapping": "^0.3.15", + "@jest/types": "^29.6.1", + "@jridgewell/trace-mapping": "^0.3.18", "babel-plugin-istanbul": "^6.1.1", "chalk": "^4.0.0", "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.5.0", + "jest-haste-map": "^29.6.1", "jest-regex-util": "^29.4.3", - "jest-util": "^29.5.0", + "jest-util": "^29.6.1", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", @@ -12361,26 +12197,16 @@ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true - }, - "write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - } } } }, "@jest/types": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.5.0.tgz", - "integrity": "sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.1.tgz", + "integrity": "sha512-tPKQNMPuXgvdOn2/Lg9HNfUvjYVGolt04Hp03f5hAk878uwOLikN+JzeLY0HcVgKgFl9Hs3EIqpu3WX27XNhnw==", "dev": true, "requires": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.0", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", @@ -12389,13 +12215,14 @@ } }, "@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", "dev": true, "requires": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" } }, "@jridgewell/resolve-uri": { @@ -12411,32 +12238,19 @@ "dev": true }, "@jridgewell/source-map": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.3.tgz", - "integrity": "sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", "dev": true, "requires": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" - }, - "dependencies": { - "@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - } } }, "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", "dev": true }, "@jridgewell/trace-mapping": { @@ -12447,6 +12261,14 @@ "requires": { "@jridgewell/resolve-uri": "3.1.0", "@jridgewell/sourcemap-codec": "1.4.14" + }, + "dependencies": { + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + } } }, "@jsep-plugin/regex": { @@ -12502,27 +12324,27 @@ "dev": true }, "@sinclair/typebox": { - "version": "0.25.24", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", - "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==", + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", "dev": true }, "@sinonjs/commons": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", - "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", + "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", "dev": true, "requires": { "type-detect": "4.0.8" } }, "@sinonjs/fake-timers": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz", - "integrity": "sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dev": true, "requires": { - "@sinonjs/commons": "^2.0.0" + "@sinonjs/commons": "^3.0.0" } }, "@stoplight/better-ajv-errors": { @@ -12535,9 +12357,9 @@ } }, "@stoplight/json": { - "version": "3.20.2", - "resolved": "https://registry.npmjs.org/@stoplight/json/-/json-3.20.2.tgz", - "integrity": "sha512-e3Eb/DdLSpJVAsxAG1jKSnl4TVZLl2pH8KsJBWKf5GPCeI58Eo0ZpRTX3HcZ0gBaHWH6CnEHJkCRCONhoFbDIA==", + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/@stoplight/json/-/json-3.21.0.tgz", + "integrity": "sha512-5O0apqJ/t4sIevXCO3SBN9AHCEKKR/Zb4gaj7wYe5863jme9g02Q0n/GhM7ZCALkL+vGPTe4ZzTETP8TFtsw3g==", "requires": { "@stoplight/ordered-object-literal": "^1.0.3", "@stoplight/path": "^1.3.2", @@ -12564,11 +12386,11 @@ } }, "@stoplight/json-ref-resolver": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@stoplight/json-ref-resolver/-/json-ref-resolver-3.1.5.tgz", - "integrity": "sha512-uaKLITor7UF+JBtI84zs3aOWM0L79zp7w9TrBTwPtx5SLbaQQ4HadDKgX5yhFOLMApLdhwhiftF4c0GFanOxGg==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@stoplight/json-ref-resolver/-/json-ref-resolver-3.1.6.tgz", + "integrity": "sha512-YNcWv3R3n3U6iQYBsFOiWSuRGE5su1tJSiX6pAPRVk7dP0L7lqCteXGzuVRQ0gMZqUl8v1P0+fAKxF6PLo9B5A==", "requires": { - "@stoplight/json": "^3.17.0", + "@stoplight/json": "^3.21.0", "@stoplight/path": "^1.3.2", "@stoplight/types": "^12.3.0 || ^13.0.0", "@types/urijs": "^1.19.19", @@ -12576,7 +12398,7 @@ "fast-memoize": "^2.5.2", "immer": "^9.0.6", "lodash": "^4.17.21", - "tslib": "^2.3.1", + "tslib": "^2.6.0", "urijs": "^1.19.11" } }, @@ -12591,12 +12413,12 @@ "integrity": "sha512-lyIc6JUlUA8Ve5ELywPC8I2Sdnh1zc1zmbYgVarhXIp9YeAB0ReeqmGEOWNtlHkbP2DAA1AL65Wfn2ncjK/jtQ==" }, "@stoplight/spectral-core": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/@stoplight/spectral-core/-/spectral-core-1.17.0.tgz", - "integrity": "sha512-7D9og+iX2bCJMGPY7cvt2YdevFGDeSI7S2jPo7HWeGGitkef1FDSQ9AEapdwmCYvOJ7ztUlQdCCLTOb6Aani8w==", + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/@stoplight/spectral-core/-/spectral-core-1.18.2.tgz", + "integrity": "sha512-bjNXo0VzXTDdFB3oKvVCAHW5rJ1/eMQzN6k1N5RW8tdEXMcEnI56MByRzADniVa+SvrutApK2u+9XwUZtIIT3w==", "requires": { "@stoplight/better-ajv-errors": "1.0.3", - "@stoplight/json": "~3.20.1", + "@stoplight/json": "~3.21.0", "@stoplight/path": "1.3.2", "@stoplight/spectral-parsers": "^1.0.0", "@stoplight/spectral-ref-resolver": "^1.0.0", @@ -12664,11 +12486,11 @@ } }, "@stoplight/spectral-parsers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@stoplight/spectral-parsers/-/spectral-parsers-1.0.2.tgz", - "integrity": "sha512-ZQXknJ+BM5Re4Opj4cgVlHgG2qyOk/wznKJq3Vf1qsBEg2CNzN0pJmSB0deRqW0kArqm44qpb8c+cz3F2rgMtw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@stoplight/spectral-parsers/-/spectral-parsers-1.0.3.tgz", + "integrity": "sha512-J0KW5Rh5cHWnJQ3yN+cr/ijNFVirPSR0pkQbdrNX30VboEl083UEDrQ3yov9kjLVIWEk9t9kKE7Eo3QT/k4JLA==", "requires": { - "@stoplight/json": "~3.20.1", + "@stoplight/json": "~3.21.0", "@stoplight/types": "^13.6.0", "@stoplight/yaml": "~4.2.3", "tslib": "^2.3.1" @@ -12712,9 +12534,9 @@ } }, "@stoplight/types": { - "version": "13.12.0", - "resolved": "https://registry.npmjs.org/@stoplight/types/-/types-13.12.0.tgz", - "integrity": "sha512-lpyB8b5cNcg/CyQ9W7Q2BxPkHhBA8+9byviGT6uL2Ok/5iao0poCnFUH++Cd7VN1/RaXrv0LT9fyOg4fJIl0iA==", + "version": "13.15.0", + "resolved": "https://registry.npmjs.org/@stoplight/types/-/types-13.15.0.tgz", + "integrity": "sha512-pBLjVRrWGVd+KzTbL3qrmufSKIEp0UfziDBdt/nrTHPKrlrtVwaHdrrQMcpM23yJDU1Wcg4cHvhIuGtKCT5OmA==", "requires": { "@types/json-schema": "^7.0.4", "utility-types": "^3.10.0" @@ -12737,90 +12559,90 @@ "integrity": "sha512-sV+51I7WYnLJnKPn2EMWgS4EUfoP4iWEbrWwbXsj0MZCB/xOK8j6+C9fntIdOM50kpx45ZLC3s6kwKivWuqvyg==" }, "@swc/core": { - "version": "1.3.52", - "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.3.52.tgz", - "integrity": "sha512-2LOkkl5Ebyzg1e2pu/tqz5zAAiNAtSR99KZDJz4+FTpo6lYwr+SRkeXSNFrYAReHBMb5VJoimrLDLHJ2X1E7Lg==", + "version": "1.3.69", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.3.69.tgz", + "integrity": "sha512-Khc/DE9D5+2tYTHgAIp5DZARbs8kldWg3b0Jp6l8FQLjelcLFmlQWSwKhVZrgv4oIbgZydIp8jInsvTalMHqnQ==", "dev": true, "requires": { - "@swc/core-darwin-arm64": "1.3.52", - "@swc/core-darwin-x64": "1.3.52", - "@swc/core-linux-arm-gnueabihf": "1.3.52", - "@swc/core-linux-arm64-gnu": "1.3.52", - "@swc/core-linux-arm64-musl": "1.3.52", - "@swc/core-linux-x64-gnu": "1.3.52", - "@swc/core-linux-x64-musl": "1.3.52", - "@swc/core-win32-arm64-msvc": "1.3.52", - "@swc/core-win32-ia32-msvc": "1.3.52", - "@swc/core-win32-x64-msvc": "1.3.52" + "@swc/core-darwin-arm64": "1.3.69", + "@swc/core-darwin-x64": "1.3.69", + "@swc/core-linux-arm-gnueabihf": "1.3.69", + "@swc/core-linux-arm64-gnu": "1.3.69", + "@swc/core-linux-arm64-musl": "1.3.69", + "@swc/core-linux-x64-gnu": "1.3.69", + "@swc/core-linux-x64-musl": "1.3.69", + "@swc/core-win32-arm64-msvc": "1.3.69", + "@swc/core-win32-ia32-msvc": "1.3.69", + "@swc/core-win32-x64-msvc": "1.3.69" } }, "@swc/core-darwin-arm64": { - "version": "1.3.52", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.52.tgz", - "integrity": "sha512-Y+4YDN7mAhMgqLVMjpIOagFg93uWdQRsJXd3NAXo24CAJXLBuXsiXQdJVdhGavQkF0+NuhFSTGrzB8TknzWQkg==", + "version": "1.3.69", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.69.tgz", + "integrity": "sha512-IjZTf12zIPWkV3D7toaLDoJPSkLhQ4fDH8G6/yCJUI27cBFOI3L8LXqptYmISoN5yYdrcnNpdqdapD09JPuNJg==", "dev": true, "optional": true }, "@swc/core-darwin-x64": { - "version": "1.3.52", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.3.52.tgz", - "integrity": "sha512-XbvBA+DwTedleh/smYA6E1Z1L1tVnF+ULhpszAAW4YYDzH47R73ucCdcSH/aHs4swv+uyvRquKoDtTTNZFvD4A==", + "version": "1.3.69", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.3.69.tgz", + "integrity": "sha512-/wBO0Rn5oS5dJI/L9kJRkPAdksVwl5H9nleW/NM3A40N98VV8T7h/i1nO051mxIjq0R6qXVGOWFbBoLrPYucJg==", "dev": true, "optional": true }, "@swc/core-linux-arm-gnueabihf": { - "version": "1.3.52", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.52.tgz", - "integrity": "sha512-YRTLjZcoGH09q0vjg5s6vxOryzAGlMx2Ly6Hq8+8ruBtG3QTsCN3y7MI8mX254xdFCJiTX5YwQheGjRXS7FF9A==", + "version": "1.3.69", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.69.tgz", + "integrity": "sha512-NShCjMv6Xn8ckMKBRqmprXvUF14+jXY0TcNKXwjYErzoIUFOnG72M36HxT4QEeAtKZ4Eg4CZFE4zlJ27fDp1gg==", "dev": true, "optional": true }, "@swc/core-linux-arm64-gnu": { - "version": "1.3.52", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.52.tgz", - "integrity": "sha512-B0HKtj0XpqpqflGKMxFlyXyORN0xshF8TVzUBD/2FgF7o8fE2RM1eqtdf1EzmZTT1hwxLpJXrEj+0gSXfWPW4A==", + "version": "1.3.69", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.69.tgz", + "integrity": "sha512-VRPOJj4idopSHIj1bOVXX0SgaB18R8yZNunb7eXS5ZcjVxAcdvqyIz3RdQX1zaJFCGzcdPLzBRP32DZWWGE8Ng==", "dev": true, "optional": true }, "@swc/core-linux-arm64-musl": { - "version": "1.3.52", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.52.tgz", - "integrity": "sha512-GCxNjTAborAmv4VV1AMZLyejHLGgIzu13tvLUFqybtU4jFxVbE2ZK4ZnPCfDlWN+eBwyRWk1oNFR2hH+66vaUQ==", + "version": "1.3.69", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.69.tgz", + "integrity": "sha512-QxeSiZqo5x1X8vq8oUWLibq+IZJcxl9vy0sLUmzdjF2b/Z+qxKP3gutxnb2tzJaHqPVBbEZaILERIGy1qWdumQ==", "dev": true, "optional": true }, "@swc/core-linux-x64-gnu": { - "version": "1.3.52", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.52.tgz", - "integrity": "sha512-mrvDBSkLI3Mza2qcu3uzB5JGwMBYDb1++UQ1VB0RXf2AR21/cCper4P44IpfdeqFz9XyXq18Sh3gblICUCGvig==", + "version": "1.3.69", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.69.tgz", + "integrity": "sha512-b+DUlVxYox3BwD3PyTwhLvqtu6TYZtW+S6O0FnttH11o4skHN0XyJ/cUZSI0X2biSmfDsizRDUt1PWPFM+F7SA==", "dev": true, "optional": true }, "@swc/core-linux-x64-musl": { - "version": "1.3.52", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.52.tgz", - "integrity": "sha512-r9RIvKUQv7yBkpXz+QxPAucdoj8ymBlgIm5rLE0b5VmU7dlKBnpAmRBYaITdH6IXhF0pwuG+FHAd5elBcrkIwA==", + "version": "1.3.69", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.69.tgz", + "integrity": "sha512-QXjsI+f8n9XPZHUvmGgkABpzN4M9kdSbhqBOZmv3o0AsDGNCA4uVowQqgZoPFAqlJTpwHeDmrv5sQ13HN+LOGw==", "dev": true, "optional": true }, "@swc/core-win32-arm64-msvc": { - "version": "1.3.52", - "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.52.tgz", - "integrity": "sha512-YRtEr7tDo0Wes3M2ZhigF4erUjWBXeFP+O+iz6ELBBmPG7B7m/lrA21eiW9/90YGnzi0iNo46shK6PfXuPhP+Q==", + "version": "1.3.69", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.69.tgz", + "integrity": "sha512-wn7A8Ws1fyviuCUB2Vg6IotiZeuqiO1Mz3d+YDae2EYyNpj1kNHvjBip8GHkfGzZG+jVrvG6NHsDo0KO/pGb8A==", "dev": true, "optional": true }, "@swc/core-win32-ia32-msvc": { - "version": "1.3.52", - "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.52.tgz", - "integrity": "sha512-t1x6EdYg3nnnmZBkEtmdXwGpVFTnkNCYyTILcn4367tKI6NpcNe75tz6wBUZAWAmol6Bn75je9KHDNC9uBcO2A==", + "version": "1.3.69", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.69.tgz", + "integrity": "sha512-LsFBXtXqxEcVaaOGEZ9X3qdMzobVoJqKv8DnksuDsWcBk+9WCeTz2u/iB+7yZ2HGuPXkCqTRqhFo6FX9aC00kQ==", "dev": true, "optional": true }, "@swc/core-win32-x64-msvc": { - "version": "1.3.52", - "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.52.tgz", - "integrity": "sha512-ef0KzcHxWgRii0EyUlgzNA0ycqaRRKxSb6QCO9Ev3tib4SSjbPy0MAndU7f82Ndm/pPmXT+7cciRtZ083vzjZA==", + "version": "1.3.69", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.69.tgz", + "integrity": "sha512-ieBscU0gUgKjaseFI07tAaGqHvKyweNknPeSYEZOasVZUczhD6fK2GRnVREhv2RB2qdKC/VGFBsgRDMgzq1VLw==", "dev": true, "optional": true }, @@ -12861,15 +12683,15 @@ "dev": true }, "@tsconfig/node16": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", - "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", "dev": true }, "@types/babel__core": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.0.tgz", - "integrity": "sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==", + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.1.tgz", + "integrity": "sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==", "dev": true, "requires": { "@babel/parser": "^7.20.7", @@ -12899,12 +12721,12 @@ } }, "@types/babel__traverse": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.3.tgz", - "integrity": "sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==", + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.1.tgz", + "integrity": "sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==", "dev": true, "requires": { - "@babel/types": "^7.3.0" + "@babel/types": "^7.20.7" } }, "@types/es-aggregate-error": { @@ -12913,12 +12735,19 @@ "integrity": "sha512-erqUpFXksaeR2kejKnhnjZjbFxUpGZx4Z7ydNL9ie8tEhXPiZTsLeUDJ6aR1F8j5wWUAtOAQWUqkc7givBJbBA==", "requires": { "@types/node": "*" + }, + "dependencies": { + "@types/node": { + "version": "20.4.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.4.2.tgz", + "integrity": "sha512-Dd0BYtWgnWJKwO1jkmTrzofjK2QXXcai0dmtzvIBhcA+RsG5h8R3xlyta0kGOZRNfL9GuRtb1knmPEhQrePCEw==" + } } }, "@types/eslint": { - "version": "8.37.0", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.37.0.tgz", - "integrity": "sha512-Piet7dG2JBuDIfohBngQ3rCt7MgO9xCO4xIMKxBThCq5PNRB91IjlJ10eJVwfoNtvTErmxLzwBZ7rHZtbOMmFQ==", + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.0.tgz", + "integrity": "sha512-gsF+c/0XOguWgaOgvFs+xnnRqt9GwgTvIks36WpE6ueeI4KCEHHd8K/CKHqhOqrJKsYH8m27kRzQEvWXAwXUTw==", "dev": true, "requires": { "@types/estree": "*", @@ -12991,9 +12820,9 @@ "dev": true }, "@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==" + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==" }, "@types/json5": { "version": "0.0.29", @@ -13002,14 +12831,15 @@ "dev": true }, "@types/node": { - "version": "18.16.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.1.tgz", - "integrity": "sha512-DZxSZWXxFfOlx7k7Rv4LAyiMroaxa3Ly/7OOzZO8cBNho0YzAi4qlbrx8W27JGqG57IgR/6J7r+nOJWw6kcvZA==" + "version": "18.16.19", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.19.tgz", + "integrity": "sha512-IXl7o+R9iti9eBW4Wg2hx1xQDig183jj7YLn8F7udNceyfkbn1ZxmzZXuak20gR40D7pIkIY1kYGx5VIGbaHKA==", + "dev": true }, "@types/node-fetch": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.3.tgz", - "integrity": "sha512-ETTL1mOEdq/sxUtgtOhKjyB2Irra4cjxksvcMUR5Zr4n+PxVhsCD9WS46oPbHL3et9Zde7CNRr+WUNlcHvsX+w==", + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.4.tgz", + "integrity": "sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg==", "dev": true, "requires": { "@types/node": "*", @@ -13017,15 +12847,15 @@ } }, "@types/prettier": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz", - "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==", + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", + "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", "dev": true }, "@types/semver": { - "version": "7.3.13", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", - "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", "dev": true }, "@types/stack-utils": { @@ -13065,17 +12895,17 @@ } }, "@typescript-eslint/eslint-plugin": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.0.tgz", - "integrity": "sha512-p0QgrEyrxAWBecR56gyn3wkG15TJdI//eetInP3zYRewDh0XS+DhB3VUAd3QqvziFsfaQIoIuZMxZRB7vXYaYw==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", + "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", "dev": true, "requires": { "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.59.0", - "@typescript-eslint/type-utils": "5.59.0", - "@typescript-eslint/utils": "5.59.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/type-utils": "5.62.0", + "@typescript-eslint/utils": "5.62.0", "debug": "^4.3.4", - "grapheme-splitter": "^1.0.4", + "graphemer": "^1.4.0", "ignore": "^5.2.0", "natural-compare-lite": "^1.4.0", "semver": "^7.3.7", @@ -13083,53 +12913,53 @@ } }, "@typescript-eslint/parser": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.0.tgz", - "integrity": "sha512-qK9TZ70eJtjojSUMrrEwA9ZDQ4N0e/AuoOIgXuNBorXYcBDk397D2r5MIe1B3cok/oCtdNC5j+lUUpVB+Dpb+w==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", + "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.59.0", - "@typescript-eslint/types": "5.59.0", - "@typescript-eslint/typescript-estree": "5.59.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", "debug": "^4.3.4" } }, "@typescript-eslint/scope-manager": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.0.tgz", - "integrity": "sha512-tsoldKaMh7izN6BvkK6zRMINj4Z2d6gGhO2UsI8zGZY3XhLq1DndP3Ycjhi1JwdwPRwtLMW4EFPgpuKhbCGOvQ==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", "dev": true, "requires": { - "@typescript-eslint/types": "5.59.0", - "@typescript-eslint/visitor-keys": "5.59.0" + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" } }, "@typescript-eslint/type-utils": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.0.tgz", - "integrity": "sha512-d/B6VSWnZwu70kcKQSCqjcXpVH+7ABKH8P1KNn4K7j5PXXuycZTPXF44Nui0TEm6rbWGi8kc78xRgOC4n7xFgA==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", + "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "5.59.0", - "@typescript-eslint/utils": "5.59.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "@typescript-eslint/utils": "5.62.0", "debug": "^4.3.4", "tsutils": "^3.21.0" } }, "@typescript-eslint/types": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.0.tgz", - "integrity": "sha512-yR2h1NotF23xFFYKHZs17QJnB51J/s+ud4PYU4MqdZbzeNxpgUr05+dNeCN/bb6raslHvGdd6BFCkVhpPk/ZeA==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.0.tgz", - "integrity": "sha512-sUNnktjmI8DyGzPdZ8dRwW741zopGxltGs/SAPgGL/AAgDpiLsCFLcMNSpbfXfmnNeHmK9h3wGmCkGRGAoUZAg==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", "dev": true, "requires": { - "@typescript-eslint/types": "5.59.0", - "@typescript-eslint/visitor-keys": "5.59.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -13138,174 +12968,174 @@ } }, "@typescript-eslint/utils": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.0.tgz", - "integrity": "sha512-GGLFd+86drlHSvPgN/el6dRQNYYGOvRSDVydsUaQluwIW3HvbXuxyuD5JETvBt/9qGYe+lOrDk6gRrWOHb/FvA==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.59.0", - "@typescript-eslint/types": "5.59.0", - "@typescript-eslint/typescript-estree": "5.59.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", "eslint-scope": "^5.1.1", "semver": "^7.3.7" } }, "@typescript-eslint/visitor-keys": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.0.tgz", - "integrity": "sha512-qZ3iXxQhanchCeaExlKPV3gDQFxMUmU35xfd5eCXB6+kUw1TUAbIy2n7QIrwz9s98DQLzNWyHp61fY0da4ZcbA==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", "dev": true, "requires": { - "@typescript-eslint/types": "5.59.0", + "@typescript-eslint/types": "5.62.0", "eslint-visitor-keys": "^3.3.0" } }, "@webassemblyjs/ast": { - "version": "1.11.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.5.tgz", - "integrity": "sha512-LHY/GSAZZRpsNQH+/oHqhRQ5FT7eoULcBqgfyTB5nQHogFnK3/7QoN7dLnwSE/JkUAF0SrRuclT7ODqMFtWxxQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", + "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", "dev": true, "requires": { - "@webassemblyjs/helper-numbers": "1.11.5", - "@webassemblyjs/helper-wasm-bytecode": "1.11.5" + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" } }, "@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.5.tgz", - "integrity": "sha512-1j1zTIC5EZOtCplMBG/IEwLtUojtwFVwdyVMbL/hwWqbzlQoJsWCOavrdnLkemwNoC/EOwtUFch3fuo+cbcXYQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", "dev": true }, "@webassemblyjs/helper-api-error": { - "version": "1.11.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.5.tgz", - "integrity": "sha512-L65bDPmfpY0+yFrsgz8b6LhXmbbs38OnwDCf6NpnMUYqa+ENfE5Dq9E42ny0qz/PdR0LJyq/T5YijPnU8AXEpA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", "dev": true }, "@webassemblyjs/helper-buffer": { - "version": "1.11.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.5.tgz", - "integrity": "sha512-fDKo1gstwFFSfacIeH5KfwzjykIE6ldh1iH9Y/8YkAZrhmu4TctqYjSh7t0K2VyDSXOZJ1MLhht/k9IvYGcIxg==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", "dev": true }, "@webassemblyjs/helper-numbers": { - "version": "1.11.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.5.tgz", - "integrity": "sha512-DhykHXM0ZABqfIGYNv93A5KKDw/+ywBFnuWybZZWcuzWHfbp21wUfRkbtz7dMGwGgT4iXjWuhRMA2Mzod6W4WA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", "dev": true, "requires": { - "@webassemblyjs/floating-point-hex-parser": "1.11.5", - "@webassemblyjs/helper-api-error": "1.11.5", + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", "@xtuc/long": "4.2.2" } }, "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.5.tgz", - "integrity": "sha512-oC4Qa0bNcqnjAowFn7MPCETQgDYytpsfvz4ujZz63Zu/a/v71HeCAAmZsgZ3YVKec3zSPYytG3/PrRCqbtcAvA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", "dev": true }, "@webassemblyjs/helper-wasm-section": { - "version": "1.11.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.5.tgz", - "integrity": "sha512-uEoThA1LN2NA+K3B9wDo3yKlBfVtC6rh0i4/6hvbz071E8gTNZD/pT0MsBf7MeD6KbApMSkaAK0XeKyOZC7CIA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", + "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.5", - "@webassemblyjs/helper-buffer": "1.11.5", - "@webassemblyjs/helper-wasm-bytecode": "1.11.5", - "@webassemblyjs/wasm-gen": "1.11.5" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" } }, "@webassemblyjs/ieee754": { - "version": "1.11.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.5.tgz", - "integrity": "sha512-37aGq6qVL8A8oPbPrSGMBcp38YZFXcHfiROflJn9jxSdSMMM5dS5P/9e2/TpaJuhE+wFrbukN2WI6Hw9MH5acg==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", "dev": true, "requires": { "@xtuc/ieee754": "^1.2.0" } }, "@webassemblyjs/leb128": { - "version": "1.11.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.5.tgz", - "integrity": "sha512-ajqrRSXaTJoPW+xmkfYN6l8VIeNnR4vBOTQO9HzR7IygoCcKWkICbKFbVTNMjMgMREqXEr0+2M6zukzM47ZUfQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", "dev": true, "requires": { "@xtuc/long": "4.2.2" } }, "@webassemblyjs/utf8": { - "version": "1.11.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.5.tgz", - "integrity": "sha512-WiOhulHKTZU5UPlRl53gHR8OxdGsSOxqfpqWeA2FmcwBMaoEdz6b2x2si3IwC9/fSPLfe8pBMRTHVMk5nlwnFQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", "dev": true }, "@webassemblyjs/wasm-edit": { - "version": "1.11.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.5.tgz", - "integrity": "sha512-C0p9D2fAu3Twwqvygvf42iGCQ4av8MFBLiTb+08SZ4cEdwzWx9QeAHDo1E2k+9s/0w1DM40oflJOpkZ8jW4HCQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", + "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.5", - "@webassemblyjs/helper-buffer": "1.11.5", - "@webassemblyjs/helper-wasm-bytecode": "1.11.5", - "@webassemblyjs/helper-wasm-section": "1.11.5", - "@webassemblyjs/wasm-gen": "1.11.5", - "@webassemblyjs/wasm-opt": "1.11.5", - "@webassemblyjs/wasm-parser": "1.11.5", - "@webassemblyjs/wast-printer": "1.11.5" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" } }, "@webassemblyjs/wasm-gen": { - "version": "1.11.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.5.tgz", - "integrity": "sha512-14vteRlRjxLK9eSyYFvw1K8Vv+iPdZU0Aebk3j6oB8TQiQYuO6hj9s4d7qf6f2HJr2khzvNldAFG13CgdkAIfA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", + "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.5", - "@webassemblyjs/helper-wasm-bytecode": "1.11.5", - "@webassemblyjs/ieee754": "1.11.5", - "@webassemblyjs/leb128": "1.11.5", - "@webassemblyjs/utf8": "1.11.5" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "@webassemblyjs/wasm-opt": { - "version": "1.11.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.5.tgz", - "integrity": "sha512-tcKwlIXstBQgbKy1MlbDMlXaxpucn42eb17H29rawYLxm5+MsEmgPzeCP8B1Cl69hCice8LeKgZpRUAPtqYPgw==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", + "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.5", - "@webassemblyjs/helper-buffer": "1.11.5", - "@webassemblyjs/wasm-gen": "1.11.5", - "@webassemblyjs/wasm-parser": "1.11.5" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" } }, "@webassemblyjs/wasm-parser": { - "version": "1.11.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.5.tgz", - "integrity": "sha512-SVXUIwsLQlc8srSD7jejsfTU83g7pIGr2YYNb9oHdtldSxaOhvA5xwvIiWIfcX8PlSakgqMXsLpLfbbJ4cBYew==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", + "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.5", - "@webassemblyjs/helper-api-error": "1.11.5", - "@webassemblyjs/helper-wasm-bytecode": "1.11.5", - "@webassemblyjs/ieee754": "1.11.5", - "@webassemblyjs/leb128": "1.11.5", - "@webassemblyjs/utf8": "1.11.5" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "@webassemblyjs/wast-printer": { - "version": "1.11.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.5.tgz", - "integrity": "sha512-f7Pq3wvg3GSPUPzR0F6bmI89Hdb+u9WXrSKc4v+N0aV0q6r42WoF92Jp2jEorBEBRoRNXgjp53nBniDXcqZYPA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", + "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.5", + "@webassemblyjs/ast": "1.11.6", "@xtuc/long": "4.2.2" } }, @@ -13361,14 +13191,29 @@ "ap": "~0.2.0", "balanced-match": "~0.2.0", "dot-parts": "~1.0.0" + }, + "dependencies": { + "balanced-match": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.2.1.tgz", + "integrity": "sha512-euSOvfze1jPOf85KQOmZ2UcWDJ/dUJukTJdj4o9ZZLyjl7IjdIyE4fAQRSuGrxAjB9nvvvrl4N3bPtRq+W+SyQ==", + "dev": true + } } }, "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", "dev": true }, + "acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "dev": true, + "requires": {} + }, "acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", @@ -13385,6 +13230,14 @@ "acorn": "^7.0.0", "acorn-walk": "^7.0.0", "xtend": "^4.0.2" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + } } }, "acorn-walk": { @@ -13433,6 +13286,13 @@ "ajv": "^8.0.0" } }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "requires": {} + }, "amdefine": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", @@ -13510,21 +13370,17 @@ "dev": true }, "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "aria-query": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", - "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", "dev": true, "requires": { - "deep-equal": "^2.0.5" + "dequal": "^2.0.3" } }, "array-buffer-byte-length": { @@ -13633,9 +13489,9 @@ "dev": true }, "astring": { - "version": "1.8.4", - "resolved": "https://registry.npmjs.org/astring/-/astring-1.8.4.tgz", - "integrity": "sha512-97a+l2LBU3Op3bBQEff79i/E4jMD2ZLFD8rHx9B6mXyB2uQwhJQYfiDqUwtfjF4QA1F2qs//N6Cw8LetMbQjcw==" + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/astring/-/astring-1.8.6.tgz", + "integrity": "sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==" }, "asynckit": { "version": "0.4.0", @@ -13663,27 +13519,27 @@ "integrity": "sha512-9cYNccliXZDByFsFliVwk5GvTq058Fj513CiR4E60ndDwmuXzTJEp/Bp8FyuRmGyYupLjHLs+JA9/CBoVS4/NQ==" }, "axe-core": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.0.tgz", - "integrity": "sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==", + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.2.tgz", + "integrity": "sha512-zIURGIS1E1Q4pcrMjp+nnEh+16G56eG/MUllJH8yEvw7asDo7Ac9uhC9KIH5jzpITueEZolfYglnCGIuSBz39g==", "dev": true }, "axobject-query": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.1.1.tgz", - "integrity": "sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz", + "integrity": "sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==", "dev": true, "requires": { - "deep-equal": "^2.0.5" + "dequal": "^2.0.3" } }, "babel-jest": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.5.0.tgz", - "integrity": "sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.1.tgz", + "integrity": "sha512-qu+3bdPEQC6KZSPz+4Fyjbga5OODNcp49j6GKzG1EKbkfyJBxEYGVUmVGpwCSeGouG52R4EgYMLb6p9YeEEQ4A==", "dev": true, "requires": { - "@jest/transform": "^29.5.0", + "@jest/transform": "^29.6.1", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", "babel-preset-jest": "^29.5.0", @@ -13703,27 +13559,6 @@ "@istanbuljs/schema": "^0.1.2", "istanbul-lib-instrument": "^5.0.4", "test-exclude": "^6.0.0" - }, - "dependencies": { - "istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dev": true, - "requires": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } } }, "babel-plugin-jest-hoist": { @@ -13769,10 +13604,9 @@ } }, "balanced-match": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.2.1.tgz", - "integrity": "sha512-euSOvfze1jPOf85KQOmZ2UcWDJ/dUJukTJdj4o9ZZLyjl7IjdIyE4fAQRSuGrxAjB9nvvvrl4N3bPtRq+W+SyQ==", - "dev": true + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "base64-js": { "version": "1.5.1", @@ -13802,9 +13636,9 @@ } }, "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, "requires": { "inherits": "^2.0.3", @@ -13827,13 +13661,6 @@ "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" - }, - "dependencies": { - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - } } }, "braces": { @@ -13843,17 +13670,6 @@ "dev": true, "requires": { "fill-range": "^7.0.1" - }, - "dependencies": { - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - } } }, "brorand": { @@ -13946,6 +13762,12 @@ "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", "dev": true + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", + "dev": true } } }, @@ -13997,9 +13819,9 @@ } }, "browserify-shim": { - "version": "3.8.15", - "resolved": "https://registry.npmjs.org/browserify-shim/-/browserify-shim-3.8.15.tgz", - "integrity": "sha512-wACWQv56oVuxIID3JHFg2SCk40grlWUVX1QKKH14czQXE84WCOmbydcGKYt/IQZTGbBBzH+4uWr3wNNQRnak3Q==", + "version": "3.8.16", + "resolved": "https://registry.npmjs.org/browserify-shim/-/browserify-shim-3.8.16.tgz", + "integrity": "sha512-+Ap0xOKUC5Hz8sdUROxCJHgzA5IeU7pgUquCdlbBxyxkexzU4kpU6u1TsIvnFJcdx1bxO902J08AEjbMqDbA3g==", "dev": true, "requires": { "exposify": "~0.5.0", @@ -14057,15 +13879,15 @@ } }, "browserslist": { - "version": "4.21.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", - "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "version": "4.21.9", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", + "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001400", - "electron-to-chromium": "^1.4.251", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.9" + "caniuse-lite": "^1.0.30001503", + "electron-to-chromium": "^1.4.431", + "node-releases": "^2.0.12", + "update-browserslist-db": "^1.0.11" } }, "bser": { @@ -14139,9 +13961,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001414", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001414.tgz", - "integrity": "sha512-t55jfSaWjCdocnFdKQoO+d2ct9C59UZg4dY3OnUlSZ447r8pUtIKdp0hpAzrGFultmTC+Us+KpKi4GZl/LXlFg==", + "version": "1.0.30001515", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001515.tgz", + "integrity": "sha512-eEFDwUOZbE24sb+Ecsx3+OvNETqjWIdabMy52oOkIgcUtAsQifjUG9q4U9dgTHJM2mfk4uEPxc0+xuFdJ629QA==", "dev": true }, "chalk": { @@ -14189,9 +14011,9 @@ } }, "cjs-module-lexer": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", - "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", + "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", "dev": true }, "cliui": { @@ -14216,21 +14038,6 @@ "shallow-clone": "^3.0.0" }, "dependencies": { - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "dev": true - }, "kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -14252,9 +14059,9 @@ "dev": true }, "collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", "dev": true }, "color-convert": { @@ -14483,39 +14290,6 @@ "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", "dev": true }, - "deep-equal": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.0.tgz", - "integrity": "sha512-RdpzE0Hv4lhowpIUKKMJfeH6C1pXdtT1/it80ubgWqwI3qpuxUBpC1S4hnHg+zjnuOoDkzUtUCEEkG+XG5l3Mw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "es-get-iterator": "^1.1.2", - "get-intrinsic": "^1.1.3", - "is-arguments": "^1.1.1", - "is-array-buffer": "^3.0.1", - "is-date-object": "^1.0.5", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "isarray": "^2.0.5", - "object-is": "^1.1.5", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", - "side-channel": "^1.0.4", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.9" - }, - "dependencies": { - "isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - } - } - }, "deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -14538,9 +14312,9 @@ } }, "defined": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "integrity": "sha512-Y2caI5+ZwS5c3RiNDJ6u53VhQHv+hHKwhkI1iHvceKUHw9Df6EK2zRLfjejRgMuCuxK7PfSWIMwWecceVvThjQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz", + "integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==", "dev": true }, "delayed-stream": { @@ -14566,10 +14340,16 @@ "through2": "^2.0.0" } }, + "dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true + }, "des.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", - "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz", + "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==", "dev": true, "requires": { "inherits": "^2.0.1", @@ -14605,6 +14385,12 @@ "integrity": "sha512-3omnDTYrGigU0i4cJjvaKwD52B8aoqyX/NEIkukFFkogBemsIbhSa1O414fpTp5nuszJG6lvQ5vBvDVNCbSsaQ==", "dev": true }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + }, "diff-sequences": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", @@ -14646,6 +14432,14 @@ "dev": true, "requires": { "esutils": "^2.0.2" + }, + "dependencies": { + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + } } }, "domain-browser": { @@ -14676,9 +14470,9 @@ } }, "electron-to-chromium": { - "version": "1.4.268", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.268.tgz", - "integrity": "sha512-PO90Bv++vEzdln+eA9qLg1IRnh0rKETus6QkTzcFm5P3Wg3EQBZud5dcnzkpYXuIKWBjKe5CO8zjz02cicvn1g==", + "version": "1.4.460", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.460.tgz", + "integrity": "sha512-kKiHnbrHME7z8E6AYaw0ehyxY5+hdaRmeUbjBO22LZMdqTYCO29EvF0T1cQ3pJ1RN5fyMcHl1Lmcsdt9WWJpJQ==", "dev": true }, "elliptic": { @@ -14711,9 +14505,9 @@ "dev": true }, "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "dev": true }, "end-of-stream": { @@ -14726,9 +14520,9 @@ } }, "enhanced-resolve": { - "version": "5.13.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.13.0.tgz", - "integrity": "sha512-eyV8f0y1+bzyfh8xAwW/WTSZpLbjhqc4ne9eGSH4Zo2ejdyiNG9pU6mf9DG8a7+Auk6MFTlNOT4Y2y/9k8GKVg==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", "dev": true, "requires": { "graceful-fs": "^4.2.4", @@ -14736,9 +14530,9 @@ } }, "envinfo": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", - "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.10.0.tgz", + "integrity": "sha512-ZtUjZO6l5mwTHvc1L9+1q5p/R3wTopcfqMW8r5t8SJSKqeVI/LtajORwRFEKpEFuekjD0VBjwu1HMxL4UalIRw==", "dev": true }, "error-ex": { @@ -14751,9 +14545,9 @@ } }, "es-abstract": { - "version": "1.21.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz", - "integrity": "sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==", + "version": "1.21.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.3.tgz", + "integrity": "sha512-ZU4miiY1j3sGPFLJ34VJXEqhpmL+HGByCinGHv4HC+Fxl2fI2Z4yR6tl0mORnDr6PA8eihWo4LmSWDbvhALckg==", "requires": { "array-buffer-byte-length": "^1.0.0", "available-typed-arrays": "^1.0.5", @@ -14761,7 +14555,7 @@ "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.2.0", + "get-intrinsic": "^1.2.1", "get-symbol-description": "^1.0.0", "globalthis": "^1.0.3", "gopd": "^1.0.1", @@ -14781,14 +14575,15 @@ "object-inspect": "^1.12.3", "object-keys": "^1.1.1", "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", + "regexp.prototype.flags": "^1.5.0", "safe-regex-test": "^1.0.0", "string.prototype.trim": "^1.2.7", "string.prototype.trimend": "^1.0.6", "string.prototype.trimstart": "^1.0.6", + "typed-array-byte-offset": "^1.0.0", "typed-array-length": "^1.0.4", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.9" + "which-typed-array": "^1.1.10" } }, "es-aggregate-error": { @@ -14805,35 +14600,10 @@ "has-property-descriptors": "^1.0.0" } }, - "es-get-iterator": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", - "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "is-arguments": "^1.1.1", - "is-map": "^2.0.2", - "is-set": "^2.0.2", - "is-string": "^1.0.7", - "isarray": "^2.0.5", - "stop-iteration-iterator": "^1.0.0" - }, - "dependencies": { - "isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - } - } - }, "es-module-lexer": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.2.1.tgz", - "integrity": "sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz", + "integrity": "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==", "dev": true }, "es-set-tostringtag": { @@ -14872,9 +14642,9 @@ "dev": true }, "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true }, "escodegen": { @@ -14901,12 +14671,6 @@ "integrity": "sha512-FpCjJDfmo3vsc/1zKSeqR5k42tcIhxFIlvq+h9j0fO2q/h2uLKyweq7rYJ+0CoVvrGQOxIS5wyBrW/+vF58BUQ==", "dev": true }, - "esutils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-1.0.0.tgz", - "integrity": "sha512-x/iYH53X3quDwfHRz4y8rn4XcEwwCJeWsul9pF1zldMbGtgOtMNBEOuYWwB1EQlK2LRa1fev3YAgym/RElp5Cg==", - "dev": true - }, "source-map": { "version": "0.1.43", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", @@ -14920,16 +14684,16 @@ } }, "eslint": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.38.0.tgz", - "integrity": "sha512-pIdsD2jwlUGf/U38Jv97t8lq6HpaU/G9NKbYmpWpZGw3LdTNhZLbJePqxOXGB5+JEKfOPU/XLxYxFh03nr1KTg==", + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.44.0.tgz", + "integrity": "sha512-0wpHoUbDUHgNCyvFB5aXLiQVfK9B0at6gUvzy83k4kAsQ/u769TQDX6iKC+aO4upIHO9WSaA3QoXYQDHbNwf1A==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.2", - "@eslint/js": "8.38.0", - "@humanwhocodes/config-array": "^0.11.8", + "@eslint/eslintrc": "^2.1.0", + "@eslint/js": "8.44.0", + "@humanwhocodes/config-array": "^0.11.10", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.10.0", @@ -14938,9 +14702,9 @@ "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-visitor-keys": "^3.4.0", - "espree": "^9.5.1", + "eslint-scope": "^7.2.0", + "eslint-visitor-keys": "^3.4.1", + "espree": "^9.6.0", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -14948,20 +14712,19 @@ "find-up": "^5.0.0", "glob-parent": "^6.0.2", "globals": "^13.19.0", - "grapheme-splitter": "^1.0.4", + "graphemer": "^1.4.0", "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.1", + "optionator": "^0.9.3", "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" @@ -14979,6 +14742,12 @@ "uri-js": "^4.2.2" } }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, "eslint-scope": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", @@ -14995,6 +14764,12 @@ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, "glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", @@ -15071,21 +14846,13 @@ } }, "eslint-plugin-eslint-comments": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-3.2.0.tgz", - "integrity": "sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5", - "ignore": "^5.0.5" - }, - "dependencies": { - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - } + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-3.2.0.tgz", + "integrity": "sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5", + "ignore": "^5.0.5" } }, "eslint-plugin-filenames": { @@ -15101,15 +14868,15 @@ } }, "eslint-plugin-github": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-github/-/eslint-plugin-github-4.7.0.tgz", - "integrity": "sha512-SIFSy6IXtN3aGQ6YyFWg/oxRUyAcYwg5G0wh+ov1HQCvmp+Pzs1GzeVjU8QcIQSSJfverQzuxWrJCAln/d2PuQ==", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-github/-/eslint-plugin-github-4.9.0.tgz", + "integrity": "sha512-c4jnJXJzHy8lzdYjOXlXcY7jX4b2ciGh+ugZM5b6vs6q2+m+6BrNl20u5WxloJvH6Q8CbZ0+Lnh7lDJxUd3WkQ==", "dev": true, "requires": { "@github/browserslist-config": "^1.0.0", "@typescript-eslint/eslint-plugin": "^5.1.0", "@typescript-eslint/parser": "^5.1.0", - "aria-query": "^5.1.3", + "aria-query": "^5.3.0", "eslint-config-prettier": ">=8.0.0", "eslint-plugin-escompat": "^3.3.3", "eslint-plugin-eslint-comments": "^3.2.0", @@ -15173,10 +14940,16 @@ "esutils": "^2.0.2" } }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true } } @@ -15205,16 +14978,10 @@ "semver": "^6.3.0" }, "dependencies": { - "emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true } } @@ -15235,9 +15002,9 @@ } }, "eslint-plugin-security": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-security/-/eslint-plugin-security-1.5.0.tgz", - "integrity": "sha512-hAFVwLZ/UeXrlyVD2TDarv/x00CoFVpaY0IUZhKjPjiFxqkuQVixsK4f2rxngeQOqSxi6OUjzJM/jMwKEVjJ8g==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-security/-/eslint-plugin-security-1.7.1.tgz", + "integrity": "sha512-sMStceig8AFglhhT2LqlU5r+/fn9OwsA72O5bBuQVTssPCdQAOQzL+oMn/ZcpeUY6KcNfLJArgcrsSULNjYYdQ==", "dev": true, "requires": { "safe-regex": "^2.1.1" @@ -15267,28 +15034,20 @@ } }, "eslint-visitor-keys": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz", - "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", "dev": true }, "espree": { - "version": "9.5.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.1.tgz", - "integrity": "sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==", + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.0.tgz", + "integrity": "sha512-1FH/IiruXZ84tpUlm0aCUEwMl2Ho5ilqVh0VvQXw+byAz/4SAciyHLlfmL5WYqsvD38oymdUwBss0LtK8m4s/A==", "dev": true, "requires": { - "acorn": "^8.8.0", + "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.0" - }, - "dependencies": { - "acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", - "dev": true - } + "eslint-visitor-keys": "^3.4.1" } }, "esprima": { @@ -15297,12 +15056,6 @@ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true }, - "esprima-fb": { - "version": "3001.1.0-dev-harmony-fb", - "resolved": "https://registry.npmjs.org/esprima-fb/-/esprima-fb-3001.0001.0000-dev-harmony-fb.tgz", - "integrity": "sha512-a3RFiCVBiy8KdO6q/C+8BQiP/sRk8XshBU3QHHDP8tNzjYwR3FKBOImu+PXfVhPoZL0JKtJLBAOWlDMCCFY8SQ==", - "dev": true - }, "esquery": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", @@ -15344,9 +15097,9 @@ "dev": true }, "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-1.0.0.tgz", + "integrity": "sha512-x/iYH53X3quDwfHRz4y8rn4XcEwwCJeWsul9pF1zldMbGtgOtMNBEOuYWwB1EQlK2LRa1fev3YAgym/RElp5Cg==", "dev": true }, "event-target-shim": { @@ -15400,19 +15153,44 @@ "dev": true, "requires": { "fill-range": "^2.1.0" + }, + "dependencies": { + "fill-range": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", + "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", + "dev": true, + "requires": { + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^3.0.0", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" + } + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha512-QUzH43Gfb9+5yckcrSA0VBDwEtDUchrk4F6tfJZQuNzDJbEDB9cZNzSfXGQ1jqmdDY/kl41lUOWM9syA8z8jlg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + } } }, "expect": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.5.0.tgz", - "integrity": "sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.1.tgz", + "integrity": "sha512-XEdDLonERCU1n9uR56/Stx9OqojaLAQtZf9PrCHH9Hl8YXiEIka3H4NXJ3NOIBmQJTg7+j7buh34PMHfJujc8g==", "dev": true, "requires": { - "@jest/expect-utils": "^29.5.0", + "@jest/expect-utils": "^29.6.1", + "@types/node": "*", "jest-get-type": "^29.4.3", - "jest-matcher-utils": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-util": "^29.5.0" + "jest-matcher-utils": "^29.6.1", + "jest-message-util": "^29.6.1", + "jest-util": "^29.6.1" }, "dependencies": { "ansi-styles": { @@ -15428,36 +15206,42 @@ "dev": true }, "jest-diff": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.5.0.tgz", - "integrity": "sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.1.tgz", + "integrity": "sha512-FsNCvinvl8oVxpNLttNQX7FAq7vR+gMDGj90tiP7siWw1UdakWUGqrylpsYrpvj908IYckm5Y0Q7azNAozU1Kg==", "dev": true, "requires": { "chalk": "^4.0.0", "diff-sequences": "^29.4.3", "jest-get-type": "^29.4.3", - "pretty-format": "^29.5.0" + "pretty-format": "^29.6.1" } }, + "jest-get-type": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz", + "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==", + "dev": true + }, "jest-matcher-utils": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz", - "integrity": "sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.1.tgz", + "integrity": "sha512-SLaztw9d2mfQQKHmJXKM0HCbl2PPVld/t9Xa6P9sgiExijviSp7TnZZpw2Fpt+OI3nwUO/slJbOfzfUMKKC5QA==", "dev": true, "requires": { "chalk": "^4.0.0", - "jest-diff": "^29.5.0", + "jest-diff": "^29.6.1", "jest-get-type": "^29.4.3", - "pretty-format": "^29.5.0" + "pretty-format": "^29.6.1" } }, "pretty-format": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz", + "integrity": "sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==", "dev": true, "requires": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.0", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" } @@ -15572,15 +15356,15 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "fast-diff": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", "dev": true }, "fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz", + "integrity": "sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", @@ -15656,16 +15440,12 @@ } }, "fill-range": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", - "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, "requires": { - "is-number": "^2.1.0", - "isobject": "^2.0.0", - "randomatic": "^3.0.0", - "repeat-element": "^1.1.2", - "repeat-string": "^1.5.2" + "to-regex-range": "^5.0.1" } }, "find-parent-dir": { @@ -15682,14 +15462,6 @@ "requires": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" - }, - "dependencies": { - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - } } }, "flat-cache": { @@ -15792,12 +15564,13 @@ "dev": true }, "get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", "requires": { "function-bind": "^1.1.1", "has": "^1.0.3", + "has-proto": "^1.0.1", "has-symbols": "^1.0.3" } }, @@ -15902,15 +15675,15 @@ } }, "graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true }, - "grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true }, "gray-matter": { @@ -15926,6 +15699,15 @@ "toml": "^2.3.2" }, "dependencies": { + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, "js-yaml": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", @@ -15997,14 +15779,6 @@ "dev": true, "requires": { "escape-string-regexp": "^1.0.3" - }, - "dependencies": { - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - } } }, "has-symbols": { @@ -16032,9 +15806,9 @@ }, "dependencies": { "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, "requires": { "inherits": "^2.0.3", @@ -16195,15 +15969,11 @@ "side-channel": "^1.0.4" } }, - "is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } + "interpret": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", + "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", + "dev": true }, "is-array-buffer": { "version": "3.0.2", @@ -16250,9 +16020,9 @@ "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==" }, "is-core-module": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.0.tgz", - "integrity": "sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==", + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", "dev": true, "requires": { "has": "^1.0.3" @@ -16305,25 +16075,16 @@ "is-extglob": "^2.1.1" } }, - "is-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", - "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", - "dev": true - }, "is-negative-zero": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==" }, "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha512-QUzH43Gfb9+5yckcrSA0VBDwEtDUchrk4F6tfJZQuNzDJbEDB9cZNzSfXGQ1jqmdDY/kl41lUOWM9syA8z8jlg==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true }, "is-number-object": { "version": "1.0.7", @@ -16339,6 +16100,23 @@ "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true + } + } + }, "is-regex": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", @@ -16348,12 +16126,6 @@ "has-tostringtag": "^1.0.0" } }, - "is-set": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", - "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", - "dev": true - }, "is-shared-array-buffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", @@ -16396,12 +16168,6 @@ "has-tostringtag": "^1.0.0" } }, - "is-weakmap": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", - "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", - "dev": true - }, "is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", @@ -16410,16 +16176,6 @@ "call-bind": "^1.0.2" } }, - "is-weakset": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", - "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - } - }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -16447,6 +16203,27 @@ "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", "dev": true }, + "istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "requires": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } + } + }, "istanbul-lib-report": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", @@ -16488,15 +16265,37 @@ } }, "jest": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.5.0.tgz", - "integrity": "sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.6.1.tgz", + "integrity": "sha512-Nirw5B4nn69rVUZtemCQhwxOBhm0nsp3hmtF4rzCeWD7BkjAXRIji7xWQfnTNbz9g0aVsBX6aZK3n+23LM6uDw==", "dev": true, "requires": { - "@jest/core": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/core": "^29.6.1", + "@jest/types": "^29.6.1", "import-local": "^3.0.2", - "jest-cli": "^29.5.0" + "jest-cli": "^29.6.1" + }, + "dependencies": { + "jest-cli": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.1.tgz", + "integrity": "sha512-607dSgTA4ODIN6go9w6xY3EYkyPFGicx51a69H7yfvt7lN53xNswEVLovq+E77VsTRi5fWprLH0yl4DJgE8Ing==", + "dev": true, + "requires": { + "@jest/core": "^29.6.1", + "@jest/test-result": "^29.6.1", + "@jest/types": "^29.6.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "import-local": "^3.0.2", + "jest-config": "^29.6.1", + "jest-util": "^29.6.1", + "jest-validate": "^29.6.1", + "prompts": "^2.0.1", + "yargs": "^17.3.1" + } + } } }, "jest-changed-files": { @@ -16507,42 +16306,31 @@ "requires": { "execa": "^5.0.0", "p-limit": "^3.1.0" - }, - "dependencies": { - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - } } }, "jest-circus": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.5.0.tgz", - "integrity": "sha512-gq/ongqeQKAplVxqJmbeUOJJKkW3dDNPY8PjhJ5G0lBRvu0e3EWGxGy5cI4LAGA7gV2UHCtWBI4EMXK8c9nQKA==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.1.tgz", + "integrity": "sha512-tPbYLEiBU4MYAL2XoZme/bgfUeotpDBd81lgHLCbDZZFaGmECk0b+/xejPFtmiBP87GgP/y4jplcRpbH+fgCzQ==", "dev": true, "requires": { - "@jest/environment": "^29.5.0", - "@jest/expect": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/environment": "^29.6.1", + "@jest/expect": "^29.6.1", + "@jest/test-result": "^29.6.1", + "@jest/types": "^29.6.1", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "dedent": "^0.7.0", "is-generator-fn": "^2.0.0", - "jest-each": "^29.5.0", - "jest-matcher-utils": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-runtime": "^29.5.0", - "jest-snapshot": "^29.5.0", - "jest-util": "^29.5.0", + "jest-each": "^29.6.1", + "jest-matcher-utils": "^29.6.1", + "jest-message-util": "^29.6.1", + "jest-runtime": "^29.6.1", + "jest-snapshot": "^29.6.1", + "jest-util": "^29.6.1", "p-limit": "^3.1.0", - "pretty-format": "^29.5.0", + "pretty-format": "^29.6.1", "pure-rand": "^6.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" @@ -16561,45 +16349,42 @@ "dev": true }, "jest-diff": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.5.0.tgz", - "integrity": "sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.1.tgz", + "integrity": "sha512-FsNCvinvl8oVxpNLttNQX7FAq7vR+gMDGj90tiP7siWw1UdakWUGqrylpsYrpvj908IYckm5Y0Q7azNAozU1Kg==", "dev": true, "requires": { "chalk": "^4.0.0", "diff-sequences": "^29.4.3", "jest-get-type": "^29.4.3", - "pretty-format": "^29.5.0" + "pretty-format": "^29.6.1" } }, + "jest-get-type": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz", + "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==", + "dev": true + }, "jest-matcher-utils": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz", - "integrity": "sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.1.tgz", + "integrity": "sha512-SLaztw9d2mfQQKHmJXKM0HCbl2PPVld/t9Xa6P9sgiExijviSp7TnZZpw2Fpt+OI3nwUO/slJbOfzfUMKKC5QA==", "dev": true, "requires": { "chalk": "^4.0.0", - "jest-diff": "^29.5.0", + "jest-diff": "^29.6.1", "jest-get-type": "^29.4.3", - "pretty-format": "^29.5.0" - } - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" + "pretty-format": "^29.6.1" } }, "pretty-format": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz", + "integrity": "sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==", "dev": true, "requires": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.0", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" } @@ -16612,52 +16397,32 @@ } } }, - "jest-cli": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.5.0.tgz", - "integrity": "sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw==", - "dev": true, - "requires": { - "@jest/core": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/types": "^29.5.0", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "import-local": "^3.0.2", - "jest-config": "^29.5.0", - "jest-util": "^29.5.0", - "jest-validate": "^29.5.0", - "prompts": "^2.0.1", - "yargs": "^17.3.1" - } - }, "jest-config": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.5.0.tgz", - "integrity": "sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.6.1.tgz", + "integrity": "sha512-XdjYV2fy2xYixUiV2Wc54t3Z4oxYPAELUzWnV6+mcbq0rh742X2p52pii5A3oeRzYjLnQxCsZmp0qpI6klE2cQ==", "dev": true, "requires": { "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.5.0", - "@jest/types": "^29.5.0", - "babel-jest": "^29.5.0", + "@jest/test-sequencer": "^29.6.1", + "@jest/types": "^29.6.1", + "babel-jest": "^29.6.1", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-circus": "^29.5.0", - "jest-environment-node": "^29.5.0", + "jest-circus": "^29.6.1", + "jest-environment-node": "^29.6.1", "jest-get-type": "^29.4.3", "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.5.0", - "jest-runner": "^29.5.0", - "jest-util": "^29.5.0", - "jest-validate": "^29.5.0", + "jest-resolve": "^29.6.1", + "jest-runner": "^29.6.1", + "jest-util": "^29.6.1", + "jest-validate": "^29.6.1", "micromatch": "^4.0.4", "parse-json": "^5.2.0", - "pretty-format": "^29.5.0", + "pretty-format": "^29.6.1", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, @@ -16668,13 +16433,19 @@ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true }, + "jest-get-type": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz", + "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==", + "dev": true + }, "pretty-format": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz", + "integrity": "sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==", "dev": true, "requires": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.0", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" } @@ -16697,14 +16468,6 @@ "diff-sequences": "^27.5.1", "jest-get-type": "^27.5.1", "pretty-format": "^27.5.1" - }, - "dependencies": { - "jest-get-type": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", - "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", - "dev": true - } } }, "jest-docblock": { @@ -16717,16 +16480,16 @@ } }, "jest-each": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.5.0.tgz", - "integrity": "sha512-HM5kIJ1BTnVt+DQZ2ALp3rzXEl+g726csObrW/jpEGl+CDSSQpOJJX2KE/vEg8cxcMXdyEPu6U4QX5eruQv5hA==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.6.1.tgz", + "integrity": "sha512-n5eoj5eiTHpKQCAVcNTT7DRqeUmJ01hsAL0Q1SMiBHcBcvTKDELixQOGMCpqhbIuTcfC4kMfSnpmDqRgRJcLNQ==", "dev": true, "requires": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.1", "chalk": "^4.0.0", "jest-get-type": "^29.4.3", - "jest-util": "^29.5.0", - "pretty-format": "^29.5.0" + "jest-util": "^29.6.1", + "pretty-format": "^29.6.1" }, "dependencies": { "ansi-styles": { @@ -16735,13 +16498,19 @@ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true }, + "jest-get-type": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz", + "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==", + "dev": true + }, "pretty-format": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz", + "integrity": "sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==", "dev": true, "requires": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.0", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" } @@ -16755,32 +16524,32 @@ } }, "jest-environment-node": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.5.0.tgz", - "integrity": "sha512-ExxuIK/+yQ+6PRGaHkKewYtg6hto2uGCgvKdb2nfJfKXgZ17DfXjvbZ+jA1Qt9A8EQSfPnt5FKIfnOO3u1h9qw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.1.tgz", + "integrity": "sha512-ZNIfAiE+foBog24W+2caIldl4Irh8Lx1PUhg/GZ0odM1d/h2qORAsejiFc7zb+SEmYPn1yDZzEDSU5PmDkmVLQ==", "dev": true, "requires": { - "@jest/environment": "^29.5.0", - "@jest/fake-timers": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/environment": "^29.6.1", + "@jest/fake-timers": "^29.6.1", + "@jest/types": "^29.6.1", "@types/node": "*", - "jest-mock": "^29.5.0", - "jest-util": "^29.5.0" + "jest-mock": "^29.6.1", + "jest-util": "^29.6.1" } }, "jest-get-type": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz", - "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", + "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", "dev": true }, "jest-haste-map": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.5.0.tgz", - "integrity": "sha512-IspOPnnBro8YfVYSw6yDRKh/TiCdRngjxeacCps1cQ9cgVN6+10JUcuJ1EabrgYLOATsIAigxA0rLR9x/YlrSA==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.1.tgz", + "integrity": "sha512-0m7f9PZXxOCk1gRACiVgX85knUKPKLPg4oRCjLoqIm9brTHXaorMA0JpmtmVkQiT8nmXyIVoZd/nnH1cfC33ig==", "dev": true, "requires": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.1", "@types/graceful-fs": "^4.1.3", "@types/node": "*", "anymatch": "^3.0.3", @@ -16788,20 +16557,20 @@ "fsevents": "^2.3.2", "graceful-fs": "^4.2.9", "jest-regex-util": "^29.4.3", - "jest-util": "^29.5.0", - "jest-worker": "^29.5.0", + "jest-util": "^29.6.1", + "jest-worker": "^29.6.1", "micromatch": "^4.0.4", "walker": "^1.0.8" } }, "jest-leak-detector": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.5.0.tgz", - "integrity": "sha512-u9YdeeVnghBUtpN5mVxjID7KbkKE1QU4f6uUwuxiY0vYRi9BUCLKlPEZfDGR67ofdFmDz9oPAy2G92Ujrntmow==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.6.1.tgz", + "integrity": "sha512-OrxMNyZirpOEwkF3UHnIkAiZbtkBWiye+hhBweCHkVbCgyEy71Mwbb5zgeTNYWJBi1qgDVfPC1IwO9dVEeTLwQ==", "dev": true, "requires": { "jest-get-type": "^29.4.3", - "pretty-format": "^29.5.0" + "pretty-format": "^29.6.1" }, "dependencies": { "ansi-styles": { @@ -16810,13 +16579,19 @@ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true }, + "jest-get-type": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz", + "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==", + "dev": true + }, "pretty-format": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz", + "integrity": "sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==", "dev": true, "requires": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.0", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" } @@ -16839,29 +16614,21 @@ "jest-diff": "^27.5.1", "jest-get-type": "^27.5.1", "pretty-format": "^27.5.1" - }, - "dependencies": { - "jest-get-type": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", - "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", - "dev": true - } } }, "jest-message-util": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.5.0.tgz", - "integrity": "sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.1.tgz", + "integrity": "sha512-KoAW2zAmNSd3Gk88uJ56qXUWbFk787QKmjjJVOjtGFmmGSZgDBrlIL4AfQw1xyMYPNVD7dNInfIbur9B2rd/wQ==", "dev": true, "requires": { "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.1", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", - "pretty-format": "^29.5.0", + "pretty-format": "^29.6.1", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, @@ -16873,12 +16640,12 @@ "dev": true }, "pretty-format": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz", + "integrity": "sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==", "dev": true, "requires": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.0", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" } @@ -16892,14 +16659,14 @@ } }, "jest-mock": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.5.0.tgz", - "integrity": "sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.6.1.tgz", + "integrity": "sha512-brovyV9HBkjXAEdRooaTQK42n8usKoSRR3gihzUpYeV/vwqgSoNfrksO7UfSACnPmxasO/8TmHM3w9Hp3G1dgw==", "dev": true, "requires": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.1", "@types/node": "*", - "jest-util": "^29.5.0" + "jest-util": "^29.6.1" } }, "jest-pnp-resolver": { @@ -16916,131 +16683,126 @@ "dev": true }, "jest-resolve": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.5.0.tgz", - "integrity": "sha512-1TzxJ37FQq7J10jPtQjcc+MkCkE3GBpBecsSUWJ0qZNJpmg6m0D9/7II03yJulm3H/fvVjgqLh/k2eYg+ui52w==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.1.tgz", + "integrity": "sha512-AeRkyS8g37UyJiP9w3mmI/VXU/q8l/IH52vj/cDAyScDcemRbSBhfX/NMYIGilQgSVwsjxrCHf3XJu4f+lxCMg==", "dev": true, "requires": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.5.0", + "jest-haste-map": "^29.6.1", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.5.0", - "jest-validate": "^29.5.0", + "jest-util": "^29.6.1", + "jest-validate": "^29.6.1", "resolve": "^1.20.0", "resolve.exports": "^2.0.0", "slash": "^3.0.0" } }, "jest-resolve-dependencies": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.5.0.tgz", - "integrity": "sha512-sjV3GFr0hDJMBpYeUuGduP+YeCRbd7S/ck6IvL3kQ9cpySYKqcqhdLLC2rFwrcL7tz5vYibomBrsFYWkIGGjOg==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.1.tgz", + "integrity": "sha512-BbFvxLXtcldaFOhNMXmHRWx1nXQO5LoXiKSGQcA1LxxirYceZT6ch8KTE1bK3X31TNG/JbkI7OkS/ABexVahiw==", "dev": true, "requires": { "jest-regex-util": "^29.4.3", - "jest-snapshot": "^29.5.0" + "jest-snapshot": "^29.6.1" } }, "jest-runner": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.5.0.tgz", - "integrity": "sha512-m7b6ypERhFghJsslMLhydaXBiLf7+jXy8FwGRHO3BGV1mcQpPbwiqiKUR2zU2NJuNeMenJmlFZCsIqzJCTeGLQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.1.tgz", + "integrity": "sha512-tw0wb2Q9yhjAQ2w8rHRDxteryyIck7gIzQE4Reu3JuOBpGp96xWgF0nY8MDdejzrLCZKDcp8JlZrBN/EtkQvPQ==", "dev": true, "requires": { - "@jest/console": "^29.5.0", - "@jest/environment": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/console": "^29.6.1", + "@jest/environment": "^29.6.1", + "@jest/test-result": "^29.6.1", + "@jest/transform": "^29.6.1", + "@jest/types": "^29.6.1", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.13.1", "graceful-fs": "^4.2.9", "jest-docblock": "^29.4.3", - "jest-environment-node": "^29.5.0", - "jest-haste-map": "^29.5.0", - "jest-leak-detector": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-resolve": "^29.5.0", - "jest-runtime": "^29.5.0", - "jest-util": "^29.5.0", - "jest-watcher": "^29.5.0", - "jest-worker": "^29.5.0", + "jest-environment-node": "^29.6.1", + "jest-haste-map": "^29.6.1", + "jest-leak-detector": "^29.6.1", + "jest-message-util": "^29.6.1", + "jest-resolve": "^29.6.1", + "jest-runtime": "^29.6.1", + "jest-util": "^29.6.1", + "jest-watcher": "^29.6.1", + "jest-worker": "^29.6.1", "p-limit": "^3.1.0", "source-map-support": "0.5.13" - }, - "dependencies": { - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - } } }, "jest-runtime": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.5.0.tgz", - "integrity": "sha512-1Hr6Hh7bAgXQP+pln3homOiEZtCDZFqwmle7Ew2j8OlbkIu6uE3Y/etJQG8MLQs3Zy90xrp2C0BRrtPHG4zryw==", - "dev": true, - "requires": { - "@jest/environment": "^29.5.0", - "@jest/fake-timers": "^29.5.0", - "@jest/globals": "^29.5.0", - "@jest/source-map": "^29.4.3", - "@jest/test-result": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.1.tgz", + "integrity": "sha512-D6/AYOA+Lhs5e5il8+5pSLemjtJezUr+8zx+Sn8xlmOux3XOqx4d8l/2udBea8CRPqqrzhsKUsN/gBDE/IcaPQ==", + "dev": true, + "requires": { + "@jest/environment": "^29.6.1", + "@jest/fake-timers": "^29.6.1", + "@jest/globals": "^29.6.1", + "@jest/source-map": "^29.6.0", + "@jest/test-result": "^29.6.1", + "@jest/transform": "^29.6.1", + "@jest/types": "^29.6.1", "@types/node": "*", "chalk": "^4.0.0", "cjs-module-lexer": "^1.0.0", "collect-v8-coverage": "^1.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-mock": "^29.5.0", + "jest-haste-map": "^29.6.1", + "jest-message-util": "^29.6.1", + "jest-mock": "^29.6.1", "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.5.0", - "jest-snapshot": "^29.5.0", - "jest-util": "^29.5.0", + "jest-resolve": "^29.6.1", + "jest-snapshot": "^29.6.1", + "jest-util": "^29.6.1", "slash": "^3.0.0", "strip-bom": "^4.0.0" + }, + "dependencies": { + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true + } } }, "jest-snapshot": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.5.0.tgz", - "integrity": "sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.1.tgz", + "integrity": "sha512-G4UQE1QQ6OaCgfY+A0uR1W2AY0tGXUPQpoUClhWHq1Xdnx1H6JOrC2nH5lqnOEqaDgbHFgIwZ7bNq24HpB180A==", "dev": true, "requires": { "@babel/core": "^7.11.6", "@babel/generator": "^7.7.2", "@babel/plugin-syntax-jsx": "^7.7.2", "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", - "@types/babel__traverse": "^7.0.6", + "@jest/expect-utils": "^29.6.1", + "@jest/transform": "^29.6.1", + "@jest/types": "^29.6.1", "@types/prettier": "^2.1.5", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^29.5.0", + "expect": "^29.6.1", "graceful-fs": "^4.2.9", - "jest-diff": "^29.5.0", + "jest-diff": "^29.6.1", "jest-get-type": "^29.4.3", - "jest-matcher-utils": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-util": "^29.5.0", + "jest-matcher-utils": "^29.6.1", + "jest-message-util": "^29.6.1", + "jest-util": "^29.6.1", "natural-compare": "^1.4.0", - "pretty-format": "^29.5.0", - "semver": "^7.3.5" + "pretty-format": "^29.6.1", + "semver": "^7.5.3" }, "dependencies": { "ansi-styles": { @@ -17056,36 +16818,42 @@ "dev": true }, "jest-diff": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.5.0.tgz", - "integrity": "sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.1.tgz", + "integrity": "sha512-FsNCvinvl8oVxpNLttNQX7FAq7vR+gMDGj90tiP7siWw1UdakWUGqrylpsYrpvj908IYckm5Y0Q7azNAozU1Kg==", "dev": true, "requires": { "chalk": "^4.0.0", "diff-sequences": "^29.4.3", "jest-get-type": "^29.4.3", - "pretty-format": "^29.5.0" + "pretty-format": "^29.6.1" } }, + "jest-get-type": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz", + "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==", + "dev": true + }, "jest-matcher-utils": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz", - "integrity": "sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.1.tgz", + "integrity": "sha512-SLaztw9d2mfQQKHmJXKM0HCbl2PPVld/t9Xa6P9sgiExijviSp7TnZZpw2Fpt+OI3nwUO/slJbOfzfUMKKC5QA==", "dev": true, "requires": { "chalk": "^4.0.0", - "jest-diff": "^29.5.0", + "jest-diff": "^29.6.1", "jest-get-type": "^29.4.3", - "pretty-format": "^29.5.0" + "pretty-format": "^29.6.1" } }, "pretty-format": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz", + "integrity": "sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==", "dev": true, "requires": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.0", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" } @@ -17099,12 +16867,12 @@ } }, "jest-util": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.5.0.tgz", - "integrity": "sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.1.tgz", + "integrity": "sha512-NRFCcjc+/uO3ijUVyNOQJluf8PtGCe/W6cix36+M3cTFgiYqFOOW5MgN4JOOcvbUhcKTYVd1CvHz/LWi8d16Mg==", "dev": true, "requires": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.1", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", @@ -17113,17 +16881,17 @@ } }, "jest-validate": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.5.0.tgz", - "integrity": "sha512-pC26etNIi+y3HV8A+tUGr/lph9B18GnzSRAkPaaZJIE1eFdiYm6/CewuiJQ8/RlfHd1u/8Ioi8/sJ+CmbA+zAQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.1.tgz", + "integrity": "sha512-r3Ds69/0KCN4vx4sYAbGL1EVpZ7MSS0vLmd3gV78O+NAx3PDQQukRU5hNHPXlyqCgFY8XUk7EuTMLugh0KzahA==", "dev": true, "requires": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.1", "camelcase": "^6.2.0", "chalk": "^4.0.0", "jest-get-type": "^29.4.3", "leven": "^3.1.0", - "pretty-format": "^29.5.0" + "pretty-format": "^29.6.1" }, "dependencies": { "ansi-styles": { @@ -17138,13 +16906,19 @@ "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true }, + "jest-get-type": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz", + "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==", + "dev": true + }, "pretty-format": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz", + "integrity": "sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==", "dev": true, "requires": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.0", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" } @@ -17158,29 +16932,29 @@ } }, "jest-watcher": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.5.0.tgz", - "integrity": "sha512-KmTojKcapuqYrKDpRwfqcQ3zjMlwu27SYext9pt4GlF5FUgB+7XE1mcCnSm6a4uUpFyQIkb6ZhzZvHl+jiBCiA==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.1.tgz", + "integrity": "sha512-d4wpjWTS7HEZPaaj8m36QiaP856JthRZkrgcIY/7ISoUWPIillrXM23WPboZVLbiwZBt4/qn2Jke84Sla6JhFA==", "dev": true, "requires": { - "@jest/test-result": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/test-result": "^29.6.1", + "@jest/types": "^29.6.1", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "emittery": "^0.13.1", - "jest-util": "^29.5.0", + "jest-util": "^29.6.1", "string-length": "^4.0.1" } }, "jest-worker": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.5.0.tgz", - "integrity": "sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.1.tgz", + "integrity": "sha512-U+Wrbca7S8ZAxAe9L6nb6g8kPdia5hj32Puu5iOqBCMTMWFHXuK6dOV2IFrpedbTV8fjMFLdWNttQTBL6u2MRA==", "dev": true, "requires": { "@types/node": "*", - "jest-util": "^29.5.0", + "jest-util": "^29.6.1", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, @@ -17196,12 +16970,6 @@ } } }, - "js-sdsl": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.0.tgz", - "integrity": "sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==", - "dev": true - }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -17214,13 +16982,6 @@ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "requires": { "argparse": "^2.0.1" - }, - "dependencies": { - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - } } }, "jsep": { @@ -17261,10 +17022,13 @@ "dev": true }, "json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } }, "jsonc-parser": { "version": "2.2.1", @@ -17272,9 +17036,9 @@ "integrity": "sha512-o6/yDBYccGvTz1+QFevz6l6OBZ2+fMVu2JZ9CIhzsYRX4mjaK5IyX9eldUdCmga16zlgQxyrj5pt9kzuj2C02w==" }, "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha512-trvBk1ki43VZptdBI5rIlG4YOzyeH/WefQt5rj1grasPn4iiZWKet8nkgc4GlsAylaztn0qZfUYOiTsASJFdNA==", + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz", + "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==", "dev": true }, "jsonparse": { @@ -17304,13 +17068,15 @@ } }, "jsx-ast-utils": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", - "integrity": "sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.4.tgz", + "integrity": "sha512-fX2TVdCViod6HwKEtSWGHs57oFhVfCMwieb9PuRDgjDPh5XeqJiHFFFJCHxU5cnTc3Bu/GRL+kPiFmw8XWOfKw==", "dev": true, "requires": { - "array-includes": "^3.1.5", - "object.assign": "^4.1.3" + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" } }, "kind-of": { @@ -17393,6 +17159,17 @@ "extend-shallow": "^2.0.1", "is-number": "^2.1.0", "repeat-string": "^1.5.2" + }, + "dependencies": { + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha512-QUzH43Gfb9+5yckcrSA0VBDwEtDUchrk4F6tfJZQuNzDJbEDB9cZNzSfXGQ1jqmdDY/kl41lUOWM9syA8z8jlg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + } } }, "loader-runner": { @@ -17500,9 +17277,9 @@ }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true } } @@ -17653,9 +17430,9 @@ } }, "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true }, "mixin-deep": { @@ -17676,21 +17453,6 @@ "requires": { "is-plain-object": "^2.0.4" } - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "dev": true } } }, @@ -17798,9 +17560,9 @@ "dev": true }, "node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", "dev": true }, "normalize-path": { @@ -17829,16 +17591,6 @@ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" }, - "object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", @@ -17930,17 +17682,17 @@ "dev": true }, "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", "dev": true, "requires": { + "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" + "type-check": "^0.4.0" } }, "os-browserify": { @@ -17950,12 +17702,12 @@ "dev": true }, "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "requires": { - "p-try": "^2.0.0" + "yocto-queue": "^0.1.0" } }, "p-locate": { @@ -17965,17 +17717,6 @@ "dev": true, "requires": { "p-limit": "^3.0.2" - }, - "dependencies": { - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - } } }, "p-try": { @@ -18045,6 +17786,12 @@ "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", "dev": true }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -18107,9 +17854,9 @@ "dev": true }, "pirates": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", - "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", "dev": true }, "pkg-dir": { @@ -18140,6 +17887,15 @@ "p-locate": "^4.1.0" } }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, "p-locate": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", @@ -18148,12 +17904,6 @@ "requires": { "p-limit": "^2.2.0" } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true } } }, @@ -18169,9 +17919,9 @@ "dev": true }, "prettier": { - "version": "2.8.7", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.7.tgz", - "integrity": "sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==", + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", "dev": true }, "prettier-linter-helpers": { @@ -18269,10 +18019,9 @@ } }, "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", - "dev": true + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==" }, "puppeteer": { "version": "17.1.3", @@ -18294,16 +18043,19 @@ } }, "pure-rand": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.1.tgz", - "integrity": "sha512-t+x1zEHDjBwkDGY5v5ApnZ/utcd4XYDiJsaQQoptTXgUXX95sDg1elCdJghzicm7n2mbCBJ3uYWr6M22SO19rg==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.2.tgz", + "integrity": "sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ==", "dev": true }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", - "dev": true + "qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "dev": true, + "requires": { + "side-channel": "^1.0.4" + } }, "querystring-es3": { "version": "0.2.1", @@ -18377,9 +18129,9 @@ } }, "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, "requires": { "core-util-is": "~1.0.0", @@ -18408,6 +18160,15 @@ } } }, + "rechoir": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", + "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", + "dev": true, + "requires": { + "resolve": "^1.9.0" + } + }, "regenerator-runtime": { "version": "0.13.11", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", @@ -18415,9 +18176,9 @@ "dev": true }, "regexp-tree": { - "version": "0.1.24", - "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.24.tgz", - "integrity": "sha512-s2aEVuLhvnVJW6s/iPgEGK6R+/xngd2jNQ+xy4bXNDKxZKJH6jpPHY6kVeVv1IeLCHgswRj+Kl3ELaDjG6V1iw==", + "version": "0.1.27", + "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz", + "integrity": "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==", "dev": true }, "regexp.prototype.flags": { @@ -18438,6 +18199,17 @@ "requires": { "argparse": "^1.0.10", "autolinker": "~0.28.0" + }, + "dependencies": { + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + } } }, "rename-function-calls": { @@ -18458,6 +18230,12 @@ "escodegen": "~1.1.0", "esprima-fb": "3001.1.0-dev-harmony-fb" } + }, + "esprima-fb": { + "version": "3001.1.0-dev-harmony-fb", + "resolved": "https://registry.npmjs.org/esprima-fb/-/esprima-fb-3001.0001.0000-dev-harmony-fb.tgz", + "integrity": "sha512-a3RFiCVBiy8KdO6q/C+8BQiP/sRk8XshBU3QHHDP8tNzjYwR3FKBOImu+PXfVhPoZL0JKtJLBAOWlDMCCFY8SQ==", + "dev": true } } }, @@ -18515,12 +18293,12 @@ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" }, "resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", "dev": true, "requires": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.11.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" } @@ -18625,9 +18403,9 @@ "dev": true }, "schema-utils": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz", - "integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dev": true, "requires": { "@types/json-schema": "^7.0.8", @@ -18647,13 +18425,6 @@ "uri-js": "^4.2.2" } }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "requires": {} - }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -18663,14 +18434,23 @@ } }, "semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "requires": { "lru-cache": "^6.0.0" } }, + "serialize-javascript": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, "set-getter": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/set-getter/-/set-getter-0.1.1.tgz", @@ -18742,9 +18522,9 @@ "dev": true }, "shell-quote": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz", - "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", "dev": true }, "side-channel": { @@ -18847,15 +18627,6 @@ } } }, - "stop-iteration-iterator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", - "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", - "dev": true, - "requires": { - "internal-slot": "^1.0.4" - } - }, "stream-browserify": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", @@ -18889,9 +18660,9 @@ }, "dependencies": { "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, "requires": { "inherits": "^2.0.3", @@ -18939,6 +18710,14 @@ "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" + }, + "dependencies": { + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + } } }, "string.prototype.trim": { @@ -18981,9 +18760,9 @@ } }, "strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true }, "strip-color": { @@ -19075,9 +18854,9 @@ }, "dependencies": { "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, "requires": { "inherits": "^2.0.3", @@ -19094,23 +18873,17 @@ "dev": true }, "terser": { - "version": "5.17.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.17.1.tgz", - "integrity": "sha512-hVl35zClmpisy6oaoKALOpS0rDYLxRFLHhRuDlEGTKey9qHjS1w9GMORjuwIMt70Wan4lwsLYyWDVnWgF+KUEw==", + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.0.tgz", + "integrity": "sha512-JpcpGOQLOXm2jsomozdMDpd5f8ZHh1rR48OFgWUH3QsyZcfPgv2qDCYbcDEAYNd4OZRj2bWYKpwdll/udZCk/Q==", "dev": true, "requires": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, "dependencies": { - "acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", - "dev": true - }, "commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -19136,16 +18909,16 @@ } }, "terser-webpack-plugin": { - "version": "5.3.7", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.7.tgz", - "integrity": "sha512-AfKwIktyP7Cu50xNjXF/6Qb5lBNzYaWpU6YfoX3uZicTx0zTy0stDDCsvjDapKsSDvOeWo5MEq4TmdBy2cNoHw==", + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", + "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", "dev": true, "requires": { "@jridgewell/trace-mapping": "^0.3.17", "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", "serialize-javascript": "^6.0.1", - "terser": "^5.16.5" + "terser": "^5.16.8" }, "dependencies": { "jest-worker": { @@ -19159,15 +18932,6 @@ "supports-color": "^8.0.0" } }, - "serialize-javascript": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", - "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - }, "supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -19249,14 +19013,6 @@ "dev": true, "requires": { "is-number": "^7.0.0" - }, - "dependencies": { - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - } } }, "toml": { @@ -19312,9 +19068,9 @@ } }, "ts-loader": { - "version": "9.4.2", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.2.tgz", - "integrity": "sha512-OmlC4WVmFv5I0PpaxYb+qGeGOdm5giHU7HwDDUjw59emP2UYMHy9fFSDcYgSNoH8sXcj4hGCSEhlDZ9ULeDraA==", + "version": "9.4.4", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.4.tgz", + "integrity": "sha512-MLukxDHBl8OJ5Dk3y69IsKVFRA/6MwzEqBgh+OXMPB/OD01KQuWPFd1WAQP8a5PeSCAxfnkhiuWqfmFJzJQt9w==", "dev": true, "requires": { "chalk": "^4.1.0", @@ -19344,23 +19100,11 @@ "yn": "3.1.1" }, "dependencies": { - "acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", - "dev": true - }, "acorn-walk": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", "dev": true - }, - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true } } }, @@ -19374,29 +19118,12 @@ "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" - }, - "dependencies": { - "json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true - } } }, "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", + "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==" }, "tsutils": { "version": "3.21.0", @@ -19442,6 +19169,18 @@ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true }, + "typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + } + }, "typed-array-length": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", @@ -19505,9 +19244,9 @@ } }, "update-browserslist-db": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.9.tgz", - "integrity": "sha512-/xsqn21EGVdXI3EXSum1Yckj3ZVZugqyOZQ/CxYPBD/R+ko9NSUScf8tFF4dOKY+2pvSSJA/S+5B8s4Zr4kyvg==", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", "dev": true, "requires": { "escalade": "^3.1.1", @@ -19520,13 +19259,6 @@ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "requires": { "punycode": "^2.1.0" - }, - "dependencies": { - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" - } } }, "urijs": { @@ -19535,19 +19267,19 @@ "integrity": "sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ==" }, "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==", + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.1.tgz", + "integrity": "sha512-rWS3H04/+mzzJkv0eZ7vEDGiQbgquI1fGfOad6zKvgYQi1SzMmhl7c/DdRGxhaWrVH6z0qWITo8rpnxK/RfEhA==", "dev": true, "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" + "punycode": "^1.4.1", + "qs": "^6.11.0" }, "dependencies": { "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", "dev": true } } @@ -19636,9 +19368,9 @@ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "webpack": { - "version": "5.80.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.80.0.tgz", - "integrity": "sha512-OIMiq37XK1rWO8mH9ssfFKZsXg4n6klTEDL7S8/HqbAOBBaiy8ABvXvz0dDCXeEF9gqwxSvVk611zFPjS8hJxA==", + "version": "5.88.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.1.tgz", + "integrity": "sha512-FROX3TxQnC/ox4N+3xQoWZzvGXSuscxR32rbzjpXgEzWudJFEJBpdlkkob2ylrv5yzzufD1zph1OoFsLtm6stQ==", "dev": true, "requires": { "@types/eslint-scope": "^3.7.3", @@ -19647,10 +19379,10 @@ "@webassemblyjs/wasm-edit": "^1.11.5", "@webassemblyjs/wasm-parser": "^1.11.5", "acorn": "^8.7.1", - "acorn-import-assertions": "^1.7.6", + "acorn-import-assertions": "^1.9.0", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.13.0", + "enhanced-resolve": "^5.15.0", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", @@ -19660,26 +19392,13 @@ "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.1.2", + "schema-utils": "^3.2.0", "tapable": "^2.1.1", "terser-webpack-plugin": "^5.3.7", "watchpack": "^2.4.0", "webpack-sources": "^3.2.3" }, "dependencies": { - "acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", - "dev": true - }, - "acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", - "dev": true, - "requires": {} - }, "events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", @@ -19689,9 +19408,9 @@ } }, "webpack-bundle-analyzer": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.8.0.tgz", - "integrity": "sha512-ZzoSBePshOKhr+hd8u6oCkZVwpVaXgpw23ScGLFpR6SjYI7+7iIWYarjN6OEYOfRt8o7ZyZZQk0DuMizJ+LEIg==", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.9.0.tgz", + "integrity": "sha512-+bXGmO1LyiNx0i9enBu3H8mv42sj/BJWhZNFwjz92tVnBa9J3JMGo2an2IXlEleoDOPn/Hofl5hr/xCpObUDtw==", "dev": true, "requires": { "@discoveryjs/json-ext": "0.5.7", @@ -19706,12 +19425,6 @@ "ws": "^7.3.1" }, "dependencies": { - "acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", - "dev": true - }, "acorn-walk": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", @@ -19758,28 +19471,13 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "dev": true - }, - "interpret": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", - "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", - "dev": true - }, - "rechoir": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", - "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", - "dev": true, - "requires": { - "resolve": "^1.9.0" - } } } }, "webpack-merge": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", - "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.9.0.tgz", + "integrity": "sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg==", "dev": true, "requires": { "clone-deep": "^4.0.1", @@ -19822,22 +19520,10 @@ "is-symbol": "^1.0.3" } }, - "which-collection": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", - "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", - "dev": true, - "requires": { - "is-map": "^2.0.1", - "is-set": "^2.0.1", - "is-weakmap": "^2.0.1", - "is-weakset": "^2.0.1" - } - }, "which-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.10.tgz", + "integrity": "sha512-uxoA5vLUfRPdjCuJ1h5LlYdmTLbYfums398v3WLkM+i/Wltl2/XyZpQWKbN++ck5L64SR/grOHqtXCUKmlZPNA==", "requires": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", @@ -19848,15 +19534,9 @@ } }, "wildcard": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", - "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", - "dev": true - }, - "word-wrap": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.4.tgz", - "integrity": "sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", "dev": true }, "wrap-ansi": { @@ -19876,6 +19556,16 @@ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true }, + "write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + } + }, "ws": { "version": "8.8.1", "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.1.tgz", @@ -19902,9 +19592,9 @@ "dev": true }, "yargs": { - "version": "17.7.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", - "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, "requires": { "cliui": "^8.0.1", @@ -19914,16 +19604,14 @@ "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" - }, - "dependencies": { - "yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true - } } }, + "yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true + }, "yauzl": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", diff --git a/package.json b/package.json index f532382ae..fdacbb69c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@asyncapi/parser", - "version": "2.1.2", + "version": "3.0.0-next-major-spec.16", "description": "JavaScript AsyncAPI parser.", "bugs": { "url": "https://github.com/asyncapi/parser-js/issues" @@ -41,7 +41,7 @@ "prepublishOnly": "npm run generate:assets" }, "dependencies": { - "@asyncapi/specs": "^5.1.0", + "@asyncapi/specs": "^6.0.0", "@openapi-contrib/openapi-schema-to-json-schema": "~3.2.0", "@stoplight/json": "^3.20.2", "@stoplight/json-ref-readers": "^1.2.2", diff --git a/src/constants.ts b/src/constants.ts index 4218714ca..e52868f98 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -14,6 +14,7 @@ export const xParserOriginalTraits = 'x-parser-original-traits'; export const xParserCircular = 'x-parser-circular'; export const xParserCircularProps = 'x-parser-circular-props'; +export const xParserObjectUniqueId = 'x-parser-unique-object-id'; export const EXTENSION_REGEX = /^x-[\w\d.\-_]+$/; diff --git a/src/custom-operations/anonymous-naming.ts b/src/custom-operations/anonymous-naming.ts index d29b9e917..88522f3bd 100644 --- a/src/custom-operations/anonymous-naming.ts +++ b/src/custom-operations/anonymous-naming.ts @@ -1,6 +1,6 @@ import { xParserMessageName, xParserSchemaId } from '../constants'; import { traverseAsyncApiDocument } from '../iterator'; -import { setExtension } from '../utils'; +import { setExtension, setExtensionOnJson } from '../utils'; import type { AsyncAPIDocumentInterface, @@ -59,12 +59,15 @@ function assignUidToComponentSchemas(document: AsyncAPIDocumentInterface) { setExtension(xParserSchemaId, schema.id(), schema); }); } - + function assignUidToAnonymousSchemas(doc: AsyncAPIDocumentInterface) { let anonymousSchemaCounter = 0; function callback(schema: SchemaInterface) { + const json = schema.json() as any; + const isMultiFormatSchema = json.schema !== undefined; + const underlyingSchema = isMultiFormatSchema ? json.schema : json; if (!schema.id()) { - setExtension(xParserSchemaId, ``, schema); + setExtensionOnJson(xParserSchemaId, ``, underlyingSchema); } } traverseAsyncApiDocument(doc, callback); diff --git a/src/custom-operations/apply-traits.ts b/src/custom-operations/apply-traits.ts index 7ca2730d6..6d99453ff 100644 --- a/src/custom-operations/apply-traits.ts +++ b/src/custom-operations/apply-traits.ts @@ -2,7 +2,7 @@ import { JSONPath } from 'jsonpath-plus'; import { mergePatch } from '../utils'; -import type { v2 } from '../spec-types'; +import type { v2, v3 } from '../spec-types'; const v2TraitPaths = [ // operations @@ -17,26 +17,59 @@ const v2TraitPaths = [ ]; export function applyTraitsV2(asyncapi: v2.AsyncAPIObject) { - applyAllTraits(asyncapi, v2TraitPaths); + applyAllTraitsV2(asyncapi, v2TraitPaths); +} + +function applyAllTraitsV2(asyncapi: Record, paths: string[]) { + const visited: Set = new Set(); + paths.forEach(path => { + JSONPath({ + path, + json: asyncapi, + resultType: 'value', + callback(value) { + if (visited.has(value)) { + return; + } + visited.add(value); + applyTraitsToObjectV2(value); + }, + }); + }); +} + +function applyTraitsToObjectV2(value: Record) { + if (Array.isArray(value.traits)) { + for (const trait of value.traits) { + for (const key in trait) { + value[String(key)] = mergePatch(value[String(key)], trait[String(key)]); + } + } + } } const v3TraitPaths = [ // operations - '$.channels.*.[publish,subscribe]', - '$.components.channels.*.[publish,subscribe]', + '$.operations.*', + '$.operations.*.channel.*', + '$.operations.*.channel.messages.*', + '$.operations.*.messages.*', + '$.components.operations.*', + '$.components.operations.*.channel.*', + '$.components.operations.*.channel.messages.*', + '$.components.operations.*.messages.*', + // Channels + '$.channels.*.messages.*', + '$.components.channels.*.messages.*', // messages - '$.channels.*.[publish,subscribe].message', - '$.channels.*.[publish,subscribe].message.oneOf.*', - '$.components.channels.*.[publish,subscribe].message', - '$.components.channels.*.[publish,subscribe].message.oneOf.*', '$.components.messages.*', ]; -export function applyTraitsV3(asyncapi: v2.AsyncAPIObject) { // TODO: Change type when we will have implemented types for v3 - applyAllTraits(asyncapi, v3TraitPaths); +export function applyTraitsV3(asyncapi: v3.AsyncAPIObject) { + applyAllTraitsV3(asyncapi, v3TraitPaths); } -function applyAllTraits(asyncapi: Record, paths: string[]) { +function applyAllTraitsV3(asyncapi: Record, paths: string[]) { const visited: Set = new Set(); paths.forEach(path => { JSONPath({ @@ -48,18 +81,28 @@ function applyAllTraits(asyncapi: Record, paths: string[]) { return; } visited.add(value); - applyTraits(value); + applyTraitsToObjectV3(value); }, }); }); } -function applyTraits(value: Record & { traits?: any[] }) { - if (Array.isArray(value.traits)) { - for (const trait of value.traits) { - for (const key in trait) { - value[String(key)] = mergePatch(value[String(key)], trait[String(key)]); - } +function applyTraitsToObjectV3(value: Record) { + if (!Array.isArray(value.traits)) { + return; + } + + // shallow copy of object + const copy = { ...value }; + // reset the object but preserve the reference + for (const key in value) { + delete value[key]; + } + + // merge root object at the end + for (const trait of [...copy.traits as any[], copy]) { + for (const key in trait) { + value[String(key)] = mergePatch(value[String(key)], trait[String(key)]); } } } diff --git a/src/custom-operations/apply-unique-ids.ts b/src/custom-operations/apply-unique-ids.ts new file mode 100644 index 000000000..d9804235a --- /dev/null +++ b/src/custom-operations/apply-unique-ids.ts @@ -0,0 +1,25 @@ +import { xParserObjectUniqueId } from '../constants'; + +/** + * This function applies unique ids for objects whose key's function as ids, ensuring that the key is part of the value. + * + * For v3; Apply unique ids to channel's, and message's + */ +export function applyUniqueIds(structure: any) { + const asyncapiVersion = structure.asyncapi.charAt(0); + switch (asyncapiVersion) { + case '3': + if (structure.channels) { + for (const [channelId, channel] of Object.entries(structure.channels as Record)) { + channel[xParserObjectUniqueId] = channelId; + if (channel.messages) { + for (const [messageId, message] of Object.entries(channel.messages as Record)) { + message[xParserObjectUniqueId] = messageId; + } + } + } + } + break; + } +} + \ No newline at end of file diff --git a/src/custom-operations/index.ts b/src/custom-operations/index.ts index 521bbc50a..70e923ff9 100644 --- a/src/custom-operations/index.ts +++ b/src/custom-operations/index.ts @@ -1,33 +1,53 @@ -import { applyTraitsV2 } from './apply-traits'; +import { applyTraitsV2, applyTraitsV3 } from './apply-traits'; import { resolveCircularRefs } from './resolve-circular-refs'; -import { parseSchemasV2 } from './parse-schema'; +import { parseSchemasV2, parseSchemasV3 } from './parse-schema'; import { anonymousNaming } from './anonymous-naming'; +import { checkCircularRefs } from './check-circular-refs'; import type { RulesetFunctionContext } from '@stoplight/spectral-core'; import type { Parser } from '../parser'; import type { ParseOptions } from '../parse'; import type { AsyncAPIDocumentInterface } from '../models'; import type { DetailedAsyncAPI } from '../types'; +import type { v2, v3 } from '../spec-types'; +export {applyUniqueIds} from './apply-unique-ids'; export async function customOperations(parser: Parser, document: AsyncAPIDocumentInterface, detailed: DetailedAsyncAPI, inventory: RulesetFunctionContext['documentInventory'], options: ParseOptions): Promise { switch (detailed.semver.major) { case 2: return operationsV2(parser, document, detailed, inventory, options); - // case 3: return operationsV3(parser, document, detailed, options); + case 3: return operationsV3(parser, document, detailed, inventory, options); } } async function operationsV2(parser: Parser, document: AsyncAPIDocumentInterface, detailed: DetailedAsyncAPI, inventory: RulesetFunctionContext['documentInventory'], options: ParseOptions): Promise { + checkCircularRefs(document); + if (options.applyTraits) { - applyTraitsV2(detailed.parsed); + applyTraitsV2(detailed.parsed as v2.AsyncAPIObject); } if (options.parseSchemas) { await parseSchemasV2(parser, detailed); } - // anonymous naming and resolving circular refrences should be done after custom schemas parsing + // anonymous naming and resolving circular references should be done after custom schemas parsing if (inventory) { resolveCircularRefs(document, inventory); } anonymousNaming(document); } +async function operationsV3(parser: Parser, document: AsyncAPIDocumentInterface, detailed: DetailedAsyncAPI, inventory: RulesetFunctionContext['documentInventory'], options: ParseOptions): Promise { + checkCircularRefs(document); + + if (options.applyTraits) { + applyTraitsV3(detailed.parsed as v3.AsyncAPIObject); + } + if (options.parseSchemas) { + await parseSchemasV3(parser, detailed); + } + // anonymous naming and resolving circular references should be done after custom schemas parsing + if (inventory) { + resolveCircularRefs(document, inventory); + } + anonymousNaming(document); +} diff --git a/src/custom-operations/parse-schema.ts b/src/custom-operations/parse-schema.ts index 6221af6cf..d33c017b4 100644 --- a/src/custom-operations/parse-schema.ts +++ b/src/custom-operations/parse-schema.ts @@ -22,6 +22,24 @@ const customSchemasPathsV2 = [ '$.components.messages.*', ]; +const customSchemasPathsV3 = [ + // channels + '$.channels.*.messages.*.payload', + '$.channels.*.messages.*.headers', + '$.components.channels.*.messages.*.payload', + '$.components.channels.*.messages.*.headers', + // operations + '$.operations.*.messages.*.payload', + '$.operations.*.messages.*.headers', + '$.components.operations.*.messages.*.payload', + '$.components.operations.*.messages.*.headers', + // messages + '$.components.messages.*.payload', + '$.components.messages.*.headers.*', + // schemas + '$.components.schemas.*', +]; + export async function parseSchemasV2(parser: Parser, detailed: DetailedAsyncAPI) { const defaultSchemaFormat = getDefaultSchemaFormat(detailed.semver.version); const parseItems: Array = []; @@ -65,6 +83,68 @@ export async function parseSchemasV2(parser: Parser, detailed: DetailedAsyncAPI) return Promise.all(parseItems.map(item => parseSchemaV2(parser, item))); } +export async function parseSchemasV3(parser: Parser, detailed: DetailedAsyncAPI) { + const defaultSchemaFormat = getDefaultSchemaFormat(detailed.semver.version); + const parseItems: Array = []; + + const visited: Set = new Set(); + customSchemasPathsV3.forEach(path => { + JSONPath({ + path, + json: detailed.parsed, + resultType: 'all', + callback(result) { + const value = result.value; + if (visited.has(value)) { + return; + } + visited.add(value); + + const schema = value.schema; + if (!schema) { + return; + } + + let schemaFormat = value.schemaFormat; + if (!schemaFormat) { + return; + } + schemaFormat = getSchemaFormat(value.schemaFormat, detailed.semver.version); + + parseItems.push({ + input: { + asyncapi: detailed, + data: schema, + meta: { + message: value, + }, + path: [...splitPath(result.path), 'schema'], + schemaFormat, + defaultSchemaFormat, + }, + value, + }); + }, + }); + }); + + return Promise.all(parseItems.map(item => parseSchemaV3(parser, item))); +} + +async function parseSchemaV3(parser: Parser, item: ToParseItem) { + const originalData = item.input.data; + const parsedData = await parseSchema(parser, item.input); + if (item.value?.schema !== undefined) { + item.value.schema = parsedData; + } else { + item.value = parsedData; + } + // save original payload only when data is different (returned by custom parsers) + if (originalData !== parsedData) { + item.value[xParserOriginalPayload] = originalData; + } +} + async function parseSchemaV2(parser: Parser, item: ToParseItem) { const originalData = item.input.data; const parsedData = item.value.payload = await parseSchema(parser, item.input); diff --git a/src/document.ts b/src/document.ts index cc3cbf36a..76b0f257d 100644 --- a/src/document.ts +++ b/src/document.ts @@ -1,4 +1,4 @@ -import { AsyncAPIDocumentV2, AsyncAPIDocumentV3 } from './models'; +import { AsyncAPIDocumentV2, AsyncAPIDocumentV3, ParserAPIVersion } from './models'; import { unstringify } from './stringify'; import { createDetailedAsyncAPI } from './utils'; @@ -11,13 +11,14 @@ import { import type { AsyncAPIDocumentInterface } from './models'; import type { OldAsyncAPIDocument } from './old-api'; import type { DetailedAsyncAPI, AsyncAPIObject } from './types'; +import { v2, v3 } from 'spec-types'; export function createAsyncAPIDocument(asyncapi: DetailedAsyncAPI): AsyncAPIDocumentInterface { switch (asyncapi.semver.major) { case 2: - return new AsyncAPIDocumentV2(asyncapi.parsed, { asyncapi, pointer: '/' }); - // case 3: - // return new AsyncAPIDocumentV3(asyncapi.parsed, { asyncapi, pointer: '/' }); + return new AsyncAPIDocumentV2(asyncapi.parsed as v2.AsyncAPIObject, { asyncapi, pointer: '/' }); + case 3: + return new AsyncAPIDocumentV3(asyncapi.parsed as v3.AsyncAPIObject, { asyncapi, pointer: '/' }); default: throw new Error(`Unsupported AsyncAPI version: ${asyncapi.semver.version}`); } @@ -42,7 +43,7 @@ export function isAsyncAPIDocument(maybeDoc: unknown): maybeDoc is AsyncAPIDocum } if (maybeDoc && typeof (maybeDoc as AsyncAPIDocumentInterface).json === 'function') { const versionOfParserAPI = (maybeDoc as AsyncAPIDocumentInterface).json()[xParserApiVersion]; - return versionOfParserAPI === 1; + return versionOfParserAPI === ParserAPIVersion; } return false; } diff --git a/src/models/asyncapi.ts b/src/models/asyncapi.ts index d047d5e0d..cd08f7d48 100644 --- a/src/models/asyncapi.ts +++ b/src/models/asyncapi.ts @@ -9,9 +9,12 @@ import type { SchemasInterface } from './schemas'; import type { SecuritySchemesInterface } from './security-schemes'; import type { ServersInterface } from './servers'; -import type { v2 } from '../spec-types'; +import type { v2, v3 } from '../spec-types'; -export interface AsyncAPIDocumentInterface extends BaseModel, ExtensionsMixinInterface { +// https://github.com/asyncapi/parser-api/releases/tag/v3.0.0 +export const ParserAPIVersion = 3; + +export interface AsyncAPIDocumentInterface extends BaseModel, ExtensionsMixinInterface { version(): string; defaultContentType(): string | undefined; hasDefaultContentType(): boolean; diff --git a/src/models/channel.ts b/src/models/channel.ts index f9652600d..57f07ff35 100644 --- a/src/models/channel.ts +++ b/src/models/channel.ts @@ -7,7 +7,7 @@ import type { ServersInterface } from './servers'; export interface ChannelInterface extends BaseModel, BindingsMixinInterface, DescriptionMixinInterface, ExtensionsMixinInterface { id(): string; - address(): string; + address(): string | null | undefined; servers(): ServersInterface; operations(): OperationsInterface; messages(): MessagesInterface; diff --git a/src/models/external-documentation.ts b/src/models/external-documentation.ts new file mode 100644 index 000000000..9692a71d8 --- /dev/null +++ b/src/models/external-documentation.ts @@ -0,0 +1,9 @@ +import type { BaseModel } from './base'; +import type { DescriptionMixinInterface, ExtensionsMixinInterface } from './mixins'; + +export interface ExternalDocumentationInterface + extends BaseModel, DescriptionMixinInterface, ExtensionsMixinInterface { + + id(): string | undefined; + url(): string; +} \ No newline at end of file diff --git a/src/models/external-documentations.ts b/src/models/external-documentations.ts new file mode 100644 index 000000000..0b713f34f --- /dev/null +++ b/src/models/external-documentations.ts @@ -0,0 +1,11 @@ +import { Collection } from './collection'; + +import type { ExternalDocumentationInterface } from './external-docs'; + +export type ExternalDocumentationsInterface = Collection + +export class ExternalDocumentations extends Collection implements ExternalDocumentationsInterface { + override get(id: string): ExternalDocumentationInterface | undefined { + return this.collections.find(externalDocs => externalDocs.meta('id' as any) === id); + } +} diff --git a/src/models/index.ts b/src/models/index.ts index 1161d0a38..1d094f79e 100644 --- a/src/models/index.ts +++ b/src/models/index.ts @@ -27,6 +27,10 @@ export * from './message'; export * from './messages'; export * from './oauth-flow'; export * from './oauth-flows'; +export * from './operation-replies'; +export * from './operation-reply-address'; +export * from './operation-reply-addresses'; +export * from './operation-reply'; export * from './operation-trait'; export * from './operation-traits'; export * from './operation'; @@ -42,4 +46,4 @@ export * from './server-variables'; export * from './server'; export * from './servers'; export * from './tag'; -export * from './tags'; \ No newline at end of file +export * from './tags'; diff --git a/src/models/message-trait.ts b/src/models/message-trait.ts index b140fdfe6..3e16104a2 100644 --- a/src/models/message-trait.ts +++ b/src/models/message-trait.ts @@ -6,9 +6,9 @@ import type { SchemaInterface } from './schema'; export interface MessageTraitInterface extends BaseModel, BindingsMixinInterface, DescriptionMixinInterface, ExtensionsMixinInterface, ExternalDocumentationMixinInterface, TagsMixinInterface { id(): string; - schemaFormat(): string; + hasSchemaFormat(): boolean; + schemaFormat(): string | undefined; hasMessageId(): boolean; - messageId(): string | undefined; hasCorrelationId(): boolean; correlationId(): CorrelationIdInterface | undefined; hasContentType(): boolean; diff --git a/src/models/mixins.ts b/src/models/mixins.ts index 7cd305208..8ab9d3d12 100644 --- a/src/models/mixins.ts +++ b/src/models/mixins.ts @@ -7,6 +7,8 @@ export interface BindingsMixinInterface { bindings(): BindingsInterface; } +export interface CoreMixinInterface extends BindingsMixinInterface, DescriptionMixinInterface, ExtensionsMixinInterface, ExternalDocumentationMixinInterface, SummaryMixinInterface, TagsMixinInterface, TitleMixinInterface {} + export interface DescriptionMixinInterface { hasDescription(): boolean; description(): string | undefined; @@ -21,6 +23,16 @@ export interface ExternalDocumentationMixinInterface { externalDocs(): ExternalDocumentationInterface | undefined; } +export interface SummaryMixinInterface { + hasSummary(): boolean; + summary(): string | undefined; +} + export interface TagsMixinInterface { tags(): TagsInterface; -} \ No newline at end of file +} + +export interface TitleMixinInterface { + hasTitle(): boolean; + title(): string | undefined; +} diff --git a/src/models/operation-replies.ts b/src/models/operation-replies.ts new file mode 100644 index 000000000..83f3a9bb5 --- /dev/null +++ b/src/models/operation-replies.ts @@ -0,0 +1,5 @@ +import { Collection } from './collection'; +import type { OperationReplyInterface } from './operation-reply'; + +export type OperationRepliesInterface = Collection + diff --git a/src/models/operation-reply-address.ts b/src/models/operation-reply-address.ts new file mode 100644 index 000000000..ecdaac2a9 --- /dev/null +++ b/src/models/operation-reply-address.ts @@ -0,0 +1,7 @@ +import type { BaseModel } from './base'; +import type { DescriptionMixinInterface, ExtensionsMixinInterface } from './mixins'; + +export interface OperationReplyAddressInterface extends BaseModel, DescriptionMixinInterface, ExtensionsMixinInterface { + id(): string | undefined; + location(): string; +} diff --git a/src/models/operation-reply-addresses.ts b/src/models/operation-reply-addresses.ts new file mode 100644 index 000000000..6e6a00de4 --- /dev/null +++ b/src/models/operation-reply-addresses.ts @@ -0,0 +1,4 @@ +import { Collection } from './collection'; +import type { OperationReplyAddressInterface } from './operation-reply-address'; + +export type OperationReplyAddressesInterface = Collection diff --git a/src/models/operation-reply.ts b/src/models/operation-reply.ts new file mode 100644 index 000000000..18f0da84d --- /dev/null +++ b/src/models/operation-reply.ts @@ -0,0 +1,15 @@ +import type { BaseModel } from './base'; +import type { ExtensionsMixinInterface } from './mixins'; +import type { ChannelInterface } from './channel'; +import type { MessagesInterface } from './messages'; + +import type { OperationReplyAddressInterface } from './operation-reply-address'; + +export interface OperationReplyInterface extends BaseModel, ExtensionsMixinInterface { + id(): string | undefined; + hasAddress(): boolean; + address(): OperationReplyAddressInterface | undefined; + hasChannel(): boolean; + channel(): ChannelInterface | undefined; + messages(): MessagesInterface; +} diff --git a/src/models/operation-trait.ts b/src/models/operation-trait.ts index 821af8457..991ca7815 100644 --- a/src/models/operation-trait.ts +++ b/src/models/operation-trait.ts @@ -3,7 +3,7 @@ import type { BindingsMixinInterface, DescriptionMixinInterface, ExtensionsMixin import { SecurityRequirements } from './v2/security-requirements'; export interface OperationTraitInterface extends BaseModel, BindingsMixinInterface, DescriptionMixinInterface, ExtensionsMixinInterface, ExternalDocumentationMixinInterface, TagsMixinInterface { - id(): string; + id(): string | undefined; hasOperationId(): boolean; operationId(): string | undefined; hasSummary(): boolean; diff --git a/src/models/operation.ts b/src/models/operation.ts index 1bb372296..6a92b9c8a 100644 --- a/src/models/operation.ts +++ b/src/models/operation.ts @@ -1,6 +1,7 @@ import type { BaseModel } from './base'; import type { ChannelsInterface } from './channels'; import type { MessagesInterface } from './messages'; +import type { OperationReplyInterface } from './operation-reply'; import type { OperationTraitsInterface } from './operation-traits'; import type { OperationTraitInterface } from './operation-trait'; import type { ServersInterface } from './servers'; @@ -14,5 +15,6 @@ export interface OperationInterface extends BaseModel, OperationTraitInterface { servers(): ServersInterface; channels(): ChannelsInterface; messages(): MessagesInterface; + reply(): OperationReplyInterface | undefined; traits(): OperationTraitsInterface; } diff --git a/src/models/schema.ts b/src/models/schema.ts index dbcebe489..bc1f5d42c 100644 --- a/src/models/schema.ts +++ b/src/models/schema.ts @@ -49,6 +49,7 @@ export interface SchemaInterface extends BaseModel, Ext propertyNames(): SchemaInterface | undefined; readOnly(): boolean | undefined; required(): Array | undefined; + schemaFormat(): string then(): SchemaInterface | undefined; title(): string | undefined; type(): string | Array | undefined; diff --git a/src/models/server.ts b/src/models/server.ts index 9509d0f45..52e2ece50 100644 --- a/src/models/server.ts +++ b/src/models/server.ts @@ -9,6 +9,9 @@ import type { SecurityRequirementsInterface } from './security-requirements'; export interface ServerInterface extends BaseModel, DescriptionMixinInterface, BindingsMixinInterface, ExtensionsMixinInterface, TagsMixinInterface { id(): string url(): string; + host(): string; + hasPathname(): boolean; + pathname(): string | undefined; protocol(): string; protocolVersion(): string | undefined; hasProtocolVersion(): boolean; diff --git a/src/models/utils.ts b/src/models/utils.ts index 298a4dde0..47a0a73a7 100644 --- a/src/models/utils.ts +++ b/src/models/utils.ts @@ -1,8 +1,12 @@ import type { BaseModel, ModelMetadata } from './base'; import type { DetailedAsyncAPI } from '../types'; +import { SchemaInterface } from './schema'; +import { SchemaTypesToIterate, traverseAsyncApiDocument } from '../iterator'; +import { AsyncAPIDocumentInterface } from './asyncapi'; +import { SchemasInterface } from '../models'; export interface Constructor extends Function { - new (...any: any[]): T; + new(...any: any[]): T; } export type InferModelData = T extends BaseModel ? J : never; @@ -12,3 +16,24 @@ export type InferModelMetadata = T extends BaseModel ? M : export function createModel(Model: Constructor, value: InferModelData, meta: Omit & { asyncapi?: DetailedAsyncAPI } & InferModelMetadata, parent?: BaseModel): T { return new Model(value, { ...meta, asyncapi: meta.asyncapi || parent?.meta().asyncapi }); } + +export function schemasFromDocument(document: AsyncAPIDocumentInterface, SchemasModel: Constructor, includeComponents: boolean): T { + const jsonInstances: Set = new Set(); + const schemas: Set = new Set(); + + function callback(schema: SchemaInterface) { + // comparing the reference (and not just the value) to the .json() object + if (!jsonInstances.has(schema.json())) { + jsonInstances.add(schema.json()); + schemas.add(schema); // unique schemas + } + } + + let toIterate = Object.values(SchemaTypesToIterate); + if (!includeComponents) { + toIterate = toIterate.filter(s => s !== SchemaTypesToIterate.Components); + } + traverseAsyncApiDocument(document, callback, toIterate); + + return new SchemasModel(Array.from(schemas)); +} diff --git a/src/models/v2/asyncapi.ts b/src/models/v2/asyncapi.ts index 5c1359c9e..5cd0e8cbd 100644 --- a/src/models/v2/asyncapi.ts +++ b/src/models/v2/asyncapi.ts @@ -12,8 +12,8 @@ import { SecurityScheme } from './security-scheme'; import { Schemas } from './schemas'; import { extensions } from './mixins'; -import { traverseAsyncApiDocument, SchemaTypesToIterate } from '../../iterator'; import { tilde } from '../../utils'; +import { schemasFromDocument } from '../utils'; import type { AsyncAPIDocumentInterface } from '../asyncapi'; import type { InfoInterface } from '../info'; @@ -27,7 +27,6 @@ import type { OperationInterface } from '../operation'; import type { MessagesInterface } from '../messages'; import type { MessageInterface } from '../message'; import type { SchemasInterface } from '../schemas'; -import type { SchemaInterface } from '../schema'; import type { SecuritySchemesInterface } from '../security-schemes'; import type { ExtensionsInterface } from '../extensions'; @@ -81,7 +80,7 @@ export class AsyncAPIDocument extends BaseModel implements As } schemas(): SchemasInterface { - return this.__schemas(false); + return schemasFromDocument(this, Schemas, false); } securitySchemes(): SecuritySchemesInterface { @@ -97,7 +96,7 @@ export class AsyncAPIDocument extends BaseModel implements As } allServers(): ServersInterface { - const servers: ServerInterface[] = this.servers(); + const servers: ServerInterface[] = this.servers().all(); this.components().servers().forEach(server => !servers.some(s => s.json() === server.json()) && servers.push(server) ); @@ -105,7 +104,7 @@ export class AsyncAPIDocument extends BaseModel implements As } allChannels(): ChannelsInterface { - const channels: ChannelInterface[] = this.channels(); + const channels: ChannelInterface[] = this.channels().all(); this.components().channels().forEach(channel => !channels.some(c => c.json() === channel.json()) && channels.push(channel) ); @@ -130,26 +129,10 @@ export class AsyncAPIDocument extends BaseModel implements As } allSchemas(): SchemasInterface { - return this.__schemas(true); + return schemasFromDocument(this, Schemas, true); } extensions(): ExtensionsInterface { return extensions(this); } - - private __schemas(withComponents: boolean) { - const schemas: Set = new Set(); - function callback(schema: SchemaInterface) { - if (!schemas.has(schema.json())) { - schemas.add(schema); - } - } - - let toIterate = Object.values(SchemaTypesToIterate); - if (!withComponents) { - toIterate = toIterate.filter(s => s !== SchemaTypesToIterate.Components); - } - traverseAsyncApiDocument(this, callback, toIterate); - return new Schemas(Array.from(schemas)); - } } diff --git a/src/models/v2/info.ts b/src/models/v2/info.ts index 5ca6dda00..a38cdfdce 100644 --- a/src/models/v2/info.ts +++ b/src/models/v2/info.ts @@ -68,17 +68,20 @@ export class Info extends BaseModel implements InfoInterface { } hasExternalDocs(): boolean { - return Object.keys(this._meta.asyncapi.parsed.externalDocs || {}).length > 0; + const asyncapiV2 = this._meta.asyncapi.parsed as v2.AsyncAPIObject; + return Object.keys(asyncapiV2.externalDocs || {}).length > 0; } externalDocs(): ExternalDocumentationInterface | undefined { if (this.hasExternalDocs()) { - return this.createModel(ExternalDocumentation, this._meta.asyncapi.parsed.externalDocs as v2.ExternalDocumentationObject, { pointer: '/externalDocs' }); + const asyncapiV2 = this._meta.asyncapi.parsed as v2.AsyncAPIObject; + return this.createModel(ExternalDocumentation, asyncapiV2.externalDocs as v2.ExternalDocumentationObject, { pointer: '/externalDocs' }); } } tags(): TagsInterface { - const tags = this._meta.asyncapi.parsed.tags || []; + const asyncapiV2 = this._meta.asyncapi.parsed as v2.AsyncAPIObject; + const tags = asyncapiV2.tags || []; return new Tags(tags.map((tag: any, idx: number) => this.createModel(Tag, tag, { pointer: `/tags/${idx}` }))); } diff --git a/src/models/v2/message-trait.ts b/src/models/v2/message-trait.ts index 299b7856c..fb327f615 100644 --- a/src/models/v2/message-trait.ts +++ b/src/models/v2/message-trait.ts @@ -5,8 +5,8 @@ import { MessageExample } from './message-example'; import { Schema } from './schema'; import { xParserMessageName } from '../../constants'; -import { getDefaultSchemaFormat } from '../../schema-parser'; import { bindings, hasDescription, description, extensions, hasExternalDocs, externalDocs, tags } from './mixins'; +import { getDefaultSchemaFormat } from '../../schema-parser'; import type { BindingsInterface } from '../bindings'; import type { CorrelationIdInterface } from '../correlation-id'; @@ -21,20 +21,20 @@ import type { v2 } from '../../spec-types'; export class MessageTrait extends BaseModel implements MessageTraitInterface { id(): string { - return this.messageId() || this._meta.id || this.json(xParserMessageName) as string; + return this._json.messageId || this._meta.id || this.json(xParserMessageName) as string; + } + + hasSchemaFormat(): boolean { + return this.schemaFormat() !== undefined; } - schemaFormat(): string { + schemaFormat(): string | undefined { return this._json.schemaFormat || getDefaultSchemaFormat(this._meta.asyncapi.semver.version); } hasMessageId(): boolean { return !!this._json.messageId; } - - messageId(): string | undefined { - return this._json.messageId; - } hasCorrelationId(): boolean { return !!this._json.correlationId; diff --git a/src/models/v2/message.ts b/src/models/v2/message.ts index ad87eeba3..5908d2956 100644 --- a/src/models/v2/message.ts +++ b/src/models/v2/message.ts @@ -27,7 +27,7 @@ export class Message extends MessageTrait implements MessageIn payload(): SchemaInterface | undefined { if (!this._json.payload) return undefined; - return this.createModel(Schema, this._json.payload, { pointer: `${this._meta.pointer}/payload` }); + return this.createModel(Schema, this._json.payload, { pointer: `${this._meta.pointer}/payload`, schemaFormat: this._json.schemaFormat }); } servers(): ServersInterface { diff --git a/src/models/v2/operation.ts b/src/models/v2/operation.ts index b1193ddef..4fb696d74 100644 --- a/src/models/v2/operation.ts +++ b/src/models/v2/operation.ts @@ -12,6 +12,7 @@ import type { ChannelsInterface } from '../channels'; import type { ChannelInterface } from '../channel'; import type { MessagesInterface } from '../messages'; import type { OperationInterface, OperationAction } from '../operation'; +import type { OperationReplyInterface } from '../operation-reply'; import type { OperationTraitsInterface } from '../operation-traits'; import type { ServersInterface } from '../servers'; import type { ServerInterface } from '../server'; @@ -76,6 +77,10 @@ export class Operation extends OperationTrait implements Ope ); } + reply(): OperationReplyInterface | undefined { + return; + } + traits(): OperationTraitsInterface { return new OperationTraits( (this._json.traits || []).map((trait: any, index: number) => { diff --git a/src/models/v2/schema.ts b/src/models/v2/schema.ts index 20ae87529..9f2df8600 100644 --- a/src/models/v2/schema.ts +++ b/src/models/v2/schema.ts @@ -2,6 +2,7 @@ import { BaseModel } from '../base'; import { xParserSchemaId } from '../../constants'; import { extensions, hasExternalDocs, externalDocs } from './mixins'; +import { getDefaultSchemaFormat } from '../../schema-parser'; import type { ExtensionsInterface } from '../extensions'; import type { ExternalDocumentationInterface } from '../external-docs'; @@ -9,7 +10,7 @@ import type { SchemaInterface } from '../schema'; import type { v2 } from '../../spec-types'; -export class Schema extends BaseModel implements SchemaInterface { +export class Schema extends BaseModel implements SchemaInterface { id(): string { return this.$id() || this._meta.id || this.json(xParserSchemaId as any) as string; } @@ -267,6 +268,10 @@ export class Schema extends BaseModel implement return this._json.url; } + host(): string { + const url = new URL(this.url()); + return url.host; + } + + hasPathname(): boolean { + return !!this.pathname(); + } + + pathname(): string | undefined { + const url = new URL(this.url()); + return url.pathname; + } + protocol(): string { return this._json.protocol; } diff --git a/src/models/v3/asyncapi.ts b/src/models/v3/asyncapi.ts index f26a22e98..756140b0b 100644 --- a/src/models/v3/asyncapi.ts +++ b/src/models/v3/asyncapi.ts @@ -1,7 +1,147 @@ import { BaseModel } from '../base'; +import { Info } from './info'; +import { Servers } from './servers'; +import { Server } from './server'; +import { Channels } from './channels'; +import { Channel } from './channel'; +import { Operations } from './operations'; +import { Operation } from './operation'; +import { Messages } from './messages'; +import { SecuritySchemes } from './security-schemes'; +import { SecurityScheme } from './security-scheme'; +import { Components } from './components'; +import { Schemas } from './schemas'; -export class AsyncAPIDocument extends BaseModel { +import { extensions } from './mixins'; +import { tilde } from '../../utils'; +import { schemasFromDocument } from '../utils'; + +import type { AsyncAPIDocumentInterface } from '../asyncapi'; +import type { InfoInterface } from '../info'; +import type { ServersInterface } from '../servers'; +import type { ChannelsInterface } from '../channels'; +import type { OperationsInterface } from '../operations'; +import type { MessagesInterface } from '../messages'; +import type { MessageInterface } from '../message'; +import type { ComponentsInterface } from '../components'; +import type { SecuritySchemesInterface } from '../security-schemes'; +import type { ExtensionsInterface } from '../extensions'; +import type { SchemasInterface } from '../schemas'; +import type { OperationInterface } from '../operation'; +import type { ChannelInterface } from '../channel'; +import type { ServerInterface } from '../server'; + +import type { v3 } from '../../spec-types'; + +export class AsyncAPIDocument extends BaseModel implements AsyncAPIDocumentInterface { version(): string { return this._json.asyncapi; } + + defaultContentType(): string | undefined { + return this._json.defaultContentType; + } + + hasDefaultContentType(): boolean { + return !!this._json.defaultContentType; + } + + info(): InfoInterface { + return this.createModel(Info, this._json.info, { pointer: '/info' }); + } + + servers(): ServersInterface { + return new Servers( + Object.entries(this._json.servers || {}).map(([serverName, server]) => + this.createModel(Server, server as v3.ServerObject, { id: serverName, pointer: `/servers/${tilde(serverName)}` }) + ) + ); + } + + channels(): ChannelsInterface { + return new Channels( + Object.entries(this._json.channels || {}).map(([channelId, channel]) => + this.createModel(Channel, channel as v3.ChannelObject, { id: channelId, pointer: `/channels/${tilde(channelId)}` }) + ) + ); + } + + operations(): OperationsInterface { + return new Operations( + Object.entries(this._json.operations || {}).map(([operationId, operation]) => + this.createModel(Operation, operation as v3.OperationObject, { id: operationId, pointer: `/operations/${tilde(operationId)}` }) + ) + ); + } + + messages(): MessagesInterface { + const messages: MessageInterface[] = []; + const messagesData: any[] = []; + this.channels().forEach(channel => { + channel.messages().forEach(message => { + const messageData = message.json(); + if (!messagesData.includes(messageData)) { + messagesData.push(messageData); + messages.push(message); + } + }); + }); + return new Messages(messages); + } + + schemas(): SchemasInterface { + return schemasFromDocument(this, Schemas, false); + } + + securitySchemes(): SecuritySchemesInterface { + return new SecuritySchemes( + Object.entries(this._json.components?.securitySchemes || {}).map(([securitySchemeName, securityScheme]) => + this.createModel(SecurityScheme, securityScheme as v3.SecuritySchemeObject, { id: securitySchemeName, pointer: `/components/securitySchemes/${securitySchemeName}` }) + ) + ); + } + + components(): ComponentsInterface { + return this.createModel(Components, this._json.components || {}, { pointer: '/components' }); + } + + allServers(): ServersInterface { + const servers: ServerInterface[] = this.servers().all(); + this.components().servers().forEach(server => + !servers.some(s => s.json() === server.json()) && servers.push(server) + ); + return new Servers(servers); + } + + allChannels(): ChannelsInterface { + const channels: ChannelInterface[] = this.channels().all(); + this.components().channels().forEach(channel => + !channels.some(c => c.json() === channel.json()) && channels.push(channel) + ); + return new Channels(channels); + } + + allOperations(): OperationsInterface { + const operations: OperationInterface[] = this.operations().all(); + this.components().operations().forEach(operation => + !operations.some(o => o.json() === operation.json()) && operations.push(operation) + ); + return new Operations(operations); + } + + allMessages(): MessagesInterface { + const messages: MessageInterface[] = this.messages().all(); + this.components().messages().forEach(message => ( + !messages.some(m => m.json() === message.json()) && messages.push(message) + )); + return new Messages(messages); + } + + allSchemas(): SchemasInterface { + return schemasFromDocument(this, Schemas, true); + } + + extensions(): ExtensionsInterface { + return extensions(this); + } } diff --git a/src/models/v3/binding.ts b/src/models/v3/binding.ts new file mode 100644 index 000000000..56fde118c --- /dev/null +++ b/src/models/v3/binding.ts @@ -0,0 +1,28 @@ +import { BaseModel } from '../base'; + +import { extensions } from './mixins'; + +import type { BindingInterface } from '../binding'; +import type { ExtensionsInterface } from '../extensions'; + +import type { v3 } from '../../spec-types'; + +export class Binding = Record> extends BaseModel implements BindingInterface { + protocol(): string { + return this._meta.protocol; + } + + version(): string { + return this._json.bindingVersion || 'latest'; + } + + value(): V { + const value = { ...this._json }; + delete (value as any).bindingVersion; + return value as unknown as V; + } + + extensions(): ExtensionsInterface { + return extensions(this); + } +} diff --git a/src/models/v3/bindings.ts b/src/models/v3/bindings.ts new file mode 100644 index 000000000..c17208d60 --- /dev/null +++ b/src/models/v3/bindings.ts @@ -0,0 +1,31 @@ +import { Collection } from '../collection'; +import { Extensions } from './extensions'; +import { Extension } from './extension'; + +import { createModel } from '../utils'; +import { EXTENSION_REGEX } from '../../constants'; + +import type { BindingsInterface } from '../bindings'; +import type { BindingInterface } from '../binding'; +import type { ExtensionsInterface } from '../extensions'; +import type { ExtensionInterface } from '../extension'; + +import type { v3 } from '../../spec-types'; + +export class Bindings extends Collection implements BindingsInterface { + override get = Record>(name: string): BindingInterface | undefined { + return this.collections.find(binding => binding.protocol() === name); + } + + extensions(): ExtensionsInterface { + const extensions: ExtensionInterface[] = []; + Object.entries(this._meta.originalData as v3.SpecificationExtensions || {}).forEach(([id, value]) => { + if (EXTENSION_REGEX.test(id)) { + extensions.push( + createModel(Extension, value, { id, pointer: `${this._meta.pointer}/${id}`, asyncapi: this._meta.asyncapi }) as Extension + ); + } + }); + return new Extensions(extensions); + } +} diff --git a/src/models/v3/channel-parameter.ts b/src/models/v3/channel-parameter.ts new file mode 100644 index 000000000..41e46bfab --- /dev/null +++ b/src/models/v3/channel-parameter.ts @@ -0,0 +1,48 @@ +import { BaseModel } from '../base'; +import { hasDescription, description, extensions } from './mixins'; +import { Schema } from './schema'; + +import type { ChannelParameterInterface } from '../channel-parameter'; +import type { SchemaInterface } from '../schema'; +import type { ExtensionsInterface } from '../extensions'; +import type { v3 } from '../../spec-types'; + +export class ChannelParameter extends BaseModel implements ChannelParameterInterface { + id(): string { + return this._meta.id; + } + + hasSchema(): boolean { + return true; + } + + schema(): SchemaInterface | undefined { + return this.createModel(Schema, { + type: 'string', + description: this._json.description, + enum: this._json.enum, + default: this._json.default, + examples: this._json.examples + }, { pointer: `${this._meta.pointer}` }); + } + + hasLocation(): boolean { + return !!this._json.location; + } + + location(): string | undefined { + return this._json.location; + } + + hasDescription(): boolean { + return hasDescription(this); + } + + description(): string | undefined { + return description(this); + } + + extensions(): ExtensionsInterface { + return extensions(this); + } +} diff --git a/src/models/v3/channel-parameters.ts b/src/models/v3/channel-parameters.ts new file mode 100644 index 000000000..71d7cf10e --- /dev/null +++ b/src/models/v3/channel-parameters.ts @@ -0,0 +1,10 @@ +import { Collection } from '../collection'; + +import type { ChannelParametersInterface } from '../channel-parameters'; +import type { ChannelParameterInterface } from '../channel-parameter'; + +export class ChannelParameters extends Collection implements ChannelParametersInterface { + override get(id: string): ChannelParameterInterface | undefined { + return this.collections.find(parameter => parameter.id() === id); + } +} diff --git a/src/models/v3/channel.ts b/src/models/v3/channel.ts new file mode 100644 index 000000000..9c9c14749 --- /dev/null +++ b/src/models/v3/channel.ts @@ -0,0 +1,72 @@ +import { ChannelParameters } from './channel-parameters'; +import { ChannelParameter } from './channel-parameter'; +import { Messages } from './messages'; +import { Message } from './message'; +import { Operations } from './operations'; +import { Operation } from './operation'; +import { Servers } from './servers'; +import { Server } from './server'; +import { xParserObjectUniqueId } from '../../constants'; +import { CoreModel } from './mixins'; +import type { ChannelInterface } from '../channel'; +import type { ChannelParametersInterface } from '../channel-parameters'; +import type { MessagesInterface } from '../messages'; +import type { OperationsInterface } from '../operations'; +import type { OperationInterface } from '../operation'; +import type { ServersInterface } from '../servers'; +import type { ServerInterface } from '../server'; +import type { v3 } from '../../spec-types'; + +export class Channel extends CoreModel implements ChannelInterface { + id(): string { + return this._meta.id; + } + + address(): string | null | undefined { + return this._json.address; + } + + servers(): ServersInterface { + const servers: ServerInterface[] = []; + const allowedServers = this._json.servers ?? []; + Object.entries(this._meta.asyncapi?.parsed.servers ?? {}).forEach(([serverName, server]) => { + if (allowedServers.length === 0 || allowedServers.includes(server)) { + servers.push(this.createModel(Server, server, { id: serverName, pointer: `/servers/${serverName}` })); + } + }); + return new Servers(servers); + } + + operations(): OperationsInterface { + const operations: OperationInterface[] = []; + Object.entries(((this._meta.asyncapi?.parsed as v3.AsyncAPIObject)?.operations ?? {} as v3.OperationsObject)).forEach(([operationId, operation]) => { + const operationChannelId = ((operation as v3.OperationObject).channel as any)[xParserObjectUniqueId]; + const channelId = (this._json as any)[xParserObjectUniqueId]; + if (operationChannelId === channelId) { + operations.push( + this.createModel(Operation, operation as v3.OperationObject, { id: operationId, pointer: `/operations/${operationId}` }), + ); + } + }); + return new Operations(operations); + } + + messages(): MessagesInterface { + return new Messages( + Object.entries(this._json.messages ?? {}).map(([messageName, message]) => { + return this.createModel(Message, message as v3.MessageObject, { id: messageName, pointer: this.jsonPath(`messages/${messageName}`) }); + }) + ); + } + + parameters(): ChannelParametersInterface { + return new ChannelParameters( + Object.entries(this._json.parameters ?? {}).map(([channelParameterName, channelParameter]) => { + return this.createModel(ChannelParameter, channelParameter as v3.ParameterObject, { + id: channelParameterName, + pointer: this.jsonPath(`parameters/${channelParameterName}`), + }); + }) + ); + } +} diff --git a/src/models/v3/channels.ts b/src/models/v3/channels.ts new file mode 100644 index 000000000..2f285f51e --- /dev/null +++ b/src/models/v3/channels.ts @@ -0,0 +1,18 @@ +import { Collection } from '../collection'; + +import type { ChannelsInterface } from '../channels'; +import type { ChannelInterface } from '../channel'; + +export class Channels extends Collection implements ChannelsInterface { + override get(id: string): ChannelInterface | undefined { + return this.collections.find(channel => channel.id() === id); + } + + filterBySend(): ChannelInterface[] { + return this.filterBy(channel => channel.operations().filterBySend().length > 0); + } + + filterByReceive(): ChannelInterface[] { + return this.filterBy(channel => channel.operations().filterByReceive().length > 0); + } +} diff --git a/src/models/v3/components.ts b/src/models/v3/components.ts new file mode 100644 index 000000000..9931b0b70 --- /dev/null +++ b/src/models/v3/components.ts @@ -0,0 +1,168 @@ +import { BaseModel } from '../base'; +import { Collection } from '../collection'; + +import { Bindings } from './bindings'; +import { Binding } from './binding'; +import { Channel } from './channel'; +import { ChannelParameter } from './channel-parameter'; +import { CorrelationId } from './correlation-id'; +import { MessageTrait } from './message-trait'; +import { OperationTrait } from './operation-trait'; +import { OperationReply } from './operation-reply'; +import { OperationReplyAddress } from './operation-reply-address'; +import { Schema } from './schema'; +import { SecurityScheme } from './security-scheme'; +import { Server } from './server'; +import { ServerVariable } from './server-variable'; +import { extensions } from './mixins'; +import { Servers } from './servers'; +import { Channels } from './channels'; +import { Messages } from './messages'; +import { Schemas } from './schemas'; +import { ChannelParameters } from './channel-parameters'; +import { ServerVariables } from './server-variables'; +import { OperationTraits } from './operation-traits'; +import { MessageTraits } from './message-traits'; +import { OperationReplies } from './operation-replies'; +import { OperationReplyAddresses } from './operation-reply-addresses'; +import { SecuritySchemes } from './security-schemes'; +import { CorrelationIds } from './correlation-ids'; +import { Operations } from './operations'; +import { Operation } from './operation'; +import { Message } from './message'; +import { ExternalDocumentations } from '../external-documentations'; +import { ExternalDocumentation } from './external-docs'; +import { Tags } from './tags'; +import { Tag } from './tag'; + +import { tilde } from '../../utils'; + +import type { BindingsInterface } from '../bindings'; +import type { ComponentsInterface } from '../components'; +import type { ExtensionsInterface } from '../extensions'; +import type { Constructor } from '../utils'; +import type { ServersInterface } from '../servers'; +import type { ChannelsInterface } from '../channels'; +import type { MessagesInterface } from '../messages'; +import type { SchemasInterface } from '../schemas'; +import type { ChannelParametersInterface } from '../channel-parameters'; +import type { ServerVariablesInterface } from '../server-variables'; +import type { OperationTraitsInterface } from '../operation-traits'; +import type { SecuritySchemesInterface } from '../security-schemes'; +import type { MessageTraitsInterface } from '../message-traits'; +import type { OperationRepliesInterface } from '../operation-replies'; +import type { OperationReplyAddressesInterface } from '../operation-reply-addresses'; +import type { OperationsInterface } from '../operations'; +import type { ExternalDocumentationsInterface } from '../external-documentations'; +import type { TagsInterface } from '../tags'; + +import type { v3 } from '../../spec-types'; + +export class Components extends BaseModel implements ComponentsInterface { + servers(): ServersInterface { + return this.createCollection('servers', Servers, Server); + } + + channels(): ChannelsInterface { + return this.createCollection('channels', Channels, Channel); + } + + operations(): OperationsInterface { + return this.createCollection('operations', Operations, Operation); + } + + messages(): MessagesInterface { + return this.createCollection('messages', Messages, Message); + } + + schemas(): SchemasInterface { + return this.createCollection('schemas', Schemas, Schema); + } + + channelParameters(): ChannelParametersInterface { + return this.createCollection('parameters', ChannelParameters, ChannelParameter); + } + + serverVariables(): ServerVariablesInterface { + return this.createCollection('serverVariables', ServerVariables, ServerVariable); + } + + operationTraits(): OperationTraitsInterface { + return this.createCollection('operationTraits', OperationTraits, OperationTrait); + } + + messageTraits(): MessageTraitsInterface { + return this.createCollection('messageTraits', MessageTraits, MessageTrait); + } + + replies(): OperationRepliesInterface { + return this.createCollection('replies', OperationReplies, OperationReply); + } + + replyAddresses(): OperationReplyAddressesInterface { + return this.createCollection('replyAddresses', OperationReplyAddresses, OperationReplyAddress); + } + + correlationIds(): CorrelationIds { + return this.createCollection('correlationIds', CorrelationIds, CorrelationId); + } + + securitySchemes(): SecuritySchemesInterface { + return this.createCollection('securitySchemes', SecuritySchemes, SecurityScheme); + } + + tags(): TagsInterface { + return this.createCollection('tags', Tags, Tag); + } + + externalDocs(): ExternalDocumentationsInterface { + return this.createCollection('externalDocs', ExternalDocumentations, ExternalDocumentation); + } + + serverBindings(): Record { + return this.createBindings('serverBindings'); + } + + channelBindings(): Record { + return this.createBindings('channelBindings'); + } + + operationBindings(): Record { + return this.createBindings('operationBindings'); + } + + messageBindings(): Record { + return this.createBindings('messageBindings'); + } + + extensions(): ExtensionsInterface { + return extensions(this); + } + + isEmpty(): boolean { + return Object.keys(this._json).length === 0; + } + + protected createCollection, T extends BaseModel>(itemsName: keyof v3.ComponentsObject, collectionModel: Constructor, itemModel: Constructor): M { + const collectionItems: T[] = []; + Object.entries(this._json[itemsName] || {}).forEach(([id, item]) => { + collectionItems.push(this.createModel(itemModel, item as any, { id, pointer: `/components/${itemsName}/${tilde(id)}` } as any)); + }); + return new collectionModel(collectionItems); + } + + protected createBindings(itemsName: 'serverBindings' | 'channelBindings' | 'operationBindings' | 'messageBindings'): Record { + return Object.entries(this._json[itemsName] || {}).reduce((bindings, [name, item]) => { + const bindingsData = item || {}; + const asyncapi = this.meta('asyncapi'); + const pointer = `components/${itemsName}/${name}`; + bindings[name] = new Bindings( + Object.entries(bindingsData).map(([protocol, binding]) => + this.createModel(Binding, binding, { protocol, pointer: `${pointer}/${protocol}` }) + ), + { originalData: bindingsData as any, asyncapi, pointer } + ); + return bindings; + }, {} as Record); + } +} diff --git a/src/models/v3/contact.ts b/src/models/v3/contact.ts new file mode 100644 index 000000000..69166bd18 --- /dev/null +++ b/src/models/v3/contact.ts @@ -0,0 +1,38 @@ +import { BaseModel } from '../base'; + +import { extensions } from './mixins'; + +import type { ContactInterface } from '../contact'; +import type { ExtensionsInterface } from '../extensions'; + +import type { v3 } from '../../spec-types'; + +export class Contact extends BaseModel implements ContactInterface { + hasName(): boolean { + return !!this._json.name; + } + + name(): string | undefined { + return this._json.name; + } + + hasUrl(): boolean { + return !!this._json.url; + } + + url(): string | undefined { + return this._json.url; + } + + hasEmail(): boolean { + return !!this._json.email; + } + + email(): string | undefined { + return this._json.email; + } + + extensions(): ExtensionsInterface { + return extensions(this); + } +} \ No newline at end of file diff --git a/src/models/v3/correlation-id.ts b/src/models/v3/correlation-id.ts new file mode 100644 index 000000000..d447e4b4b --- /dev/null +++ b/src/models/v3/correlation-id.ts @@ -0,0 +1,30 @@ +import { BaseModel } from '../base'; + +import { hasDescription, description, extensions } from './mixins'; + +import type { CorrelationIdInterface } from '../correlation-id'; +import type { ExtensionsInterface } from '../extensions'; + +import type { v3 } from '../../spec-types'; + +export class CorrelationId extends BaseModel implements CorrelationIdInterface { + hasDescription(): boolean { + return hasDescription(this); + } + + description(): string | undefined { + return description(this); + } + + hasLocation(): boolean { + return !!this._json.location; + } + + location(): string | undefined { + return this._json.location; + } + + extensions(): ExtensionsInterface { + return extensions(this); + } +} diff --git a/src/models/v3/correlation-ids.ts b/src/models/v3/correlation-ids.ts new file mode 100644 index 000000000..d0a921171 --- /dev/null +++ b/src/models/v3/correlation-ids.ts @@ -0,0 +1,10 @@ +import { Collection } from '../collection'; + +import type { CorrelationIdsInterface } from '../correlation-ids'; +import type { CorrelationIdInterface } from '../correlation-id'; + +export class CorrelationIds extends Collection implements CorrelationIdsInterface { + override get(id: string): CorrelationIdInterface | undefined { + return this.collections.find(correlationId => correlationId.meta('id' as any) === id); + } +} diff --git a/src/models/v3/extension.ts b/src/models/v3/extension.ts new file mode 100644 index 000000000..d747afc2d --- /dev/null +++ b/src/models/v3/extension.ts @@ -0,0 +1,19 @@ +import { BaseModel } from '../base'; + +import type { ExtensionInterface } from '../extension'; + +import type { v3 } from '../../spec-types'; + +export class Extension extends BaseModel, { id: string }> implements ExtensionInterface { + id(): string { + return this._meta.id; + } + + version(): string { + return 'to implement'; + } + + value(): V { + return this._json as unknown as V; + } +} diff --git a/src/models/v3/extensions.ts b/src/models/v3/extensions.ts new file mode 100644 index 000000000..e529b35d3 --- /dev/null +++ b/src/models/v3/extensions.ts @@ -0,0 +1,11 @@ +import { Collection } from '../collection'; + +import type { ExtensionsInterface } from '../extensions'; +import type { ExtensionInterface } from '../extension'; + +export class Extensions extends Collection implements ExtensionsInterface { + override get(id: string): ExtensionInterface | undefined { + id = id.startsWith('x-') ? id : `x-${id}`; + return this.collections.find(ext => ext.id() === id); + } +} diff --git a/src/models/v3/external-docs.ts b/src/models/v3/external-docs.ts new file mode 100644 index 000000000..018cf22c4 --- /dev/null +++ b/src/models/v3/external-docs.ts @@ -0,0 +1,30 @@ +import { BaseModel } from '../base'; + +import { hasDescription, description, extensions } from './mixins'; + +import type { ExternalDocumentationInterface } from '../external-docs'; +import type { ExtensionsInterface } from '../extensions'; + +import type { v3 } from '../../spec-types'; + +export class ExternalDocumentation extends BaseModel implements ExternalDocumentationInterface { + id(): string | undefined { + return this._meta.id; + } + + url(): string { + return this._json.url; + } + + hasDescription(): boolean { + return hasDescription(this); + } + + description(): string | undefined { + return description(this); + } + + extensions(): ExtensionsInterface { + return extensions(this); + } +} diff --git a/src/models/v3/index.ts b/src/models/v3/index.ts index 05cd9ec64..fb3848508 100644 --- a/src/models/v3/index.ts +++ b/src/models/v3/index.ts @@ -1 +1,41 @@ -export { AsyncAPIDocument as AsyncAPIDocumentV3 } from './asyncapi'; \ No newline at end of file +export { AsyncAPIDocument as AsyncAPIDocumentV3 } from './asyncapi'; +export { Binding as BindingV3 } from './binding'; +export { Bindings as BindingsV3 } from './bindings'; +export { ChannelParameter as ChannelParameterV3 } from './channel-parameter'; +export { ChannelParameters as ChannelParametersV3 } from './channel-parameters'; +export { Channel as ChannelV3 } from './channel'; +export { Channels as ChannelsV3 } from './channels'; +export { Components as ComponentsV3 } from './components'; +export { Contact as ContactV3 } from './contact'; +export { CorrelationId as CorrelationIdV3 } from './correlation-id'; +export { Extension as ExtensionV3 } from './extension'; +export { Extensions as ExtensionsV3 } from './extensions'; +export { ExternalDocumentation as ExternalDocumentationV3 } from './external-docs'; +export { Info as InfoV3 } from './info'; +export { License as LicenseV3 } from './license'; +export { MessageExample as MessageExampleV3 } from './message-example'; +export { MessageExamples as MessageExamplesV3 } from './message-examples'; +export { MessageTrait as MessageTraitV3 } from './message-trait'; +export { MessageTraits as MessageTraitsV3 } from './message-traits'; +export { Message as MessageV3 } from './message'; +export { Messages as MessagesV3 } from './messages'; +export { OAuthFlow as OAuthFlowV3 } from './oauth-flow'; +export { OAuthFlows as OAuthFlowsV3 } from './oauth-flows'; +export { OperationTrait as OperationTraitV3 } from './operation-trait'; +export { OperationTraits as OperationTraitsV3 } from './operation-traits'; +export { OperationReplies as OperationRepliesV3 } from './operation-replies'; +export { OperationReplyAddress as OperationReplyAddressV3 } from './operation-reply-address'; +export { OperationReplyAddresses as OperationReplyAddressesV3 } from './operation-reply-addresses'; +export { OperationReply as OperationReplyV3 } from './operation-reply'; +export { Operation as OperationV3 } from './operation'; +export { Operations as OperationsV3 } from './operations'; +export { Schema as SchemaV3 } from './schema'; +export { Schemas as SchemasV3 } from './schemas'; +export { SecurityScheme as SecuritySchemeV3 } from './security-scheme'; +export { SecuritySchemes as SecuritySchemesV3 } from './security-schemes'; +export { ServerVariable as ServerVariableV3 } from './server-variable'; +export { ServerVariables as ServerVariablesV3 } from './server-variables'; +export { Server as ServerV3 } from './server'; +export { Servers as ServersV3 } from './servers'; +export { Tag as TagV3 } from './tag'; +export { Tags as TagsV3 } from './tags'; diff --git a/src/models/v3/info.ts b/src/models/v3/info.ts new file mode 100644 index 000000000..1bd5831ea --- /dev/null +++ b/src/models/v3/info.ts @@ -0,0 +1,82 @@ +import { BaseModel } from '../base'; +import { Contact } from './contact'; +import { License } from './license'; + +import { hasDescription, description, extensions, hasExternalDocs, externalDocs, tags } from './mixins'; + +import type { ContactInterface } from '../contact'; +import type { InfoInterface } from '../info'; +import type { ExtensionsInterface } from '../extensions'; +import type { ExternalDocumentationInterface } from '../external-docs'; +import type { LicenseInterface } from '../license'; +import type { TagsInterface } from '../tags'; + +import type { v3 } from '../../spec-types'; + +export class Info extends BaseModel implements InfoInterface { + title(): string { + return this._json.title; + } + + version(): string { + return this._json.version; + } + + hasId(): boolean { + return !!this._meta.asyncapi.parsed.id; + } + + id(): string | undefined { + return this._meta.asyncapi.parsed.id; + } + + hasDescription(): boolean { + return hasDescription(this); + } + + description(): string | undefined { + return description(this); + } + + hasTermsOfService(): boolean { + return !!this._json.termsOfService; + } + + termsOfService(): string | undefined { + return this._json.termsOfService; + } + + hasContact(): boolean { + return Object.keys(this._json.contact || {}).length > 0; + } + + contact(): ContactInterface | undefined { + const contact = this._json.contact; + return contact && this.createModel(Contact, contact, { pointer: this.jsonPath('contact') }); + } + + hasLicense(): boolean { + return Object.keys(this._json.license || {}).length > 0; + } + + license(): LicenseInterface | undefined { + const license = this._json.license; + return license && this.createModel(License, license, { pointer: this.jsonPath('license') }); + } + + hasExternalDocs(): boolean { + return hasExternalDocs(this); + } + + externalDocs(): ExternalDocumentationInterface | undefined { + return externalDocs(this); + } + + tags(): TagsInterface { + return tags(this); + } + + extensions(): ExtensionsInterface { + return extensions(this); + } +} diff --git a/src/models/v3/license.ts b/src/models/v3/license.ts new file mode 100644 index 000000000..8280080fc --- /dev/null +++ b/src/models/v3/license.ts @@ -0,0 +1,26 @@ +import { BaseModel } from '../base'; + +import { extensions } from './mixins'; + +import type { ExtensionsInterface } from '../extensions'; +import type { LicenseInterface } from '../license'; + +import type { v3 } from '../../spec-types'; + +export class License extends BaseModel implements LicenseInterface { + name(): string { + return this._json.name; + } + + hasUrl(): boolean { + return !!this._json.url; + } + + url(): string | undefined { + return this._json.url; + } + + extensions(): ExtensionsInterface { + return extensions(this); + } +} diff --git a/src/models/v3/message-example.ts b/src/models/v3/message-example.ts new file mode 100644 index 000000000..591664cef --- /dev/null +++ b/src/models/v3/message-example.ts @@ -0,0 +1,46 @@ +import { BaseModel } from '../base'; + +import { extensions } from './mixins'; + +import type { ExtensionsInterface } from '../extensions'; +import type { MessageExampleInterface } from '../message-example'; + +import type { v3 } from '../../spec-types'; + +export class MessageExample extends BaseModel implements MessageExampleInterface { + hasName(): boolean { + return !!this._json.name; + } + + name(): string | undefined { + return this._json.name; + } + + hasSummary(): boolean { + return !!this._json.summary; + } + + summary(): string | undefined { + return this._json.summary; + } + + hasHeaders(): boolean { + return !!this._json.headers; + } + + headers(): Record | undefined { + return this._json.headers; + } + + hasPayload(): boolean { + return !!this._json.payload; + } + + payload(): Record | undefined { + return this._json.payload; + } + + extensions(): ExtensionsInterface { + return extensions(this); + } +} diff --git a/src/models/v3/message-examples.ts b/src/models/v3/message-examples.ts new file mode 100644 index 000000000..fa07cfa2f --- /dev/null +++ b/src/models/v3/message-examples.ts @@ -0,0 +1,10 @@ +import { Collection } from '../collection'; + +import type { MessageExamplesInterface } from '../message-examples'; +import type { MessageExampleInterface } from '../message-example'; + +export class MessageExamples extends Collection implements MessageExamplesInterface { + override get(name: string): MessageExampleInterface | undefined { + return this.collections.find(example => example.name() === name); + } +} diff --git a/src/models/v3/message-trait.ts b/src/models/v3/message-trait.ts new file mode 100644 index 000000000..c76126651 --- /dev/null +++ b/src/models/v3/message-trait.ts @@ -0,0 +1,74 @@ +import { CorrelationId } from './correlation-id'; +import { MessageExamples } from './message-examples'; +import { MessageExample } from './message-example'; +import { Schema } from './schema'; + +import { xParserMessageName } from '../../constants'; +import { CoreModel } from './mixins'; + +import type { CorrelationIdInterface } from '../correlation-id'; +import type { MessageExamplesInterface } from '../message-examples'; +import type { MessageTraitInterface } from '../message-trait'; +import type { SchemaInterface } from '../schema'; + +import type { v3 } from '../../spec-types'; + +export class MessageTrait extends CoreModel implements MessageTraitInterface { + id(): string { + return this._meta.id || this.extensions().get(xParserMessageName)?.value() as string; + } + + hasMessageId(): boolean { + return false; + } + + hasSchemaFormat(): boolean { + return false; + } + + schemaFormat(): string | undefined { + return undefined; + } + + hasCorrelationId(): boolean { + return !!this._json.correlationId; + } + + correlationId(): CorrelationIdInterface | undefined { + if (!this._json.correlationId) return undefined; + return this.createModel(CorrelationId, this._json.correlationId as v3.CorrelationIDObject, { pointer: this.jsonPath('correlationId') }); + } + + hasContentType(): boolean { + return !!this._json.contentType; + } + + contentType(): string | undefined { + return this._json.contentType || this._meta.asyncapi?.parsed?.defaultContentType; + } + + hasHeaders(): boolean { + return !!this._json.headers; + } + + headers(): SchemaInterface | undefined { + if (!this._json.headers) return undefined; + return this.createModel(Schema, this._json.headers, { pointer: this.jsonPath('headers') }); + } + + hasName(): boolean { + return !!this._json.name; + } + + name(): string | undefined { + return this._json.name; + } + + examples(): MessageExamplesInterface { + return new MessageExamples( + (this._json.examples || []).map((example: any, index: number) => { + return this.createModel(MessageExample, example, { pointer: this.jsonPath(`examples/${index}`) }); + }) + ); + } +} diff --git a/src/models/v3/message-traits.ts b/src/models/v3/message-traits.ts new file mode 100644 index 000000000..3d8dadddb --- /dev/null +++ b/src/models/v3/message-traits.ts @@ -0,0 +1,10 @@ +import { Collection } from '../collection'; + +import type { MessageTraitsInterface } from '../message-traits'; +import type { MessageTraitInterface } from '../message-trait'; + +export class MessageTraits extends Collection implements MessageTraitsInterface { + override get(id: string): MessageTraitInterface | undefined { + return this.collections.find(trait => trait.id() === id); + } +} diff --git a/src/models/v3/message.ts b/src/models/v3/message.ts new file mode 100644 index 000000000..3fe3f05e8 --- /dev/null +++ b/src/models/v3/message.ts @@ -0,0 +1,111 @@ +import { Channel } from './channel'; +import { Channels } from './channels'; +import { Operations } from './operations'; +import { Operation } from './operation'; +import { MessageTraits } from './message-traits'; +import { MessageTrait } from './message-trait'; +import { Servers } from './servers'; +import { Schema } from './schema'; +import { xParserObjectUniqueId } from '../../constants'; +import type { ChannelsInterface } from '../channels'; +import type { ChannelInterface } from '../channel'; +import type { MessageInterface } from '../message'; +import type { MessageTraitsInterface } from '../message-traits'; +import type { OperationsInterface } from '../operations'; +import type { OperationInterface } from '../operation'; +import type { ServersInterface } from '../servers'; +import type { ServerInterface } from '../server'; +import type { SchemaInterface } from '../schema'; +import type { v3 } from '../../spec-types'; + +export class Message extends MessageTrait implements MessageInterface { + hasPayload(): boolean { + return !!this._json.payload; + } + + payload(): SchemaInterface | undefined { + if (!this._json.payload) return undefined; + return this.createModel(Schema, this._json.payload, { pointer: this.jsonPath('payload')}); + } + + hasSchemaFormat(): boolean { + // If it has a payload, schema format is expected (at least the default) + return this.hasPayload(); + } + + schemaFormat(): string | undefined { + if (this.hasSchemaFormat()) { + return this.payload()?.schemaFormat(); + } + + return undefined; + } + + servers(): ServersInterface { + const servers: ServerInterface[] = []; + const serversData: any[] = []; + this.channels().forEach(channel => { + channel.servers().forEach(server => { + const serverData = server.json(); + if (!serversData.includes(serverData)) { + serversData.push(serverData); + servers.push(server); + } + }); + }); + return new Servers(servers); + } + + channels(): ChannelsInterface { + const thisMessageId = (this._json)[xParserObjectUniqueId]; + const channels: ChannelInterface[] = []; + const channelsData: any[] = []; + this.operations().forEach(operation => { + operation.channels().forEach(channel => { + const channelData = channel.json(); + // Comparing with the data (JSON) because same channel could exist but it will include the ID based on where it is declared. For example, asyncapi.channels contain ID field. + if (!channelsData.includes(channelData)) { + channelsData.push(channelData); + channels.push(channel); + } + }); + }); + + Object.entries((this._meta.asyncapi?.parsed as v3.AsyncAPIObject)?.channels || {}).forEach(([channelId, channelData]) => { + const channelModel = this.createModel(Channel, channelData as v3.ChannelObject, { id: channelId, pointer: `/channels/${channelId}` }); + if (!channelsData.includes(channelData) && channelModel.messages().some(m => { + const messageId = (m as any)[xParserObjectUniqueId]; + return messageId === thisMessageId; + })) { + channelsData.push(channelData); + channels.push(channelModel); + } + }); + + return new Channels(channels); + } + + operations(): OperationsInterface { + const thisMessageId = (this._json)[xParserObjectUniqueId]; + const operations: OperationInterface[] = []; + Object.entries((this._meta.asyncapi?.parsed as v3.AsyncAPIObject)?.operations || {}).forEach(([operationId, operation]) => { + const operationModel = this.createModel(Operation, operation as v3.OperationObject, { id: operationId, pointer: `/operations/${operationId}` }); + const operationHasMessage = operationModel.messages().some(m => { + const messageId = (m as any)[xParserObjectUniqueId]; + return messageId === thisMessageId; + }); + if (operationHasMessage) { + operations.push(operationModel); + } + }); + return new Operations(operations); + } + + traits(): MessageTraitsInterface { + return new MessageTraits( + (this._json.traits || []).map((trait: any, index: number) => { + return this.createModel(MessageTrait, trait, { id: '', pointer: this.jsonPath(`traits/${index}`) }); + }) + ); + } +} diff --git a/src/models/v3/messages.ts b/src/models/v3/messages.ts new file mode 100644 index 000000000..591c0d7ac --- /dev/null +++ b/src/models/v3/messages.ts @@ -0,0 +1,18 @@ +import { Collection } from '../collection'; + +import type { MessagesInterface } from '../messages'; +import type { MessageInterface } from '../message'; + +export class Messages extends Collection implements MessagesInterface { + override get(name: string): MessageInterface | undefined { + return this.collections.find(message => message.id() === name); + } + + filterBySend(): MessageInterface[] { + return this.filterBy(message => message.operations().filterBySend().length > 0); + } + + filterByReceive(): MessageInterface[] { + return this.filterBy(message => message.operations().filterByReceive().length > 0); + } +} diff --git a/src/models/v3/mixins.ts b/src/models/v3/mixins.ts new file mode 100644 index 000000000..9191b4008 --- /dev/null +++ b/src/models/v3/mixins.ts @@ -0,0 +1,129 @@ +import { BaseModel } from '../base'; +import { Bindings } from './bindings'; +import { Binding } from './binding'; +import { Extensions } from './extensions'; +import { Extension } from './extension'; +import { ExternalDocumentation } from './external-docs'; +import { Tags } from './tags'; +import { Tag } from './tag'; + +import { createModel } from '../utils'; +import { EXTENSION_REGEX } from '../../constants'; + +import type { BindingsInterface } from '../bindings'; +import type { ExtensionsInterface } from '../extensions'; +import type { ExtensionInterface } from '../extension'; +import type { ExternalDocumentationInterface } from '../external-docs'; +import type { TagsInterface } from '../tags'; + +import type { v3 } from '../../spec-types'; + +type BindingsObject = + | v3.ServerBindingsObject + | v3.ChannelBindingsObject + | v3.OperationBindingsObject + | v3.MessageBindingsObject + | v3.ReferenceObject; + +export interface CoreObject extends v3.SpecificationExtensions { + title?: string; + summary?: string; + description?: string; + externalDocs?: v3.ExternalDocumentationObject | v3.ReferenceObject; + tags?: v3.TagsObject; + bindings?: BindingsObject; +} + +export abstract class CoreModel = {}> extends BaseModel { + hasTitle(): boolean { + return !!this._json.title; + } + + title(): string | undefined { + return this._json.title; + } + + hasSummary(): boolean { + return !!this._json.summary; + } + + summary(): string | undefined { + return this._json.summary; + } + + hasDescription(): boolean { + return hasDescription(this); + } + + description(): string | undefined { + return description(this); + } + + hasExternalDocs(): boolean { + return hasExternalDocs(this); + } + + externalDocs(): ExternalDocumentationInterface | undefined { + return externalDocs(this); + } + + tags(): TagsInterface { + return tags(this); + } + + bindings(): BindingsInterface { + return bindings(this); + } + + extensions(): ExtensionsInterface { + return extensions(this); + } +} + +export function bindings(model: BaseModel<{ bindings?: BindingsObject }>): BindingsInterface { + const bindings = model.json('bindings') || {}; + return new Bindings( + Object.entries(bindings || {}).map(([protocol, binding]) => + createModel(Binding, binding, { protocol, pointer: model.jsonPath(`bindings/${protocol}`) }, model) + ), + { originalData: bindings as Record, asyncapi: model.meta('asyncapi'), pointer: model.jsonPath('bindings') } + ); +} + +export function hasDescription(model: BaseModel<{ description?: string }>) { + return Boolean(description(model)); +} + +export function description(model: BaseModel<{ description?: string }>): string | undefined { + return model.json('description'); +} + +export function extensions(model: BaseModel): ExtensionsInterface { + const extensions: ExtensionInterface[] = []; + Object.entries(model.json()).forEach(([id, value]: [string, any]) => { + if (EXTENSION_REGEX.test(id)) { + extensions.push( + createModel(Extension, value, { id, pointer: model.jsonPath(id) } as any, model) as Extension + ); + } + }); + return new Extensions(extensions); +} + +export function hasExternalDocs(model: BaseModel<{ externalDocs?: v3.ExternalDocumentationObject | v3.ReferenceObject }>): boolean { + return Object.keys(model.json('externalDocs') || {}).length > 0; +} + +export function externalDocs(model: BaseModel<{ externalDocs?: v3.ExternalDocumentationObject | v3.ReferenceObject }>): ExternalDocumentationInterface | undefined { + if (hasExternalDocs(model as BaseModel<{ externalDocs?: v3.ExternalDocumentationObject }>)) { + return new ExternalDocumentation(model.json('externalDocs') as v3.ExternalDocumentationObject); + } +} + +export function tags(model: BaseModel<{ tags?: v3.TagsObject }>): TagsInterface { + return new Tags( + (model.json('tags') || []).map((tag, idx) => + createModel(Tag, tag as v3.TagObject, { pointer: model.jsonPath(`tags/${idx}`) }, model) + ) + ); +} diff --git a/src/models/v3/oauth-flow.ts b/src/models/v3/oauth-flow.ts new file mode 100644 index 000000000..8f767a582 --- /dev/null +++ b/src/models/v3/oauth-flow.ts @@ -0,0 +1,42 @@ +import { BaseModel } from '../base'; + +import { extensions } from './mixins'; + +import type { ExtensionsInterface } from '../extensions'; +import type { OAuthFlowInterface } from '../oauth-flow'; + +import type { v3 } from '../../spec-types'; + +export class OAuthFlow extends BaseModel implements OAuthFlowInterface { + hasAuthorizationUrl(): boolean { + return !!this.json().authorizationUrl; + } + + authorizationUrl(): string | undefined { + return this.json().authorizationUrl; + } + + hasRefreshUrl(): boolean { + return !!this._json.refreshUrl; + } + + refreshUrl(): string | undefined { + return this._json.refreshUrl; + } + + scopes(): Record | undefined { + return this._json.availableScopes; + } + + hasTokenUrl(): boolean { + return !!this.json>().tokenUrl; + } + + tokenUrl(): string | undefined { + return this.json>().tokenUrl; + } + + extensions(): ExtensionsInterface { + return extensions(this); + } +} diff --git a/src/models/v3/oauth-flows.ts b/src/models/v3/oauth-flows.ts new file mode 100644 index 000000000..39ff0de3a --- /dev/null +++ b/src/models/v3/oauth-flows.ts @@ -0,0 +1,52 @@ +import { BaseModel } from '../base'; +import { OAuthFlow } from './oauth-flow'; + +import { extensions } from './mixins'; + +import type { ExtensionsInterface } from '../extensions'; +import type { OAuthFlowsInterface } from '../oauth-flows'; +import type { OAuthFlowInterface } from '../oauth-flow'; + +import type { v3 } from '../../spec-types'; + +export class OAuthFlows extends BaseModel implements OAuthFlowsInterface { + hasAuthorizationCode(): boolean { + return !!this._json.authorizationCode; + } + + authorizationCode(): OAuthFlowInterface | undefined { + if (!this._json.authorizationCode) return undefined; + return new OAuthFlow(this._json.authorizationCode); + } + + hasClientCredentials(): boolean { + return !!this._json.clientCredentials; + } + + clientCredentials(): OAuthFlowInterface | undefined { + if (!this._json.clientCredentials) return undefined; + return new OAuthFlow(this._json.clientCredentials); + } + + hasImplicit(): boolean { + return !!this._json.implicit; + } + + implicit(): OAuthFlowInterface | undefined { + if (!this._json.implicit) return undefined; + return new OAuthFlow(this._json.implicit); + } + + hasPassword(): boolean { + return !!this._json.password; + } + + password(): OAuthFlowInterface | undefined { + if (!this._json.password) return undefined; + return new OAuthFlow(this._json.password); + } + + extensions(): ExtensionsInterface { + return extensions(this); + } +} \ No newline at end of file diff --git a/src/models/v3/operation-replies.ts b/src/models/v3/operation-replies.ts new file mode 100644 index 000000000..f1b3e2892 --- /dev/null +++ b/src/models/v3/operation-replies.ts @@ -0,0 +1,10 @@ +import { Collection } from '../collection'; + +import type { OperationReplyInterface } from '../operation-reply'; +import type { OperationRepliesInterface } from '../operation-replies'; + +export class OperationReplies extends Collection implements OperationRepliesInterface { + override get(id: string): OperationReplyInterface | undefined { + return this.collections.find(reply => reply.id() === id); + } +} diff --git a/src/models/v3/operation-reply-address.ts b/src/models/v3/operation-reply-address.ts new file mode 100644 index 000000000..8e989a3ad --- /dev/null +++ b/src/models/v3/operation-reply-address.ts @@ -0,0 +1,30 @@ +import { BaseModel } from '../base'; + +import { hasDescription, description, extensions } from './mixins'; + +import type { ExtensionsInterface } from '../extensions'; +import type { OperationReplyAddressInterface } from '../operation-reply-address'; + +import type { v3 } from '../../spec-types'; + +export class OperationReplyAddress extends BaseModel implements OperationReplyAddressInterface { + id(): string | undefined { + return this._meta.id; + } + + location(): string { + return this._json.location; + } + + hasDescription(): boolean { + return hasDescription(this); + } + + description(): string | undefined { + return description(this); + } + + extensions(): ExtensionsInterface { + return extensions(this); + } +} diff --git a/src/models/v3/operation-reply-addresses.ts b/src/models/v3/operation-reply-addresses.ts new file mode 100644 index 000000000..86f30288c --- /dev/null +++ b/src/models/v3/operation-reply-addresses.ts @@ -0,0 +1,10 @@ +import { Collection } from '../collection'; + +import type { OperationReplyAddressInterface } from '../operation-reply-address'; +import type { OperationReplyAddressesInterface } from '../operation-reply-addresses'; + +export class OperationReplyAddresses extends Collection implements OperationReplyAddressesInterface { + override get(id: string): OperationReplyAddressInterface | undefined { + return this.collections.find(reply => reply.id() === id); + } +} diff --git a/src/models/v3/operation-reply.ts b/src/models/v3/operation-reply.ts new file mode 100644 index 000000000..ec6f9d4b8 --- /dev/null +++ b/src/models/v3/operation-reply.ts @@ -0,0 +1,54 @@ +import { BaseModel } from '../base'; +import { Channel } from './channel'; +import { Message } from './message'; +import { Messages } from './messages'; +import { MessagesInterface } from '../messages'; +import { OperationReplyAddress } from './operation-reply-address'; +import { extensions } from './mixins'; +import { xParserObjectUniqueId } from '../../constants'; +import type { ExtensionsInterface } from '../extensions'; +import type { OperationReplyInterface } from '../operation-reply'; +import type { OperationReplyAddressInterface } from '../operation-reply-address'; +import type { ChannelInterface } from '../channel'; +import type { v3 } from '../../spec-types'; + +export class OperationReply extends BaseModel implements OperationReplyInterface { + id(): string | undefined { + return this._meta.id; + } + + hasAddress(): boolean { + return !!this._json.address; + } + + address(): OperationReplyAddressInterface | undefined { + if (this._json.address) { + return this.createModel(OperationReplyAddress, this._json.address as v3.OperationReplyAddressObject, { pointer: this.jsonPath('address') }); + } + } + + hasChannel(): boolean { + return !!this._json.channel; + } + + channel(): ChannelInterface | undefined { + if (this._json.channel) { + const channelId = (this._json.channel as any)[xParserObjectUniqueId]; + return this.createModel(Channel, this._json.channel as v3.ChannelObject, { id: channelId, pointer: this.jsonPath('channel') }); + } + return this._json.channel; + } + + messages(): MessagesInterface { + return new Messages( + Object.values(this._json.messages ?? {}).map((message) => { + const messageId = (message as any)[xParserObjectUniqueId]; + return this.createModel(Message, message as v3.MessageObject, { id: messageId, pointer: this.jsonPath(`messages/${messageId}`) }); + }) + ); + } + + extensions(): ExtensionsInterface { + return extensions(this); + } +} diff --git a/src/models/v3/operation-trait.ts b/src/models/v3/operation-trait.ts new file mode 100644 index 000000000..dcc7dff0b --- /dev/null +++ b/src/models/v3/operation-trait.ts @@ -0,0 +1,31 @@ +import { SecurityScheme } from './security-scheme'; +import { SecurityRequirements } from './security-requirements'; +import { SecurityRequirement } from './security-requirement'; + +import { CoreModel } from './mixins'; + +import type { OperationTraitInterface } from '../operation-trait'; + +import type { v3 } from '../../spec-types'; + +export class OperationTrait extends CoreModel implements OperationTraitInterface { + id(): string | undefined { + return this.operationId() || this._meta.id; + } + + hasOperationId(): boolean { + return !!this._meta.id; + } + + operationId(): string | undefined { + return this._meta.id; + } + + security(): SecurityRequirements[] { + return (this._json.security || []).map((security, index) => { + const scheme = this.createModel(SecurityScheme, security as v3.SecuritySchemeObject, { id: '', pointer: this.jsonPath(`security/${index}`) }); + const requirement = this.createModel(SecurityRequirement, { scheme, scopes: (security as v3.SecuritySchemeObject).scopes }, { id: '', pointer: this.jsonPath(`security/${index}`) }); + return new SecurityRequirements([requirement]); + }); + } +} diff --git a/src/models/v3/operation-traits.ts b/src/models/v3/operation-traits.ts new file mode 100644 index 000000000..32cae7902 --- /dev/null +++ b/src/models/v3/operation-traits.ts @@ -0,0 +1,10 @@ +import { Collection } from '../collection'; + +import type { OperationTraitsInterface } from '../operation-traits'; +import type { OperationTraitInterface } from '../operation-trait'; + +export class OperationTraits extends Collection implements OperationTraitsInterface { + override get(id: string): OperationTraitInterface | undefined { + return this.collections.find(trait => trait.id() === id); + } +} diff --git a/src/models/v3/operation.ts b/src/models/v3/operation.ts new file mode 100644 index 000000000..f18753134 --- /dev/null +++ b/src/models/v3/operation.ts @@ -0,0 +1,95 @@ +import { Messages } from './messages'; +import { Message } from './message'; +import { Channels } from './channels'; +import { Channel } from './channel'; +import { OperationTraits } from './operation-traits'; +import { OperationTrait } from './operation-trait'; +import { OperationReply } from './operation-reply'; +import { Servers } from './servers'; + +import type { ChannelsInterface } from '../channels'; +import type { MessagesInterface } from '../messages'; +import type { MessageInterface } from '../message'; +import type { OperationInterface, OperationAction } from '../operation'; +import type { OperationReplyInterface } from '../operation-reply'; +import type { OperationTraitsInterface } from '../operation-traits'; +import type { ServersInterface } from '../servers'; +import type { ServerInterface } from '../server'; + +import type { v3 } from '../../spec-types'; +import { xParserObjectUniqueId } from '../../constants'; + +export class Operation extends OperationTrait implements OperationInterface { + action(): OperationAction { + return this._json.action; + } + + isSend(): boolean { + return this.action() === 'send'; + } + + isReceive(): boolean { + return this.action() === 'receive'; + } + + servers(): ServersInterface { + const servers: ServerInterface[] = []; + const serversData: any[] = []; + this.channels().forEach(channel => { + channel.servers().forEach(server => { + const serverData = server.json(); + if (!serversData.includes(serverData)) { + serversData.push(serverData); + servers.push(server); + } + }); + }); + return new Servers(servers); + } + + channels(): ChannelsInterface { + if (this._json.channel) { + const operationChannelId = (this._json.channel as any)[xParserObjectUniqueId]; + return new Channels([ + this.createModel(Channel, this._json.channel as v3.ChannelObject, { id: operationChannelId, pointer: `/channels/${operationChannelId}` }) + ]); + } + return new Channels([]); + } + + messages(): MessagesInterface { + const messages: MessageInterface[] = []; + if (Array.isArray(this._json.messages)) { + this._json.messages.forEach((message, index) => { + const messageId = (message as any)[xParserObjectUniqueId]; + messages.push( + this.createModel(Message, message as v3.MessageObject, { id: messageId, pointer: this.jsonPath(`messages/${index}`) }) + ); + }); + return new Messages(messages); + } + + this.channels().forEach(channel => { + messages.push(...channel.messages()); + }); + return new Messages(messages); + } + + hasReply(): boolean { + return !!this._json.reply; + } + + reply(): OperationReplyInterface | undefined { + if (this._json.reply) { + return this.createModel(OperationReply, this._json.reply as v3.OperationReplyObject, { pointer: this.jsonPath('reply') }); + } + } + + traits(): OperationTraitsInterface { + return new OperationTraits( + (this._json.traits || []).map((trait: any, index: number) => { + return this.createModel(OperationTrait, trait, { id: '', pointer: this.jsonPath(`traits/${index}`) }); + }) + ); + } +} diff --git a/src/models/v3/operations.ts b/src/models/v3/operations.ts new file mode 100644 index 000000000..f61b8c11c --- /dev/null +++ b/src/models/v3/operations.ts @@ -0,0 +1,18 @@ +import { Collection } from '../collection'; + +import type { OperationsInterface } from '../operations'; +import type { OperationInterface } from '../operation'; + +export class Operations extends Collection implements OperationsInterface { + override get(id: string): OperationInterface | undefined { + return this.collections.find(operation => operation.id() === id); + } + + filterBySend(): OperationInterface[] { + return this.filterBy(operation => operation.isSend()); + } + + filterByReceive(): OperationInterface[] { + return this.filterBy(operation => operation.isReceive()); + } +} diff --git a/src/models/v3/schema.ts b/src/models/v3/schema.ts new file mode 100644 index 000000000..40e3d533e --- /dev/null +++ b/src/models/v3/schema.ts @@ -0,0 +1,329 @@ +import { BaseModel, ModelMetadata } from '../base'; + +import { xParserSchemaId } from '../../constants'; +import { extensions, hasExternalDocs, externalDocs } from './mixins'; +import { getDefaultSchemaFormat } from '../../schema-parser'; +import { AsyncAPISchemaObject } from 'spec-types/v3'; + +import type { ExtensionsInterface } from '../extensions'; +import type { ExternalDocumentationInterface } from '../external-docs'; +import type { SchemaInterface } from '../schema'; + +import type { v3 } from '../../spec-types'; + +export class Schema extends BaseModel implements SchemaInterface { + private _schemaFormat: string; + private _schemaObject: AsyncAPISchemaObject; + + // The following constructor is needed because, starting from AsyncAPI v3, schemas can be multi-format as well. + constructor( + protected readonly _json: v3.MultiFormatSchemaObject, + protected readonly _meta: ModelMetadata & { id?: string, parent?: Schema } = {} as ModelMetadata & { id?: string, parent?: Schema }, + ) { + super(_json, _meta); + + // Based on the shape of the JSON, we grab the data for the Schema from the root (Schema) or rather from `schema` field (MultiFormatSchema). + if (typeof _json === 'object' && typeof _json.schema === 'object') { + this._schemaObject = _json.schema; + this._schemaFormat = _json.schemaFormat; + } else { + this._schemaObject = _json; + this._schemaFormat = getDefaultSchemaFormat(_meta.asyncapi?.semver?.version); + } + } + id(): string { + return this.$id() || this._meta.id || (this._schemaObject as any)[xParserSchemaId] as string; + } + + $comment(): string | undefined { + if (typeof this._schemaObject === 'boolean') return; + return this._schemaObject.$comment; + } + + $id(): string | undefined { + if (typeof this._schemaObject === 'boolean') return; + return this._schemaObject.$id; + } + + $schema(): string { + if (typeof this._schemaObject === 'boolean') return 'http://json-schema.org/draft-07/schema#'; + return this._schemaObject.$schema ?? 'http://json-schema.org/draft-07/schema#'; + } + + additionalItems(): boolean | SchemaInterface { + if (typeof this._schemaObject === 'boolean') return this._schemaObject; + if (this._schemaObject.additionalItems === undefined) return true; + if (typeof this._schemaObject.additionalItems === 'boolean') return this._schemaObject.additionalItems; + return this.createModel(Schema, this._schemaObject.additionalItems, { pointer: `${this._meta.pointer}/additionalItems`, parent: this }); + } + + additionalProperties(): boolean | SchemaInterface { + if (typeof this._schemaObject === 'boolean') return this._schemaObject; + if (this._schemaObject.additionalProperties === undefined) return true; + if (typeof this._schemaObject.additionalProperties === 'boolean') return this._schemaObject.additionalProperties; + return this.createModel(Schema, this._schemaObject.additionalProperties, { pointer: `${this._meta.pointer}/additionalProperties`, parent: this }); + } + + allOf(): Array | undefined { + if (typeof this._schemaObject === 'boolean') return; + if (!Array.isArray(this._schemaObject.allOf)) return undefined; + return this._schemaObject.allOf.map((s, index) => this.createModel(Schema, s, { pointer: `${this._meta.pointer}/allOf/${index}`, parent: this })); + } + + anyOf(): Array | undefined { + if (typeof this._schemaObject === 'boolean') return; + if (!Array.isArray(this._schemaObject.anyOf)) return undefined; + return this._schemaObject.anyOf.map((s, index) => this.createModel(Schema, s, { pointer: `${this._meta.pointer}/anyOf/${index}`, parent: this })); + } + + const(): any { + if (typeof this._schemaObject === 'boolean') return; + return this._schemaObject.const; + } + + contains(): SchemaInterface | undefined { + if (typeof this._schemaObject === 'boolean' || typeof this._schemaObject.contains !== 'object') return; + return this.createModel(Schema, this._schemaObject.contains, { pointer: `${this._meta.pointer}/contains`, parent: this }); + } + + contentEncoding(): string | undefined { + if (typeof this._schemaObject === 'boolean') return; + return this._schemaObject.contentEncoding; + } + + contentMediaType(): string | undefined { + if (typeof this._schemaObject === 'boolean') return; + return this._schemaObject.contentMediaType; + } + + default(): any { + if (typeof this._schemaObject === 'boolean') return; + return this._schemaObject.default; + } + + definitions(): Record | undefined { + if (typeof this._schemaObject === 'boolean' || typeof this._schemaObject.definitions !== 'object') return; + return Object.entries(this._schemaObject.definitions).reduce((acc: Record, [key, s]: [string, any]) => { + acc[key] = this.createModel(Schema, s, { pointer: `${this._meta.pointer}/definitions/${key}`, parent: this }); + return acc; + }, {}); + } + + description(): string | undefined { + if (typeof this._schemaObject === 'boolean') return; + return this._schemaObject.description; + } + + dependencies(): Record> | undefined { + if (typeof this._schemaObject === 'boolean') return; + if (typeof this._schemaObject.dependencies !== 'object') return undefined; + return Object.entries(this._schemaObject.dependencies).reduce((acc: Record>, [key, s]: [string, any]) => { + acc[key] = Array.isArray(s) ? s : this.createModel(Schema, s, { pointer: `${this._meta.pointer}/dependencies/${key}`, parent: this }); + return acc; + }, {}); + } + + deprecated(): boolean { + if (typeof this._schemaObject === 'boolean') return false; + return this._schemaObject.deprecated || false; + } + + discriminator(): string | undefined { + if (typeof this._schemaObject === 'boolean') return; + return this._schemaObject.discriminator; + } + + else(): SchemaInterface | undefined { + if (typeof this._schemaObject === 'boolean' || typeof this._schemaObject.else !== 'object') return; + return this.createModel(Schema, this._schemaObject.else, { pointer: `${this._meta.pointer}/else`, parent: this }); + } + + enum(): Array | undefined { + if (typeof this._schemaObject === 'boolean') return; + return this._schemaObject.enum; + } + + examples(): Array | undefined { + if (typeof this._schemaObject === 'boolean') return; + return this._schemaObject.examples; + } + + exclusiveMaximum(): number | undefined { + if (typeof this._schemaObject === 'boolean') return; + return this._schemaObject.exclusiveMaximum; + } + + exclusiveMinimum(): number | undefined { + if (typeof this._schemaObject === 'boolean') return; + return this._schemaObject.exclusiveMinimum; + } + + format(): string | undefined { + if (typeof this._schemaObject === 'boolean') return; + return this._schemaObject.format; + } + + isBooleanSchema(): boolean { + return typeof this._schemaObject === 'boolean'; + } + + if(): SchemaInterface | undefined { + if (typeof this._schemaObject === 'boolean' || typeof this._schemaObject.if !== 'object') return; + return this.createModel(Schema, this._schemaObject.if, { pointer: `${this._meta.pointer}/if`, parent: this }); + } + + isCircular(): boolean { + let parent = this._meta.parent; + while (parent) { + if (parent._json === this._schemaObject) return true; + parent = parent._meta.parent; + } + return false; + } + + items(): SchemaInterface | Array | undefined { + if (typeof this._schemaObject === 'boolean' || typeof this._schemaObject.items !== 'object') return; + if (Array.isArray(this._schemaObject.items)) { + return this._schemaObject.items.map((s, index) => this.createModel(Schema, s, { pointer: `${this._meta.pointer}/items/${index}`, parent: this })); + } + return this.createModel(Schema, this._schemaObject.items, { pointer: `${this._meta.pointer}/items`, parent: this }); + } + + maximum(): number | undefined { + if (typeof this._schemaObject === 'boolean') return; + return this._schemaObject.maximum; + } + + maxItems(): number | undefined { + if (typeof this._schemaObject === 'boolean') return; + return this._schemaObject.maxItems; + } + + maxLength(): number | undefined { + if (typeof this._schemaObject === 'boolean') return; + return this._schemaObject.maxLength; + } + + maxProperties(): number | undefined { + if (typeof this._schemaObject === 'boolean') return; + return this._schemaObject.maxProperties; + } + + minimum(): number | undefined { + if (typeof this._schemaObject === 'boolean') return; + return this._schemaObject.minimum; + } + + minItems(): number | undefined { + if (typeof this._schemaObject === 'boolean') return; + return this._schemaObject.minItems; + } + + minLength(): number | undefined { + if (typeof this._schemaObject === 'boolean') return; + return this._schemaObject.minLength; + } + + minProperties(): number | undefined { + if (typeof this._schemaObject === 'boolean') return; + return this._schemaObject.minProperties; + } + + multipleOf(): number | undefined { + if (typeof this._schemaObject === 'boolean') return; + return this._schemaObject.multipleOf; + } + + not(): SchemaInterface | undefined { + if (typeof this._schemaObject === 'boolean' || typeof this._schemaObject.not !== 'object') return; + return this.createModel(Schema, this._schemaObject.not, { pointer: `${this._meta.pointer}/not`, parent: this }); + } + + oneOf(): Array | undefined { + if (typeof this._schemaObject === 'boolean') return; + if (!Array.isArray(this._schemaObject.oneOf)) return undefined; + return this._schemaObject.oneOf.map((s, index) => this.createModel(Schema, s, { pointer: `${this._meta.pointer}/oneOf/${index}`, parent: this })); + } + + pattern(): string | undefined { + if (typeof this._schemaObject === 'boolean') return; + return this._schemaObject.pattern; + } + + patternProperties(): Record | undefined { + if (typeof this._schemaObject === 'boolean' || typeof this._schemaObject.patternProperties !== 'object') return; + return Object.entries(this._schemaObject.patternProperties).reduce((acc: Record, [key, s]: [string, any]) => { + acc[key] = this.createModel(Schema, s, { pointer: `${this._meta.pointer}/patternProperties/${key}`, parent: this }); + return acc; + }, {}); + } + + properties(): Record | undefined { + if (typeof this._schemaObject === 'boolean' || typeof this._schemaObject.properties !== 'object') return; + return Object.entries(this._schemaObject.properties).reduce((acc: Record, [key, s]: [string, any]) => { + acc[key] = this.createModel(Schema, s, { pointer: `${this._meta.pointer}/properties/${key}`, parent: this }); + return acc; + }, {}); + } + + property(name: string): SchemaInterface | undefined { + if (typeof this._schemaObject === 'boolean' || typeof this._schemaObject.properties !== 'object' || typeof this._schemaObject.properties[name] !== 'object') return; + return this.createModel(Schema, this._schemaObject.properties[name], { pointer: `${this._meta.pointer}/properties/${name}`, parent: this }); + } + + propertyNames(): SchemaInterface | undefined { + if (typeof this._schemaObject === 'boolean' || typeof this._schemaObject.propertyNames !== 'object') return; + return this.createModel(Schema, this._schemaObject.propertyNames, { pointer: `${this._meta.pointer}/propertyNames`, parent: this }); + } + + readOnly(): boolean | undefined { + if (typeof this._schemaObject === 'boolean') return false; + return this._schemaObject.readOnly || false; + } + + required(): Array | undefined { + if (typeof this._schemaObject === 'boolean') return; + return this._schemaObject.required; + } + + schemaFormat(): string { + return this._schemaFormat; + } + + then(): SchemaInterface | undefined { + if (typeof this._schemaObject === 'boolean' || typeof this._schemaObject.then !== 'object') return; + return this.createModel(Schema, this._schemaObject.then, { pointer: `${this._meta.pointer}/then`, parent: this }); + } + + title(): string | undefined { + if (typeof this._schemaObject === 'boolean') return; + return this._schemaObject.title; + } + + type(): string | Array | undefined { + if (typeof this._schemaObject === 'boolean') return; + return this._schemaObject.type; + } + + uniqueItems(): boolean | undefined { + if (typeof this._schemaObject === 'boolean') return false; + return this._schemaObject.uniqueItems || false; + } + + writeOnly(): boolean | undefined { + if (typeof this._schemaObject === 'boolean') return false; + return this._schemaObject.writeOnly || false; + } + + hasExternalDocs(): boolean { + return hasExternalDocs(this as BaseModel); + } + + externalDocs(): ExternalDocumentationInterface | undefined { + return externalDocs(this as BaseModel); + } + + extensions(): ExtensionsInterface { + return extensions(this as BaseModel); + } +} diff --git a/src/models/v3/schemas.ts b/src/models/v3/schemas.ts new file mode 100644 index 000000000..8ebf7ea08 --- /dev/null +++ b/src/models/v3/schemas.ts @@ -0,0 +1,10 @@ +import { Collection } from '../collection'; + +import type { SchemasInterface } from '../schemas'; +import type { SchemaInterface } from '../schema'; + +export class Schemas extends Collection implements SchemasInterface { + override get(id: string): SchemaInterface | undefined { + return this.collections.find(schema => schema.id() === id); + } +} diff --git a/src/models/v3/security-requirement.ts b/src/models/v3/security-requirement.ts new file mode 100644 index 000000000..fdab68df1 --- /dev/null +++ b/src/models/v3/security-requirement.ts @@ -0,0 +1,14 @@ +import { BaseModel } from '../base'; + +import type { SecuritySchemeInterface } from '../security-scheme'; +import type { SecurityRequirementInterface } from '../security-requirement'; + +export class SecurityRequirement extends BaseModel<{ scopes?: string[], scheme: SecuritySchemeInterface }, { id?: string }> implements SecurityRequirementInterface { + scheme(): SecuritySchemeInterface { + return this._json.scheme; + } + + scopes(): string[] { + return this._json.scopes || []; + } +} \ No newline at end of file diff --git a/src/models/v3/security-requirements.ts b/src/models/v3/security-requirements.ts new file mode 100644 index 000000000..5fcf7dd30 --- /dev/null +++ b/src/models/v3/security-requirements.ts @@ -0,0 +1,10 @@ +import { Collection } from '../collection'; + +import type { SecurityRequirementsInterface } from '../security-requirements'; +import type { SecurityRequirementInterface } from '../security-requirement'; + +export class SecurityRequirements extends Collection implements SecurityRequirementsInterface { + override get(id: string): SecurityRequirementInterface | undefined { + return this.collections.find(securityRequirement => securityRequirement.meta('id' as any) === id); + } +} diff --git a/src/models/v3/security-scheme.ts b/src/models/v3/security-scheme.ts new file mode 100644 index 000000000..e1cf4ccf0 --- /dev/null +++ b/src/models/v3/security-scheme.ts @@ -0,0 +1,81 @@ +import { BaseModel } from '../base'; +import { OAuthFlows } from './oauth-flows'; + +import { hasDescription, description, extensions } from './mixins'; + +import type { ExtensionsInterface } from '../extensions'; +import type { SecuritySchemeInterface } from '../security-scheme'; +import type { OAuthFlowsInterface } from '../oauth-flows'; + +import type { v3 } from '../../spec-types'; + +export class SecurityScheme extends BaseModel implements SecuritySchemeInterface { + id(): string { + return this._meta.id; + } + + type(): v3.SecuritySchemeType { + return this._json.type; + } + + hasDescription(): boolean { + return hasDescription(this); + } + + description(): string | undefined { + return description(this); + } + + hasName(): boolean { + return !!this._json.name; + } + + name(): string | undefined { + return this._json.name; + } + + hasIn(): boolean { + return !!this._json.in; + } + + in(): v3.SecuritySchemaLocation | undefined { + return this._json.in; + } + + hasScheme(): boolean { + return !!this._json.scheme; + } + + scheme(): string | undefined { + return this._json.scheme; + } + + hasBearerFormat(): boolean { + return !!this._json.bearerFormat; + } + + bearerFormat(): string | undefined { + return this._json.bearerFormat; + } + + hasFlows(): boolean { + return !!this._json.flows; + } + + flows(): OAuthFlowsInterface | undefined { + if (!this._json.flows) return undefined; + return new OAuthFlows(this._json.flows); + } + + hasOpenIdConnectUrl(): boolean { + return !!this._json.openIdConnectUrl; + } + + openIdConnectUrl(): string | undefined { + return this._json.openIdConnectUrl; + } + + extensions(): ExtensionsInterface { + return extensions(this); + } +} diff --git a/src/models/v3/security-schemes.ts b/src/models/v3/security-schemes.ts new file mode 100644 index 000000000..93ca01e1b --- /dev/null +++ b/src/models/v3/security-schemes.ts @@ -0,0 +1,10 @@ +import { Collection } from '../collection'; + +import type { SecuritySchemesInterface } from '../security-schemes'; +import type { SecuritySchemeInterface } from '../security-scheme'; + +export class SecuritySchemes extends Collection implements SecuritySchemesInterface { + override get(id: string): SecuritySchemeInterface | undefined { + return this.collections.find(securityScheme => securityScheme.id() === id); + } +} diff --git a/src/models/v3/server-variable.ts b/src/models/v3/server-variable.ts new file mode 100644 index 000000000..75c21715c --- /dev/null +++ b/src/models/v3/server-variable.ts @@ -0,0 +1,46 @@ +import { BaseModel } from '../base'; + +import { hasDescription, description, extensions } from './mixins'; + +import type { ExtensionsInterface } from '../extensions'; +import type { ServerVariableInterface } from '../server-variable'; + +import type { v3 } from '../../spec-types'; + +export class ServerVariable extends BaseModel implements ServerVariableInterface { + id(): string { + return this._meta.id; + } + + hasDescription(): boolean { + return hasDescription(this); + } + + description(): string | undefined { + return description(this); + } + + hasDefaultValue(): boolean { + return !!this._json.default; + } + + defaultValue(): string | undefined { + return this._json.default; + } + + hasAllowedValues(): boolean { + return !!this._json.enum; + } + + allowedValues(): Array { + return this._json.enum || []; + } + + examples(): Array { + return this._json.examples || []; + } + + extensions(): ExtensionsInterface { + return extensions(this); + } +} diff --git a/src/models/v3/server-variables.ts b/src/models/v3/server-variables.ts new file mode 100644 index 000000000..5faf082db --- /dev/null +++ b/src/models/v3/server-variables.ts @@ -0,0 +1,10 @@ +import { Collection } from '../collection'; + +import type { ServerVariablesInterface } from '../server-variables'; +import type { ServerVariableInterface } from '../server-variable'; + +export class ServerVariables extends Collection implements ServerVariablesInterface { + override get(id: string): ServerVariableInterface | undefined { + return this.collections.find(variable => variable.id() === id); + } +} diff --git a/src/models/v3/server.ts b/src/models/v3/server.ts new file mode 100644 index 000000000..9308882dc --- /dev/null +++ b/src/models/v3/server.ts @@ -0,0 +1,125 @@ +import { Channels } from './channels'; +import { Channel } from './channel'; +import { Messages } from './messages'; +import { Operations } from './operations'; +import { SecurityScheme } from './security-scheme'; +import { ServerVariables } from './server-variables'; +import { ServerVariable } from './server-variable'; +import { SecurityRequirements } from './security-requirements'; +import { SecurityRequirement } from './security-requirement'; + +import { CoreModel } from './mixins'; +import { tilde } from '../../utils'; + +import type { ChannelsInterface } from '../channels'; +import type { ChannelInterface } from '../channel'; +import type { OperationsInterface } from '../operations'; +import type { OperationInterface } from '../operation'; +import type { MessagesInterface } from '../messages'; +import type { MessageInterface } from '../message'; +import type { ServerInterface } from '../server'; +import type { ServerVariablesInterface } from '../server-variables'; + +import type { v3 } from '../../spec-types'; + +export class Server extends CoreModel implements ServerInterface { + id(): string { + return this._meta.id; + } + + url(): string { + let host = this.host(); + if (!host.endsWith('/')) { + host = `${host}/`; + } + let pathname = this.pathname() || ''; + if (pathname.startsWith('/')) { + pathname = pathname.substring(1); + } + return `${this.protocol()}://${host}${pathname}`; + } + + host(): string { + return this._json.host; + } + + protocol(): string { + return this._json.protocol; + } + + hasPathname(): boolean { + return !!this._json.pathname; + } + + pathname(): string | undefined { + return this._json.pathname; + } + + hasProtocolVersion(): boolean { + return !!this._json.protocolVersion; + } + + protocolVersion(): string | undefined { + return this._json.protocolVersion; + } + + channels(): ChannelsInterface { + const channels: ChannelInterface[] = []; + Object.entries((this._meta.asyncapi?.parsed as v3.AsyncAPIObject)?.channels || {}).forEach(([channelName, channel]) => { + const allowedServers = (channel as v3.ChannelObject).servers || []; + if (allowedServers.length === 0 || allowedServers.includes(this._json)) { + channels.push(this.createModel(Channel, channel as v3.ChannelObject, { id: channelName, pointer: `/channels/${tilde(channelName)}` })); + } + }); + return new Channels(channels); + } + + operations(): OperationsInterface { + const operations: OperationInterface[] = []; + const operationsData: v3.OperationObject[] = []; + this.channels().forEach(channel => { + channel.operations().forEach(operation => { + const operationData = operation.json(); + if (!operationsData.includes(operationData)) { + operations.push(operation); + operationsData.push(operationData); + } + }); + }); + return new Operations(operations); + } + + messages(): MessagesInterface { + const messages: MessageInterface[] = []; + const messagedData: v3.MessageObject[] = []; + this.channels().forEach(channel => { + channel.messages().forEach(message => { + const messageData = message.json(); + if (!messagedData.includes(messageData)) { + messages.push(message); + messagedData.push(messageData); + } + }); + }); + return new Messages(messages); + } + + variables(): ServerVariablesInterface { + return new ServerVariables( + Object.entries(this._json.variables || {}).map(([serverVariableName, serverVariable]) => { + return this.createModel(ServerVariable, serverVariable as v3.ServerVariableObject, { + id: serverVariableName, + pointer: this.jsonPath(`variables/${serverVariableName}`), + }); + }) + ); + } + + security(): SecurityRequirements[] { + return (this._json.security || []).map((security, index) => { + const scheme = this.createModel(SecurityScheme, security as v3.SecuritySchemeObject, { id: '', pointer: this.jsonPath(`security/${index}`) }); + const requirement = this.createModel(SecurityRequirement, { scheme, scopes: (security as v3.SecuritySchemeObject).scopes }, { id: '', pointer: this.jsonPath(`security/${index}`) }); + return new SecurityRequirements([requirement]); + }); + } +} diff --git a/src/models/v3/servers.ts b/src/models/v3/servers.ts new file mode 100644 index 000000000..3c6ce0f4a --- /dev/null +++ b/src/models/v3/servers.ts @@ -0,0 +1,17 @@ +import { Collection } from '../collection'; +import { ServerInterface } from '../server'; +import { ServersInterface } from '../servers'; + +export class Servers extends Collection implements ServersInterface { + override get(id: string): ServerInterface | undefined { + return this.collections.find(server => server.id() === id); + } + + filterBySend(): ServerInterface[] { + return this.filterBy(server => server.operations().filterBySend().length > 0); + } + + filterByReceive(): ServerInterface[] { + return this.filterBy(server => server.operations().filterByReceive().length > 0); + } +} diff --git a/src/models/v3/tag.ts b/src/models/v3/tag.ts new file mode 100644 index 000000000..7b3c2f780 --- /dev/null +++ b/src/models/v3/tag.ts @@ -0,0 +1,39 @@ +import { BaseModel } from '../base'; + +import { hasDescription, description, extensions, hasExternalDocs, externalDocs } from './mixins'; + +import type { ExtensionsInterface } from '../extensions'; +import type{ ExternalDocumentationInterface } from '../external-docs'; +import type { TagInterface } from '../tag'; + +import type { v3 } from '../../spec-types'; + +export class Tag extends BaseModel implements TagInterface { + id(): string | undefined { + return this._meta.id; + } + + name(): string { + return this._json.name; + } + + hasDescription(): boolean { + return hasDescription(this); + } + + description(): string | undefined { + return description(this); + } + + extensions(): ExtensionsInterface { + return extensions(this); + } + + hasExternalDocs(): boolean { + return hasExternalDocs(this); + } + + externalDocs(): ExternalDocumentationInterface | undefined { + return externalDocs(this); + } +} diff --git a/src/models/v3/tags.ts b/src/models/v3/tags.ts new file mode 100644 index 000000000..6048620ff --- /dev/null +++ b/src/models/v3/tags.ts @@ -0,0 +1,10 @@ +import { Collection } from '../collection'; + +import type { TagsInterface } from '../tags'; +import type { TagInterface } from '../tag'; + +export class Tags extends Collection implements TagsInterface { + override get(name: string): TagInterface | undefined { + return this.collections.find(tag => tag.name() === name); + } +} diff --git a/src/parse.ts b/src/parse.ts index c743cf7dd..479bd9dfb 100644 --- a/src/parse.ts +++ b/src/parse.ts @@ -1,6 +1,6 @@ -import { AsyncAPIDocumentInterface } from './models'; +import { AsyncAPIDocumentInterface, ParserAPIVersion } from './models'; -import { customOperations } from './custom-operations'; +import { applyUniqueIds, customOperations } from './custom-operations'; import { validate } from './validate'; import { copy } from './stringify'; import { createAsyncAPIDocument } from './document'; @@ -38,13 +38,26 @@ const defaultOptions: ParseOptions = { validateOptions: {}, __unstable: {}, }; - +import yaml from 'js-yaml'; export async function parse(parser: Parser, spectral: Spectral, asyncapi: Input, options: ParseOptions = {}): Promise { let spectralDocument: Document | undefined; try { options = mergePatch(defaultOptions, options); - const { validated, diagnostics, extras } = await validate(parser, spectral, asyncapi, { ...options.validateOptions, source: options.source, __unstable: options.__unstable }); + // Normalize input to always be JSON + let loadedObj; + if (typeof asyncapi === 'string') { + try { + loadedObj = yaml.load(asyncapi); + } catch (e) { + loadedObj = JSON.parse(asyncapi); + } + } else { + loadedObj = asyncapi; + } + // Apply unique ids before resolving references + applyUniqueIds(loadedObj); + const { validated, diagnostics, extras } = await validate(parser, spectral, loadedObj, { ...options.validateOptions, source: options.source, __unstable: options.__unstable }); if (validated === undefined) { return { document: undefined, @@ -58,12 +71,12 @@ export async function parse(parser: Parser, spectral: Spectral, asyncapi: Input, // unfreeze the object - Spectral makes resolved document "freezed" const validatedDoc = copy(validated as Record); - const detailed = createDetailedAsyncAPI(validatedDoc, asyncapi as DetailedAsyncAPI['input'], options.source); + const detailed = createDetailedAsyncAPI(validatedDoc, loadedObj as DetailedAsyncAPI['input'], options.source); const document = createAsyncAPIDocument(detailed); setExtension(xParserSpecParsed, true, document); - setExtension(xParserApiVersion, 1, document); + setExtension(xParserApiVersion, ParserAPIVersion, document); await customOperations(parser, document, detailed, inventory, options); - + return { document, diagnostics, diff --git a/src/ruleset/functions/documentStructure.ts b/src/ruleset/functions/documentStructure.ts index a00268d25..2b8db6e96 100644 --- a/src/ruleset/functions/documentStructure.ts +++ b/src/ruleset/functions/documentStructure.ts @@ -1,12 +1,17 @@ +/* eslint-disable sonarjs/no-duplicate-string */ + import specs from '@asyncapi/specs'; import { createRulesetFunction } from '@stoplight/spectral-core'; import { schema as schemaFn } from '@stoplight/spectral-functions'; +import { AsyncAPIFormats } from '../formats'; +import { getSemver } from '../../utils'; + import type { ErrorObject } from 'ajv'; import type { IFunctionResult, Format } from '@stoplight/spectral-core'; -import { AsyncAPIFormats } from '../formats'; type AsyncAPIVersions = keyof typeof specs.schemas; +type RawSchema = Record; function shouldIgnoreError(error: ErrorObject): boolean { return ( @@ -45,24 +50,52 @@ function prepareResults(errors: ErrorObject[]): void { } } -function getCopyOfSchema(version: AsyncAPIVersions): Record { - return JSON.parse(JSON.stringify(specs.schemas[version])) as Record; +// this is needed because some v3 object fields are expected to be only `$ref` to other objects. +// In order to validate resolved references, we modify those schemas and instead allow the definition of the object +function prepareV3ResolvedSchema(copied: any): any { + // channel object + const channelObject = copied.definitions['http://asyncapi.com/definitions/3.0.0/channel.json']; + channelObject.properties.servers.items.$ref = 'http://asyncapi.com/definitions/3.0.0/server.json'; + + // operation object + const operationSchema = copied.definitions['http://asyncapi.com/definitions/3.0.0/operation.json']; + operationSchema.properties.channel.$ref = 'http://asyncapi.com/definitions/3.0.0/channel.json'; + operationSchema.properties.messages.items.$ref = 'http://asyncapi.com/definitions/3.0.0/messageObject.json'; + + // operation reply object + const operationReplySchema = copied.definitions['http://asyncapi.com/definitions/3.0.0/operationReply.json']; + operationReplySchema.properties.channel.$ref = 'http://asyncapi.com/definitions/3.0.0/channel.json'; + operationReplySchema.properties.messages.items.$ref = 'http://asyncapi.com/definitions/3.0.0/messageObject.json'; + + return copied; +} + +function getCopyOfSchema(version: AsyncAPIVersions): RawSchema { + return JSON.parse(JSON.stringify(specs.schemas[version])) as RawSchema; } -const serializedSchemas = new Map>(); -function getSerializedSchema(version: AsyncAPIVersions): Record { - const schema = serializedSchemas.get(version); +const serializedSchemas = new Map(); +function getSerializedSchema(version: AsyncAPIVersions, resolved: boolean): RawSchema { + const serializedSchemaKey = resolved ? `${version}-resolved` : `${version}-unresolved`; + const schema = serializedSchemas.get(serializedSchemaKey as AsyncAPIVersions); if (schema) { return schema; } // Copy to not operate on the original json schema - between imports (in different modules) we operate on this same schema. - const copied = getCopyOfSchema(version) as { definitions: Record }; + let copied = getCopyOfSchema(version) as { '$id': string, definitions: RawSchema }; // Remove the meta schemas because they are already present within Ajv, and it's not possible to add duplicated schemas. delete copied.definitions['http://json-schema.org/draft-07/schema']; delete copied.definitions['http://json-schema.org/draft-04/schema']; + // Spectral caches the schemas using '$id' property + copied['$id'] = copied['$id'].replace('asyncapi.json', `asyncapi-${resolved ? 'resolved' : 'unresolved'}.json`); + + const { major } = getSemver(version); + if (resolved && major === 3) { + copied = prepareV3ResolvedSchema(copied); + } - serializedSchemas.set(version, copied); + serializedSchemas.set(serializedSchemaKey as AsyncAPIVersions, copied); return copied; } @@ -80,10 +113,10 @@ function filterRefErrors(errors: IFunctionResult[], resolved: boolean) { }); } -export function getSchema(docFormats: Set): Record | void { +export function getSchema(docFormats: Set, resolved: boolean): Record | void { for (const [version, format] of AsyncAPIFormats) { if (docFormats.has(format)) { - return getSerializedSchema(version as AsyncAPIVersions); + return getSerializedSchema(version as AsyncAPIVersions, resolved); } } } @@ -107,16 +140,17 @@ export const documentStructure = createRulesetFunction( + { + input: { + type: 'object', + properties: { + channel: referenceSchema, + messages: { + type: 'array', + items: referenceSchema, + }, + }, + }, + options: null, + }, + (targetVal, _, ctx) => { + const results: IFunctionResult[] = []; + const channelPointer = targetVal.channel?.$ref as string; // required + + targetVal.messages?.forEach((message, index) => { + if (!message.$ref.startsWith(`${channelPointer}/messages`)) { + results.push({ + message: 'Operation message does not belong to the specified channel.', + path: [...ctx.path, 'messages', index], + }); + } + }); + + return results; + }, +); diff --git a/src/ruleset/v3/index.ts b/src/ruleset/v3/index.ts new file mode 100644 index 000000000..5acc4189e --- /dev/null +++ b/src/ruleset/v3/index.ts @@ -0,0 +1 @@ +export * from './ruleset'; diff --git a/src/ruleset/v3/ruleset.ts b/src/ruleset/v3/ruleset.ts new file mode 100644 index 000000000..724339e84 --- /dev/null +++ b/src/ruleset/v3/ruleset.ts @@ -0,0 +1,61 @@ +/* eslint-disable sonarjs/no-duplicate-string */ + +import { AsyncAPIFormats } from '../formats'; +import { operationMessagesUnambiguity } from './functions/operationMessagesUnambiguity'; +import { pattern } from '@stoplight/spectral-functions'; + +export const v3CoreRuleset = { + description: 'Core AsyncAPI 3.x.x ruleset.', + formats: AsyncAPIFormats.filterByMajorVersions(['3']).formats(), + rules: { + /** + * Operation Object rules + */ + 'asyncapi3-operation-messages-from-referred-channel': { + description: 'Operation "messages" must be a subset of the messages defined in the channel referenced in this operation.', + message: '{{error}}', + severity: 'error', + recommended: true, + resolved: false, // We use the JSON pointer to match the channel. + given: [ + '$.operations.*', + '$.components.operations.*', + ], + then: { + function: operationMessagesUnambiguity, + }, + }, + 'asyncapi3-required-operation-channel-unambiguity': { + description: 'The "channel" field of an operation under the root "operations" object must always reference a channel under the root "channels" object.', + severity: 'error', + recommended: true, + resolved: false, // We use the JSON pointer to match the channel. + given: '$.operations.*', + then: { + field: 'channel.$ref', + function: pattern, + functionOptions: { + match: '#\\/channels\\/', // If doesn't match, rule fails. + }, + }, + }, + + /** + * Channel Object rules + */ + 'asyncapi3-required-channel-servers-unambiguity': { + description: 'The "servers" field of a channel under the root "channels" object must always reference a subset of the servers under the root "servers" object.', + severity: 'error', + recommended: true, + resolved: false, // We use the JSON pointer to match the channel. + given: '$.channels.*', + then: { + field: '$.servers.*.$ref', + function: pattern, + functionOptions: { + match: '#\\/servers\\/', // If doesn't match, rule fails. + }, + }, + } + }, +}; diff --git a/src/spec-types/index.ts b/src/spec-types/index.ts index 1c818d3fa..5ab639dfa 100644 --- a/src/spec-types/index.ts +++ b/src/spec-types/index.ts @@ -1 +1,2 @@ export * as v2 from './v2'; +export * as v3 from './v3'; diff --git a/src/spec-types/v2.ts b/src/spec-types/v2.ts index e5b6fd169..758cd3035 100644 --- a/src/spec-types/v2.ts +++ b/src/spec-types/v2.ts @@ -450,4 +450,4 @@ export type SpecificationExtension = T; export interface ReferenceObject { $ref: string; -} \ No newline at end of file +} diff --git a/src/spec-types/v3.ts b/src/spec-types/v3.ts new file mode 100644 index 000000000..766df3bf9 --- /dev/null +++ b/src/spec-types/v3.ts @@ -0,0 +1,495 @@ +import type { JSONSchema7Version, JSONSchema7TypeName, JSONSchema7Type } from 'json-schema'; + +export type AsyncAPIVersion = string; +export type Identifier = string; +export type DefaultContentType = string; + +export interface AsyncAPIObject extends SpecificationExtensions { + asyncapi: AsyncAPIVersion; + id?: Identifier; + defaultContentType?: DefaultContentType; + info: InfoObject; + servers?: ServersObject; + channels?: ChannelsObject; + operations?: OperationsObject; + components?: ComponentsObject; +} + +export interface InfoObject extends SpecificationExtensions { + title: string; + version: string; + description?: string; + termsOfService?: string; + contact?: ContactObject; + license?: LicenseObject; + tags?: TagsObject; + externalDocs?: ExternalDocumentationObject | ReferenceObject; +} + +export interface ContactObject extends SpecificationExtensions { + name?: string; + url?: string; + email?: string; +} + +export interface LicenseObject extends SpecificationExtensions { + name: string; + url?: string; +} + +export type ServersObject = Record; + +export interface ServerObject extends SpecificationExtensions { + host: string; + protocol: string; + pathname?: string; + protocolVersion?: string; + description?: string; + variables?: Record; + security?: Array; + tags?: TagsObject; + externalDocs?: ExternalDocumentationObject | ReferenceObject; + bindings?: ServerBindingsObject | ReferenceObject; +} + +export interface ServerVariableObject extends SpecificationExtensions { + enum?: Array; + default?: string; + description?: string; + examples?: Array; +} + +export interface ServerBindingsObject extends SpecificationExtensions { + http?: Binding; + ws?: Binding; + kafka?: Binding; + anypointmq?: Binding; + amqp?: Binding; + amqp1?: Binding; + mqtt?: Binding; + mqtt5?: Binding; + nats?: Binding; + jms?: Binding; + sns?: Binding; + sqs?: Binding; + stomp?: Binding; + redis?: Binding; + mercure?: Binding; + ibmmq?: Binding; + googlepubsub?: Binding; +} + +export type ChannelsObject = Record; + +export interface ChannelObject extends SpecificationExtensions { + address?: string | null; + messages?: MessagesObject; + title?: string; + summary?: string; + description?: string; + servers?: Array; + parameters?: ParametersObject; + tags?: TagsObject; + externalDocs?: ExternalDocumentationObject | ReferenceObject; + bindings?: ChannelBindingsObject | ReferenceObject; +} + +export interface ChannelBindingsObject extends SpecificationExtensions { + http?: Binding; + ws?: Binding; + kafka?: Binding; + anypointmq?: Binding; + amqp?: Binding; + amqp1?: Binding; + mqtt?: Binding; + mqtt5?: Binding; + nats?: Binding; + jms?: Binding; + sns?: Binding; + sqs?: Binding; + stomp?: Binding; + redis?: Binding; + mercure?: Binding; + ibmmq?: Binding; + googlepubsub?: Binding; +} + +export type OperationsObject = Record; + +export interface OperationObject extends SpecificationExtensions { + action: 'send' | 'receive'; + channel: ChannelObject | ReferenceObject; + messages?: Array; + reply?: OperationReplyObject | ReferenceObject; + title?: string; + summary?: string; + description?: string; + security?: Array; + tags?: TagsObject; + externalDocs?: ExternalDocumentationObject | ReferenceObject; + bindings?: OperationBindingsObject | ReferenceObject; + traits?: Array; +} + +export interface OperationTraitObject extends SpecificationExtensions { + title?: string; + summary?: string; + description?: string; + security?: Array; + tags?: TagsObject; + externalDocs?: ExternalDocumentationObject | ReferenceObject; + bindings?: OperationBindingsObject | ReferenceObject; +} + +export interface OperationReplyObject extends SpecificationExtensions { + channel?: ChannelObject | ReferenceObject; + messages?: (MessageObject | ReferenceObject)[]; + address?: OperationReplyAddressObject | ReferenceObject; +} + +export interface OperationReplyAddressObject extends SpecificationExtensions { + location: string; + description?: string; +} + +export interface OperationBindingsObject extends SpecificationExtensions { + http?: Binding; + ws?: Binding; + kafka?: Binding; + anypointmq?: Binding; + amqp?: Binding; + amqp1?: Binding; + mqtt?: Binding; + mqtt5?: Binding; + nats?: Binding; + jms?: Binding; + sns?: Binding; + sqs?: Binding; + stomp?: Binding; + redis?: Binding; + mercure?: Binding; + ibmmq?: Binding; + googlepubsub?: Binding; +} + +export type MessagesObject = Record; + +export interface MessageObject extends MessageTraitObject, SpecificationExtensions { + payload?: any; + traits?: Array; +} + +export interface MessageTraitObject extends SpecificationExtensions { + headers?: MultiFormatSchemaObject; + correlationId?: CorrelationIDObject | ReferenceObject; + contentType?: string; + name?: string; + title?: string; + summary?: string; + description?: string; + tags?: TagsObject; + externalDocs?: ExternalDocumentationObject | ReferenceObject; + bindings?: MessageBindingsObject | ReferenceObject; + examples?: Array; +} + +export interface MessageExampleObject extends SpecificationExtensions { + name?: string; + summary?: string; + headers?: Record; + payload?: any; +} + +export interface MessageBindingsObject extends SpecificationExtensions { + http?: Binding; + ws?: Binding; + kafka?: Binding; + anypointmq?: Binding; + amqp?: Binding; + amqp1?: Binding; + mqtt?: Binding; + mqtt5?: Binding; + nats?: Binding; + jms?: Binding; + sns?: Binding; + sqs?: Binding; + stomp?: Binding; + redis?: Binding; + mercure?: Binding; + ibmmq?: Binding; + googlepubsub?: Binding; +} + +export type ParametersObject = Record; + +export interface ParameterObject extends SpecificationExtensions { + description?: string; + enum?: string[]; + default?: string; + examples?: string[]; + location?: string; +} + +export type TagsObject = Array; + +export interface TagObject extends SpecificationExtensions { + name: string; + description?: string; + externalDocs?: ExternalDocumentationObject | ReferenceObject; +} + +export interface ExternalDocumentationObject extends SpecificationExtensions { + url: string; + description?: string; +} + +export interface ComponentsObject extends SpecificationExtensions { + servers?: Record; + channels?: Record; + operations?: Record; + messages?: Record; + schemas?: Record; + securitySchemes?: Record; + serverVariables?: Record; + parameters?: Record; + replies?: Record; + replyAddresses?: Record; + correlationIds?: Record; + operationTraits?: Record; + messageTraits?: Record; + tags?: Record; + externalDocs?: Record; + serverBindings?: Record; + channelBindings?: Record; + operationBindings?: Record; + messageBindings?: Record; +} + +export interface SecuritySchemeObject extends SpecificationExtensions { + type: SecuritySchemeType; + description?: string; + name?: string; + in?: 'user' | 'password' | 'query' | 'header' | 'cookie'; + scheme?: string; + bearerFormat?: string; + flows?: OAuthFlowsObject; + openIdConnectUrl?: string; + scopes?: string[]; +} + +export type SecuritySchemeType = + | 'userPassword' + | 'apiKey' + | 'X509' + | 'symmetricEncryption' + | 'asymmetricEncryption' + | 'httpApiKey' + | 'http' + | 'oauth2' + | 'openIdConnect' + | 'plain' + | 'scramSha256' + | 'scramSha512' + | 'gssapi'; + +export type SecuritySchemaLocation = + | 'user' + | 'password' + | 'query' + | 'header' + | 'cookie'; + +export interface SecuritySchemeObjectBase extends SpecificationExtensions { + description?: string; +} + +export interface SecuritySchemeObjectUserPassword extends SecuritySchemeObjectBase, SpecificationExtensions { + type: 'userPassword'; +} + +export interface SecuritySchemeObjectApiKey extends SecuritySchemeObjectBase, SpecificationExtensions { + type: 'apiKey'; + in: 'user' | 'password'; +} + +export interface SecuritySchemeObjectX509 extends SecuritySchemeObjectBase, SpecificationExtensions { + type: 'X509'; +} + +export interface SecuritySchemeObjectSymetricEncryption extends SecuritySchemeObjectBase, SpecificationExtensions { + type: 'symmetricEncryption'; +} + +export interface SecuritySchemeObjectAsymetricEncryption extends SecuritySchemeObjectBase, SpecificationExtensions { + type: 'asymmetricEncryption'; +} + +export interface SecuritySchemeObjectHttpApiKey extends SecuritySchemeObjectBase, SpecificationExtensions { + type: 'httpApiKey'; + name: string; + in: 'query' | 'header' | 'cookie'; +} + +export interface SecuritySchemeObjectHttp extends SecuritySchemeObjectBase, SpecificationExtensions { + type: 'http'; + scheme: string; + bearerFormat?: string; +} + +export interface SecuritySchemeObjectOauth2 extends SecuritySchemeObjectBase, SpecificationExtensions { + type: 'oauth2'; + flows: OAuthFlowsObject; + scopes: string[]; +} + +export interface SecuritySchemeObjectOpenIdConnect extends SecuritySchemeObjectBase, SpecificationExtensions { + type: 'openIdConnect'; + openIdConnectUrl: string; +} + +export interface SecuritySchemeObjectPlain extends SecuritySchemeObjectBase, SpecificationExtensions { + type: 'plain'; +} + +export interface SecuritySchemeObjectScramSha256 extends SecuritySchemeObjectBase, SpecificationExtensions { + type: 'scramSha256'; +} + +export interface SecuritySchemeObjectScramSha512 extends SecuritySchemeObjectBase, SpecificationExtensions { + type: 'scramSha512'; +} + +export interface SecuritySchemeObjectGssapi extends SecuritySchemeObjectBase, SpecificationExtensions { + type: 'gssapi'; +} + +export interface OAuthFlowsObject extends SpecificationExtensions { + implicit?: OAuthFlowObjectImplicit; + password?: OAuthFlowObjectPassword; + clientCredentials?: OAuthFlowObjectClientCredentials; + authorizationCode?: OAuthFlowObjectAuthorizationCode; +} + +export type OAuthFlowObject = + & OAuthFlowObjectImplicit + & OAuthFlowObjectPassword + & OAuthFlowObjectClientCredentials + & OAuthFlowObjectAuthorizationCode; + +export interface OAuthFlowObjectBase extends SpecificationExtensions { + refreshUrl?: string; + availableScopes: Record; +} + +export interface OAuthFlowObjectImplicit extends OAuthFlowObjectBase, SpecificationExtensions { + authorizationUrl: string; +} + +export interface OAuthFlowObjectPassword extends OAuthFlowObjectBase, SpecificationExtensions { + tokenUrl: string; +} + +export interface OAuthFlowObjectClientCredentials extends OAuthFlowObjectBase, SpecificationExtensions { + tokenUrl: string; +} + +export interface OAuthFlowObjectAuthorizationCode extends OAuthFlowObjectBase, SpecificationExtensions { + authorizationUrl: string; + tokenUrl: string; +} + +export type SchemaObject = AsyncAPISchemaObject | ReferenceObject; +export type AsyncAPISchemaObject = AsyncAPISchemaDefinition | boolean; +export type MultiFormatObject = { schema: AsyncAPISchemaObject, schemaFormat: string | undefined } +export type MultiFormatSchemaObject = AsyncAPISchemaObject | MultiFormatObject + +export interface AsyncAPISchemaDefinition extends SpecificationExtensions { + $id?: string; + $schema?: JSONSchema7Version; + $comment?: string; + + type?: JSONSchema7TypeName | JSONSchema7TypeName[]; + enum?: JSONSchema7Type[]; + const?: JSONSchema7Type; + + multipleOf?: number; + maximum?: number; + exclusiveMaximum?: number; + minimum?: number; + exclusiveMinimum?: number; + + maxLength?: number; + minLength?: number; + pattern?: string; + + items?: AsyncAPISchemaObject | AsyncAPISchemaObject[]; + additionalItems?: AsyncAPISchemaObject; + maxItems?: number; + minItems?: number; + uniqueItems?: boolean; + contains?: AsyncAPISchemaObject; + + maxProperties?: number; + minProperties?: number; + required?: string[]; + properties?: { + [key: string]: AsyncAPISchemaObject; + }; + patternProperties?: { + [key: string]: AsyncAPISchemaObject; + }; + additionalProperties?: AsyncAPISchemaObject; + dependencies?: { + [key: string]: AsyncAPISchemaObject | string[]; + }; + propertyNames?: AsyncAPISchemaObject; + + if?: AsyncAPISchemaObject; + then?: AsyncAPISchemaObject; + else?: AsyncAPISchemaObject; + + allOf?: AsyncAPISchemaObject[]; + anyOf?: AsyncAPISchemaObject[]; + oneOf?: AsyncAPISchemaObject[]; + not?: AsyncAPISchemaObject; + + format?: string; + + contentMediaType?: string; + contentEncoding?: string; + + definitions?: { + [key: string]: AsyncAPISchemaObject; + }; + + title?: string; + description?: string; + default?: JSONSchema7Type; + readOnly?: boolean; + writeOnly?: boolean; + examples?: Array; + + discriminator?: string; + externalDocs?: ExternalDocumentationObject; + deprecated?: boolean; + [keyword: string]: any; +} + +export interface Binding { + bindingVersion?: string; +} + +export interface SpecificationExtensions { + [extension: `x-${string}`]: SpecificationExtension; +} + +export type SpecificationExtension = T; + +export interface ReferenceObject { + $ref: string; +} + +export interface CorrelationIDObject extends SpecificationExtensions { + location: string; + description?: string; +} diff --git a/src/types.ts b/src/types.ts index 75254e0f6..a50193f74 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,6 +1,6 @@ import type { ISpectralDiagnostic, IFunctionResult } from '@stoplight/spectral-core'; import type { AsyncAPIDocumentInterface } from './models'; -import type { v2 } from './spec-types'; +import type { v2, v3 } from './spec-types'; export type MaybeAsyncAPI = { asyncapi: string } & Record; @@ -22,5 +22,5 @@ export interface DetailedAsyncAPI { export type Input = string | MaybeAsyncAPI | AsyncAPIDocumentInterface; export type Diagnostic = ISpectralDiagnostic; export type SchemaValidateResult = IFunctionResult; -export type AsyncAPIObject = v2.AsyncAPIObject; -export type AsyncAPISchema = v2.AsyncAPISchemaObject; +export type AsyncAPIObject = v2.AsyncAPIObject | v3.AsyncAPIObject; +export type AsyncAPISchema = v2.AsyncAPISchemaObject | v3.AsyncAPISchemaObject; diff --git a/src/utils.ts b/src/utils.ts index e5150b756..fdb0237b3 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -51,9 +51,13 @@ export function hasHintDiagnostic(diagnostics: ISpectralDiagnostic[]): boolean { export function setExtension(id: string, value: unknown, model: BaseModel): void { const modelValue = model.json(); - if (typeof modelValue === 'object' && modelValue) { + setExtensionOnJson(id, value, modelValue); +} + +export function setExtensionOnJson(id: string, value: unknown, model: any): void { + if (typeof model === 'object' && model) { id = id.startsWith('x-') ? id : `x-${id}`; - modelValue[String(id)] = value; + model[String(id)] = value; } } @@ -144,6 +148,20 @@ export function findSubArrayIndex(arr: Array, subarr: Array, fromIndex return -1; } +export function resolveServerUrl(url: string): { host: string, pathname: string | undefined } { + // eslint-disable-next-line prefer-const + let [maybeProtocol, maybeHost] = url.split('://'); + if (!maybeHost) { + maybeHost = maybeProtocol; + } + + const [host, ...pathnames] = maybeHost.split('/'); + if (pathnames.length) { + return { host, pathname: `/${pathnames.join('/')}` }; + } + return { host, pathname: undefined }; +} + export function retrieveDeepData(value: Record, path: Array) { let index = 0; const length = path.length; diff --git a/test/custom-operations/apply-traits-v2.spec.ts b/test/custom-operations/apply-traits-v2.spec.ts new file mode 100644 index 000000000..4eb2800fc --- /dev/null +++ b/test/custom-operations/apply-traits-v2.spec.ts @@ -0,0 +1,189 @@ +import { AsyncAPIDocumentV2 } from '../../src/models'; +import { Parser } from '../../src/parser'; + +import type { v2 } from '../../src/spec-types'; + +describe('custom operations - apply traits v3', function() { + const parser = new Parser(); + + it('should apply traits to operations', async function() { + const documentRaw = { + asyncapi: '2.0.0', + info: { + title: 'Valid AsyncApi document', + version: '1.0', + }, + channels: { + channel: { + publish: { + operationId: 'publishId', + traits: [ + { + operationId: 'anotherPubId', + description: 'some description' + }, + { + description: 'another description' + } + ] + }, + subscribe: { + operationId: 'subscribeId', + traits: [ + { + operationId: 'anotherSubId', + description: 'some description' + }, + { + description: 'another description' + } + ] + } + } + } + }; + const { document, diagnostics } = await parser.parse(documentRaw); + + const v2Document = document as AsyncAPIDocumentV2; + expect(v2Document).toBeInstanceOf(AsyncAPIDocumentV2); + expect(diagnostics.length > 0).toEqual(true); + + const publish = v2Document?.json()?.channels?.channel?.publish; + delete publish?.traits; + expect(publish).toEqual({ operationId: 'anotherPubId', description: 'another description' }); + + const subscribe = v2Document?.json()?.channels?.channel?.subscribe; + delete subscribe?.traits; + expect(subscribe).toEqual({ operationId: 'anotherSubId', description: 'another description' }); + }); + + it('should apply traits to messages', async function() { + const documentRaw = { + asyncapi: '2.4.0', + info: { + title: 'Valid AsyncApi document', + version: '1.0', + }, + channels: { + channel: { + publish: { + operationId: 'operationId', + message: { + messageId: 'messageId', + traits: [ + { + messageId: 'anotherMessageId1', + description: 'some description' + }, + { + description: 'another description' + } + ] + } + }, + subscribe: { + message: { + oneOf: [ + { + messageId: 'messageId', + traits: [ + { + messageId: 'anotherMessageId2', + description: 'some description' + }, + { + description: 'another description' + } + ] + }, + { + messageId: 'messageId', + traits: [ + { + messageId: 'anotherId', + description: 'some description' + }, + { + description: 'another description' + }, + { + messageId: 'anotherMessageId3', + description: 'simple description' + } + ] + } + ], + } + } + } + } + }; + const { document, diagnostics } = await parser.parse(documentRaw); + + const v2Document = document as AsyncAPIDocumentV2; + expect(v2Document).toBeInstanceOf(AsyncAPIDocumentV2); + expect(diagnostics.length > 0).toEqual(true); + + const message = v2Document?.json()?.channels?.channel?.publish?.message; + delete (message as v2.MessageObject)?.traits; + expect(message).toEqual({ messageId: 'anotherMessageId1', description: 'another description', 'x-parser-message-name': 'anotherMessageId1' }); + + const messageOneOf1 = (v2Document?.json()?.channels?.channel?.subscribe?.message as { oneOf: Array }).oneOf[0]; + delete messageOneOf1?.traits; + expect(messageOneOf1).toEqual({ messageId: 'anotherMessageId2', description: 'another description', 'x-parser-message-name': 'anotherMessageId2' }); + + const messageOneOf2 = (v2Document?.json()?.channels?.channel?.subscribe?.message as { oneOf: Array }).oneOf[1]; + delete messageOneOf2?.traits; + expect(messageOneOf2).toEqual({ messageId: 'anotherMessageId3', description: 'simple description', 'x-parser-message-name': 'anotherMessageId3' }); + }); + + it('should preserve this same references', async function() { + const documentRaw = { + asyncapi: '2.4.0', + info: { + title: 'Valid AsyncApi document', + version: '1.0', + }, + channels: { + channel: { + publish: { + operationId: 'publishId', + message: { + $ref: '#/components/messages/message', + } + }, + } + }, + components: { + messages: { + message: { + messageId: 'messageId', + traits: [ + { + messageId: 'anotherId', + description: 'some description' + }, + { + description: 'another description' + }, + { + messageId: 'anotherMessageId3', + description: 'simple description' + } + ] + } + } + } + }; + const { document, diagnostics } = await parser.parse(documentRaw); + + const v2Document = document as AsyncAPIDocumentV2; + expect(v2Document).toBeInstanceOf(AsyncAPIDocumentV2); + expect(diagnostics.length > 0).toEqual(true); + + const message = v2Document?.json()?.channels?.channel?.publish?.message; + delete (message as v2.MessageObject)?.traits; + expect(message).toEqual({ messageId: 'anotherMessageId3', description: 'simple description', 'x-parser-message-name': 'anotherMessageId3' }); + expect(message === v2Document?.json()?.components?.messages?.message).toEqual(true); + }); +}); diff --git a/test/custom-operations/apply-traits-v3.spec.ts b/test/custom-operations/apply-traits-v3.spec.ts new file mode 100644 index 000000000..1561b783a --- /dev/null +++ b/test/custom-operations/apply-traits-v3.spec.ts @@ -0,0 +1,321 @@ +import { xParserObjectUniqueId } from '../../src/constants'; +import { AsyncAPIDocumentV3 } from '../../src/models'; +import { Parser } from '../../src/parser'; + +import type { v3 } from '../../src/spec-types'; + +describe('custom operations - apply traits v3', function() { + const parser = new Parser(); + + it('should apply traits to operations', async function() { + const documentRaw = { + asyncapi: '3.0.0', + info: { + title: 'Valid AsyncApi document', + version: '1.0', + }, + channels: { + channel1: {} + }, + operations: { + someOperation1: { + action: 'send', + channel: { + $ref: '#/channels/channel1' + }, + traits: [ + { + description: 'some description' + }, + { + description: 'another description' + } + ] + }, + someOperation2: { + action: 'send', + channel: { + $ref: '#/channels/channel1' + }, + description: 'root description', + traits: [ + { + description: 'some description' + }, + { + description: 'another description' + } + ] + } + } + }; + const { document, diagnostics } = await parser.parse(documentRaw); + expect(diagnostics).toHaveLength(0); + + const v3Document = document as AsyncAPIDocumentV3; + expect(v3Document).toBeInstanceOf(AsyncAPIDocumentV3); + + const someOperation1 = v3Document?.json()?.operations?.someOperation1; + delete someOperation1?.traits; + expect(someOperation1).toEqual({ action: 'send', channel: { 'x-parser-unique-object-id': 'channel1' }, description: 'another description' }); + + const someOperation2 = v3Document?.json()?.operations?.someOperation2; + delete someOperation2?.traits; + expect(someOperation2).toEqual({ action: 'send', channel: { 'x-parser-unique-object-id': 'channel1' }, description: 'root description' }); + }); + + it('should apply traits to messages (channels)', async function() { + const documentRaw = { + asyncapi: '3.0.0', + info: { + title: 'Valid AsyncApi document', + version: '1.0', + }, + channels: { + someChannel1: { + messages: { + someMessage: { + traits: [ + { + summary: 'some summary', + description: 'some description' + }, + { + description: 'another description' + } + ] + } + } + }, + someChannel2: { + messages: { + someMessage: { + summary: 'root summary', + description: 'root description', + traits: [ + { + summary: 'some summary', + description: 'some description' + }, + { + description: 'another description' + } + ] + } + } + } + } + }; + const { diagnostics, document } = await parser.parse(documentRaw); + + const v3Document = document as AsyncAPIDocumentV3; + expect(v3Document).toBeInstanceOf(AsyncAPIDocumentV3); + + const message1 = v3Document?.json()?.channels?.someChannel1?.messages?.someMessage; + delete (message1 as v3.MessageObject)?.traits; + expect(message1).toEqual({ summary: 'some summary', description: 'another description', 'x-parser-message-name': 'someMessage', 'x-parser-unique-object-id': 'someMessage' }); + + const message2 = v3Document?.json()?.channels?.someChannel2?.messages?.someMessage; + delete (message2 as v3.MessageObject)?.traits; + expect(message2).toEqual({ summary: 'root summary', description: 'root description', 'x-parser-message-name': 'someMessage', 'x-parser-unique-object-id': 'someMessage' }); + }); + + it('should apply traits to messages (components)', async function() { + const documentRaw = { + asyncapi: '3.0.0', + info: { + title: 'Valid AsyncApi document', + version: '1.0', + }, + components: { + messages: { + someMessage1: { + traits: [ + { + summary: 'some summary', + description: 'some description' + }, + { + description: 'another description' + } + ] + }, + someMessage2: { + summary: 'root summary', + description: 'root description', + traits: [ + { + summary: 'some summary', + description: 'some description' + }, + { + description: 'another description' + } + ] + } + } + } + }; + const { document } = await parser.parse(documentRaw); + + const v3Document = document as AsyncAPIDocumentV3; + expect(v3Document).toBeInstanceOf(AsyncAPIDocumentV3); + + const message1 = v3Document?.json()?.components?.messages?.someMessage1; + delete (message1 as v3.MessageObject)?.traits; + expect(message1).toEqual({ summary: 'some summary', description: 'another description', 'x-parser-message-name': 'someMessage1' }); + + const message2 = v3Document?.json()?.components?.messages?.someMessage2; + delete (message2 as v3.MessageObject)?.traits; + expect(message2).toEqual({ summary: 'root summary', description: 'root description', 'x-parser-message-name': 'someMessage2' }); + }); + + it('iterative functions should still work after traits have been applied', async function() { + const documentRaw = { + asyncapi: '3.0.0', + info: { + title: 'Streetlights Kafka API', + version: '1.0.0', + description: 'The Smartylighting Streetlights API allows you to remotely manage the city lights.\n\n### Check out its awesome features:\n\n* Turn a specific streetlight on/off 🌃\n* Dim a specific streetlight 😎\n* Receive real-time information about environmental lighting conditions 📈\n', + license: { + name: 'Apache 2.0', + url: 'https://www.apache.org/licenses/LICENSE-2.0' + } + }, + defaultContentType: 'application/json', + channels: { + 'smartylighting.streetlights.1.0.event.{streetlightId}.lighting.measured': { + address: 'smartylighting.streetlights.1.0.event.{streetlightId}.lighting.measured', + messages: { + 'receiveLightMeasurement.message': { + $ref: '#/components/messages/lightMeasured' + } + }, + description: 'The topic on which measured values may be produced and consumed.', + parameters: { + streetlightId: { + $ref: '#/components/parameters/streetlightId' + } + } + } + }, + operations: { + receiveLightMeasurement: { + action: 'receive', + channel: { + $ref: '#/channels/smartylighting.streetlights.1.0.event.{streetlightId}.lighting.measured' + }, + summary: 'Inform about environmental lighting conditions of a particular streetlight.', + traits: [ + { + $ref: '#/components/operationTraits/kafka' + } + ], + messages: [ + { + $ref: '#/components/messages/lightMeasured' + } + ] + } + }, + components: { + messages: { + lightMeasured: { + name: 'lightMeasured', + title: 'Light measured', + summary: 'Inform about environmental lighting conditions of a particular streetlight.', + contentType: 'application/json', + traits: [ + { + $ref: '#/components/messageTraits/commonHeaders' + } + ], + payload: { + $ref: '#/components/schemas/lightMeasuredPayload' + } + } + }, + schemas: { + lightMeasuredPayload: { + type: 'object', + properties: { + lumens: { + type: 'integer', + minimum: 0, + description: 'Light intensity measured in lumens.' + }, + sentAt: { + $ref: '#/components/schemas/sentAt' + } + } + }, + sentAt: { + type: 'string', + format: 'date-time', + description: 'Date and time when the message was sent.' + } + }, + parameters: { + streetlightId: { + description: 'The ID of the streetlight.' + } + }, + messageTraits: { + commonHeaders: { + headers: { + type: 'object', + properties: { + 'my-app-header': { + type: 'integer', + minimum: 0, + maximum: 100 + } + } + } + } + }, + operationTraits: { + kafka: { + bindings: { + kafka: { + clientId: { + type: 'string', + enum: [ + 'my-app-id' + ] + } + } + } + } + } + } + }; + const { document } = await parser.parse(documentRaw); + + const v3Document = document as AsyncAPIDocumentV3; + expect(v3Document).toBeInstanceOf(AsyncAPIDocumentV3); + const expectedOperationId = 'receiveLightMeasurement'; + const expectedChannelId = 'smartylighting.streetlights.1.0.event.{streetlightId}.lighting.measured'; + const operations = v3Document.operations(); + expect(operations.length).toEqual(1); + const operation = operations[0]; + expect(operation.id()).toEqual(expectedOperationId); + const operationChannels = operation.channels().all(); + expect(operationChannels.length).toEqual(1); + const lightMeasuredChannel = operationChannels[0]; + expect(lightMeasuredChannel.json()[xParserObjectUniqueId]).toEqual(expectedChannelId); + const channelOperations = lightMeasuredChannel.operations().all(); + expect(channelOperations.length).toEqual(1); + const circularOperation = channelOperations[0]; + expect(circularOperation.id()).toEqual(expectedOperationId); + + const channels = v3Document.channels(); + expect(channels.length).toEqual(1); + const channel = channels[0]; + expect(channel.json()[xParserObjectUniqueId]).toEqual(expectedChannelId); + const channelOperations2 = channel.operations().all(); + expect(channelOperations2.length).toEqual(1); + const operation2 = channelOperations2[0]; + expect(operation2.id()).toEqual(expectedOperationId); + }); +}); diff --git a/test/custom-operations/apply-unique-ids.spec.ts b/test/custom-operations/apply-unique-ids.spec.ts new file mode 100644 index 000000000..2fc32012b --- /dev/null +++ b/test/custom-operations/apply-unique-ids.spec.ts @@ -0,0 +1,30 @@ +import { applyUniqueIds } from '../../src/custom-operations'; + +describe('applying unique ids', function() { + it('should not do anything for v2 inputs', async function() { + const input = {asyncapi: '2.0.0'}; + const output = {...input}; + applyUniqueIds(output); + expect(input).toEqual(output); + }); + describe('for v3', function() { + it('should work with no channels input', async function() { + const input = {asyncapi: '3.0.0'}; + const output = {...input}; + applyUniqueIds(output); + expect(input).toEqual(output); + }); + it('should set unique id when input has channels', async function() { + const input = {asyncapi: '3.0.0', channels: {testChannel: {}}}; + const output = {...input, channels: {testChannel: {'x-parser-unique-object-id': 'testChannel'}}}; + applyUniqueIds(input); + expect(input).toEqual(output); + }); + it('should set unique id when input has messages in channels', async function() { + const input = {asyncapi: '3.0.0', channels: {testChannel: {messages: {testMessage: {}}}}}; + const output = {...input, channels: {testChannel: {'x-parser-unique-object-id': 'testChannel', messages: {testMessage: {'x-parser-unique-object-id': 'testMessage'}}}}}; + applyUniqueIds(input); + expect(input).toEqual(output); + }); + }); +}); diff --git a/test/custom-operations/check-circular-refs.spec.ts b/test/custom-operations/check-circular-refs.spec.ts new file mode 100644 index 000000000..89bfdb92c --- /dev/null +++ b/test/custom-operations/check-circular-refs.spec.ts @@ -0,0 +1,61 @@ +import { Parser } from '../../src/parser'; +import { xParserCircular } from '../../src/constants'; + +describe('custom operations - check circular references', function() { + const parser = new Parser(); + + it('should not assign x-parser-circular extension when document has not circular schemas', async function() { + const { document } = await parser.parse({ + asyncapi: '2.0.0', + info: { + title: 'Valid AsyncApi document', + version: '1.0', + }, + channels: { + channel: { + publish: { + operationId: 'operation', + message: { + payload: { + property1: { + $ref: '#/channels/channel/publish/message/payload/property2' + }, + property2: { + type: 'string', + } + }, + } + } + } + } + }); + + expect(document?.extensions().get(xParserCircular)?.value()).toEqual(undefined); + }); + + it('should assign x-parser-circular extension when document has circular schemas', async function() { + const { document } = await parser.parse({ + asyncapi: '2.0.0', + info: { + title: 'Valid AsyncApi document', + version: '1.0', + }, + channels: { + channel: { + publish: { + operationId: 'operation', + message: { + payload: { + property: { + $ref: '#/channels/channel/publish/message/payload' + }, + }, + } + } + } + } + }); + + expect(document?.extensions().get(xParserCircular)?.value()).toEqual(true); + }); +}); diff --git a/test/custom-operations/parse-schema.spec.ts b/test/custom-operations/parse-schema-v2.spec.ts similarity index 98% rename from test/custom-operations/parse-schema.spec.ts rename to test/custom-operations/parse-schema-v2.spec.ts index dfd71f293..8504bb64d 100644 --- a/test/custom-operations/parse-schema.spec.ts +++ b/test/custom-operations/parse-schema-v2.spec.ts @@ -3,7 +3,7 @@ import { Parser } from '../../src/parser'; import type { v2 } from '../../src/spec-types'; -describe('custom operations - parse schemas', function() { +describe('custom operations for v2 - parse schemas', function() { const parser = new Parser(); it('should parse valid schema format', async function() { diff --git a/test/custom-operations/parse-schema-v3.spec.ts b/test/custom-operations/parse-schema-v3.spec.ts new file mode 100644 index 000000000..6e56ed10a --- /dev/null +++ b/test/custom-operations/parse-schema-v3.spec.ts @@ -0,0 +1,135 @@ +import { AsyncAPIDocumentV3 } from '../../src/models'; +import { Parser } from '../../src/parser'; + +import type { v3 } from '../../src/spec-types'; + +describe('custom operations for v3 - parse schemas', function() { + const parser = new Parser(); + + it('should parse valid schema format and preserve reference', async function() { + const documentRaw = { + asyncapi: '3.0.0', + info: { + title: 'Valid AsyncApi document', + version: '1.0' + }, + channels: { + channel: { + $ref: '#/components/channels/channel' + } + }, + operations: { + operation: { + action: 'receive', + channel: { + $ref: '#/channels/channel' + }, + messages: [ + { + $ref: '#/channels/channel/messages/message' + } + ] + } + }, + components: { + channels: { + channel: { + address: 'channel', + messages: { + message: { + $ref: '#/components/messages/message' + } + } + } + }, + messages: { + message: { + headers: { + $ref: '#/components/schemas/schema' + }, + payload: { + $ref: '#/components/schemas/schema' + } + } + }, + schemas: { + schema: { + schemaFormat: 'application/vnd.aai.asyncapi;version=2.0.0', + schema: { + type: 'object' + } + } + } + } + }; + const { document, diagnostics } = await parser.parse(documentRaw); + + expect(document).toBeInstanceOf(AsyncAPIDocumentV3); + expect(diagnostics.length === 0).toEqual(true); + + expect(((document?.json()?.channels?.channel as v3.ChannelObject).messages?.message as v3.MessageObject)?.payload?.schema).toEqual({ type: 'object', 'x-parser-schema-id': '' }); + expect(((((document?.json() as any).operations?.operation as v3.OperationObject).channel as v3.ChannelObject)?.messages?.message as v3.MessageObject)?.payload?.schema).toEqual({ type: 'object', 'x-parser-schema-id': '' }); + expect((((document?.json() as any).operations?.operation as v3.OperationObject).messages?.[0] as v3.MessageObject)?.payload?.schema).toEqual({ type: 'object', 'x-parser-schema-id': '' }); + expect(((document?.json()?.components?.channels?.channel as v3.ChannelObject).messages?.message as v3.MessageObject)?.payload?.schema).toEqual({ type: 'object', 'x-parser-schema-id': '' }); + expect((document?.json()?.components?.messages?.message as v3.MessageObject)?.payload?.schema).toEqual({ type: 'object', 'x-parser-schema-id': '' }); + expect((((document?.json() as any).components?.messages?.message as v3.MessageObject)?.headers as v3.MultiFormatObject).schema).toEqual({ type: 'object', 'x-parser-schema-id': '' }); + expect((document?.json() as any).components?.schemas?.schema?.schema).toEqual({ type: 'object', 'x-parser-schema-id': '' }); + }); + + it('should parse valid default schema format', async function() { + const documentRaw = { + asyncapi: '3.0.0', + info: { + title: 'Valid AsyncApi document', + version: '1.0' + }, + channels: { + channel: { + address: 'channel', + messages: { + message: { + payload: { + type: 'object' + } + } + } + } + } + }; + const { document, diagnostics } = await parser.parse(documentRaw); + + expect(document).toBeInstanceOf(AsyncAPIDocumentV3); + expect(diagnostics.length === 0).toEqual(true); + + expect(((document?.json()?.channels?.channel as v3.ChannelObject).messages?.message as v3.MessageObject)?.payload).toEqual({ type: 'object', 'x-parser-schema-id': '' }); + }); + + it('should parse invalid schema format', async function() { + const documentRaw = { + asyncapi: '3.0.0', + info: { + title: 'Valid AsyncApi document', + version: '1.0' + }, + channels: { + channel: { + address: 'channel', + messages: { + message: { + payload: { + schemaFormat: 'not existing', + schema: { + type: 'object' + } + } + } + } + } + } + }; + const { document, diagnostics } = await parser.parse(documentRaw); + + expect(document).toBeUndefined(); + expect(diagnostics.length > 0).toEqual(true); + }); +}); diff --git a/test/document.spec.ts b/test/document.spec.ts index 3fd419bcb..c9fb0e5c0 100644 --- a/test/document.spec.ts +++ b/test/document.spec.ts @@ -1,5 +1,5 @@ import { xParserApiVersion, xParserSpecParsed, xParserSpecStringified } from '../src/constants'; -import { BaseModel, AsyncAPIDocumentV2 } from '../src/models'; +import { AsyncAPIDocumentInterface, BaseModel, AsyncAPIDocumentV2, AsyncAPIDocumentV3 } from '../src/models'; import { convertToOldAPI } from '../src/old-api'; import { Parser } from '../src/parser'; import { @@ -17,12 +17,17 @@ describe('utils', function() { class Model extends BaseModel {} describe('createAsyncAPIDocument()', function() { - it('should create a valid document from v2.0.0', function() { - const doc = { asyncapi: '2.0.0' }; + const cases = [ + [2, AsyncAPIDocumentV2], + [3, AsyncAPIDocumentV3], + ]; + + test.each(cases)('should create a valid document from a v%p.0.0 source', (majorVersion, expected) => { + const doc = { asyncapi: `${majorVersion}.0.0` }; const detailed = createDetailedAsyncAPI(doc as any, doc as any); const d = createAsyncAPIDocument(detailed); expect(d.version()).toEqual(doc.asyncapi); - expect(d).toBeInstanceOf(AsyncAPIDocumentV2); + expect(d).toBeInstanceOf(expected); }); it('should fail trying to create a document from a non supported spec version', function() { @@ -109,8 +114,16 @@ describe('utils', function() { expect(isAsyncAPIDocument(createAsyncAPIDocument(detailed))).toEqual(true); }); - it('document with the x-parser-api-version extension set to 1 should be AsyncAPI document', async function() { - expect(isAsyncAPIDocument({ json() { return { [xParserApiVersion]: 1 }; } })).toEqual(true); + it('document with the x-parser-api-version extension set to 3 should be AsyncAPI document', async function() { + expect(isAsyncAPIDocument({ json() { return { [xParserApiVersion]: 3 }; } })).toEqual(true); + }); + + it('document with the x-parser-api-version extension set to 2 should not be AsyncAPI document', async function() { + expect(isAsyncAPIDocument({ json() { return { [xParserApiVersion]: 2 }; } })).toEqual(false); + }); + + it('document with the x-parser-api-version extension set to 1 should not be AsyncAPI document', async function() { + expect(isAsyncAPIDocument({ json() { return { [xParserApiVersion]: 1 }; } })).toEqual(false); }); it('document with the x-parser-api-version extension set to 0 should not be AsyncAPI document', async function() { diff --git a/test/models/v2/asyncapi.spec.ts b/test/models/v2/asyncapi.spec.ts index 71e4e6ce1..3b5146ca9 100644 --- a/test/models/v2/asyncapi.spec.ts +++ b/test/models/v2/asyncapi.spec.ts @@ -7,6 +7,7 @@ import { Operations } from '../../../src/models/v2/operations'; import { Schemas } from '../../../src/models/v2/schemas'; import { SecuritySchemes } from '../../../src/models/v2/security-schemes'; import { Servers } from '../../../src/models/v2/servers'; +import { Collection } from '../../../src/models'; import { serializeInput, assertExtensions } from './utils'; @@ -189,6 +190,8 @@ describe('AsyncAPIDocument model', function() { const doc = serializeInput({ servers: { development: {} } }); const d = new AsyncAPIDocument(doc); expect(d.allServers()).toBeInstanceOf(Servers); + expect(d.allServers().all()).toBeInstanceOf(Array); + expect(d.allServers().all()).not.toBeInstanceOf(Collection); expect(d.allServers()).toHaveLength(1); expect(d.allServers().all()[0].id()).toEqual('development'); }); @@ -212,6 +215,8 @@ describe('AsyncAPIDocument model', function() { const doc = serializeInput({ channels: { 'user/signup': {} } }); const d = new AsyncAPIDocument(doc); expect(d.allChannels()).toBeInstanceOf(Channels); + expect(d.allChannels().all()).not.toBeInstanceOf(Collection); + expect(d.allChannels().all()).toBeInstanceOf(Array); expect(d.allChannels()).toHaveLength(1); expect(d.allChannels().all()[0].address()).toEqual('user/signup'); }); @@ -235,6 +240,8 @@ describe('AsyncAPIDocument model', function() { const doc = serializeInput({ channels: { 'user/signup': { publish: {}, subscribe: {} }, 'user/logout': { publish: {} } } }); const d = new AsyncAPIDocument(doc); expect(d.allOperations()).toBeInstanceOf(Operations); + expect(d.allOperations().all()).toBeInstanceOf(Array); + expect(d.allOperations().all()).not.toBeInstanceOf(Collection); expect(d.allOperations()).toHaveLength(3); }); @@ -257,6 +264,8 @@ describe('AsyncAPIDocument model', function() { it('should return a collection of messages', function() { const doc = serializeInput({ channels: { 'user/signup': { publish: { message: {} }, subscribe: { message: { oneOf: [{}, {}] } } }, 'user/logout': { publish: { message: {} } } } }); const d = new AsyncAPIDocument(doc); + expect(d.allMessages().all()).toBeInstanceOf(Array); + expect(d.allMessages().all()).not.toBeInstanceOf(Collection); expect(d.allMessages()).toBeInstanceOf(Messages); expect(d.allMessages()).toHaveLength(4); }); @@ -282,6 +291,8 @@ describe('AsyncAPIDocument model', function() { const doc = serializeInput({ channels: { 'user/signup': { publish: { message: { payload: {} } }, subscribe: { message: { oneOf: [{ payload: {} }, {}, { payload: {} }] } } }, 'user/logout': { publish: { message: { payload: {} } } } } }); const d = new AsyncAPIDocument(doc); expect(d.allSchemas()).toBeInstanceOf(Schemas); + expect(d.allSchemas().all()).toBeInstanceOf(Array); + expect(d.allSchemas().all()).not.toBeInstanceOf(Collection); expect(d.allSchemas()).toHaveLength(4); }); @@ -297,6 +308,14 @@ describe('AsyncAPIDocument model', function() { const d = new AsyncAPIDocument(doc); expect(d.allSchemas()).toBeInstanceOf(Schemas); }); + + it('should return a collection of schemas (with schemas from components) without duplicates', function() { + const sharedMessage = { payload: {} }; + const doc = serializeInput({ channels: { 'user/signup': { publish: { message: sharedMessage }, subscribe: { message: { oneOf: [{ payload: {} }, {}] } } }, 'user/logout': { publish: { message: { payload: {} } } } }, components: { messages: { aMessage: sharedMessage } } }); + const d = new AsyncAPIDocument(doc); + expect(d.allSchemas()).toBeInstanceOf(Schemas); + expect(d.allSchemas()).toHaveLength(3); + }); }); describe('mixins', function() { diff --git a/test/models/v2/channel.spec.ts b/test/models/v2/channel.spec.ts index 279969a8d..fc1a01a22 100644 --- a/test/models/v2/channel.spec.ts +++ b/test/models/v2/channel.spec.ts @@ -100,7 +100,7 @@ describe('Channel model', function() { expect(d.messages()).toBeInstanceOf(Messages); expect(d.messages().all()).toHaveLength(1); expect(d.messages().all()[0]).toBeInstanceOf(Message); - expect(d.messages().all()[0].messageId()).toEqual((doc as any).publish.message.messageId); + expect(d.messages().all()[0].id()).toEqual((doc as any).publish.message.messageId); }); it('should return collection of messages - oneOf message', function() { @@ -109,9 +109,9 @@ describe('Channel model', function() { expect(d.messages()).toBeInstanceOf(Messages); expect(d.messages().all()).toHaveLength(2); expect(d.messages().all()[0]).toBeInstanceOf(Message); - expect(d.messages().all()[0].messageId()).toEqual((doc as any).subscribe.message.oneOf[0].messageId); + expect(d.messages().all()[0].id()).toEqual((doc as any).subscribe.message.oneOf[0].messageId); expect(d.messages().all()[1]).toBeInstanceOf(Message); - expect(d.messages().all()[1].messageId()).toEqual((doc as any).subscribe.message.oneOf[1].messageId); + expect(d.messages().all()[1].id()).toEqual((doc as any).subscribe.message.oneOf[1].messageId); }); it('should return collection of messages - single message and oneOf', function() { diff --git a/test/models/v2/external-documentation.spec.ts b/test/models/v2/external-documentation.spec.ts new file mode 100644 index 000000000..e936f3842 --- /dev/null +++ b/test/models/v2/external-documentation.spec.ts @@ -0,0 +1,20 @@ +import { ExternalDocumentation } from '../../../src/models/v2/external-docs'; + +import { serializeInput, assertDescription, assertExtensions } from './utils'; + +import type { v2 } from '../../../src/spec-types'; + +describe('ExternalDocumentation model', function() { + describe('.url()', function() { + it('should return the value', function() { + const doc = serializeInput({ url: 'somewhere' }); + const d = new ExternalDocumentation(doc); + expect(d.url()).toEqual(doc.url); + }); + }); + + describe('mixins', function() { + assertDescription(ExternalDocumentation); + assertExtensions(ExternalDocumentation); + }); +}); diff --git a/test/models/v2/info.spec.ts b/test/models/v2/info.spec.ts index 9c581b355..33cd5d01b 100644 --- a/test/models/v2/info.spec.ts +++ b/test/models/v2/info.spec.ts @@ -29,14 +29,14 @@ describe('Info model', function() { describe('.hasId()', function() { it('should return true when there is a value', function() { - const doc = { asyncapi: '2.0.0', id: 'someId' }; + const doc = { asyncapi: '2.0.0', info: { title: 'test', version: 'test' }, id: 'someId' }; const asyncapi = createDetailedAsyncAPI(doc, doc as any); const d = new Info(serializeInput({}), { asyncapi, pointer: '/info' }); expect(d.hasId()).toEqual(true); }); it('should return false when there is no value', function() { - const doc = { asyncapi: '2.0.0' }; + const doc = { asyncapi: '2.0.0', info: { title: 'test', version: 'test' } }; const asyncapi = createDetailedAsyncAPI(doc, doc as any); const d = new Info(serializeInput({}), { asyncapi, pointer: '/info' }); expect(d.hasId()).toEqual(false); @@ -45,14 +45,14 @@ describe('Info model', function() { describe('.id()', function() { it('should return the value', function() { - const doc = { asyncapi: '2.0.0', id: 'someId' }; + const doc = { asyncapi: '2.0.0', info: { title: 'test', version: 'test' }, id: 'someId' }; const asyncapi = createDetailedAsyncAPI(doc, doc as any); const d = new Info(serializeInput({}), { asyncapi, pointer: '/info' }); expect(d.id()).toEqual(doc.id); }); it('should return undefined when there is no value', function() { - const doc = { asyncapi: '2.0.0' }; + const doc = { asyncapi: '2.0.0', info: { title: 'test', version: 'test' } }; const asyncapi = createDetailedAsyncAPI(doc, doc as any); const d = new Info(serializeInput({}), { asyncapi, pointer: '/info' }); expect(d.id()).toEqual(undefined); @@ -145,21 +145,21 @@ describe('Info model', function() { describe('.hasExternalDocs()', function() { it('should return true when there is a value', function() { - const doc = { asyncapi: '2.0.0', externalDocs: { url: 'https://example.com' } }; + const doc = { asyncapi: '2.0.0', info: { title: 'test', version: 'test' }, externalDocs: { url: 'https://example.com' } }; const asyncapi = createDetailedAsyncAPI(doc, doc as any); const d = new Info(serializeInput({}), { asyncapi, pointer: '/info' }); expect(d.hasExternalDocs()).toEqual(true); }); it('should return false when there is an empty object', function() { - const doc = { asyncapi: '2.0.0', externalDocs: {} }; + const doc = { asyncapi: '2.0.0', info: { title: 'test', version: 'test' }, externalDocs: {} }; const asyncapi = createDetailedAsyncAPI(doc, doc as any); const d = new Info(serializeInput({}), { asyncapi, pointer: '/info' }); expect(d.hasExternalDocs()).toEqual(false); }); it('should return false when there is no value', function() { - const doc = { asyncapi: '2.0.0' }; + const doc = { asyncapi: '2.0.0', info: { title: 'test', version: 'test' } }; const asyncapi = createDetailedAsyncAPI(doc, doc as any); const d = new Info(serializeInput({}), { asyncapi, pointer: '/info' }); expect(d.hasExternalDocs()).toEqual(false); @@ -168,7 +168,7 @@ describe('Info model', function() { describe('.externalDocs()', function() { it('should return the value', function() { - const doc = { asyncapi: '2.0.0', externalDocs: { url: 'https://example.com' } }; + const doc = { asyncapi: '2.0.0', info: { title: 'test', version: 'test' }, externalDocs: { url: 'https://example.com' } }; const asyncapi = createDetailedAsyncAPI(doc, doc as any); const d = new Info(serializeInput({}), { asyncapi, pointer: '/info' }); expect(d.externalDocs()).toBeInstanceOf(ExternalDocumentation); @@ -176,14 +176,14 @@ describe('Info model', function() { }); it('should return undefined when there is an empty object', function() { - const doc = { asyncapi: '2.0.0', externalDocs: {} }; + const doc = { asyncapi: '2.0.0', info: { title: 'test', version: 'test' }, externalDocs: {} }; const asyncapi = createDetailedAsyncAPI(doc, doc as any); const d = new Info(serializeInput({}), { asyncapi, pointer: '/info' }); expect(d.externalDocs()).toEqual(undefined); }); it('should return undefined when there is no value', function() { - const doc = { asyncapi: '2.0.0' }; + const doc = { asyncapi: '2.0.0', info: { title: 'test', version: 'test' } }; const asyncapi = createDetailedAsyncAPI(doc, doc as any); const d = new Info(serializeInput({}), { asyncapi, pointer: '/info' }); expect(d.externalDocs()).toEqual(undefined); @@ -193,7 +193,7 @@ describe('Info model', function() { describe('.tags()', function() { it('should return the collection of tags', function() { const tags = [{ name: 'one' }, { name: 'two' }]; - const doc = { asyncapi: '2.0.0', tags }; + const doc = { asyncapi: '2.0.0', info: { title: 'test', version: 'test' }, tags }; const asyncapi = createDetailedAsyncAPI(doc, doc as any); const d = new Info(serializeInput({}), { asyncapi, pointer: '/info' }); expect(d.tags()).toBeInstanceOf(Tags); @@ -203,7 +203,7 @@ describe('Info model', function() { }); it('should return empty array when there is an empty collection', function() { - const doc = { asyncapi: '2.0.0' }; + const doc = { asyncapi: '2.0.0', info: { title: 'test', version: 'test' } }; const asyncapi = createDetailedAsyncAPI(doc, doc as any); const d = new Info(serializeInput({}), { asyncapi, pointer: '/info' }); expect(d.tags()).toBeInstanceOf(Tags); diff --git a/test/models/v2/message-trait.spec.ts b/test/models/v2/message-trait.spec.ts index e2b2bc0d6..41382b330 100644 --- a/test/models/v2/message-trait.spec.ts +++ b/test/models/v2/message-trait.spec.ts @@ -53,13 +53,13 @@ describe('MessageTrait model', function() { it('should return the value', function() { const doc = { messageId: '...' }; const d = new MessageTrait(doc); - expect(d.messageId()).toEqual(doc.messageId); + expect(d.id()).toEqual(doc.messageId); }); it('should return undefined when there is no value', function() { const doc = {}; const d = new MessageTrait(doc); - expect(d.messageId()).toBeUndefined(); + expect(d.id()).toBeUndefined(); }); }); diff --git a/test/models/v2/message.spec.ts b/test/models/v2/message.spec.ts index 111031476..ab445a87e 100644 --- a/test/models/v2/message.spec.ts +++ b/test/models/v2/message.spec.ts @@ -26,16 +26,18 @@ describe('Message model', function() { }); }); - describe('.schemaFormat()', function() { + describe('.schemaFormat() + .hasSchemaFormat()', function() { it('should return defined schemaFormat', function() { const doc = { schemaFormat: 'customSchemaFormat' }; const d = new Message(doc, { asyncapi: {} as any, pointer: '', id: 'message' }); + expect(d.hasSchemaFormat()).toBeTruthy(); expect(d.schemaFormat()).toEqual('customSchemaFormat'); }); it('should return default schemaFormat if schemaFormat field is absent', function() { const doc = {}; const d = new Message(doc, { asyncapi: { semver: { version: '2.0.0' } } as any, pointer: '', id: 'message' }); + expect(d.hasSchemaFormat()).toBeTruthy(); expect(d.schemaFormat()).toEqual('application/vnd.aai.asyncapi;version=2.0.0'); }); }); diff --git a/test/models/v2/operation.spec.ts b/test/models/v2/operation.spec.ts index bed03a14f..ee076aba4 100644 --- a/test/models/v2/operation.spec.ts +++ b/test/models/v2/operation.spec.ts @@ -179,6 +179,14 @@ describe('Operation model', function() { }); }); + describe('.reply()', function() { + it('should return always undefined as it is not a feature part of v2', function() { + const doc = { reply: {} }; + const d = new Operation(doc); + expect(d.reply()).toBeUndefined(); + }); + }); + describe('.traits()', function() { it('should return collection of traits', function() { const doc = { traits: [{ operationId: '...' }] }; diff --git a/test/models/v2/schema.spec.ts b/test/models/v2/schema.spec.ts index 4e48b3366..391305bee 100644 --- a/test/models/v2/schema.spec.ts +++ b/test/models/v2/schema.spec.ts @@ -3,6 +3,8 @@ import { Schema } from '../../../src/models/v2/schema'; import { assertExtensions, assertExternalDocumentation } from './utils'; import { xParserSchemaId } from '../../../src/constants'; +import { getDefaultSchemaFormat } from '../../../src/schema-parser'; + import type { v2 } from '../../../src/spec-types'; describe('Channel model', function() { @@ -751,6 +753,20 @@ describe('Channel model', function() { }); }); + describe('.schemaFormat()', function() { + it('should return the format of the schema', function() { + const actualSchemaFormat = 'application/vnd.apache.avro;version=1.9.0'; + const d = new Schema({}, {asyncapi: {} as any, pointer: '', schemaFormat: actualSchemaFormat}); + expect(d.schemaFormat()).toEqual(actualSchemaFormat); + }); + + it('should return the default schema format where there is no value', function() { + const doc = {asyncapi: '2.6.0' }; + const d = new Schema(doc, {asyncapi: { semver: { version: doc.asyncapi } }}); + expect(d.schemaFormat()).toEqual(getDefaultSchemaFormat(doc.asyncapi)); + }); + }); + describe('.then()', function() { it('should return value', function() { const doc = { then: {} }; diff --git a/test/models/v2/server.spec.ts b/test/models/v2/server.spec.ts index 8a97b8cc7..bb98877ba 100644 --- a/test/models/v2/server.spec.ts +++ b/test/models/v2/server.spec.ts @@ -144,7 +144,7 @@ describe('Server Model', function () { expect(d.messages()).toBeInstanceOf(Messages); expect(d.messages().all()).toHaveLength(1); expect(d.messages().all()[0]).toBeInstanceOf(Message); - expect(d.messages().all()[0].messageId()).toEqual('1'); + expect(d.messages().all()[0].id()).toEqual('1'); }); it('should return collection of messages - multiple channels', function() { @@ -153,11 +153,11 @@ describe('Server Model', function () { expect(d.messages()).toBeInstanceOf(Messages); expect(d.messages().all()).toHaveLength(3); expect(d.messages().all()[0]).toBeInstanceOf(Message); - expect(d.messages().all()[0].messageId()).toEqual('1'); + expect(d.messages().all()[0].id()).toEqual('1'); expect(d.messages().all()[1]).toBeInstanceOf(Message); - expect(d.messages().all()[1].messageId()).toEqual('2'); + expect(d.messages().all()[1].id()).toEqual('2'); expect(d.messages().all()[2]).toBeInstanceOf(Message); - expect(d.messages().all()[2].messageId()).toEqual('3'); + expect(d.messages().all()[2].id()).toEqual('3'); }); it('should return collection of messages - server available only in particular channel', function() { @@ -166,11 +166,11 @@ describe('Server Model', function () { expect(d.messages()).toBeInstanceOf(Messages); expect(d.messages().all()).toHaveLength(3); expect(d.messages().all()[0]).toBeInstanceOf(Message); - expect(d.messages().all()[0].messageId()).toEqual('1'); + expect(d.messages().all()[0].id()).toEqual('1'); expect(d.messages().all()[1]).toBeInstanceOf(Message); - expect(d.messages().all()[1].messageId()).toEqual('2'); + expect(d.messages().all()[1].id()).toEqual('2'); expect(d.messages().all()[2]).toBeInstanceOf(Message); - expect(d.messages().all()[2].messageId()).toEqual('3'); + expect(d.messages().all()[2].id()).toEqual('3'); }); }); diff --git a/test/models/v3/asyncapi.spec.ts b/test/models/v3/asyncapi.spec.ts new file mode 100644 index 000000000..85e28e371 --- /dev/null +++ b/test/models/v3/asyncapi.spec.ts @@ -0,0 +1,316 @@ +import { AsyncAPIDocument } from '../../../src/models/v3/asyncapi'; +import { Channels } from '../../../src/models/v3/channels'; +import { Components } from '../../../src/models/v3/components'; +import { Info } from '../../../src/models/v3/info'; +import { Messages } from '../../../src/models/v3/messages'; +import { Operations } from '../../../src/models/v3/operations'; +import { Schemas } from '../../../src/models/v3/schemas'; +import { SecuritySchemes } from '../../../src/models/v3/security-schemes'; +import { Servers } from '../../../src/models/v3/servers'; + +import { serializeInput, assertExtensions } from './utils'; + +import type { v3 } from '../../../src/spec-types'; +import { Collection } from '../../../src/models'; + +describe('AsyncAPIDocument model', function() { + describe('.version()', function() { + it('should return the value', function() { + const doc = serializeInput({ asyncapi: '2.0.0' }); + const d = new AsyncAPIDocument(doc); + expect(d.version()).toEqual(doc.asyncapi); + }); + + it('should return undefined when there is no value', function() { + const doc = serializeInput({}); + const d = new AsyncAPIDocument(doc); + expect(d.version()).toBeUndefined(); + }); + }); + + describe('.hasDefaultContentType()', function() { + it('should return true when there is a value', function() { + const doc = serializeInput({ defaultContentType: '...' }); + const d = new AsyncAPIDocument(doc); + expect(d.hasDefaultContentType()).toEqual(true); + }); + + it('should return false when there is no value', function() { + const doc = serializeInput({}); + const d = new AsyncAPIDocument(doc); + expect(d.hasDefaultContentType()).toEqual(false); + }); + }); + + describe('.defaultContentType()', function() { + it('should return the value', function() { + const doc = serializeInput({ defaultContentType: '...' }); + const d = new AsyncAPIDocument(doc); + expect(d.defaultContentType()).toEqual(doc.defaultContentType); + }); + + it('should return undefined when there is no value', function() { + const doc = serializeInput({}); + const d = new AsyncAPIDocument(doc); + expect(d.defaultContentType()).toBeUndefined(); + }); + }); + + describe('.info()', function() { + it('should return an Info object', function() { + const doc = serializeInput({ info: {} }); + const d = new AsyncAPIDocument(doc); + expect(d.info()).toBeInstanceOf(Info); + }); + }); + + describe('.servers()', function() { + it('should return a collection of servers', function() { + const doc = serializeInput({ servers: { development: {} } }); + const d = new AsyncAPIDocument(doc); + expect(d.servers()).toBeInstanceOf(Servers); + expect(d.servers()).toHaveLength(1); + expect(d.servers().all()[0].id()).toEqual('development'); + }); + + it('should return a collection of servers even if servers are not defined', function() { + const doc = serializeInput({}); + const d = new AsyncAPIDocument(doc); + expect(d.servers()).toBeInstanceOf(Servers); + }); + }); + + describe('.channels()', function() { + it('should return a collection of channels', function() { + const doc = serializeInput({ channels: { userSignup: { address: 'user/signup' }, userLogout: { address: 'user/logout' } } }); + const d = new AsyncAPIDocument(doc); + expect(d.channels()).toBeInstanceOf(Channels); + expect(d.channels()).toHaveLength(2); + expect(d.channels().all()[0].address()).toEqual('user/signup'); + expect(d.channels().all()[1].address()).toEqual('user/logout'); + }); + + it('should return a collection of channels even if channels are not defined', function() { + const doc = serializeInput({}); + const d = new AsyncAPIDocument(doc); + expect(d.channels()).toBeInstanceOf(Channels); + }); + }); + + describe('.operations()', function() { + it('should return a collection of operations', function() { + const doc = serializeInput({ operations: { userSignup: {}, userLogout: {} } }); + const d = new AsyncAPIDocument(doc); + expect(d.operations()).toBeInstanceOf(Operations); + expect(d.operations()).toHaveLength(2); + }); + + it('should return a collection of operations even if operations are not defined', function() { + const doc = serializeInput({}); + const d = new AsyncAPIDocument(doc); + expect(d.operations()).toBeInstanceOf(Operations); + }); + }); + + describe('.messages()', function() { + it('should return a collection of messages', function() { + const duplicatedMessage = {}; + const doc = serializeInput({ channels: { userSignup: { address: 'user/signup', messages: { someMessage1: {}, someMessage2: duplicatedMessage } }, userLogout: { address: 'user/logout', messages: { someMessage3: duplicatedMessage } } } }); + const d = new AsyncAPIDocument(doc); + expect(d.messages()).toBeInstanceOf(Messages); + expect(d.messages()).toHaveLength(2); + }); + + it('should return a collection of messages even if messages are not defined', function() { + const doc = serializeInput({}); + const d = new AsyncAPIDocument(doc); + expect(d.messages()).toBeInstanceOf(Messages); + }); + }); + + describe('.schemas()', function() { + it('should return a collection of schemas', function() { + const doc = serializeInput({ channels: { userSignup: { address: 'user/signup', messages: { someMessage1: { payload: {}}, someMessage2: { payload: {} } } }, userLogout: { address: 'user/logout', messages: { someMessage3WithoutPayload: {} } } } }); + const d = new AsyncAPIDocument(doc); + expect(d.schemas()).toBeInstanceOf(Schemas); + expect(d.schemas()).toHaveLength(2); + }); + + it('should return only an "used" schemas (without schemas from components)', function() { + const doc = serializeInput({ channels: { userSignup: { address: 'user/signup', messages: { someMessage1: { payload: {}}, someMessage2: { payload: {} } } } }, components: { schemas: { schemaOne: {}, schemaTwo: {} } } }); + const d = new AsyncAPIDocument(doc); + expect(d.schemas()).toBeInstanceOf(Schemas); + expect(d.schemas()).toHaveLength(2); + }); + + it('should return a collection of schemas even if collection is empty', function() { + const doc = serializeInput({}); + const d = new AsyncAPIDocument(doc); + expect(d.schemas()).toBeInstanceOf(Schemas); + }); + }); + + describe('.securitySchemes()', function() { + it('should return a collection of securitySchemes', function() { + const doc = serializeInput({ components: { securitySchemes: { security1: { type: 'X509' }, security2: { type: 'apiKey' } } } }); + const d = new AsyncAPIDocument(doc); + expect(d.securitySchemes()).toBeInstanceOf(SecuritySchemes); + expect(d.securitySchemes()).toHaveLength(2); + }); + + it('should return a collection of securitySchemes even if securitySchemes are not defined', function() { + const doc = serializeInput({}); + const d = new AsyncAPIDocument(doc); + expect(d.securitySchemes()).toBeInstanceOf(SecuritySchemes); + }); + }); + + describe('.allMessages()', function() { + it('should return a collection of messages', function() { + const duplicatedMessage = {}; + const doc = serializeInput({ channels: { userSignup: { address: 'user/signup', messages: { someMessage1: {}, someMessage2: duplicatedMessage } }, userLogout: { address: 'user/logout', messages: { someMessage3: duplicatedMessage } } } }); + const d = new AsyncAPIDocument(doc); + expect(d.allMessages().all()).toBeInstanceOf(Array); + expect(d.allMessages().all()).not.toBeInstanceOf(Collection); + expect(d.allMessages()).toBeInstanceOf(Messages); + expect(d.allMessages()).toHaveLength(2); + }); + + it('should return all messages (with messages from components)', function() { + const duplicatedMessage = {}; + const doc = serializeInput({ channels: { userSignup: { address: 'user/signup', messages: { someMessage1: {}, someMessage2: duplicatedMessage } }, userLogout: { address: 'user/logout', messages: { someMessage3: duplicatedMessage } } }, components: { messages: { someMessage4: {}, someMessage5: {} } }}); + const d = new AsyncAPIDocument(doc); + expect(d.allMessages()).toBeInstanceOf(Messages); + expect(d.allMessages()).toHaveLength(4); + }); + + it('should return a collection of messages even if messages are not defined', function() { + const doc = serializeInput({}); + const d = new AsyncAPIDocument(doc); + expect(d.allMessages()).toBeInstanceOf(Messages); + }); + }); + + describe('.allSchemas()', function() { + it('should return a collection of schemas', function() { + const doc = serializeInput({ channels: { userSignup: { address: 'user/signup', messages: { someMessage1: { payload: {}}, someMessage2: { payload: {} } } }, userLogout: { address: 'user/logout', messages: { someMessage3WithoutPayload: {} } } } }); + const d = new AsyncAPIDocument(doc); + expect(d.allSchemas()).toBeInstanceOf(Schemas); + expect(d.allSchemas().all()).toBeInstanceOf(Array); + expect(d.allSchemas().all()).not.toBeInstanceOf(Collection); + expect(d.allSchemas()).toHaveLength(2); + }); + + it('should return all schemas (with schemas from components)', function() { + const doc = serializeInput({ channels: { userSignup: { address: 'user/signup', messages: { someMessage1: { payload: {}}, someMessage2: { payload: {} } } } }, components: { schemas: { schemaOne: {}, schemaTwo: {} } } }); + const d = new AsyncAPIDocument(doc); + expect(d.allSchemas()).toBeInstanceOf(Schemas); + expect(d.allSchemas()).toHaveLength(4); + }); + + it('should return a collection of schemas even if collection is empty', function() { + const doc = serializeInput({}); + const d = new AsyncAPIDocument(doc); + expect(d.allSchemas()).toBeInstanceOf(Schemas); + }); + it('should return a collection of schemas (with schemas from components) without duplicates', function() { + const sharedMessage = { payload: {} }; + const doc = serializeInput({ channels: { userSignup: { address: 'user/signup', messages: { someMessage1: { payload: {}}, someMessage2: sharedMessage } } }, components: { messages: { aMessage: sharedMessage } } }); + const d = new AsyncAPIDocument(doc); + expect(d.allSchemas()).toBeInstanceOf(Schemas); + expect(d.allSchemas()).toHaveLength(2); + }); + }); + + describe('.allServers()', function() { + it('should return a collection of servers', function() { + const doc = serializeInput({ servers: { development: {} } }); + const d = new AsyncAPIDocument(doc); + expect(d.allServers()).toBeInstanceOf(Servers); + expect(d.allServers().all()).toBeInstanceOf(Array); + expect(d.allServers().all()).not.toBeInstanceOf(Collection); + expect(d.allServers()).toHaveLength(1); + expect(d.allServers().all()[0].id()).toEqual('development'); + }); + + it('should return all servers (with servers from components)', function() { + const doc = serializeInput({ servers: { production: {} }, components: { servers: { development: {} } } }); + const d = new AsyncAPIDocument(doc); + expect(d.allServers()).toBeInstanceOf(Servers); + expect(d.allServers()).toHaveLength(2); + }); + + it('should return a collection of servers even if servers are not defined', function() { + const doc = serializeInput({}); + const d = new AsyncAPIDocument(doc); + expect(d.allServers()).toBeInstanceOf(Servers); + }); + }); + + describe('.allChannels()', function() { + it('should return a collection of channels', function() { + const doc = serializeInput({ channels: { 'user/signup': {} } }); + const d = new AsyncAPIDocument(doc); + expect(d.allChannels()).toBeInstanceOf(Channels); + expect(d.allChannels().all()).not.toBeInstanceOf(Collection); + expect(d.allChannels().all()).toBeInstanceOf(Array); + expect(d.allChannels()).toHaveLength(1); + }); + + it('should return all channels (with channels from components)', function() { + const doc = serializeInput({ channels: { 'user/signup': {} }, components: { channels: { someChannel1: {}, someChannel2: {} } } }); + const d = new AsyncAPIDocument(doc); + expect(d.allChannels()).toBeInstanceOf(Channels); + expect(d.allChannels()).toHaveLength(3); + }); + + it('should return a collection of channels even if channels are not defined', function() { + const doc = serializeInput({}); + const d = new AsyncAPIDocument(doc); + expect(d.allChannels()).toBeInstanceOf(Channels); + }); + }); + + describe('.allOperations()', function() { + it('should return a collection of operations', function() { + const doc = serializeInput({ operations: { userSignup: {}, userLogout: {} } }); + const d = new AsyncAPIDocument(doc); + expect(d.allOperations()).toBeInstanceOf(Operations); + expect(d.allOperations().all()).toBeInstanceOf(Array); + expect(d.allOperations().all()).not.toBeInstanceOf(Collection); + expect(d.allOperations()).toHaveLength(2); + }); + + it('should return all operations (with operations from components)', function() { + const duplicatedOperation = { }; + const doc = serializeInput({ operations: { userSignup: duplicatedOperation, userLogout: {} }, components: { operations: { someOperation1: duplicatedOperation, someOperation2: {} } } }); + const d = new AsyncAPIDocument(doc); + expect(d.allOperations()).toBeInstanceOf(Operations); + expect(d.allOperations()).toHaveLength(3); + }); + + it('should return a collection of operations even if operations are not defined', function() { + const doc = serializeInput({}); + const d = new AsyncAPIDocument(doc); + expect(d.allOperations()).toBeInstanceOf(Operations); + }); + }); + + describe('.components()', function() { + it('should return a components model', function() { + const doc = serializeInput({ components: {} }); + const d = new AsyncAPIDocument(doc); + expect(d.components()).toBeInstanceOf(Components); + }); + + it('should return a components model even if components are not defined', function() { + const doc = serializeInput({}); + const d = new AsyncAPIDocument(doc); + expect(d.components()).toBeInstanceOf(Components); + }); + }); + + describe('mixins', function() { + assertExtensions(AsyncAPIDocument); + }); +}); diff --git a/test/models/v3/bindings.spec.ts b/test/models/v3/bindings.spec.ts new file mode 100644 index 000000000..5a39163f0 --- /dev/null +++ b/test/models/v3/bindings.spec.ts @@ -0,0 +1,64 @@ +import { Bindings } from '../../../src/models/v3/bindings'; +import { Binding } from '../../../src/models/v3/binding'; +import { Extensions } from '../../../src/models/v3/extensions'; +import { Extension } from '../../../src/models/v3/extension'; + +const binding = { + http: {} +}; +const bindingItem = new Binding(binding, { asyncapi: {} as any, pointer: '', protocol: 'http' }); + +describe('Bindings model', function () { + describe('.isEmpty()', function () { + it('should return true if collection is empty', function () { + const bindings = new Bindings([]); + expect(bindings.isEmpty()).toEqual(true); + }); + + it('should return false if collection is not empty', function () { + const bindings = new Bindings([bindingItem]); + expect(bindings.isEmpty()).toEqual(false); + }); + }); + + describe('.get(id)', function () { + it('should return a specific Message Trait if it is present', function () { + const bindings = new Bindings([bindingItem]); + expect(bindings.get('http')).toBeTruthy(); + }); + + it('should return undefined if specific Message Trait is missing', function () { + const bindings = new Bindings([]); + expect(bindings.get('anotherProtocol')).toBeUndefined(); + }); + }); + + describe('.has(id)', function () { + it('should return true if the said id is available', function () { + const bindings = new Bindings([bindingItem]); + expect(bindings.has('http')).toEqual(true); + }); + + it('should return false if the Message Trait id is missing', function () { + const bindings = new Bindings([bindingItem]); + expect(bindings.has('anotherProtocol')).toEqual(false); + }); + }); + + describe('.extensions()', function () { + it('should return empty collection of extensions', function () { + const bindings = new Bindings([], {}); + expect(bindings.extensions()).toBeInstanceOf(Extensions); + expect(bindings.extensions().isEmpty()).toEqual(true); + }); + + it('should return collection of extensions', function () { + const bindings = new Bindings([], { asyncapi: {} as any, originalData: { 'x-someExtension': { someKey: 'someValue' } as any, 'x-anotherOne': { someKey: 123 } as any } }); + expect(bindings.extensions()).toBeInstanceOf(Extensions); + expect(bindings.extensions().get('x-someExtension')).toBeInstanceOf(Extension); + expect(bindings.extensions().get('x-someExtension')?.value()).toEqual({ someKey: 'someValue' }); + expect(bindings.extensions().get('x-anotherOne')).toBeInstanceOf(Extension); + expect(bindings.extensions().get('x-anotherOne')?.value()).toEqual({ someKey: 123 }); + }); + }); +}); diff --git a/test/models/v3/channel-parameter.spec.ts b/test/models/v3/channel-parameter.spec.ts new file mode 100644 index 000000000..fa54a2d1b --- /dev/null +++ b/test/models/v3/channel-parameter.spec.ts @@ -0,0 +1,108 @@ +import { ChannelParameter } from '../../../src/models/v3/channel-parameter'; +import { Schema } from '../../../src/models/v3/schema'; + +import { serializeInput, assertDescription, assertExtensions } from './utils'; + +import type { v3 } from '../../../src/spec-types'; + +describe('ChannelParameter model', function() { + describe('.id()', function() { + it('should return id of model', function() { + const doc = serializeInput({}); + const d = new ChannelParameter(doc, { asyncapi: {} as any, pointer: '', id: 'parameter' }); + expect(d.id()).toEqual('parameter'); + }); + }); + + describe('.hasLocation()', function() { + it('should return true when there is a value', function() { + const doc = serializeInput({ location: '...' }); + const d = new ChannelParameter(doc); + expect(d.hasLocation()).toEqual(true); + }); + + it('should return false when there is no value', function() { + const doc = serializeInput({}); + const d = new ChannelParameter(doc); + expect(d.hasLocation()).toEqual(false); + }); + }); + + describe('.location()', function() { + it('should return the value', function() { + const doc = serializeInput({ location: '...' }); + const d = new ChannelParameter(doc); + expect(d.location()).toEqual(doc.location); + }); + + it('should return undefined when there is no value', function() { + const doc = serializeInput({}); + const d = new ChannelParameter(doc); + expect(d.location()).toBeUndefined(); + }); + }); + + describe('.hasSchema()', function() { + it('should return true if enum are sat', function() { + const doc = serializeInput({ enum: ['test'] }); + const d = new ChannelParameter(doc); + expect(d.hasSchema()).toEqual(true); + }); + it('should return true if default are sat', function() { + const doc = serializeInput({ default: 'test' }); + const d = new ChannelParameter(doc); + expect(d.hasSchema()).toEqual(true); + }); + + it('should return true if examples are sat', function() { + const doc = serializeInput({ examples: ['test'] }); + const d = new ChannelParameter(doc); + expect(d.hasSchema()).toEqual(true); + }); + + it('should return true when there is no value', function() { + const doc = serializeInput({}); + const d = new ChannelParameter(doc); + expect(d.hasSchema()).toEqual(true); + }); + }); + + describe('.schema()', function() { + it('should be able to access enum values', function() { + const doc = serializeInput({ enum: ['test'] }); + const d = new ChannelParameter(doc); + expect(d.schema()).toBeInstanceOf(Schema); + expect(d.schema()?.enum()).toEqual(['test']); + }); + it('should be able to access examples values', function() { + const doc = serializeInput({ examples: ['test'] }); + const d = new ChannelParameter(doc); + expect(d.schema()).toBeInstanceOf(Schema); + expect(d.schema()?.examples()).toEqual(['test']); + }); + it('should be able to access default value', function() { + const doc = serializeInput({ default: 'test' }); + const d = new ChannelParameter(doc); + expect(d.schema()).toBeInstanceOf(Schema); + expect(d.schema()?.default()).toEqual('test'); + }); + + it('should be able to access description value', function() { + const doc = serializeInput({ description: 'test' }); + const d = new ChannelParameter(doc); + expect(d.schema()).toBeInstanceOf(Schema); + expect(d.schema()?.description()).toEqual('test'); + }); + it('should return empty schema with type string when there is no value', function() { + const doc = serializeInput({}); + const d = new ChannelParameter(doc); + expect(d.schema()).toBeInstanceOf(Schema); + expect(d.schema()?.type()).toEqual('string'); + }); + }); + + describe('mixins', function() { + assertDescription(ChannelParameter); + assertExtensions(ChannelParameter); + }); +}); diff --git a/test/models/v3/channel.spec.ts b/test/models/v3/channel.spec.ts new file mode 100644 index 000000000..a444b1c62 --- /dev/null +++ b/test/models/v3/channel.spec.ts @@ -0,0 +1,140 @@ +import { Channel } from '../../../src/models/v3/channel'; +import { ChannelParameters } from '../../../src/models/v3/channel-parameters'; +import { ChannelParameter } from '../../../src/models/v3/channel-parameter'; +import { Operations } from '../../../src/models/v3/operations'; +import { Operation } from '../../../src/models/v3/operation'; +import { Messages } from '../../../src/models/v3/messages'; +import { Message } from '../../../src/models/v3/message'; +import { Servers } from '../../../src/models/v3/servers'; +import { Server } from '../../../src/models/v3/server'; + +import { serializeInput, assertCoreModel } from './utils'; + +import type { v3 } from '../../../src/spec-types'; + +describe('Channel model', function() { + describe('.id()', function() { + it('should return id of model', function() { + const doc = serializeInput({}); + const d = new Channel(doc, { asyncapi: {} as any, pointer: '', id: 'channel' }); + expect(d.id()).toEqual('channel'); + }); + }); + + describe('.address()', function() { + it('should return the value', function() { + const doc = serializeInput({ address: 'user/signup' }); + const d = new Channel(doc, { asyncapi: {} as any, pointer: '', id: 'channel' }); + expect(d.address()).toEqual('user/signup'); + }); + }); + + describe('.servers()', function() { + it('should return collection of servers - available on all servers', function() { + const doc = serializeInput({}); + const d = new Channel(doc, { asyncapi: { parsed: { servers: { someServer1: {}, someServer2: {}, } } } as any, pointer: '', id: 'channel' }); + expect(d.servers()).toBeInstanceOf(Servers); + expect(d.servers().all()).toHaveLength(2); + expect(d.servers().all()[0]).toBeInstanceOf(Server); + expect(d.servers().all()[0].id()).toEqual('someServer1'); + expect(d.servers().all()[1]).toBeInstanceOf(Server); + expect(d.servers().all()[1].id()).toEqual('someServer2'); + }); + + it('should return collection of servers - available on all servers (empty servers array)', function() { + const doc = serializeInput({ servers: [] }); + const d = new Channel(doc, { asyncapi: { parsed: { servers: { someServer1: {}, someServer2: {}, } } } as any, pointer: '', id: 'channel' }); + expect(d.servers()).toBeInstanceOf(Servers); + expect(d.servers().all()).toHaveLength(2); + expect(d.servers().all()[0]).toBeInstanceOf(Server); + expect(d.servers().all()[0].id()).toEqual('someServer1'); + expect(d.servers().all()[1]).toBeInstanceOf(Server); + expect(d.servers().all()[1].id()).toEqual('someServer2'); + }); + + it('should return collection of servers - available only on particular ones', function() { + const someServer2 = {}; + const doc = serializeInput({ servers: [someServer2] }); + const d = new Channel(doc, { asyncapi: { parsed: { servers: { someServer1: {}, someServer2, } } } as any, pointer: '', id: 'channel' }); + expect(d.servers()).toBeInstanceOf(Servers); + expect(d.servers().all()).toHaveLength(1); + expect(d.servers().all()[0]).toBeInstanceOf(Server); + expect(d.servers().all()[0].id()).toEqual('someServer2'); + }); + }); + + describe('.operations()', function() { + it('should return collection of operations - send operation', function() { + const channel = {}; + const d = new Channel(channel, { asyncapi: { parsed: { operations: { someOperation: { action: 'send', channel } } } } } as any); + expect(d.operations()).toBeInstanceOf(Operations); + expect(d.operations().all()).toHaveLength(1); + expect(d.operations().all()[0]).toBeInstanceOf(Operation); + expect(d.operations().all()[0].action()).toEqual('send'); + }); + + it('should return collection of operations - receive operation', function() { + const channel = {}; + const d = new Channel(channel, { asyncapi: { parsed: { operations: { someOperation: { action: 'receive', channel } } } } } as any); + expect(d.operations()).toBeInstanceOf(Operations); + expect(d.operations().all()).toHaveLength(1); + expect(d.operations().all()[0]).toBeInstanceOf(Operation); + expect(d.operations().all()[0].action()).toEqual('receive'); + }); + + it('should return collection of operations - more than one operations', function() { + const channel = {}; + const d = new Channel(channel, { asyncapi: { parsed: { operations: { someOperation1: { action: 'send', channel }, someOperation2: { action: 'receive', channel }, someOperation3: { action: 'send', channel } } } } } as any); + expect(d.operations()).toBeInstanceOf(Operations); + expect(d.operations().all()).toHaveLength(3); + expect(d.operations().all()[0]).toBeInstanceOf(Operation); + expect(d.operations().all()[0].action()).toEqual('send'); + expect(d.operations().all()[1]).toBeInstanceOf(Operation); + expect(d.operations().all()[1].action()).toEqual('receive'); + expect(d.operations().all()[2]).toBeInstanceOf(Operation); + expect(d.operations().all()[2].action()).toEqual('send'); + }); + }); + + describe('.messages()', function() { + it('should return collection of messages - single message', function() { + const doc = serializeInput({ messages: { someMessage: {} } }); + const d = new Channel(doc); + const msg = doc.messages?.['someMessage'] as v3.MessageObject; + expect(d.messages()).toBeInstanceOf(Messages); + expect(d.messages().all()).toHaveLength(1); + expect(d.messages().all()[0]).toBeInstanceOf(Message); + expect(d.messages().all()[0].id()).toEqual('someMessage'); + }); + + it('should return collection of messages - more than one messages', function() { + const doc = serializeInput({ messages: { someMessage1: {}, someMessage2: {} } }); + const d = new Channel(doc); + const msg1 = doc.messages?.['someMessage1'] as v3.MessageObject; + const msg2 = doc.messages?.['someMessage2'] as v3.MessageObject; + expect(d.messages()).toBeInstanceOf(Messages); + expect(d.messages().all()).toHaveLength(2); + expect(d.messages().all()[0]).toBeInstanceOf(Message); + expect(d.messages().all()[0].id()).toEqual('someMessage1'); + expect(d.messages().all()[1]).toBeInstanceOf(Message); + expect(d.messages().all()[1].id()).toEqual('someMessage2'); + }); + }); + + describe('.parameters()', function() { + it('should return collection of channel parameters', function() { + const doc = serializeInput({ parameters: { parameter1: {}, parameter2: {} } }); + const d = new Channel(doc); + expect(d.parameters()).toBeInstanceOf(ChannelParameters); + expect(d.parameters().all()).toHaveLength(2); + expect(d.parameters().all()[0]).toBeInstanceOf(ChannelParameter); + expect(d.parameters().all()[0].id()).toEqual('parameter1'); + expect(d.parameters().all()[1]).toBeInstanceOf(ChannelParameter); + expect(d.parameters().all()[1].id()).toEqual('parameter2'); + }); + }); + + describe('mixins', function() { + assertCoreModel(Channel); + }); +}); diff --git a/test/models/v3/components.spec.ts b/test/models/v3/components.spec.ts new file mode 100644 index 000000000..623b9b2a9 --- /dev/null +++ b/test/models/v3/components.spec.ts @@ -0,0 +1,379 @@ +import { Components } from '../../../src/models/v3/components'; +import { Bindings } from '../../../src/models/v3/bindings'; +import { Channel } from '../../../src/models/v3/channel'; +import { ChannelParameter } from '../../../src/models/v3/channel-parameter'; +import { CorrelationId } from '../../../src/models/v3/correlation-id'; +import { OperationTrait } from '../../../src/models/v3/operation-trait'; +import { OperationReply } from '../../../src/models/v3/operation-reply'; +import { OperationReplyAddress } from '../../../src/models/v3/operation-reply-address'; +import { Message } from '../../../src/models/v3/message'; +import { MessageTrait } from '../../../src/models/v3/message-trait'; +import { Schema } from '../../../src/models/v3/schema'; +import { Server } from '../../../src/models/v3/server'; +import { ServerVariable } from '../../../src/models/v3/server-variable'; +import { SecurityScheme } from '../../../src/models/v3/security-scheme'; +import { BaseModel, ModelMetadata } from '../../../src/models'; +import { Servers } from '../../../src/models/v3/servers'; +import { Channels } from '../../../src/models/v3/channels'; +import { Messages } from '../../../src/models/v3/messages'; +import { Collection } from '../../../src/models/collection'; +import { Constructor } from '../../../src/models/utils'; +import { Schemas } from '../../../src/models/v3/schemas'; +import { ChannelParameters } from '../../../src/models/v3/channel-parameters'; +import { ServerVariables } from '../../../src/models/v3/server-variables'; +import { OperationTraits } from '../../../src/models/v3/operation-traits'; +import { OperationReplies } from '../../../src/models/v3/operation-replies'; +import { OperationReplyAddresses } from '../../../src/models/v3/operation-reply-addresses'; +import { MessageTraits } from '../../../src/models/v3/message-traits'; +import { CorrelationIds } from '../../../src/models/v3/correlation-ids'; +import { SecuritySchemes } from '../../../src/models/v3/security-schemes'; +import { Operation } from '../../../src/models/v3/operation'; +import { Operations } from '../../../src/models/v3/operations'; +import { Tags } from '../../../src/models/v3/tags'; +import { Tag } from '../../../src/models/v3/tag'; +import { ExternalDocumentations } from '../../../src/models/external-documentations'; +import { ExternalDocumentation } from '../../../src/models/v3/external-docs'; +import { serializeInput, assertExtensions } from './utils'; + +import type { v3 } from '../../../src/spec-types'; + +describe('Components model', function() { + describe('.servers()', function() { + it('should return Servers with Server Object', function() { + const doc = serializeInput({ servers: { server: {} } }); + + const d = new Components(doc); + testCollection(doc, d.servers(), 'servers', Servers, Server); + }); + + it('should return Servers with empty server objects when servers are not defined', function() { + const doc = serializeInput({}); + const d = new Components(doc); + const items = d.servers(); + expect(items).toBeInstanceOf(Servers); + expect(items.all()).toHaveLength(0); + }); + }); + + describe('.channels()', function() { + it('should return Channels with Channel Object', function() { + const doc = serializeInput({ channels: { channel: {} } }); + const d = new Components(doc); + const items = d.channels(); + expect(items).toBeInstanceOf(Channels); + expect(items.all()).toEqual([ + new Channel(doc.channels?.channel as v3.ChannelObject, {id: 'channel', pointer: '/components/channels/channel'} as ModelMetadata & { id: string, address: string } | undefined) + ]); + }); + + it('should return Channels with empty channel objects when channels are not defined', function() { + const doc = serializeInput({}); + const d = new Components(doc); + const items = d.channels(); + expect(items).toBeInstanceOf(Channels); + expect(items.all()).toHaveLength(0); + }); + }); + + describe('.operations()', function() { + it('should return Operations with Operation Object', function() { + const doc = serializeInput({ operations: { someOperation: {} } }); + const d = new Components(doc); + testCollection(doc, d.operations(), 'operations', Operations, Operation); + }); + + it('should return Operations with empty operations objects when operations are not defined', function() { + const doc = serializeInput({}); + const d = new Components(doc); + const items = d.operations(); + expect(items).toBeInstanceOf(Operations); + expect(items.all()).toHaveLength(0); + }); + }); + + describe('.messages()', function() { + it('should return Messages with Message Object', function() { + const doc = serializeInput({ messages: { message: {} } }); + const d = new Components(doc); + testCollection(doc, d.messages(), 'messages', Messages, Message); + }); + + it('should return Messages with empty message objects when messages are not defined', function() { + const doc = serializeInput({}); + const d = new Components(doc); + const items = d.messages(); + expect(items).toBeInstanceOf(Messages); + expect(items.all()).toHaveLength(0); + }); + }); + + describe('.schemas()', function() { + it('should return Schemas with Schema Object', function() { + const doc = serializeInput({ schemas: { schema: {} } }); + const d = new Components(doc); + testCollection(doc, d.schemas(), 'schemas', Schemas, Schema); + }); + + it('should return Schemas with empty schema objects when schemas are not defined', function() { + const doc = serializeInput({}); + const d = new Components(doc); + const items = d.schemas(); + expect(items).toBeInstanceOf(Schemas); + expect(items.all()).toHaveLength(0); + }); + }); + + describe('.channelParameters()', function() { + it('should return ChannelParameters with ChannelParameter Object', function() { + const doc = serializeInput({ parameters: { parameter: {} } }); + const d = new Components(doc); + testCollection(doc, d.channelParameters(), 'parameters', ChannelParameters, ChannelParameter); + }); + + it('should return Schemas with empty schema objects when schemas are not defined', function() { + const doc = serializeInput({}); + const d = new Components(doc); + const items = d.channelParameters(); + expect(items).toBeInstanceOf(ChannelParameters); + expect(items.all()).toHaveLength(0); + }); + }); + + describe('.serverVariables()', function() { + it('should return ServerVariables with ServerVariable Object', function() { + const doc = serializeInput({ serverVariables: { variable: {} } }); + const d = new Components(doc); + testCollection(doc, d.serverVariables(), 'serverVariables', ServerVariables, ServerVariable); + }); + + it('should return ServerVariables with empty serverVariable objects when serverVariables are not defined', function() { + const doc = serializeInput({}); + const d = new Components(doc); + const items = d.serverVariables(); + expect(items).toBeInstanceOf(ServerVariables); + expect(items.all()).toHaveLength(0); + }); + }); + + describe('.operationTraits()', function() { + it('should return OperationTraits with OperationTrait Object', function() { + const doc = serializeInput({ operationTraits: { trait: {} } }); + const d = new Components(doc); + testCollection(doc, d.operationTraits(), 'operationTraits', OperationTraits, OperationTrait); + }); + + it('should return OperationTraits with empty operationTrait objects when operationTraits are not defined', function() { + const doc = serializeInput({}); + const d = new Components(doc); + const items = d.operationTraits(); + expect(items).toBeInstanceOf(OperationTraits); + expect(items.all()).toHaveLength(0); + }); + }); + + describe('.messageTraits()', function() { + it('should return MessageTraits with MessageTrait Object', function() { + const doc = serializeInput({ messageTraits: { trait: {} } }); + const d = new Components(doc); + testCollection(doc, d.messageTraits(), 'messageTraits', MessageTraits, MessageTrait); + }); + + it('should return MessageTraits with empty messageTrait objects when messageTraits are not defined', function() { + const doc = serializeInput({}); + const d = new Components(doc); + const items = d.messageTraits(); + expect(items).toBeInstanceOf(MessageTraits); + expect(items.all()).toHaveLength(0); + }); + }); + + describe('.replies()', function() { + it('should return OperationReplies with OperationReply Object', function() { + const doc = serializeInput({ replies: { reply: {} } }); + const d = new Components(doc); + testCollection(doc, d.replies(), 'replies', OperationReplies, OperationReply); + }); + + it('should return OperationReplies with empty reply objects when replies are not defined', function() { + const doc = serializeInput({}); + const d = new Components(doc); + const items = d.replies(); + expect(items).toBeInstanceOf(OperationReplies); + expect(items.all()).toHaveLength(0); + }); + }); + + describe('.replyAddresses()', function() { + it('should return OperationRepliesAddresses with OperationReplyAddress Object', function() { + const doc = serializeInput({ replyAddresses: { address: {} } }); + const d = new Components(doc); + testCollection(doc, d.replyAddresses(), 'replyAddresses', OperationReplyAddresses, OperationReplyAddress); + }); + + it('should return OperationRepliesAddresses with empty reply objects when replyAddresses are not defined', function() { + const doc = serializeInput({}); + const d = new Components(doc); + const items = d.replyAddresses(); + expect(items).toBeInstanceOf(OperationReplyAddresses); + expect(items.all()).toHaveLength(0); + }); + }); + + describe('.correlationIds()', function() { + it('should return CorrelationIds with CorrelationId Object', function() { + const doc = serializeInput({ correlationIds: { id: {} } }); + const d = new Components(doc); + testCollection(doc, d.correlationIds(), 'correlationIds', CorrelationIds, CorrelationId); + }); + + it('should return CorrelationIds with empty correlationId objects when correlationIds are not defined', function() { + const doc = serializeInput({}); + const d = new Components(doc); + const items = d.correlationIds(); + expect(items).toBeInstanceOf(CorrelationIds); + expect(items.all()).toHaveLength(0); + }); + }); + + describe('.securitySchemes()', function() { + it('should return SecuritySchemes with SecurityScheme Object', function() { + const doc = serializeInput({ securitySchemes: { scheme: {} } }); + const d = new Components(doc); + testCollection(doc, d.securitySchemes(), 'securitySchemes', SecuritySchemes, SecurityScheme); + }); + + it('should return SecuritySchemes with empty securityScheme objects when securitySchemes are not defined', function() { + const doc = serializeInput({}); + const d = new Components(doc); + const items = d.securitySchemes(); + expect(items).toBeInstanceOf(SecuritySchemes); + expect(items.all()).toHaveLength(0); + }); + }); + + describe('.tags()', function() { + it('should return Tags with Tag Object', function() { + const doc = serializeInput({ tags: { tag: { name: 'tag' } } }); + const d = new Components(doc); + testCollection(doc, d.tags(), 'tags', Tags, Tag); + }); + + it('should return Tags with empty tag objects when tags are not defined', function() { + const doc = {}; + const d = new Components(doc); + const tags = d.tags(); + expect(tags).toBeInstanceOf(Tags); + expect(tags.all()).toHaveLength(0); + }); + }); + + describe('.externalDocs()', function() { + it('should return ExternalDocumentations with ExternalDocumentation Object', function() { + const doc = serializeInput({ externalDocs: { someDoc: {} } }); + const d = new Components(doc); + testCollection(doc, d.externalDocs(), 'externalDocs', ExternalDocumentations, ExternalDocumentation); + }); + + it('should return ExternalDocumentations with empty externalDocs objects when externalDocs are not defined', function() { + const doc = {}; + const d = new Components(doc); + const externalDocs = d.externalDocs(); + expect(externalDocs).toBeInstanceOf(ExternalDocumentations); + expect(externalDocs.all()).toHaveLength(0); + }); + }); + + describe('.serverBindings()', function() { + it('should return map of serverBindings', function() { + const doc = serializeInput({ serverBindings: { binding: {} } }); + const d = new Components(doc); + expect(typeof d.serverBindings()).toEqual('object'); + expect(Object.keys(d.serverBindings())).toHaveLength(1); + expect(d.serverBindings()['binding']).toBeInstanceOf(Bindings); + }); + + it('should return empty map when serverBindings are not defined', function() { + const doc = serializeInput({}); + const d = new Components(doc); + expect(typeof d.serverBindings()).toEqual('object'); + expect(Object.keys(d.serverBindings())).toHaveLength(0); + }); + }); + + describe('.channelBindings()', function() { + it('should return map of channelBindings', function() { + const doc = serializeInput({ channelBindings: { binding: {} } }); + const d = new Components(doc); + expect(typeof d.channelBindings()).toEqual('object'); + expect(Object.keys(d.channelBindings())).toHaveLength(1); + expect(d.channelBindings()['binding']).toBeInstanceOf(Bindings); + }); + + it('should return empty map when channelBindings are not defined', function() { + const doc = serializeInput({}); + const d = new Components(doc); + expect(typeof d.channelBindings()).toEqual('object'); + expect(Object.keys(d.channelBindings())).toHaveLength(0); + }); + }); + + describe('.operationBindings()', function() { + it('should return map of operationBindings', function() { + const doc = serializeInput({ operationBindings: { binding: {} } }); + const d = new Components(doc); + expect(typeof d.operationBindings()).toEqual('object'); + expect(Object.keys(d.operationBindings())).toHaveLength(1); + expect(d.operationBindings()['binding']).toBeInstanceOf(Bindings); + }); + + it('should return empty map when operationBindings are not defined', function() { + const doc = serializeInput({}); + const d = new Components(doc); + expect(typeof d.operationBindings()).toEqual('object'); + expect(Object.keys(d.operationBindings())).toHaveLength(0); + }); + }); + + describe('.messageBindings()', function() { + it('should return map of messageBindings', function() { + const doc = serializeInput({ messageBindings: { binding: {} } }); + const d = new Components(doc); + expect(typeof d.messageBindings()).toEqual('object'); + expect(Object.keys(d.messageBindings())).toHaveLength(1); + expect(d.messageBindings()['binding']).toBeInstanceOf(Bindings); + }); + + it('should return empty map when messageBindings are not defined', function() { + const doc = serializeInput({}); + const d = new Components(doc); + expect(typeof d.messageBindings()).toEqual('object'); + expect(Object.keys(d.messageBindings())).toHaveLength(0); + }); + }); + + describe('.isEmpty()', function() { + it('should return true if _json is empty', function() { + const d = new Components({}); + expect(d.isEmpty()).toBeTruthy(); + }); + + it('should return false if _json is not empty', function() { + const d = new Components({ schemas: { test: {} } }); + expect(d.isEmpty()).toBeFalsy(); + }); + }); + + describe('mixins', function() { + assertExtensions(Components); + }); +}); + +function testCollection, T extends BaseModel>(doc: any, items: M, componentName: string, collectionModel: Constructor, itemModel: Constructor) { + expect(items).toBeInstanceOf(collectionModel); + const expectedItems: T[] = []; + Object.entries((doc[componentName] as M)).forEach(([itemName, item]) => { + expectedItems.push(new itemModel(item, {id: itemName, pointer: `/components/${componentName}/${itemName}`})); + }); + + expect(items.all()).toEqual(expectedItems); +} diff --git a/test/models/v3/contact.spec.ts b/test/models/v3/contact.spec.ts new file mode 100644 index 000000000..99f6026ca --- /dev/null +++ b/test/models/v3/contact.spec.ts @@ -0,0 +1,95 @@ +import { Contact } from '../../../src/models/v3/contact'; + +import { serializeInput, assertExtensions } from './utils'; + +import type { v3 } from '../../../src/spec-types'; + +describe('Contact model', function() { + describe('.hasName()', function() { + it('should return true when there is a value', function() { + const doc = serializeInput({ name: 'LeChuck' }); + const d = new Contact(doc); + expect(d.hasName()).toEqual(true); + }); + + it('should return false when there is no value', function() { + const doc = serializeInput({}); + const d = new Contact(doc); + expect(d.hasName()).toEqual(false); + }); + }); + + describe('.name()', function() { + it('should return the value', function() { + const doc = serializeInput({ name: 'LeChuck' }); + const d = new Contact(doc); + expect(d.name()).toEqual(doc.name); + }); + + it('should return undefined when there is no value', function() { + const doc = serializeInput({}); + const d = new Contact(doc); + expect(d.name()).toBeUndefined(); + }); + }); + + describe('.hasUrl()', function() { + it('should return true when there is a value', function() { + const doc = serializeInput({ url: 'https://example.com' }); + const d = new Contact(doc); + expect(d.hasUrl()).toEqual(true); + }); + + it('should return false when there is no value', function() { + const doc = serializeInput({}); + const d = new Contact(doc); + expect(d.hasUrl()).toEqual(false); + }); + }); + + describe('.url()', function() { + it('should return the value', function() { + const doc = serializeInput({ url: 'https://example.com' }); + const d = new Contact(doc); + expect(d.url()).toEqual(doc.url); + }); + + it('should return undefined when there is no value', function() { + const doc = serializeInput({}); + const d = new Contact(doc); + expect(d.url()).toBeUndefined(); + }); + }); + + describe('.hasEmail()', function() { + it('should return true when there is a value', function() { + const doc = serializeInput({ email: 'lechuck@example.com' }); + const d = new Contact(doc); + expect(d.hasEmail()).toEqual(true); + }); + + it('should return false when there is no value', function() { + const doc = serializeInput({}); + const d = new Contact(doc); + expect(d.hasEmail()).toEqual(false); + }); + }); + + describe('.email()', function() { + it('should return the value', function() { + const doc = serializeInput({ email: 'lechuck@example.com' }); + const d = new Contact(doc); + expect(d.email()).toEqual(doc.email); + }); + + it('should return undefined when there is no value', function() { + const doc = serializeInput({}); + const d = new Contact(doc); + expect(d.email()).toBeUndefined(); + }); + }); + + describe('mixins', function() { + assertExtensions(Contact); + }); +}); diff --git a/test/models/v3/correlation-id.spec.ts b/test/models/v3/correlation-id.spec.ts new file mode 100644 index 000000000..8536f640e --- /dev/null +++ b/test/models/v3/correlation-id.spec.ts @@ -0,0 +1,40 @@ +import { CorrelationId } from '../../../src/models/v3/correlation-id'; + +import { serializeInput, assertDescription, assertExtensions } from './utils'; + +import type { v3 } from '../../../src/spec-types'; + +describe('CorrelationId model', function() { + describe('.hasLocation()', function() { + it('should return true when there is a value', function() { + const doc = serializeInput({ location: '...' }); + const d = new CorrelationId(doc); + expect(d.hasLocation()).toEqual(true); + }); + + it('should return false when there is no value', function() { + const doc = serializeInput({}); + const d = new CorrelationId(doc); + expect(d.hasLocation()).toEqual(false); + }); + }); + + describe('.location()', function() { + it('should return the value', function() { + const doc = serializeInput({ location: '...' }); + const d = new CorrelationId(doc); + expect(d.location()).toEqual(doc.location); + }); + + it('should return undefined when there is no value', function() { + const doc = serializeInput({}); + const d = new CorrelationId(doc); + expect(d.location()).toBeUndefined(); + }); + }); + + describe('mixins', function() { + assertDescription(CorrelationId); + assertExtensions(CorrelationId); + }); +}); diff --git a/test/models/v3/external-documentation.spec.ts b/test/models/v3/external-documentation.spec.ts new file mode 100644 index 000000000..c4b2025cf --- /dev/null +++ b/test/models/v3/external-documentation.spec.ts @@ -0,0 +1,20 @@ +import { ExternalDocumentation } from '../../../src/models/v3/external-docs'; + +import { serializeInput, assertDescription, assertExtensions } from './utils'; + +import type { v3 } from '../../../src/spec-types'; + +describe('ExternalDocumentation model', function() { + describe('.url()', function() { + it('should return the value', function() { + const doc = serializeInput({ url: 'somewhere' }); + const d = new ExternalDocumentation(doc); + expect(d.url()).toEqual(doc.url); + }); + }); + + describe('mixins', function() { + assertDescription(ExternalDocumentation); + assertExtensions(ExternalDocumentation); + }); +}); diff --git a/test/models/v3/info.spec.ts b/test/models/v3/info.spec.ts new file mode 100644 index 000000000..a533e95e5 --- /dev/null +++ b/test/models/v3/info.spec.ts @@ -0,0 +1,149 @@ +import { Info } from '../../../src/models/v3/info'; +import { Contact } from '../../../src/models/v3/contact'; +import { License } from '../../../src/models/v3/license'; +import { createDetailedAsyncAPI } from '../../../src/utils'; + +import { serializeInput, assertDescription, assertExtensions, assertExternalDocumentation, assertTags } from './utils'; + +import type { v3 } from '../../../src/spec-types'; + +describe('Info model', function() { + describe('.title()', function() { + it('should return the value', function() { + const doc = serializeInput({ title: 'Example API' }); + const d = new Info(doc); + expect(d.title()).toEqual(doc.title); + }); + }); + + describe('.version()', function() { + it('should return the value', function() { + const doc = serializeInput({ version: '1.0.0' }); + const d = new Info(doc); + expect(d.version()).toEqual(doc.version); + }); + }); + + describe('.hasId()', function() { + it('should return true when there is a value', function() { + const doc = { asyncapi: '2.0.0', info: { title: 'test', version: 'test' }, id: 'someId' }; + const asyncapi = createDetailedAsyncAPI(doc, doc as any); + const d = new Info(serializeInput({}), { asyncapi, pointer: '/info' }); + expect(d.hasId()).toEqual(true); + }); + + it('should return false when there is no value', function() { + const doc = { asyncapi: '2.0.0', info: { title: 'test', version: 'test' } }; + const asyncapi = createDetailedAsyncAPI(doc, doc as any); + const d = new Info(serializeInput({}), { asyncapi, pointer: '/info' }); + expect(d.hasId()).toEqual(false); + }); + }); + + describe('.id()', function() { + it('should return the value', function() { + const doc = { asyncapi: '2.0.0', info: { title: 'test', version: 'test' }, id: 'someId' }; + const asyncapi = createDetailedAsyncAPI(doc, doc as any); + const d = new Info(serializeInput({}), { asyncapi, pointer: '/info' }); + expect(d.id()).toEqual(doc.id); + }); + + it('should return undefined when there is no value', function() { + const doc = { asyncapi: '2.0.0', info: { title: 'test', version: 'test' } }; + const asyncapi = createDetailedAsyncAPI(doc, doc as any); + const d = new Info(serializeInput({}), { asyncapi, pointer: '/info' }); + expect(d.id()).toEqual(undefined); + }); + }); + + describe('.hasTermsOfService()', function() { + it('should return true when there is a value', function() { + const doc = serializeInput({ termsOfService: 'These are the terms of service' }); + const d = new Info(doc); + expect(d.hasTermsOfService()).toEqual(true); + }); + + it('should return false when there is no value', function() { + const doc = serializeInput({}); + const d = new Info(doc); + expect(d.hasTermsOfService()).toEqual(false); + }); + }); + + describe('.termsOfService()', function() { + it('should return the value', function() { + const doc = serializeInput({ termsOfService: 'These are the terms of service' }); + const d = new Info(doc); + expect(d.termsOfService()).toEqual(doc.termsOfService); + }); + + it('should return undefined when there is no value', function() { + const doc = serializeInput({}); + const d = new Info(doc); + expect(d.termsOfService()).toBeUndefined(); + }); + }); + + describe('.hasContact()', function() { + it('should return true when there is a value', function() { + const doc = serializeInput({ contact: { name: 'LeChuck' } }); + const d = new Info(doc); + expect(d.hasContact()).toEqual(true); + }); + + it('should return false when there is no value', function() { + const doc = serializeInput({}); + const d = new Info(doc); + expect(d.hasContact()).toEqual(false); + }); + }); + + describe('.contact()', function() { + it('should return a Contact object', function() { + const doc = serializeInput({ contact: { name: 'LeChuck' } }); + const d = new Info(doc); + expect(d.contact()).toBeInstanceOf(Contact); + }); + + it('should return undefined when there is no value', function() { + const doc = serializeInput({}); + const d = new Info(doc); + expect(d.contact()).toBeUndefined(); + }); + }); + + describe('.hasLicense()', function() { + it('should return true when there is a value', function() { + const doc = serializeInput({ license: { name: 'Apache 2.0' } }); + const d = new Info(doc); + expect(d.hasLicense()).toEqual(true); + }); + + it('should return false when there is no value', function() { + const doc = serializeInput({}); + const d = new Info(doc); + expect(d.hasLicense()).toEqual(false); + }); + }); + + describe('.license()', function() { + it('should return a License object', function() { + const doc = serializeInput({ license: { name: 'Apache 2.0' } }); + const d = new Info(doc); + expect(d.license()).toBeInstanceOf(License); + }); + + it('should return undefined when there is no value', function() { + const doc = serializeInput({}); + const d = new Info(doc); + expect(d.license()).toBeUndefined(); + }); + }); + + describe('mixins', function() { + assertDescription(Info); + assertExtensions(Info); + assertExternalDocumentation(Info); + assertTags(Info); + }); +}); diff --git a/test/models/v3/license.spec.ts b/test/models/v3/license.spec.ts new file mode 100644 index 000000000..f8b12f804 --- /dev/null +++ b/test/models/v3/license.spec.ts @@ -0,0 +1,47 @@ +import { License } from '../../../src/models/v3/license'; + +import { serializeInput, assertExtensions } from './utils'; + +import type { v3 } from '../../../src/spec-types'; + +describe('License model', function() { + describe('.name()', function() { + it('should return the value', function() { + const doc = serializeInput({ name: 'Apache 2.0' }); + const d = new License(doc); + expect(d.name()).toEqual(doc.name); + }); + }); + + describe('.hasUrl()', function() { + it('should return true when there is a value', function() { + const doc = serializeInput({ url: 'https://www.apache.org/licenses/LICENSE-2.0.html' }); + const d = new License(doc); + expect(d.hasUrl()).toEqual(true); + }); + + it('should return false when there is no value', function() { + const doc = serializeInput({}); + const d = new License(doc); + expect(d.hasUrl()).toEqual(false); + }); + }); + + describe('.url()', function() { + it('should return the value', function() { + const doc = serializeInput({ url: 'https://www.apache.org/licenses/LICENSE-2.0.html' }); + const d = new License(doc); + expect(d.url()).toEqual(doc.url); + }); + + it('should return undefined when there is no value', function() { + const doc = serializeInput({}); + const d = new License(doc); + expect(d.url()).toBeUndefined(); + }); + }); + + describe('mixins', function() { + assertExtensions(License); + }); +}); diff --git a/test/models/v3/message-example.spec.ts b/test/models/v3/message-example.spec.ts new file mode 100644 index 000000000..8b7f653cd --- /dev/null +++ b/test/models/v3/message-example.spec.ts @@ -0,0 +1,121 @@ +import { MessageExample } from '../../../src/models/v3/message-example'; + +import { assertExtensions } from './utils'; + +describe('MessageExample model', function() { + describe('.hasName()', function() { + it('should return true when there is a value', function() { + const doc = { name: '...' }; + const d = new MessageExample(doc); + expect(d.hasName()).toEqual(true); + }); + + it('should return false when there is no value', function() { + const doc = {}; + const d = new MessageExample(doc); + expect(d.hasName()).toEqual(false); + }); + }); + + describe('.name()', function() { + it('should return the value', function() { + const doc = { name: '...' }; + const d = new MessageExample(doc); + expect(d.name()).toEqual(doc.name); + }); + + it('should return undefined when there is no value', function() { + const doc = {}; + const d = new MessageExample(doc); + expect(d.name()).toBeUndefined(); + }); + }); + + describe('.hasSummary()', function() { + it('should return true when there is a value', function() { + const doc = { summary: '...' }; + const d = new MessageExample(doc); + expect(d.hasSummary()).toEqual(true); + }); + + it('should return false when there is no value', function() { + const doc = {}; + const d = new MessageExample(doc); + expect(d.hasSummary()).toEqual(false); + }); + }); + + describe('.summary()', function() { + it('should return the value', function() { + const doc = { summary: '...' }; + const d = new MessageExample(doc); + expect(d.summary()).toEqual(doc.summary); + }); + + it('should return undefined when there is no value', function() { + const doc = {}; + const d = new MessageExample(doc); + expect(d.summary()).toBeUndefined(); + }); + }); + + describe('.hasHeaders()', function() { + it('should return true when there is a value', function() { + const doc = { headers: {} }; + const d = new MessageExample(doc); + expect(d.hasHeaders()).toEqual(true); + }); + + it('should return false when there is no value', function() { + const doc = {}; + const d = new MessageExample(doc); + expect(d.hasSummary()).toEqual(false); + }); + }); + + describe('.headers()', function() { + it('should return the value', function() { + const doc = { headers: {} }; + const d = new MessageExample(doc); + expect(d.headers()).toEqual(doc.headers); + }); + + it('should return undefined when there is no value', function() { + const doc = {}; + const d = new MessageExample(doc); + expect(d.headers()).toBeUndefined(); + }); + }); + + describe('.hasPayload()', function() { + it('should return true when there is a value', function() { + const doc = { payload: {} }; + const d = new MessageExample(doc); + expect(d.hasPayload()).toEqual(true); + }); + + it('should return false when there is no value', function() { + const doc = {}; + const d = new MessageExample(doc); + expect(d.hasPayload()).toEqual(false); + }); + }); + + describe('.payload()', function() { + it('should return the value', function() { + const doc = { payload: {} }; + const d = new MessageExample(doc); + expect(d.payload()).toEqual(doc.payload); + }); + + it('should return undefined when there is no value', function() { + const doc = {}; + const d = new MessageExample(doc); + expect(d.payload()).toBeUndefined(); + }); + }); + + describe('mixins', function() { + assertExtensions(MessageExample); + }); +}); diff --git a/test/models/v3/message-trait.spec.ts b/test/models/v3/message-trait.spec.ts new file mode 100644 index 000000000..49f3b2fed --- /dev/null +++ b/test/models/v3/message-trait.spec.ts @@ -0,0 +1,186 @@ +import { CorrelationId } from '../../../src/models/v3/correlation-id'; +import { MessageExamples } from '../../../src/models/v3/message-examples'; +import { MessageExample } from '../../../src/models/v3/message-example'; +import { MessageTrait } from '../../../src/models/v3/message-trait'; +import { Schema } from '../../../src/models/v3/schema'; + +import { assertCoreModel } from './utils'; + +describe('MessageTrait model', function() { + describe('.id()', function() { + it('should return id of model', function() { + const doc = {}; + const d = new MessageTrait(doc, { asyncapi: {} as any, pointer: '', id: 'trait' }); + expect(d.id()).toEqual('trait'); + }); + }); + + describe('.schemaFormat()', function() { + it('should return always undefined', function() { + const doc = { schemaFormat: 'customSchemaFormat' }; + const d = new MessageTrait(doc, { asyncapi: {} as any, pointer: '', id: 'message' }); + expect(d.schemaFormat()).toBeUndefined(); + }); + }); + + describe('.hasSchemaFormat()', function() { + it('should return always false', function() { + const doc = { schemaFormat: 'customSchemaFormat' }; + const d = new MessageTrait(doc, { asyncapi: {} as any, pointer: '', id: 'message' }); + expect(d.hasSchemaFormat()).toBeFalsy(); + }); + }); + + describe('.hasMessageId()', function() { + it('should return false when there is a value', function() { + const doc = {}; + const d = new MessageTrait(doc, { asyncapi: {} as any, pointer: '', id: 'message' }); + expect(d.hasMessageId()).toEqual(false); + }); + + it('should return false when there is no value', function() { + const doc = {}; + const d = new MessageTrait(doc); + expect(d.hasMessageId()).toEqual(false); + }); + }); + + describe('.hasCorrelationId()', function() { + it('should return true when there is a value', function() { + const doc = { correlationId: { location: '...' } }; + const d = new MessageTrait(doc); + expect(d.hasCorrelationId()).toEqual(true); + }); + + it('should return false when there is no value', function() { + const doc = {}; + const d = new MessageTrait(doc); + expect(d.hasCorrelationId()).toEqual(false); + }); + }); + + describe('.correlationId()', function() { + it('should return the value', function() { + const doc = { correlationId: { location: '...' } }; + const d = new MessageTrait(doc); + expect(d.correlationId()).toBeInstanceOf(CorrelationId); + }); + + it('should return undefined when there is no value', function() { + const doc = {}; + const d = new MessageTrait(doc); + expect(d.correlationId()).toBeUndefined(); + }); + }); + + describe('.hasContentType()', function() { + it('should return true when there is a value', function() { + const doc = { contentType: '...' }; + const d = new MessageTrait(doc); + expect(d.hasContentType()).toEqual(true); + }); + + it('should return false when there is no value', function() { + const doc = {}; + const d = new MessageTrait(doc); + expect(d.hasContentType()).toEqual(false); + }); + }); + + describe('.contentType()', function() { + it('should return the value', function() { + const doc = { contentType: '...' }; + const d = new MessageTrait(doc); + expect(d.contentType()).toEqual(doc.contentType); + }); + + it('should return undefined when there is no value', function() { + const doc = {}; + const d = new MessageTrait(doc); + expect(d.contentType()).toBeUndefined(); + }); + + it('should reuse defaultContentType value', function() { + const doc = {}; + const d = new MessageTrait(doc, { asyncapi: { parsed: { defaultContentType: '...' } } } as any); + expect(d.contentType()).toEqual('...'); + }); + }); + + describe('.hasHeaders()', function() { + it('should return true when there is a value', function() { + const doc = { headers: {} }; + const d = new MessageTrait(doc); + expect(d.hasHeaders()).toEqual(true); + }); + + it('should return false when there is no value', function() { + const doc = {}; + const d = new MessageTrait(doc); + expect(d.hasHeaders()).toEqual(false); + }); + }); + + describe('.headers()', function() { + it('should return the value', function() { + const doc = { headers: {} }; + const d = new MessageTrait(doc); + expect(d.headers()).toBeInstanceOf(Schema); + }); + + it('should return undefined when there is no value', function() { + const doc = {}; + const d = new MessageTrait(doc); + expect(d.headers()).toBeUndefined(); + }); + }); + + describe('.hasName()', function() { + it('should return true when there is a value', function() { + const doc = { name: '...' }; + const d = new MessageTrait(doc); + expect(d.hasName()).toEqual(true); + }); + + it('should return false when there is no value', function() { + const doc = {}; + const d = new MessageTrait(doc); + expect(d.hasName()).toEqual(false); + }); + }); + + describe('.name()', function() { + it('should return the value', function() { + const doc = { name: '...' }; + const d = new MessageTrait(doc); + expect(d.name()).toEqual(doc.name); + }); + + it('should return undefined when there is no value', function() { + const doc = {}; + const d = new MessageTrait(doc); + expect(d.name()).toBeUndefined(); + }); + }); + + describe('.examples()', function() { + it('should return collection of examples', function() { + const doc = { examples: [{ name: '...' }] }; + const d = new MessageTrait(doc); + expect(d.examples()).toBeInstanceOf(MessageExamples); + expect(d.examples().all()).toHaveLength(1); + expect(d.examples().all()[0]).toBeInstanceOf(MessageExample); + }); + + it('should return collection of examples when value is undefined', function() { + const doc = {}; + const d = new MessageTrait(doc); + expect(d.examples()).toBeInstanceOf(MessageExamples); + expect(d.examples().all()).toHaveLength(0); + }); + }); + + describe('mixins', function() { + assertCoreModel(MessageTrait); + }); +}); diff --git a/test/models/v3/message.spec.ts b/test/models/v3/message.spec.ts new file mode 100644 index 000000000..9d02b2885 --- /dev/null +++ b/test/models/v3/message.spec.ts @@ -0,0 +1,185 @@ +import { Channel } from '../../../src/models/v3/channel'; +import { Channels } from '../../../src/models/v3/channels'; +import { Message } from '../../../src/models/v3/message'; +import { MessageTraits } from '../../../src/models/v3/message-traits'; +import { MessageTrait } from '../../../src/models/v3/message-trait'; +import { Schema } from '../../../src/models/v3/schema'; +import { Servers } from '../../../src/models/v3/servers'; +import { Server } from '../../../src/models/v3/server'; +import { Operations } from '../../../src/models/v3/operations'; +import { Operation } from '../../../src/models/v3/operation'; + +import { assertCoreModel } from './utils'; + +describe('Message model', function() { + describe('.id()', function() { + it('should return id of model', function() { + const doc = {}; + const d = new Message(doc, { asyncapi: {} as any, pointer: '', id: 'message' }); + expect(d.id()).toEqual('message'); + }); + }); + + describe('.schemaFormat() + .hasSchemaFormat()', function() { + it('should return defined schemaFormat, and true for hasSchemaFormat()', function() { + const doc = { payload: {schemaFormat: 'customSchemaFormat', schema: {} }}; + const d = new Message(doc, { asyncapi: {} as any, pointer: '', id: 'message' }); + expect(d.hasSchemaFormat()).toBeTruthy(); + expect(d.schemaFormat()).toEqual('customSchemaFormat'); + }); + + it('should return default schemaFormat if schemaFormat field is absent', function() { + const doc = {payload: {}}; + const d = new Message(doc, { asyncapi: { semver: { version: '2.0.0' } } as any, pointer: '', id: 'message' }); + expect(d.hasSchemaFormat()).toBeTruthy(); + expect(d.schemaFormat()).toEqual('application/vnd.aai.asyncapi;version=2.0.0'); + }); + + it('should return undefined schemaFormat, and false for hasSchemaFormat() if there is no payload', function() { + const doc = {}; + const d = new Message(doc, { asyncapi: { semver: { version: '2.0.0' } } as any, pointer: '', id: 'message' }); + expect(d.hasSchemaFormat()).toBeFalsy(); + expect(d.schemaFormat()).toBeUndefined(); + }); + }); + + describe('.hasPayload()', function() { + it('should return true when there is a value', function() { + const doc = { payload: {} }; + const d = new Message(doc); + expect(d.hasPayload()).toEqual(true); + }); + + it('should return false when there is no value', function() { + const doc = {}; + const d = new Message(doc); + expect(d.hasPayload()).toEqual(false); + }); + }); + + describe('.payload()', function() { + it('should return the value', function() { + const doc = { payload: {} }; + const d = new Message(doc); + expect(d.payload()).toBeInstanceOf(Schema); + }); + + it('should return undefined when there is no value', function() { + const doc = {}; + const d = new Message(doc); + expect(d.payload()).toBeUndefined(); + }); + }); + + describe('.servers()', function() { + it('should return collection of servers - available on all servers', function() { + const doc = {}; + const serverProduction = {host: 'mqtt://myhost.io', protocol: 'mqtt'}; + const serverDevelopment = {host: 'mqtt://dev.myhost.io', protocol: 'mqtt'}; + const channel = { }; // no channels assigned, means all channels are related + const d = new Message(doc, { asyncapi: { parsed: { servers: { production: serverProduction, development: serverDevelopment, demo: {} }, channels: { userSignedUp: channel }, operations: { userSignUp: { action: 'send', messages: [doc], channel } } } } as any, pointer: '', id: 'message' }); + + expect(d.servers()).toBeInstanceOf(Servers); + expect(d.servers().all()).toHaveLength(3); + expect(d.servers().all()[0]).toBeInstanceOf(Server); + expect(d.servers().all()[0].id()).toEqual('production'); + expect(d.servers().all()[1]).toBeInstanceOf(Server); + expect(d.servers().all()[1].id()).toEqual('development'); + expect(d.servers().all()[2]).toBeInstanceOf(Server); + expect(d.servers().all()[2].id()).toEqual('demo'); + }); + + it('should return collection of servers - available on selected servers', function() { + const doc = {}; + const serverProduction = {host: 'mqtt://myhost.io', protocol: 'mqtt'}; + const serverDevelopment = {host: 'mqtt://dev.myhost.io', protocol: 'mqtt'}; + const channel = { servers: [serverProduction, serverDevelopment]}; // selecting 2 of the 3 servers + const d = new Message(doc, { asyncapi: { parsed: { servers: { production: serverProduction, development: serverDevelopment, demo: {} }, channels: { userSignedUp: channel }, operations: { userSignUp: { action: 'send', messages: [doc], channel } } } } as any, pointer: '', id: 'message' }); + + expect(d.servers()).toBeInstanceOf(Servers); + expect(d.servers().all()).toHaveLength(2); + expect(d.servers().all()[0]).toBeInstanceOf(Server); + expect(d.servers().all()[0].id()).toEqual('production'); + expect(d.servers().all()[1]).toBeInstanceOf(Server); + expect(d.servers().all()[1].id()).toEqual('development'); + }); + }); + + describe('.channels()', function() { + it('should return collection of channels - single channel', function() { + const doc = {}; + const channel = {address: 'user/signup', messages: { messageOne: doc }}; + const d = new Message(doc, { asyncapi: { parsed: {channels: { userSignUp: channel } } } as any, pointer: '', id: 'message' }); + expect(d.channels()).toBeInstanceOf(Channels); + expect(d.channels().all()).toHaveLength(1); + expect(d.channels().all()[0]).toBeInstanceOf(Channel); + expect(d.channels().all()[0].address()).toEqual('user/signup'); + }); + + it('should return collection of channels - multiple channels', function() { + const doc = {}; + const channelOne = {address: 'user/signup', messages: { messageOne: doc }}; + const channelTwo = {address: 'user/logout', messages: { messageOne: doc }}; + const d = new Message(doc, { asyncapi: { parsed: {channels: { userSignUp: channelOne, userLogOut: channelTwo } } } as any, pointer: '', id: 'message' }); + expect(d.channels()).toBeInstanceOf(Channels); + expect(d.channels().all()).toHaveLength(2); + expect(d.channels().all()[0]).toBeInstanceOf(Channel); + expect(d.channels().all()[0].address()).toEqual('user/signup'); + expect(d.channels().all()[1]).toBeInstanceOf(Channel); + expect(d.channels().all()[1].address()).toEqual('user/logout'); + }); + + it('should return collection of channels - do not duplicate channels', function() { + const doc = {}; + const channel = {address: 'user/signup', messages: { messageOne: doc }}; + const d = new Message(doc, { asyncapi: { parsed: {channels: { userSignUp: channel }, operations: { userSignUp: { action: 'send', messages: [doc], channel } } } } as any, pointer: '', id: 'message' }); + expect(d.channels()).toBeInstanceOf(Channels); + expect(d.channels().all()).toHaveLength(1); + expect(d.channels().all()[0]).toBeInstanceOf(Channel); + expect(d.channels().all()[0].address()).toEqual('user/signup'); + }); + }); + + describe('.operations()', function() { + it('should return collection of operations - single operation', function() { + const doc = {}; + const d = new Message(doc, { asyncapi: { parsed: { operations: { userSignUp: { action: 'send', messages: [doc] } } } } as any, pointer: '', id: 'message' }); + expect(d.operations()).toBeInstanceOf(Operations); + expect(d.operations().all()).toHaveLength(1); + expect(d.operations().all()[0]).toBeInstanceOf(Operation); + expect(d.operations().all()[0].id()).toEqual('userSignUp'); + }); + + it('should return collection of operations - multiple operations', function() { + const doc = {}; + const d = new Message(doc, { asyncapi: { parsed: { operations: { userSignUp: { action: 'send', messages: [doc] }, userLogOut: { action: 'send', messages: [doc] } } } } as any, pointer: '', id: 'message' }); + expect(d.operations()).toBeInstanceOf(Operations); + expect(d.operations().all()).toHaveLength(2); + expect(d.operations().all()[0]).toBeInstanceOf(Operation); + expect(d.operations().all()[0].id()).toEqual('userSignUp'); + expect(d.operations().all()[1]).toBeInstanceOf(Operation); + expect(d.operations().all()[1].id()).toEqual('userLogOut'); + }); + }); + + describe('.traits()', function() { + it('should return collection of traits', function() { + const doc = { traits: [{ messageId: '...' }] }; + const d = new Message(doc); + expect(d.traits()).toBeInstanceOf(MessageTraits); + expect(d.traits().all()).toHaveLength(1); + expect(d.traits().all()[0]).toBeInstanceOf(MessageTrait); + }); + + it('should return collection of traits when value is undefined', function() { + const doc = {}; + const d = new Message(doc); + expect(d.traits()).toBeInstanceOf(MessageTraits); + expect(d.traits().all()).toHaveLength(0); + }); + }); + + describe('mixins', function() { + assertCoreModel(Message); + }); +}); diff --git a/test/models/v3/oauth-flow.spec.ts b/test/models/v3/oauth-flow.spec.ts new file mode 100644 index 000000000..0561f2846 --- /dev/null +++ b/test/models/v3/oauth-flow.spec.ts @@ -0,0 +1,39 @@ +import { OAuthFlow } from '../../../src/models/v3/oauth-flow'; + +import { assertExtensions } from './utils'; + +import type { v3 } from '../../../src/spec-types'; + +const flowObject = { + authorizationUrl: 'https://example.com/api/oauth/dialog', + availableScopes: { + 'write:pets': 'modify pets in your account', + 'read:pets': 'read your pets' + } +}; + +const flow = new OAuthFlow(flowObject); +const emptyObject = new OAuthFlow({} as v3.OAuthFlowObject); + +describe('OAuth Flow', function() { + describe('.authorizationUrl()', function() { + it('should reutrn undefined if no authorizationUrl present', function() { + expect(emptyObject.authorizationUrl()).toBeUndefined(); + }); + + it('should return authrozationUrl ', function() { + expect(flow.authorizationUrl()).toMatch(flowObject.authorizationUrl); + }); + }); + + describe('.scopes()', function() { + it('should return scopes if present', function() { + expect(emptyObject.scopes()).toBeUndefined(); + expect(flow.scopes()!['write:pets']).toMatch(flowObject.availableScopes['write:pets']); + }); + }); + + describe('mixins', function() { + assertExtensions(OAuthFlow); + }); +}); diff --git a/test/models/v3/oauth-flows.spec.ts b/test/models/v3/oauth-flows.spec.ts new file mode 100644 index 000000000..a680df224 --- /dev/null +++ b/test/models/v3/oauth-flows.spec.ts @@ -0,0 +1,42 @@ +import { OAuthFlows } from '../../../src/models/v3/oauth-flows'; +import { OAuthFlow } from '../../../src/models/v3/oauth-flow'; + +import { assertExtensions } from './utils'; + +const oAuthFlowsObject = { + implicit: { + authorizationUrl: 'https://example.com/api/oauth/dialog', + availableScopes: { + 'write:pets': 'modify pets in your account', + 'read:pets': 'read your pets' + } + }, + authorizationCode: { + authorizationUrl: 'https://example.com/api/oauth/dialog', + tokenUrl: 'https://example.com/api/oauth/token', + availableScopes: { + 'write:pets': 'modify pets in your account', + 'read:pets': 'read your pets' + } + } +}; + +const flows = new OAuthFlows(oAuthFlowsObject); + +describe('OAuth Flows', function() { + describe('.hasImplicit()', function() { + it('should return true', function() { + expect(flows.hasImplicit()).toBeTruthy(); + }); + }); + + describe('.implicit()', function() { + it('should return OAuthflow object', function() { + expect(flows.implicit() instanceof OAuthFlow).toBeTruthy(); + }); + }); + + describe('mixins', function() { + assertExtensions(OAuthFlows); + }); +}); diff --git a/test/models/v3/operation-reply-address.spec.ts b/test/models/v3/operation-reply-address.spec.ts new file mode 100644 index 000000000..2187bb90b --- /dev/null +++ b/test/models/v3/operation-reply-address.spec.ts @@ -0,0 +1,17 @@ +import { OperationReplyAddress } from '../../../src/models/v3/operation-reply-address'; + +import { assertDescription, assertExtensions } from './utils'; + +describe('OperationReplyAddress model', function() { + describe('.location()', function() { + it('should return location', function() { + const d = new OperationReplyAddress({ location: 'location' }, { asyncapi: {} as any, pointer: '' }); + expect(d.location()).toEqual('location'); + }); + }); + + describe('mixins', function() { + assertDescription(OperationReplyAddress); + assertExtensions(OperationReplyAddress); + }); +}); diff --git a/test/models/v3/operation-reply.spec.ts b/test/models/v3/operation-reply.spec.ts new file mode 100644 index 000000000..c56cd46bb --- /dev/null +++ b/test/models/v3/operation-reply.spec.ts @@ -0,0 +1,93 @@ +import { Channel } from '../../../src/models/v3/channel'; +import { OperationReply } from '../../../src/models/v3/operation-reply'; +import { OperationReplyAddress } from '../../../src/models/v3/operation-reply-address'; +import { Messages } from '../../../src/models/v3/messages'; +import { Message } from '../../../src/models/v3/message'; + +import { assertExtensions } from './utils'; + +describe('OperationReply model', function() { + describe('.id()', function() { + it('should return id', function() { + const d = new OperationReply({}, { asyncapi: {} as any, pointer: '', id: 'reply' }); + expect(d.id()).toEqual('reply'); + }); + }); + + describe('.hasAddress()', function() { + it('should return true if address is present', function() { + const d = new OperationReply({ address: { location: 'location' } }, { asyncapi: {} as any, pointer: '' }); + expect(d.hasAddress()).toEqual(true); + }); + + it('should return false if address is not present', function() { + const d = new OperationReply({}, { asyncapi: {} as any, pointer: '' }); + expect(d.hasAddress()).toEqual(false); + }); + }); + + describe('.address()', function() { + it('should return OperationReplyAdress Model if address is present', function() { + const d = new OperationReply({ address: { location: 'location' } }, { asyncapi: {} as any, pointer: '' }); + expect(d.address()).toBeInstanceOf(OperationReplyAddress); + }); + + it('should return undefined if address is not present', function() { + const d = new OperationReply({}, { asyncapi: {} as any, pointer: '' }); + expect(d.address()).toBeUndefined(); + }); + }); + + describe('.hasChannel()', function() { + it('should return true if channel is present', function() { + const d = new OperationReply({ channel: {} }, { asyncapi: {} as any, pointer: '' }); + expect(d.hasChannel()).toEqual(true); + }); + + it('should return false if channel is not present', function() { + const d = new OperationReply({}, { asyncapi: {} as any, pointer: '' }); + expect(d.hasChannel()).toEqual(false); + }); + }); + + describe('.channel()', function() { + it('should return Channel Model if address is present', function() { + const d = new OperationReply({ channel: {} }, { asyncapi: {} as any, pointer: '' }); + expect(d.channel()).toBeInstanceOf(Channel); + }); + + it('should return undefined if address is not present', function() { + const d = new OperationReply({}, { asyncapi: {} as any, pointer: '' }); + expect(d.channel()).toBeUndefined(); + }); + }); + + describe('.messages()', function() { + it('should return collection of messages - single message', function() { + const d = new OperationReply({ messages: [{'x-parser-unique-object-id': 'testMessage'}] }); + expect(d.messages()).toBeInstanceOf(Messages); + expect(d.messages().all()).toHaveLength(1); + expect(d.messages().all()[0]).toBeInstanceOf(Message); + expect(d.messages().all()[0].id()).toEqual('testMessage'); + }); + + it('should return collection of messages - more than one messages', function() { + const d = new OperationReply({ messages: [{'x-parser-unique-object-id': 'testMessage1'}, {'x-parser-unique-object-id': 'testMessage2'}] }); + expect(d.messages()).toBeInstanceOf(Messages); + expect(d.messages().all()).toHaveLength(2); + expect(d.messages().all()[0]).toBeInstanceOf(Message); + expect(d.messages().all()[0].id()).toEqual('testMessage1'); + expect(d.messages().all()[1]).toBeInstanceOf(Message); + expect(d.messages().all()[1].id()).toEqual('testMessage2'); + }); + + it('should return undefined if address is not present', function() { + const d = new OperationReply({}, { asyncapi: {} as any, pointer: '' }); + expect(d.channel()).toBeUndefined(); + }); + }); + + describe('mixins', function() { + assertExtensions(OperationReply); + }); +}); diff --git a/test/models/v3/operation-trait.spec.ts b/test/models/v3/operation-trait.spec.ts new file mode 100644 index 000000000..e211e8fce --- /dev/null +++ b/test/models/v3/operation-trait.spec.ts @@ -0,0 +1,61 @@ +import { OperationTrait } from '../../../src/models/v3/operation-trait'; +import { SecurityRequirement } from '../../../src/models/v3/security-requirement'; +import { SecurityRequirements } from '../../../src/models/v3/security-requirements'; +import { SecurityScheme } from '../../../src/models/v3/security-scheme'; + +import { assertCoreModel } from './utils'; + +describe('OperationTrait model', function() { + describe('.id()', function() { + it('should return the value', function() { + const d = new OperationTrait({}, { id: '...' } as any); + expect(d.id()).toEqual('...'); + }); + + it('should return undefined when there is no value', function() { + const doc = {}; + const d = new OperationTrait(doc); + expect(d.id()).toBeUndefined(); + }); + }); + + describe('.hasId()', function() { + it('should return true when there is a value', function() { + const d = new OperationTrait({}, { id: '...' } as any); + expect(d.hasOperationId()).toEqual(true); + }); + + it('should return false when there is no value', function() { + const doc = {}; + const d = new OperationTrait(doc); + expect(d.hasOperationId()).toEqual(false); + }); + }); + + describe('.security()', function() { + it('should return collection of security requirements', function() { + const d = new OperationTrait({ security: [{ type: 'apiKey' }] }); + + const security = d.security(); + expect(Array.isArray(security)).toEqual(true); + expect(security).toHaveLength(1); + expect(security[0]).toBeInstanceOf(SecurityRequirements); + + const requirement = security[0].all()[0] as SecurityRequirement; + expect(requirement).toBeInstanceOf(SecurityRequirement); + expect(requirement.scheme()).toBeInstanceOf(SecurityScheme); + expect(requirement.scopes()).toEqual([]); + }); + + it('should return collection of security requirements when value is undefined', function() { + const doc = {}; + const d = new OperationTrait(doc); + expect(Array.isArray(d.security())).toEqual(true); + expect(d.security()).toHaveLength(0); + }); + }); + + describe('mixins', function() { + assertCoreModel(OperationTrait); + }); +}); diff --git a/test/models/v3/operation.spec.ts b/test/models/v3/operation.spec.ts new file mode 100644 index 000000000..9dcd179bb --- /dev/null +++ b/test/models/v3/operation.spec.ts @@ -0,0 +1,156 @@ +import { Channels } from '../../../src/models/v3/channels'; +import { Channel } from '../../../src/models/v3/channel'; +import { Operation } from '../../../src/models/v3/operation'; +import { OperationTraits } from '../../../src/models/v3/operation-traits'; +import { OperationTrait } from '../../../src/models/v3/operation-trait'; +import { OperationReply } from '../../../src/models/v3/operation-reply'; +import { Messages } from '../../../src/models/v3/messages'; +import { Message } from '../../../src/models/v3/message'; +import { Servers } from '../../../src/models/v3/servers'; +import { Server } from '../../../src/models/v3/server'; + +import { assertCoreModel } from './utils'; + +describe('Operation model', function() { + describe('.id()', function() { + it('should return operationId', function() { + const d = new Operation({ action: 'send', channel: {} }, { asyncapi: {} as any, pointer: '', id: 'operation' }); + expect(d.id()).toEqual('operation'); + }); + }); + + describe('.action()', function() { + it('should return kind/action of operation', function() { + const d = new Operation({ action: 'send', channel: {} }, { asyncapi: {} as any, pointer: '', id: 'operation' }); + expect(d.action()).toEqual('send'); + }); + }); + + describe('.isSend()', function() { + it('should return true when operation has send action', function() { + const d = new Operation({ action: 'send', channel: {} }, { asyncapi: {} as any, pointer: '', id: 'operation' }); + expect(d.isSend()).toBeTruthy(); + }); + + it('should return false when operation has receive action', function() { + const doc = {}; + const d = new Operation({ action: 'receive', channel: {} }, { asyncapi: {} as any, pointer: '', id: 'operation' }); + expect(d.isSend()).toBeFalsy(); + }); + }); + + describe('.isReceive()', function() { + it('should return true when operation has receive action', function() { + const doc = {}; + const d = new Operation({ action: 'receive', channel: {} }, { asyncapi: {} as any, pointer: '', id: 'operation' }); + expect(d.isReceive()).toBeTruthy(); + }); + + it('should return false when operation has send action', function() { + const doc = {}; + const d = new Operation({ action: 'send', channel: {} }, { asyncapi: {} as any, pointer: '', id: 'operation' }); + expect(d.isReceive()).toBeFalsy(); + }); + }); + + describe('.servers()', function() { + it('should return collection of servers - channel available on all servers', function() { + const channel = {}; + const d = new Operation({ action: 'send', channel }, { asyncapi: { parsed: { channels: { someChannel: channel }, servers: { production: {}, development: {}, } } } as any, pointer: '', id: 'operation' }); + expect(d.servers()).toBeInstanceOf(Servers); + expect(d.servers().all()).toHaveLength(2); + expect(d.servers().all()[0]).toBeInstanceOf(Server); + expect(d.servers().all()[0].id()).toEqual('production'); + expect(d.servers().all()[1]).toBeInstanceOf(Server); + expect(d.servers().all()[1].id()).toEqual('development'); + }); + + it('should return collection of servers - channel available on selected servers', function() { + const production = {}; + const channel = { servers: [production as any] }; + const d = new Operation({ action: 'send', channel }, { asyncapi: { parsed: { channels: { someChannel: channel }, servers: { production, development: {}, } } } as any, pointer: '', id: 'operation' }); + expect(d.servers()).toBeInstanceOf(Servers); + expect(d.servers().all()).toHaveLength(1); + expect(d.servers().all()[0]).toBeInstanceOf(Server); + expect(d.servers().all()[0].id()).toEqual('production'); + }); + }); + + describe('.channels()', function() { + it('should return collection of channels - single channel', function() { + const channel = { address: 'user/signup' }; + const d = new Operation({ action: 'send', channel }, { asyncapi: { parsed: { channels: { someChannel: channel } } } as any, pointer: '', id: 'operation' }); + expect(d.channels()).toBeInstanceOf(Channels); + expect(d.channels().all()).toHaveLength(1); + expect(d.channels().all()[0]).toBeInstanceOf(Channel); + expect(d.channels().all()[0].address()).toEqual('user/signup'); + }); + }); + + describe('.messages()', function() { + it('should return collection of messages - single message', function() { + const channel = { messages: { someMessage: { summary: 'summary' } } }; + const d = new Operation({ action: 'send', channel }, { asyncapi: { parsed: { channels: { someChannel: channel } } } as any, pointer: '', id: 'operation' }); + expect(d.messages()).toBeInstanceOf(Messages); + expect(d.messages().all()).toHaveLength(1); + expect(d.messages().all()[0]).toBeInstanceOf(Message); + }); + + it('should return collection of messages - more than one messages', function() { + const channel = { messages: { someMessage1: { summary: 'summary1' }, someMessage2: { summary: 'summary2' } } }; + const d = new Operation({ action: 'send', channel }, { asyncapi: { parsed: { channels: { someChannel: channel } } } as any, pointer: '', id: 'operation' }); + expect(d.messages()).toBeInstanceOf(Messages); + expect(d.messages().all()).toHaveLength(2); + expect(d.messages().all()[0]).toBeInstanceOf(Message); + expect(d.messages().all()[0].summary()).toEqual('summary1'); + expect(d.messages().all()[1]).toBeInstanceOf(Message); + expect(d.messages().all()[1].summary()).toEqual('summary2'); + }); + + it('should return collection of messages - defined message on operation level', function() { + const channel = { messages: { someMessage1: { summary: 'summary1' }, someMessage2: { summary: 'summary2' } } }; + const d = new Operation({ action: 'send', channel, messages: [channel.messages.someMessage1] }, { asyncapi: { parsed: { channels: { someChannel: channel } } } as any, pointer: '', id: 'operation' }); + expect(d.messages()).toBeInstanceOf(Messages); + expect(d.messages().all()).toHaveLength(1); + expect(d.messages().all()[0]).toBeInstanceOf(Message); + expect(d.messages().all()[0].summary()).toEqual('summary1'); + }); + + it('should return undefined when there is no value', function() { + const d = new Operation({ action: 'send', channel: {} }); + expect(d.messages()).toBeInstanceOf(Messages); + expect(d.messages().all()).toHaveLength(0); + }); + }); + + describe('.reply()', function() { + it('should return OperationReply model when there is value', function() { + const d = new Operation({ action: 'send', channel: {}, reply: {} }); + expect(d.reply()).toBeInstanceOf(OperationReply); + }); + + it('should return undefined when there is no value', function() { + const d = new Operation({ action: 'send', channel: {} }); + expect(d.reply()).toBeUndefined(); + }); + }); + + describe('.traits()', function() { + it('should return collection of traits', function() { + const d = new Operation({ action: 'send', channel: {}, traits: [{}] }); + expect(d.traits()).toBeInstanceOf(OperationTraits); + expect(d.traits().all()).toHaveLength(1); + expect(d.traits().all()[0]).toBeInstanceOf(OperationTrait); + }); + + it('should return collection of traits when value is undefined', function() { + const d = new Operation({ action: 'send', channel: {}, traits: [] }); + expect(d.traits()).toBeInstanceOf(OperationTraits); + expect(d.traits().all()).toHaveLength(0); + }); + }); + + describe('mixins', function() { + assertCoreModel(Operation); + }); +}); diff --git a/test/models/v3/schema.spec.ts b/test/models/v3/schema.spec.ts new file mode 100644 index 000000000..f491ea55e --- /dev/null +++ b/test/models/v3/schema.spec.ts @@ -0,0 +1,839 @@ +import { Schema } from '../../../src/models/v3/schema'; + +import { assertExtensions, assertExternalDocumentation } from './utils'; +import { xParserSchemaId } from '../../../src/constants'; +import { getDefaultSchemaFormat } from '../../../src/schema-parser'; + +import type { v3 } from '../../../src/spec-types'; + +describe('Schema model', function() { + describe('.id()', function() { + it('should return $id of schema', function() { + const doc = { $id: '$id', [xParserSchemaId]: xParserSchemaId }; + const d = new Schema(doc, { asyncapi: {} as any, pointer: '', id: 'id' }); + expect(d.id()).toEqual('$id'); + }); + + it('should return meta id of schema as fallback', function() { + const doc = { [xParserSchemaId]: xParserSchemaId }; + const d = new Schema(doc, { asyncapi: {} as any, pointer: '', id: 'id' }); + expect(d.id()).toEqual('id'); + }); + + it(`should return ${xParserSchemaId} of schema as fallback`, function() { + const doc = { [xParserSchemaId]: xParserSchemaId }; + const d = new Schema(doc, { asyncapi: {} as any, pointer: '' }); + expect(d.id()).toEqual(xParserSchemaId); + }); + }); + + describe('.$comment()', function() { + it('should return the value', function() { + const doc = { $comment: '...' }; + const d = new Schema(doc); + expect(d.$comment()).toEqual(doc.$comment); + }); + + it('should return undefined when there is no value', function() { + const doc = {}; + const d = new Schema(doc); + expect(d.$comment()).toBeUndefined(); + }); + }); + + describe('.$id()', function() { + it('should return the value', function() { + const doc = { $id: '...' }; + const d = new Schema(doc); + expect(d.$id()).toEqual(doc.$id); + }); + + it('should return undefined when there is no value', function() { + const doc = {}; + const d = new Schema(doc); + expect(d.$id()).toBeUndefined(); + }); + }); + + describe('.$schema()', function() { + it('should return the value', function() { + const doc = { $schema: '...' }; + const d = new Schema(doc); + expect(d.$schema()).toEqual(doc.$schema); + }); + + it('should return fallback value when there is no value', function() { + const doc = {}; + const d = new Schema(doc); + expect(d.$schema()).toEqual('http://json-schema.org/draft-07/schema#'); + }); + }); + + describe('.additionalItems()', function() { + it('should return the value schema object', function() { + const doc = { additionalItems: {} }; + const d = new Schema(doc); + expect(d.additionalItems()).toBeInstanceOf(Schema); + }); + + it('should return the true when there is no value', function() { + const doc = {}; + const d = new Schema(doc); + expect(d.additionalItems()).toEqual(true); + }); + + it('should return the false where there is false value', function() { + const doc = { additionalItems: false }; + const d = new Schema(doc); + expect(d.additionalItems()).toEqual(false); + }); + + it('should return the false where there is true value', function() { + const doc = { additionalItems: true }; + const d = new Schema(doc); + expect(d.additionalItems()).toEqual(true); + }); + }); + + describe('.additionalProperties()', function() { + it('should return the value schema object', function() { + const doc = { additionalProperties: {} }; + const d = new Schema(doc); + expect(d.additionalProperties()).toBeInstanceOf(Schema); + }); + + it('should return the true when there is no value', function() { + const doc = {}; + const d = new Schema(doc); + expect(d.additionalProperties()).toEqual(true); + }); + + it('should return the false where there is false value', function() { + const doc = { additionalProperties: false }; + const d = new Schema(doc); + expect(d.additionalProperties()).toEqual(false); + }); + + it('should return the false where there is true value', function() { + const doc = { additionalProperties: true }; + const d = new Schema(doc); + expect(d.additionalProperties()).toEqual(true); + }); + }); + + describe('.allOf()', function() { + it('should return collection of schemas', function() { + const doc = { allOf: [{}, {}] }; + const d = new Schema(doc); + expect(Array.isArray(d.allOf())).toEqual(true); + expect(d.allOf()).toHaveLength(2); + expect((d.allOf() as any)[0]).toBeInstanceOf(Schema); + expect((d.allOf() as any)[1]).toBeInstanceOf(Schema); + }); + + it('should return undefined where there is no value', function() { + const doc = {}; + const d = new Schema(doc); + expect(d.allOf()).toBeUndefined(); + }); + }); + + describe('.anyOf()', function() { + it('should return collection of schemas', function() { + const doc = { anyOf: [{}, {}] }; + const d = new Schema(doc); + expect(Array.isArray(d.anyOf())).toEqual(true); + expect(d.anyOf()).toHaveLength(2); + expect((d.anyOf() as any)[0]).toBeInstanceOf(Schema); + expect((d.anyOf() as any)[1]).toBeInstanceOf(Schema); + }); + + it('should return undefined where there is no value', function() { + const doc = {}; + const d = new Schema(doc); + expect(d.anyOf()).toBeUndefined(); + }); + }); + + describe('.const()', function() { + it('should return value', function() { + const doc = { const: '...' }; + const d = new Schema(doc); + expect(d.const()).toEqual(doc.const); + }); + + it('should return undefined where there is no value', function() { + const doc = {}; + const d = new Schema(doc); + expect(d.const()).toBeUndefined(); + }); + }); + + describe('.contains()', function() { + it('should return value', function() { + const doc = { contains: {} }; + const d = new Schema(doc); + expect(d.contains()).toBeInstanceOf(Schema); + }); + + it('should return undefined where there is no value', function() { + const doc = {}; + const d = new Schema(doc); + expect(d.contains()).toBeUndefined(); + }); + }); + + describe('.contentEncoding()', function() { + it('should return value', function() { + const doc = { contentEncoding: '...' }; + const d = new Schema(doc); + expect(d.contentEncoding()).toEqual(doc.contentEncoding); + }); + + it('should return undefined where there is no value', function() { + const doc = {}; + const d = new Schema(doc); + expect(d.contentEncoding()).toBeUndefined(); + }); + }); + + describe('.contentMediaType()', function() { + it('should return value', function() { + const doc = { contentMediaType: '...' }; + const d = new Schema(doc); + expect(d.contentMediaType()).toEqual(doc.contentMediaType); + }); + + it('should return undefined where there is no value', function() { + const doc = {}; + const d = new Schema(doc); + expect(d.contentMediaType()).toBeUndefined(); + }); + }); + + describe('.default()', function() { + it('should return value', function() { + const doc = { default: '...' }; + const d = new Schema(doc); + expect(d.default()).toEqual(doc.default); + }); + + it('should return undefined where there is no value', function() { + const doc = {}; + const d = new Schema(doc); + expect(d.default()).toBeUndefined(); + }); + }); + + describe('.definitions()', function() { + it('should return map of definitions', function() { + const doc = { definitions: { def: {} } }; + const d = new Schema(doc); + expect(typeof d.definitions() === 'object').toEqual(true); + expect((d.definitions() as any)['def']).toBeInstanceOf(Schema); + }); + + it('should return undefined where there is no value', function() { + const doc = {}; + const d = new Schema(doc); + expect(d.default()).toBeUndefined(); + }); + }); + + describe('.description()', function() { + it('should return value', function() { + const doc = { description: '...' }; + const d = new Schema(doc); + expect(d.description()).toEqual(doc.description); + }); + + it('should return undefined where there is no value', function() { + const doc = {}; + const d = new Schema(doc); + expect(d.description()).toBeUndefined(); + }); + }); + + describe('.dependencies()', function() { + it('should return map of dependencies (schema case)', function() { + const doc = { dependencies: { dep: {} } }; + const d = new Schema(doc); + expect(typeof d.dependencies() === 'object').toEqual(true); + expect((d.dependencies() as any)['dep']).toBeInstanceOf(Schema); + }); + + it('should return map of dependencies (array case)', function() { + const doc = { dependencies: { array: [] } }; + const d = new Schema(doc); + expect(typeof d.dependencies() === 'object').toEqual(true); + expect(Array.isArray((d.dependencies() as any)['array'])).toEqual(true); + }); + + it('should return map of dependencies (schema and array case)', function() { + const doc = { dependencies: { dep: {}, array: [] } }; + const d = new Schema(doc); + expect(typeof d.dependencies() === 'object').toEqual(true); + expect((d.dependencies() as any)['dep']).toBeInstanceOf(Schema); + expect(Array.isArray((d.dependencies() as any)['array'])).toEqual(true); + }); + + it('should return undefined where there is no value', function() { + const doc = {}; + const d = new Schema(doc); + expect(d.dependencies()).toBeUndefined(); + }); + }); + + describe('.deprecated()', function() { + it('should return value', function() { + const doc = { deprecated: true }; + const d = new Schema(doc); + expect(d.deprecated()).toEqual(doc.deprecated); + }); + + it('should return false where there is no value', function() { + const doc = {}; + const d = new Schema(doc); + expect(d.deprecated()).toEqual(false); + }); + }); + + describe('.discriminator()', function() { + it('should return value', function() { + const doc = { discriminator: '...' }; + const d = new Schema(doc); + expect(d.discriminator()).toEqual(doc.discriminator); + }); + + it('should return undefined where there is no value', function() { + const doc = {}; + const d = new Schema(doc); + expect(d.discriminator()).toBeUndefined(); + }); + }); + + describe('.else()', function() { + it('should return value', function() { + const doc = { else: {} }; + const d = new Schema(doc); + expect(d.else()).toBeInstanceOf(Schema); + }); + + it('should return undefined where there is no value', function() { + const doc = {}; + const d = new Schema(doc); + expect(d.else()).toBeUndefined(); + }); + }); + + describe('.enum()', function() { + it('should return value', function() { + const doc = { enum: ['example'] }; + const d = new Schema(doc); + expect(Array.isArray(d.enum())).toEqual(true); + expect((d.enum() as any)[0]).toEqual('example'); + }); + + it('should return undefined where there is no value', function() { + const doc = {}; + const d = new Schema(doc); + expect(d.else()).toBeUndefined(); + }); + }); + + describe('.examples()', function() { + it('should return value', function() { + const doc = { examples: ['example'] }; + const d = new Schema(doc); + expect(Array.isArray(d.examples())).toEqual(true); + expect((d.examples() as any)[0]).toEqual('example'); + }); + + it('should return undefined where there is no value', function() { + const doc = {}; + const d = new Schema(doc); + expect(d.examples()).toBeUndefined(); + }); + }); + + describe('.exclusiveMaximum()', function() { + it('should return value', function() { + const doc = { exclusiveMaximum: 2137 }; + const d = new Schema(doc); + expect(d.exclusiveMaximum()).toEqual(doc.exclusiveMaximum); + }); + + it('should return undefined where there is no value', function() { + const doc = {}; + const d = new Schema(doc); + expect(d.exclusiveMaximum()).toBeUndefined(); + }); + }); + + describe('.exclusiveMinimum()', function() { + it('should return value', function() { + const doc = { exclusiveMinimum: 2137 }; + const d = new Schema(doc); + expect(d.exclusiveMinimum()).toEqual(doc.exclusiveMinimum); + }); + + it('should return undefined where there is no value', function() { + const doc = {}; + const d = new Schema(doc); + expect(d.exclusiveMinimum()).toBeUndefined(); + }); + }); + + describe('.format()', function() { + it('should return value', function() { + const doc = { format: '...' }; + const d = new Schema(doc); + expect(d.format()).toEqual(doc.format); + }); + + it('should return undefined where there is no value', function() { + const doc = {}; + const d = new Schema(doc); + expect(d.format()).toBeUndefined(); + }); + }); + + describe('.isBooleanSchema()', function() { + it('should return true where value is true boolean', function() { + const d = new Schema(true as any); + expect(d.isBooleanSchema()).toEqual(true); + }); + + it('should return true where value is false boolean', function() { + const d = new Schema(false as any); + expect(d.isBooleanSchema()).toEqual(true); + }); + + it('should return false where value is object', function() { + const d = new Schema({}); + expect(d.isBooleanSchema()).toEqual(false); + }); + }); + + describe('.if()', function() { + it('should return value', function() { + const doc = { if: {} }; + const d = new Schema(doc); + expect(d.if()).toBeInstanceOf(Schema); + }); + + it('should return undefined where there is no value', function() { + const doc = {}; + const d = new Schema(doc); + expect(d.if()).toBeUndefined(); + }); + }); + + describe('.isCircular()', function() { + it('should return a true when schema has circular reference', function() { + const doc: v3.AsyncAPISchemaObject = { + properties: { + nonCircular: { + type: 'string', + }, + circular: {}, + } + }; + doc.properties!.circular = doc; + const d = new Schema(doc); + expect(d.isCircular()).toEqual(false); + expect((d.properties() as any)['nonCircular'].isCircular()).toEqual(false); + expect((d.properties() as any)['circular'].isCircular()).toEqual(true); + }); + }); + + describe('.items()', function() { + it('should return schema instance', function() { + const doc = { items: {} }; + const d = new Schema(doc); + expect(d.items()).toBeInstanceOf(Schema); + }); + + it('should return collection of schemas', function() { + const doc = { items: [{}, {}] }; + const d = new Schema(doc); + expect(Array.isArray(d.items())).toEqual(true); + expect(d.items()).toHaveLength(2); + expect((d.items() as any)[0]).toBeInstanceOf(Schema); + expect((d.items() as any)[1]).toBeInstanceOf(Schema); + }); + + it('should return undefined where there is no value', function() { + const doc = {}; + const d = new Schema(doc); + expect(d.items()).toBeUndefined(); + }); + }); + + describe('.maximum()', function() { + it('should return value', function() { + const doc = { maximum: 2137 }; + const d = new Schema(doc); + expect(d.maximum()).toEqual(doc.maximum); + }); + + it('should return undefined where there is no value', function() { + const doc = {}; + const d = new Schema(doc); + expect(d.maximum()).toBeUndefined(); + }); + }); + + describe('.maxItems()', function() { + it('should return value', function() { + const doc = { maxItems: 2137 }; + const d = new Schema(doc); + expect(d.maxItems()).toEqual(doc.maxItems); + }); + + it('should return undefined where there is no value', function() { + const doc = {}; + const d = new Schema(doc); + expect(d.maxItems()).toBeUndefined(); + }); + }); + + describe('.maxLength()', function() { + it('should return value', function() { + const doc = { maxLength: 2137 }; + const d = new Schema(doc); + expect(d.maxLength()).toEqual(doc.maxLength); + }); + + it('should return undefined where there is no value', function() { + const doc = {}; + const d = new Schema(doc); + expect(d.maxLength()).toBeUndefined(); + }); + }); + + describe('.maxProperties()', function() { + it('should return value', function() { + const doc = { maxProperties: 2137 }; + const d = new Schema(doc); + expect(d.maxProperties()).toEqual(doc.maxProperties); + }); + + it('should return undefined where there is no value', function() { + const doc = {}; + const d = new Schema(doc); + expect(d.maxProperties()).toBeUndefined(); + }); + }); + + describe('.minimum()', function() { + it('should return value', function() { + const doc = { minimum: 2137 }; + const d = new Schema(doc); + expect(d.minimum()).toEqual(doc.minimum); + }); + + it('should return undefined where there is no value', function() { + const doc = {}; + const d = new Schema(doc); + expect(d.minimum()).toBeUndefined(); + }); + }); + + describe('.minItems()', function() { + it('should return value', function() { + const doc = { minItems: 2137 }; + const d = new Schema(doc); + expect(d.minItems()).toEqual(doc.minItems); + }); + + it('should return undefined where there is no value', function() { + const doc = {}; + const d = new Schema(doc); + expect(d.minItems()).toBeUndefined(); + }); + }); + + describe('.minLength()', function() { + it('should return value', function() { + const doc = { minLength: 2137 }; + const d = new Schema(doc); + expect(d.minLength()).toEqual(doc.minLength); + }); + + it('should return undefined where there is no value', function() { + const doc = {}; + const d = new Schema(doc); + expect(d.minLength()).toBeUndefined(); + }); + }); + + describe('.minProperties()', function() { + it('should return value', function() { + const doc = { minProperties: 2137 }; + const d = new Schema(doc); + expect(d.minProperties()).toEqual(doc.minProperties); + }); + + it('should return undefined where there is no value', function() { + const doc = {}; + const d = new Schema(doc); + expect(d.minProperties()).toBeUndefined(); + }); + }); + + describe('.multipleOf()', function() { + it('should return value', function() { + const doc = { multipleOf: 2137 }; + const d = new Schema(doc); + expect(d.multipleOf()).toEqual(doc.multipleOf); + }); + + it('should return undefined where there is no value', function() { + const doc = {}; + const d = new Schema(doc); + expect(d.multipleOf()).toBeUndefined(); + }); + }); + + describe('.not()', function() { + it('should return value', function() { + const doc = { not: {} }; + const d = new Schema(doc); + expect(d.not()).toBeInstanceOf(Schema); + }); + + it('should return undefined where there is no value', function() { + const doc = {}; + const d = new Schema(doc); + expect(d.not()).toBeUndefined(); + }); + }); + + describe('.oneOf()', function() { + it('should return collection of schemas', function() { + const doc = { oneOf: [{}, {}] }; + const d = new Schema(doc); + expect(Array.isArray(d.oneOf())).toEqual(true); + expect(d.oneOf()).toHaveLength(2); + expect((d.oneOf() as any)[0]).toBeInstanceOf(Schema); + expect((d.oneOf() as any)[1]).toBeInstanceOf(Schema); + }); + + it('should return undefined where there is no value', function() { + const doc = {}; + const d = new Schema(doc); + expect(d.oneOf()).toBeUndefined(); + }); + }); + + describe('.pattern()', function() { + it('should return value', function() { + const doc = { pattern: '...' }; + const d = new Schema(doc); + expect(d.pattern()).toEqual(doc.pattern); + }); + + it('should return undefined where there is no value', function() { + const doc = {}; + const d = new Schema(doc); + expect(d.pattern()).toBeUndefined(); + }); + }); + + describe('.patternProperties()', function() { + it('should return map of patternProperties', function() { + const doc = { patternProperties: { prop: {} } }; + const d = new Schema(doc); + expect(typeof d.patternProperties() === 'object').toEqual(true); + expect((d.patternProperties() as any)['prop']).toBeInstanceOf(Schema); + }); + + it('should return undefined where there is no value', function() { + const doc = {}; + const d = new Schema(doc); + expect(d.patternProperties()).toBeUndefined(); + }); + }); + + describe('.properties()', function() { + it('should return map of properties', function() { + const doc = { properties: { prop: {} } }; + const d = new Schema(doc); + expect(typeof d.properties() === 'object').toEqual(true); + expect((d.properties() as any)['prop']).toBeInstanceOf(Schema); + }); + + it('should return undefined where there is no value', function() { + const doc = {}; + const d = new Schema(doc); + expect(d.properties()).toBeUndefined(); + }); + }); + + describe('.property()', function() { + it('should return property', function() { + const doc = { properties: { prop: {} } }; + const d = new Schema(doc); + expect(d.property('prop')).toBeInstanceOf(Schema); + }); + + it('should return undefined where there is no property', function() { + const doc = { properties: { another: {} } }; + const d = new Schema(doc); + expect(d.property('prop')).toBeUndefined(); + }); + + it('should return undefined where there is no properties', function() { + const doc = {}; + const d = new Schema(doc); + expect(d.property('prop')).toBeUndefined(); + }); + }); + + describe('.propertyNames()', function() { + it('should return value', function() { + const doc = { propertyNames: {} }; + const d = new Schema(doc); + expect(d.propertyNames()).toBeInstanceOf(Schema); + }); + + it('should return undefined where there is no value', function() { + const doc = {}; + const d = new Schema(doc); + expect(d.propertyNames()).toBeUndefined(); + }); + }); + + describe('.readOnly()', function() { + it('should return value', function() { + const doc = { readOnly: true }; + const d = new Schema(doc); + expect(d.readOnly()).toEqual(doc.readOnly); + }); + + it('should return false where there is no value', function() { + const doc = {}; + const d = new Schema(doc); + expect(d.readOnly()).toEqual(false); + }); + }); + + describe('.required()', function() { + it('should return array of required properties', function() { + const doc = { required: ['prop1', 'prop2'] }; + const d = new Schema(doc); + expect(d.required()).toEqual(doc.required); + }); + + it('should return false where there is no value', function() { + const doc = {}; + const d = new Schema(doc); + expect(d.required()).toBeUndefined(); + }); + }); + + describe('.schemaFormat()', function() { + it('should return the format of the schema', function() { + const actualSchemaFormat = 'application/vnd.apache.avro;version=1.9.0'; + const doc = {schemaFormat: actualSchemaFormat, schema: {}}; + + const d = new Schema(doc, {asyncapi: {} as any, pointer: '', }); + expect(d.schemaFormat()).toEqual(actualSchemaFormat); + }); + + it('should return the default schema format where there is no value', function() { + const d = new Schema({}, {asyncapi: { semver: { version: '3.0.0' } }}); + expect(d.schemaFormat()).toEqual(getDefaultSchemaFormat('3.0.0')); + }); + }); + + describe('MultiFormatSchema is parsed correctly', function() { + it('should return any field from the underlaying schema', function() { + const doc = {schemaFormat: 'whatever', schema: {$comment: 'test'}}; + const d = new Schema(doc, {asyncapi: {} as any, pointer: '', }); + expect(d.$comment()).toEqual('test'); + }); + }); + + describe('.then()', function() { + it('should return value', function() { + const doc = { then: {} }; + const d = new Schema(doc); + expect(d.then()).toBeInstanceOf(Schema); + }); + + it('should return undefined where there is no value', function() { + const doc = {}; + const d = new Schema(doc); + expect(d.then()).toBeUndefined(); + }); + }); + + describe('.title()', function() { + it('should return value', function() { + const doc = { title: '...' }; + const d = new Schema(doc); + expect(d.title()).toEqual(doc.title); + }); + + it('should return undefined where there is no value', function() { + const doc = {}; + const d = new Schema(doc); + expect(d.title()).toBeUndefined(); + }); + }); + + describe('.type()', function() { + it('should return single type', function() { + const doc: v3.AsyncAPISchemaObject = { type: 'object' }; + const d = new Schema(doc); + expect(d.type()).toEqual(doc.type); + }); + + it('should return array of type', function() { + const doc: v3.AsyncAPISchemaObject = { type: ['object', 'array'] }; + const d = new Schema(doc); + expect(d.type()).toEqual(doc.type); + }); + + it('should return false where there is no value', function() { + const doc = {}; + const d = new Schema(doc); + expect(d.type()).toBeUndefined(); + }); + }); + + describe('.uniqueItems()', function() { + it('should return value', function() { + const doc = { uniqueItems: true }; + const d = new Schema(doc); + expect(d.uniqueItems()).toEqual(doc.uniqueItems); + }); + + it('should return false where there is no value', function() { + const doc = {}; + const d = new Schema(doc); + expect(d.uniqueItems()).toEqual(false); + }); + }); + + describe('.writeOnly()', function() { + it('should return value', function() { + const doc = { writeOnly: true }; + const d = new Schema(doc); + expect(d.writeOnly()).toEqual(doc.writeOnly); + }); + + it('should return false where there is no value', function() { + const doc = {}; + const d = new Schema(doc); + expect(d.writeOnly()).toEqual(false); + }); + }); + + describe('mixins', function() { + assertExtensions(Schema); + assertExternalDocumentation(Schema); + }); +}); diff --git a/test/models/v3/server-variable.spec.ts b/test/models/v3/server-variable.spec.ts new file mode 100644 index 000000000..0a4c0e98b --- /dev/null +++ b/test/models/v3/server-variable.spec.ts @@ -0,0 +1,34 @@ +import { ServerVariable } from '../../../src/models/v3/server-variable'; + +import { assertDescription, assertExtensions } from './utils'; + +const doc = { + description: 'Secure connection (TLS) is available through port 8883.', + default: '1883', + enum: ['1883', '8883'] +}; + +const sv = new ServerVariable(doc, { asyncapi: {} as any, pointer: '', id: 'doc' }); + +describe('Server Variable ', function() { + describe('.id()', function() { + expect(sv.id()).toMatch('doc'); + }); + + describe('.hasAllowedValue()', function() { + it('should return true when enum is passed', function() { + expect(sv.hasAllowedValues()).toBeTruthy(); + }); + }); + + describe('.allowedValue()', function() { + it('should return enum object', function() { + expect(sv.allowedValues()).toEqual(doc.enum); + }); + }); + + describe('mixins', function() { + assertDescription(ServerVariable); + assertExtensions(ServerVariable); + }); +}); diff --git a/test/models/v3/server.spec.ts b/test/models/v3/server.spec.ts new file mode 100644 index 000000000..2669bc8dd --- /dev/null +++ b/test/models/v3/server.spec.ts @@ -0,0 +1,237 @@ +import { Channels } from '../../../src/models/v3/channels'; +import { Channel } from '../../../src/models/v3/channel'; +import { Messages } from '../../../src/models/v3/messages'; +import { Message } from '../../../src/models/v3/message'; +import { Operations } from '../../../src/models/v3/operations'; +import { Operation } from '../../../src/models/v3/operation'; +import { Server } from '../../../src/models/v3/server'; +import { ServerVariables } from '../../../src/models/v3/server-variables'; +import { SecurityScheme } from '../../../src/models/v3/security-scheme'; +import { SecurityRequirements } from '../../../src/models/v3/security-requirements'; +import { SecurityRequirement } from '../../../src/models/v3/security-requirement'; + +import { serializeInput, assertCoreModel } from './utils'; + +import type { v3 } from '../../../src/spec-types'; +import { xParserObjectUniqueId } from '../../../src/constants'; + +const doc = { + production: { + host: 'rabbitmq.in.mycompany.com:5672', + pathname: '/production', + protocol: 'amqp', + protocolVersion: '1.0.0', + variables: { + username: { + default: 'demo', + description: 'This value is assigned by the service provider, in this example `gigantic-server.com`' + } + } + } +}; +const docItem = new Server(doc.production, { asyncapi: {} as any, pointer: '', id: 'production' }); +const emptyItem = new Server(serializeInput({}), { asyncapi: {} as any, pointer: '', id: '' }); + +describe('Server Model', function () { + describe('.id()', function () { + it('should return name if present', function () { + expect(docItem.id()).toEqual('production'); + }); + }); + + describe('.url()', function () { + it('should return value', function () { + expect(docItem.url()).toEqual(`${doc.production.protocol}://${doc.production.host}${doc.production.pathname}`); + }); + }); + + describe('.host()', function () { + it('should return value', function () { + expect(docItem.host()).toEqual(doc.production.host); + }); + }); + + describe('protocol()', function () { + it('should return protocol ', function () { + expect(docItem.protocol()).toEqual(doc.production.protocol); + }); + }); + + describe('.hasPathname()', function () { + it('should return true if pathname is not missing', function () { + expect(docItem.hasPathname()).toEqual(true); + }); + + it('should be false when protocolVersion is missing', function () { + const docItem = new Server({ ...doc.production, pathname: undefined }, { asyncapi: {} as any, pointer: '', id: 'development' }); + expect(docItem.hasPathname()).toEqual(false); + }); + }); + + describe('.pathname()', function () { + it('should return value', function () { + expect(docItem.pathname()).toEqual(doc.production.pathname); + }); + + it('should return undefined if value is not set', function () { + const docItem = new Server({ ...doc.production, pathname: undefined }, { asyncapi: {} as any, pointer: '', id: 'development' }); + expect(docItem.pathname()).toBeUndefined(); + }); + }); + + describe('.hasProtocolVersion()', function () { + it('should return true if protocolVersion is not missing', function () { + expect(docItem.hasProtocolVersion()).toBeTruthy(); + }); + + it('should be false when protocolVersion is missing', function () { + expect(emptyItem.hasProtocolVersion()).toBeFalsy(); + }); + }); + + describe('.protocolVersion()', function () { + it('should return value', function () { + expect(docItem.protocolVersion()).toMatch(doc.production.protocolVersion); + }); + + it('should return undefined when protocolVersion is missing', function () { + expect(emptyItem.protocolVersion()).toBeUndefined(); + }); + }); + + describe('.channels()', function() { + it('should return collection of channels - single channel', function() { + const doc = serializeInput({}); + const d = new Server(doc, { asyncapi: { parsed: { channels: { userSignup: { address: 'user/signup' } } } } as any, pointer: '', id: 'production' }); + expect(d.channels()).toBeInstanceOf(Channels); + expect(d.channels().all()).toHaveLength(1); + expect(d.channels().all()[0]).toBeInstanceOf(Channel); + expect(d.channels().all()[0].address()).toEqual('user/signup'); + }); + + it('should return collection of channels - multiple channels', function() { + const doc = serializeInput({}); + const d = new Server(doc, { asyncapi: { parsed: { channels: { userSignup: { address: 'user/signup' }, userLogout: { address: 'user/logout' } } } } as any, pointer: '', id: 'production' }); + expect(d.channels()).toBeInstanceOf(Channels); + expect(d.channels().all()).toHaveLength(2); + expect(d.channels().all()[0]).toBeInstanceOf(Channel); + expect(d.channels().all()[0].address()).toEqual('user/signup'); + expect(d.channels().all()[1]).toBeInstanceOf(Channel); + expect(d.channels().all()[1].address()).toEqual('user/logout'); + }); + + it('should return collection of channels - server available only in particular channel', function() { + const doc = serializeInput({}); + const d = new Server(doc, { asyncapi: { parsed: { channels: { userSignup: { address: 'user/signup', servers: [doc] }, userLogout: { address: 'user/logout', servers: [{}] }, userCreate: { address: 'user/create' } } } } as any, pointer: '', id: 'production', }); + expect(d.channels()).toBeInstanceOf(Channels); + expect(d.channels().all()).toHaveLength(2); + expect(d.channels().all()[0]).toBeInstanceOf(Channel); + expect(d.channels().all()[0].address()).toEqual('user/signup'); + expect(d.channels().all()[1]).toBeInstanceOf(Channel); + expect(d.channels().all()[1].address()).toEqual('user/create'); + }); + }); + + describe('.operations()', function() { + it('should return collection of operations - one operation', function() { + const doc = serializeInput({}); + const channel = {}; + const d = new Server(doc, { asyncapi: { parsed: { channels: { someChannel: channel }, operations: { someOperation: { channel } } } } as any, pointer: '', id: 'production' }); + expect(d.operations()).toBeInstanceOf(Operations); + expect(d.operations().all()).toHaveLength(1); + expect(d.operations().all()[0]).toBeInstanceOf(Operation); + expect(d.operations().all()[0].id()).toEqual('someOperation'); + }); + + it('should return collection of channels - multiple operations', function() { + const doc = serializeInput({}); + const channel = {}; + const d = new Server(doc, { asyncapi: { parsed: { channels: { someChannel: channel }, operations: { someOperation1: { channel }, someOperation2: { channel} } } } as any, pointer: '', id: 'production' }); + expect(d.operations()).toBeInstanceOf(Operations); + expect(d.operations().all()).toHaveLength(2); + expect(d.operations().all()[0]).toBeInstanceOf(Operation); + expect(d.operations().all()[0].id()).toEqual('someOperation1'); + expect(d.operations().all()[1]).toBeInstanceOf(Operation); + expect(d.operations().all()[1].id()).toEqual('someOperation2'); + }); + + it('should return collection of operations - server available only in particular channel', function() { + const doc = serializeInput({}); + const channel = { servers: [doc] }; + channel[xParserObjectUniqueId] = 'unique-id'; + const d = new Server(doc, { asyncapi: { parsed: { channels: { someChannel: channel }, operations: { someOperation1: { channel }, someOperation2: { channel: { servers: [{}] } } } } } as any, pointer: '', id: 'production' }); + expect(d.operations()).toBeInstanceOf(Operations); + expect(d.operations().all()).toHaveLength(1); + expect(d.operations().all()[0]).toBeInstanceOf(Operation); + expect(d.operations().all()[0].id()).toEqual('someOperation1'); + }); + }); + + describe('.messages()', function() { + it('should return collection of messages - one message', function() { + const doc = serializeInput({}); + const d = new Server(doc, { asyncapi: { parsed: { channels: { someChannel: { messages: { someMessage: { summary: 'summary' } } } } } } as any, pointer: '', id: 'production' }); + expect(d.messages()).toBeInstanceOf(Messages); + expect(d.messages().all()).toHaveLength(1); + expect(d.messages().all()[0]).toBeInstanceOf(Message); + expect(d.messages().all()[0].summary()).toEqual('summary'); + }); + + it('should return collection of messages - more than one messages', function() { + const doc = serializeInput({}); + const d = new Server(doc, { asyncapi: { parsed: { channels: { someChannel1: { messages: { someMessage1: { summary: 'summary1' } } }, someChannel2: { messages: { someMessage2: { summary: 'summary2' }, someMessage3: { summary: 'summary3' } } } } } } as any, pointer: '', id: 'production' }); + expect(d.messages()).toBeInstanceOf(Messages); + expect(d.messages().all()).toHaveLength(3); + expect(d.messages().all()[0]).toBeInstanceOf(Message); + expect(d.messages().all()[0].summary()).toEqual('summary1'); + expect(d.messages().all()[1]).toBeInstanceOf(Message); + expect(d.messages().all()[1].summary()).toEqual('summary2'); + expect(d.messages().all()[2]).toBeInstanceOf(Message); + expect(d.messages().all()[2].summary()).toEqual('summary3'); + }); + + it('should return collection of messages - server available only in particular channel', function() { + const doc = serializeInput({}); + const d = new Server(doc, { asyncapi: { parsed: { channels: { someChannel1: { servers: [doc], messages: { someMessage1: { summary: 'summary1' } } }, someChannel2: { servers: [{}], messages: { someMessage2: { summary: 'summary2' }, someMessage3: { summary: 'summary3' } } } } } } as any, pointer: '', id: 'production' }); + expect(d.messages()).toBeInstanceOf(Messages); + expect(d.messages().all()).toHaveLength(1); + expect(d.messages().all()[0]).toBeInstanceOf(Message); + expect(d.messages().all()[0].summary()).toEqual('summary1'); + }); + }); + + describe('.variables()', function () { + it('should return ServerVariables object', function () { + expect(docItem.variables()).toBeInstanceOf(ServerVariables); + }); + }); + + describe('.security()', function() { + it('should return SecurityRequirements', function() { + const doc = serializeInput({ security: [{ type: 'apiKey' }] }); + const d = new Server(doc, {pointer: '/servers/test'} as any); + + const security = d.security(); + expect(Array.isArray(security)).toEqual(true); + expect(security).toHaveLength(1); + expect(security[0]).toBeInstanceOf(SecurityRequirements); + + const requirement = security[0].all()[0] as SecurityRequirement; + expect(requirement).toBeInstanceOf(SecurityRequirement); + expect(requirement.scheme()).toBeInstanceOf(SecurityScheme); + expect(requirement.scopes()).toEqual([]); + expect(requirement.meta().pointer).toEqual('/servers/test/security/0'); + }); + + it('should return SecurityRequirements when value is undefined', function() { + const doc = serializeInput({}); + const d = new Server(doc); + expect(Array.isArray(d.security())).toEqual(true); + expect(d.security()).toHaveLength(0); + }); + }); + + describe('mixins', function () { + assertCoreModel(Server); + }); +}); diff --git a/test/models/v3/tag.spec.ts b/test/models/v3/tag.spec.ts new file mode 100644 index 000000000..04086f139 --- /dev/null +++ b/test/models/v3/tag.spec.ts @@ -0,0 +1,19 @@ +import { Tag } from '../../../src/models/v3/tag'; + +import { assertDescription, assertExtensions, assertExternalDocumentation } from './utils'; + +describe('Tag model', function() { + describe('.name()', function() { + it('should return the value', function() { + const doc = { name: 'LeChuck' }; + const d = new Tag(doc); + expect(d.name()).toEqual(doc.name); + }); + }); + + describe('mixins inheritance', function() { + assertDescription(Tag); + assertExtensions(Tag); + assertExternalDocumentation(Tag); + }); +}); diff --git a/test/models/v3/utils.ts b/test/models/v3/utils.ts new file mode 100644 index 000000000..60cd6f42e --- /dev/null +++ b/test/models/v3/utils.ts @@ -0,0 +1,230 @@ +import { BindingsV3, ExtensionsV3, ExternalDocumentationV3, TagsV3 } from '../../../src/models/v3'; + +import type { Constructor } from '../../../src/models/utils'; +import type { BindingsMixinInterface, CoreMixinInterface, DescriptionMixinInterface, ExtensionsMixinInterface, ExternalDocumentationMixinInterface, SummaryMixinInterface, TagsMixinInterface, TitleMixinInterface } from '../../../src/models/mixins'; + +type DeepPartial = T extends object ? { [P in keyof T]?: DeepPartial } : T; + +export function serializeInput(data: DeepPartial): T { + return data as T; +} + +export function assertBindings(model: Constructor) { + describe('.bindings()', () => { + const doc1 = { bindings: { amqp: { test: 'test1' } } }; + const doc2 = { bindings: {} }; + const doc3 = {}; + const d1 = new model(doc1); + const d2 = new model(doc2); + const d3 = new model(doc3); + + it('should return a collection of bindings', () => { + expect(d1.bindings()).toBeInstanceOf(BindingsV3); + expect(d1.bindings().length).toEqual(1); + }); + + it('should return an empty object', () => { + expect(d2.bindings()).toBeInstanceOf(BindingsV3); + expect(d2.bindings().length).toEqual(0); + expect(d3.bindings()).toBeInstanceOf(BindingsV3); + expect(d3.bindings().length).toEqual(0); + }); + }); +} + +export function assertDescription(model: Constructor) { + describe('.hasDescription()', () => { + const doc1 = { description: 'Testing' }; + const doc2 = { description: '' }; + const doc3 = {}; + const d1 = new model(doc1); + const d2 = new model(doc2); + const d3 = new model(doc3); + + it('should return a boolean indicating if the object has description', () => { + expect(d1.hasDescription()).toEqual(true); + expect(d2.hasDescription()).toEqual(false); + expect(d3.hasDescription()).toEqual(false); + }); + }); + + describe('.description()', () => { + const doc1 = { description: 'Testing' }; + const doc2 = { description: '' }; + const doc3 = {}; + const d1 = new model(doc1); + const d2 = new model(doc2); + const d3 = new model(doc3); + + it('should return a value', () => { + expect(d1.description()).toEqual(doc1.description); + expect(d2.description()).toEqual(''); + }); + + it('should return an undefined', () => { + expect(d3.description()).toEqual(undefined); + }); + }); +} + +export function assertExtensions(model: Constructor) { + describe('.extensions()', () => { + const doc1 = { 'x-test': 'testing', test: 'testing' }; + const doc2 = { test: 'testing' }; + const doc3 = {}; + const d1 = new model(doc1); + const d2 = new model(doc2); + const d3 = new model(doc3); + + it('should return a collection with extensions', () => { + expect(d1.extensions()).toBeInstanceOf(ExtensionsV3); + expect(d1.extensions().length).toEqual(1); + }); + + it('should return a empty object', () => { + expect(d2.extensions()).toBeInstanceOf(ExtensionsV3); + expect(d2.extensions().length).toEqual(0); + expect(d3.extensions()).toBeInstanceOf(ExtensionsV3); + expect(d3.extensions().length).toEqual(0); + }); + }); +} + +export function assertExternalDocumentation(model: Constructor) { + describe('.hasExternalDocs()', () => { + const doc1 = { externalDocs: { url: 'test.com' } }; + const doc2 = { externalDocs: {} }; + const doc3 = {}; + const d1 = new model(doc1); + const d2 = new model(doc2); + const d3 = new model(doc3); + + it('should return a boolean indicating if the object has externalDocs', () => { + expect(d1.hasExternalDocs()).toEqual(true); + expect(d2.hasExternalDocs()).toEqual(false); + expect(d3.hasExternalDocs()).toEqual(false); + }); + }); + + describe('.externalDocs()', () => { + const doc1 = { externalDocs: { url: 'test.com' } }; + const doc2 = { externalDocs: {} }; + const doc3 = {}; + const d1 = new model(doc1); + const d2 = new model(doc2); + const d3 = new model(doc3); + + it('should return a externalDocs object', () => { + expect(d1.externalDocs()).toBeInstanceOf(ExternalDocumentationV3); + expect(d1.externalDocs()!.json()).toEqual(doc1.externalDocs); + }); + + it('should return a undefined', () => { + expect(d2.externalDocs()).toEqual(undefined); + expect(d3.externalDocs()).toEqual(undefined); + }); + }); +} + +export function assertSummary(model: Constructor) { + describe('.hasSummary()', () => { + const doc1 = { summary: 'Testing' }; + const doc2 = { summary: '' }; + const doc3 = {}; + const d1 = new model(doc1); + const d2 = new model(doc2); + const d3 = new model(doc3); + + it('should return a boolean indicating if the object has summary', () => { + expect(d1.hasSummary()).toEqual(true); + expect(d2.hasSummary()).toEqual(false); + expect(d3.hasSummary()).toEqual(false); + }); + }); + + describe('.summary()', () => { + const doc1 = { summary: 'Testing' }; + const doc2 = { summary: '' }; + const doc3 = {}; + const d1 = new model(doc1); + const d2 = new model(doc2); + const d3 = new model(doc3); + + it('should return a value', () => { + expect(d1.summary()).toEqual(doc1.summary); + expect(d2.summary()).toEqual(''); + }); + + it('should return an undefined', () => { + expect(d3.summary()).toEqual(undefined); + }); + }); +} + +export function assertTags(model: Constructor) { + describe('tags', () => { + const doc1 = { tags: [{ name: 'test1' }, { name: 'test2' }] }; + const doc2 = { tags: [] }; + const doc3 = {}; + const d1 = new model(doc1); + const d2 = new model(doc2); + const d3 = new model(doc3); + + it('should return an array of tag objects', () => { + expect(d1.tags()).toBeInstanceOf(TagsV3); + expect(d1.tags().length).toEqual(2); + }); + + it('should return an empty array', () => { + expect(d2.tags()).toBeInstanceOf(TagsV3); + expect(d2.tags().length).toEqual(0); + expect(d3.tags()).toBeInstanceOf(TagsV3); + expect(d3.tags().length).toEqual(0); + }); + }); +} + +export function assertTitle(model: Constructor) { + describe('.hasTitle()', () => { + const doc1 = { title: 'Testing' }; + const doc2 = { title: '' }; + const doc3 = {}; + const d1 = new model(doc1); + const d2 = new model(doc2); + const d3 = new model(doc3); + + it('should return a boolean indicating if the object has title', () => { + expect(d1.hasTitle()).toEqual(true); + expect(d2.hasTitle()).toEqual(false); + expect(d3.hasTitle()).toEqual(false); + }); + }); + + describe('.title()', () => { + const doc1 = { title: 'Testing' }; + const doc2 = { title: '' }; + const doc3 = {}; + const d1 = new model(doc1); + const d2 = new model(doc2); + const d3 = new model(doc3); + + it('should return a value', () => { + expect(d1.title()).toEqual(doc1.title); + expect(d2.title()).toEqual(''); + }); + + it('should return an undefined', () => { + expect(d3.title()).toEqual(undefined); + }); + }); +} + +export function assertCoreModel(model: Constructor) { + assertBindings(model); + assertDescription(model); + assertExtensions(model); + assertExternalDocumentation(model); + assertSummary(model); + assertTags(model); + assertTitle(model); +} diff --git a/test/parse.spec.ts b/test/parse.spec.ts index 265ffb362..d7cf4fde7 100644 --- a/test/parse.spec.ts +++ b/test/parse.spec.ts @@ -1,6 +1,6 @@ import { Document } from '@stoplight/spectral-core'; -import { AsyncAPIDocumentV2, AsyncAPIDocumentV3 } from '../src/models'; +import { AsyncAPIDocumentV2, AsyncAPIDocumentV3, ParserAPIVersion } from '../src/models'; import { Parser } from '../src/parser'; import { xParserApiVersion } from '../src/constants'; @@ -32,9 +32,8 @@ describe('parse()', function() { channels: {} }; const { document, diagnostics } = await parser.parse(documentRaw); - expect(document).toEqual(undefined); - expect(diagnostics.length > 0).toEqual(true); - expect(diagnostics[0].message).toContain('Version "3.0.0" is not supported'); + expect(document).toBeInstanceOf(AsyncAPIDocumentV3); + expect(diagnostics.length === 0).toEqual(true); }); it('should parse invalid document', async function() { @@ -51,6 +50,20 @@ describe('parse()', function() { expect(diagnostics.length > 0).toEqual(true); }); + it('should parse invalid v3 document', async function() { + const documentRaw = { + asyncapi: '3.0.0', + not_a_valid_info_object: { + title: 'Invalid AsyncApi document', + version: '1.0', + }, + }; + const { document, diagnostics } = await parser.parse(documentRaw); + + expect(document === undefined).toEqual(true); + expect(diagnostics.length > 0).toEqual(true); + }); + it('should return extras', async function() { const documentRaw = { asyncapi: '2.0.0', @@ -79,7 +92,7 @@ describe('parse()', function() { const { document } = await parser.parse(documentRaw); expect(document).toBeInstanceOf(AsyncAPIDocumentV2); - expect(document?.extensions().get(xParserApiVersion)?.value()).toEqual(1); + expect(document?.extensions().get(xParserApiVersion)?.value()).toEqual(ParserAPIVersion); }); it('should preserve references', async function() { diff --git a/test/ruleset/formats.spec.ts b/test/ruleset/formats.spec.ts index b2639a0e4..41474d651 100644 --- a/test/ruleset/formats.spec.ts +++ b/test/ruleset/formats.spec.ts @@ -19,9 +19,9 @@ describe('AsyncAPI format', () => { { formatVersion: '2.6.5', document: {asyncapi: '2.6.5'}, existsFormat: true, result: true }, { formatVersion: '2.6.5', document: {asyncapi: '2.0.0'}, existsFormat: true, result: false }, { formatVersion: '2.0.0', document: {asyncapi: '2.6.5'}, existsFormat: true, result: false }, - { formatVersion: '3.0.10', document: {asyncapi: '3.0.10'}, existsFormat: false, result: false }, - { formatVersion: '3.0.0', document: {openapi: '3.0.0'}, existsFormat: false, result: false }, - { formatVersion: '3.0.0', document: null, existsFormat: false, result: false }, + { formatVersion: '3.0.10', document: {asyncapi: '3.0.10'}, existsFormat: true, result: true }, + { formatVersion: '3.0.0', document: {openapi: '3.0.0'}, existsFormat: true, result: false }, + { formatVersion: '3.0.0', document: null, existsFormat: true, result: false }, { formatVersion: '999.999.0', document: {}, existsFormat: false, result: false }, { formatVersion: '19923.1.0', document: {}, existsFormat: false, result: false }, { formatVersion: '2.99.0', document: {}, existsFormat: false, result: false }, diff --git a/test/ruleset/rules/asyncapi-document-resolved.spec.ts b/test/ruleset/rules/asyncapi-document-resolved.spec.ts index 7369c1d0a..b90062123 100644 --- a/test/ruleset/rules/asyncapi-document-resolved.spec.ts +++ b/test/ruleset/rules/asyncapi-document-resolved.spec.ts @@ -15,7 +15,7 @@ testRule('asyncapi-document-resolved', [ }, { - name: 'invalid case (channels property is missing)', + name: 'invalid case for 2.X.X (channels property is missing)', document: { asyncapi: '2.0.0', info: { @@ -32,7 +32,7 @@ testRule('asyncapi-document-resolved', [ }, { - name: 'valid case (case when other errors should also occur but we filter them out)', + name: 'valid case for 2.X.X (case validating $ref resolution works as expected)', document: { asyncapi: '2.0.0', info: { @@ -309,4 +309,89 @@ testRule('asyncapi-document-resolved', [ }, errors: [], }, + + { + name: 'valid case (3.0.0 version)', + document: { + asyncapi: '3.0.0', + info: { + title: 'Signup service example (internal)', + version: '0.1.0', + }, + channels: { + 'user/signedup': { + address: 'user/signedup', + messages: { + 'subscribe.message': { + payload: {} + } + } + } + }, + operations: { + 'user/signedup.subscribe': { + action: 'send', + channel: { + address: 'user/signedup', + messages: { + 'subscribe.message': { + payload: {} + } + } + }, + messages: [ + { + payload: {} + } + ] + } + }, + }, + errors: [], + }, + + { + name: 'invalid case for 3.X.X (info.version property is missing)', + document: { + asyncapi: '3.0.0', + info: { + title: 'Valid AsyncApi document', + }, + }, + errors: [ + { + message: '"info" property must have required property "version"', + severity: DiagnosticSeverity.Error, + }, + ], + }, + + { + name: 'valid case for 3.X.X (case validating $ref resolution works as expected)', + document: { + asyncapi: '3.0.0', + info: { + title: 'Signup service example (internal)', + version: '0.1.0', + }, + channels: { + userSignedup: { + address: 'user/signedup', + messages: { + 'subscribe.message': { + $ref: '#/components/messages/testMessage' + } + } + } + }, + components: { + messages: { + testMessage: { + payload: {} + } + } + } + }, + errors: [], + }, ]); diff --git a/test/ruleset/rules/asyncapi-document-unresolved.spec.ts b/test/ruleset/rules/asyncapi-document-unresolved.spec.ts index 77876052b..91e1cdd1b 100644 --- a/test/ruleset/rules/asyncapi-document-unresolved.spec.ts +++ b/test/ruleset/rules/asyncapi-document-unresolved.spec.ts @@ -2,7 +2,7 @@ import { testRule, DiagnosticSeverity } from '../tester'; testRule('asyncapi-document-unresolved', [ { - name: 'valid case', + name: 'valid case for 2.X.X', document: { asyncapi: '2.0.0', info: { @@ -28,7 +28,7 @@ testRule('asyncapi-document-unresolved', [ }, { - name: 'invalid case (reference for operation object is not allowed)', + name: 'invalid case for 2.X.X (reference for operation object is not allowed)', document: { asyncapi: '2.0.0', info: { @@ -58,26 +58,49 @@ testRule('asyncapi-document-unresolved', [ }, { - name: 'invalid case (case when other errors should also occur but we filter them out - required info field is omitted)', + name: 'valid case for 3.X.X', document: { - asyncapi: '2.0.0', + asyncapi: '3.0.0', + info: { + title: 'Valid AsyncApi document', + version: '1.0', + }, channels: { - someChannel: { - publish: { - $ref: '#/components/x-operations/someOperation', - }, + userSignedup: { + address: 'user/signedup', + messages: { + 'subscribe.message': { + $ref: '#/components/messages/testMessage' + } + } + } + }, + components: { + messages: { + someMessage: {}, }, }, + }, + errors: [], + }, + + { + name: 'invalid case for 3.X.X (reference for info object is not allowed)', + document: { + asyncapi: '3.0.0', + info: { + $ref: '#/components/x-titles/someTitle' + }, components: { - 'x-operations': { - someOperation: {}, + 'x-titles': { + someTitle: 'some-title', }, }, }, errors: [ { message: 'Referencing in this place is not allowed', - path: ['channels', 'someChannel', 'publish'], + path: ['info'], severity: DiagnosticSeverity.Error, }, ], diff --git a/test/ruleset/rules/v3/asyncapi3-operation-messages-from-referred-channel.spec.ts b/test/ruleset/rules/v3/asyncapi3-operation-messages-from-referred-channel.spec.ts new file mode 100644 index 000000000..fc51d47b5 --- /dev/null +++ b/test/ruleset/rules/v3/asyncapi3-operation-messages-from-referred-channel.spec.ts @@ -0,0 +1,323 @@ +import { testRule, DiagnosticSeverity } from '../../tester'; + +testRule('asyncapi3-operation-messages-from-referred-channel', [ + { + name: 'valid case - required channel', + document: { + asyncapi: '3.0.0', + info: { + title: 'Account Service', + version: '1.0.0' + }, + channels: { + UserSignedUp: { + messages: { + UserSignedUp: { + payload: { + type: 'object', + properties: { + displayName: { + type: 'string' + }, + email: { + type: 'string' + } + } + } + } + } + } + }, + operations: { + UserSignedUp: { + action: 'send', + channel: { + $ref: '#/channels/UserSignedUp' + }, + messages: [ + { + $ref: '#/channels/UserSignedUp/messages/UserSignedUp' + } + ] + } + } + }, + errors: [], + }, + { + name: 'valid case - optional channel', + document: { + asyncapi: '3.0.0', + info: { + title: 'Account Service', + version: '1.0.0' + }, + channels: { + UserSignedUp: { + messages: { + UserSignedUp: { + payload: { + type: 'object', + properties: { + displayName: { + type: 'string' + }, + email: { + type: 'string' + } + } + } + } + } + } + }, + components: { + operations: { + UserSignedUp: { + action: 'send', + channel: { + $ref: '#/channels/UserSignedUp' + }, + messages: [ + { + $ref: '#/channels/UserSignedUp/messages/UserSignedUp' + } + ] + } + }, + } + }, + errors: [], + }, + { + name: 'invalid case - message from operation in root pointing to a message from an optional channel (same name) defined under components', + document: { + asyncapi: '3.0.0', + info: { + title: 'Account Service', + version: '1.0.0' + }, + channels: { + UserSignedUp: { + messages: { + UserSignedUp: { + payload: { + type: 'object', + properties: { + displayName: { + type: 'string' + }, + email: { + type: 'string' + } + } + } + } + } + } + }, + operations: { + UserSignedUp: { + action: 'send', + channel: { + $ref: '#/channels/UserSignedUp' + }, + messages: [ + { + $ref: '#/components/channels/UserSignedUp/messages/UserSignedUp' + } + ] + } + }, + components: { + channels: { + UserSignedUp: { + messages: { + UserSignedUp: { + payload: { + type: 'object', + properties: { + displayName: { + type: 'string' + }, + email: { + type: 'string' + } + } + } + } + } + } + }, + }, + }, + errors: [ + { + message: 'Operation message does not belong to the specified channel.', + path: ['operations', 'UserSignedUp', 'messages', '0'], + severity: DiagnosticSeverity.Error, + } + ], + }, + { + name: 'invalid case - message from operation in components pointing to a message from a different channel defined under components', + document: { + asyncapi: '3.0.0', + info: { + title: 'Account Service', + version: '1.0.0' + }, + channels: { + UserSignedUp: { + messages: { + UserSignedUp: { + payload: { + type: 'object', + properties: { + displayName: { + type: 'string' + }, + email: { + type: 'string' + } + } + } + } + } + } + }, + components: { + channels: { + UserRemoved: { + messages: { + UserRemoved: { + payload: { + type: 'object', + properties: { + displayName: { + type: 'string' + }, + email: { + type: 'string' + } + } + } + } + } + } + }, + operations: { + UserSignedUp: { + action: 'send', + channel: { + $ref: '#/channels/UserSignedUp' + }, + messages: [ + { + $ref: '#/components/channels/UserRemoved/messages/UserRemoved' + } + ] + } + }, + } + }, + errors: [ + { + message: 'Operation message does not belong to the specified channel.', + path: ['components', 'operations', 'UserSignedUp', 'messages', '0'], + severity: DiagnosticSeverity.Error, + } + ], + }, + { + name: 'invalid case - multiple messages from operation in components pointing to multiple message from a different channel defined under components', + document: { + asyncapi: '3.0.0', + info: { + title: 'Account Service', + version: '1.0.0' + }, + channels: { + UserSignedUp: { + messages: { + UserSignedUp: { + payload: { + type: 'object', + properties: { + displayName: { + type: 'string' + }, + email: { + type: 'string' + } + } + } + } + } + } + }, + components: { + channels: { + UserRemoved: { + messages: { + UserRemoved: { + payload: { + type: 'object', + properties: { + displayName: { + type: 'string' + }, + email: { + type: 'string' + } + } + } + }, + UserDeleted: { + payload: { + type: 'object', + properties: { + displayName: { + type: 'string' + }, + email: { + type: 'string' + } + } + } + } + } + } + }, + operations: { + UserSignedUp: { + action: 'send', + channel: { + $ref: '#/channels/UserSignedUp' + }, + messages: [ + { + $ref: '#/components/channels/UserRemoved/messages/UserRemoved' + }, + { + $ref: '#/components/channels/UserRemoved/messages/UserDeleted' + } + ] + } + }, + } + }, + errors: [ + { + message: 'Operation message does not belong to the specified channel.', + path: ['components', 'operations', 'UserSignedUp', 'messages', '0'], + severity: DiagnosticSeverity.Error, + }, + { + message: 'Operation message does not belong to the specified channel.', + path: ['components', 'operations', 'UserSignedUp', 'messages', '1'], + severity: DiagnosticSeverity.Error, + } + ], + }, +]); diff --git a/test/ruleset/rules/v3/asyncapi3-required-channel-servers-unambiguity.spec.ts b/test/ruleset/rules/v3/asyncapi3-required-channel-servers-unambiguity.spec.ts new file mode 100644 index 000000000..1a299eef9 --- /dev/null +++ b/test/ruleset/rules/v3/asyncapi3-required-channel-servers-unambiguity.spec.ts @@ -0,0 +1,210 @@ +import { testRule, DiagnosticSeverity } from '../../tester'; + +testRule('asyncapi3-required-channel-servers-unambiguity', [ + { + name: 'valid case - required channel (under root) server field points to a subset of required servers (under root)', + document: { + asyncapi: '3.0.0', + info: { + title: 'Account Service', + version: '1.0.0' + }, + servers: { + prod: { + host: 'my-api.com', + protocol: 'ws', + }, + dev: { + host: 'localhost', + protocol: 'ws', + }, + }, + channels: { + UserSignedUp: { + servers: [ + { $ref: '#/servers/prod' }, + { $ref: '#/servers/dev' }, + ] + } + }, + }, + errors: [], + }, + { + name: 'valid case - required channel (under root) server field points to a subset of required servers (under root) from an external doc', + document: { + asyncapi: '3.0.0', + info: { + title: 'Account Service', + version: '1.0.0' + }, + channels: { + UserSignedUp: { + servers: [ + { $ref: 'http://foo.bar/components/file.yml#/servers/prod' }, + { $ref: 'http://foo.bar/components/file.yml#/servers/dev' }, + ] + } + }, + }, + errors: [], + }, + { + name: 'valid case - optional channel (under components) server field points to a subset of required servers (under root)', + document: { + asyncapi: '3.0.0', + info: { + title: 'Account Service', + version: '1.0.0' + }, + servers: { + prod: { + host: 'my-api.com', + protocol: 'ws', + }, + dev: { + host: 'localhost', + protocol: 'ws', + }, + }, + components: { + channels: { + UserSignedUp: { + servers: [ + { $ref: '#/servers/prod' }, + { $ref: '#/servers/dev' }, + ] + } + }, + }, + }, + errors: [], + }, + { + name: 'valid case - optional channel (under components) server field points to a subset of optional servers (under components)', + document: { + asyncapi: '3.0.0', + info: { + title: 'Account Service', + version: '1.0.0' + }, + components: { + servers: { + prod: { + host: 'my-api.com', + protocol: 'ws', + }, + dev: { + host: 'localhost', + protocol: 'ws', + }, + }, + channels: { + UserSignedUp: { + messages: { + UserSignedUp: { + payload: { + type: 'object', + properties: { + displayName: { + type: 'string' + }, + email: { + type: 'string' + } + } + } + } + } + } + }, + operations: { + UserSignedUp: { + action: 'send', + channel: { + $ref: '#/components/channels/UserSignedUp' + }, + messages: [ + { + $ref: '#/components/channels/UserSignedUp/messages/UserSignedUp' + } + ] + } + } + } + }, + errors: [], + }, + { + name: 'invalid case - required channel (in root) servers field points to a subset of optional servers (under components)', + document: { + asyncapi: '3.0.0', + info: { + title: 'Account Service', + version: '1.0.0' + }, + channels: { + UserSignedUp: { + servers: [ + { $ref: '#/components/servers/prod' }, + { $ref: '#/components/servers/dev' }, + ] + } + }, + components: { + servers: { + prod: { + host: 'my-api.com', + protocol: 'ws', + }, + dev: { + host: 'localhost', + protocol: 'ws', + }, + } + } + }, + errors: [ + { + message: 'The "servers" field of a channel under the root "channels" object must always reference a subset of the servers under the root "servers" object.', + path: ['channels', 'UserSignedUp', 'servers', '0', '$ref'], + severity: DiagnosticSeverity.Error, + }, + { + message: 'The "servers" field of a channel under the root "channels" object must always reference a subset of the servers under the root "servers" object.', + path: ['channels', 'UserSignedUp', 'servers', '1', '$ref'], + severity: DiagnosticSeverity.Error, + } + ], + }, + { + name: 'invalid case - required channel (in root) servers field points to a subset of optional servers (under components) from an external doc', + document: { + asyncapi: '3.0.0', + info: { + title: 'Account Service', + version: '1.0.0' + }, + channels: { + UserSignedUp: { + servers: [ + { $ref: 'http://foo.bar/components/file.yml#/components/servers/prod' }, + { $ref: 'http://foo.bar/components/file.yml#/components/servers/dev' }, + ] + } + } + }, + errors: [ + { + message: 'The "servers" field of a channel under the root "channels" object must always reference a subset of the servers under the root "servers" object.', + path: ['channels', 'UserSignedUp', 'servers', '0', '$ref'], + severity: DiagnosticSeverity.Error, + }, + { + message: 'The "servers" field of a channel under the root "channels" object must always reference a subset of the servers under the root "servers" object.', + path: ['channels', 'UserSignedUp', 'servers', '1', '$ref'], + severity: DiagnosticSeverity.Error, + } + ], + }, +]); diff --git a/test/ruleset/rules/v3/asyncapi3-required-operation-channel-unambiguity.spec.ts b/test/ruleset/rules/v3/asyncapi3-required-operation-channel-unambiguity.spec.ts new file mode 100644 index 000000000..44e269bf9 --- /dev/null +++ b/test/ruleset/rules/v3/asyncapi3-required-operation-channel-unambiguity.spec.ts @@ -0,0 +1,261 @@ +import { testRule, DiagnosticSeverity } from '../../tester'; + +testRule('asyncapi3-required-operation-channel-unambiguity', [ + { + name: 'valid case - required operation (under root) channel field points to a required channel (under root)', + document: { + asyncapi: '3.0.0', + info: { + title: 'Account Service', + version: '1.0.0' + }, + channels: { + UserSignedUp: { + messages: { + UserSignedUp: { + payload: { + type: 'object', + properties: { + displayName: { + type: 'string' + }, + email: { + type: 'string' + } + } + } + } + } + } + }, + operations: { + UserSignedUp: { + action: 'send', + channel: { + $ref: '#/channels/UserSignedUp' + }, + messages: [ + { + $ref: '#/channels/UserSignedUp/messages/UserSignedUp' + } + ] + } + } + }, + errors: [], + }, + { + name: 'valid case - required operation (under root) channel field points to a required channel (under root) from an external doc', + document: { + asyncapi: '3.0.0', + info: { + title: 'Account Service', + version: '1.0.0' + }, + channels: { + UserSignedUp: { + messages: { + UserSignedUp: { + payload: { + type: 'object', + properties: { + displayName: { + type: 'string' + }, + email: { + type: 'string' + } + } + } + } + } + } + }, + operations: { + UserSignedUp: { + action: 'send', + channel: { + $ref: 'http://foo.bar/components/file.yml#/channels/UserSignedUp' + }, + messages: [ + { + $ref: 'http://foo.bar/components/file.yml#/channels/UserSignedUp/messages/UserSignedUp' + } + ] + } + } + }, + errors: [], + }, + { + name: 'valid case - optional operation (under components) channel field points to a required channel (under root)', + document: { + asyncapi: '3.0.0', + info: { + title: 'Account Service', + version: '1.0.0' + }, + channels: { + UserSignedUp: { + messages: { + UserSignedUp: { + payload: { + type: 'object', + properties: { + displayName: { + type: 'string' + }, + email: { + type: 'string' + } + } + } + } + } + } + }, + components: { + operations: { + UserSignedUp: { + action: 'send', + channel: { + $ref: '#/channels/UserSignedUp' + }, + messages: [ + { + $ref: '#/channels/UserSignedUp/messages/UserSignedUp' + } + ] + } + } + } + }, + errors: [], + }, + { + name: 'valid case - optional operation (under components) channel field points to an optional channel (under components)', + document: { + asyncapi: '3.0.0', + info: { + title: 'Account Service', + version: '1.0.0' + }, + components: { + channels: { + UserSignedUp: { + messages: { + UserSignedUp: { + payload: { + type: 'object', + properties: { + displayName: { + type: 'string' + }, + email: { + type: 'string' + } + } + } + } + } + } + }, + operations: { + UserSignedUp: { + action: 'send', + channel: { + $ref: '#/components/channels/UserSignedUp' + }, + messages: [ + { + $ref: '#/components/channels/UserSignedUp/messages/UserSignedUp' + } + ] + } + } + } + }, + errors: [], + }, + { + name: 'invalid case - required operation (in root) channel field points to an optional channel (under components)', + document: { + asyncapi: '3.0.0', + info: { + title: 'Account Service', + version: '1.0.0' + }, + operations: { + UserSignedUp: { + action: 'send', + channel: { + $ref: '#/components/channels/UserSignedUp' + }, + messages: [ + { + $ref: '#/components/channels/UserSignedUp/messages/UserSignedUp' + } + ] + } + }, + components: { + channels: { + UserSignedUp: { + messages: { + UserSignedUp: { + payload: { + type: 'object', + properties: { + displayName: { + type: 'string' + }, + email: { + type: 'string' + } + } + } + } + } + } + }, + }, + }, + errors: [ + { + message: 'The "channel" field of an operation under the root "operations" object must always reference a channel under the root "channels" object.', + path: ['operations', 'UserSignedUp', 'channel', '$ref'], + severity: DiagnosticSeverity.Error, + } + ], + }, + { + name: 'invalid case - required operation (in root) channel field points to an optional channel (under components) from an external doc', + document: { + asyncapi: '3.0.0', + info: { + title: 'Account Service', + version: '1.0.0' + }, + operations: { + UserSignedUp: { + action: 'send', + channel: { + $ref: 'http://foo.bar/components/file.yml#/components/channels/UserSignedUp' + }, + messages: [ + { + $ref: 'http://foo.bar/components/file.yml#/components/channels/UserSignedUp/messages/UserSignedUp' + } + ] + } + } + }, + errors: [ + { + message: 'The "channel" field of an operation under the root "operations" object must always reference a channel under the root "channels" object.', + path: ['operations', 'UserSignedUp', 'channel', '$ref'], + severity: DiagnosticSeverity.Error, + } + ], + }, +]); diff --git a/test/ruleset/tester.ts b/test/ruleset/tester.ts index d4e8d3963..65c9971b0 100644 --- a/test/ruleset/tester.ts +++ b/test/ruleset/tester.ts @@ -4,6 +4,7 @@ import { AvroSchemaParser } from '@asyncapi/avro-schema-parser'; // allows testi // rulesets import { coreRuleset, recommendedRuleset } from '../../src/ruleset/ruleset'; import { v2CoreRuleset, v2SchemasRuleset, v2RecommendedRuleset } from '../../src/ruleset/v2'; +import { v3CoreRuleset } from '../../src/ruleset/v3'; import type { ParserOptions } from '../../src/parser'; import type { IRuleResult, RulesetDefinition } from '@stoplight/spectral-core'; @@ -15,6 +16,7 @@ type RuleNames = | RulesetRules | RulesetRules | RulesetRules> + | RulesetRules type Scenario = ReadonlyArray< Readonly<{ @@ -47,10 +49,11 @@ export { DiagnosticSeverity } from '../../src'; function createParser(rules: Array, options: ParserOptions = {}): Parser { const ruleset: RulesetDefinition = { extends: [ - [coreRuleset, 'off'], - [recommendedRuleset, 'off'], - [v2CoreRuleset, 'off'], - [v2RecommendedRuleset, 'off'], + [coreRuleset as RulesetDefinition, 'off'], + [recommendedRuleset as RulesetDefinition, 'off'], + [v2CoreRuleset as RulesetDefinition, 'off'], + [v2RecommendedRuleset as RulesetDefinition, 'off'], + [v3CoreRuleset as RulesetDefinition, 'off'], ], rules: { 'asyncapi2-schemas': 'off', diff --git a/test/sample_browser/refs/refed2.yaml b/test/sample_browser/refs/refed2.yaml deleted file mode 100644 index 5c21d88b9..000000000 --- a/test/sample_browser/refs/refed2.yaml +++ /dev/null @@ -1 +0,0 @@ -type: string diff --git a/test/schema-parser/spectral-rule-v2.spec.ts b/test/schema-parser/spectral-rule-v2.spec.ts new file mode 100644 index 000000000..f59eaf096 --- /dev/null +++ b/test/schema-parser/spectral-rule-v2.spec.ts @@ -0,0 +1,288 @@ +import { Parser } from '../../src/parser'; + +import { filterDiagnostics, expectDiagnostics } from '../utils'; + +describe('aas2schemaParserRule', function() { + const parser = new Parser(); + + it('should validate AsyncAPI Schema with valid schema', async function() { + const document = { + asyncapi: '2.0.0', + info: { + title: 'Valid AsyncApi document', + version: '1.0', + }, + channels: { + channel: { + publish: { + message: { + payload: { + type: 'object', + } + } + } + } + } + }; + + const diagnostics = await parser.validate(document); + expectDiagnostics(diagnostics, 'asyncapi2-schemas', []); + }); + + it('should validate AsyncAPI Schema with invalid schema', async function() { + const document = { + asyncapi: '2.0.0', + info: { + title: 'Invalid AsyncApi document', + version: '1.0', + }, + channels: { + channel: { + publish: { + message: { + payload: { + oneOf: 'this should be an array', + properties: { + name: { + if: 'this should be an if' + } + } + } + } + } + } + } + }; + + const diagnostics = await parser.validate(document); + expectDiagnostics(diagnostics, 'asyncapi2-schemas', [ + { + message: 'must be array', + path: ['channels', 'channel', 'publish', 'message', 'payload', 'oneOf'] + }, + { + message: 'must be object,boolean', + path: ['channels', 'channel', 'publish', 'message', 'payload', 'properties', 'name', 'if'] + } + ]); + }); + + it('should validate AsyncAPI Schema with invalid schema (components.messages case)', async function() { + const document = { + asyncapi: '2.0.0', + info: { + title: 'Invalid AsyncApi document', + version: '1.0', + }, + channels: {}, + components: { + messages: { + message: { + payload: { + oneOf: 'this should be an array', + properties: { + name: { + if: 'this should be an if' + } + } + } + } + } + } + }; + + const diagnostics = await parser.validate(document); + expectDiagnostics(diagnostics, 'asyncapi2-schemas', [ + { + message: 'must be array', + path: ['components', 'messages', 'message', 'payload', 'oneOf'] + }, + { + message: 'must be object,boolean', + path: ['components', 'messages', 'message', 'payload', 'properties', 'name', 'if'] + } + ]); + }); + + it('should validate AsyncAPI Schema with invalid schema (components.channels case)', async function() { + const document = { + asyncapi: '2.0.0', + info: { + title: 'Invalid AsyncApi document', + version: '1.0', + }, + channels: {}, + components: { + channels: { + channel: { + publish: { + message: { + payload: { + oneOf: 'this should be an array', + properties: { + name: { + if: 'this should be an if' + } + } + } + }, + } + } + } + } + }; + + const diagnostics = await parser.validate(document); + expectDiagnostics(diagnostics, 'asyncapi2-schemas', [ + { + message: 'must be array', + path: ['components', 'channels', 'channel', 'publish', 'message', 'payload', 'oneOf'] + }, + { + message: 'must be object,boolean', + path: ['components', 'channels', 'channel', 'publish', 'message', 'payload', 'properties', 'name', 'if'] + } + ]); + }); + + it('should validate AsyncAPI Schema with invalid schema (oneOf case)', async function() { + const document = { + asyncapi: '2.0.0', + info: { + title: 'Invalid AsyncApi document', + version: '1.0', + }, + channels: { + channel: { + publish: { + message: { + oneOf: [ + { + payload: { + oneOf: 'this should be an array', + properties: { + name: { + if: 'this should be an if' + } + } + } + }, + { + payload: { + oneOf: 'this should be an array', + } + } + ] + } + } + } + } + }; + + const diagnostics = await parser.validate(document); + expectDiagnostics(diagnostics, 'asyncapi2-schemas', [ + { + message: 'must be array', + path: ['channels', 'channel', 'publish', 'message', 'oneOf', '0', 'payload', 'oneOf'] + }, + { + message: 'must be object,boolean', + path: ['channels', 'channel', 'publish', 'message', 'oneOf', '0', 'payload', 'properties', 'name', 'if'] + }, + { + message: 'must be array', + path: ['channels', 'channel', 'publish', 'message', 'oneOf', '1', 'payload', 'oneOf'] + } + ]); + }); + + it('should validate AsyncAPI Schema with supported schema format', async function() { + const document = { + asyncapi: '2.0.0', + info: { + title: 'Valid AsyncApi document', + version: '1.0', + }, + channels: { + channel: { + publish: { + message: { + schemaFormat: 'application/vnd.aai.asyncapi;version=2.0.0', + payload: { + type: 'object', + } + } + } + } + } + }; + + const diagnostics = await parser.validate(document); + expectDiagnostics(diagnostics, 'asyncapi2-schemas', []); + }); + + it('should validate AsyncAPI Schema with non supported schema format', async function() { + const document = { + asyncapi: '2.0.0', + info: { + title: 'Invalid AsyncApi document', + version: '1.0', + }, + channels: { + channel: { + publish: { + message: { + schemaFormat: 'not existing', + payload: { + type: 'object', + } + } + } + } + } + }; + + const diagnostics = await parser.validate(document); + expectDiagnostics(diagnostics, 'asyncapi2-schemas', [ + { + message: 'Unknown schema format: "not existing"', + path: ['channels', 'channel', 'publish', 'message', 'schemaFormat'] + }, + { + message: 'Cannot validate and parse given schema due to unknown schema format: "not existing"', + path: ['channels', 'channel', 'publish', 'message', 'payload'] + }, + ]); + }); + + it('should not contain errors from asyncapi-payload-unsupported-schemaFormat and asyncapi-payload rules', async function() { + const document = { + asyncapi: '2.0.0', + info: { + title: 'Invalid AsyncApi document', + version: '1.0', + }, + channels: { + channel: { + publish: { + message: { + payload: { + oneOf: 'this should be an array', + properties: { + name: { + if: 'this should be an if' + } + } + } + } + } + } + } + }; + + const diagnostics = await parser.validate(document); + expect(filterDiagnostics(diagnostics, 'asyncapi2-schemas')).toHaveLength(2); + expect(filterDiagnostics(diagnostics, 'asyncapi-payload-unsupported-schemaFormat')).toHaveLength(0); + expect(filterDiagnostics(diagnostics, 'asyncapi-payload')).toHaveLength(0); + }); +});