diff --git a/.cli.env b/.cli.env new file mode 100644 index 0000000..93d2e33 --- /dev/null +++ b/.cli.env @@ -0,0 +1,6 @@ + +CLI_VERSION=1.0.0 +CLI_NAME='Api Server CLI' + +# to trust jolokia certs +NODE_TLS_REJECT_UNAUTHORIZED='0' diff --git a/.gitignore b/.gitignore index 3d2da4b..997bf7c 100644 --- a/.gitignore +++ b/.gitignore @@ -131,3 +131,6 @@ dist .endpoints.json .access.json +# tmp dir +tmp + diff --git a/README.md b/README.md index 473e2db..79684ea 100644 --- a/README.md +++ b/README.md @@ -120,4 +120,271 @@ For example `/execBrokerOperation?targetEndpoint=broker1`. ### Direct Proxy Direct Proxy means a client can pass a broker's endpoint info to the api-server in order to access it via the api-server. -For example the [self-provisioning plugin](https://github.com/artemiscloud/activemq-artemis-self-provisioning-plugin) uses this api to access the jolokia of a broker's jolokia endpoint. +For example the [self-provisioning plugin](https://github.com/artemiscloud/activemq-artemis-self-provisioning-plugin) uses this api to access the jolokia of a broker deployed by it. + +# Jolokia api-server Cli tool (work in progress) + +The Jolokia api-server comes with a cli (command line interface) tool. When the cli tool starts it connects to the api-server and can access the jolokia endpoints. + +The cli tool takes a **command** and requests the api-server using [its api](src/config/openapi.yml) to invoke on the target jolokia endpint, gets back the response and printing the result to the console in JSON format. + +It can run in `interactive mode` or in `non-interactive` mode. + +To build the cli tool run + +``` +yarn build +``` + +which will build both the api-server and cli tool. + +To install the cli tool runnable locally run: + +``` +npm link +``` + +It will create the cli runnable `jolokia-api-server-cli` + +## Running the cli tool + +The cli tool needs a running api-server. + +To start the cli tool run + +``` +jolokia-api-server-cli [options] +``` + +or you can use `yarn` + +``` +yarn start-cli [options] +``` + +## Using Cli tool in non-interactive mode + +In this mode, the tool starts and execute a command and then exits. + +The syntax for non-interactive mode is: + +``` +jolokia-api-server-cli -l -e +``` + +If `-l` option is omitted the default is ` https://localhost:9443` + +The `-e` option is the target jolokia url. for example + +``` +-e http://user:password@127.0.0.1:8161 +``` + +If the port number part is omitted, the default +is `80` for http and `443` for https. + +The `command` is the command to be executed. + +Note in non-interactive mode the `command` need be quoted if + +1. the command contains options (e.g -e) because the '-' can be interpreted by the shell +2. the command contains '*' char + +Example: + +``` +jolokia-api-server-cli "get queue TEST -a MessageCount RoutingType" -e http://user:pass@127.0.0.1:8161 +``` + +Alternatively you can use `--` to separate the command: + +``` +jolokia-api-server-cli -e http://user:pass@127.0.0.1:8161 -- get @broker2/queue DLQ -a MessageCount +``` + + +## Using Cli tool in interactive mode + +In interactive mode the tool starts into a command shell and +accepts user input as a command, then it executes it and went +back to the shell prompt to accept another, until you run the `exit` +command. + +The syntax to run the cli in this mode is + +``` +jolokia-api-server-cli -i +``` + +When it starts it print the cli title and ready to accept +commands. + +With interactive mode the cli can 'caches' a list of jolokia endpoints (added by the `add` command +only available in interactive mode). It takes one of them as `current endpoint` so when user types +a command without specifying target jolokia endpoint, the `current endpoint` will be used. + +## Using Cli Commands + +### The `get` command + +This is the only available command currently. It can retrive +information from a jolokia endpoint. + +The syntax of this command is + +``` +get <-a attributes...> <-o operations...> +``` + +It takes a `path` argument, a `name` argument, an optional `-a`(attribute) option and an optional +`-o` (operation) option. + +The value of `path` is a string representing a target mbean from which you want to get information. +It takes the form [target endpoint]/[component]. The `target endpoint` in `interactive` mode allows +you to specify which broker you want to retrieve information from. If absent it takes the current broker +cached by the cli. In non-interactive mode that [target endpoint] can be empty if `-e` option is given, +or it is the target remote endpoint name prefix by a `@` char. For example `@broker1/` + +The `component` part is the type of the mbean. Currently the supported mbean types are + +- `queue` +- `address` +- `acceptor` +- `cluster-connection` + +--- +**NOTE** + +If the target component is the broker itself, the component should be left empty. For example + +`get @broker1/ -a Status` + +It means to get the value of `Status` attribute of the broker. + +--- + +The argument is the mbean name (e.g. DLQ, testQueue, etc). + +The value of `-a` option is a list of attribute names (space or comma separated) to read from the target mbean. +If the value is a `*` it will read all the attributes of the target mbean. + +The value of `-o` option is a list of operation names (space or comma separated) to read from the target mbean. +If the value is a `*` it will read all the operations of the target mbean. + +examples: + +`get @broker1/` - get the current broker mbean information + +`get @broker1/*` - get all mbeans registered with the broker mbean + +`get @broker1/ -a *` - read all the attributes of the broker mbean + +`get @broker1/ -a * -o *` - read information of all attributes and operations of the broker mbean + +`get @broker1/queue` (or `get /queue`) - list all the queue mbeans information + +`get @broker1/acceptor acceptor0 -a *` - read all attributes of acceptor named `acceptor0` + +`get @broker1/queue TEST -a MessageCount RoutingType` - read `MessageCount` and `RoutingType` of queue `TEST` + +`get @broker1/queue -o xxx` - read information of operation xxx of queue TEST + +### The `run` command + +The `run` command is used to invoke operations on a jolokia endpoint. + +The syntax of this command is + +``` +run +``` + +It takes a `path` argument, a `name` argument and an `operation` to be executed on the mbean. +The syntax for `path` and `name` are the same as for the `get` command. + +The operation takes the form ([args...]). For example + +``` +run @broker1/ listAddresses(m) +``` +It means to call listAddresses(java.lang.String) method on @broker1 with argument value 'm'. + +### Commands exclusive to Interactive mode + +There are several commands that are only available to interactive mode. + +#### The `add` command + +Add a jolokia endpoint to the cli cache. Syntax: + +``` +add -u -p +``` + +example: + +``` +add ex-aao-ssl https://ex-aao-ssl-wconsj-0-svc-rte-default.apps-crc.testing -u user -p password +``` + +This command allows user to add a jolokia endpoint that is not managed by the api-server. After the +endpoint is added the user can access the endpoint using the cli commands. +--- +**NOTE** + +When accessing such jolokia endpoints, the command references it without `@` prefixed, for example + +`get ex-aao-ssl/ -a Status` + +--- + +#### The `switch` command + +To change `current endpoint`. Syntax: + +``` +switch +``` + +example: + +``` +switch broker0 +``` + +A command can be simplified if it is targeted at the current endpoint. For example if you +set the current endpoint to `broker0` the command + +``` +> add broker0 http://127.0.0.2:8161 -u guest -p guest +``` +and if you want to get the queues of the broker0, you can do + +``` +get /queues +``` + +instead of explicitly: + +``` +get broker0/queues +``` + +#### The `list` command + +To list all the jolokia endpoints cached in cli and managed on the api-server. Syntax: + +``` +> list +[ + "local2(local): http://127.0.0.2:8161", + "@pod-0: https://broker-pem-wconsj-0-svc-ing-default.artemiscloud.io:443", + "@pod-1: https://broker-pem-wconsj-1-svc-ing-default.artemiscloud.io:443", + "@local: http://127.0.0.1:8161", + "@restricted: https://artemis-broker-jolokia-0-svc-ing-default.artemiscloud.io:443" +] + +``` + + + diff --git a/jest.config.js b/jest.config.js index f5d30d1..4985918 100644 --- a/jest.config.js +++ b/jest.config.js @@ -1,7 +1,8 @@ /** @type {import('ts-jest').JestConfigWithTsJest} **/ module.exports = { - testEnvironment: "node", + roots: ['/src'], + testEnvironment: 'node', transform: { - "^.+.tsx?$": ["ts-jest",{}], + '^.+.tsx?$': ['ts-jest', {}], }, -}; \ No newline at end of file +}; diff --git a/package.json b/package.json index 90eff4d..b64638c 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "url": "git+ssh://git@github.com:artemiscloud/activemq-activemq-artemis-jolokia-api-server.git" }, "scripts": { - "build": "yarn clean && tsc -p tsconfig.json && yarn copy-config", + "build": "yarn clean && tsc -p tsconfig.json && yarn copy-config && chmod +x dist/cli/index.js", "build-api-doc": "yarn openapi-to-md src/config/openapi.yml api.md && yarn pretty-quick", "clean": "rm -rf dist", "copy-config": "cp -r src/config dist/config", @@ -22,7 +22,9 @@ "test": "NODE_TLS_REJECT_UNAUTHORIZED=0 TZ=UTC jest --runInBand", "test:coverage": "yarn run test --watch=false --coverage", "test:generate-output": "yarn test -- --json --outputFile=.jest-test-results.json", - "ts-node": "ts-node -O '{\"module\":\"commonjs\"}'" + "ts-node": "ts-node -O '{\"module\":\"commonjs\"}'", + "apigen": "apigen-ts src/config/openapi.yml src/cli/api-client.ts", + "start-cli": "node --no-warnings ./dist/cli/index.js" }, "lint-staged": { "*.{js,ts,tsx}": [ @@ -35,7 +37,8 @@ "@types/bcryptjs": "^2.4.6", "@types/cors": "^2.8.17", "@types/express": "^4.17.21", - "@types/jest": "27.5.2", + "@types/figlet": "^1.5.8", + "@types/jest": "29.5.14", "@types/js-yaml": "4.0.5", "@types/jsonwebtoken": "^9.0.6", "@types/node": "^20.10.4", @@ -45,14 +48,17 @@ "@types/webpack": "5.28.1", "@typescript-eslint/eslint-plugin": "^5.14.0", "@typescript-eslint/parser": "^5.14.0", + "apigen-ts": "^0.2.0", + "base-64": "^1.0.0", "chromatic": "6.10.1", "copy-webpack-plugin": "11.0.0", + "cors": "^2.8.5", "eslint": "^8.10.0", "eslint-config-prettier": "^8.5.0", "eslint-plugin-prettier": "^4.0.0", "eslint-plugin-unused-imports": "^3.2.0", "husky": "8.0.0", - "jest": "^27.5.1", + "jest": "^29.7.0", "jest-environment-jsdom": "^27.5.1", "lint-staged": "13.1.0", "nock": "^13.5.4", @@ -69,18 +75,26 @@ "typescript": "^4.7.4", "yaml": "^2.4.5" }, + "bin": { + "jolokia-api-server-cli": "./dist/cli/index.js" + }, + "files": [ + "./dist" + ], "readme": "README.md", "_id": "activemq-artemis-jolokia-api-server@0.1.1", "packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e", "dependencies": { "base-64": "^1.0.0", "bcryptjs": "^2.4.3", + "commander": "^12.1.0", "cors": "^2.8.5", "dotenv": "^16.4.5", "express": "4.18.2", "express-openapi-validator": "5.1.2", "express-pino-logger": "^7.0.0", "express-rate-limit": "^7.2.0", + "figlet": "^1.7.0", "fs-json-store": "^8.0.1", "js-yaml": "4.1.0", "jsonwebtoken": "^9.0.2", diff --git a/src/api/controllers/security.ts b/src/api/controllers/security.ts index d544a4f..7c5adc6 100644 --- a/src/api/controllers/security.ts +++ b/src/api/controllers/security.ts @@ -126,7 +126,7 @@ export const login = (req: express.Request, res: express.Response) => { } }) .catch((e) => { - logger.error(e, 'got exception while login'); + logger.debug(e, 'got exception while validating user'); res.status(500).json({ status: 'failed', message: 'Internal error', @@ -209,6 +209,7 @@ export const serverLogout = (req: express.Request, res: express.Response) => { res.end(); }); } catch (err) { + logger.debug(err, 'got exception while log in'); res.status(500).json({ status: 'error', message: 'Internal Server Error', diff --git a/src/cli/api-client.ts b/src/cli/api-client.ts new file mode 100644 index 0000000..1571673 --- /dev/null +++ b/src/cli/api-client.ts @@ -0,0 +1,455 @@ +// Auto-generated by https://github.com/vladkens/apigen-ts +// Source: src/config/openapi.yml + +export interface ApigenConfig { + baseUrl: string; + headers: Record; +} + +export interface ApigenRequest extends Omit { + search?: Record; + body?: unknown; +} + +export class ApiClient { + Config: ApigenConfig; + + constructor(config?: Partial) { + this.Config = { baseUrl: '/', headers: {}, ...config }; + } + + async ParseError(rep: Response) { + try { + return await rep.json(); + } catch (e) { + throw rep; + } + } + + PrepareFetchUrl(path: string): URL { + let base = this.Config.baseUrl; + if ('location' in globalThis && (base === '' || base.startsWith('/'))) { + const { location } = globalThis as unknown as { + location: { origin: string }; + }; + base = `${location.origin}${base.endsWith('/') ? base : `/${base}`}`; + } + + return new URL(path, base); + } + + async Fetch( + method: string, + path: string, + opts: ApigenRequest = {}, + ): Promise { + const url = this.PrepareFetchUrl(path); + + for (const [k, v] of Object.entries(opts?.search ?? {})) { + url.searchParams.append( + k, + Array.isArray(v) ? v.join(',') : (v as string), + ); + } + + const headers = new Headers({ ...this.Config.headers, ...opts.headers }); + const ct = headers.get('content-type') ?? 'application/json'; + + let body: FormData | URLSearchParams | string | undefined = undefined; + + if ( + ct === 'multipart/form-data' || + ct === 'application/x-www-form-urlencoded' + ) { + headers.delete('content-type'); + body = + ct === 'multipart/form-data' ? new FormData() : new URLSearchParams(); + for (const [k, v] of Object.entries( + opts.body as Record, + )) { + body.append(k, v); + } + } + + if (ct === 'application/json' && typeof opts.body !== 'string') { + headers.set('content-type', 'application/json'); + body = JSON.stringify(opts.body); + } + + const credentials = opts.credentials ?? 'include'; + const rep = await fetch(url.toString(), { + method, + ...opts, + headers, + body, + credentials, + }); + if (!rep.ok) throw await this.ParseError(rep); + + const rs = await rep.text(); + try { + return JSON.parse(rs) as T; + } catch (e) { + return rs as unknown as T; + } + } + + security = { + serverLogin: (body: { userName: string; password: string }) => { + return this.Fetch('post', '/server/login', { body }); + }, + + serverLogout: (body: EmptyBody) => { + return this.Fetch('post', '/server/logout', { + body, + }); + }, + + login: (body: { + brokerName: string; + userName: string; + password: string; + jolokiaHost: string; + scheme: string; + port: string; + }) => { + return this.Fetch('post', '/jolokia/login', { body }); + }, + }; + + admin = { + listEndpoints: () => { + return this.Fetch('get', '/server/admin/listEndpoints', {}); + }, + }; + + jolokia = { + getBrokers: (search: { targetEndpoint?: string }) => { + return this.Fetch('get', '/brokers', { search }); + }, + + getBrokerDetails: (search: { targetEndpoint?: string }) => { + return this.Fetch('get', '/brokerDetails', { search }); + }, + + readBrokerAttributes: (search: { + names?: string[]; + targetEndpoint?: string; + }) => { + return this.Fetch('get', '/readBrokerAttributes', { + search, + }); + }, + + readAddressAttributes: (search: { + name?: string; + attrs?: string[]; + targetEndpoint?: string; + }) => { + return this.Fetch('get', '/readAddressAttributes', { + search, + }); + }, + + readQueueAttributes: (search: { + name?: string; + address?: string; + 'routing-type'?: string; + attrs?: string[]; + targetEndpoint?: string; + }) => { + return this.Fetch('get', '/readQueueAttributes', { + search, + }); + }, + + readAcceptorAttributes: (search: { + name?: string; + attrs?: string[]; + targetEndpoint?: string; + }) => { + return this.Fetch( + 'get', + '/readAcceptorAttributes', + { search }, + ); + }, + + readClusterConnectionAttributes: (search: { + name?: string; + attrs?: string[]; + targetEndpoint?: string; + }) => { + return this.Fetch( + 'get', + '/readClusterConnectionAttributes', + { search }, + ); + }, + + execClusterConnectionOperation: ( + body: OperationRef, + search: { + name?: string; + targetEndpoint?: string; + }, + ) => { + return this.Fetch( + 'post', + '/execClusterConnectionOperation', + { search, body }, + ); + }, + + checkCredentials: () => { + return this.Fetch('get', '/checkCredentials', {}); + }, + + execBrokerOperation: ( + body: OperationRef, + search: { + targetEndpoint?: string; + }, + ) => { + return this.Fetch('post', '/execBrokerOperation', { + search, + body, + }); + }, + + getBrokerComponents: (search: { targetEndpoint?: string }) => { + return this.Fetch('get', '/brokerComponents', { search }); + }, + + getAddresses: (search: { targetEndpoint?: string }) => { + return this.Fetch('get', '/addresses', { search }); + }, + + getQueues: (search: { address?: string; targetEndpoint?: string }) => { + return this.Fetch('get', '/queues', { search }); + }, + + getQueueDetails: (search: { + addressName?: string; + name?: string; + routingType?: string; + targetEndpoint?: string; + }) => { + return this.Fetch('get', '/queueDetails', { search }); + }, + + getAddressDetails: (search: { name?: string; targetEndpoint?: string }) => { + return this.Fetch('get', '/addressDetails', { search }); + }, + + getAcceptors: (search: { targetEndpoint?: string }) => { + return this.Fetch('get', '/acceptors', { search }); + }, + + getAcceptorDetails: (search: { + name?: string; + targetEndpoint?: string; + }) => { + return this.Fetch('get', '/acceptorDetails', { + search, + }); + }, + + getClusterConnections: (search: { targetEndpoint?: string }) => { + return this.Fetch('get', '/clusterConnections', { + search, + }); + }, + + getClusterConnectionDetails: (search: { + name?: string; + targetEndpoint?: string; + }) => { + return this.Fetch('get', '/clusterConnectionDetails', { + search, + }); + }, + }; + + development = { + apiInfo: () => { + return this.Fetch('get', '/api-info', {}); + }, + }; +} + +export type Acceptor = { + name: string; + broker: Broker; +}; + +export type Address = { + name: string; + broker: Broker; +}; + +export type ApiResponse = { + message?: { + security?: { + enabled?: boolean; + }; + info?: { + name?: string; + description?: string; + version?: string; + }; + paths?: { + post?: string[]; + get?: string[]; + }; + }; + status?: 'successful'; + 'jolokia-session-id'?: string; +}; + +export type Argument = { + name: string; + type: JavaTypes; + desc: string; +}; + +export type Attr = { + desc: string; + rw: boolean; + type: JavaTypes; +}; + +export type Broker = { + name: string; +}; + +export type ClusterConnection = { + name: string; + broker: Broker; +}; + +export type ComponentAttribute = { + request: { + mbean: string; + attribute?: string; + type: string; + }; + value?: unknown; + error_type?: string; + error?: string; + timestamp?: number; + status: number; +}; + +export type ComponentDetails = { + op: object; + attr: object; + class: string; + desc: string; +}; + +export type DummyResponse = { + message: 'ok'; + status: 'successful'; +}; + +export type EmptyBody = object | null; + +export type Endpoint = { + name: string; + url?: string; +}; + +export type ExecResult = { + request: { + mbean: string; + arguments?: string[]; + type: string; + operation: string; + }; + value?: unknown; + error_type?: string; + error?: string; + timestamp?: number; + status: number; +}; + +export type FailureResponse = { + status: 'failed' | 'error'; + message: string; +}; + +export enum JavaTypes { + _Ljava_lang_Object_ = '[Ljava.lang.Object;', + _Ljava_lang_String_ = '[Ljava.lang.String;', + _Ljava_util_Map_ = '[Ljava.util.Map;', + _Ljavax_management_openmbean_CompositeData_ = '[Ljavax.management.openmbean.CompositeData;', + Object = 'Object', + Boolean = 'boolean', + Double = 'double', + Int = 'int', + Java_lang_Boolean = 'java.lang.Boolean', + Java_lang_Integer = 'java.lang.Integer', + Java_lang_Long = 'java.lang.Long', + Java_lang_Object = 'java.lang.Object', + Java_lang_String = 'java.lang.String', + Java_util_Map = 'java.util.Map', + Long = 'long', + Void = 'void', +} + +export type LoginResponse = { + message: string; + status: string; + 'jolokia-session-id': string; +}; + +export type OperationArgument = { + type: JavaTypes; + value: string; +}; + +export type OperationRef = { + signature: { + name: string; + args: OperationArgument[]; + }; +}; + +export type OperationResult = { + request: { + mbean: string; + arguments: string[]; + type: string; + operation: string; + }; + value: string; + timestamp: number; + status: number; +}; + +export type Queue = { + name: string; + 'routing-type': string; + address?: Address; + broker: Broker; +}; + +export type ServerLoginResponse = { + message: string; + status: string; + bearerToken: string; +}; + +export type ServerLogoutResponse = { + message: string; + status: string; +}; + +export type Signature = { + ret?: JavaTypes; + desc: string; + args: Argument[]; +}; + +export type Signatures = Signature[]; diff --git a/src/cli/cli.test.ts b/src/cli/cli.test.ts new file mode 100644 index 0000000..68112ef --- /dev/null +++ b/src/cli/cli.test.ts @@ -0,0 +1,653 @@ +import { + CommandContext, + InteractiveCommandContext, + LocalJolokiaEndpoint, + RemoteJolokiaEndpoint, +} from './context'; +import { ServerAccess } from './server-access'; +import { mainCommand } from './cli'; +import { ApigenConfig, JavaTypes } from './api-client'; + +const apiServerUrl = 'https://localhost:9444'; + +jest.mock('./api-client', () => { + return { + ApiClient: jest.fn().mockImplementation(() => { + return { + Config: {}, + constructor(config?: Partial) { + this.Config = { baseUrl: '/', headers: {}, ...config }; + }, + admin: { + listEndpoints: async () => { + return []; + }, + }, + development: { + apiInfo: async () => { + return { + message: { + security: { + enabled: false, + }, + info: {}, + paths: {}, + }, + status: 'successful', + 'jolokia-session-id': 'id', + }; + }, + }, + security: { + login: () => { + return { + message: 'success', + status: 'success', + 'jolokia-session-id': 'jolokia-session-id', + }; + }, + serverLogin: async () => { + return { + message: 'success', + status: 'success', + bearerToken: 'token', + }; + }, + }, + jolokia: { + getBrokers: () => { + return [{ name: 'amq-broker' }]; + }, + getAddresses: async () => { + return []; + }, + getQueues: () => { + return [ + { + name: 'ExpiryQueue', + 'routing-type': 'anycast', + address: { + name: 'ExpiryQueue', + broker: { + name: 'amq-broker', + }, + }, + broker: { + name: 'amq-broker', + }, + }, + { + name: '$.artemis.internal.sf.my-cluster.153698c3-a4da-11ef-8309-e2930c7d3af5', + 'routing-type': 'multicast', + address: { + name: '$.artemis.internal.sf.my-cluster.153698c3-a4da-11ef-8309-e2930c7d3af5', + broker: { + name: 'amq-broker', + }, + }, + broker: { + name: 'amq-broker', + }, + }, + { + name: 'DLQ', + 'routing-type': 'anycast', + address: { + name: 'DLQ', + broker: { + name: 'amq-broker', + }, + }, + broker: { + name: 'amq-broker', + }, + }, + { + name: 'notif.e690a357-a550-11ef-8309-e2930c7d3af5.ActiveMQServerImpl_name', + 'routing-type': 'multicast', + address: { + name: 'activemq.notifications', + broker: { + name: 'amq-broker', + }, + }, + broker: { + name: 'amq-broker', + }, + }, + ]; + }, + getAcceptors: async () => { + return [ + { + name: 'new-acceptor', + broker: { + name: 'amq-broker', + }, + }, + { + name: 'scaleDown', + broker: { + name: 'amq-broker', + }, + }, + ]; + }, + getClusterConnections: async () => { + return []; + }, + readAddressAttributes: () => { + return []; + }, + readBrokerAttributes: () => { + return []; + }, + readQueueAttributes: () => { + return []; + }, + readAcceptorAttributes: () => { + return []; + }, + readClusterConnectionAttributes: () => { + return []; + }, + getAcceptorDetails: async () => { + return { + op: { + reload: [ + { + args: [], + ret: 'void' as JavaTypes, + }, + ], + }, + }; + }, + getBrokerDetails: async () => { + return { + op: { + listAddresses: [ + { + args: [ + { + name: 'separator', + type: 'java.lang.String' as JavaTypes, + }, + ], + ret: 'java.lang.String' as JavaTypes, + }, + ], + }, + }; + }, + execBrokerOperation: async () => { + return []; + }, + getClusterConnectionDetails: async () => { + return { + op: { + getBridgeMetrics: [ + { + args: [ + { + name: 'nodeId', + type: 'java.lang.String' as JavaTypes, + }, + ], + ret: 'java.util.Map' as JavaTypes, + }, + ], + }, + }; + }, + execClusterConnectionOperation: async () => { + return []; + }, + }, + }; + }), + }; +}); + +describe('test parsing', () => { + it('test parsing paths', async () => { + let path = '/'; + await CommandContext.parseGetPath( + path, + null, + async (targetType, remoteEndpoint) => { + expect(targetType).toEqual(''); + expect(remoteEndpoint).toBeNull(); + }, + ); + + path = 'broker0/'; + await CommandContext.parseGetPath( + path, + null, + async (targetType, remoteEndpoint) => { + expect(targetType).toEqual(''); + expect(remoteEndpoint).toBeNull(); + }, + ); + + path = '@broker0/'; + await CommandContext.parseGetPath( + path, + null, + async (targetType, remoteEndpoint) => { + expect(targetType).toEqual(''); + expect(remoteEndpoint).toEqual('broker0'); + }, + ); + + path = '/queue'; + await CommandContext.parseGetPath( + path, + null, + async (targetType, remoteEndpoint) => { + expect(targetType).toEqual('queue'); + expect(remoteEndpoint).toBeNull(); + }, + ); + + path = 'local/queue'; + await CommandContext.parseGetPath( + path, + null, + async (targetType, remoteEndpoint) => { + expect(targetType).toEqual('queue'); + expect(remoteEndpoint).toBeNull(); + }, + ); + + path = 'queue'; + await CommandContext.parseGetPath( + path, + null, + async (targetType, remoteEndpoint) => { + expect(targetType).toEqual('queue'); + expect(remoteEndpoint).toBeNull(); + }, + ); + + path = '//'; + await CommandContext.parseGetPath(path, null, async () => { + return; + }).catch((err) => { + expect(err).toEqual('Invalid target expression: ' + path); + }); + + const fakeEndpoint = new RemoteJolokiaEndpoint('@fake'); + const fakeLocalEndpoint = new LocalJolokiaEndpoint( + 'localone', + 'user', + 'pass', + 'localhost', + 'http', + '8161', + '', + ); + + path = '/'; + await CommandContext.parseGetPath( + path, + fakeEndpoint, + async (targetType, remoteEndpoint) => { + expect(targetType).toEqual(''); + expect(remoteEndpoint).toEqual('fake'); + }, + ); + + path = '/queue'; + await CommandContext.parseGetPath( + path, + fakeEndpoint, + async (targetType, remoteEndpoint) => { + expect(targetType).toEqual('queue'); + expect(remoteEndpoint).toEqual('fake'); + }, + ); + + path = 'queue'; + await CommandContext.parseGetPath( + path, + fakeEndpoint, + async (targetType, remoteEndpoint) => { + expect(targetType).toEqual('queue'); + expect(remoteEndpoint).toEqual('fake'); + }, + ); + + path = '/queue'; + await CommandContext.parseGetPath( + path, + fakeLocalEndpoint, + async (targetType, remoteEndpoint) => { + console.log(targetType, remoteEndpoint); + expect(targetType).toEqual('queue'); + expect(remoteEndpoint).toBeNull(); + }, + ); + + path = 'localone/queue'; + await CommandContext.parseGetPath( + path, + fakeLocalEndpoint, + async (targetType, remoteEndpoint) => { + expect(targetType).toEqual('queue'); + expect(remoteEndpoint).toBeNull(); + }, + ); + }); +}); + +const execCommand = async (apiAccess: ServerAccess, cmd: string[]) => { + const args = [ + '/usr/bin/node', + 'thecli', + '-u', + 'root', + '-p', + 'password', + '-l', + apiServerUrl, + ...cmd, + ]; + + mainCommand.parse(args); + + const cliOpts = mainCommand.opts(); + + const serverUrl = cliOpts.url; + + expect(serverUrl).toEqual(apiServerUrl); + + const result = await apiAccess.checkApiServer(); + expect(result).toBeTruthy(); + + const commandContext = new CommandContext( + apiAccess, + mainCommand.opts().endpoint, + null, + ); + + const ok = await commandContext.login(); + expect(ok).toEqual(0); + + const retval = await commandContext.processCommand(mainCommand.args); + return retval; +}; + +describe('test command processing', () => { + const serverAccess = new ServerAccess(apiServerUrl); + + afterEach(() => { + // restore the spy created with spyOn + jest.restoreAllMocks(); + }); + + it('test get command processing - getBrokers', async () => { + const spyCall = jest.spyOn(serverAccess.apiClient.jolokia, 'getBrokers'); + const spyLog = jest.spyOn(console, 'log'); + await execCommand(serverAccess, ['get @broker0/']); + expect(spyCall).toHaveBeenCalled(); + // verify once the output is formatted as json string + expect(spyLog).toHaveBeenCalledWith( + JSON.stringify([{ name: 'amq-broker' }], null, 2), + ); + }); + + it('test get command processing - get addresses', async () => { + const spyCall = jest.spyOn(serverAccess.apiClient.jolokia, 'getAddresses'); + await execCommand(serverAccess, ['get @broker0/addresses']); + expect(spyCall).toHaveBeenCalled(); + }); + + it('test get command processing - get queues', async () => { + const spyCall = jest.spyOn(serverAccess.apiClient.jolokia, 'getQueues'); + await execCommand(serverAccess, ['get @broker0/queues']); + expect(spyCall).toHaveBeenCalled(); + }); + + it('test get command processing - get acceptors', async () => { + const spyCall = jest.spyOn(serverAccess.apiClient.jolokia, 'getAcceptors'); + await execCommand(serverAccess, ['get @broker0/acceptors']); + expect(spyCall).toHaveBeenCalled(); + }); + + it('test get command processing - get cluster-connections', async () => { + const spyCall = jest.spyOn( + serverAccess.apiClient.jolokia, + 'getClusterConnections', + ); + await execCommand(serverAccess, ['get @broker0/cluster-connections']); + expect(spyCall).toHaveBeenCalled(); + }); + + it('test get command processing - read broker attributes', async () => { + const spyCall = jest.spyOn( + serverAccess.apiClient.jolokia, + 'readBrokerAttributes', + ); + await execCommand(serverAccess, ['get @broker0/ -a Status']); + expect(spyCall).toHaveBeenCalledWith({ + names: ['Status'], + targetEndpoint: 'broker0', + }); + }); + + it('test get command processing - read address attributes', async () => { + const spyCall = jest.spyOn( + serverAccess.apiClient.jolokia, + 'readAddressAttributes', + ); + await execCommand(serverAccess, [ + 'get @broker0/address DLQ -a AutoCreated,AddressSize', + ]); + expect(spyCall).toHaveBeenCalledWith({ + name: 'DLQ', + attrs: ['AutoCreated,AddressSize'], + targetEndpoint: 'broker0', + }); + }); + + it('test get command processing - read queue attributes', async () => { + const spyCall = jest.spyOn( + serverAccess.apiClient.jolokia, + 'readQueueAttributes', + ); + await execCommand(serverAccess, ['get @broker0/queue DLQ -a MessageCount']); + expect(spyCall).toHaveBeenCalledWith({ + name: 'DLQ', + address: 'DLQ', + attrs: ['MessageCount'], + 'routing-type': 'anycast', + targetEndpoint: 'broker0', + }); + }); + + it('test get command processing - read acceptor attributes', async () => { + const spyCall = jest.spyOn( + serverAccess.apiClient.jolokia, + 'readAcceptorAttributes', + ); + await execCommand(serverAccess, [ + 'get @broker0/acceptors new-acceptor -a Started', + ]); + expect(spyCall).toHaveBeenCalledWith({ + name: 'new-acceptor', + attrs: ['Started'], + targetEndpoint: 'broker0', + }); + }); + + it('test get command processing - read cluster-connection attributes', async () => { + const spyCall = jest.spyOn( + serverAccess.apiClient.jolokia, + 'readClusterConnectionAttributes', + ); + await execCommand(serverAccess, [ + 'get @broker0/cluster-connection my-cluster -a RetryInterval', + ]); + expect(spyCall).toHaveBeenCalledWith({ + name: 'my-cluster', + attrs: ['RetryInterval'], + targetEndpoint: 'broker0', + }); + }); + + it('test get command processing - get a component operations', async () => { + const spyCall = jest.spyOn( + serverAccess.apiClient.jolokia, + 'getAcceptorDetails', + ); + await execCommand(serverAccess, [ + 'get @broker0/acceptor new-acceptor -o reload', + ]); + expect(spyCall).toHaveBeenCalledWith({ + name: 'new-acceptor', + targetEndpoint: 'broker0', + }); + }); + + it('test run command processing - run a broker operation', async () => { + const spyCall = jest.spyOn( + serverAccess.apiClient.jolokia, + 'execBrokerOperation', + ); + await execCommand(serverAccess, ['run @broker0/ listAddresses(a)']); + + expect(spyCall).toHaveBeenCalledWith( + { + signature: { + args: [ + { + type: 'java.lang.String', + value: 'a', + }, + ], + name: 'listAddresses', + }, + }, + { targetEndpoint: 'broker0' }, + ); + }); + + it('test run command processing - run a cluster-connection operation', async () => { + const spyCall = jest.spyOn( + serverAccess.apiClient.jolokia, + 'execClusterConnectionOperation', + ); + await execCommand(serverAccess, [ + 'run @broker0/cluster-connection my-cluster getBridgeMetrics(1538bbb4-a4da-11ef-a086-a6289ed42cb2)', + ]); + + expect(spyCall).toHaveBeenCalledWith( + { + signature: { + args: [ + { + type: 'java.lang.String', + value: '1538bbb4-a4da-11ef-a086-a6289ed42cb2', + }, + ], + name: 'getBridgeMetrics', + }, + }, + { + name: 'my-cluster', + targetEndpoint: 'broker0', + }, + ); + }); +}); + +describe('test command processing - interactive commands', () => { + const serverAccess = new ServerAccess(apiServerUrl); + + let commandContext: InteractiveCommandContext; + + beforeEach(() => { + commandContext = new InteractiveCommandContext( + serverAccess, + new Map(), + ); + }); + + afterEach(() => { + // restore the spy created with spyOn + jest.restoreAllMocks(); + }); + + it('test add command processing', async () => { + const spyLogin = jest.spyOn(serverAccess.apiClient.security, 'login'); + const cmd = 'add broker-0 http://127.0.0.1:8161 -u guest -p guest'; + const retval = await commandContext.processSingleCommand(cmd); + expect(retval).toBe(0); + expect(spyLogin).toHaveBeenCalledWith( + expect.objectContaining({ + brokerName: 'broker-0', + userName: 'guest', + password: 'guest', + jolokiaHost: '127.0.0.1', + scheme: 'http', + port: '8161', + accessToken: 'jolokia-session-id', + }), + ); + expect(commandContext.currentEndpoint).not.toBeNull(); + expect(commandContext.currentEndpoint.getBrokerName()).toEqual('broker-0'); + expect(commandContext.currentEndpoint.getUrl()).toEqual( + 'http://127.0.0.1:8161', + ); + }); + + it('test list/switch command processing', async () => { + const add1 = 'add broker-0 http://127.0.0.1:8161 -u guest -p guest'; + const ret1 = await commandContext.processSingleCommand(add1); + expect(ret1).toBe(0); + + expect(commandContext.currentEndpoint).not.toBeNull(); + expect(commandContext.currentEndpoint.getBrokerName()).toEqual('broker-0'); + expect(commandContext.currentEndpoint.getUrl()).toEqual( + 'http://127.0.0.1:8161', + ); + + const add2 = 'add broker-1 http://127.0.0.2:8161 -u guest -p guest'; + const ret2 = await commandContext.processSingleCommand(add2); + expect(ret2).toBe(0); + + expect(commandContext.currentEndpoint).not.toBeNull(); + expect(commandContext.currentEndpoint.getBrokerName()).toEqual('broker-1'); + expect(commandContext.currentEndpoint.getUrl()).toEqual( + 'http://127.0.0.2:8161', + ); + + //now switch to broker-0 + const switch1 = 'switch broker-0'; + const ret3 = await commandContext.processSingleCommand(switch1); + expect(ret3).toBe(0); + + expect(commandContext.currentEndpoint).not.toBeNull(); + expect(commandContext.currentEndpoint.getBrokerName()).toEqual('broker-0'); + expect(commandContext.currentEndpoint.getUrl()).toEqual( + 'http://127.0.0.1:8161', + ); + + const spyOut = jest.spyOn(console, 'log'); + const list = 'list'; + const ret4 = await commandContext.processSingleCommand(list); + expect(ret4).toBe(0); + expect(spyOut).toHaveBeenCalledWith( + JSON.stringify( + [ + 'broker-0(local): http://127.0.0.1:8161', + 'broker-1(local): http://127.0.0.2:8161', + ], + null, + 2, + ), + ); + }); +}); diff --git a/src/cli/cli.ts b/src/cli/cli.ts new file mode 100644 index 0000000..84cc2ba --- /dev/null +++ b/src/cli/cli.ts @@ -0,0 +1,179 @@ +import figlet from 'figlet'; +import readline from 'readline'; +import { stdin, stdout } from 'process'; + +import { + CommandContext, + InteractiveCommandContext, + printError, +} from './context'; +import { ServerAccess } from './server-access'; +import { Command, OptionValues } from 'commander'; + +export const mainCommand = new Command() + .version('1.0.0') + .description('CLI tool for ActiveMQ Artemis Jolokia API Server') + .argument('[command]', 'the command to be executed') + .option( + '-l, --url [api-server-url]', + 'the url of api server', + 'https://localhost:9443', + ) + .option('-i, --interactive', 'run in interactive mode', false) + .option('-e, --endpoint [endpoint]', 'target jolokia endpoint url') + .option( + '-u, --user [userName]', + 'user name to log in to the api server if security is enabled', + false, + ) + .option( + '-p, --password [password]', + 'user password to log in to the api server', + false, + ); + +export class Cli { + static start = ( + serverAccess: ServerAccess, + options: OptionValues, + program: Command, + ) => { + let userName: string; + let password: string; + let shouldLogin = false; + + if (options.user) { + if (!options.password) { + printError('Error: no password'); + process.exit(1); + } + userName = options.user; + password = options.password; + shouldLogin = true; + } else { + if (process.env.SERVER_USER_NAME) { + if (!process.env.SERVER_PASSWORD) { + printError('Error: no password'); + process.exit(1); + } + userName = process.env.SERVER_USER_NAME; + password = process.env.SERVER_PASSWORD; + shouldLogin = true; + } + } + + if (shouldLogin) { + serverAccess + .loginServer(userName, password) + .then((res) => { + if (res.bearerToken) { + serverAccess.updateBearerToken(res.bearerToken); + } + serverAccess.setLoginUser(userName); + if (res.status !== 'success') { + printError('Failed to login server', res); + process.exit(1); + } + Cli.internalStart(serverAccess, options, program); + }) + .catch((err) => { + printError('Failed to login server', err); + process.exit(1); + }); + } else { + Cli.internalStart(serverAccess, options, program); + } + }; + + static internalStart = ( + serverAccess: ServerAccess, + options: OptionValues, + program: Command, + ) => { + if (options.interactive) { + const endpointMap = new Map(); + const commandContext = new InteractiveCommandContext( + serverAccess, + endpointMap, + ); + + const rl = readline.createInterface({ + input: stdin, + output: stdout, + }); + program.exitOverride(); //avoid exit on error + + const runMain = async () => { + rl.question(commandContext.getPrompt(), function (command) { + if (command === 'exit') { + return rl.close(); + } + if (command === 'help') { + printInteractiveHelp(); + runMain(); + } else { + commandContext + .processSingleCommand(command) + .then(() => { + runMain(); + }) + .catch((e) => { + printError('error processing command', e); + runMain(); + }); + } + }); + }; + console.log(figlet.textSync('Api Server Cli')); + runMain(); + } else { + const commandContext = new CommandContext( + serverAccess, + program.opts().endpoint, + null, + ); + + commandContext + .login() + .then((value) => { + if (value === 0) { + commandContext + .processCommand(program.args) + .then((result) => { + if (result === 0) { + process.exit(result); + } else { + program.help({ error: true }); + } + }) + .catch((e) => { + printError('failed to run command', e); + program.help({ error: true }); + }); + } else { + program.help({ error: true }); + } + }) + .catch((err) => { + printError('failed to run command', err); + program.help({ error: true }); + }); + } + }; +} + +const availableInteractiveCommands = [ + { cmd: 'list', desc: 'list endpoints' }, + { cmd: 'add', desc: 'add a direct endpoint' }, + { cmd: 'switch', desc: 'switch current endpoint' }, + { cmd: 'get', desc: 'get component information' }, + { cmd: 'run', desc: 'run a component operation' }, + { cmd: 'exit', desc: 'exit the cli' }, +]; + +const printInteractiveHelp = () => { + console.log('Avaliable commands:'); + availableInteractiveCommands.forEach((item) => { + console.log(item.cmd, ':', item.desc); + }); +}; diff --git a/src/cli/context.ts b/src/cli/context.ts new file mode 100644 index 0000000..114b133 --- /dev/null +++ b/src/cli/context.ts @@ -0,0 +1,1280 @@ +import { Command } from 'commander'; +import { ServerAccess } from './server-access'; + +export class JolokiaEndpoint { + isRemote = (): boolean => { + return false; + }; + getUrl = (): string => { + return ''; + }; + + getBrokerName = (): string => { + return ''; + }; + + setBrokerName = (name: string): void => { + throw new Error('Method not implemented. setBrokerName(' + name + ')'); + }; +} + +export class RemoteJolokiaEndpoint extends JolokiaEndpoint { + endpointName: string; + + constructor(endpointName: string) { + super(); + this.endpointName = endpointName; + } + + isRemote = (): boolean => { + return true; + }; + + getBrokerName = (): string => { + return this.endpointName; + }; + + setBrokerName = (name: string) => { + this.endpointName = name; + }; +} + +export class LocalJolokiaEndpoint extends JolokiaEndpoint { + brokerName: string; + userName: string; + password: string; + jolokiaHost: string; + scheme: string; + port: string; + accessToken: string; + url: string; + + constructor( + endpointName: string, + userName: string, + password: string, + jolokiaHost: string, + scheme: string, + port: string, + accessToken: string, + ) { + super(); + this.brokerName = endpointName; + this.userName = userName; + this.password = password; + this.jolokiaHost = jolokiaHost; + this.scheme = scheme; + this.port = port; + this.accessToken = accessToken; + } + + getBrokerName = (): string => { + return this.brokerName; + }; + + setBrokerName = (name: string) => { + this.brokerName = name; + }; + + getUrl = () => { + return this.scheme + '://' + this.jolokiaHost + ':' + this.port; + }; +} + +const replaceErrors = (key: any, value: any) => { + if (key === 'details') { + if (value instanceof Error) { + const error = {}; + + Object.getOwnPropertyNames(value).forEach(function (propName) { + error[propName] = value[propName]; + }); + + return error; + } + try { + if (value instanceof Response) { + return { status: value.status, statusText: value.statusText }; + } + } catch (e) { + //this happens with tests where jest removes fetch API inlcuding the Response type + //it will throw ReferenceError on Response type. + return value; + } + } + + return value; +}; + +export const printResult = (result: object) => { + console.log(JSON.stringify(result, null, 2)); +}; + +export const printError = (message: string, detail?: object | string) => { + console.error( + JSON.stringify( + { + message: 'Error: ' + message, + details: detail ? detail : '', + }, + replaceErrors, + 2, + ), + ); +}; + +export class CommandContext { + runClusterConnectionOperation = async ( + remoteEndpoint: string, + compName: string, + operation: string, + argStr: string, + ): Promise => { + let retValue = 0; + const args = ServerAccess.parseOperationArgs(argStr); + try { + const values = await this.apiClient.runClusterConnectionOperation( + remoteEndpoint, + compName, + operation, + args, + ); + printResult(values); + } catch (e) { + printError('failed to run operation', e); + retValue = 1; + } + return retValue; + }; + + runAcceptorOperation = async ( + remoteEndpoint: string, + compName: string, + operation: string, + argStr: string, + ): Promise => { + let retValue = 0; + const args = ServerAccess.parseOperationArgs(argStr); + try { + const values = await this.apiClient.runAcceptorOperation( + remoteEndpoint, + compName, + operation, + args, + ); + printResult(values); + } catch (e) { + printError('failed to run operation', e); + retValue = 1; + } + return retValue; + }; + + runAddressOperation( + remoteEndpoint: string, + compName: string, + operation: string, + ): number | PromiseLike { + throw new Error('Method not implemented.'); + } + runQueueOperation( + remoteEndpoint: string, + compName: string, + operation: string, + argStr: string, + ): Promise { + throw new Error('Method not implemented.'); + } + + apiClient: ServerAccess; + currentEndpoint: JolokiaEndpoint; + + constructor( + serverAccess: ServerAccess, + endpointUrl: string, + endpoint: JolokiaEndpoint | null, + ) { + this.apiClient = serverAccess; + + if (endpointUrl) { + const url = new URL(endpointUrl); + this.currentEndpoint = new LocalJolokiaEndpoint( + 'current', + url.username, + url.password, + url.hostname, + url.protocol.substring(0, url.protocol.length - 1), + this.getActualPort(url), + '', + ); + } else { + this.currentEndpoint = endpoint as JolokiaEndpoint; + } + } + + getActualPort(url: URL): string { + return url.port === '' + ? url.protocol === 'http:' + ? '80' + : '443' + : url.port; + } + + // this login is used to login a jolokia endpoint + async login(): Promise { + const current = this.currentEndpoint as LocalJolokiaEndpoint; + if (!current || current.accessToken !== '') { + return 0; + } + const result = await this.apiClient.login(current); + if (result.status === 'success') { + const accessToken = result['jolokia-session-id']; + this.apiClient.updateClientHeader('jolokia-session-id', accessToken); + current.accessToken = accessToken; + return 0; + } + return 1; + } + + async processCommand(args: string[]): Promise { + let retValue = 0; + let resolvedArgs = args; + if (args.length === 1) { + // the command is quoted + resolvedArgs = args[0].trim().split(' '); + } + + switch (resolvedArgs[0]) { + case 'get': { + const getCmd = this.newGetCmd(); + try { + await getCmd.parseAsync(resolvedArgs, { from: 'electron' }); + } catch (e) { + printError('failed to execute get command', e); + retValue = 1; + } + break; + } + case 'run': { + const runCmd = this.newRunCmd(); + try { + await runCmd.parseAsync(resolvedArgs, { from: 'electron' }); + } catch (e) { + printError('failed to execute run command', e); + retValue = 1; + } + break; + } + default: + printError('unknown command', args); + retValue = 1; + break; + } + return retValue; + } + + static parseGetPath = async ( + path: string, + currentEndpoint: JolokiaEndpoint, + callback: (targetType: string, remoteEndpoint: string) => Promise, + ): Promise => { + //for non-interactive mode if + // path = '/' : to get all components of the target broker + // path = '/' : to get all components of + // path = '' : same as '/' + let targetType = ''; + let targetEndpoint: string = null; + + const pathElements = path.split('/'); + if (pathElements.length === 1) { + if (pathElements[0].startsWith('@')) { + //it means the endpoint not the target type + targetEndpoint = pathElements[0].substring(1); + } else { + targetType = pathElements[0]; + } + } else if (pathElements.length === 2) { + targetType = pathElements[1]; + if (pathElements[0].startsWith('@')) { + targetEndpoint = pathElements[0].substring(1); + } + } else { + throw 'Invalid target expression: ' + path; + } + + if (!targetEndpoint && currentEndpoint?.isRemote()) { + targetEndpoint = currentEndpoint.getBrokerName().substring(1); + } + + await callback(targetType, targetEndpoint); + }; + + newGetCmd(): Command { + const getCmd = new Command('get') + .description('get information from a endpoint') + .argument( + '', + 'path of the component with format [[@]endpointName/componentType] where @ means a remote target', + ) + .argument('[compName]', 'name of the component', '') + .option( + '-a, --attributes ', + 'get attributes from component', + ) + .option( + '-o, --operations ', + 'get operations info from component', + ) + .exitOverride() + .showHelpAfterError() + .action(async (path, compName, options, cmd): Promise => { + await CommandContext.parseGetPath( + path, + this.currentEndpoint, + async (targetType, remoteEndpoint) => { + if (compName === '') { + // read all comps of type + if (targetType === '') { + // '/' get broker info + if ( + options.attributes?.length > 0 || + options.operations?.length > 0 + ) { + if (options.attributes?.length > 0) { + await this.getComponentAttributes( + remoteEndpoint, + 'broker', + '', + options.attributes[0] === '*' ? null : options.attributes, + ); + } + if (options.operations?.length > 0) { + await this.getComponentOperations( + remoteEndpoint, + 'broker', + '', + options.operations[0] === '*' ? null : options.operations, + ); + } + } else { + await this.getComponent(remoteEndpoint, 'broker', ''); + } + } else if (targetType === '*') { + // '/*' to get all components + if ( + options.attributes?.length > 0 || + options.operations?.length > 0 + ) { + throw Error( + 'cannot specify attributes/operations for all components', + ); + } else { + await this.getAllComponents(remoteEndpoint, ''); + } + } else { + // '/type' read all comps of type + if ( + options.attributes?.length > 0 || + options.operations?.length > 0 + ) { + throw 'need a component name to get attributes/operations of'; + } + await this.getAllComponents(remoteEndpoint, targetType); + } + } else { + if ( + options.attributes?.length > 0 || + options.operations?.length > 0 + ) { + if (options.attributes?.length > 0) { + // '/type or type -a ...' read one comp's attributes + await this.getComponentAttributes( + remoteEndpoint, + targetType, + compName, + options.attributes[0] === '*' ? null : options.attributes, + ); + } + if (options.operations?.length > 0) { + await this.getComponentOperations( + remoteEndpoint, + targetType, + compName, + options.operations[0] === '*' ? null : options.operations, + ); + } + } else { + //nothing specified, just return type info + await this.getComponent(remoteEndpoint, targetType, compName); + } + } + }, + ); + }); + return getCmd; + } + + newRunCmd(): Command { + const runCmd = new Command('run') + .description('invoke a remote operation on an mbean of an endpoint.') + .argument( + '', + 'path of the component with format [[@]endpointName/componentType] where @ means a remote target', + ) + .argument('[compName]', 'name of the component', '') + .argument( + '[operation...]', + 'the operation to execute. The syntax is opName(args...)', + ) + .exitOverride() + .showHelpAfterError() + .action(async (path, compName, operation, cmd): Promise => { + //combind the two to deal with spaces in the operation signature + //sth like listAddresses('arg that has spaces', arg2 ...) + let rawCmdArg = compName; + if (operation) { + operation.forEach((p: string) => { + rawCmdArg += ' ' + p; + }); + } + rawCmdArg = ServerAccess.normalize(rawCmdArg); + // group 2: comp name group3: oper name group4: args + const opRegex = + /(([a-zA-Z0-9\-_.]*)[\s]+)?([a-zA-Z0-9]+)[\s]*\((.*)\)\s*$/; + const matches = opRegex.exec(rawCmdArg); + + let argStr = ''; + if (matches) { + compName = matches[2] ?? ''; + operation = matches[3]; + argStr = matches[4]; + } else { + throw Error('Invalid command'); + } + + await CommandContext.parseGetPath( + path, + this.currentEndpoint, + async (targetType, remoteEndpoint) => { + if (compName === '') { + if (targetType === '') { + // '/' exec broker operation + await this.runComponentOperation( + remoteEndpoint, + 'broker', + '', + operation, + argStr, + ); + } else { + // target type without compName is not allowed + throw Error( + 'must specify a component name for type ' + targetType, + ); + } + } else { + // exec one comp's operation + await this.runComponentOperation( + remoteEndpoint, + targetType, + compName, + operation, + argStr, + ); + } + }, + ); + }); + return runCmd; + } + + runBrokerOperation = async ( + remoteEndpoint: string, + operation: string, + argStr: string, + ): Promise => { + let retValue = 0; + const args = ServerAccess.parseOperationArgs(argStr); + try { + const values = await this.apiClient.runBrokerOperation( + remoteEndpoint, + operation, + args, + ); + printResult(values); + } catch (e) { + printError('failed to run operation', e); + retValue = 1; + } + return retValue; + }; + + runComponentOperation = async ( + remoteEndpoint: string, + targetType: string, + compName: string, + operation: string, + argStr: string, + ): Promise => { + switch (targetType) { + case 'broker': + return await this.runBrokerOperation(remoteEndpoint, operation, argStr); + case 'queue': + case 'queues': + return await this.runQueueOperation( + remoteEndpoint, + compName, + operation, + argStr, + ); + case 'address': + case 'addresses': + return await this.runAddressOperation( + remoteEndpoint, + compName, + operation, + ); + case 'acceptor': + case 'acceptors': + return await this.runAcceptorOperation( + remoteEndpoint, + compName, + operation, + argStr, + ); + case 'cluster-connection': + case 'cluster-connections': + return await this.runClusterConnectionOperation( + remoteEndpoint, + compName, + operation, + argStr, + ); + default: + printError('Error: component type not supported', targetType); + return 1; + } + }; + + async getComponent( + remoteEndpoint: string, + targetType: string, + compName: string, + ): Promise { + switch (targetType) { + case 'broker': + return await this.getBroker(remoteEndpoint); + case 'queue': + case 'queues': + return await this.getQueue(remoteEndpoint, compName); + case 'address': + case 'addresses': + return await this.getAddress(remoteEndpoint, compName); + case 'acceptor': + case 'acceptors': + return await this.getAcceptor(remoteEndpoint, compName); + default: + printError('component type not supported', targetType); + return 1; + } + } + + async getAllBrokerComponents(remoteTarget: string): Promise { + let retValue = 0; + try { + const result = await this.apiClient.getBrokerComponents(remoteTarget); + printResult(result); + } catch (ex) { + printError('failed to get broker components', ex); + retValue = 1; + } + return retValue; + } + + async getAllQueueComponents(remoteTarget: string): Promise { + let retValue = 0; + try { + const result = await this.apiClient.getQueues(remoteTarget); + printResult(result); + } catch (ex) { + printError( + 'failed to get queues at ' + remoteTarget ? remoteTarget : 'current', + ex, + ); + retValue = 1; + } + return retValue; + } + + async getAllAddresses(remoteTarget: string): Promise { + let retValue = 0; + try { + const result = await this.apiClient.getAddresses(remoteTarget); + printResult(result); + } catch (ex) { + printError('failed to get addresses', ex); + retValue = 1; + } + return retValue; + } + + async getAllAcceptors(remoteTarget: string): Promise { + let retValue = 0; + try { + const result = await this.apiClient.getAcceptors(remoteTarget); + printResult(result); + } catch (ex) { + printError('failed to get acceptors', ex); + retValue = 1; + } + return retValue; + } + + async getAllClusterConnections(remoteTarget: string): Promise { + let retValue = 0; + try { + const result = await this.apiClient.getClusterConnections(remoteTarget); + printResult(result); + } catch (ex) { + printError('failed to get cluster connections', ex); + retValue = 1; + } + return retValue; + } + + async getAllComponents( + remoteEndpoint: string, + targetType: string, + ): Promise { + switch (targetType) { + case '': + return await this.getAllBrokerComponents(remoteEndpoint); + case 'queue': + case 'queues': + return await this.getAllQueueComponents(remoteEndpoint); + case 'address': + case 'addresses': + return await this.getAllAddresses(remoteEndpoint); + case 'acceptor': + case 'acceptors': + return await this.getAllAcceptors(remoteEndpoint); + case 'cluster-connection': + case 'cluster-connections': + return await this.getAllClusterConnections(remoteEndpoint); + case 'bridge': + case 'bridges': + printError('not implemented!'); + return 1; + case 'broadcast-group': + case 'broadcast-groups': + printError('not implemented!'); + return 1; + default: + printError('component type not supported', targetType); + return 1; + } + } + + async getQueue(remoteEndpoint: string, compName: string): Promise { + let retValue = 0; + try { + const result = await this.apiClient.getQueues(remoteEndpoint); + const queues = result.filter((q) => q.name === compName); + printResult(queues); + } catch (ex) { + printError('failed to get queues', ex); + retValue = 1; + } + return retValue; + } + + async getAddress(remoteTarget: string, compName: string): Promise { + let retValue = 0; + try { + const result = await this.apiClient.getAddresses(remoteTarget); + const addresses = result.filter((a) => a.name === compName); + printResult(addresses); + } catch (ex) { + printError('failed to get addresses', ex); + retValue = 1; + } + return retValue; + } + + async getAcceptor(remoteTarget: string, compName: string): Promise { + let retValue = 0; + try { + const result = await this.apiClient.getAcceptors(remoteTarget); + const acceptors = result.filter((a) => a.name === compName); + printResult(acceptors); + } catch (ex) { + printError('failed to get acceptors', ex); + retValue = 1; + } + return retValue; + } + + async getClusterConnectionOperations( + remoteTarget: string, + operations: string[], + ccName: string, + ): Promise { + let retValue = 0; + const opts = { name: ccName }; + const opOpts = operations === null ? {} : { names: operations }; + try { + const values = await this.apiClient.readClusterConnectionOperations( + remoteTarget, + opts, + opOpts, + ); + //JSON.stringify doesn't work well with maps + const result = Array.from(values); + printResult(result); + } catch (e) { + printError('failed to read queue attributes', e); + retValue = 1; + } + return retValue; + } + + async getQueueOperations( + remoteTarget: string, + operations: string[], + queueName: string, + ): Promise { + let retValue = 0; + const opOpts = operations === null ? {} : { names: operations }; + const result = await this.apiClient.getQueues(remoteTarget); + const queues = result.filter((q) => q.name === queueName); + for (let i = 0; i < queues.length; i++) { + const q = queues[i]; + const opts = { + addressName: q.address?.name, + name: queueName, + routingType: q['routing-type'], + }; + try { + const values = await this.apiClient.readQueueOperations( + remoteTarget, + opts, + opOpts, + ); + //JSON.stringify doesn't work well with maps + const result = Array.from(values); + printResult(result); + } catch (e) { + printError('failed to read queue operations', e); + retValue = 1; + break; + } + } + return retValue; + } + + async getAddressOperations( + remoteTarget: string, + operations: string[], + addrName: string, + ): Promise { + let retValue = 0; + const opts = { name: addrName }; + const opOpts = operations === null ? {} : { names: operations }; + try { + const values = await this.apiClient.readAddressOperations( + remoteTarget, + opts, + opOpts, + ); + //JSON.stringify doesn't work well with maps + const result = Array.from(values); + printResult(result); + } catch (e) { + printError('failed to read address operations', e); + retValue = 1; + } + return retValue; + } + + async getAcceptorOperations( + remoteTarget: string, + operations: string[], + acceptorName: string, + ): Promise { + let retValue = 0; + const opts = { name: acceptorName }; + const opOpts = operations === null ? {} : { names: operations }; + try { + const values = await this.apiClient.readAcceptorOperations( + remoteTarget, + opts, + opOpts, + ); + //JSON.stringify doesn't work well with maps + const result = Array.from(values); + printResult(result); + } catch (e) { + printError('failed to read acceptor operations', e); + retValue = 1; + } + return retValue; + } + + async getBrokerOperations( + remoteTarget: string, + operations: string[], + ): Promise { + let retValue = 0; + const opts = operations === null ? {} : { names: operations }; + try { + const values = await this.apiClient.readBrokerOperations( + remoteTarget, + opts, + ); + //JSON.stringify doesn't work well with maps + const result = Array.from(values); + printResult(result); + } catch (e) { + printError('failed to read operationss', e); + retValue = 1; + } + return retValue; + } + + async getBrokerAttributes( + remoteTarget: string, + attributes: string[], + ): Promise { + let retValue = 0; + const opts = attributes === null ? {} : { names: attributes }; + try { + const values = await this.apiClient.readBrokerAttributes( + remoteTarget, + opts, + ); + printResult(values); + } catch (e) { + printError('failed to read attributes', e); + retValue = 1; + } + return retValue; + } + + async getQueueAttributes( + remoteTarget: string, + compName: string, + attributes: string[], + ): Promise { + let retValue = 0; + const result = await this.apiClient.getQueues(remoteTarget); + const queues = result.filter((q) => q.name === compName); + for (let i = 0; i < queues.length; i++) { + const q = queues[i]; + const opts = + attributes === null + ? { + name: compName, + address: q.address?.name, + 'routing-type': q['routing-type'], + } + : { + name: compName, + address: q.address?.name, + 'routing-type': q['routing-type'], + attrs: attributes, + }; + + try { + const values = await this.apiClient.readQueueAttributes( + remoteTarget, + opts, + ); + printResult(values); + } catch (e) { + printError('failed to read queue attributes', e); + retValue = 1; + break; + } + } + return retValue; + } + + async getAddressAttributes( + remoteTarget: string, + compName: string, + attributes: string[], + ): Promise { + let retValue = 0; + const opts = + attributes === null + ? { name: compName } + : { name: compName, attrs: attributes }; + try { + const values = await this.apiClient.readAddressAttributes( + remoteTarget, + opts, + ); + printResult(values); + } catch (e) { + printError('failed to read address attributes', e); + retValue = 1; + } + return retValue; + } + + async getAcceptorAttributes( + remoteTarget: string, + compName: string, + attributes: string[], + ): Promise { + let retValue = 0; + const opts = + attributes === null + ? { name: compName } + : { name: compName, attrs: attributes }; + try { + const values = await this.apiClient.readAcceptorAttributes( + remoteTarget, + opts, + ); + printResult(values); + } catch (e) { + printError('failed to read acceptor attributes', e); + retValue = 1; + } + return retValue; + } + async getClusterConnectionAttributes( + remoteTarget: string, + compName: string, + attributes: string[], + ): Promise { + let retValue = 0; + const opts = + attributes === null + ? { name: compName } + : { name: compName, attrs: attributes }; + try { + const values = await this.apiClient.readClusterConnectionAttributes( + remoteTarget, + opts, + ); + printResult(values); + } catch (e) { + printError('failed to read cluster connection attributes', e); + retValue = 1; + } + return retValue; + } + + getComponentAttributes = async ( + remoteEndpoint: string, + targetType: string, + compName: string, + attributes: string[], + ): Promise => { + switch (targetType) { + case 'broker': + return await this.getBrokerAttributes(remoteEndpoint, attributes); + case 'queue': + case 'queues': + return await this.getQueueAttributes( + remoteEndpoint, + compName, + attributes, + ); + case 'address': + case 'addresses': + return await this.getAddressAttributes( + remoteEndpoint, + compName, + attributes, + ); + case 'acceptor': + case 'acceptors': + return await this.getAcceptorAttributes( + remoteEndpoint, + compName, + attributes, + ); + case 'cluster-connection': + case 'cluster-connections': + return await this.getClusterConnectionAttributes( + remoteEndpoint, + compName, + attributes, + ); + default: + printError('Error: component type not supported', targetType); + return 1; + } + }; + + getComponentOperations = async ( + remoteEndpoint: string, + targetType: string, + compName: string, + operations: string[], + ): Promise => { + switch (targetType) { + case 'broker': { + return await this.getBrokerOperations(remoteEndpoint, operations); + } + case 'queue': + case 'queues': { + return await this.getQueueOperations( + remoteEndpoint, + operations, + compName, + ); + } + case 'address': + case 'addresses': { + return await this.getAddressOperations( + remoteEndpoint, + operations, + compName, + ); + } + case 'acceptor': + case 'acceptors': { + return await this.getAcceptorOperations( + remoteEndpoint, + operations, + compName, + ); + } + case 'cluster-connection': + case 'cluster-connections': { + return await this.getClusterConnectionOperations( + remoteEndpoint, + operations, + compName, + ); + } + default: + printError('Error: component type not supported', targetType); + return 1; + } + }; + + async getBroker(remoteEndpoint: string): Promise { + let retValue = 0; + try { + const values = await this.apiClient.getBrokers(remoteEndpoint); + printResult(values); + } catch (ex) { + printError('failed to get brokers', ex); + retValue = 1; + } + return retValue; + } +} + +export class InteractiveCommandContext extends CommandContext { + readonly endpoints: Map; + + constructor( + serverAccess: ServerAccess, + endpointMap: Map, + ) { + super(serverAccess, '', null); + this.endpoints = endpointMap; + } + + getPrompt(): string { + const currentUser = this.apiClient.currentUser ?? undefined; + if (this.currentEndpoint) { + if (currentUser) { + return currentUser + ':' + this.currentEndpoint.getBrokerName() + '> '; + } + return this.currentEndpoint.getBrokerName() + '> '; + } + if (currentUser) { + return currentUser + '> '; + } + return '> '; + } + + hasEndpoint(endpointName: string): boolean { + return this.endpoints.has(endpointName); + } + + newAddCmd(): Command { + const addCmd = new Command('add') + .argument('', 'name of the endpoint') + .argument('', 'the endpoint url') + .option('-u, --user [userName]', 'the user name', 'user') + .option('-p, --password [password]', 'the password', 'password') + .exitOverride() + .showHelpAfterError() + .description( + 'add an jolokia endpoint, example: add mybroker0 http://localhost:8161', + ) + .action(async (endpointName, endpointUrl, options) => { + const url = new URL(endpointUrl); + if (this.hasEndpoint(endpointName)) { + printError('endpoint already exists!'); + return; + } + + const newEndpoint = new LocalJolokiaEndpoint( + endpointName, + options.user, + options.password, + url.hostname, + url.protocol.substring(0, url.protocol.length - 1), + this.getActualPort(url), + '', + ); + const context = new CommandContext(this.apiClient, '', newEndpoint); + try { + await context.login(); + context.currentEndpoint.setBrokerName(endpointName); + this.endpoints.set(endpointName, context); + this.switchContext(context); + } catch (ex) { + printError('failed to login', ex); + } + }); + + return addCmd; + } + + addEndpoint = async (args: string[]): Promise => { + let retValue = 0; + const addCmd = this.newAddCmd(); + try { + await addCmd.parseAsync(args, { from: 'electron' }).catch(() => { + //commander would print the error message + retValue = 1; + }); + } catch (ex) { + printError('failed to execute add command', ex); + retValue = 1; + } + return retValue; + }; + + getEndpoint = (endpointName: string): CommandContext | undefined => { + return this.endpoints.get(endpointName); + }; + + listJolokiaEndpoints = async (): Promise => { + const endpointList = new Array(); + this.endpoints.forEach((context, key) => { + endpointList.push(key + '(local): ' + context.currentEndpoint.getUrl()); + }); + + const remoteEndpoints = await this.apiClient.listEndpoints(); + remoteEndpoints.forEach((e) => { + endpointList.push('@' + e.name + ': ' + e.url); + }); + printResult(endpointList); + + return 0; + }; + + switchContext(target: CommandContext) { + this.apiClient = target.apiClient; + this.currentEndpoint = target.currentEndpoint; + } + + newSwitchCmd(): Command { + const switchCmd = new Command('switch') + .argument('') + .description('switch to a jolokia endpoint') + .exitOverride() + .action(async (endpointName) => { + if (endpointName.startsWith('@')) { + this.currentEndpoint = new RemoteJolokiaEndpoint(endpointName); + } else { + if (!this.hasEndpoint(endpointName)) { + printError('no such endpoint', endpointName); + } else { + const target = this.getEndpoint(endpointName) as CommandContext; + this.switchContext(target); + } + } + }); + return switchCmd; + } + + async switchJolokiaEndpoint(args: string[]): Promise { + let retValue = 0; + const switchCmd = this.newSwitchCmd(); + try { + switchCmd.parse(args, { from: 'electron' }); + } catch (ex) { + printError('failed to execute switch command', ex); + retValue = 1; + } + return retValue; + } + + // command path is in form: + // [[@]endpointName]/[componentType] + // if @ is present it means endpointName is targeted at api server + // if @ is not present it means a local endpoint + // if endpointName part is absent at all it means current local endpoint + // componentType is the target component of a broker (queues, address, etc) + // if componentType is absent it means all components of the broker + // if path is / it gets the mbean info of the current broker. + getContextForCmd(path: string): CommandContext { + if (!path) { + return this; + } + + const isRemoteTarget = + path.startsWith('@') || this.currentEndpoint?.isRemote(); + + if (!isRemoteTarget) { + if (this.endpoints.size === 0) { + throw Error('there is no endpoint for command'); + } + + const elements = path.split('/'); + if (elements.length === 2 && elements[0] !== '') { + if (this.hasEndpoint(elements[0])) { + if (elements[0] === this.currentEndpoint?.getBrokerName()) { + return this; + } else { + return this.getEndpoint(elements[0]) as CommandContext; + } + } else { + throw Error('target endpoint not exist: ' + elements[0]); + } + } + } + return this; + } + + async processSingleCommand(cmd: string): Promise { + const args = cmd.trim().split(' '); + switch (args[0]) { + case '': + return 0; + case 'add': + return await this.addEndpoint(args); + case 'list': + return await this.listJolokiaEndpoints(); + case 'switch': + return this.switchJolokiaEndpoint(args); + case 'get': + case 'run': { + let context: CommandContext; + try { + context = this.getContextForCmd(args[1]); + } catch (ex) { + printError('failed to get context', ex); + return 1; + } + return await context.processCommand([cmd.trim()]); + } + default: { + printError('unknown command'); + return 1; + } + } + } +} diff --git a/src/cli/index.ts b/src/cli/index.ts new file mode 100644 index 0000000..8af4486 --- /dev/null +++ b/src/cli/index.ts @@ -0,0 +1,40 @@ +#! /usr/bin/env -S node --no-warnings + +import dotenv from 'dotenv'; + +import { ServerAccess } from './server-access'; +import { printError } from './context'; +import { Cli, mainCommand } from './cli'; + +export const main = (args: string[]) => { + dotenv.config({ path: '.cli.env' }); + + if (process.env['NODE_TLS_REJECT_UNAUTHORIZED'] !== '0') { + console.log('Warning: TLS Certificate check is disabled.'); + process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = '0'; + } + + mainCommand.parse(args); + + const cliOpts = mainCommand.opts(); + + const apiServerUrl = cliOpts.url; + + const serverAccess = new ServerAccess(apiServerUrl); + + serverAccess + .checkApiServer() + .then((result) => { + if (!result) { + printError('The api server is not available', apiServerUrl); + process.exit(1); + } + Cli.start(serverAccess, cliOpts, mainCommand); + }) + .catch((e) => { + printError('Error checking api server: ' + apiServerUrl, e); + process.exit(1); + }); +}; + +main(process.argv); diff --git a/src/cli/server-access.ts b/src/cli/server-access.ts new file mode 100644 index 0000000..6e0244c --- /dev/null +++ b/src/cli/server-access.ts @@ -0,0 +1,588 @@ +import base64 from 'base-64'; +import { + ApiClient, + ComponentDetails, + JavaTypes, + OperationArgument, +} from './api-client'; +import { LocalJolokiaEndpoint } from './context'; + +export class JolokiaClient extends ApiClient { + PrepareFetchUrl(path: string) { + return new URL(`${this.Config.baseUrl}/${path}`.replace(/\/{2,}/g, '/')); + } +} + +export type ParameterDescriptor = { + name: string; + type: JavaTypes; + desc: string; +}; + +// this need to go to openapi.yml +// The operation info returned +// is a map of OperationSchema array +// Map +// The key is the operation name +// each item in the array represents +// a variation of the operation (overloaded) +export type OperationSchema = { + args: ParameterDescriptor[]; + ret: JavaTypes; + desc: string; +}; + +export class ServerAccess { + static readonly ARG_COLON = ':'; + static readonly ARG_SEP = ','; + static readonly ARG_SEP_ESC = '___' + base64.encode(this.ARG_SEP) + '___'; + + static readonly rpCommaEx = /\\,/g; + static readonly rpCommaEscEx = new RegExp( + String.raw`${ServerAccess.ARG_SEP_ESC}`, + 'g', + ); + + apiClient: JolokiaClient; + currentUser: string; + + constructor(apiServerUrl: string) { + this.apiClient = new JolokiaClient({ + baseUrl: apiServerUrl + '/api/v1/', + }); + } + // arguments are passed as is, if an argument has comma , + // it must be escaped as \, + // in case of \ being the end of a arg, add a space \ , + static normalize = (value: string): string => { + return value.replace(ServerAccess.rpCommaEx, ServerAccess.ARG_SEP_ESC); + }; + + static restore = (value: string): string => { + return value.replace(ServerAccess.rpCommaEscEx, ServerAccess.ARG_SEP); + }; + + static removeArgName = (arg: string): string => { + let argVal = arg; + const index = argVal.indexOf(ServerAccess.ARG_COLON); + if (index > 0) { + argVal = arg.substring(index + ServerAccess.ARG_COLON.length); + } + return argVal; + }; + + static parseOperationArgs = (argStr: string): string[] => { + let argArray = []; + if (argStr) { + argArray = argStr.split(','); + argArray.forEach((val, index) => { + argArray[index] = ServerAccess.restore(val); + }); + } + return argArray; + }; + + setLoginUser(userName: string) { + this.currentUser = userName; + } + + login = async (currentEndpoint: LocalJolokiaEndpoint) => { + return this.apiClient.security.login(currentEndpoint); + }; + + checkApiServer = async (): Promise => { + return this.apiClient.development + .apiInfo() + .then((value) => { + if (value.status === 'successful') { + return true; + } + return false; + }) + .catch(() => { + return false; + }); + }; + + updateClientHeader = (name: string, accessToken: string) => { + this.apiClient.Config.headers = { + ...this.apiClient.Config.headers, + [name]: accessToken, + }; + }; + + updateBearerToken(bearerToken: string) { + this.apiClient.Config.headers = { + ...this.apiClient.Config.headers, + Authorization: 'Bearer ' + bearerToken, + }; + } + + loginServer = async (userName: string, password: string) => { + return this.apiClient.security.serverLogin({ userName, password }); + }; + + getTargetOpts = (remoteTarget: string) => { + return remoteTarget ? { targetEndpoint: remoteTarget } : {}; + }; + + getBrokerComponents = async (remoteTarget: string) => { + return this.apiClient.jolokia.getBrokerComponents( + this.getTargetOpts(remoteTarget), + ); + }; + + getQueues = async (remoteTarget: string) => { + return this.apiClient.jolokia.getQueues(this.getTargetOpts(remoteTarget)); + }; + + getAddresses = async (remoteTarget: string) => { + return this.apiClient.jolokia.getAddresses( + this.getTargetOpts(remoteTarget), + ); + }; + + getAcceptors = async (remoteTarget: string) => { + return this.apiClient.jolokia.getAcceptors( + this.getTargetOpts(remoteTarget), + ); + }; + + getClusterConnections = async (remoteTarget: string) => { + return this.apiClient.jolokia.getClusterConnections( + this.getTargetOpts(remoteTarget), + ); + }; + + readBrokerAttributes = async ( + remoteTarget: string, + opts: { names?: undefined } | { names: string[] }, + ) => { + return this.apiClient.jolokia.readBrokerAttributes({ + ...opts, + ...this.getTargetOpts(remoteTarget), + }); + }; + + filterOperations = ( + details: ComponentDetails, + opts: { names?: undefined } | { names: string[] }, + ): Map => { + const operations = new Map( + Object.entries(details.op), + ); + + if (opts.names) { + const matched = new Map(); + opts.names.forEach((n) => { + // deal with commas + const names = n.split(','); + names.forEach((m) => { + if (m !== '') { + if (operations.has(m)) { + matched.set(m, operations.get(m)); + } + } + }); + }); + return matched; + } + + return operations; + }; + + readAddressOperations = async ( + remoteTarget: string, + opts: { name?: undefined } | { name: string }, + opOpts: { names?: undefined } | { names: string[] }, + ): Promise> => { + return this.apiClient.jolokia + .getAddressDetails({ + ...opts, + ...this.getTargetOpts(remoteTarget), + }) + .then((result) => { + return this.filterOperations(result, opOpts); + }); + }; + + readAcceptorOperations = async ( + remoteTarget: string, + opts: { name?: undefined } | { name: string }, + opOpts: { names?: undefined } | { names: string[] }, + ): Promise> => { + return this.apiClient.jolokia + .getAcceptorDetails({ + ...opts, + ...this.getTargetOpts(remoteTarget), + }) + .then((result) => { + return this.filterOperations(result, opOpts); + }); + }; + + readClusterConnectionOperations = async ( + remoteTarget: string, + opts: { name?: undefined } | { name: string }, + opOpts: { names?: undefined } | { names: string[] }, + ): Promise> => { + return this.apiClient.jolokia + .getClusterConnectionDetails({ + ...opts, + ...this.getTargetOpts(remoteTarget), + }) + .then((result) => { + return this.filterOperations(result, opOpts); + }); + }; + + readQueueOperations = async ( + remoteTarget: string, + opts: { + addressName: string; + name: string; + routingType: string; + }, + opOpts: { names?: undefined } | { names: string[] }, + ): Promise> => { + return this.apiClient.jolokia + .getQueueDetails({ + ...opts, + ...this.getTargetOpts(remoteTarget), + }) + .then((result) => { + return this.filterOperations(result, opOpts); + }); + }; + + readBrokerOperations = async ( + remoteTarget: string, + opts: { names?: undefined } | { names: string[] }, + ): Promise> => { + return this.apiClient.jolokia + .getBrokerDetails({ + ...this.getTargetOpts(remoteTarget), + }) + .then((result) => { + return this.filterOperations(result, opts); + }); + }; + + readQueueAttributes = async ( + remoteTarget: string, + opts: + | { + name: string; + address: string; + 'routing-type': string; + attrs?: undefined; + } + | { + name: string; + address: string; + 'routing-type': string; + attrs: string[]; + }, + ) => { + return this.apiClient.jolokia.readQueueAttributes({ + ...opts, + ...this.getTargetOpts(remoteTarget), + }); + }; + + readAddressAttributes = async ( + remoteTarget: string, + opts: + | { name: string; attrs?: undefined } + | { name: string; attrs: string[] }, + ) => { + return this.apiClient.jolokia.readAddressAttributes({ + ...opts, + ...this.getTargetOpts(remoteTarget), + }); + }; + + readAcceptorAttributes = async ( + remoteTarget: string, + opts: + | { name: string; attrs?: undefined } + | { name: string; attrs: string[] }, + ) => { + return this.apiClient.jolokia.readAcceptorAttributes({ + ...opts, + ...this.getTargetOpts(remoteTarget), + }); + }; + + readClusterConnectionAttributes = async ( + remoteTarget: string, + opts: + | { name: string; attrs?: undefined } + | { name: string; attrs: string[] }, + ) => { + return this.apiClient.jolokia.readClusterConnectionAttributes({ + ...opts, + ...this.getTargetOpts(remoteTarget), + }); + }; + + // this method throw error if argValue cannot be converted into + // correct data + // note in switch all types are refered in string format instead of + // the enum values, this is because when running tests + // the enum values are not treated correctly and you may get error like: + // TypeError: Cannot read properties of undefined (reading 'Java_lang_Boolean') + convertValue = (argSchema: ParameterDescriptor, argValue: string): any => { + switch (argSchema.type as JavaTypes) { + case 'boolean' as JavaTypes: + case 'Java.lang.Boolean' as JavaTypes: { + if (argValue === 'true') { + return true; + } else if (argValue === 'false') { + return false; + } else { + throw Error('a boolean value must be true or false'); + } + } + case 'double' as JavaTypes: { + const doubleValue = parseFloat(argValue); + if (Number.isNaN(doubleValue)) { + throw Error('invalid double value ' + argValue); + } + return doubleValue; + } + case 'int' as JavaTypes: + case 'long' as JavaTypes: + case 'java.lang.Integer' as JavaTypes: + case 'java.long.Long' as JavaTypes: { + const intValue = parseInt(argValue); + if (Number.isNaN(intValue)) { + throw Error('invalid int value ' + argValue); + } + return intValue; + } + case 'Object' as JavaTypes: + case 'java.lang.Object' as JavaTypes: { + return JSON.parse(argValue); + } + case 'java.lang.String' as JavaTypes: { + return argValue; + } + case 'java.util.Map' as JavaTypes: { + const jsonObject = JSON.parse(argValue); + return new Map(Object.entries(jsonObject)); + } + case '[Ljava.lang.Object;' as JavaTypes: + case '[Ljava.lang.String;' as JavaTypes: + case '[Ljava.util.Map;' as JavaTypes: { + return JSON.parse(argValue); + } + default: { + throw Error('unsupported data type: ' + argSchema.type); + } + } + }; + + validateArgs = (schema: OperationSchema, args: string[]): boolean => { + if (args?.length > 0) { + if (schema.args?.length === args.length) { + for (let i = 0; i < schema.args.length; i++) { + const argSchema = schema.args[i]; + const nameIndex = args[i].indexOf(ServerAccess.ARG_COLON); + if (nameIndex > 0) { + //name provided + const argName = args[i].substring(0, nameIndex); + if (argSchema.name !== argName) { + return false; + } + const argVal = args[i].substring( + nameIndex + ServerAccess.ARG_COLON.length, + ); + try { + this.convertValue(argSchema, argVal); + return true; + } catch (err) { + return false; + } + } else { + //only value and may have colons as part of value + try { + this.convertValue(argSchema, args[i]); + return true; + } catch (err) { + return false; + } + } + } + } else { + return false; + } + } else { + if (schema.args?.length === 0) { + return true; + } + } + return false; + }; + + createOperationArguments = ( + opSchema: OperationSchema, + args: string[], + ): OperationArgument[] => { + if (!args) { + return null; + } + const opArgs = new Array(); + for (let i = 0; i < args.length; i++) { + opArgs.push({ + type: opSchema.args[i].type, + value: ServerAccess.removeArgName(args[i]), + }); + } + return opArgs; + }; + + runAcceptorOperation = async ( + remoteEndpoint: string, + compName: string, + opName: string, + args: string[], + ) => { + const values = await this.readAcceptorOperations( + remoteEndpoint, + { + name: compName, + }, + { + names: [opName], + }, + ); + + if (values.size === 0) { + throw Error('no such operation: ' + opName); + } + if (values.size !== 1) { + throw Error('There are multiple schemas for opertion: ' + opName); + } + + const theSchemas = values.get(opName); + const match = theSchemas.filter((schema) => { + return this.validateArgs(schema, args); + }); + if (match.length === 1) { + //found it + const opArgs = this.createOperationArguments(match[0], args); + + return this.apiClient.jolokia.execClusterConnectionOperation( + { + signature: { + name: opName, + args: opArgs, + }, + }, + { name: compName, ...this.getTargetOpts(remoteEndpoint) }, + ); + } else if (match.length > 1) { + throw Error('there are multiple matches for the operation ' + opName); + } else { + throw Error('No match found for operation ' + opName); + } + }; + + runClusterConnectionOperation = async ( + remoteEndpoint: string, + compName: string, + opName: string, + args: string[], + ) => { + const values = await this.readClusterConnectionOperations( + remoteEndpoint, + { + name: compName, + }, + { + names: [opName], + }, + ); + + if (values.size === 0) { + throw Error('no such operation: ' + opName); + } + if (values.size !== 1) { + throw Error('There are multiple schemas for opertion: ' + opName); + } + + const theSchemas = values.get(opName); + const match = theSchemas.filter((schema) => { + return this.validateArgs(schema, args); + }); + if (match.length === 1) { + //found it + const opArgs = this.createOperationArguments(match[0], args); + + return this.apiClient.jolokia.execClusterConnectionOperation( + { + signature: { + name: opName, + args: opArgs, + }, + }, + { name: compName, ...this.getTargetOpts(remoteEndpoint) }, + ); + } else if (match.length > 1) { + throw Error('there are multiple matches for the operation ' + opName); + } else { + throw Error('No match found for operation ' + opName); + } + }; + + runBrokerOperation = async ( + remoteEndpoint: string, + opName: string, + args: string[], + ) => { + const values = await this.readBrokerOperations(remoteEndpoint, { + names: [opName], + }); + if (values.size === 0) { + throw Error('no such operation: ' + opName); + } + if (values.size !== 1) { + throw Error('There are multiple schemas for opertion: ' + opName); + } + + const theSchemas = values.get(opName); + const match = theSchemas.filter((schema) => { + return this.validateArgs(schema, args); + }); + + if (match.length === 1) { + //found it + const opArgs = this.createOperationArguments(match[0], args); + + return this.apiClient.jolokia.execBrokerOperation( + { + signature: { + name: opName, + args: opArgs, + }, + }, + this.getTargetOpts(remoteEndpoint), + ); + } else if (match.length > 1) { + throw Error('there are multiple matches for the operation ' + opName); + } else { + throw Error('No match found for operation ' + opName); + } + }; + + getBrokers = async (remoteEndpoint: string) => { + return this.apiClient.jolokia.getBrokers( + this.getTargetOpts(remoteEndpoint), + ); + }; + + listEndpoints = async () => { + return this.apiClient.admin.listEndpoints(); + }; +} diff --git a/tsconfig.json b/tsconfig.json index 292a544..f9fc804 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -14,6 +14,6 @@ "@app/*": ["src/*"] } }, - "include": ["./src/*"], + "include": ["./src/**/*", "./env"], "exclude": ["node_modules", "dist"] } diff --git a/yarn.lock b/yarn.lock index 16fb974..459615f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -20,159 +20,114 @@ call-me-maybe "^1.0.1" js-yaml "^4.1.0" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.7.tgz#882fd9e09e8ee324e496bd040401c6f046ef4465" - integrity sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.25.9", "@babel/code-frame@^7.26.0": + version "7.26.2" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.26.2.tgz#4b5fab97d33338eff916235055f0ebc21e573a85" + integrity sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ== dependencies: - "@babel/highlight" "^7.24.7" + "@babel/helper-validator-identifier" "^7.25.9" + js-tokens "^4.0.0" picocolors "^1.0.0" -"@babel/compat-data@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.7.tgz#d23bbea508c3883ba8251fb4164982c36ea577ed" - integrity sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw== +"@babel/compat-data@^7.25.9": + version "7.26.2" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.26.2.tgz#278b6b13664557de95b8f35b90d96785850bb56e" + integrity sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg== -"@babel/core@^7.1.0", "@babel/core@^7.12.3", "@babel/core@^7.7.2", "@babel/core@^7.8.0": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.7.tgz#b676450141e0b52a3d43bc91da86aa608f950ac4" - integrity sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g== +"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.23.9": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.26.0.tgz#d78b6023cc8f3114ccf049eb219613f74a747b40" + integrity sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg== dependencies: "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.24.7" - "@babel/generator" "^7.24.7" - "@babel/helper-compilation-targets" "^7.24.7" - "@babel/helper-module-transforms" "^7.24.7" - "@babel/helpers" "^7.24.7" - "@babel/parser" "^7.24.7" - "@babel/template" "^7.24.7" - "@babel/traverse" "^7.24.7" - "@babel/types" "^7.24.7" + "@babel/code-frame" "^7.26.0" + "@babel/generator" "^7.26.0" + "@babel/helper-compilation-targets" "^7.25.9" + "@babel/helper-module-transforms" "^7.26.0" + "@babel/helpers" "^7.26.0" + "@babel/parser" "^7.26.0" + "@babel/template" "^7.25.9" + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.26.0" convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.3" semver "^6.3.1" -"@babel/generator@^7.24.7", "@babel/generator@^7.7.2": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.7.tgz#1654d01de20ad66b4b4d99c135471bc654c55e6d" - integrity sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA== +"@babel/generator@^7.25.9", "@babel/generator@^7.26.0", "@babel/generator@^7.7.2": + version "7.26.2" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.2.tgz#87b75813bec87916210e5e01939a4c823d6bb74f" + integrity sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw== dependencies: - "@babel/types" "^7.24.7" + "@babel/parser" "^7.26.2" + "@babel/types" "^7.26.0" "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.25" - jsesc "^2.5.1" + jsesc "^3.0.2" -"@babel/helper-compilation-targets@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.7.tgz#4eb6c4a80d6ffeac25ab8cd9a21b5dfa48d503a9" - integrity sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg== +"@babel/helper-compilation-targets@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz#55af025ce365be3cdc0c1c1e56c6af617ce88875" + integrity sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ== dependencies: - "@babel/compat-data" "^7.24.7" - "@babel/helper-validator-option" "^7.24.7" - browserslist "^4.22.2" + "@babel/compat-data" "^7.25.9" + "@babel/helper-validator-option" "^7.25.9" + browserslist "^4.24.0" lru-cache "^5.1.1" semver "^6.3.1" -"@babel/helper-environment-visitor@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz#4b31ba9551d1f90781ba83491dd59cf9b269f7d9" - integrity sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ== - dependencies: - "@babel/types" "^7.24.7" - -"@babel/helper-function-name@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz#75f1e1725742f39ac6584ee0b16d94513da38dd2" - integrity sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA== - dependencies: - "@babel/template" "^7.24.7" - "@babel/types" "^7.24.7" - -"@babel/helper-hoist-variables@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz#b4ede1cde2fd89436397f30dc9376ee06b0f25ee" - integrity sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ== - dependencies: - "@babel/types" "^7.24.7" - -"@babel/helper-module-imports@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz#f2f980392de5b84c3328fc71d38bd81bbb83042b" - integrity sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA== - dependencies: - "@babel/traverse" "^7.24.7" - "@babel/types" "^7.24.7" - -"@babel/helper-module-transforms@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.24.7.tgz#31b6c9a2930679498db65b685b1698bfd6c7daf8" - integrity sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ== - dependencies: - "@babel/helper-environment-visitor" "^7.24.7" - "@babel/helper-module-imports" "^7.24.7" - "@babel/helper-simple-access" "^7.24.7" - "@babel/helper-split-export-declaration" "^7.24.7" - "@babel/helper-validator-identifier" "^7.24.7" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.24.7", "@babel/helper-plugin-utils@^7.8.0": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.7.tgz#98c84fe6fe3d0d3ae7bfc3a5e166a46844feb2a0" - integrity sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg== - -"@babel/helper-simple-access@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz#bcade8da3aec8ed16b9c4953b74e506b51b5edb3" - integrity sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg== - dependencies: - "@babel/traverse" "^7.24.7" - "@babel/types" "^7.24.7" - -"@babel/helper-split-export-declaration@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz#83949436890e07fa3d6873c61a96e3bbf692d856" - integrity sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA== - dependencies: - "@babel/types" "^7.24.7" - -"@babel/helper-string-parser@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz#4d2d0f14820ede3b9807ea5fc36dfc8cd7da07f2" - integrity sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg== - -"@babel/helper-validator-identifier@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz#75b889cfaf9e35c2aaf42cf0d72c8e91719251db" - integrity sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w== - -"@babel/helper-validator-option@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.24.7.tgz#24c3bb77c7a425d1742eec8fb433b5a1b38e62f6" - integrity sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw== - -"@babel/helpers@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.7.tgz#aa2ccda29f62185acb5d42fb4a3a1b1082107416" - integrity sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg== - dependencies: - "@babel/template" "^7.24.7" - "@babel/types" "^7.24.7" - -"@babel/highlight@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.7.tgz#a05ab1df134b286558aae0ed41e6c5f731bf409d" - integrity sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw== - dependencies: - "@babel/helper-validator-identifier" "^7.24.7" - chalk "^2.4.2" - js-tokens "^4.0.0" - picocolors "^1.0.0" +"@babel/helper-module-imports@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz#e7f8d20602ebdbf9ebbea0a0751fb0f2a4141715" + integrity sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw== + dependencies: + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.25.9" + +"@babel/helper-module-transforms@^7.26.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz#8ce54ec9d592695e58d84cd884b7b5c6a2fdeeae" + integrity sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw== + dependencies: + "@babel/helper-module-imports" "^7.25.9" + "@babel/helper-validator-identifier" "^7.25.9" + "@babel/traverse" "^7.25.9" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.25.9", "@babel/helper-plugin-utils@^7.8.0": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz#9cbdd63a9443a2c92a725cca7ebca12cc8dd9f46" + integrity sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw== -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.7.tgz#9a5226f92f0c5c8ead550b750f5608e766c8ce85" - integrity sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw== +"@babel/helper-string-parser@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz#1aabb72ee72ed35789b4bbcad3ca2862ce614e8c" + integrity sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA== + +"@babel/helper-validator-identifier@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz#24b64e2c3ec7cd3b3c547729b8d16871f22cbdc7" + integrity sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ== + +"@babel/helper-validator-option@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz#86e45bd8a49ab7e03f276577f96179653d41da72" + integrity sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw== + +"@babel/helpers@^7.26.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.26.0.tgz#30e621f1eba5aa45fe6f4868d2e9154d884119a4" + integrity sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw== + dependencies: + "@babel/template" "^7.25.9" + "@babel/types" "^7.26.0" + +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.25.9", "@babel/parser@^7.26.0", "@babel/parser@^7.26.2": + version "7.26.2" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.2.tgz#fd7b6f487cfea09889557ef5d4eeb9ff9a5abd11" + integrity sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ== + dependencies: + "@babel/types" "^7.26.0" "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" @@ -188,14 +143,28 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-class-properties@^7.8.3": +"@babel/plugin-syntax-class-properties@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-syntax-import-meta@^7.8.3": +"@babel/plugin-syntax-class-static-block@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" + integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-import-attributes@^7.24.7": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz#3b1412847699eea739b4f2602c74ce36f6b0b0f7" + integrity sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-syntax-import-meta@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== @@ -209,7 +178,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-logical-assignment-operators@^7.8.3": +"@babel/plugin-syntax-jsx@^7.7.2": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz#a34313a178ea56f1951599b929c1ceacee719290" + integrity sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== @@ -223,7 +199,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-numeric-separator@^7.8.3": +"@babel/plugin-syntax-numeric-separator@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== @@ -251,7 +227,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-top-level-await@^7.8.3": +"@babel/plugin-syntax-private-property-in-object@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" + integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-top-level-await@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== @@ -259,45 +242,41 @@ "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-typescript@^7.7.2": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.7.tgz#58d458271b4d3b6bb27ee6ac9525acbb259bad1c" - integrity sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA== - dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - -"@babel/template@^7.24.7", "@babel/template@^7.3.3": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.24.7.tgz#02efcee317d0609d2c07117cb70ef8fb17ab7315" - integrity sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig== - dependencies: - "@babel/code-frame" "^7.24.7" - "@babel/parser" "^7.24.7" - "@babel/types" "^7.24.7" - -"@babel/traverse@^7.24.7", "@babel/traverse@^7.7.2": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.7.tgz#de2b900163fa741721ba382163fe46a936c40cf5" - integrity sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA== - dependencies: - "@babel/code-frame" "^7.24.7" - "@babel/generator" "^7.24.7" - "@babel/helper-environment-visitor" "^7.24.7" - "@babel/helper-function-name" "^7.24.7" - "@babel/helper-hoist-variables" "^7.24.7" - "@babel/helper-split-export-declaration" "^7.24.7" - "@babel/parser" "^7.24.7" - "@babel/types" "^7.24.7" + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz#67dda2b74da43727cf21d46cf9afef23f4365399" + integrity sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/template@^7.25.9", "@babel/template@^7.3.3": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.9.tgz#ecb62d81a8a6f5dc5fe8abfc3901fc52ddf15016" + integrity sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg== + dependencies: + "@babel/code-frame" "^7.25.9" + "@babel/parser" "^7.25.9" + "@babel/types" "^7.25.9" + +"@babel/traverse@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.9.tgz#a50f8fe49e7f69f53de5bea7e413cd35c5e13c84" + integrity sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw== + dependencies: + "@babel/code-frame" "^7.25.9" + "@babel/generator" "^7.25.9" + "@babel/parser" "^7.25.9" + "@babel/template" "^7.25.9" + "@babel/types" "^7.25.9" debug "^4.3.1" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.24.7", "@babel/types@^7.3.3": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.7.tgz#6027fe12bc1aa724cd32ab113fb7f1988f1f66f2" - integrity sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q== +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.25.9", "@babel/types@^7.26.0", "@babel/types@^7.3.3": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.0.tgz#deabd08d6b753bc8e0f198f8709fb575e31774ff" + integrity sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA== dependencies: - "@babel/helper-string-parser" "^7.24.7" - "@babel/helper-validator-identifier" "^7.24.7" - to-fast-properties "^2.0.0" + "@babel/helper-string-parser" "^7.25.9" + "@babel/helper-validator-identifier" "^7.25.9" "@bcoe/v8-coverage@^0.2.3": version "0.2.3" @@ -383,54 +362,54 @@ js-yaml "^3.13.1" resolve-from "^5.0.0" -"@istanbuljs/schema@^0.1.2": +"@istanbuljs/schema@^0.1.2", "@istanbuljs/schema@^0.1.3": version "0.1.3" resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== -"@jest/console@^27.5.1": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-27.5.1.tgz#260fe7239602fe5130a94f1aa386eff54b014bba" - integrity sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg== +"@jest/console@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.7.0.tgz#cd4822dbdb84529265c5a2bdb529a3c9cc950ffc" + integrity sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg== dependencies: - "@jest/types" "^27.5.1" + "@jest/types" "^29.6.3" "@types/node" "*" chalk "^4.0.0" - jest-message-util "^27.5.1" - jest-util "^27.5.1" + jest-message-util "^29.7.0" + jest-util "^29.7.0" slash "^3.0.0" -"@jest/core@^27.5.1": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-27.5.1.tgz#267ac5f704e09dc52de2922cbf3af9edcd64b626" - integrity sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ== +"@jest/core@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.7.0.tgz#b6cccc239f30ff36609658c5a5e2291757ce448f" + integrity sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg== dependencies: - "@jest/console" "^27.5.1" - "@jest/reporters" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/transform" "^27.5.1" - "@jest/types" "^27.5.1" + "@jest/console" "^29.7.0" + "@jest/reporters" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" "@types/node" "*" ansi-escapes "^4.2.1" chalk "^4.0.0" - emittery "^0.8.1" + ci-info "^3.2.0" exit "^0.1.2" graceful-fs "^4.2.9" - jest-changed-files "^27.5.1" - jest-config "^27.5.1" - jest-haste-map "^27.5.1" - jest-message-util "^27.5.1" - jest-regex-util "^27.5.1" - jest-resolve "^27.5.1" - jest-resolve-dependencies "^27.5.1" - jest-runner "^27.5.1" - jest-runtime "^27.5.1" - jest-snapshot "^27.5.1" - jest-util "^27.5.1" - jest-validate "^27.5.1" - jest-watcher "^27.5.1" + jest-changed-files "^29.7.0" + jest-config "^29.7.0" + jest-haste-map "^29.7.0" + jest-message-util "^29.7.0" + jest-regex-util "^29.6.3" + jest-resolve "^29.7.0" + jest-resolve-dependencies "^29.7.0" + jest-runner "^29.7.0" + jest-runtime "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" + jest-watcher "^29.7.0" micromatch "^4.0.4" - rimraf "^3.0.0" + pretty-format "^29.7.0" slash "^3.0.0" strip-ansi "^6.0.0" @@ -444,6 +423,31 @@ "@types/node" "*" jest-mock "^27.5.1" +"@jest/environment@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.7.0.tgz#24d61f54ff1f786f3cd4073b4b94416383baf2a7" + integrity sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw== + dependencies: + "@jest/fake-timers" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + jest-mock "^29.7.0" + +"@jest/expect-utils@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.7.0.tgz#023efe5d26a8a70f21677d0a1afc0f0a44e3a1c6" + integrity sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA== + dependencies: + jest-get-type "^29.6.3" + +"@jest/expect@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.7.0.tgz#76a3edb0cb753b70dfbfe23283510d3d45432bf2" + integrity sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ== + dependencies: + expect "^29.7.0" + jest-snapshot "^29.7.0" + "@jest/fake-timers@^27.5.1": version "27.5.1" resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-27.5.1.tgz#76979745ce0579c8a94a4678af7a748eda8ada74" @@ -456,45 +460,57 @@ jest-mock "^27.5.1" jest-util "^27.5.1" -"@jest/globals@^27.5.1": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-27.5.1.tgz#7ac06ce57ab966566c7963431cef458434601b2b" - integrity sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q== +"@jest/fake-timers@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.7.0.tgz#fd91bf1fffb16d7d0d24a426ab1a47a49881a565" + integrity sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ== dependencies: - "@jest/environment" "^27.5.1" - "@jest/types" "^27.5.1" - expect "^27.5.1" + "@jest/types" "^29.6.3" + "@sinonjs/fake-timers" "^10.0.2" + "@types/node" "*" + jest-message-util "^29.7.0" + jest-mock "^29.7.0" + jest-util "^29.7.0" -"@jest/reporters@^27.5.1": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-27.5.1.tgz#ceda7be96170b03c923c37987b64015812ffec04" - integrity sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw== +"@jest/globals@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.7.0.tgz#8d9290f9ec47ff772607fa864ca1d5a2efae1d4d" + integrity sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/expect" "^29.7.0" + "@jest/types" "^29.6.3" + jest-mock "^29.7.0" + +"@jest/reporters@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.7.0.tgz#04b262ecb3b8faa83b0b3d321623972393e8f4c7" + integrity sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg== dependencies: "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/transform" "^27.5.1" - "@jest/types" "^27.5.1" + "@jest/console" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@jridgewell/trace-mapping" "^0.3.18" "@types/node" "*" chalk "^4.0.0" collect-v8-coverage "^1.0.0" exit "^0.1.2" - glob "^7.1.2" + glob "^7.1.3" graceful-fs "^4.2.9" istanbul-lib-coverage "^3.0.0" - istanbul-lib-instrument "^5.1.0" + istanbul-lib-instrument "^6.0.0" istanbul-lib-report "^3.0.0" istanbul-lib-source-maps "^4.0.0" istanbul-reports "^3.1.3" - jest-haste-map "^27.5.1" - jest-resolve "^27.5.1" - jest-util "^27.5.1" - jest-worker "^27.5.1" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + jest-worker "^29.7.0" slash "^3.0.0" - source-map "^0.6.0" string-length "^4.0.1" - terminal-link "^2.0.0" - v8-to-istanbul "^8.1.0" + strip-ansi "^6.0.0" + v8-to-istanbul "^9.0.1" "@jest/schemas@^29.6.3": version "29.6.3" @@ -503,55 +519,55 @@ dependencies: "@sinclair/typebox" "^0.27.8" -"@jest/source-map@^27.5.1": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-27.5.1.tgz#6608391e465add4205eae073b55e7f279e04e8cf" - integrity sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg== +"@jest/source-map@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.6.3.tgz#d90ba772095cf37a34a5eb9413f1b562a08554c4" + integrity sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw== dependencies: + "@jridgewell/trace-mapping" "^0.3.18" callsites "^3.0.0" graceful-fs "^4.2.9" - source-map "^0.6.0" -"@jest/test-result@^27.5.1": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-27.5.1.tgz#56a6585fa80f7cdab72b8c5fc2e871d03832f5bb" - integrity sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag== +"@jest/test-result@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.7.0.tgz#8db9a80aa1a097bb2262572686734baed9b1657c" + integrity sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA== dependencies: - "@jest/console" "^27.5.1" - "@jest/types" "^27.5.1" + "@jest/console" "^29.7.0" + "@jest/types" "^29.6.3" "@types/istanbul-lib-coverage" "^2.0.0" collect-v8-coverage "^1.0.0" -"@jest/test-sequencer@^27.5.1": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz#4057e0e9cea4439e544c6353c6affe58d095745b" - integrity sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ== +"@jest/test-sequencer@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz#6cef977ce1d39834a3aea887a1726628a6f072ce" + integrity sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw== dependencies: - "@jest/test-result" "^27.5.1" + "@jest/test-result" "^29.7.0" graceful-fs "^4.2.9" - jest-haste-map "^27.5.1" - jest-runtime "^27.5.1" + jest-haste-map "^29.7.0" + slash "^3.0.0" -"@jest/transform@^27.5.1": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-27.5.1.tgz#6c3501dcc00c4c08915f292a600ece5ecfe1f409" - integrity sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw== +"@jest/transform@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.7.0.tgz#df2dd9c346c7d7768b8a06639994640c642e284c" + integrity sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw== dependencies: - "@babel/core" "^7.1.0" - "@jest/types" "^27.5.1" + "@babel/core" "^7.11.6" + "@jest/types" "^29.6.3" + "@jridgewell/trace-mapping" "^0.3.18" babel-plugin-istanbul "^6.1.1" chalk "^4.0.0" - convert-source-map "^1.4.0" - fast-json-stable-stringify "^2.0.0" + convert-source-map "^2.0.0" + fast-json-stable-stringify "^2.1.0" graceful-fs "^4.2.9" - jest-haste-map "^27.5.1" - jest-regex-util "^27.5.1" - jest-util "^27.5.1" + jest-haste-map "^29.7.0" + jest-regex-util "^29.6.3" + jest-util "^29.7.0" micromatch "^4.0.4" pirates "^4.0.4" slash "^3.0.0" - source-map "^0.6.1" - write-file-atomic "^3.0.0" + write-file-atomic "^4.0.2" "@jest/types@^27.5.1": version "27.5.1" @@ -616,7 +632,7 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" -"@jridgewell/trace-mapping@^0.3.20", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.20", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": version "0.3.25" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== @@ -650,6 +666,38 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@redocly/ajv@^8.11.2": + version "8.11.2" + resolved "https://registry.yarnpkg.com/@redocly/ajv/-/ajv-8.11.2.tgz#46e1bf321ec0ac1e0fd31dea41a3d1fcbdcda0b5" + integrity sha512-io1JpnwtIcvojV7QKDUSIuMN/ikdOUd1ReEnUnMKGfDVridQZ31J0MmIuqwuRjWDZfmvr+Q0MqCcfHM2gTivOg== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js-replace "^1.0.1" + +"@redocly/config@^0.10.1": + version "0.10.1" + resolved "https://registry.yarnpkg.com/@redocly/config/-/config-0.10.1.tgz#c7bcbab6cb3b82236c2f5c87aa44924a652d8e80" + integrity sha512-H3LnKVGzOaxskwJu8pmJYwBOWjP61qOK7TuTrbafqArDVckE06fhA6l0nO4KvBbjLPjy1Al7UnlxOu23V4Nl0w== + +"@redocly/openapi-core@^1.22.1": + version "1.24.0" + resolved "https://registry.yarnpkg.com/@redocly/openapi-core/-/openapi-core-1.24.0.tgz#0d234b62a81ebbba070a348b4654a60f878eb1a8" + integrity sha512-BFCwRTwkAHeYd8/IggOo0ZyseLJHzSTVGnVRaZCG0rcH3+d+N6qcjYIQRuNrjHlIFCsVFL7/ugLWFL5irODt7g== + dependencies: + "@redocly/ajv" "^8.11.2" + "@redocly/config" "^0.10.1" + colorette "^1.2.0" + https-proxy-agent "^7.0.4" + js-levenshtein "^1.1.6" + js-yaml "^4.1.0" + lodash.isequal "^4.5.0" + minimatch "^5.0.1" + node-fetch "^2.6.1" + pluralize "^8.0.0" + yaml-ast-parser "0.0.43" + "@sinclair/typebox@^0.27.8": version "0.27.8" resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" @@ -662,6 +710,20 @@ dependencies: type-detect "4.0.8" +"@sinonjs/commons@^3.0.0": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.1.tgz#1029357e44ca901a615585f6d27738dbc89084cd" + integrity sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ== + dependencies: + type-detect "4.0.8" + +"@sinonjs/fake-timers@^10.0.2": + version "10.3.0" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz#55fdff1ecab9f354019129daf4df0dd4d923ea66" + integrity sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA== + dependencies: + "@sinonjs/commons" "^3.0.0" + "@sinonjs/fake-timers@^8.0.1": version "8.1.0" resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz#3fdc2b6cb58935b21bfb8d1625eb1300484316e7" @@ -694,7 +756,7 @@ resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== -"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.14": +"@types/babel__core@^7.1.14": version "7.20.5" resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== @@ -720,7 +782,7 @@ "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" -"@types/babel__traverse@*", "@types/babel__traverse@^7.0.4", "@types/babel__traverse@^7.0.6": +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": version "7.20.6" resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.6.tgz#8dc9f0ae0f202c08d8d4dab648912c8d6038e3f7" integrity sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg== @@ -800,7 +862,12 @@ "@types/qs" "*" "@types/serve-static" "*" -"@types/graceful-fs@^4.1.2": +"@types/figlet@^1.5.8": + version "1.5.8" + resolved "https://registry.yarnpkg.com/@types/figlet/-/figlet-1.5.8.tgz#96b8186c7e2a388b4f8d09ee3276cba2af88bb0b" + integrity sha512-G22AUvy4Tl95XLE7jmUM8s8mKcoz+Hr+Xm9W90gJsppJq9f9tHvOGkrpn4gRX0q/cLtBdNkWtWCKDg2UDZoZvQ== + +"@types/graceful-fs@^4.1.3": version "4.1.9" resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.9.tgz#2a06bc0f68a20ab37b3e36aa238be6abdf49e8b4" integrity sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ== @@ -831,13 +898,13 @@ dependencies: "@types/istanbul-lib-report" "*" -"@types/jest@27.5.2": - version "27.5.2" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-27.5.2.tgz#ec49d29d926500ffb9fd22b84262e862049c026c" - integrity sha512-mpT8LJJ4CMeeahobofYWIjFo0xonRS/HfxnVEPMPFSQdGUt1uHCnoPT7Zhb+sjDU2wz0oKV0OLUR0WzrHNgfeA== +"@types/jest@29.5.14": + version "29.5.14" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.14.tgz#2b910912fa1d6856cadcd0c1f95af7df1d6049e5" + integrity sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ== dependencies: - jest-matcher-utils "^27.0.0" - pretty-format "^27.0.0" + expect "^29.0.0" + pretty-format "^29.0.0" "@types/js-yaml@4.0.5": version "4.0.5" @@ -863,6 +930,18 @@ dependencies: "@types/node" "*" +"@types/lodash-es@^4.17.12": + version "4.17.12" + resolved "https://registry.yarnpkg.com/@types/lodash-es/-/lodash-es-4.17.12.tgz#65f6d1e5f80539aa7cfbfc962de5def0cf4f341b" + integrity sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ== + dependencies: + "@types/lodash" "*" + +"@types/lodash@*": + version "4.17.7" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.17.7.tgz#2f776bcb53adc9e13b2c0dfd493dfcbd7de43612" + integrity sha512-8wTvZawATi/lsmNu10/j2hk1KEP0IvjubqPE3cu1Xz7xfXXt5oCq3SNUz4fMIP4XGF9Ky+Ue2tBA3hcS7LSBlA== + "@types/mime@^1": version "1.3.5" resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.5.tgz#1ef302e01cf7d2b5a0fa526790c9123bf1d06690" @@ -888,7 +967,14 @@ "@types/node" "*" form-data "^4.0.0" -"@types/node@*", "@types/node@^20.10.4": +"@types/node@*": + version "22.9.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.9.0.tgz#b7f16e5c3384788542c72dc3d561a7ceae2c0365" + integrity sha512-vuyHg81vvWA1Z1ELfvLko2c8f34gyA0zaic0+Rllc5lbCnbSyuvb2Oxpm6TAUAC/2xZN3QGqxBNggD1nNR2AfQ== + dependencies: + undici-types "~6.19.8" + +"@types/node@^20.10.4": version "20.14.10" resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.10.tgz#a1a218290f1b6428682e3af044785e5874db469a" integrity sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ== @@ -918,11 +1004,6 @@ dependencies: "@types/express" "*" -"@types/prettier@^2.1.5": - version "2.7.3" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.3.tgz#3e51a17e291d01d17d3fc61422015a933af7a08f" - integrity sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA== - "@types/qs@*": version "6.9.15" resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.15.tgz#adde8a060ec9c305a82de1babc1056e73bd64dce" @@ -960,6 +1041,14 @@ resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.3.tgz#6209321eb2c1712a7e7466422b8cb1fc0d9dd5d8" integrity sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw== +"@types/swagger2openapi@^7.0.4": + version "7.0.4" + resolved "https://registry.yarnpkg.com/@types/swagger2openapi/-/swagger2openapi-7.0.4.tgz#56723c4184c067a70f2cd47f7607e5330770dded" + integrity sha512-ffMqzciTDihOKH4Q//9Ond1yb5JP1P5FC/aFPsLK4blea1Fwk2aYctiNCkAh5etDYFswFXS+5LV/vuGkf+PU6A== + dependencies: + "@types/node" "*" + openapi-types "^12.1.0" + "@types/webpack-env@^1.17.0": version "1.18.5" resolved "https://registry.yarnpkg.com/@types/webpack-env/-/webpack-env-1.18.5.tgz#eccda0b04fe024bed505881e2e532f9c119169bf" @@ -1273,6 +1362,13 @@ agent-base@6: dependencies: debug "4" +agent-base@^7.0.2: + version "7.1.1" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.1.tgz#bdbded7dfb096b751a2a087eeeb9664725b2e317" + integrity sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA== + dependencies: + debug "^4.3.4" + aggregate-error@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" @@ -1396,6 +1492,19 @@ anymatch@^3.0.3: normalize-path "^3.0.0" picomatch "^2.0.4" +apigen-ts@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/apigen-ts/-/apigen-ts-0.2.0.tgz#fe195418adb70a4e32bcb8146aa1bab3f0065525" + integrity sha512-9R3rQSq2i3qAUq5/fzQLiKlwo3MbQyyZNAQp0dFIoPmeOZl2wkrGDLmCfnhArNUTwShI0WBwh5jqDvbIu9Q1oA== + dependencies: + "@redocly/openapi-core" "^1.22.1" + "@types/lodash-es" "^4.17.12" + "@types/swagger2openapi" "^7.0.4" + array-utils-ts "^0.1.2" + cleye "^1.3.2" + lodash-es "^4.17.21" + swagger2openapi "^7.0.8" + append-field@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/append-field/-/append-field-1.0.0.tgz#1e3440e915f0b1203d23748e78edd7b9b5b43e56" @@ -1467,6 +1576,11 @@ array-unique@^0.2.1: resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" integrity sha512-G2n5bG5fSUCpnsXz4+8FUkYsGPkNfLn9YvS66U5qbTIXI2Ynnlo4Bi42bWv+omKUCqz+ejzfClwne0alJWJPhg== +array-utils-ts@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/array-utils-ts/-/array-utils-ts-0.1.2.tgz#232a416b0e6794b64880372e297d9702cf8877ef" + integrity sha512-AVp/ybvqELxWd7ZtSC9HGwPPv4FOoWlJWtOaQY1lZuPKmRmJKXA80f+CAyMByH6yCF7H5wDupA67c7N0SGTiTQ== + arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" @@ -1509,16 +1623,15 @@ autoprefixer@^7.1.2: postcss "^6.0.17" postcss-value-parser "^3.2.3" -babel-jest@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-27.5.1.tgz#a1bf8d61928edfefd21da27eb86a695bfd691444" - integrity sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg== +babel-jest@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.7.0.tgz#f4369919225b684c56085998ac63dbd05be020d5" + integrity sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg== dependencies: - "@jest/transform" "^27.5.1" - "@jest/types" "^27.5.1" + "@jest/transform" "^29.7.0" "@types/babel__core" "^7.1.14" babel-plugin-istanbul "^6.1.1" - babel-preset-jest "^27.5.1" + babel-preset-jest "^29.6.3" chalk "^4.0.0" graceful-fs "^4.2.9" slash "^3.0.0" @@ -1534,40 +1647,43 @@ babel-plugin-istanbul@^6.1.1: istanbul-lib-instrument "^5.0.4" test-exclude "^6.0.0" -babel-plugin-jest-hoist@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz#9be98ecf28c331eb9f5df9c72d6f89deb8181c2e" - integrity sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ== +babel-plugin-jest-hoist@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz#aadbe943464182a8922c3c927c3067ff40d24626" + integrity sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg== dependencies: "@babel/template" "^7.3.3" "@babel/types" "^7.3.3" - "@types/babel__core" "^7.0.0" + "@types/babel__core" "^7.1.14" "@types/babel__traverse" "^7.0.6" babel-preset-current-node-syntax@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" - integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== + version "1.1.0" + resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz#9a929eafece419612ef4ae4f60b1862ebad8ef30" + integrity sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw== dependencies: "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-syntax-bigint" "^7.8.3" - "@babel/plugin-syntax-class-properties" "^7.8.3" - "@babel/plugin-syntax-import-meta" "^7.8.3" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-syntax-import-attributes" "^7.24.7" + "@babel/plugin-syntax-import-meta" "^7.10.4" "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" "@babel/plugin-syntax-object-rest-spread" "^7.8.3" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-top-level-await" "^7.8.3" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" -babel-preset-jest@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz#91f10f58034cb7989cb4f962b69fa6eef6a6bc81" - integrity sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag== +babel-preset-jest@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz#fa05fa510e7d493896d7b0dd2033601c840f171c" + integrity sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA== dependencies: - babel-plugin-jest-hoist "^27.5.1" + babel-plugin-jest-hoist "^29.6.3" babel-preset-current-node-syntax "^1.0.0" bail@^1.0.0: @@ -1665,7 +1781,7 @@ browserslist@^2.11.3: caniuse-lite "^1.0.30000792" electron-to-chromium "^1.3.30" -browserslist@^4.21.10, browserslist@^4.22.2: +browserslist@^4.21.10: version "4.23.2" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.2.tgz#244fe803641f1c19c28c48c4b6ec9736eb3d32ed" integrity sha512-qkqSyistMYdxAcw+CzbZwlBy8AGmS/eEWs+sEV5TnLRGDOL+C5M2EnH6tlZyg0YoAxGJAFKh61En9BR941GnHA== @@ -1675,6 +1791,16 @@ browserslist@^4.21.10, browserslist@^4.22.2: node-releases "^2.0.14" update-browserslist-db "^1.1.0" +browserslist@^4.24.0: + version "4.24.2" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.2.tgz#f5845bc91069dbd55ee89faf9822e1d885d16580" + integrity sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg== + dependencies: + caniuse-lite "^1.0.30001669" + electron-to-chromium "^1.5.41" + node-releases "^2.0.18" + update-browserslist-db "^1.1.1" + bs-logger@0.x: version "0.2.6" resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" @@ -1769,11 +1895,16 @@ camelcase@^6.2.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -caniuse-lite@^1.0.30000792, caniuse-lite@^1.0.30000805, caniuse-lite@^1.0.30001640: +caniuse-lite@^1.0.30000792, caniuse-lite@^1.0.30000805: version "1.0.30001641" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001641.tgz#3572862cd18befae3f637f2a1101cc033c6782ac" integrity sha512-Phv5thgl67bHYo1TtMY/MurjkHhV4EDaCosezRXgZ8jzA/Ub+wjxAvbGvjoFENStinwi5kCyOYV3mi5tOGykwA== +caniuse-lite@^1.0.30001640, caniuse-lite@^1.0.30001669: + version "1.0.30001680" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001680.tgz#5380ede637a33b9f9f1fc6045ea99bd142f3da5e" + integrity sha512-rPQy70G6AGUMnbwS1z6Xg+RkHYPAi18ihs47GH0jcxIG7wArmPgY3XbS2sRdBbxJljp3thdT8BIqv9ccCypiPA== + capture-stack-trace@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.2.tgz#1c43f6b059d4249e7f3f8724f15f048b927d3a8a" @@ -1795,7 +1926,7 @@ chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^2.0.1, chalk@^2.1.0, chalk@^2.4.1, chalk@^2.4.2: +chalk@^2.0.1, chalk@^2.1.0, chalk@^2.4.1: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -1874,15 +2005,23 @@ circular-json@^0.3.1: integrity sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A== cjs-module-lexer@^1.0.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz#c485341ae8fd999ca4ee5af2d7a1c9ae01e0099c" - integrity sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q== + version "1.4.1" + resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz#707413784dbb3a72aa11c2f2b042a0bef4004170" + integrity sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA== clean-stack@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== +cleye@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/cleye/-/cleye-1.3.2.tgz#3c013c816f604d446a92e1457debdb360985f7e9" + integrity sha512-MngIC2izcCz07iRKr3Pe8Z6ZBv4zbKFl/YnQEN/aMHis6PpH+MxI2e6n0bMUAmSVlMoAyQkdBCSTbfDmtcSovQ== + dependencies: + terminal-columns "^1.4.1" + type-flag "^3.0.0" + cli-boxes@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" @@ -1911,15 +2050,6 @@ cli-truncate@^3.1.0: slice-ansi "^5.0.0" string-width "^5.0.0" -cliui@^7.0.2: - version "7.0.4" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" - integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^7.0.0" - cliui@^8.0.1: version "8.0.1" resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" @@ -1976,6 +2106,11 @@ color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +colorette@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.4.0.tgz#5190fbb87276259a86ad700bff2c6d6faa3fca40" + integrity sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g== + colorette@^2.0.19: version "2.0.20" resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" @@ -2001,6 +2136,11 @@ commander@^10.0.0: resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== +commander@^12.1.0: + version "12.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-12.1.0.tgz#01423b36f501259fdaac4d0e4d60c96c991585d3" + integrity sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA== + commander@^2.20.0: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" @@ -2050,11 +2190,6 @@ content-type@^1.0.5, content-type@~1.0.4: resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== -convert-source-map@^1.4.0, convert-source-map@^1.6.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" - integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== - convert-source-map@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" @@ -2112,6 +2247,19 @@ create-error-class@^3.0.0: dependencies: capture-stack-trace "^1.0.0" +create-jest@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/create-jest/-/create-jest-29.7.0.tgz#a355c5b3cb1e1af02ba177fe7afd7feee49a5320" + integrity sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q== + dependencies: + "@jest/types" "^29.6.3" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + jest-config "^29.7.0" + jest-util "^29.7.0" + prompts "^2.0.1" + create-require@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" @@ -2126,7 +2274,7 @@ cross-spawn@^5.0.1: shebang-command "^1.2.0" which "^1.2.9" -cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: +cross-spawn@^7.0.0, cross-spawn@^7.0.2: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== @@ -2135,6 +2283,15 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" +cross-spawn@^7.0.3: + version "7.0.6" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" + integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + crypto-random-string@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" @@ -2185,7 +2342,7 @@ debug@2.6.9: dependencies: ms "2.0.0" -debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: +debug@4, debug@^4.3.2, debug@^4.3.4: version "4.3.5" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.5.tgz#e83444eceb9fedd4a1da56d671ae2446a01a6e1e" integrity sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg== @@ -2199,6 +2356,13 @@ debug@^3.0.0, debug@^3.0.1: dependencies: ms "^2.1.1" +debug@^4.1.0, debug@^4.1.1, debug@^4.3.1: + version "4.3.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" + integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== + dependencies: + ms "^2.1.3" + decamelize-keys@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.1.tgz#04a2d523b2f18d80d0158a43b895d56dff8d19d8" @@ -2217,10 +2381,10 @@ decimal.js@^10.2.1: resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== -dedent@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" - integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== +dedent@^1.0.0: + version "1.5.3" + resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.5.3.tgz#99aee19eb9bae55a67327717b6e848d0bf777e5a" + integrity sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ== deep-extend@^0.6.0: version "0.6.0" @@ -2276,10 +2440,10 @@ detect-newline@^4.0.0: resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-4.0.1.tgz#fcefdb5713e1fb8cb2839b8b6ee22e6716ab8f23" integrity sha512-qE3Veg1YXzGHQhlA6jzebZN2qVf6NX+A7m7qlhCGG30dJixrAQhYOsJjsnBjJkCSmuOPpCk30145fr8FV0bzog== -diff-sequences@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.5.1.tgz#eaecc0d327fd68c8d9672a1e64ab8dccb2ef5327" - integrity sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ== +diff-sequences@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" + integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== diff@^4.0.1: version "4.0.2" @@ -2405,15 +2569,20 @@ ejs@^3.0.0: dependencies: jake "^10.8.5" -electron-to-chromium@^1.3.30, electron-to-chromium@^1.4.820: +electron-to-chromium@^1.3.30: version "1.4.825" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.825.tgz#2d9c3d1eb81a67ecea0c06bcf70740b00ba52718" integrity sha512-OCcF+LwdgFGcsYPYC5keEEFC2XT0gBhrYbeGzHCx7i9qRFbzO/AqTmc/C/1xNhJj+JA7rzlN7mpBuStshh96Cg== -emittery@^0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.8.1.tgz#bb23cc86d03b30aa75a7f734819dee2e1ba70860" - integrity sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg== +electron-to-chromium@^1.4.820, electron-to-chromium@^1.5.41: + version "1.5.62" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.62.tgz#8289468414b0b0b3e9180ef619a763555debe612" + integrity sha512-t8c+zLmJHa9dJy96yBZRXGQYoiCEnHYgFwn1asvSPZSUdVxnB62A4RASd7k41ytG3ErFBA0TpHlKg9D9SQBmLg== + +emittery@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" + integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== emoji-regex@^8.0.0: version "8.0.0" @@ -2484,10 +2653,10 @@ es6-promise@^3.2.1: resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613" integrity sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg== -escalade@^3.1.1, escalade@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" - integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== +escalade@^3.1.1, escalade@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== escape-html@~1.0.3: version "1.0.3" @@ -2746,15 +2915,16 @@ expand-range@^1.8.1: dependencies: fill-range "^2.1.0" -expect@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/expect/-/expect-27.5.1.tgz#83ce59f1e5bdf5f9d2b94b61d2050db48f3fef74" - integrity sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw== +expect@^29.0.0, expect@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-29.7.0.tgz#578874590dcb3214514084c08115d8aee61e11bc" + integrity sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw== dependencies: - "@jest/types" "^27.5.1" - jest-get-type "^27.5.1" - jest-matcher-utils "^27.5.1" - jest-message-util "^27.5.1" + "@jest/expect-utils" "^29.7.0" + jest-get-type "^29.6.3" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-util "^29.7.0" express-openapi-validator@5.1.2: version "5.1.2" @@ -2859,7 +3029,7 @@ fast-glob@^3.2.11, fast-glob@^3.2.9, fast-glob@^3.3.0: merge2 "^1.3.0" micromatch "^4.0.4" -fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0: +fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== @@ -2900,6 +3070,11 @@ fb-watchman@^2.0.0: dependencies: bser "2.1.1" +figlet@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/figlet/-/figlet-1.7.0.tgz#46903a04603fd19c3e380358418bb2703587a72e" + integrity sha512-gO8l3wvqo0V7wEFLXPbkX83b7MVjRrk1oRLfYlZXol8nEpb/ON9pcKLI4qpBv5YtOTfrINtqb7b40iYY2FTWFg== + file-entry-cache@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" @@ -3185,7 +3360,7 @@ glob-to-regexp@^0.4.1: resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== -glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4: +glob@^7.0.3, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== @@ -3421,6 +3596,14 @@ https-proxy-agent@^5.0.0: agent-base "6" debug "4" +https-proxy-agent@^7.0.4: + version "7.0.5" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz#9e8b5013873299e11fab6fd548405da2d6c602b2" + integrity sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw== + dependencies: + agent-base "^7.0.2" + debug "4" + human-signals@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" @@ -3480,9 +3663,9 @@ import-local@^0.1.1: resolve-cwd "^2.0.0" import-local@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" - integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== + version "3.2.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.2.0.tgz#c3d5c745798c02a6f8b897726aba5100186ee260" + integrity sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA== dependencies: pkg-dir "^4.2.0" resolve-cwd "^3.0.0" @@ -3573,9 +3756,9 @@ is-ci@^1.0.10: ci-info "^1.5.0" is-core-module@^2.13.0: - version "2.14.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.14.0.tgz#43b8ef9f46a6a08888db67b1ffd4ec9e3dfd59d1" - integrity sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A== + version "2.15.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.15.1.tgz#a7363a25bee942fefab0de13bf6aa372c82dcc37" + integrity sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ== dependencies: hasown "^2.0.2" @@ -3772,11 +3955,6 @@ is-supported-regexp-flag@^1.0.0: resolved "https://registry.yarnpkg.com/is-supported-regexp-flag/-/is-supported-regexp-flag-1.0.1.tgz#21ee16518d2c1dd3edd3e9a0d57e50207ac364ca" integrity sha512-3vcJecUUrpgCqc/ca0aWeNu64UGgxcvO60K/Fkr1N6RSvfGCTU60UKN68JDmKokgba0rFFJs12EnzOQa14ubKQ== -is-typedarray@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== - is-utf8@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" @@ -3814,7 +3992,7 @@ istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756" integrity sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg== -istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: +istanbul-lib-instrument@^5.0.4: version "5.2.1" resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== @@ -3825,6 +4003,17 @@ istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: istanbul-lib-coverage "^3.2.0" semver "^6.3.0" +istanbul-lib-instrument@^6.0.0: + version "6.0.3" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz#fa15401df6c15874bcb2105f773325d78c666765" + integrity sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q== + dependencies: + "@babel/core" "^7.23.9" + "@babel/parser" "^7.23.9" + "@istanbuljs/schema" "^0.1.3" + istanbul-lib-coverage "^3.2.0" + semver "^7.5.4" + istanbul-lib-report@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#908305bac9a5bd175ac6a74489eafd0fc2445a7d" @@ -3861,115 +4050,113 @@ jake@^10.8.5: filelist "^1.0.4" minimatch "^3.1.2" -jest-changed-files@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-27.5.1.tgz#a348aed00ec9bf671cc58a66fcbe7c3dfd6a68f5" - integrity sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw== +jest-changed-files@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.7.0.tgz#1c06d07e77c78e1585d020424dedc10d6e17ac3a" + integrity sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w== dependencies: - "@jest/types" "^27.5.1" execa "^5.0.0" - throat "^6.0.1" + jest-util "^29.7.0" + p-limit "^3.1.0" -jest-circus@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-27.5.1.tgz#37a5a4459b7bf4406e53d637b49d22c65d125ecc" - integrity sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw== +jest-circus@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.7.0.tgz#b6817a45fcc835d8b16d5962d0c026473ee3668a" + integrity sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw== dependencies: - "@jest/environment" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/types" "^27.5.1" + "@jest/environment" "^29.7.0" + "@jest/expect" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" "@types/node" "*" chalk "^4.0.0" co "^4.6.0" - dedent "^0.7.0" - expect "^27.5.1" + dedent "^1.0.0" is-generator-fn "^2.0.0" - jest-each "^27.5.1" - jest-matcher-utils "^27.5.1" - jest-message-util "^27.5.1" - jest-runtime "^27.5.1" - jest-snapshot "^27.5.1" - jest-util "^27.5.1" - pretty-format "^27.5.1" + jest-each "^29.7.0" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-runtime "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" + p-limit "^3.1.0" + pretty-format "^29.7.0" + pure-rand "^6.0.0" slash "^3.0.0" stack-utils "^2.0.3" - throat "^6.0.1" -jest-cli@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-27.5.1.tgz#278794a6e6458ea8029547e6c6cbf673bd30b145" - integrity sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw== +jest-cli@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.7.0.tgz#5592c940798e0cae677eec169264f2d839a37995" + integrity sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg== dependencies: - "@jest/core" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/types" "^27.5.1" + "@jest/core" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" chalk "^4.0.0" + create-jest "^29.7.0" exit "^0.1.2" - graceful-fs "^4.2.9" import-local "^3.0.2" - jest-config "^27.5.1" - jest-util "^27.5.1" - jest-validate "^27.5.1" - prompts "^2.0.1" - yargs "^16.2.0" + jest-config "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" + yargs "^17.3.1" -jest-config@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-27.5.1.tgz#5c387de33dca3f99ad6357ddeccd91bf3a0e4a41" - integrity sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA== +jest-config@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.7.0.tgz#bcbda8806dbcc01b1e316a46bb74085a84b0245f" + integrity sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ== dependencies: - "@babel/core" "^7.8.0" - "@jest/test-sequencer" "^27.5.1" - "@jest/types" "^27.5.1" - babel-jest "^27.5.1" + "@babel/core" "^7.11.6" + "@jest/test-sequencer" "^29.7.0" + "@jest/types" "^29.6.3" + babel-jest "^29.7.0" chalk "^4.0.0" ci-info "^3.2.0" deepmerge "^4.2.2" - glob "^7.1.1" + glob "^7.1.3" graceful-fs "^4.2.9" - jest-circus "^27.5.1" - jest-environment-jsdom "^27.5.1" - jest-environment-node "^27.5.1" - jest-get-type "^27.5.1" - jest-jasmine2 "^27.5.1" - jest-regex-util "^27.5.1" - jest-resolve "^27.5.1" - jest-runner "^27.5.1" - jest-util "^27.5.1" - jest-validate "^27.5.1" + jest-circus "^29.7.0" + jest-environment-node "^29.7.0" + jest-get-type "^29.6.3" + jest-regex-util "^29.6.3" + jest-resolve "^29.7.0" + jest-runner "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" micromatch "^4.0.4" parse-json "^5.2.0" - pretty-format "^27.5.1" + pretty-format "^29.7.0" slash "^3.0.0" strip-json-comments "^3.1.1" -jest-diff@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-27.5.1.tgz#a07f5011ac9e6643cf8a95a462b7b1ecf6680def" - integrity sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw== +jest-diff@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.7.0.tgz#017934a66ebb7ecf6f205e84699be10afd70458a" + integrity sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw== dependencies: chalk "^4.0.0" - diff-sequences "^27.5.1" - jest-get-type "^27.5.1" - pretty-format "^27.5.1" + diff-sequences "^29.6.3" + jest-get-type "^29.6.3" + pretty-format "^29.7.0" -jest-docblock@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-27.5.1.tgz#14092f364a42c6108d42c33c8cf30e058e25f6c0" - integrity sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ== +jest-docblock@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.7.0.tgz#8fddb6adc3cdc955c93e2a87f61cfd350d5d119a" + integrity sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g== dependencies: detect-newline "^3.0.0" -jest-each@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-27.5.1.tgz#5bc87016f45ed9507fed6e4702a5b468a5b2c44e" - integrity sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ== +jest-each@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.7.0.tgz#162a9b3f2328bdd991beaabffbb74745e56577d1" + integrity sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ== dependencies: - "@jest/types" "^27.5.1" + "@jest/types" "^29.6.3" chalk "^4.0.0" - jest-get-type "^27.5.1" - jest-util "^27.5.1" - pretty-format "^27.5.1" + jest-get-type "^29.6.3" + jest-util "^29.7.0" + pretty-format "^29.7.0" jest-environment-jsdom@^27.5.1: version "27.5.1" @@ -3984,83 +4171,59 @@ jest-environment-jsdom@^27.5.1: jest-util "^27.5.1" jsdom "^16.6.0" -jest-environment-node@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-27.5.1.tgz#dedc2cfe52fab6b8f5714b4808aefa85357a365e" - integrity sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw== +jest-environment-node@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.7.0.tgz#0b93e111dda8ec120bc8300e6d1fb9576e164376" + integrity sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw== dependencies: - "@jest/environment" "^27.5.1" - "@jest/fake-timers" "^27.5.1" - "@jest/types" "^27.5.1" + "@jest/environment" "^29.7.0" + "@jest/fake-timers" "^29.7.0" + "@jest/types" "^29.6.3" "@types/node" "*" - jest-mock "^27.5.1" - jest-util "^27.5.1" + jest-mock "^29.7.0" + jest-util "^29.7.0" -jest-get-type@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-27.5.1.tgz#3cd613c507b0f7ace013df407a1c1cd578bcb4f1" - integrity sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw== +jest-get-type@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1" + integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw== -jest-haste-map@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-27.5.1.tgz#9fd8bd7e7b4fa502d9c6164c5640512b4e811e7f" - integrity sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng== +jest-haste-map@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.7.0.tgz#3c2396524482f5a0506376e6c858c3bbcc17b104" + integrity sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA== dependencies: - "@jest/types" "^27.5.1" - "@types/graceful-fs" "^4.1.2" + "@jest/types" "^29.6.3" + "@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 "^27.5.1" - jest-serializer "^27.5.1" - jest-util "^27.5.1" - jest-worker "^27.5.1" + jest-regex-util "^29.6.3" + jest-util "^29.7.0" + jest-worker "^29.7.0" micromatch "^4.0.4" - walker "^1.0.7" + walker "^1.0.8" optionalDependencies: fsevents "^2.3.2" -jest-jasmine2@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz#a037b0034ef49a9f3d71c4375a796f3b230d1ac4" - integrity sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ== - dependencies: - "@jest/environment" "^27.5.1" - "@jest/source-map" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/node" "*" - chalk "^4.0.0" - co "^4.6.0" - expect "^27.5.1" - is-generator-fn "^2.0.0" - jest-each "^27.5.1" - jest-matcher-utils "^27.5.1" - jest-message-util "^27.5.1" - jest-runtime "^27.5.1" - jest-snapshot "^27.5.1" - jest-util "^27.5.1" - pretty-format "^27.5.1" - throat "^6.0.1" - -jest-leak-detector@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz#6ec9d54c3579dd6e3e66d70e3498adf80fde3fb8" - integrity sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ== +jest-leak-detector@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz#5b7ec0dadfdfec0ca383dc9aa016d36b5ea4c728" + integrity sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw== dependencies: - jest-get-type "^27.5.1" - pretty-format "^27.5.1" + jest-get-type "^29.6.3" + pretty-format "^29.7.0" -jest-matcher-utils@^27.0.0, jest-matcher-utils@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz#9c0cdbda8245bc22d2331729d1091308b40cf8ab" - integrity sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw== +jest-matcher-utils@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz#ae8fec79ff249fd592ce80e3ee474e83a6c44f12" + integrity sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g== dependencies: chalk "^4.0.0" - jest-diff "^27.5.1" - jest-get-type "^27.5.1" - pretty-format "^27.5.1" + jest-diff "^29.7.0" + jest-get-type "^29.6.3" + pretty-format "^29.7.0" jest-message-util@^27.5.1: version "27.5.1" @@ -4077,6 +4240,21 @@ jest-message-util@^27.5.1: slash "^3.0.0" stack-utils "^2.0.3" +jest-message-util@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.7.0.tgz#8bc392e204e95dfe7564abbe72a404e28e51f7f3" + integrity sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^29.6.3" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^29.7.0" + slash "^3.0.0" + stack-utils "^2.0.3" + jest-mock@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-27.5.1.tgz#19948336d49ef4d9c52021d34ac7b5f36ff967d6" @@ -4085,131 +4263,128 @@ jest-mock@^27.5.1: "@jest/types" "^27.5.1" "@types/node" "*" +jest-mock@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.7.0.tgz#4e836cf60e99c6fcfabe9f99d017f3fdd50a6347" + integrity sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw== + dependencies: + "@jest/types" "^29.6.3" + "@types/node" "*" + jest-util "^29.7.0" + jest-pnp-resolver@^1.2.2: version "1.2.3" resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== -jest-regex-util@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-27.5.1.tgz#4da143f7e9fd1e542d4aa69617b38e4a78365b95" - integrity sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg== +jest-regex-util@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.6.3.tgz#4a556d9c776af68e1c5f48194f4d0327d24e8a52" + integrity sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg== -jest-resolve-dependencies@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz#d811ecc8305e731cc86dd79741ee98fed06f1da8" - integrity sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg== +jest-resolve-dependencies@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz#1b04f2c095f37fc776ff40803dc92921b1e88428" + integrity sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA== dependencies: - "@jest/types" "^27.5.1" - jest-regex-util "^27.5.1" - jest-snapshot "^27.5.1" + jest-regex-util "^29.6.3" + jest-snapshot "^29.7.0" -jest-resolve@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-27.5.1.tgz#a2f1c5a0796ec18fe9eb1536ac3814c23617b384" - integrity sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw== +jest-resolve@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.7.0.tgz#64d6a8992dd26f635ab0c01e5eef4399c6bcbc30" + integrity sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA== dependencies: - "@jest/types" "^27.5.1" chalk "^4.0.0" graceful-fs "^4.2.9" - jest-haste-map "^27.5.1" + jest-haste-map "^29.7.0" jest-pnp-resolver "^1.2.2" - jest-util "^27.5.1" - jest-validate "^27.5.1" + jest-util "^29.7.0" + jest-validate "^29.7.0" resolve "^1.20.0" - resolve.exports "^1.1.0" + resolve.exports "^2.0.0" slash "^3.0.0" -jest-runner@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-27.5.1.tgz#071b27c1fa30d90540805c5645a0ec167c7b62e5" - integrity sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ== +jest-runner@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.7.0.tgz#809af072d408a53dcfd2e849a4c976d3132f718e" + integrity sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ== dependencies: - "@jest/console" "^27.5.1" - "@jest/environment" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/transform" "^27.5.1" - "@jest/types" "^27.5.1" + "@jest/console" "^29.7.0" + "@jest/environment" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" "@types/node" "*" chalk "^4.0.0" - emittery "^0.8.1" + emittery "^0.13.1" graceful-fs "^4.2.9" - jest-docblock "^27.5.1" - jest-environment-jsdom "^27.5.1" - jest-environment-node "^27.5.1" - jest-haste-map "^27.5.1" - jest-leak-detector "^27.5.1" - jest-message-util "^27.5.1" - jest-resolve "^27.5.1" - jest-runtime "^27.5.1" - jest-util "^27.5.1" - jest-worker "^27.5.1" - source-map-support "^0.5.6" - throat "^6.0.1" - -jest-runtime@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-27.5.1.tgz#4896003d7a334f7e8e4a53ba93fb9bcd3db0a1af" - integrity sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A== - dependencies: - "@jest/environment" "^27.5.1" - "@jest/fake-timers" "^27.5.1" - "@jest/globals" "^27.5.1" - "@jest/source-map" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/transform" "^27.5.1" - "@jest/types" "^27.5.1" + jest-docblock "^29.7.0" + jest-environment-node "^29.7.0" + jest-haste-map "^29.7.0" + jest-leak-detector "^29.7.0" + jest-message-util "^29.7.0" + jest-resolve "^29.7.0" + jest-runtime "^29.7.0" + jest-util "^29.7.0" + jest-watcher "^29.7.0" + jest-worker "^29.7.0" + p-limit "^3.1.0" + source-map-support "0.5.13" + +jest-runtime@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.7.0.tgz#efecb3141cf7d3767a3a0cc8f7c9990587d3d817" + integrity sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/fake-timers" "^29.7.0" + "@jest/globals" "^29.7.0" + "@jest/source-map" "^29.6.3" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" chalk "^4.0.0" cjs-module-lexer "^1.0.0" collect-v8-coverage "^1.0.0" - execa "^5.0.0" glob "^7.1.3" graceful-fs "^4.2.9" - jest-haste-map "^27.5.1" - jest-message-util "^27.5.1" - jest-mock "^27.5.1" - jest-regex-util "^27.5.1" - jest-resolve "^27.5.1" - jest-snapshot "^27.5.1" - jest-util "^27.5.1" + jest-haste-map "^29.7.0" + jest-message-util "^29.7.0" + jest-mock "^29.7.0" + jest-regex-util "^29.6.3" + jest-resolve "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" slash "^3.0.0" strip-bom "^4.0.0" -jest-serializer@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-27.5.1.tgz#81438410a30ea66fd57ff730835123dea1fb1f64" - integrity sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w== - dependencies: - "@types/node" "*" - graceful-fs "^4.2.9" - -jest-snapshot@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-27.5.1.tgz#b668d50d23d38054a51b42c4039cab59ae6eb6a1" - integrity sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA== +jest-snapshot@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.7.0.tgz#c2c574c3f51865da1bb329036778a69bf88a6be5" + integrity sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw== dependencies: - "@babel/core" "^7.7.2" + "@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.0.0" - "@jest/transform" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/babel__traverse" "^7.0.4" - "@types/prettier" "^2.1.5" + "@babel/types" "^7.3.3" + "@jest/expect-utils" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" babel-preset-current-node-syntax "^1.0.0" chalk "^4.0.0" - expect "^27.5.1" + expect "^29.7.0" graceful-fs "^4.2.9" - jest-diff "^27.5.1" - jest-get-type "^27.5.1" - jest-haste-map "^27.5.1" - jest-matcher-utils "^27.5.1" - jest-message-util "^27.5.1" - jest-util "^27.5.1" + jest-diff "^29.7.0" + jest-get-type "^29.6.3" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-util "^29.7.0" natural-compare "^1.4.0" - pretty-format "^27.5.1" - semver "^7.3.2" + pretty-format "^29.7.0" + semver "^7.5.3" jest-util@^27.5.1: version "27.5.1" @@ -4223,7 +4398,7 @@ jest-util@^27.5.1: graceful-fs "^4.2.9" picomatch "^2.2.3" -jest-util@^29.0.0: +jest-util@^29.0.0, jest-util@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== @@ -4235,32 +4410,33 @@ jest-util@^29.0.0: graceful-fs "^4.2.9" picomatch "^2.2.3" -jest-validate@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-27.5.1.tgz#9197d54dc0bdb52260b8db40b46ae668e04df067" - integrity sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ== +jest-validate@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.7.0.tgz#7bf705511c64da591d46b15fce41400d52147d9c" + integrity sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw== dependencies: - "@jest/types" "^27.5.1" + "@jest/types" "^29.6.3" camelcase "^6.2.0" chalk "^4.0.0" - jest-get-type "^27.5.1" + jest-get-type "^29.6.3" leven "^3.1.0" - pretty-format "^27.5.1" + pretty-format "^29.7.0" -jest-watcher@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-27.5.1.tgz#71bd85fb9bde3a2c2ec4dc353437971c43c642a2" - integrity sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw== +jest-watcher@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.7.0.tgz#7810d30d619c3a62093223ce6bb359ca1b28a2f2" + integrity sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g== dependencies: - "@jest/test-result" "^27.5.1" - "@jest/types" "^27.5.1" + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" "@types/node" "*" ansi-escapes "^4.2.1" chalk "^4.0.0" - jest-util "^27.5.1" + emittery "^0.13.1" + jest-util "^29.7.0" string-length "^4.0.1" -jest-worker@^27.4.5, jest-worker@^27.5.1: +jest-worker@^27.4.5: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== @@ -4269,20 +4445,36 @@ jest-worker@^27.4.5, jest-worker@^27.5.1: merge-stream "^2.0.0" supports-color "^8.0.0" -jest@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest/-/jest-27.5.1.tgz#dadf33ba70a779be7a6fc33015843b51494f63fc" - integrity sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ== +jest-worker@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.7.0.tgz#acad073acbbaeb7262bd5389e1bcf43e10058d4a" + integrity sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw== + dependencies: + "@types/node" "*" + jest-util "^29.7.0" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jest@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest/-/jest-29.7.0.tgz#994676fc24177f088f1c5e3737f5697204ff2613" + integrity sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw== dependencies: - "@jest/core" "^27.5.1" + "@jest/core" "^29.7.0" + "@jest/types" "^29.6.3" import-local "^3.0.2" - jest-cli "^27.5.1" + jest-cli "^29.7.0" js-base64@^2.1.9: version "2.6.4" resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.6.4.tgz#f4e686c5de1ea1f867dbcad3d46d969428df98c4" integrity sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ== +js-levenshtein@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.6.tgz#c6cee58eb3550372df8deb85fad5ce66ce01d59d" + integrity sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g== + js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -4336,10 +4528,10 @@ jsdom@^16.6.0: ws "^7.4.6" xml-name-validator "^3.0.0" -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== +jsesc@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.0.2.tgz#bb8b09a6597ba426425f2e4a07245c3d00b9343e" + integrity sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g== json-buffer@3.0.1: version "3.0.1" @@ -4554,6 +4746,11 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" +lodash-es@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" + integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== + lodash._baseiteratee@~4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/lodash._baseiteratee/-/lodash._baseiteratee-4.7.0.tgz#34a9b5543572727c3db2e78edae3c0e9e66bd102" @@ -4611,6 +4808,11 @@ lodash.isboolean@^3.0.3: resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6" integrity sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg== +lodash.isequal@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" + integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ== + lodash.isinteger@^4.0.4: version "4.0.4" resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343" @@ -4862,7 +5064,7 @@ micromatch@^2.3.11: parse-glob "^3.0.4" regex-cache "^0.4.2" -micromatch@^4.0.0, micromatch@^4.0.4, micromatch@^4.0.5: +micromatch@^4.0.0, micromatch@^4.0.5: version "4.0.7" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.7.tgz#33e8190d9fe474a9895525f5618eee136d46c2e5" integrity sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q== @@ -4870,6 +5072,14 @@ micromatch@^4.0.0, micromatch@^4.0.4, micromatch@^4.0.5: braces "^3.0.3" picomatch "^2.3.1" +micromatch@^4.0.4: + version "4.0.8" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" + integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== + dependencies: + braces "^3.0.3" + picomatch "^2.3.1" + mime-db@1.52.0: version "1.52.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" @@ -4946,7 +5156,7 @@ ms@2.1.2: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -ms@2.1.3, ms@^2.1.1: +ms@2.1.3, ms@^2.1.1, ms@^2.1.3: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== @@ -5030,10 +5240,10 @@ node-readfiles@^0.2.0: dependencies: es6-promise "^3.2.1" -node-releases@^2.0.14: - version "2.0.14" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" - integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== +node-releases@^2.0.14, node-releases@^2.0.18: + version "2.0.18" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.18.tgz#f010e8d35e2fe8d6b2944f03f70213ecedc4ca3f" + integrity sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g== normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: version "2.5.0" @@ -5216,6 +5426,11 @@ openapi-to-md@^1.0.24: swagger2openapi "*" yaml "*" +openapi-types@^12.1.0: + version "12.1.3" + resolved "https://registry.yarnpkg.com/openapi-types/-/openapi-types-12.1.3.tgz#471995eb26c4b97b7bd356aacf7b91b73e777dd3" + integrity sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw== + optionator@^0.9.3: version "0.9.4" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" @@ -5247,7 +5462,7 @@ p-limit@^2.2.0: dependencies: p-try "^2.0.0" -p-limit@^3.0.2: +p-limit@^3.0.2, p-limit@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== @@ -5478,10 +5693,10 @@ pause@0.0.1: resolved "https://registry.yarnpkg.com/pause/-/pause-0.0.1.tgz#1d408b3fdb76923b9543d96fb4c9dfd535d9cb5d" integrity sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg== -picocolors@^1.0.0, picocolors@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1" - integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== +picocolors@^1.0.0, picocolors@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== picomatch@^2.0.4, picomatch@^2.2.3, picomatch@^2.3.1: version "2.3.1" @@ -5756,7 +5971,7 @@ prettier@^2.7.1: resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== -pretty-format@^27.0.0, pretty-format@^27.5.1: +pretty-format@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e" integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ== @@ -5765,6 +5980,15 @@ pretty-format@^27.0.0, pretty-format@^27.5.1: ansi-styles "^5.0.0" react-is "^17.0.1" +pretty-format@^29.0.0, pretty-format@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" + integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== + dependencies: + "@jest/schemas" "^29.6.3" + ansi-styles "^5.0.0" + react-is "^18.0.0" + pretty-quick@3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/pretty-quick/-/pretty-quick-3.1.3.tgz#15281108c0ddf446675157ca40240099157b638e" @@ -5850,6 +6074,11 @@ punycode@^2.1.0, punycode@^2.1.1: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== +pure-rand@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.1.0.tgz#d173cf23258231976ccbdb05247c9787957604f2" + integrity sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA== + qs@6.11.0: version "6.11.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" @@ -5923,6 +6152,11 @@ react-is@^17.0.1: resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== +react-is@^18.0.0: + version "18.3.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e" + integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== + read-pkg-up@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" @@ -6153,10 +6387,10 @@ resolve-from@^5.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== -resolve.exports@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-1.1.1.tgz#05cfd5b3edf641571fd46fa608b610dda9ead999" - integrity sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ== +resolve.exports@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.2.tgz#f8c934b8e6a13f539e38b7098e2e36134f01e800" + integrity sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg== resolve@^1.10.0, resolve@^1.20.0: version "1.22.8" @@ -6190,7 +6424,7 @@ rfdc@^1.3.0: resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.4.1.tgz#778f76c4fb731d93414e8f925fbecf64cce7f6ca" integrity sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA== -rimraf@^3.0.0, rimraf@^3.0.2: +rimraf@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== @@ -6281,11 +6515,16 @@ semver@^6.3.0, semver@^6.3.1: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.3.2, semver@^7.3.4, semver@^7.3.7, semver@^7.5.3, semver@^7.5.4, semver@^7.6.0: +semver@^7.3.4, semver@^7.3.7, semver@^7.5.4, semver@^7.6.0: version "7.6.2" resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.2.tgz#1e3b34759f896e8f14d6134732ce798aeb0c6e13" integrity sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w== +semver@^7.5.3: + version "7.6.3" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" + integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== + send@0.18.0: version "0.18.0" resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" @@ -6508,7 +6747,15 @@ sort-package-json@^2.10.0: semver "^7.6.0" sort-object-keys "^1.1.3" -source-map-support@^0.5.6, source-map-support@~0.5.20: +source-map-support@0.5.13: + version "0.5.13" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" + integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-support@~0.5.20: version "0.5.21" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== @@ -6526,7 +6773,7 @@ source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== -source-map@^0.7.3, source-map@^0.7.4: +source-map@^0.7.4: version "0.7.4" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== @@ -6820,7 +7067,7 @@ supports-color@^5.3.0, supports-color@^5.4.0: dependencies: has-flag "^3.0.0" -supports-color@^7.0.0, supports-color@^7.1.0: +supports-color@^7.1.0: version "7.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== @@ -6834,14 +7081,6 @@ supports-color@^8.0.0: dependencies: has-flag "^4.0.0" -supports-hyperlinks@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz#3943544347c1ff90b15effb03fc14ae45ec10624" - integrity sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA== - dependencies: - has-flag "^4.0.0" - supports-color "^7.0.0" - supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" @@ -6859,7 +7098,7 @@ swagger-routes-express@^3.3.2: dependencies: semver "^7.3.7" -swagger2openapi@*: +swagger2openapi@*, swagger2openapi@^7.0.8: version "7.0.8" resolved "https://registry.yarnpkg.com/swagger2openapi/-/swagger2openapi-7.0.8.tgz#12c88d5de776cb1cbba758994930f40ad0afac59" integrity sha512-upi/0ZGkYgEcLeGieoz8gT74oWHA0E7JivX7aN9mAf+Tc7BQoRBvnIGHoPDw+f9TXTW4s6kGYCZJtauP6OYp7g== @@ -6930,13 +7169,10 @@ term-size@^1.2.0: dependencies: execa "^0.7.0" -terminal-link@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994" - integrity sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ== - dependencies: - ansi-escapes "^4.2.1" - supports-hyperlinks "^2.0.0" +terminal-columns@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/terminal-columns/-/terminal-columns-1.4.1.tgz#f669dd878afaad0c404d4b7aa01855fb6f24f1a4" + integrity sha512-IKVL/itiMy947XWVv4IHV7a0KQXvKjj4ptbi7Ew9MPMcOLzkiQeyx3Gyvh62hKrfJ0RZc4M1nbhzjNM39Kyujw== terser-webpack-plugin@^5.3.10: version "5.3.10" @@ -6987,11 +7223,6 @@ thread-stream@^3.0.0: dependencies: real-require "^0.2.0" -throat@^6.0.1: - version "6.0.2" - resolved "https://registry.yarnpkg.com/throat/-/throat-6.0.2.tgz#51a3fbb5e11ae72e2cf74861ed5c8020f89f29fe" - integrity sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ== - through@^2.3.8: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" @@ -7007,11 +7238,6 @@ tmpl@1.0.5: resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== - to-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" @@ -7169,6 +7395,11 @@ type-fest@^0.21.3: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== +type-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/type-flag/-/type-flag-3.0.0.tgz#2caef2f20f2c71e960fe1d3b6f57bae8c8246459" + integrity sha512-3YaYwMseXCAhBB14RXW5cRQfJQlEknS6i4C8fCfeUdS3ihG9EdccdR9kt3vP73ZdeTGmPb4bZtkDn5XMIn1DLA== + type-is@^1.6.4, type-is@~1.6.18: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" @@ -7177,13 +7408,6 @@ type-is@^1.6.4, type-is@~1.6.18: media-typer "0.3.0" mime-types "~2.1.24" -typedarray-to-buffer@^3.1.5: - version "3.1.5" - resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" - integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== - dependencies: - is-typedarray "^1.0.0" - typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" @@ -7199,6 +7423,11 @@ undici-types@~5.26.4: resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== +undici-types@~6.19.8: + version "6.19.8" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" + integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== + unherit@^1.0.4: version "1.1.3" resolved "https://registry.yarnpkg.com/unherit/-/unherit-1.1.3.tgz#6c9b503f2b41b262330c80e91c8614abdaa69c22" @@ -7284,13 +7513,13 @@ unzip-response@^2.0.1: resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" integrity sha512-N0XH6lqDtFH84JxptQoZYmloF4nzrQqqrAymNj+/gW60AO2AZgOcf4O/nUXJcYfyQkqvMo9lSupBZmmgvuVXlw== -update-browserslist-db@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz#7ca61c0d8650766090728046e416a8cde682859e" - integrity sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ== +update-browserslist-db@^1.1.0, update-browserslist-db@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz#80846fba1d79e82547fb661f8d141e0945755fe5" + integrity sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A== dependencies: - escalade "^3.1.2" - picocolors "^1.0.1" + escalade "^3.2.0" + picocolors "^1.1.0" update-notifier@^2.2.0: version "2.5.0" @@ -7308,6 +7537,11 @@ update-notifier@^2.2.0: semver-diff "^2.0.0" xdg-basedir "^3.0.0" +uri-js-replace@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/uri-js-replace/-/uri-js-replace-1.0.1.tgz#c285bb352b701c9dfdaeffc4da5be77f936c9048" + integrity sha512-W+C9NWNLFOoBI2QWDp4UT9pv65r2w5Cx+3sTYFvtMdDBxkKt1syCqsUdSFAChbEe1uK5TfS04wt/nGwmaeIQ0g== + uri-js@^4.2.2, uri-js@^4.4.1: version "4.4.1" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" @@ -7350,14 +7584,14 @@ v8-compile-cache-lib@^3.0.1: resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== -v8-to-istanbul@^8.1.0: - version "8.1.1" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz#77b752fd3975e31bbcef938f85e9bd1c7a8d60ed" - integrity sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w== +v8-to-istanbul@^9.0.1: + version "9.3.0" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz#b9572abfa62bd556c16d75fdebc1a411d5ff3175" + integrity sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA== dependencies: + "@jridgewell/trace-mapping" "^0.3.12" "@types/istanbul-lib-coverage" "^2.0.1" - convert-source-map "^1.6.0" - source-map "^0.7.3" + convert-source-map "^2.0.0" validate-npm-package-license@^3.0.1: version "3.0.4" @@ -7408,7 +7642,7 @@ w3c-xmlserializer@^2.0.0: dependencies: xml-name-validator "^3.0.0" -walker@^1.0.7: +walker@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== @@ -7560,15 +7794,13 @@ write-file-atomic@^2.0.0: imurmurhash "^0.1.4" signal-exit "^3.0.2" -write-file-atomic@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" - integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== +write-file-atomic@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" + integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== dependencies: imurmurhash "^0.1.4" - is-typedarray "^1.0.0" - signal-exit "^3.0.2" - typedarray-to-buffer "^3.1.5" + signal-exit "^3.0.7" write@^0.2.1: version "0.2.1" @@ -7622,6 +7854,11 @@ yallist@^3.0.2: resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== +yaml-ast-parser@0.0.43: + version "0.0.43" + resolved "https://registry.yarnpkg.com/yaml-ast-parser/-/yaml-ast-parser-0.0.43.tgz#e8a23e6fb4c38076ab92995c5dca33f3d3d7c9bb" + integrity sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A== + yaml@*, yaml@^2.1.3, yaml@^2.4.5: version "2.4.5" resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.4.5.tgz#60630b206dd6d84df97003d33fc1ddf6296cca5e" @@ -7632,30 +7869,12 @@ yaml@^1.10.0: resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== -yargs-parser@^20.2.2: - version "20.2.9" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" - integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== - yargs-parser@^21.0.1, yargs-parser@^21.1.1: version "21.1.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== -yargs@^16.2.0: - version "16.2.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" - integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.0" - y18n "^5.0.5" - yargs-parser "^20.2.2" - -yargs@^17.0.1: +yargs@^17.0.1, yargs@^17.3.1: version "17.7.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==